📍 你在这里 训练进阶 · 第 4 篇 / 共 9 篇
← 上一篇 LLM 微调数据集格式:Alpaca 与 ShareGPT · 下一篇 → LLaMA Factory 微调框架
以下是Qwen3等大语言模型微调的详细总结,结合官方文档和实际案例,涵盖步骤、工具和设备要求:
一、微调步骤
(一)全参数微调(Full-Finetuning)
- 环境搭建
- 安装PyTorch及CUDA环境,确保显卡驱动兼容。
- 安装核心库:
transformers,datasets,accelerate,peft,deepspeed。 - 示例命令:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu122
pip install transformers datasets accelerate peft deepspeed
- 数据准备
- 格式要求:需为Alpaca或ShareGPT格式,包含
instruction、input、output字段。 - 预处理:使用
datasets库清洗数据,按8:2比例划分为训练集和验证集。 - 示例代码(医学数据转换):
- 格式要求:需为Alpaca或ShareGPT格式,包含
def dataset_jsonl_transfer(origin_path, new_path):
messages = []
with open(origin_path, "r") as file:
for line in file:
data = json.loads(line)
input_text = data["question"]
output_text = f"\n{data['answer']}"
messages.append({
"instruction": "你是医学专家,需给出带思考的回答",
"input": input_text,
"output": output_text
})
with open(new_path, "w") as file:
for msg in messages:
file.write(json.dumps(msg, ensure_ascii=False) + "\n")
- 模型加载
- 使用Hugging Face接口加载模型和tokenizer:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-1.7B",
trust_remote_code=True,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-1.7B", trust_remote_code=True)
- 训练配置
- 超参数设置:学习率
5e-6,批次大小4,训练轮数3,使用余弦退火学习率调度。 - 显存优化:启用混合精度(
bf16)和DeepSpeed ZeRO-3优化。 - 示例DeepSpeed配置文件(
ds_config.json):
- 超参数设置:学习率
{
"zero_optimization": {
"stage": 3,
"offload_optimizer": {"device": "cpu"}
},
"fp16": {"enabled": true}
}
- 启动训练
- 使用
Trainer类封装训练流程:
- 使用
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir="./output",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=5e-6,
lr_scheduler_type="cosine",
deepspeed="ds_config.json",
logging_steps=100
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset
)
trainer.train()
- 监控与评估
- 实时监控:使用SwanLab记录loss、准确率等指标,支持折线图和硬件状态查看。
- 示例代码:
import swanlab
swanlab.init(project="qwen3-sft-medical", experiment_name="v1")
for step, loss in enumerate(trainer.state.log_history):
swanlab.log({"loss": loss["loss"], "step": step})
(二)低秩自适应(LoRA)微调
- 轻量化配置
- 启用LoRA适配器,冻结基座模型参数:
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 显示可训练参数约1.2M
- 训练加速
- 使用Unsloth框架,显存占用减少70%,支持128K长上下文:
pip install unsloth
model, tokenizer = FastModel.from_pretrained("Qwen/Qwen3-14B", full_finetuning=False)
- 分布式训练
- 单卡脚本示例(
train_single_gpu.sh):
- 单卡脚本示例(
torchrun --nproc_per_node=1 src/train.py \
--deepspeed ds_z3_config.json \
--finetuning_type lora \
--per_device_train_batch_size 4 \
--learning_rate 5e-6 \
--num_train_epochs 3
二、核心工具
| 工具分类 | 推荐工具 | 功能说明 |
|---|---|---|
| 训练框架 | PyTorch + Hugging Face | 主流深度学习框架,支持高效分布式训练和模型加载 |
| 显存优化 | DeepSpeed + ZeRO | 模型参数分片存储,减少单卡显存压力 |
| 轻量化微调 | PEFT + LoRA | 仅微调低秩矩阵,显存占用降低90%以上 |
| 数据处理 | Datasets + Pandas | 支持JSONL/CSV格式转换和数据清洗 |
| 监控与评估 | SwanLab + Weights & Biases | 实时跟踪训练指标,支持多实验对比 |
| 模型转换 | Optimum-Intel + OpenVINO | 量化模型并转换为IR格式,适配CPU/NPU部署 |
| 零代码方案 | Llama-Factory | 提供WebUI,支持数据集上传、参数配置和模型导出 |
三、设备要求
(一)硬件配置
- 全参数微调
- 最小配置:单卡NVIDIA A100 40GB(适用于Qwen3-1.7B)。
- 推荐配置:8卡NVIDIA H100 80GB(适用于Qwen3-70B),搭配NVLink互联。
- 显存计算:Qwen3-70B在FP16下需约140GB显存,使用ZeRO-3可降至35GB/卡。
- LoRA微调
- 消费级显卡:NVIDIA 3060 Ti 8GB(适用于Qwen3-1.7B)。
- 云平台:Google Colab Pro+(T4 16GB)可免费微调Qwen3-14B。
(二)软件依赖
- CUDA版本:11.8及以上,需与PyTorch版本匹配。
- 驱动要求:NVIDIA驱动525.60.13或更高,支持SM 8.0及以上架构。
- 系统环境:Linux推荐Ubuntu 22.04,Windows需安装WSL2。
四、优化技巧
- 显存优化
- 混合精度训练(
bf16)可减少50%显存占用。 - 使用
--gradient_checkpointing启用检查点,节省20%显存。
- 混合精度训练(
- 数据增强
- 对短文本添加随机上下文,提升模型泛化能力。
- 示例代码:
def add_context(example):
context = ["历史对话:" + " ".join(example["history"])] if "history" in example else []
return {"input": " ".join(context) + example["input"]}
- 模型量化
- 4-bit量化(
bitsandbytes)可将Qwen3-8B推理显存降至12GB。 - 示例命令:
- 4-bit量化(
optimum-cli export openvino --model Qwen/Qwen3-8B --weight-format int4
五、典型场景
(一)医学领域微调
- 数据:使用
delicate_medical_r1_data数据集,包含医学问答对。 - 提示词设计:
PROMPT = "你是三甲医院主任医师,需基于临床指南回答问题,要求:\n1. 先给出推理过程;\n2. 最终答案用Markdown表格呈现。"
(二)代码生成优化
- 数据:收集GitHub代码片段,按
function_docstring + code格式组织。 - 训练策略:
- 增加
eos_token_id到损失计算。 - 示例代码:
- 增加
def compute_loss(model, inputs):
outputs = model(**inputs)
logits = outputs.logits
labels = inputs["input_ids"]
loss = model.compute_loss(inputs, outputs=outputs)
return loss
六、常见问题
- 显存不足
- 解决方案:降低批次大小,启用梯度累积(
--gradient_accumulation_steps 8)。
- 解决方案:降低批次大小,启用梯度累积(
- 过拟合
- 应对策略:增加正则化项(
--weight_decay 0.01),使用余弦学习率调度。
- 应对策略:增加正则化项(
- 训练中断
- 恢复训练:设置
--resume_from_checkpoint加载上次检查点。
- 恢复训练:设置
通过以上步骤和工具,开发者可高效完成Qwen3的微调任务,结合具体场景优化参数,实现专业领域的深度适配。
一起交流
分享你的思考,让讨论更进一步。