基于llamafactory微调与vllm部署的LLM情感模型示例

环境需求:

  • 服务器:AutoDL
  • PyTorch 2.1.0
  • Python 3.10 (Ubuntu 22.04)
  • Cuda 12.1
  • 4090(24GB)

1. 下载llamafactory

  1. 创建虚拟环境
bash 复制代码
conda create -n llamafactory python=3.10 -y
conda activate llamafactory 
  1. 下载到数据盘
bash 复制代码
cd ./autodl-tmp/
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .
  1. 将数据集拷贝至:/root/autodl-tmp/LLaMA-Factory/data,煮饱这里自己准备了名称为llamafactory_style_data的数据集

并将data_info.json中添加数据集:

bash 复制代码
# 这里使用相对路径就可以了
    "llamafactory_style_data": {
    "file_name": "llamafactory_style_data.json"
  },

2. 模型微调

  1. 下载模型,没有vpn的同学可以使用魔塔社区:魔塔社区模型库
    有vpn的同学可以使用huggingface:huggingface模型库
    这里演示选择了qwen1.5-4B-Chat模型
python 复制代码
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen1.5-4B-Chat',cache_dir="/root/autodl-tmp/models")
  1. 启动 Web UI:
bash 复制代码
cd LLaMA-Factory
llamafactory-cli webui
  1. 模型微调,需要调整的参数:
  • 模型名称:Qwen1.5-4B-Chat
  • 模型路径:/root/autodl-tmp/models/Qwen/Qwen1.5-4B-Chat
  • 量化等级:8(可不开,缩小模型加速训练的)
  • 训练轮次:300(建议给大点,反正能随时停)
  • 最大样本数:1000
  • 截断长度:512(我的文本没那么大,这个看自己情况)
  • batch_size:12(看自己cpu,别cuda out of memory就行)
  • 验证集比例:0.02(也是看个人)
  1. 模型对话:
    选择刚训练出的权重/root/autodl-tmp/LLaMA-Factory/saves/Qwen1.5-4B-Chat/lora/train_2025-12-14-19-49-11/checkpoint-300,放在检查路径,推理模型选择huggingface
    注:如果推理模型选择vllm,需要和llamafactory装在同一虚拟环境中,并且指定vllm==0.11.0
  2. 模型导出
    自创导出目录/root/autodl-tmp/models_merge/qwen,导出设备选择auto可以加快导出

3. vllm部署

  1. 下载vllm
bash 复制代码
pip install vllm==0.11.0
  1. 部署,这里很容易出现显存不足的情况,本质是vllm在启动时会预分配显存用于 KV Cache(键值缓存),导致启动失败,此时最佳解决方案就是稍微调小最大序列长度
bash 复制代码
# vllm默认端口为 8000
vllm serve /root/autodl-tmp/models_merge/qwen --max-model-len 32000
  1. 写一个app.py进行验证

注意:response中的model需要指定你merge后的模型绝对路径,不然在使用streamlit对话框时会报错:
Error code: 404 - {'error': {'message': 'The model Qwen1___5-1___8B-Chatdoes not exist.', 'type': 'NotFoundError', 'param': None, 'code': 404}}

python 复制代码
import streamlit as st
from openai import OpenAI

st.set_page_config(page_title="VLLM Chat Demo", page_icon="🤖")
st.title("VLLM Chat Demo")

# 初始化 OpenAI 客户端连接到 VLLM
@st.cache_resource
def init_client():
    client = OpenAI(
        base_url="http://localhost:8000/v1",
        api_key="not-needed"  # VLLM 通常不需要 API 密钥
    )
    return client

# 初始化 VLLM 客户端
if "client" not in st.session_state:
    st.session_state.client = init_client()

# 初始化聊天历史
if "messages" not in st.session_state:
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是AI助手,有什么我可以帮助你的吗?"}]

# 显示聊天历史
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.write(message["content"])

# 清空聊天历史函数
def clear_chat_history():
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是AI助手,有什么我可以帮助你的吗?"}]

# 侧边栏清空按钮
st.sidebar.button('清空聊天历史', on_click=clear_chat_history)

# 生成回复函数
def generate_response(prompt_input):
    try:
        # 构建消息历史
        messages = st.session_state.messages.copy()
        
        # 调用 VLLM API
        response = st.session_state.client.chat.completions.create(
            model="/root/autodl-tmp/models_merge/qwen",  # 模型名称,应与 VLLM 启动时的名称一致
            messages=messages,
            temperature=0.7,
            max_tokens=512,
            stream=False  # 设置为 True 可以启用流式输出
        )
        
        return response.choices[0].message.content
    except Exception as e:
        return f"请求出错: {str(e)}"

# 处理用户输入
if prompt := st.chat_input("请输入您的问题:"):
    # 添加用户消息到历史
    st.session_state.messages.append({"role": "user", "content": prompt})
    
    # 显示用户消息
    with st.chat_message("user"):
        st.write(prompt)
    
    # 生成并显示助手回复
    with st.chat_message("assistant"):
        with st.spinner("正在思考..."):
            response = generate_response(prompt)
            st.write(response)
    
    # 添加助手回复到历史
    st.session_state.messages.append({"role": "assistant", "content": response})

# 侧边栏信息
st.sidebar.markdown("### 配置信息")
st.sidebar.info(f"模型: Qwen1.5-4B-Chat")
st.sidebar.info(f"API端点: http://localhost:8000/v1")
  1. 验证微调效果:
bash 复制代码
streamlit run ./app.py

streamlit默认端口为http://localhost:8501/

貌似效果一般。。。训练的时候可以多训练两轮!

相关推荐
skywalk81631 天前
SCNet 双DCU异构卡vllm推理部署DeepSeek-Coder-V2-Lite-Instruct
人工智能·vllm·scnet·deepseek-coder
平凡之路无尽路1 天前
智能体设计模式:构建智能系统的实践指南
人工智能·设计模式·自然语言处理·nlp·aigc·vllm
skywalk81633 天前
尝试升级SCNet DCU异构系统VLLM版本(失败)
vllm
benben0443 天前
vLLM推理引擎教程4-离线推理功能
vllm
百度智能云技术站4 天前
百度百舸 X 昆仑芯 | 开源 vLLM-Kunlun Plugin,快速适配新模型、跑出极致性能
芯片·vllm·百度百舸
benben0445 天前
vLLM推理引擎教程3-分离式Prefill
vllm
mqiqe5 天前
vLLM(vLLM.ai)生产环境部署大模型
人工智能·vllm
禁默5 天前
vLLM-Ascend 部署与推理服务化实战
vllm
mqiqe5 天前
vLLM(vLLM.ai)K8S生产环境部署Qwen大模型
人工智能·kubernetes·vllm