如何用 vLLM server 模式加速 TRL GRPO 训练:服务器与训练器 GPU 分配配置
2026/9/14 22:10:24 网站建设 项目流程

如何用 vLLM server 模式加速 TRL GRPO 训练:服务器与训练器 GPU 分配配置

【免费下载链接】trlTrain transformer language models with reinforcement learning.项目地址: https://gitcode.com/GitHub_Trending/tr/trl

GRPO 这类在线方法在训练过程中要不断生成补全(completions),用模型自身的generate完成这一步往往是训练时间的瓶颈。TRL 支持用 vLLM 接管生成来加速训练,其中server 模式让 vLLM 作为独立进程运行在专用 GPU 上,通过 HTTP 与训练器通信——适合你有空闲 GPU 专门用于推理的场景。这篇文章给出在单节点 8 卡机器上把 4 张卡分给 vLLM 服务器、4 张卡分给训练器的完整配置路径。

前提:版本要求与安装

  • TRL 目前只支持vLLM0.19.10.28.0的版本区间,安装前确认版本落在该范围内,否则会出现兼容性问题。
  • GRPOTrainer在支持 vLLM 生成的训练器列表中(其他还有RLOOTrainerNashMDTrainerOnlineDPOTrainerXPOTrainer)。

安装命令(带 vLLM 依赖):

pip install "trl[vllm]"

文档中另有一个已弃用的入口:trl vllm-serve现在只会构建这条命令并运行 vLLM 服务器,并打印它实际执行的vllm serve命令,可以直接复制后弃用这个包装器,因此下文不再使用它。

第一步:按 CUDA_VISIBLE_DEVICES 划分服务器与训练器的 GPU

这是 server 模式最关键的一条约束:

vLLM 服务器和训练器必须运行在不同的 CUDA 设备上,否则会互相冲突;docs/source/grpo_trainer.md中的警告更具体——如果服务器和训练器用了同一批 GPU,可能会遇到 NCCL 错误。

文档给出的参考资源是单节点 8 张 GPU:GPU 0–3 给 vLLM 生成,GPU 4–7 给训练。划分完全靠CUDA_VISIBLE_DEVICES环境变量指定。

第二步:启动 vLLM 服务器

在 GPU 0–3 上启动服务器(文档示例模型为Qwen/Qwen2.5-7B,请替换为你要训练的模型名):

CUDA_VISIBLE_DEVICES=0,1,2,3 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen2.5-7B --tensor-parallel-size 4 \ --weight-transfer-config '{"backend": "nccl"}' \ --logprobs-mode processed_logprobs \ --max-logprobs -1

其中--tensor-parallel-size 4表示把一份模型张量并行切到这 4 张 GPU 上;如果你分配给服务器的 GPU 数量不同,这个值要与分配数一致。

后三个参数是 TRL 对服务器端的硬性要求,缺一个都不行(来源:vLLM Integration):

设置作用
VLLM_SERVER_DEV_MODE=1暴露权重传输与 prefix-cache 端点,用于把训练中的权重推进服务器。它同时会暴露 vLLM 的其他开发端点,因此服务器应保持在可信网络内
--weight-transfer-config '{"backend": "nccl"}'启用 NCCL 权重传输引擎。若训练器和服务器共享 GPU,改用"ipc"
--logprobs-mode processed_logprobs返回经过温度缩放和 logit 处理后的 logprobs,这是重要性采样修正所期望的形式
--max-logprobs -1解除 OpenAI 兼容接口每个 token 20 个 logprobs 的上限,蒸馏时请求 top-k 教师分布需要它

其余的vllm serve参数(--data-parallel-size--max-model-len--enable-prefix-caching--enforce-eager--kv-cache-dtype--trust-remote-code等)都可以按需追加,vllm serve --help有完整列表。

关于扩展:文档建议用--tensor-parallel-size扩展生成规模;数据并行对稠密模型不再有帮助——自 vLLM0.14.0起,非 MoE 模型的离线数据并行扩展已不被支持。

第三步:在训练脚本中启用 server 模式

文档给出的最小train.py示例(docs/source/vllm_integration.md):

from datasets import load_dataset from trl import GRPOTrainer, GRPOConfig from trl.rewards import accuracy_reward dataset = load_dataset("trl-lib/DeepMath-103K", split="train") trainer = GRPOTrainer( model="Qwen/Qwen2.5-7B", args=GRPOConfig(use_vllm=True, vllm_mode="server"), reward_funcs=accuracy_reward, train_dataset=dataset, ) trainer.train()

两个关键参数:

  • use_vllm=True:启用 vLLM 生成。vllm_mode缺省为"colocate"(vLLM 跑在训练器进程内、与训练模型共享显存),所以要显式设置vllm_mode="server"才走服务器模式。
  • model的名字要与服务器端vllm serve启动的模型保持一致。

训练默认连接http://localhost:8000,即vllm_server_host默认"0.0.0.0"vllm_server_port默认8000(见 trl/trainer/grpo_config.py);如果服务器监听地址或端口不同,通过vllm_server_base_urlvllm_server_hostvllm_server_port覆盖,其中提供vllm_server_base_url时后两者被忽略。默认等待服务器就绪的总超时是vllm_server_timeout(默认 240 秒),超时后抛出ConnectionError

另外,GRPO 默认使用MASTER_ADDR=localhostMASTER_PORT=12345作为 vLLM 的通信地址,可以通过设置同名环境变量覆盖。

第四步:在与服务器错开的 GPU 上启动训练

CUDA_VISIBLE_DEVICES=4,5,6,7 accelerate launch train.py

服务器启动后即可用这个命令拉起训练。训练开始后,训练器通过 OpenAI 兼容的/v1/completions端点(发送 prompt token IDs)向服务器要补全;每完成一次 optimizer step,训练器还会通过 NCCL 把更新后的权重流式推进服务器,并用/start_weight_update/update_weights/finish_weight_update三个端点完成提交。权重更新通信使用vllm_group_port(默认 51216),文档说明除非端口被占用,无需修改。

验证:怎么判断配置成功、哪里出了问题

  • 服务器没起好:训练端在vllm_server_timeout(默认 240 秒)内等不到服务器时会抛ConnectionError。先回到服务器终端确认vllm serve是否真正完成加载,而不是只看训练端的报错。
  • GPU 划分冲突docs/source/grpo_trainer.md明确警告服务器与训练器使用同一批 GPU 时可能触发NCCL 错误。出现 NCCL 类报错时,优先核对两边的CUDA_VISIBLE_DEVICES是否真的不重叠。
  • 运行中观察训练-推理失配:当use_vllm=Truevllm_importance_sampling_correction=True(缺省即开启 Truncated Importance Sampling)时,TRL 会记录sampling/sampling_logp_difference/meansampling/sampling_logp_difference/maxsampling/importance_sampling_ratio/{min,mean,max}等指标。sampling_logp_difference增长表示采样器(vLLM)与训练模型重算的 logprob 之间的失配在扩大——这是文档给出的解读,训练期间持续观察这些曲线即可判断 vLLM 生成为训练带来的偏移是否在可控范围内。

默认情况下 TRL 已对 vLLM 生成启用 Truncated Importance Sampling 来修正生成-训练失配,如需关闭可设vllm_importance_sampling_correction=False

可选:显存不够时的两个旋钮

这两项来自 GRPO Trainer,只在遇到显存问题时使用:

  1. 调 GPU 显存利用率:根据模型大小和训练的整体显存需求,可能需要调整 vLLM 的显存利用率以避免低利用率或 OOM。注意GRPOConfig里的vllm_gpu_memory_utilization参数只适用于colocate模式;server 模式下对应的设置要单独传给 vLLM 服务器端。文档还提供了一个官方的推荐值估算工具(HF Spacetrl-lib/recommend-vllm-memory,按模型配置和实验设置给出建议值),并建议:若推荐值在你的环境不工作,可在推荐值上加一个小缓冲(如 +0.05 或 +0.1)。
  2. 仍报 OOM 时开启 sleep mode:把vllm_enable_sleep_mode设为True,optimizer step 期间 vLLM 的权重与 cache 会被卸载(offload),换取更低的显存占用;代价是唤醒引擎时会有 host-device 传输延迟,可能略微拖慢训练。详见 Reducing Memory Usage。

跨机器时的连接配置

上面的主路径假设服务器与训练器在同一台机器(默认连localhost:8000)。docs/source/grpo_trainer.md还给出了多节点 70B 训练的例子:4 个节点跑 GRPO(DeepSpeed ZeRO-3 + Accelerate),第 5 个节点整节点跑 vLLM 服务器(--tensor-parallel-size 8),训练脚本通过--vllm_server_host参数接收服务器节点地址,并在GRPOConfig中设置vllm_server_host=args.vllm_server_host完成跨机连接;同机部署则不需要这个参数。该文档中的 SLURM 脚本会同时拉起训练和服务器两条任务,若参考它请整体理解其分配逻辑,不要只截取其中一条命令。

参考文档

  • vLLM Integration:server/colocate 两种模式、服务器必选参数、传输端点说明
  • Speeding Up Training:CUDA_VISIBLE_DEVICES划分的 GRPO 示例
  • GRPO Trainer:server 模式启动步骤、NCCL 冲突警告、多节点示例与指标
  • Reducing Memory Usage:vLLM sleep mode 细节
  • trl/trainer/grpo_config.py:vllm_server_*参数的默认值与适用条件

【免费下载链接】trlTrain transformer language models with reinforcement learning.项目地址: https://gitcode.com/GitHub_Trending/tr/trl

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询