【GPT入门】第53课 LlamaFactory微调效果与vllm部署效果不一致问题解决

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_versions
    raise 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-webui
 export HF_ENDPOINT=https://hf-mirror.com
 export ENABLE_OLLAMA_API=FALSE
 export OPENAI_API_BASE_URL=http://localhost:8000/v1
 open-webui serve

openwebui 连接 ollama,作为对比,补充笔记,本次没用到ollama

conda activate open-webui
 export HF_ENDPOINT=https://hf-mirror.com
 export ENABLE_OLLAMA_API=True
 export OPENAI_API_BASE_URL=http://127.0.0.1:11434/v1
 open-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 每次访问模型,都覆盖原模板。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值