实操调教

分类: LM大模型&微调

本教程以 Ubuntu Linux 单卡 GPU 环境为例,演示如何使用 LoRA 技术对 Qwen2.5-7B-Instruct 进行监督微调(SFT),并最终导出完整模型。您只需复制粘贴并根据实际路径微调即可跑通全流程。


零、 硬件与环境前置要求

  • 操作系统:Linux (推荐 Ubuntu 20.04/22.04)
  • GPU显存要求:最低 16GB VRAM(如 RTX 4080/3090/4090/A10G)。若显存仅有 8GB,需在训练脚本中增加 --quantization_bit 4 开启 QLoRA。
  • 基础环境:CUDA Toolkit 11.8 或 12.x,Python 3.10+。

第一步:克隆项目与安装依赖

打开终端,依次执行以下命令构建干净的虚拟环境并安装 LLaMA-Factory:

Bash

# 1. 获取代码 (使用 depth 1 加速克隆)
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory

# 2. 创建并激活 Conda 虚拟环境
conda create -n llama_factory python=3.10 -y
conda activate llama_factory

# 3. 安装核心依赖
pip install -e ".[torch,metrics]"

注:国内服务器若下载过慢,可在 pip install 后追加 -i https://pypi.tuna.tsinghua.edu.cn/simple


第二步:准备自定义数据集并注册

LLaMA-Factory 依赖 data 目录下的配置文件来映射数据。

1. 创建数据文件LLaMA-Factory/data 目录下新建一个名为 custom_qa.json 的文件,写入您的业务数据。严格按照以下 JSON 数组格式组织:

JSON

[
  {
    "instruction": "请提取以下文本中的公司名称和融资金额。",
    "input": "2023年10月,人工智能初创公司智谱AI宣布完成超25亿人民币融资。",
    "output": "公司名称:智谱AI\n融资金额:超25亿人民币"
  },
  {
    "instruction": "将下面这段C++代码转换为Python代码。",
    "input": "int main() { printf(\"Hello, World!\"); return 0; }",
    "output": "def main():\n    print(\"Hello, World!\")\n\nif __name__ == \"__main__\":\n    main()"
  }
]

2. 注册数据集 打开 LLaMA-Factory/data/dataset_info.json 文件。在 JSON 对象的顶层(紧接第一个 { 之后),加入您的自定义数据集配置:

JSON

{
  "custom_qa": {
    "file_name": "custom_qa.json"
  },
  "alpaca_en": {
    "file_name": "alpaca_data_en_52k.json",
    "file_sha1": "607f94a7f581341e59685aef32f5310952326e23"
  },
...

注意检查 JSON 格式,确保逗号不遗漏。


第三步:编写并执行训练脚本 (CLI)

在工程根目录下创建一个名为 run_sft.sh 的 Shell 脚本。此脚本定义了所有关键的超参数。

1. 创建并编辑 run_sft.sh

Bash

#!/bin/bash

# 如果服务器在国内,取消下一行的注释以使用魔搭社区下载模型
# export USE_MODELSCOPE_HUB=1

llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path Qwen/Qwen2.5-7B-Instruct \
    --dataset custom_qa \
    --dataset_dir ./data \
    --template qwen \
    --finetuning_type lora \
    --lora_target all \
    --output_dir ./saves/Qwen2.5-7B/lora/sft \
    --overwrite_cache \
    --overwrite_output_dir \
    --cutoff_len 1024 \
    --preprocessing_num_workers 16 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --warmup_steps 20 \
    --save_steps 100 \
    --learning_rate 5e-5 \
    --num_train_epochs 3.0 \
    --max_samples 1000 \
    --plot_loss \
    --bf16

关键参数硬核解析:

  • --model_name_or_path: 基座模型路径。支持 Hugging Face ID(会自动下载)或本地绝对路径。
  • --template: 极其重要。必须与模型匹配,Qwen 系列填 qwen,LLaMA-3 填 llama3。填错会导致模型输出乱码或无法停止。
  • --lora_target all: 将 LoRA 模块应用于所有线性层,通常比仅应用于 Attention 层效果更好。
  • --per_device_train_batch_size * --gradient_accumulation_steps: 实际 Batch Size(此处为 2 * 8 = 16)。爆显存时调小 batch_size,同比例调大 accumulation_steps。
  • --bf16: 启用 Bfloat16 混合精度训练(需 Ampere 架构以上显卡,如 30 系列/40 系列)。如果是旧显卡(如 V100),改为 --fp16

2. 运行脚本

Bash

chmod +x run_sft.sh
./run_sft.sh

执行后,终端会打印进度条。训练结束后,LoRA 权重和 Loss 曲线图会保存在 ./saves/Qwen2.5-7B/lora/sft 目录中。


第四步:在终端进行推理测试

训练完成后,使用框架自带的 Chat CLI,加载基础模型并挂载刚才训练好的 LoRA 权重进行验证。

Bash

llamafactory-cli chat \
    --model_name_or_path Qwen/Qwen2.5-7B-Instruct \
    --adapter_name_or_path ./saves/Qwen2.5-7B/lora/sft \
    --template qwen \
    --finetuning_type lora

等待模型加载完毕后,终端会出现交互式提示符。输入您在 custom_qa.json 中定义的类似问题,检查模型的泛化与拟合效果。输入 exit 退出。


第五步:合并权重并导出为完整模型

在生产环境中(如使用 vLLM 或 TGI 部署),通常不支持直接动态加载基础模型 + LoRA 补丁。您需要将 LoRA 权重合并进基础模型,导出一个全新的完整模型。

在工程根目录下执行以下命令:

Bash

llamafactory-cli export \
    --model_name_or_path Qwen/Qwen2.5-7B-Instruct \
    --adapter_name_or_path ./saves/Qwen2.5-7B/lora/sft \
    --template qwen \
    --finetuning_type lora \
    --export_dir ./models/Qwen2.5-7B-Instruct-Custom \
    --export_size 2 \
    --export_device auto
  • --export_dir: 合并后新模型保存的绝对/相对路径。
  • --export_size 2: 将模型切分为最大 2GB 的分块(Safetensors 格式),便于传输和加载。

执行完毕后,./models/Qwen2.5-7B-Instruct-Custom 目录下就是一个标准格式、包含您微调知识的全新大模型了。您可以将其直接扔给 vLLM 或 Ollama 进行高性能部署。