LLaMA-Factory 微调 DeepSeek-R1 指南

在大模型时代,个性化语言模型正从“可用”走向“好用”。我们不再满足于通用模型的千人一面,而是希望它能理解我们的表达习惯、记住对话上下文、甚至模仿特定语气风格。要实现这一点,微调(Fine-tuning)是最直接有效的路径。

但传统微调流程复杂:环境配置繁琐、依赖冲突频发、数据格式不统一、训练过程黑箱……这些门槛让许多开发者望而却步。直到 LLaMA-Factory 的出现——这个被誉为“大模型微调一站式工厂”的开源框架,真正将复杂的底层细节封装成可交互的操作界面,让非专业研究人员也能高效完成模型定制。

它支持超过 100 种主流架构,涵盖 LLaMA、Qwen、ChatGLM 和 DeepSeek 等系列模型,并统一了全参数微调与 LoRA/QLoRA 等轻量化方法的接口。更重要的是,其内置 WebUI 支持可视化操作,配合自动化评估和一键导出功能,极大提升了开发效率。

本文将以 DeepSeek-R1-Distill-Qwen-1.5B 为例,带你完整走通从零开始的微调全流程:从 Anaconda 环境搭建、4-bit 量化适配安装,到微信聊天记录清洗为 ShareGPT 格式,再到 LoRA 参数设置、训练监控与最终本地部署。整个过程无需编写复杂脚本,却又能深入关键技术点,帮助你掌握每一个决策背后的工程考量。


环境准备:构建稳定可靠的运行基础

任何高质量微调的前提,都是一个干净、隔离且兼容性良好的 Python 环境。推荐使用 MinicondaAnaconda 来管理依赖,避免与其他项目产生版本冲突。

# 创建独立环境,指定 Python 3.10(LLaMA-Factory 要求 ≥3.9)
conda create -n llamafactory python=3.10 -y

# 激活环境
conda activate llamafactory

进入克隆后的项目目录:

cd /path/to/LLaMA-Factory

确保当前路径下存在 requirements.txtsrc/ 目录。这是后续安装的基础。

CUDA 与 PyTorch 安装

如果你有 NVIDIA 显卡,务必正确安装对应版本的 PyTorch + CUDA 组合。以 RTX 30/40 系列常见的 CUDA 11.8 为例:

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

验证是否成功:

import torch
print(torch.__version__)
print(torch.cuda.is_available())  # 应输出 True

若返回 False,请检查显卡驱动版本是否支持当前 CUDA 工具包。可通过 NVIDIA 官方文档 查看兼容性表。

💡 小技巧:Linux 用户可以直接通过 pip 安装官方预编译包;Windows 用户建议优先使用 conda 安装,减少 DLL 缺失问题。

安装 QLoRA 所需的量化库

若想在消费级显卡上运行大模型微调(如 16GB 显存跑 1.5B 模型),必须启用 4-bit 量化 LoRA(QLoRA)。这需要额外安装 bitsandbytes,但它在 Windows 上没有原生 wheel 包。

推荐使用社区维护的编译版本:

pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.2.post2-py3-none-win_amd64.whl

⚠️ 注意:该包仅适用于 CUDA 11.1 ~ 12.2 版本。如果系统中 CUDA 驱动过旧或过新,可能出现 CUDA error: invalid device ordinal 等错误。

Linux 用户则简单得多:

pip install bitsandbytes

启动 WebUI 可视化界面

LLaMA-Factory 的最大优势之一就是图形化操作。先安装主依赖:

pip install -r requirements.txt
pip install -e ".[torch,metrics]"

默认情况下,WebUI 仅允许本地访问(localhost)。如果你想从其他设备访问,或者遇到连接超时问题,需要修改源码中的启动配置。

打开文件:

LLaMA-Factory/src/llamafactory/webui/interface.py

找到 run_web_ui()run_web_demo() 函数,将:

gr.ChatInterface(...).launch(share=gradio_share, ...)

改为:

gr.ChatInterface(...).launch(share=True, ...)

保存后执行:

llamafactory-cli webui

成功启动后会输出类似信息:

Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://xxxx.gradio.live

此时可在浏览器访问 http://127.0.0.1:7860 进入操作面板。

❗ 提醒:不要在开启代理工具(如 Clash、V2RayN)时访问页面,否则可能导致资源加载失败或无限转圈。


数据集构建:从原始聊天记录到标准格式

高质量的数据是微调成功的基石。与其使用公开语料,不如利用自己的真实对话历史来训练专属模型——这样生成的回答会更贴近你的表达风格。

使用工具导出微信聊天记录

推荐使用国产工具 留痕 MemoTrace,支持完整解析微信 PC 版的加密数据库。

使用步骤如下:

  1. 下载并运行 MemoTrace.exe
  2. 登录微信账号
  3. 点击【解析数据】
  4. 选择目标联系人或群聊
  5. 导出格式选 JSON + TXT(建议双备份)
  6. 记录导出路径,例如:D:\软件\留痕\data\聊天记录

每个对话会被保存为单独的 .json 文件,结构清晰,包含时间戳、角色(user/assistant)、内容等字段。

多文件合并脚本

由于数据分散在多个文件中,我们需要将其聚合为单一数据集。创建 merge.py

import os
import json

folder_path = r'D:\软件\留痕\data\聊天记录'
json_files = []

for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.endswith('.json') and not file.startswith('merged'):
            json_files.append(os.path.join(root, file))

merged_data = []
for file in json_files:
    with open(file, 'r', encoding='utf-8') as f:
        try:
            data = json.load(f)
            if isinstance(data, list):
                merged_data.extend(data)
            else:
                merged_data.append(data)
        except json.JSONDecodeError:
            print(f"解析失败,跳过文件:{file}")

output_path = os.path.join(folder_path, 'merged_data.json')
with open(output_path, 'w', encoding='utf-8') as out_file:
    json.dump(merged_data, out_file, ensure_ascii=False, indent=2)

print(f"✅ 合并完成!共整合 {len(merged_data)} 条对话,保存至:{output_path}")

执行命令:

cd "D:\软件\留痕\data\聊天记录"
python merge.py

生成 merged_data.json 后,下一步就是清洗噪声。

数据清洗与格式转换

原始数据常含有空消息、系统提示、链接、手机号等干扰项。创建 Data_Preprocessing.py 进行标准化处理:

import json
import re

input_file = 'merged_data.json'
output_file = 'converted_data.json'

with open(input_file, 'r', encoding='utf-8') as f:
    raw_data = json.load(f)

cleaned_conversations = []

def clean_content(text):
    text = re.sub(r'\s+', ' ', text)
    text = re.sub(r'http[s]?://\S+', '[URL]', text)
    text = re.sub(r'\d{11}', '[PHONE]', text)
    text = re.sub(r'\S+@\S+', '[EMAIL]', text)
    return text.strip()

for item in raw_data:
    if 'messages' not in item or not item['messages']:
        continue

    conversation = {"conversations": []}
    for msg in item['messages']:
        role = msg.get('role')
        content = msg.get('content', '')

        if not content.strip():
            continue

        content = clean_content(content)

        if role == 'system':
            continue
        elif role == 'user':
            from_role = 'human'
        elif role == 'assistant':
            from_role = 'gpt'
        else:
            continue

        conversation['conversations'].append({
            "from": from_role,
            "value": content
        })

    if len(conversation['conversations']) >= 2:
        cleaned_conversations.append(conversation)

with open(output_file, 'w', encoding='utf-8') as f:
    json.dump(cleaned_conversations, f, ensure_ascii=False, indent=2)

print(f"✅ 数据清洗完成!共生成 {len(cleaned_conversations)} 组有效对话,保存至 {output_file}")

这里采用的是 ShareGPT 格式,因其已成为主流微调框架的事实标准:

[
  {
    "conversations": [
      {"from": "human", "value": "你好"},
      {"from": "gpt", "value": "你好!有什么可以帮助你?"}
    ]
  }
]

执行脚本即可得到可用于训练的标准数据集。


开始微调:LoRA 参数详解与实战配置

回到 LLaMA-Factory 主目录,将 converted_data.json 复制到 data/ 文件夹下:

LLaMA-Factory/data/converted_data.json

然后编辑 data/dataset_info.json,注册新数据集:

"converted_data": {
  "file_name": "converted_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations"
  }
}

📌 dataset_info.json 是框架识别自定义数据集的关键配置文件,必须准确填写。

加载模型与设置 LoRA

启动 WebUI,进入 Train 页面,切换中文模式后填写以下信息:

字段
模型名称 DeepSeek-R1-1.5B-Distill
模型路径 ./models/DeepSeek-R1-1.5B
数据集 converted_data
输出目录 saves/DeepSeek-R1/lora
微调方法选择
  • 训练类型:LoRA
    (只训练低秩矩阵,节省显存)
  • 模块名q_proj,v_proj
    (作用于注意力机制中的查询和值投影层,效果显著)
  • LoRA 秩 (rank):8
    (控制新增参数量,8 是平衡精度与效率的经验值)
  • LoRA Alpha:16
    (缩放因子,通常设为 rank 的两倍)
  • LoRA Dropout:0.1
    (防止过拟合)

🔍 工程经验:对于 1.5B 规模模型,在 16GB 显存下使用上述配置,结合 4-bit 量化,可稳定运行 batch size=4 的训练任务。

训练超参数建议
参数 推荐值 说明
学习率 2e-4 AdamW 默认学习率,适合 LoRA 微调
批次大小 4 per device
梯度累积步数 4 等效 batch size = 16
最大长度 1024 控制上下文窗口
Epoch 数 3 避免过度拟合小数据集
优化器 AdamW 收敛稳定
调度器 cosine 平滑降学习率

点击 “预览命令” 可查看生成的 CLI 指令,确认无误后点击 “开始”


训练监控与性能评估

训练启动后,终端会实时输出日志:

Epoch: 1.0%, Step: 100, Loss: 2.1567, LR: 2.00e-04, Time: 12s/step
...
Training completed!

重点关注几个指标:

  • train_loss:初期应在 2.0~3.0 之间,随 epoch 下降至 1.5 以下为佳;
  • 若 loss 长期不下降,可能是学习率过高或数据标签错乱;
  • num_input_tokens_seen:累计处理 token 数,反映训练充分度;
  • train_samples_per_second:每秒样本数,用于判断硬件瓶颈。

训练结束后,进入 Evaluate&Predict 页面上传测试集进行推理评估,系统将返回多项自动评分:

指标 解读
predict_bleu-4 四元组精确匹配度(0~100),越高越好
predict_rouge-1/2/l 分别衡量单词、双词组合、最长公共子序列的召回率
predict_steps_per_second 推理吞吐量,影响实际部署响应速度

🧪 实践建议:当 rouge-l > 0.5 时,说明生成文本与参考答案具备较强语义一致性,基本达到可用水平。


模型导出与本地部署

训练完成后,LoRA 权重保存在:

saves/DeepSeek-R1/lora/checkpoint-xxx/

要独立部署,需将其与原始模型合并。进入 WebUI 的 Export 页面:

  • 模型路径:原始 DeepSeek 模型目录
  • 权重路径:LoRA checkpoint 路径
  • 导出设备:auto
  • 导出目录model/fine-tuned-deepseek-r1/

点击导出,等待合并完成。你会获得一个标准 HuggingFace 模型目录,包含:

config.json
pytorch_model.bin
tokenizer.model
generation_config.json

即可用 Transformers 直接加载:

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("./model/fine-tuned-deepseek-r1/")
tokenizer = AutoTokenizer.from_pretrained("./model/fine-tuned-deepseek-r1/")

inputs = tokenizer("你是谁?", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

为便于后续服务化,建议创建 requirements.txt

transformers>=4.41.2
torch>=2.0.0
accelerate
sentencepiece
tiktoken
protobuf
uvicorn
fastapi

搭配 FastAPI 可快速搭建 REST API 接口,实现模型即服务(MaaS)。


这套基于 LLaMA-Factory 的微调方案,不仅大幅降低了技术门槛,更通过模块化设计保证了灵活性与可复现性。无论是打造个人 AI 助手,还是为企业定制垂类模型,都能从中获益。关键在于:用真实数据训练真实场景下的行为模式,这才是让模型“像你”的核心所在。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐