跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
PythonAI算法

基于 LLaMA-Factory 微调与 vLLM 部署的大语言模型实战

在 AutoDL 环境中利用 LLaMA-Factory 对 Qwen1.5-4B-Chat 进行微调,并通过 vLLM 实现高效推理。流程涵盖环境配置、数据集准备、WebUI 参数调整及模型导出。针对 vLLM 启动时显存预分配导致的 OOM 问题,提供调整最大序列长度的解决方案。最后通过 Streamlit 搭建本地聊天界面,验证微调后模型的对话能力,并指出模型路径配置的关键点以避免 404 错误。

菩提发布于 2026/4/9更新于 2026/4/241 浏览
基于 LLaMA-Factory 微调与 vLLM 部署的大语言模型实战

环境准备

本次实战基于 AutoDL 服务器环境,具体配置如下:

  • 操作系统:Ubuntu 22.04
  • Python 版本:3.10
  • PyTorch:2.1.0
  • CUDA:12.1
  • 显卡:RTX 4090 (24GB)

1. 搭建 LLaMA-Factory 环境

首先创建独立的虚拟环境并激活:

conda create -n llamafactory python=3.10 -y
conda activate llamafactory

将项目克隆至数据盘(例如 /root/autodl-tmp),并以可编辑模式安装依赖:

cd ./autodl-tmp/
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .

数据集准备

将准备好的数据集文件拷贝至 data 目录下。假设数据集名为 llamafactory_style_data,需确保目录结构正确。

同时,在 data/data_info.json 中注册该数据集,使用相对路径即可:

"llamafactory_style_data": {
    "file_name": "llamafactory_style_data.json"
}

2. 模型微调流程

下载基座模型

若无法直接访问 HuggingFace,可通过魔塔社区下载。本例选用 Qwen1.5-4B-Chat 作为基座模型。

from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen1.5-4B-Chat', cache_dir="/root/autodl-tmp/models")

启动 Web UI 进行训练

进入项目目录启动 WebUI:

cd LLaMA-Factory
llamafactory-cli webui

在界面中配置以下关键参数,根据显存情况灵活调整:

  • 模型名称:Qwen1.5-4B-Chat
  • 模型路径:指向本地下载的模型目录
  • 量化等级:8bit(可选,有助于节省显存)
  • 训练轮次:300(建议设置稍大,可随时中断)
  • 最大样本数:1000
  • 截断长度:512(视文本长度而定)
  • Batch Size:12(注意避免 OOM)
  • 验证集比例:0.02
  • 导出合并后的模型

    训练完成后,需要合并 LoRA 权重。新建导出目录(如 /root/autodl-tmp/models_merge/qwen),设备选择 auto 以加速导出过程。

    推理验证

    在 WebUI 的推理模块中,加载训练好的权重路径(通常位于 saves/{model_name}/lora/train_{date}/checkpoint-{step})。推理后端建议选择 huggingface;若选择 vllm,需确保已安装兼容版本(如 vllm==0.11.0)且在同一环境中。

    3. vLLM 部署与服务

    安装 vLLM

    pip install vllm==0.11.0
    

    启动服务

    vLLM 启动时会预分配 KV Cache 显存,若遇显存不足,最佳方案是调小最大序列长度:

    # 默认端口为 8000
    vllm serve /root/autodl-tmp/models_merge/qwen --max-model-len 32000
    

    构建验证应用

    为了直观测试效果,可以使用 Streamlit 编写一个简单的聊天前端。注意 model 参数必须指定合并后模型的绝对路径,否则可能报 404 错误。

    import streamlit as st
    from openai import OpenAI
    
    st.set_page_config(page_title="VLLM Chat Demo", page_icon="🤖")
    st.title("VLLM Chat Demo")
    
    @st.cache_resource
    def init_client():
        client = OpenAI(
            base_url="http://localhost:8000/v1",
            api_key="not-needed"
        )
        return client
    
    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()
            response = st.session_state.client.chat.completions.create(
                model="/root/autodl-tmp/models_merge/qwen",
                messages=messages,
                temperature=0.7,
                max_tokens=512,
                stream=False
            )
            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")
    

    运行应用:

    streamlit run ./app.py
    

    默认访问地址为 http://localhost:8501/。若微调效果未达预期,可适当增加训练轮次或优化数据集质量。

    目录

    1. 环境准备
    2. 1. 搭建 LLaMA-Factory 环境
    3. 数据集准备
    4. 2. 模型微调流程
    5. 下载基座模型
    6. 启动 Web UI 进行训练
    7. 导出合并后的模型
    8. 推理验证
    9. 3. vLLM 部署与服务
    10. 安装 vLLM
    11. 启动服务
    12. 默认端口为 8000
    13. 构建验证应用
    • 💰 8折买阿里云服务器限时8折了解详情
    • 💰 8折买阿里云服务器限时8折购买
    • 🦞 5分钟部署阿里云小龙虾了解详情
    • 🤖 一键搭建Deepseek满血版了解详情
    • 一键打造专属AI 智能体了解详情
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

    更多推荐文章

    查看全部
    • 大模型、检索增强生成与智能体的应用及开发实践
    • Python 实现微信公众号文章批量爬取与数据导出
    • Clawdbot 直连 Qwen3-32B:Webhook 事件通知与外部系统自动触发
    • 机器人领域顶会指南与具身智能学习路线
    • 2026 年 AI 测试用例生成工具 TOP5 深度解析
    • VsCode 远程调用 Claude Agent 报错无效请求?参数配置排查指南
    • AI 时代重建个人掌控力:解读“超级能动性”的核心逻辑
    • 小米智能家居 Miloco 分离式部署指南
    • Trae AI 设计稿转代码实战:从上传到生成的全流程指南
    • Openclaw 开源仿生爪:原理、应用与生态解析
    • Manual2Skill:利用 VLM 阅读说明书指导机器人家具组装
    • Vivado FPGA 逻辑设计实战:同步 FIFO 全流程解析
    • GESP C++ 七级真题解析:金币收集
    • OpenHashTab 文件哈希校验工具使用指南
    • OpenClaw 集成 GLM 模型实现免费联网搜索
    • 2025 年人工智能十大趋势及 AI 智能体能力级别
    • HBase 核心架构解析:HMaster、RegionServer 与 ZooKeeper 协同机制
    • VS Code 配置 GitHub Copilot Agent Skills 实战指南
    • 前端面试题精选:闭包、事件循环与 Vue 核心原理
    • 粒子群优化(PSO)改进算法在全局最优解搜索中的应用

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • RSA密钥对生成器

      生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

    • Mermaid 预览与可视化编辑

      基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

    • 随机西班牙地址生成器

      随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • curl 转代码

      解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online