【GPT入门】第53课 LlamaFactory微调效果与vllm部署效果不一致问题解决
【GPT入门】第53课 LlamaFactory微调效果与vllm部署效果不一致问题解决
- 1.概要
- 2.qwen对话模板与vllm模板不一致对比
- 2.1 llamaFactory效果
- 2.2 vllm效果
- 2.3 open-webui 检查模型效果
- 3. 对话模板不一致解决方法
- 3.1 解决思路
- 3.2 解决实践
- 4.答疑
- 4.1 vllm, lmdeploy为什么支持自定义模板?
- 4.2 对话模板
- 4.3 openwebui对自定义模板无效
1.概要
前言:每个llm都有一个对话模板,训练框架、推理框架也都有对话模板,但他们的对话模板很可能是不一致的,由于这个对话模板不一致的问题,导致各种异常问题,例如训练效果好,但部署时发现llm回答问题乱七八糟。未来解决这个问题,编写本文。例如,千问有 qwen qwen1.5, qwen2.5,他们的模板是不一样的,但在LLamamFactory中,他们被认为是同一套模板,并且LLamamFactory是使用编码的方式,而不是取llm的对应的模板配置。
下文概要:把LLamamFactory的qwen模板转为vllm的qwen模板,也就是不用官方的模板,解决跨组件的部署效果不一致的问题
2.qwen对话模板与vllm模板不一致对比
对比 /root/autodl-tmp/models/Qwen/Qwen2.5-0.5B-Instruct-merged-rzb 的效果
2.1 llamaFactory效果
-
huggingface加载
-
vllm加载
_compare_versions(op, got_ver, want_ver, requirement, pkg, hint)File "/root/autodl-tmp/conda_envs/xxzh/lib/python3.10/site-packages/transformers/utils/versions.py", line 44, in _compare_versionsraise ImportError(
ImportError: vllm>=0.4.3,<=0.10.0 is required for a normal functioning of this module, but found vllm==0.10.1.1.
To fix: run `pip install vllm>=0.4.3,<=0.10.0` or set `DISABLE_VERSION_CHECK=1` to skip this check.
更改vllm版本:
pip install vllm==0.10.0
2.2 vllm效果
- 直接启动vllm
启动命令:
vllm serve /root/autodl-tmp/models/Qwen/Qwen2.5-0.5B-Instruct-merged-rzb
测试代码:
vi test03.py
#多轮对话
from openai import OpenAI#定义多轮对话方法
def run_chat_session():#初始化客户端client = OpenAI(base_url="http://localhost:8000/v1/",api_key="suibianxie")#初始化对话历史chat_history = []#启动对话循环while True:#获取用户输入user_input = input("用户:")if user_input.lower() == "exit":print("退出对话。")break#更新对话历史(添加用户输入)chat_history.append({"role":"user","content":user_input})#调用模型回答try:chat_complition = client.chat.completions.create(messages=chat_history,model="/root/autodl-tmp/models/Qwen/Qwen2.5-0.5B-Instruct-merged-rzb")#获取最新回答model_response = chat_complition.choices[0]print("AI:",model_response.message.content)#更新对话历史(添加AI模型的回复)chat_history.append({"role":"assistant","content":model_response.message.content})except Exception as e:print("发生错误:",e)break
if __name__ == '__main__':run_chat_session()
python test03.py
效果: vllm的测试效果与 LlamaFactory训练效果一致。
2.3 open-webui 检查模型效果
openwebui 连接 vllm
conda activate open-webuiexport HF_ENDPOINT=https://hf-mirror.comexport ENABLE_OLLAMA_API=FALSEexport OPENAI_API_BASE_URL=http://localhost:8000/v1open-webui serve
openwebui 连接 ollama,作为对比,补充笔记,本次没用到ollama
conda activate open-webuiexport HF_ENDPOINT=https://hf-mirror.comexport ENABLE_OLLAMA_API=Trueexport OPENAI_API_BASE_URL=http://127.0.0.1:11434/v1open-webui serve
打开 localhost:8080, 如果打不开,换chrome浏览器
3. 对话模板不一致解决方法
3.1 解决思路
-
思路
把LLamaFacotory的模板转为vllm支持的模板 -
vllm 指定模板介绍
url: https://vllm.hyper.ai/docs/inference-and-serving/openai_compatible_server
jinja格式官方说明: https://docs.jinkan.org/docs/jinja2/
- LLamaFactory的template配置llm模板
3.2 解决实践
- 方法一: 定义模板文件
mytest.py 生成的 jinja2模板复制到一个文件,调用vllm
vllm serve <model> --chat-template ./path-to-chat-template.jinja
-
方法二:直接更新模型的chattemplate
把方法一生成的json,更新到模型的 tokenizer_config.json的chat_template中, vllm,lmdeploy等部署框架直接使用该对话模板。 -
实践方法一
vllm serve /root/autodl-tmp/models/Qwen/Qwen2.5-0.5B-Instruct-merged-rzb --chat-template /root/autodl-tmp/qwen_template.jinja
重新测试 python test03.py
发现效果是一样的
4.答疑
4.1 vllm, lmdeploy为什么支持自定义模板?
推理框架:以训练结果为依据,而不是以模型官方结果为依据
训练框架:训练模型,LLamaFactory是用来改变和调整模型
对话模板对齐原则:以训练模板对齐
4.2 对话模板
对话模板作用:控制模型输出的格式、样式,就是对数据做格式化,并不影响模型的能力。
4.3 openwebui对自定义模板无效
vllm serve --chat-template ./path-to-chat-template.jinja
该方法部署模型,openwebui无效
openwebui 每次访问模型,都覆盖原模板。