verl AMD (ROCm 内核) 性能调优

Last updated: 11/13/2025.

Author: Yang Wang, Songlin Jiang

为 AMD MI3xx 系列 GPU 使用 vLLM 休眠模式

默认情况下,verl 需要启用 vLLM 的休眠模式,这样 vLLM 可以在 rollout 完成后将 GPU 内存卸载到 CPU 内存中。(注:此功能已合并到 vLLM 主分支的 0.11.0 版本之后。)

目前,你可以使用 vLLM 主分支并从源码构建,或者当可用时,直接从预构建的 ROCm wheel 安装 vLLM 版本 0.11.0 之后。

  1. 克隆 vLLM 仓库并使用以下命令构建:

git clone https://github.com/vllm-project/vllm.git
cd vllm
git reset --hard 4ca5cd5740c0cd7788cdfa8b7ec6a27335607a48 # You can also use a later commit as you wish
python -m pip install -r requirements/rocm.txt
VLLM_TARGET_DEVICE=rocm ROCM_PATH=/opt/rocm/ python3 setup.py develop
  1. 此外,我们建议你使用 ROCm 版本 7.0 或更高版本。

升级后,你可以通过运行 这些脚本 来验证休眠模式是否正常工作。

如果休眠模式正常工作,你应该看到内存使用量在休眠后减少。

应用 vLLM 补丁并完成安装后,你可以在 verl 中启用休眠模式以减少内存开销。这样,verl 可以在 rollout 期间卸载未使用的 GPU 内存,从而显著降低长时间上下文训练或多节点强化学习中的内存占用。

启用 CUDA Graph 并绕过 ROCm 相关问题

由于 ROCm 中 CUDA graph capture(CUDA 图捕获)可能存在潜在问题,我们发现无法在 verl 中针对 AMD 平台使用 vLLM V1 模式的多节点 vLLM CUDA graph 功能启用。这会导致 rollout 性能显著下降。

我们的调查显示,ROCm 在尝试捕获大型批次时可能会触发意外崩溃。一个变通方法是将 actor_rollout_ref.rollout.cudagraph_capture_sizes 设置为类似 [1, 2, 4, 8, 16, 32, 64] 的值(根据你的 GPU 内存大小进行调整)。

然后,你可以选择通过在 verl 配置文件中将 actor_rollout_ref.rollout.enforce_eager 设置为 False 来启用 CUDA graph。