LLaMA-Factory 微调大模型在 ROCm 环境的配置实录
环境准备与后端切换
在 AMD GPU 上跑通大模型微调,最让人头疼的往往不是算法本身,而是环境配置的“坑”。很多从 NVIDIA 平台转过来的朋友,习惯性地直接 pip install 各种包,结果发现根本找不到 ROCm 的后端,或者训练时直接报错说找不到 CUDA 设备。其实,LLaMA-Factory 对 ROCm 的支持已经相当成熟,关键在于如何正确告诉它:“嘿,我现在用的是 A 卡,别去找 N 卡了。”
首先,确保你的基础环境是干净的。强烈建议使用 Conda 创建一个独立的虚拟环境,并安装明确标注支持 ROCm 版本的 PyTorch。不要混用任何带有 cu118 或 cu121 后缀的 wheel 包,这是导致后续一系列链接错误的根源。安装完成后,可以通过 python -c "import torch; print(torch.version.hip)" 来验证是否成功识别到 HIP 后端,如果输出版本号而非报错,说明地基打稳了。
接下来是 LLaMA-Factory 的配置核心。在项目根目录下的 examples/train_lora/ 文件夹中,找到对应模型的配置文件(例如 llama3_lora_sft.yaml)。你需要重点关注 compute_type 和 backend 这两个字段。在 NVIDIA 环境下,我们常用 fp16 或 bf16 配合 cuda 后端,但在 ROCm 环境中,必须将后端显式指定为支持 HIP 的版本。虽然较新版本的 LLaMA-Factory 能自动检测,但为了稳妥,建议在启动参数中强制指定,或者在配置文件中确认没有硬编码的 CUDA 依赖。
特别要注意 deepspeed 的配置。如果你打算使用 DeepSpeed 进行加速,必须确保安装的是适配 ROCm 的分支版本,并且在 JSON 配置文件中将 zero_optimization 相关的参数检查一遍。有些旧的配置模板里可能隐藏着针对 NVIDIA 架构的特定优化项,这些在 A 卡上不仅无效,还可能引发段错误。最稳妥的做法是直接复用社区已验证过的 ROCm 专用 DeepSpeed 配置模板,避免手动修改带来的不确定性。
混合精度训练与梯度爆炸应对
配置搞定后,真正开始训练时,另一个高频问题就是“梯度爆炸”。在混合精度训练(AMP)模式下,这种情况在 ROCm 平台上似乎比在 CUDA 上更容易出现。很多时候,Loss 曲线在前几个 step 还正常,突然就变成 NaN,然后整个训练进程崩溃。这通常是因为 ROCm 下的浮点运算细节与 CUDA 存在微小差异,导致在极端数值下溢出。
遇到这种情况,不要急着放弃混合精度。首先尝试调整 loss_scale 策略。在 LLaMA-Factory 的配置中,可以将动态损失缩放改为静态缩放,或者手动调小初始的 scale 值。比如,将默认的动态缩放改为固定值 1024 甚至 512,观察几个 epoch 的表现。如果问题依旧,最直接有效的方案是暂时切换到纯 fp32 模式进行调试。虽然这会牺牲一些训练速度并增加显存占用,但对于排查是否是精度问题导致的崩溃非常有效。一旦确认模型在 fp32 下能正常收敛,再逐步尝试回退到 bf16 或 fp16,并配合梯度裁剪(Gradient Clipping)来稳定训练过程。
我在实际测试 Qwen-7B 模型时就遇到过类似问题。起初使用默认的 bf16 设置,跑到第 15 个 step 直接 Loss 变 NaN。后来在启动命令中加入了 --ddp_find_unused_parameters false 并显式设置了 --fp32 跑通了前两个 epoch,确认数据加载和模型结构没问题后,再改回 bf16 并加大了 gradient clipping 的阈值到 1.0,最终顺利跑完了全程。这个“先稳后快”的策略在异构硬件适配中非常实用。
数据预处理与实战脚本
数据预处理环节相对通用,但在 ROCm 环境下,要特别注意 tokenizer 的加载路径和缓存目录权限。LLaMA-Factory 会自动处理数据集的映射,但如果你的数据集较大,建议预先处理好 .arrow 格式的文件,减少训练启动时的等待时间。在配置文件中,dataset 字段指向你的数据名,template 字段则要根据模型类型选择正确的对话模板,这一步错了会导致模型学不到正确的指令格式。
为了让大家能直接上手,这里提供一份经过验证的 LoRA 微调启动脚本。这份脚本针对单卡 AMD 环境做了优化,包含了上述提到的关键参数调整。你可以将其保存为 run_rocm.sh,根据实际情况修改模型路径和数据集名称即可运行。
#!/bin/bash
# 设置可见设备,确保只使用指定的 AMD GPU
export HIP_VISIBLE_DEVICES=0
# 启动 LLaMA-Factory CLI
llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /path/to/your/model \
--dataset your_custom_dataset \
--template default \
--finetuning_type lora \
--lora_target q_proj,v_proj \
--output_dir ./saves/llama3-lora-rocm \
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 100 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--plot_loss \
--fp16 \
--lora_rank 8 \
--lora_dropout 0.1 \
--preprocessing_num_workers 4 \
--ddp_timeout 180000000
在这个脚本中,--fp16 参数在较新的 ROCm 版本中通常对应 bf16 的行为,但如果你的显卡较老,可能需要显式改为 --bf16 或者直接去掉该参数使用 fp32。--ddp_timeout 的设置是为了防止在数据预处理或模型加载耗时较长时,分布式后端误判超时退出,这在单卡模拟多卡或网络波动时很有用。
运行脚本后,LLaMA-Factory 会启动一个本地的 WebUI 或者直接输出日志到终端。密切关注前几百个 step 的 Loss 变化,如果曲线平滑下降且没有 NaN 出现,恭喜你,第一个 Epoch 已经稳了。剩下的就是耐心等待模型收敛,期间可以随时通过 TensorBoard 查看更详细的指标监控。这套流程走下来,你会发现 AMD 显卡上的大模型微调并没有想象中那么神秘,只要踩准了配置节奏,一样能高效产出。
200小时GPU算力已就位,快来领取:https://marketing.csdn.net/questions/Q2604140858304426315?utm_source=AIpaper
更多推荐



所有评论(0)