大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。
基于之前研究
https://blog.csdn.net/qq_43128256/article/details/140314241
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
部署融合模型:
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晚刚刚调好。
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 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('--------------------------')
结果如下:
1.微调后输出精度
对数据集中数据确实输出识别率更高了,其中测试100张图像,实际的准确率,完全一致的有84个,语义准确模糊准确的90以上。
未微调模型输出模糊准确率66左右。
2.微调后输出格式
微调后模型数据会很按照微调数据格式,比如本次微调输出语言简短,以店名、产品、联系电话、地址等等为主,那么模型微调后输出也倾向于短语输出,即使是正常沟通也会输出短语,对大篇幅OCR会输出标题不倾向识别所有文字。
3.微调后可识别率
微调前,对数据集部分问题无法进行识别内容占10%左右,微调后占1%。
4.微调后总结
本次微调证明微调提升精度路径可行,但因为数据集质量问题,导致输出格式、回复风格等出现问题,之后微调需要在数据上下大功夫。
本次微调测试采用的仍是训练过的数据,导致结果可信度降低,其实精度提升应该没有那么高,下次要预留出测试集。
本次微调后,对微调后的模型进行部署测试发现很多框架不兼容、使用上的问题,对于这些部署技巧、指令需证零记录,系统化。