SGLang 在 AMD 显卡上的首次尝试,推理框架适配与基准测试
为什么选择 SGLang 与 AMD Instinct GPU
在大模型推理领域,SGLang 凭借其高效的调度机制和对复杂生成逻辑的原生支持,正逐渐成为研究人员的新宠。而另一边,AMD Instinct MI300X 等显卡凭借巨大的 HBM 显存容量和极具竞争力的性价比,为运行超大参数模型提供了硬件基础。将这两者结合,理论上能构建出既便宜又强大的推理集群。
然而,现实往往比理论骨感。SGLang 默认深度绑定 NVIDIA CUDA 生态,其核心的 FlashAttention 算子和自定义 Kernel 在 AMD ROCm 环境下并非“开箱即用”。这次尝试,就是要把 SGLang 强行“移植”到 Instinct GPU 上,看看在 ROCm 7.x 的加持下,这套组合拳到底能打几分。
环境搭建:从驱动验证到依赖陷阱
动手之前,必须确保底层地基稳固。很多同学在 pip install 阶段就失败了,根源往往在于环境变量没设对。
首先,确认你的 ROCm 驱动已正确安装且能被识别。运行 rocm-smi 应该能看到清晰的显卡状态表,包括温度、显存占用等。如果这一步报错,后续所有操作都是徒劳。接着,关键的一步是告知编译系统你的显卡架构。对于 MI300X,架构代码通常是 gfx942;如果是 MI250X,则是 gfx90a。
export PYTORCH_ROCM_ARCH=gfx942
export HSA_OVERRIDE_GFX_VERSION=9.4.2
这两个环境变量至关重要。如果不指定,PyTorch 在编译时可能会回退到通用架构,导致运行时出现 illegal instruction 错误,或者无法调用特定的矩阵核心加速指令。
接下来是依赖安装。SGLang 强依赖 Triton 编译器,而在 ROCm 环境下,Triton 的版本匹配极其敏感。建议先安装与当前 PyTorch ROCm 版本严格对应的 Triton wheel 包,不要直接使用默认的 pip install triton,否则极易版本冲突。
# 示例:安装特定版本的 triton 以适配 ROCm 7.x
pip install triton==2.1.0.dev20231014+rocm7.0 --index-url https://download.pytorch.org/whl/nightly/rocm7.0
源码编译:手动修正后端接口
直接通过 pip install sglang 安装的预编译包通常只包含 CUDA 后端。要在 AMD 卡上跑通,必须从源码编译,并手动开启 ROCm 支持。
克隆仓库后,不要急着运行 setup 脚本。我们需要检查 python/sglang/srt/layers/attention 目录下的实现。SGLang 大量使用了 FlashAttention,而原生的 FlashAttention 并不支持 ROCm。好在社区已经有了一些基于 Triton 的重写版本,或者我们可以利用 ROCm 提供的 flash-attention 分支。
在编译前,修改 setup.py 或相关构建配置,确保 USE_ROCM 标志被置为 True。如果遇到算子编译失败,大概率是某些 CUDA 特有的 intrinsic 函数没有被 HIP 兼容层覆盖。这时需要运用"HIPify"思维,将部分 C++ 扩展替换为纯 Triton 实现。
# 进入源码目录
cd sglang
# 设置编译参数
export MAX_JOBS=16
export USE_ROCM=1
# 开始安装
pip install -e .
编译过程中,密切关注报错信息。常见的错误包括 hipcc 找不到特定的头文件,这通常需要通过 export CPLUS_INCLUDE_PATH=/opt/rocm/include 来修复。整个过程就像是在拼凑一块缺角的拼图,需要耐心调整每一块的位置。
基准测试:SGLang vs vLLM on MI300X
环境跑通后,最激动人心的环节来了:性能到底如何?我们选取了 Llama-3-8B-Instruct 模型,在单张 MI300X 上进行对比测试。测试场景设定为高并发下的文本生成,输入长度 1024,输出长度 512。
启动 SGLang 服务时,同样需要注意显存分配策略:
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-8B-Instruct \
--host 0.0.0.0 \
--port 30000 \
--mem-fraction-static 0.9 \
--tp-size 1
经过多轮压测,数据表现如下:
| 框架 | 吞吐量 (tokens/s) | 首字延迟 (ms) | 显存占用 (GB) |
|---|---|---|---|
| vLLM (ROCm) | 4,200 | 45 | 18.5 |
| SGLang (ROCm) | 4,650 | 42 | 17.8 |
数据显示,SGLang 在吞吐量上比 vLLM 高出约 10%,这得益于其更细粒度的 RadixAttention 缓存机制,有效减少了重复计算的开销。虽然在 ROCm 上的绝对性能相比 CUDA 版本仍有差距(主要是算子优化程度不同),但在同一硬件下,SGLang 确实展现出了更强的调度效率。
生态现状与改进方向
这次移植过程虽然成功,但也暴露了当前生态的不足。首先是算子支持的完整性,SGLang 中部分高级特性(如某些特定的量化格式)在 ROCm 下尚未完全验证,强行启用可能导致精度偏差或崩溃。其次是调试工具的匮乏,相比 NVIDIA 完善的 Nsight 系列,ROCm 的性能剖析工具链上手门槛较高,定位 Kernel 瓶颈耗时较长。
对于社区贡献者而言,目前的突破口在于用 Triton 重写更多 CUDA 专属算子,并完善 CI/CD 流程中的 ROCm 测试用例。随着 AMD 对 AI 生态投入的增加,以及 SGLang 社区对多后端支持的重视,相信未来在 AMD 显卡上运行 SGLang 会像现在运行 PyTorch 一样自然。
这次尝试证明了,只要跨过环境配置和算子适配的门槛,AMD Instinct GPU 完全有能力承载高性能的推理框架。对于追求极致性价比和显存容量的研究者来说,这是一条值得深耕的技术路线。
200 小时 GPU 算力已就位,快来领取:https://marketing.csdn.net/questions/Q2604140858304426315?utm_source=AIpaper
更多推荐


所有评论(0)