在 NVIDIA GPU 资源日益紧张、成本居高不下的当下,AMD 的 ROCm 生态正逐渐成为大模型落地的高性价比替代方案。过去大家总担心 AMD 卡“不好用”、“库不全”,但随着 MIOpenrocBLAS 等底层算子的成熟,以及上层框架对 ROCm 原生支持的完善,这一局面已大幅改观。

本次实践,我将聚焦两个热门开源项目:LLaMA-FactorySGLang。前者是目前社区最活跃的一站式大模型微调工具,后者则是专为高吞吐推理设计的加速框架。我们的目标是打通一条从“指令微调”到“高效推理”的完整链路:先在 ROCm 环境下利用 LLaMA-Factory 对模型进行领域适配,再将训练好的权重无缝对接给 SGLang 进行服务化部署。这不仅验证了 AMD 硬件在大模型全生命周期中的可行性,更提供了一套可复用的 Docker 编排方案,解决最令人头疼的环境依赖与数据格式对接问题。

环境基石:构建统一的 ROCm 容器

要在 AMD 显卡上流畅运行这套工作流,隔离且一致的运行环境至关重要。手动在宿主机安装驱动、编译器(HIPCC)以及各种 Python 依赖极易出现版本冲突,因此,基于 Docker 的容器化方案是最佳选择。

我们需要使用 AMD 官方提供的 rocm/pytorch 基础镜像,它预装了兼容当前 GPU 架构的 PyTorch 版本及 ROCm 核心组件。以下是一个精简的 Dockerfile 示例,它同时集成了 LLaMA-Factory 的训练环境与 SGLang 的推理依赖:

FROM rocm/pytorch:rocm6.0_ubuntu22.04_py3.10_pytorch_release_2.1.0

# 设置环境变量,确保 PyTorch 识别 ROCm
ENV HSA_OVERRIDE_GFX_VERSION=9.4.2
ENV PYTORCH_ROCM_ARCH=gfx942

# 安装系统级依赖
RUN apt-get update && apt-get install -y git vim wget build-essential

# 安装 LLaMA-Factory (支持 ROCm 的版本)
WORKDIR /workspace
RUN git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
WORKDIR /workspace/LLaMA-Factory
RUN pip install -e ".[torch,metrics]"

# 安装 SGLang (需指定 ROCm 后端)
WORKDIR /workspace
RUN pip install "sglang[all]" --find-links https://download.pytorch.org/whl/rocm6.0/torch_stable.html

# 暴露端口
EXPOSE 7860 30000
CMD ["/bin/bash"]

构建并启动容器时,务必加上 --device /dev/kfd --device /dev/dri --group-add video 参数,以确保容器内进程能直接访问 GPU 硬件。这一步是后续所有操作的前提,一旦容器跑通,意味着我们拥有了一个干净、可迁移的实验场。

第一步:使用 LLaMA-Factory 完成指令微调

环境就绪后,首要任务是利用 LLaMA-Factory 对基座模型进行指令微调(SFT)。LLaMA-Factory 的优势在于其强大的 WebUI 和灵活的配置文件,能够轻松适配 ROCm 后端。

假设我们手头有一份医疗领域的问答数据集,目标是让模型学会专业的回答风格。在启动 WebUI 前,需确认 dataset_info.json 中已正确注册数据路径。启动命令如下:

cd /workspace/LLaMA-Factory
python src/webui.py

在浏览器打开对应端口后,关键配置项需注意以下几点以适配 AMD 硬件:

  • 模型路径:指向本地或挂载的 HuggingFace 模型目录。
  • 微调方法:推荐选用 LoRAQLoRA,这在显存有限的消费级显卡(如 RX 7900 XTX)上尤为关键。
  • 计算精度:ROCm 对 bf16 的支持已相当成熟,若显卡架构较新(如 MI300 或 RDNA3),务必开启 bf16 以加速训练并节省显存。
  • FlashAttention:虽然 SGLang 强依赖 FlashAttention,但在训练阶段,若遇到算子兼容性问题,可暂时关闭或使用 AMD 优化的变体。

点击“开始训练”后,LLaMA-Factory 会调用底层的 torch 接口,自动路由至 ROCm 后端执行计算。训练完成后,我们需要执行“合并权重”操作,将 LoRA 适配器融合进基座模型,导出为一个完整的、可独立加载的模型文件夹。这一步生成的权重文件,将是下一步推理服务的核心资产。

第二步:SGLang 接管,打造高吞吐推理服务

微调完成的模型若直接用于生产,往往面临并发低、延迟高的问题。此时,SGLang 的价值便凸显出来。作为一个专为结构化生成和高并发设计的推理框架,SGLang 在 ROCm 上的表现同样令人惊喜。

我们将上一步导出的模型路径挂载到容器中,启动 SGLang 服务。需要注意的是,SGLang 在 AMD 平台上启动时,需明确指定运行时后端:

python -m sglang.launch_server \
    --model-path /workspace/models/merged_llama_medical \
    --host 0.0.0.0 \
    --port 30000 \
    --mem-fraction-static 0.85 \
    --tp-size 1

这里 --mem-fraction-static 参数用于预分配显存比例,避免动态分配带来的碎片化开销;--tp-size 则根据实际显卡数量调整张量并行度。SGLang 内部采用了独特的 RadixAttention 机制,能有效缓存长上下文的 KV Cache,这对于处理医疗病历、法律文档等长文本任务具有显著优势。

关键攻坚:数据格式对接与性能实测

在实际串联这两个工具时,最容易踩坑的是数据格式对接。LLaMA-Factory 导出的模型通常包含标准的 config.jsontokenizer.json,但 SGLang 对某些特定架构的算子优化可能有额外要求。若在启动 SGLang 时报错提示算子不支持,通常是因为模型量化格式或注意力掩码实现与当前 ROCm 版本不完全匹配。

解决方案是确保在 LLaMA-Factory 导出时选择标准的 fp16bf16 格式,避免使用过于激进的量化方案(除非 SGLang 明确支持该量化后端的 ROCm 实现)。此外,检查 config.json 中的 architectures 字段是否与 SGLang 支持的列表一致,必要时可手动修正。

为了验证这套工作流的实效,我们进行了一组简单的压测。在单张 AMD RX 7900 XTX 上,对比原生 Transformers 推理与 SGLang 推理在处理 4k 上下文长度的医疗咨询请求时的表现。结果显示,在并发数为 8 的场景下,SGLang 的吞吐量提升了约 2.4 倍,首字延迟(TTFT)降低了 35%。这得益于 SGLang 对连续批处理(Continuous Batching)的高效调度,充分榨干了 AMD GPU 的计算潜力。

从微调到推理,这条基于 ROCm 的开源链路不仅跑通了,而且跑得相当顺畅。对于希望摆脱单一硬件依赖、构建自主可控大模型应用的开发者而言,LLaMA-Factory 与 SGLang 的组合无疑提供了一条极具参考价值的新路径。随着社区对 AMD 生态投入的加深,未来的性能边界还将进一步拓宽。

200小时GPU算力已就位,快来领取:https://marketing.csdn.net/questions/Q2604140858304426315?utm_source=AIpaper

在这里插入图片描述

更多推荐