数据清洗:从杂乱文本到标准 JSONL

在 DevCloud 上启动训练任务前,最耗时往往不是跑代码,而是把业务数据“翻译”成大模型能读懂的语言。LLaMA-Factory 对输入格式有严格要求,我们需要将手头的文档、问答对清洗为标准的 JSONL 格式。

这一步的核心是构建包含 instruction(指令)、input(可选输入)和 output(期望输出)三个字段的 JSON 对象。比如处理一个客服场景的数据,原始文本可能是杂乱的对话记录,清洗后的单行数据长这样:

{"instruction": "如何重置账户密码?", "input": "", "output": "您可以点击登录页面的‘忘记密码’链接,系统会向您的注册邮箱发送验证邮件,按提示操作即可重置。"}

如果是带有上下文的任务,input 字段就派上用场了。建议写个简单的 Python 脚本批量处理,确保每一行都是一个合法的 JSON 对象,且没有多余的逗号或换行符。数据质量直接决定微调效果,花半小时检查数据格式,能避免后续训练中出现莫名其妙的 Loss 不下降问题。整理好的文件通常命名为 alpaca_data.jsonl,放在项目目录的 data 文件夹下备用。

环境搭建:ROCm 生态下的源码编译

很多开发者习惯了 NVIDIA 的一键安装,转到 AMD Instinct GPU 平台时容易在环境配置上栽跟头。在 DevCloud 的 ROCm 7.x 环境下,直接用 pip 安装预编译包经常会遇到算子缺失或版本不匹配的问题,最稳妥的方式是源码编译

首先,确认当前用户权限。AMD 显卡驱动要求用户必须加入 videorender 用户组,否则无法调用 GPU。执行 rocm-smi 命令,如果能看到类似 MI250 或 MI300X 的卡片状态列表且显示 OK,说明底层驱动正常。

接下来是重头戏:安装适配 ROCm 的 PyTorch。不要直接使用默认的 torch 包,务必指定索引地址:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2

(注:具体版本号需根据 DevCloud 实际安装的 ROCm 版本调整,若为 7.x 请查阅社区最新 wheel 包)

验证安装是否成功很简单,运行 python -c "import torch; print(torch.cuda.is_available())",返回 True 即表示后端识别成功。

随后部署 LLaMA-Factory。为了获得最佳的 HIP 算子兼容性,推荐克隆源码后进行本地编辑安装。在此之前,系统需预先安装 ninjacmakehip-dev 等编译工具链。特别要注意 flash-attn 库,它在 AMD 平台上并非原生支持,可能需要应用社区补丁。如果遇到编译卡顿,可以限制并行数并指定 HIP 路径:

export HIP_PATH=/opt/rocm
export MAX_JOBS=4
pip install flash-attn --no-build-isolation
pip install -e ".[deepspeed]"

这一步虽然繁琐,但一旦编译通过,后续的训练稳定性会大幅提升,避免了运行时抛出“非法指令”错误的风险。

实战微调:DeepSpeed ZeRO-3 与显存优化

环境就绪后,我们进入核心的训练环节。在单卡或多卡的 Instinct GPU 上,显存往往是瓶颈。LLaMA-Factory 提供了 LoRA 和 QLoRA 两种方案。对于 7B 到 13B 的模型,LoRA 已经足够高效;若要挑战 70B 大模型,则必须启用 QLoRA(4-bit 量化),但这需要确保 bitsandbytes 的 ROCm 分支已正确安装。

修改配置文件是关键。打开 examples/train_lora/llama3_lora_sft.yaml,将 dataset 指向我们准备好的 JSONL 文件,template 设为 llama3。针对 AMD 架构,建议显式开启 bf16 混合精度训练,利用 Matrix Core 加速。

在多卡环境下,必须启用 DeepSpeed 的 ZeRO-3 策略来切分优化器状态。在启动命令中加上 --deepspeed 参数,并确保配置文件中开启了 zero_optimization.stage: 3。这是实现多卡线性加速、避免某张卡显存爆满而其他卡空闲的关键。

一切准备妥当,执行启动命令:

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml --deepspeed ds_config_zero3.json

训练过程中,别再用 nvidia-smi 了,在终端新开一个窗口运行 watch -n 1 rocm-smi,你可以实时看到每张卡的显存占用和温度变化。如果看到 Loss 曲线平稳下降,且显存利用率均衡,说明集群工作正常。对于 MI300X 这类新卡,若发现 Loss 震荡,可以尝试在配置中关闭部分激进的算子融合选项。

闭环验证:用 vLLM 加载专属权重

训练完成后,LLaMA-Factory 会自动保存适配器权重(adapter model)。现在的目标是将这些权重合并到基座模型中,并用 vLLM 进行推理验证,完成从训练到服务的闭环。

首先使用官方脚本合并权重:

llamafactory-cli export \
    --model_name_or_path path/to/base_model \
    --adapter_name_or_path path/to/saved_adapter \
    --export_dir path/to/merged_model \
    --template llama3 \
    --finetuning_type lora

合并后的模型就是一个标准的 Hugging Face 格式模型。接下来,利用 vLLM 在 AMD 平台上启动推理服务。vLLM 对 ROCm 的支持已经相当成熟,只需指定信任的远程代码库即可:

vllm serve path/to/merged_model \
    --tensor-parallel-size 2 \
    --trust-remote-code \
    --dtype bfloat16

这里 tensor-parallel-size 根据可用显卡数量调整。服务启动后,可以通过 curl 发送测试请求。当你看到模型能够流畅地回答之前训练数据中的专业问题时,整个流程就算真正跑通了。

从数据清洗的琐碎,到源码编译的折腾,再到看着 Loss 下降的欣慰,这套基于 AMD ROCm 生态的微调方案已经完全可行。它不仅打破了硬件垄断的焦虑,更让开发者能够以更具性价比的方式,构建真正懂业务的垂直领域模型。

200小时GPU算力已就位,快来领取:https://marketing.csdn.net/questions/Q2604140858304426315?utm_source=AIpaper
在这里插入图片描述

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐