多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)

大模型相关目录

大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。

  1. 基于Dify的智能分类方案:大模型结合KNN算法(附代码)
  2. OpenCompass:大模型测评工具
  3. 一文读懂多模态大模型基础架构
  4. 大模型管理平台:one-api使用指南
  5. 大模型RAG、ROG、RCG概念科普
  6. RAGOnMedicalKG:大模型结合知识图谱的RAG实现
  7. DSPy:变革式大模型应用开发
  8. 最简明的Few-shot Prompt指南
  9. Semantic Kernel:微软大模型开发框架——LangChain 替代
  10. 对话大模型Prompt是否需要礼貌点?
  11. swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)
  12. 多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)

文章目录

  • 大模型相关目录
  • 多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)
    • 前言
    • 合并训练后的lora全重
    • swift部署
    • lmdeploy环境配置
    • lmdeploy环境配置
    • 测试脚本


多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)

前言

基于之前研究

https://blog.csdn.net/qq_43128256/article/details/140314241

合并训练后的lora全重

CUDA_VISIBLE_DEVICES=0,1,2,3 swift export --ckpt_dir '/home/super/output/internvl-chat-v1_5/v4-20240708-180015/checkpoint-211/' --merge_lora true

swift部署

部署融合模型:

CUDA_VISIBLE_DEVICES=1,2,3 swift deploy \
    --ckpt_dir "/home/super/output/internvl-chat-v1_5/v4-20240708-180015/checkpoint-211-merged" \
    --max_length 4096 \
    --host 0.0.0.0 \
    --port 23333

部署原生模型:

CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy  --host 0.0.0.0 --port 23333 --model_type internvl-chat-v1_5 --dtype bf16 --max_length 4096

Swift现在lora加载的模式有BUG不好用,合并后模型得openai式api加载方式也只是于20240711晚刚刚调好。

lmdeploy环境配置

git clone --depth=1 https://kkgithub.com/InternLM/lmdeploy
确保 docker 已安装
# lmdeploy 源码根目录
cd lmdeploy
bash builder/manywheel/build_all_wheel.sh
需要固定 python 版本的 wheel 文件,比如 py3.8,可以执行:
bash builder/manywheel/build_wheel.sh py38 manylinux2014_x86_64 cuda11.8 cuda11.8_dist
wheel 文件存放在目录 builder/manywheel/cuda11.8_dist 下
在宿主机上,通过 pip install 安装和宿主机python版本一致的 wheel 文件,即完成 lmdeploy 整个编译安装过程
conda activate lmdeploy

lmdeploy环境配置

lmdeploy serve api_server /home/super/output/internvl-chat-v1_5/v4-20240708-180015/checkpoint-211-merged \
--server-port 23333 --tp 4 --cache-max-entry-count 0.8 \
--model-name internvl-chat-v1_5 --session-len 8192 --num-tokens-per-iter 8192 \
--chat-template /home/super/sgq/lmdeploy/template/internvl-1_5-lora-template.json \
--log-level INFO

值得一提的是,lmdeploy部署原生模型无问题,部署微调模型时需加上json模板,否则模型会丢失很对信息,在对其过程中出错。

{
    "model_name": "internvl-internlm2",
    "meta_instruction": "You are a robot developed by HaiYi.",
    "stop_words": ["<|im_start|>", "<|im_end|>"]
}

测试脚本

from openai import OpenAI
import base64

client = OpenAI(api_key='YOUR_API_KEY', base_url='http://172.20.32.127:23333/v1')
model_name = client.models.list().data[0].id

#图片转base64函数
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')


 
#原图片转base64
def get_response(input_query,input_image_path):
  base64_image = encode_image(input_image_path)
  response = client.chat.completions.create(
      model=model_name,
      messages=[
          {
              "role": "system",
              "content": "你是一个OCR助手."
          },
          {
              "role": "user",
              "content":[
              {
            "type": "text",
            "text": input_query
          },
                      {
            "type": "image_url",
            "image_url":{
              "url":f"data:image/jpeg;base64,{base64_image}"
              # "url": 'https://i-blog.csdnimg.cn/direct/253ad27104b7466792511f78e9f636a9.png'
            }
          },
          ]
          }
      ],
      temperature=0.8,
      top_p=0.8)
  return response.choices[0].message.content
import json
import python_test_api as llm_api
def read_jsonl(file_path):
    """
    Read a JSONL file and return a list of dictionaries.

    :param file_path: Absolute path of the JSONL file to be read.
    :return: List of dictionaries representing the JSON objects in the file.
    """
    data = []
    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            data.append(json.loads(line))
    return data


data = read_jsonl('/home/super/sgq/swift/ocr_test_data.jsonl')

st_list = []
test_list = []
for i in data:
    print(i)
    # st_list.append(i['response'])
    test_list.append(llm_api.get_response(i['query'],i['images'][0]))
import pandas as pd
# pd.DataFrame(st_list).to_excel('st_list.xlsx',index=False)
pd.DataFrame(test_list).to_excel('llm_list.xlsx',index=False)
import pandas as pd

st = pd.read_excel('st_list.xlsx')[0].tolist()
test_merged = pd.read_excel('merged_llm_list.xlsx')[0].tolist()
llm = pd.read_excel('llm_list.xlsx')[0].tolist()

n = 0
for i in range(len(st)):
    if st[i] == test_merged[i][:-1]:
        n += 1
    else:
        print(type(st[i]),len(st[i]),st[i])
        print(type(test_merged[i]),len(test_merged[i]),test_merged[i])
        print('--------------------------')

n = 0
for i in range(len(st)):
    if st[i] == llm[i][:-1]:
        n += 1
    else:
        print(type(st[i]),len(st[i]),st[i])
        print(type(llm[i]),len(llm[i]),llm[i])
        print('--------------------------')

结果如下:
多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)_第1张图片
多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)_第2张图片
1.微调后输出精度
对数据集中数据确实输出识别率更高了,其中测试100张图像,实际的准确率,完全一致的有84个,语义准确模糊准确的90以上。
未微调模型输出模糊准确率66左右。
2.微调后输出格式
微调后模型数据会很按照微调数据格式,比如本次微调输出语言简短,以店名、产品、联系电话、地址等等为主,那么模型微调后输出也倾向于短语输出,即使是正常沟通也会输出短语,对大篇幅OCR会输出标题不倾向识别所有文字。
3.微调后可识别率
微调前,对数据集部分问题无法进行识别内容占10%左右,微调后占1%。
4.微调后总结
本次微调证明微调提升精度路径可行,但因为数据集质量问题,导致输出格式、回复风格等出现问题,之后微调需要在数据上下大功夫。
本次微调测试采用的仍是训练过的数据,导致结果可信度降低,其实精度提升应该没有那么高,下次要预留出测试集。
本次微调后,对微调后的模型进行部署测试发现很多框架不兼容、使用上的问题,对于这些部署技巧、指令需证零记录,系统化。

你可能感兴趣的:(大模型,prompt,python,大模型,swift,微调,lora)