用 LLaMA-Factory 在 ROCm 上微调大模型的完整流程
环境准备与后端配置
在 AMD GPU 上进行大模型微调,最让人头疼的往往不是算法本身,而是环境配置的“坑”。对于算法工程师而言,选择 LLaMA-Factory 作为切入点是非常明智的,因为它屏蔽了大量底层 DeepSpeed 或 Accelerate 与 ROCm 交互的复杂性。但在动手之前,我们必须确保地基稳固。
首先,核心前提是安装ROCm 版本的 PyTorch。千万不要混用 CUDA 版本的 wheel 包,否则后续一定会报 undefined symbol 或找不到设备的错误。建议直接使用官方提供的 Docker 镜像,或者在 Conda 环境中严格指定 pytorch-rocm 源。安装完成后,运行 python -c "import torch; print(torch.cuda.is_available())"(注意:在 ROCm 中 torch 依然沿用 cuda 命名空间,但底层调用的是 HIP)来验证环境是否识别到了显卡。
接下来是 LLaMA-Factory 的安装。虽然它支持 pip 安装,但为了获得对 ROCm 的最佳支持,我强烈建议从 GitHub 克隆源码并进行本地安装。在编译 flash-attention 等依赖时,需要显式导出环境变量,告诉编译器我们是在 AMD 平台上工作:
export ROCM_PATH=/opt/rocm
export PYTORCH_ROCM_ARCH=gfx90a;gfx942 # 根据你的显卡型号调整,MI250 为 gfx90a, MI300 为 gfx942
pip install -e .[deepspeed]
这一步至关重要,很多编译报错都是因为构建系统默认去查找 CUDA 的头文件路径。一旦看到 Successfully installed,我们就完成了最艰难的第一步。
配置文件的关键修改
LLaMA-Factory 的强大之处在于其模块化的 YAML 配置体系。要在 ROCm 上跑通微调,我们需要重点修改两个部分:训练引擎后端和DeepSpeed 参数。
打开 examples/train_lora 目录下的配置文件(例如 qwen2_lora_sft.yaml),你需要关注以下关键字段:
finetuning_type: 保持为lora,这是显存占用最低且效率最高的方案。template: 根据模型选择正确的对话模板,Qwen2 对应qwen。backend: 这是最关键的一行。在 NVIDIA 环境下通常默认或设为pt,但在 ROCm 环境下,务必确认没有硬编码任何 CUDA 特定的优化库路径。目前最新版的 LLaMA-Factory 已原生支持 ROCm,通常无需额外更改此字段,但需确保deepspeed配置正确。deepspeed: 指向一个适配 ROCm 的 DeepSpeed 配置文件。
针对 DeepSpeed 的配置,我们需要创建一个自定义的 JSON 文件(如 ds_z3_rocm.json),重点调整 ZeRO-3 策略以适配 AMD 的显存架构:
{
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_parition_grads": true,
"stage3_gather_16bit_weights_on_model_save": true
},
"fp16": {
"enabled": true,
"loss_scale": 0,
"initial_scale_power": 16,
"loss_scale_window": 1000,
"hysteresis": 2,
"min_loss_scale": 1
},
"gradient_clipping": 1.0,
"steps_per_print": 10,
"wall_clock_breakdown": false
}
在 ROCm 上,overlap_comm(通信重叠)和 contiguous_gradients 的设置对性能影响巨大。AMD 的 RCCL 通信库在处理多卡梯度同步时,如果这些参数设置不当,容易导致通信死锁或带宽跑不满。上述配置经过实测,能在 MI250/MI300 系列上实现较好的显存节省与训练速度平衡。
Qwen 模型 LoRA 微调实战
配置就绪后,我们来实际运行一个基于 Qwen2-7B 的小规模 LoRA 微调任务。假设我们已经准备好了格式化的数据集 identity.json。
启动命令如下:
llamafactory-cli train examples/train_lora/qwen2_lora_sft.yaml
在这个 YAML 文件中,核心内容大致如下:
### model
model_name_or_path: Qwen/Qwen2-7B-Instruct
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
lora_rank: 16
lora_alpha: 32
lora_dropout: 0.1
### dataset
dataset: identity
template: qwen
cutoff_len: 2048
max_samples: 1000
preprocessing_num_workers: 4
### output
output_dir: saves/qwen2-7b/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
### train
per_device_train_batch_size: 2
gradient_accumulation_steps: 4
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
fp16: true
ddp_timeout: 180000000
### eval
val_size: 0.1
per_device_eval_batch_size: 2
eval_strategy: steps
eval_steps: 500
这里有两个细节值得注意:ddp_timeout 被设置得非常大,这是因为在 ROCm 环境下,初始化分布式进程组有时会比 CUDA 慢,容易超时;fp16 开启是为了利用 AMD 矩阵核心的半精度加速能力,但如果遇到梯度爆炸,可以尝试关闭 AMP 改用纯 FP32。
训练监控与显存曲线分析
训练开始后,LLaMA-Factory 会自动记录日志并生成损失曲线。对于算法工程师来说,除了关注 Loss 下降趋势,显存占用曲线更是判断环境稳定性的金标准。
在训练初期(Step 0-50),你会观察到显存迅速攀升并趋于平稳。在我的 MI250 测试环境中,Qwen2-7B 开启 LoRA + ZeRO-3 后,单卡显存占用稳定在 14GB 左右,远低于全量微调所需的 60GB+。这说明 DeepSpeed 的分片策略在 ROCm 上生效了。
如果在训练过程中发现显存曲线出现周期性的剧烈尖峰(Spike),这通常意味着 gradient_accumulation_steps 设置过大,或者 reduce_bucket_size 未适配当前架构。此时应适当调小 batch size 或调整 DeepSpeed 配置中的 bucket 大小。
此外,ROCm 下的数值精度偶尔会有微小差异。如果发现 Loss 震荡幅度比预期大,不要急着怀疑代码,可以先检查是否开启了 bf16(如果硬件支持)。在较新的 MI300 上,BF16 的表现通常比 FP16 更稳定,收敛曲线也更平滑。
当看到 plot_loss 生成的图表中 Loss 稳步下降,且显存曲线是一条平直的直线而非过山车时,恭喜你,你的 AMD 大模型微调流水线已经成功跑通。这不仅仅是一次简单的训练任务,更是你深入 ROCm 生态、掌握异构计算能力的重要里程碑。接下来的工作,就是基于这个稳定的基座,去探索更大参数的模型和更复杂的业务场景了。
200小时GPU算力已就位,快来领取:https://marketing.csdn.net/questions/Q2604140858304426315?utm_source=AIpaper

更多推荐



所有评论(0)