大模型微调保姆级教程:手把手教你从GPU配置到DeepSpeed多卡训练全流程!
本文系统梳理大模型微调的完整流程:从资源准备、环境搭建、开源模型选择、训练数据构建,到微调方式选型、超参数调优、多卡训练命令解析,直至模型评测与部署。
目录
-
- 背景:为什么要做微调?
-
- GPU 资源准备
-
- 环境搭建与工具安装
-
- 开源模型选择
-
- 训练数据准备
-
- 微调方式选择
-
- 训练超参数设置
-
- DeepSpeed 多卡训练命令详解
-
- LLaMA Factory CLI 训练命令详解
-
- 模型评测
-
- 模型部署
-
- 总结与资源汇总
一、背景:为什么要做微调?
大型语言模型(LLM,Large Language Model)的训练分为两个主要阶段:
- • 预训练(Pre-training):在海量无标注语料上进行无监督学习,让模型建立通用的语言表示能力。这个过程消耗数千 GPU 天,成本极高。
- • 指令微调(Instruction Fine-tuning / SFT):在预训练基础上,使用特定领域或任务的有监督数据,让模型适应特定任务或用户偏好。
对于大多数工程师来说,从预训练做起不现实,而是:
-
- 选择一个高质量的开源基础模型(如 Qwen3、LLaMA 系列)
-
- 用自己的业务数据进行微调(Fine-tuning)
-
- 最终得到一个特定场景下表现优秀的专属模型
🔑 关键认知:微调 ≠ 重新训练。微调是在已有知识基础上"精修",成本仅是预训练的千分之一甚至更低。
二、GPU 资源准备
2.1 确认环境
在开始训练之前,首先要确认服务器的 GPU 配置。使用 nvidia-smi 命令查看:
nvidia-smi
输出示例(8 张 NVIDIA A10,每张 24GB 显存):
+-----------------------------------------------------------------------------------------+| NVIDIA-SMI 550.90.07 Driver Version: 550.90.07 CUDA Version: 12.4 ||-----------------------------------------+------------------------+----------------------+| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. ||=========================================+========================+======================|| 0 NVIDIA A10 Off | 00000000:35:00.0 Off | 0 || 0% 27C P8 15W / 150W | 14MiB / 24576MiB | 0% Default || 1 NVIDIA A10 Off | 00000000:36:00.0 Off | 0 || 0% 27C P8 20W / 150W | 14MiB / 24576MiB | 0% Default |...(共 8 张)+-----------------------------------------------------------------------------------------+
关键字段说明:
| 字段 | 含义 |
|---|---|
Driver Version |
NVIDIA 驱动版本 |
CUDA Version |
支持的最高 CUDA 版本(实际使用的 CUDA 版本需看 nvcc -V) |
Memory-Usage |
当前显存占用 / 总显存(上例为 14MiB / 24576MiB ≈ 24GB 空闲) |
GPU-Util |
GPU 计算利用率,训练时应接近 100% |
Temp |
GPU 温度,正常训练时 60–80°C 为正常范围 |
2.2 显存估算
三、环境搭建与工具安装
工欲善其事,必先利其器。在正式开始微调之前,需要搭建完整的训练环境。
3.1 基础依赖
大模型微调需要以下核心组件,版本匹配非常重要:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.10–3.12 | 3.8 以下不支持部分新特性 |
| PyTorch | 2.1+ | 建议 2.3+,支持 Flash Attention 2、adamw_torch_fused 等优化 |
| CUDA | 11.8 或 12.1 | 需与 GPU 驱动兼容(nvidia-smi 查看最高支持版本) |
| DeepSpeed | 0.14+ | 微软分布式训练库 |
| Transformers | 4.40+ | HuggingFace 模型加载框架 |
3.2 安装 LLaMA Factory
LLaMA Factory 是目前最流行的大模型微调框架,支持 100+ 模型和多种微调方式,强烈推荐使用。
安装步骤:
# 1. 创建独立的 conda 环境(推荐)conda create -p /data/conda/envs/llamafactory python=3.10 -yconda activate /data/conda/envs/llamafactory# 2. 安装 PyTorch(根据 CUDA 版本选择,以 CUDA 12.1 为例)pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121# 3. 克隆 LLaMA Factorygit clone https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory# 4. 安装依赖pip install -e ".[torch,metrics]"# 5. 安装 DeepSpeedpip install deepspeed# 6. 安装 Flash Attention 2(可选但推荐,需 CUDA 11.8+ 和 PyTorch 2.0+)pip install flash-attn --no-build-isolation
⚠️ 常见坑:
- • Flash Attention 安装失败?检查 CUDA 版本是否 ≥ 11.8,以及是否安装了
ninja(pip install ninja)- • DeepSpeed 报错
ModuleNotFoundError?确认安装时 conda 环境已激活- • 多卡训练 NCCL 超时?设置环境变量
export NCCL_TIMEOUT=180000000(毫秒)
3.3 验证安装
安装完成后,运行以下命令验证环境是否就绪:
# 验证 PyTorch + CUDApython -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}'); print(f'GPU count: {torch.cuda.device_count()}')"# 验证 DeepSpeedpython -c "import deepspeed; print(f'DeepSpeed: {deepspeed.__version__}')"# 验证 Flash Attentionpython -c "import flash_attn; print(f'Flash Attention: {flash_attn.__version__}')"# 验证 LLaMA Factory CLIllamafactory-cli version
如果以上命令全部无报错输出,说明环境搭建完成,可以进入模型选择环节。
四、开源模型选择
选择合适的基础模型,是微调成功的第一步。可以从以下维度综合评估:
4.1 参数规模与任务目标
模型参数越大,能力越强,但训练与推理成本也越高:
| 参数规模 | 适用场景 | 典型代表 |
|---|---|---|
| 1B–7B | 轻量任务、边缘部署、嵌入式 | Qwen3-1.7B、LLaMA-3.2-3B |
| 14B–32B | 通用推理、代码生成、知识问答 | Qwen3-14B、Qwen3-32B |
| 72B+ | 高难度推理、科研、复杂 Agent | Qwen3-72B、LLaMA-3.3-70B |
选型建议:
- • 预算有限 / 快速验证:从 7B 模型开始,验证数据质量和流程正确性
- • 生产级应用:14B–32B 在性能和成本之间有最佳平衡
- • 追求极致效果:72B+ 需要充足的算力投入,建议先做小模型 PoC
4.2 社区支持与生态成熟度
选择有活跃社区的模型,遇到问题时能快速获得帮助。评估要点:
- • GitHub Star 数和 Issue 响应速度:反映社区活跃度
- • HuggingFace 下载量:反映实际使用广泛程度
- • 第三方适配情况:是否被 LLaMA Factory、vLLM、TensorRT-LLM 等主流框架支持
目前中文场景下,Qwen 系列(阿里云)和 GLM 系列(智谱)社区支持最为完善。
4.3 多模态能力与场景适配性
如果业务涉及图文理解、文档解析等场景,需要选择支持多模态的模型:
| 模型 | 多模态版本 | 支持能力 |
|---|---|---|
| Qwen3 | Qwen2.5-VL / Qwen-VL | 图文理解、文档 OCR、视频理解 |
| LLaMA | LLaVA 系列(社区) | 图文对话 |
| GLM | GLM-4V | 图文理解 |
💡 经验:如果不需要多模态能力,不要选多模态模型——它们通常更大、更慢,且纯文本任务上不一定优于同规模纯文本模型。
4.4 推理性能指标
模型选定后,部署时的性能同样关键。以下是常用的推理性能指标:
请求级别指标(用户视角):
| 指标 | 全称 | 含义 | 建议阈值 |
|---|---|---|---|
| TTFT | Time To First Token | 发送请求到生成第一个 Token 的时间 | < 500ms(在线应用) |
| TPOT | Time Per Output Token | 每个输出 Token 的平均生成时间 | < 50ms(流式流畅) |
| Latency | 端到端延迟 | TTFT + TPOT × 输出 Token 数 |
视业务而定 |
系统级别指标(运维视角):
| 指标 | 含义 | 说明 |
|---|---|---|
| Throughput | 吞吐量 | 每秒生成的 Token 总数(所有并发请求合计) |
| Concurrency | 并发数 | 同时处理的请求数量 |
| GPU Util | GPU 利用率 | 训练时应接近 100%,推理时 70–90% 为佳 |
📖 参考:Qwen3 系列详细性能数据见 Qwen3 官方说明
五、训练数据准备
5.1 数据量与质量的黄金法则
数据是微调效果的核心。关于数据量,有一个反直觉的结论——质量 >> 数量:
- • LIMA 研究(《LIMA: Less Is More for Alignment》):用 1000 条精心标注的提示-回复对微调 650 亿参数的 LLaMA,就能达到良好的跨任务性能。研究发现:扩大数据量而不增加提示多样性,收益有限;而优化数据质量收益显著。
- • 《Maybe Only 0.5% Data Is Needed》:通过聚类方法证明,少量数据(如 1.9M tokens)也能对特定任务模型产生良好的指令调整效果。
- • 不同任务的数据需求差异显著:
- • 翻译、改写、生成任务:200 万条以内数据即可表现出色
- • 分类、问答、摘要:增加数据量能持续提升(但收益递减)
- • 数学推理、代码、Chain-of-Thought:对数据质量和模型规模要求更高
5.2 常见微调数据格式
LLaMA Factory 支持多种数据格式,最常用的是 Alpaca 格式:
[ { "instruction": "你是一个医疗助手,请回答用户的问题。", "input": "糖尿病患者可以吃西瓜吗?", "output": "糖尿病患者可以适量食用西瓜,但需注意西瓜含糖量较高(约5%),建议每次不超过100克,并在两餐之间食用,避免血糖骤升。" }]
也支持 ShareGPT 多轮对话格式:
[ { "conversations": [ {"from": "human", "value": "帮我写一个 Python 快速排序函数"}, {"from": "gpt", "value": "def quicksort(arr):\n if len(arr) <= 1:\n return arr\n pivot = arr[len(arr) // 2]\n left = [x for x in arr if x < pivot]\n middle = [x for x in arr if x == pivot]\n right = [x for x in arr if x > pivot]\n return quicksort(left) + middle + quicksort(right)"} ] }]
📌 常见微调数据格式详见 LLaMA Factory 数据说明 https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README.md
数据注册:将数据集 JSON 文件放入 LLaMA Factory 的 data/ 目录,然后在 data/dataset_info.json 中注册:
{ "myidentity": { "file_name": "myidentity.json", "formatting": "alpaca", "columns": { "prompt": "instruction", "query": "input", "response": "output" } }}
5.3 数据集要求
| 要素 | 说明 |
|---|---|
| 样本数量 | 简单任务几百条够用;中等难度上千条;高难度任务最多也不超过 10 万条 |
| 样本质量 | 覆盖目标任务的各种情况,避免数据偏差;高质量样本优先于数量 |
| 数据预处理 | 需要清洗、去重、标注,确保一致性 |
| 数据划分 | 训练集:验证集:测试集 ≈ 6:3:1,用于评估训练过程和最终效果 |
5.4 数据获取渠道
| 渠道 | 地址 | 特点 |
|---|---|---|
| 魔搭社区(ModelScope) | https://www.modelscope.cn/datasets | 中文数据丰富 |
| Hugging Face | https://huggingface.co/datasets | 英文数据为主,覆盖最广 |
5.5 微调数据集构建工具
当没有现成数据时,可用 AI 辅助生成微调数据:
| 工具 | 地址 | 功能 |
|---|---|---|
| easy-dataset | https://github.com/ConardLi/easy-dataset | 从文档自动生成问答对 |
| distilabel | https://github.com/argilla-io/distilabel | AI 生成 + 质量过滤一体化流程 |
| FastDatasets | https://github.com/ZhuLinsen/FastDatasets | 快速生成微调数据 |
| OpenRefine | https://github.com/OpenRefine/OpenRefine | 数据清洗与转换 |
六、微调方式选择
6.1 全参数微调 vs 参数高效微调
| 方式 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Full Fine-tuning | 更新所有参数 | 效果最好 | 显存和时间消耗极大 | 数据充足 + 资源充足 |
| LoRA | 冻结原始参数,训练低秩增量矩阵 | 显存少、速度快、效果接近全参 | 需选择合适 rank | 大多数场景首选 |
| QLoRA | LoRA + 4bit 量化基础模型 | 显存减少 50%+ | 可能有精度损失 | 显存极度受限 |
| Prefix Tuning | 在输入前加可训练前缀 | 参数极少 | 长文本效果较差 | 特定生成任务 |
6.2 LoRA 原理详解
LoRA(Low-Rank Adaptation)的核心思想:
预训练模型权重矩阵 W 的更新量 ΔW 具有低秩特性,因此可以用两个小矩阵 A 和 B 来近似:
ΔW = B × A,其中 B ∈ R^(d×r),A ∈ R^(r×k),r ≪ min(d,k)
前向传播时:
h = W·x + (B·A)·x × (alpha/rank)
LoRA 核心参数:
| 参数 | 含义 | 推荐值 |
|---|---|---|
lora_rank (r) |
低秩矩阵的秩。越大表示适应能力越强,但参数量也越多 | 8–64;一般用 8 或 16 |
lora_alpha |
缩放系数,控制 LoRA 更新的影响幅度,实际缩放比例 = alpha/rank | 一般设为 rank 的 1–2 倍(如 rank=8,alpha=16) |
lora_dropout |
LoRA 层的 Dropout,防止过拟合 | 数据量大时设 0;数据少时设 0.1 |
lora_target |
应用 LoRA 的目标模块 | all (全部注意力层+FFN)或 q_proj,v_proj |
📖 参考:LoRA 详细原理 https://arxiv.org/abs/2106.09685 | 大语言模型微调技术研究综述https://aibook.ren/archives/llm-fine-tuning
七、训练超参数设置
微调时最需要关注的三个核心超参数:
7.1 Epochs(训练轮次)
根据数据集大小动态调整:
| 数据量 | 推荐 Epochs |
|---|---|
| 100 条 | 15 |
| 1,000 条 | 10 |
| 5,000–20,000 条 | 4–5 |
| 100,000 条 | 2–3 |
💡 经验:领域增强的 SFT 数据不需要太多,质量一定要把握好。一般领域总结回复任务几百条数据即可。小数据量可以适当增大 Epoch,让模型充分收敛。
7.2 Learning Rate(学习率)
- • 推荐范围:SFT 学习率约为预训练学习率的 0.1 倍。例如预训练为
9e-5,则 SFT 建议设为9e-6。 - • 对于 LoRA 微调,由于只更新低秩矩阵,可适当增大学习率(如
1e-4到5e-5)。 - • 调整策略:
- • loss 不收敛或震荡大 → 调低
- • loss 下降过慢 → 调高
- • Warmup 推荐:
warmup_ratio建议在0.005–0.015之间;学习率较大时可适当增大 warmup。
7.3 Global Batch Size(全局批量大小)
全局 Batch Size = per_device_train_batch_size × GPU 数量 × gradient_accumulation_steps
以文档中的命令为例:
per_device_train_batch_size = 4gradient_accumulation_steps = 8GPU 数量 = 8→ Global Batch Size = 4 × 8 × 8 = 256
- • Batch Size 越大:训练越稳定,但显存占用越高
- •
gradient_accumulation_steps(梯度累积步数):模拟大 Batch Size 而不增加实际显存占用。多卡节点增多时,可进一步增大 Batch Size 提高吞吐量。
7.4 学习率调度器
常用选项:
| 调度器 | 说明 | 推荐场景 |
|---|---|---|
cosine (余弦退火) |
学习率从初始值余弦降低到接近 0 | SFT 微调首选 ,训练稳定、收敛好 |
linear |
线性下降 | 简单任务 |
constant_with_warmup |
warmup 后保持恒定 | 少量步骤微调 |
八、DeepSpeed 多卡训练命令详解
8.1 DeepSpeed 是什么?
DeepSpeed 是微软开源的分布式深度学习优化库,通过 ZeRO(Zero Redundancy Optimizer) 技术,将模型参数、梯度、优化器状态分散到多张 GPU 上,大幅降低单卡显存需求。
ZeRO 三个阶段对比:
| 阶段 | 分片内容 | 每卡显存节省效果 | 适用场景 |
|---|---|---|---|
| ZeRO Stage 1 | 优化器状态按 N 卡均分 | 节省约 4× 优化器状态显存 | 模型较小、卡数多 |
| ZeRO Stage 2 | 优化器状态 + 梯度均分 | Stage1 基础上再节省梯度显存 | 中等模型 |
| ZeRO Stage 3 | 优化器状态 + 梯度 + 模型参数全部均分 | 单卡显存 ≈ 总需求 / N | 大模型首选 (32B+) |
8.2 基础训练命令(前台运行)
deepspeed --num_gpus 8 src/train.py \ --deepspeed examples/deepspeed/ds_z3_config.json \ --stage sft \ --model_name_or_path /data/modelscope/models/Qwen/Qwen3-32B/ \ --do_train \ --dataset myidentity \ --template qwen \ --finetuning_type lora \ --output_dir saves/Qwen3-32B/lora/train_2025-06-10-15-17-52 \ --overwrite_cache \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --logging_steps 5 \ --save_steps 100 \ --learning_rate 5e-05 \ --num_train_epochs 100.0 \ --plot_loss True \ --bf16 True \ --trust_remote_code True
参数逐一解析:
| 参数 | 值 | 含义 |
|---|---|---|
--num_gpus 8 |
8 | 使用 8 张 GPU 进行训练 |
--deepspeed ds_z3_config.json |
ZeRO Stage 3 配置文件 | 启用 DeepSpeed ZeRO Stage 3 分布式策略 |
--stage sft |
sft | 训练阶段:监督微调(Supervised Fine-Tuning) |
--model_name_or_path |
Qwen3-32B 路径 | 基础模型路径(本地或 HuggingFace 路径) |
--do_train |
- | 执行训练(而非评估或预测) |
--dataset myidentity |
myidentity | 数据集名称(对应 data/dataset_info.json 中的配置) |
--template qwen |
qwen | 对话模板,Qwen 系列模型使用 qwen,Qwen3 使用 qwen3 |
--finetuning_type lora |
lora | 微调方式:LoRA(参数高效微调) |
--output_dir |
saves/… | 模型检查点保存路径 |
--overwrite_cache |
- | 覆盖预处理数据缓存(数据集更新时使用) |
--per_device_train_batch_size 4 |
4 | 每张 GPU 每步处理的样本数 |
--gradient_accumulation_steps 8 |
8 | 梯度累积步数(全局 Batch = 4×8×8=256) |
--lr_scheduler_type cosine |
cosine | 学习率调度器:余弦退火 |
--logging_steps 5 |
5 | 每 5 步记录一次训练日志 |
--save_steps 100 |
100 | 每 100 步保存一次检查点 |
--learning_rate 5e-05 |
5×10⁻⁵ | 学习率 |
--num_train_epochs 100.0 |
100 | 训练 100 个 Epoch(自我认知数据集一般较小,故 Epoch 较大) |
--plot_loss True |
True | 训练完成后生成 loss 曲线图 |
--bf16 True |
True | 使用 BFloat16 混合精度训练(节省显存,A10/A100/H100 支持) |
--trust_remote_code True |
True | 允许加载模型自定义代码(某些模型需要) |
8.3 后台运行命令
nohup deepspeed --num_gpus 8 src/train.py \ --deepspeed examples/deepspeed/ds_z3_config.json \ --stage sft \ --model_name_or_path /data/modelscope/models/Qwen/Qwen3-32B/ \ --do_train \ --dataset myidentity \ --template qwen \ --finetuning_type lora \ --output_dir saves/Qwen3-32B/lora/train_2025-06-10-18-17-52 \ --overwrite_cache \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --logging_steps 5 \ --save_steps 100 \ --learning_rate 5e-05 \ --num_train_epochs 100.0 \ --plot_loss True \ --bf16 True \ --trust_remote_code True \ &
⚠️ 关键区别:
nohup ... &让训练进程在后台运行,断开 SSH 连接后训练不会中断。建议配合tail -f nohup.out实时查看日志。
8.4 正常训练的日志长什么样?
以下是训练正常启动后,你应该看到的日志输出模式:
[INFO|trainer.py:xxxx] Using DeepSpeed ZeRO Stage 3[INFO|trainer.py:xxxx] ***** Running training *****[INFO|trainer.py:xxxx] Num examples = 500[INFO|trainer.py:xxxx] Num Epochs = 100[INFO|trainer.py:xxxx] Instantaneous batch size per device = 4[INFO|trainer.py:xxxx] Total train batch size (w. parallel, distributed & accumulation) = 256{'loss': 2.5678, 'learning_rate': 0.0, 'epoch': 0.02}{'loss': 2.1234, 'learning_rate': 2.5e-05, 'epoch': 0.04}{'loss': 1.8756, 'learning_rate': 5e-05, 'epoch': 0.06}...{'loss': 0.3456, 'learning_rate': 4.2e-05, 'epoch': 50.0}
判断训练是否正常的几个信号:
| 信号 | 正常状态 | 异常信号 |
|---|---|---|
| Loss 趋势 | 持续下降并趋于平稳 | 不下降、震荡剧烈、或先降后升(过拟合) |
| GPU 利用率 | 训练阶段接近 100% | 长期低于 50%(可能 I/O 瓶颈) |
| 学习率 | warmup 后按调度器正常变化 | 突变或始终为 0 |
| 显存占用 | 稳定在某个值 | 持续增长(内存泄漏)或 OOM |
8.5 关于 BF16 精度
--bf16 True 使用 BFloat16(Brain Float 16)精度训练,而非默认的 FP32。
| 精度类型 | 指数位 | 尾数位 | 动态范围 | 精度 | 显存 |
|---|---|---|---|---|---|
| FP32 | 8 | 23 | 极大 | 最高 | 基准 |
| BF16 | 8 | 7 | 与 FP32 相同 | 适中 | 节省 50% |
| FP16 | 5 | 10 | 较小 | 适中 | 节省 50% |
BF16 相比 FP16 的优势:指数位与 FP32 相同(8 位),不容易发生溢出(overflow),因此 LLM 训练中 BF16 > FP16。
⚠️ 注意:BF16 需要 Ampere 架构及以上 GPU 支持(A10、A100、H100 等)。V100 不支持 BF16,需改用 FP16。
8.6 DeepSpeed ZeRO Stage 3 配置文件(ds_z3_config.json)
LLaMA Factory 内置的 examples/deepspeed/ds_z3_config.json 典型内容:
{ "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "gradient_accumulation_steps": "auto", "gradient_clipping": "auto", "zero_allow_untested_optimizer": true, "bf16": { "enabled": "auto" }, "zero_optimization": { "stage": 3, "allgather_partitions": true, "allgather_bucket_size": 5e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": 5e8, "contiguous_gradients": true, "offload_optimizer": { "device": "none" }, "offload_param": { "device": "none" } }}
关键字段说明:
| 字段 | 含义 |
|---|---|
"stage": 3 |
启用 ZeRO Stage 3,参数、梯度、优化器状态全部分片 |
"overlap_comm": true |
通信与计算并行,减少等待时间 |
"offload_optimizer"/"device": "cpu" |
将优化器状态 offload 到 CPU 内存(显存不足时启用,但会慢 2–5×) |
"offload_param"/"device": "cpu" |
将模型参数 offload 到 CPU(ZeRO-Infinity,显存极度不足时) |
"allgather_bucket_size": 5e8 |
AllGather 操作的桶大小,影响通信效率 |
九、LLaMA Factory CLI 训练命令详解
除了 DeepSpeed 方式,LLaMA Factory 也支持单卡或简单多卡场景,通过 llamafactory-cli train 命令启动:
llamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path /data/modelscope/models/Qwen/Qwen3-14B/ \ --preprocessing_num_workers 16 \ --finetuning_type lora \ --template qwen3 \ --flash_attn auto \ --dataset_dir data \ --dataset myidentity \ --cutoff_len 2048 \ --learning_rate 5e-05 \ --num_train_epochs 3.0 \ --max_samples 100000 \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --max_grad_norm 1.0 \ --logging_steps 5 \ --save_steps 100 \ --warmup_steps 0 \ --packing False \ --enable_thinking True \ --report_to none \ --output_dir saves/Qwen3-14B-Instruct/lora/train_2025-06-04-13-49-56 \ --bf16 True \ --plot_loss True \ --trust_remote_code True \ --ddp_timeout 180000000 \ --include_num_input_tokens_seen True \ --optim adamw_torch \ --lora_rank 8 \ --lora_alpha 16 \ --lora_dropout 0 \ --lora_target all
新增/重要参数解析:
| 参数 | 值 | 含义 |
|---|---|---|
--preprocessing_num_workers 16 |
16 | 数据预处理并行进程数,加速 tokenization |
--template qwen3 |
qwen3 | Qwen3 专用对话模板(区别于 qwen,Qwen3 的特殊格式) |
--flash_attn auto |
auto | 自动检测是否启用 Flash Attention 2。Flash Attn 显著加速长序列训练 |
--cutoff_len 2048 |
2048 | 最大输入序列长度(超过截断)。越大显存占用越高 |
--max_samples 100000 |
10 万 | 限制训练样本数上限,避免过大数据集意外超时 |
--max_grad_norm 1.0 |
1.0 | 梯度裁剪(防止梯度爆炸),通常设 1.0 |
--warmup_steps 0 |
0 | Warmup 步数(此处用 warmup_steps,也可用 warmup_ratio) |
--packing False |
False | 是否将多个短样本打包成一个序列(提高效率,但可能影响效果) |
--enable_thinking True |
True | 启用 Qwen3 的「思考模式」,模型在回答前会生成 think 思考过程 |
--report_to none |
none | 不上报训练指标到 WandB/TensorBoard(设为 wandb 时需配置 API Key) |
--ddp_timeout 180000000 |
约 50 小时 | DDP 分布式超时时间(单位毫秒),防止长训练过程中节点超时断连 |
--include_num_input_tokens_seen True |
True | 记录已处理的输入 Token 总数,便于监控训练进度 |
--optim adamw_torch |
adamw_torch | 优化器:PyTorch 原生 AdamW(adamw_torch_fused 性能更好,需 PyTorch 2.0+) |
--lora_rank 8 |
8 | LoRA 矩阵的秩 |
--lora_alpha 16 |
16 | LoRA 缩放系数(alpha/rank = 16/8 = 2,实际缩放比为 2) |
--lora_dropout 0 |
0 | LoRA Dropout(数据充足,故设 0) |
--lora_target all |
all | 对所有线性层(q/k/v/o/gate/up/down)应用 LoRA |
关于 Flash Attention
Flash Attention 是一种高效的注意力计算实现,通过分块(tiling)和重计算(recomputation)技术:
- • 将显存复杂度从 O(n²·d) 降至 O(n·d)(n 为序列长度,d 为 head 维度)
- • 训练速度提升 2–4×,对长序列效果尤为显著
- • 数值结果与标准 Attention 完全一致(不是近似),因此不影响模型精度
设置 --flash_attn auto 时,LLaMA Factory 会自动检测硬件支持情况并决定是否启用。
十、模型评测
训练完成后,需要对微调后的模型进行系统评测,量化效果提升。这是很多人容易忽略、但非常重要的环节。
10.1 评测流程概览
选择评测基准 → 编写/选择配置 → 执行推理 → 评估得分 → 对比分析
模型评测通常从两个维度进行:
| 维度 | 方法 | 目的 |
|---|---|---|
| 客观评测 | 在标准 Benchmark 上跑分 | 量化模型能力,便于横向对比 |
| 主观评测 | 人工构造业务测试 Case | 评估实际业务场景下的表现 |
10.2 推荐:OpenCompass
OpenCompass(由上海 AI Lab 开源)是国内最主流的 LLM 评测平台,支持 100+ 评测数据集,覆盖中英文。
安装:
conda create --name opencompass python=3.10 -yconda activate opencompassgit clone https://github.com/open-compass/opencompass.gitcd opencompasspip install -e .
快速评测示例(命令行方式):
# 评测微调后的模型在 GSM8K(数学)和 MMLU(常识推理)上的表现python run.py \ --datasets demo_gsm8k_chat_gen demo_mmlu_chat_gen \ --hf-type chat \ --hf-path /data/modelscope/models/Qwen/Qwen3-14B/ \ --adapter-path saves/Qwen3-14B/lora/train_xxx \ --max-out-len 1024 \ --debug
使用配置文件评测(推荐):
# eval_my_model.pyfrom mmengine.config import read_basewith read_base(): from .datasets.demo.demo_gsm8k_chat_gen import gsm8k_datasets from .datasets.demo.demo_mmlu_chat_gen import mmlu_datasets from .models.qwen.hf_qwen2_5_14b_instruct import models as qwen_models# 替换模型路径为微调后的模型for model in qwen_models: model['path'] = '/data/modelscope/models/Qwen/Qwen3-14B/' model['adapter_path'] = 'saves/Qwen3-14B/lora/train_xxx'datasets = gsm8k_datasets + mmlu_datasetsmodels = qwen_models
``````plaintext
python run.py eval_my_model.py -w outputs/my_eval --debug
评测结果输出示例:
dataset version metric mode qwen3-14b-finetuned qwen3-14b-base---------- --------- -------- ------ --------------------- ---------------demo_gsm8k 1d7fe4 accuracy gen 72.50 65.31demo_mmlu 393424 accuracy gen 68.75 62.06
💡 解读:关注微调前后分数变化。如果目标 Benchmark 分数提升、其他 Benchmark 分数不大幅下降,说明微调效果良好。如果微调后某些任务分数暴跌,可能是"灾难性遗忘"——需要增加训练数据多样性。
10.3 其他评测工具
| 工具 | 地址 | 特点 |
|---|---|---|
| Lighteval | https://github.com/huggingface/lighteval | HuggingFace 官方评测工具,与 HF 生态深度集成 |
| lm-evaluation-harness | https://github.com/EleutherAI/lm-evaluation-harness | EleutherAI 维护,英文基准全面 |
| OpenCompass Hub | https://hub.opencompass.org.cn/home | 在线评测,无需本地部署 |
10.4 常用评测基准
| 基准 | 测试能力 | 中文支持 |
|---|---|---|
| C-Eval | 中文综合知识 | ✅ |
| CMMLU | 中文多任务语言理解 | ✅ |
| GSM8K | 数学推理 | ✅(有中文版) |
| MMLU | 多任务语言理解 | ❌(英文为主) |
| HumanEval | 代码生成 | ❌(英文) |
| MATH | 高难度数学推理 | ❌(英文) |
10.5 主观评测建议
客观 Benchmark 无法完全反映业务表现,建议同时进行主观评测:
-
- 构造 50–100 条业务测试 Case,覆盖典型场景和边界情况
-
- 盲测对比:将微调前后的模型回复混在一起,让业务人员评分
-
- 重点关注:
- • 回答是否准确、完整
- • 是否出现幻觉(编造事实)
- • 格式是否符合要求(JSON、表格等)
- • 安全性(是否生成有害内容)
十一、模型部署
微调完成并通过评测后,需要将模型从「训练格式」转换为「推理格式」,部署到生产环境。
11.1 第一步:LoRA 权重合并
LoRA 微调产出的是轻量级的「适配器权重」,需要与基础模型合并才能独立使用:
llamafactory-cli export \ --model_name_or_path /data/modelscope/models/Qwen/Qwen3-14B/ \ --adapter_name_or_path saves/Qwen3-14B/lora/train_xxx \ --template qwen3 \ --finetuning_type lora \ --export_dir merged_model/Qwen3-14B-finetuned \ --export_size 4 \ --export_legacy_format False
参数说明:
| 参数 | 含义 |
|---|---|
--model_name_or_path |
基础模型路径 |
--adapter_name_or_path |
LoRA 适配器权重路径(训练输出的 checkpoint) |
--template |
对话模板,必须与训练时一致 |
--export_dir |
合并后模型保存路径 |
--export_size 4 |
保存为 4 个分片文件(便于管理) |
--export_legacy_format False |
使用 safetensors 格式(比传统 bin 格式更安全) |
💡 验证合并结果:合并完成后,检查
merged_model/Qwen3-14B-finetuned/目录下应包含config.json、tokenizer.json、model-00001-of-00004.safetensors等文件。
11.2 第二步:模型量化(可选)
量化可以将模型体积和显存需求大幅降低,加速推理:
| 量化方案 | 精度损失 | 速度提升 | 显存节省 | 适用场景 |
|---|---|---|---|---|
| AWQ(Marlin 内核) | 小 | 最佳(+61%) | 75%(INT4) | 生产环境首选 |
| GPTQ | 中等 | 较好(+54%) | 75%(INT4) | 社区支持广 |
| GGUF | 小 | CPU 场景最佳 | 75%(Q4_K_M) | 边缘/CPU 部署首选 |
| FP8 | 极小 | 很好(+90%) | 50% | H100/B100 极致性能 |
推荐策略:
- • GPU 服务部署:AWQ + vLLM(速度与精度最佳平衡)
- • 本地/边缘设备:GGUF + llama.cpp(CPU 也能流畅运行)
- • NVIDIA 最新 GPU(H100+):TensorRT-LLM + FP8(近乎无损精度)
11.3 第三步:推理框架部署
方案一:vLLM(推荐,GPU 服务首选)
vLLM 是目前最流行的 LLM 推理框架,支持高并发、连续批处理(continuous batching):
# 安装 vLLMpip install vllm# 启动 OpenAI 兼容 API 服务python -m vllm.entrypoints.openai.api_server \ --model merged_model/Qwen3-14B-finetuned \ --served-model-name my-finetuned-qwen3 \ --tensor-parallel-size 2 \ --gpu-memory-utilization 0.9 \ --max-model-len 4096
启动后可通过 OpenAI 兼容 API 调用:
from openai import OpenAIclient = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")response = client.chat.completions.create( model="my-finetuned-qwen3", messages=[{"role": "user", "content": "你好,请介绍一下你自己"}], stream=True)for chunk in response: print(chunk.choices[0].delta.content, end="")
方案二:Ollama(本地快速体验)
# 导入为 GGUF 格式后ollama create my-qwen3 -f Modelfileollama run my-qwen3
11.4 部署检查清单
| 检查项 | 说明 |
|---|---|
| ✅ 模型能正常加载 | 检查显存是否足够、模型文件是否完整 |
| ✅ 推理速度满足 SLA | TTFT < 500ms,TPOT < 50ms |
| ✅ 并发能力达标 | 压测验证最大并发数 |
| ✅ 输出质量验证 | 用测试 Case 对比微调前后 |
| ✅ 异常处理 | 超时、长输入、特殊字符等边界情况 |
十二、总结与资源汇总
12.1 完整流程回顾
GPU 资源准备(nvidia-smi 确认环境) ↓环境搭建(PyTorch + CUDA + LLaMA Factory + DeepSpeed) ↓开源模型选择(推荐 Qwen3 系列) ↓数据准备(质量 >> 数量,推荐 Alpaca 格式) ↓微调方式选择(大多数场景选 LoRA) ↓超参数配置(Epochs / LR / Batch Size) ↓DeepSpeed ZeRO3 + LLaMA Factory 启动训练 ↓模型评测(OpenCompass + 主观评测) ↓LoRA 合并 → 量化 → vLLM 部署
12.2 常见问题 FAQ
Q:训练时显存 OOM 怎么办?
- • 减小
per_device_train_batch_size(如从 4 → 2) - • 减小
cutoff_len(如从 2048 → 1024) - • 启用
gradient_checkpointing(--gradient_checkpointing True) - • 在
ds_z3_config.json中开启"offload_optimizer": {"device": "cpu"}
Q:loss 曲线先下降后上升是怎么回事?
- • 这是过拟合信号。解决方案:减小 Epochs、增大 dropout、增加数据多样性。
Q:如何判断训练完成了?
- • loss 收敛(不再明显下降)
- • 在验证集上的指标不再提升
- • 主观评测(用业务 Case 测试模型回复质量)
Q:微调后模型"变笨了",能力反而下降?
- • 这是灾难性遗忘,常见于数据量小、领域过于集中。解决方案:在训练数据中混入 10–20% 的通用对话数据,保持模型的通用能力。
Q:多卡训练频繁 NCCL 超时?
- • 检查网络连接(多节点场景)
- • 增大
--ddp_timeout(如 180000000ms ≈ 50 小时) - • 设置环境变量
export NCCL_DEBUG=INFO查看详细通信日志
2026年AI行业最大的机会,毫无疑问就在应用层!
字节跳动已有7个团队全速布局Agent
大模型岗位暴增69%,年薪破百万!
腾讯、京东、百度开放招聘技术岗,80%与AI相关……
如今,超过60%的企业都在推进AI产品落地,而真正能交付项目的 大模型应用开发工程师 **,**却极度稀缺!
落地AI应用绝对不是写几个prompt,调几个API就能搞定的,企业真正需要的,是能搞定这三项核心能力的人:
✅RAG:融入外部信息,修正模型输出,给模型装靠谱大脑
✅Agent智能体:让AI自主干活,通过工具调用(Tools)环境交互,多步推理完成复杂任务。比如做智能客服等等……
✅微调:针对特定任务优化,让模型适配业务
目前,脉脉上有超过1000家企业发布大模型相关岗位,人工智能岗平均月薪7.8w!实习生日薪高达4000!远超其他行业收入水平!
技术的稀缺性,才是你「值钱」的关键!
具备AI能力的程序员,比传统开发高出不止一截!有的人早就转行AI方向,拿到百万年薪!👇🏻👇🏻

AI浪潮,正在重构程序员的核心竞争力!现在入场,仍是最佳时机!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

⭐️从大模型微调到AI Agent智能体搭建
剖析AI技术的应用场景,用实战经验落地AI技术。从GPT到最火的开源模型,让你从容面对AI技术革新!
大模型微调
-
掌握主流大模型(如DeepSeek、Qwen等)的微调技术,针对特定场景优化模型性能。
-
学习如何利用领域数据(如制造、医药、金融等)进行模型定制,提升任务准确性和效率。
RAG应用开发
- 深入理解检索增强生成(Retrieval-Augmented Generation, RAG)技术,构建高效的知识检索与生成系统。
- 应用于垂类场景(如法律文档分析、医疗诊断辅助、金融报告生成等),实现精准信息提取与内容生成。
AI Agent智能体搭建
- 学习如何设计和开发AI Agent,实现多任务协同、自主决策和复杂问题解决。
- 构建垂类场景下的智能助手(如制造业中的设备故障诊断Agent、金融领域的投资分析Agent等)。

如果你也有以下诉求:
快速链接产品/业务团队,参与前沿项目
构建技术壁垒,从竞争者中脱颖而出
避开35岁裁员危险期,顺利拿下高薪岗
迭代技术水平,延长未来20年的新职业发展!
……
那这节课你一定要来听!
因为,留给普通程序员的时间真的不多了!
立即扫码,即可免费预约
「AI技术原理 + 实战应用 + 职业发展」
「大模型应用开发实战公开课」
👇👇

👍🏻还有靠谱的内推机会+直聘权益!!
完课后赠送:大模型应用案例集、AI商业落地白皮书
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)