LLaMA-Factory 微调流程在 ROCm 环境的落地
环境基石:从驱动验证到依赖构建
在 AMD GPU 上进行大模型微调,最大的挑战往往不在于算法本身,而在于构建一个稳定且兼容的底层软件栈。与推理场景不同,微调训练对编译器版本、数学库以及并行策略的敏感度更高。如果你直接使用通用的 PyTorch 包,很可能会在训练启动阶段遭遇算子缺失或显存分配错误。因此,第一步必须是确立“纯净”且“匹配”的开发环境。
对于 DevCloud 或本地 Ubuntu 22.04 环境,首要任务是确认 ROCm 7.x 驱动已正确加载。执行 rocm-smi 若能清晰列出显卡温度、功耗及显存状态,说明内核态驱动工作正常。紧接着,必须将当前用户加入 video 和 render 用户组(sudo usermod -aG video,render $USER),这是后续 HIP 运行时能够调用硬件的前提,遗漏此步会导致权限拒绝错误。
在依赖安装顺序上,DeepSpeed 和 bitsandbytes 是两个关键痛点。原生 bitsandbytes 主要针对 CUDA 优化,在 ROCm 下无法直接运行。你需要使用社区维护的 bitsandbytes-rocm 分支,或者在 LLaMA-Factory 的配置中明确指定使用支持 AMD 的后端版本。安装 DeepSpeed 时,建议从源码编译以启用 ZeRO-3 优化,编译前务必导出 DS_BUILD_OPS=1 并确保 hipcc 编译器可用。PyTorch 的安装必须严格对应 ROCm 版本,推荐使用官方提供的 wheel 索引,避免混用导致 ABI 不兼容。
# 示例:设置架构变量并安装关键依赖
export PYTORCH_ROCM_ARCH="gfx90a;gfx942" # 根据实际显卡型号调整
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.0
pip install git+https://github.com/huggingface/peft.git
pip install bitsandbytes-rocm # 注意使用 ROCm 专用版本
核心配置:LoRA 与全量微调的参数调优
LLaMA-Factory 的优势在于其统一的配置接口,但在 AMD 平台上,我们需要针对显存特性进行特殊调优。AMD Instinct 系列显卡(如 MI250/MI300)拥有高带宽 HBM,但在小算子聚合效率上与 NVIDIA 存在差异,因此显存优化策略在训练阶段尤为关键。
对于资源受限的场景,LoRA(Low-Rank Adaptation) 是首选方案。在配置文件 lora.yaml 中,除了常规的 lora_rank 和 target_modules,必须重点关注 flash_attention 的兼容性。虽然 ROCm 7.x 已逐步支持 Flash Attention 2,但在某些旧版内核上可能不稳定,若遇到报错,可暂时回退到标准 Attention 并开启 gradient_checkpointing(梯度检查点),这能以计算换显存,显著降低峰值占用。
若需进行全量微调,则必须启用 DeepSpeed 的 ZeRO-3 策略。在 ds_z3_config.json 中,将 offload_param 和 offload_optimizer 设置为 cpu 可以有效缓解显存压力,利用系统内存交换参数。同时,调整 micro_batch_size_per_gpu 至最小值(如 1),配合 gradient_accumulation_steps 来维持有效批次大小。值得注意的是,ROCm 环境下有时需要手动禁用某些自定义算子融合,通过在启动命令中添加 --disable_custom_all_reduce 可以避免多卡通信时的死锁问题。
# lora_finetune.yaml 关键片段
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
flash_attn: fa2 # 若报错可改为 false
deepspeed: ds_z3_config.json
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
lr_scheduler_type: cosine
logging_steps: 10
save_steps: 500
实战演练:从数据准备到模型导出
理论配置完成后,我们通过微调一个小型指令集模型来验证全流程。假设我们使用 Qwen-1.5-1.8B 作为基座,数据集为标准的 JSONL 格式指令数据。
首先是数据准备。LLaMA-Factory 支持多种格式,建议使用 alpaca 格式以便快速上手。将数据放置于 data 目录下,并在 dataset_info.json 中注册路径。在 AMD 环境下,数据加载进程有时会因多进程fork 机制产生异常,若遇到 DataLoader 卡顿,可尝试设置 num_workers: 0 强制单进程加载,虽牺牲少量速度但能提升稳定性。
启动训练命令如下:
llamafactory-cli train \
--model_name_or_path Qwen/Qwen1.5-1.8B \
--do_train \
--dataset alpaca_en_demo \
--template qwen \
--finetuning_type lora \
--output_dir saves/qwen1.5-1.8b/lora/sft \
--overwrite_cache \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--warmup_ratio 0.1 \
--save_steps 100 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--plot_loss \
--fp16 # ROCm 下通常使用 fp16 或 bf16,视显卡支持而定
训练过程中,密切观察终端输出的 Loss 曲线。AMD GPU 的利用率波动可能比 NVIDIA 更明显,只要 Loss 平稳下降即属正常。训练结束后,LLaMA-Factory 会自动保存 Adapter 权重。若需导出为合并后的完整模型以便部署,可使用 llamafactory-cli export 命令,指定 --template 和 --export_dir,系统将自动把 LoRA 权重融合进基座模型,生成标准的 Hugging Face 格式目录。
通过这一流程,我们不仅避开了常见的环境陷阱,还充分利用了 ROCm 生态的现有能力完成了完整的微调闭环。随着社区对 HIPify 工具和 SGLang 等后端支持的不断完善,AMD 平台在大模型训练侧的体验正日益接近主流水平,为开发者提供了更具性价比的选择。
200小时GPU算力已就位,快来领取:https://marketing.csdn.net/questions/Q2604140858304426315?utm_source=AIpaper
更多推荐


所有评论(0)