作为一名长期从事AI模型开发的工程师,我一直在寻找高效的大语言模型(LLM)微调方案。最近发现LLaMA-Factory这个工具在社区讨论度很高,于是决定亲自尝试用它来完成Qwen3-4B模型的LoRA微调全流程。这个工具号称能大幅简化微调过程,下面我就把完整的实践过程记录下来,包括环境搭建、参数配置和实际调优中的经验教训。
我习惯为每个项目创建独立的Python环境,这能避免依赖冲突。对于LLM微调这种对版本敏感的任务更是必要:
bash复制conda create -n llamafactory python=3.12 -y
conda activate llamafactory
选择Python 3.12是因为它对新版PyTorch的支持最好,而PyTorch是LLaMA-Factory的核心依赖。这里有个细节:如果系统已有其他Python版本,建议先运行conda update -n base -c defaults conda更新conda本身。
官方推荐从源码安装以确保获取最新功能。在Ubuntu系统上需要先安装git:
bash复制apt update
apt install git -y
然后克隆仓库(添加--depth 1只克隆最新提交,节省时间和空间):
bash复制git clone --depth 1 https://github.com/hiyouga/LlamaFactory.git
cd LlamaFactory
pip install -e . # 可编辑模式安装,方便后续修改代码
安装评估指标相关依赖时,我换用了清华源加速下载:
bash复制pip install -r requirements/metrics.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
注意:如果遇到SSL证书错误,可以添加
--trusted-host pypi.tuna.tsinghua.edu.cn参数。在公司的内网环境中,可能需要先配置代理(需符合公司网络政策)。
LLaMA-Factory采用YAML文件管理训练配置。以examples/train_lora/qwen3_lora_sft.yaml为例,关键参数包括:
yaml复制model_name_or_path: Qwen/Qwen3-4B # 基础模型
dataset_dir: data # 训练数据目录
lora_rank: 8 # LoRA矩阵秩
lora_alpha: 32 # 缩放系数
per_device_train_batch_size: 2 # 根据GPU显存调整
gradient_accumulation_steps: 4 # 模拟更大batch size
learning_rate: 5e-5 # 初始学习率
我调整了以下参数以适应单卡训练:
per_device_train_batch_size从默认的4降到2(RTX 3090 24GB显存)gradient_accumulation_steps到4,保持总batch size=8fp16: true启用混合精度训练运行以下命令开始微调:
bash复制llamafactory-cli train examples/train_lora/qwen3_lora_sft.yaml
训练过程中有几个需要关注的指标:
nvidia-smi -l 1监控,理想情况应保持在90%以上实操技巧:用
tmux或screen创建持久会话,避免SSH断开导致训练中断。我习惯用tmux new -s qwen_train创建新会话。
在实际操作中我遇到了几个典型问题:
CUDA内存不足:
CUDA out of memoryper_device_train_batch_sizegradient_checkpointing: trueoptimizer: adamw_bnb_8bit使用8bit优化器Loss值为NaN:
max_grad_norm: 1.0训练速度慢:
yaml复制flash_attn: true # 需要安装flash-attn包
训练完成后,使用以下命令测试模型:
bash复制llamafactory-cli chat examples/inference/qwen3_lora_sft.yaml
在推理配置中需要指定适配器路径:
yaml复制adapter_name_or_path: saves/Qwen3-4B/lora/checkpoint-final
我准备了几个测试问题评估微调效果:
经验分享:好的测试应该包含"开集"和"闭集"问题。闭集问题来自训练数据(应准确回答),开集问题来自其他领域(应保持合理回答)。
在推理阶段可以应用这些优化:
use_cache: true加速自回归生成max_new_tokens: 512限制生成长度yaml复制quantization:
bits: 8 # 或4
double_quant: true
要将适配器永久集成到基础模型中,运行:
bash复制llamafactory-cli export examples/merge_lora/qwen3_lora_sft.yaml
合并配置示例:
yaml复制model_name_or_path: Qwen/Qwen3-4B
adapter_name_or_path: saves/Qwen3-4B/lora/checkpoint-final
export_dir: exports/Qwen3-4B-merged
合并后的模型可以直接用HuggingFace的from_pretrained加载,无需额外代码。
如果需要部署到其他平台,可以转换为ONNX格式:
yaml复制export_type: onnx
opset_version: 15
转换时要注意:
opset_version(不同推理引擎支持不同)yaml复制shard: true
max_shard_size: 2GB
经过多次实验,我总结出几个提升微调效果的关键点:
数据质量:
参数调优:
训练策略:
这套方法在多个业务场景中验证过,相比单纯使用LoRA能提升约15%的准确率。当然具体效果还取决于数据规模和质量,建议先在小规模数据上实验确定最佳参数组合。