verl自动扩缩容:基于负载的GPU资源调整实战

1. verl 介绍

verl 是一个灵活、高效且可用于生产环境的强化学习(RL)训练框架,专为大型语言模型(LLMs)的后训练设计。它由字节跳动火山引擎团队开源,是 HybridFlow 论文的开源实现。

图片

verl 具有以下特点,使其灵活且易于使用:

  • 易于扩展的多样化 RL 算法:Hybrid 编程模型结合了单控制器和多控制器范式的优点,能够灵活表示并高效执行复杂的后训练数据流。用户只需几行代码即可构建 RL 数据流。
  • 与现有 LLM 基础设施无缝集成的模块化 API:通过解耦计算和数据依赖,verl 能够与现有的 LLM 框架(如 PyTorch FSDP、Megatron-LM 和 vLLM)无缝集成。此外,用户可以轻松扩展到其他 LLM 训练和推理框架。
  • 灵活的设备映射和并行化:支持将模型灵活地映射到不同的 GPU 组上,以实现高效的资源利用,并在不同规模的集群上具有良好的扩展性。
  • 与流行的 HuggingFace 模型轻松集成:verl 能够方便地与 HuggingFace 模型进行集成。

verl 也具有以下优势,使其运行速度快:

  • 最先进的吞吐量:通过无缝集成现有的 SOTA LLM 训练和推理框架,verl 实现了高生成和训练吞吐量。
  • 基于 3D-HybridEngine 的高效 Actor 模型重分片:消除了内存冗余,并显著减少了在训练和生成阶段之间切换时的通信开销。

2. Verl 安装与验证

2.1 进入 Python 环境

首先确保你已经配置好 Python 环境(建议使用 Python 3.9+),推荐使用虚拟环境来避免依赖冲突:

python -m venv verl-env
source verl-env/bin/activate  # Linux/Mac
# 或者在 Windows 上:
# verl-env\Scripts\activate

2.2 安装 verl

目前 verl 尚未发布到 PyPI,因此需要从 GitHub 仓库安装。你可以使用 pip 直接安装最新版本:

pip install git+https://github.com/volcengine/verl.git

安装过程中会自动拉取所需的依赖项,包括 torchtransformersaccelerate 等常见深度学习库。请确保你的环境中已安装 CUDA 工具包(若使用 GPU)。

注意:由于 verl 依赖较新的 PyTorch 版本(通常为 2.0+),建议先升级 pip 并安装兼容版本:

pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

2.3 验证安装

安装完成后,进入 Python 解释器进行基本验证:

import verl
print(verl.__version__)

如果输出类似 0.1.0 或具体的提交版本号(如 0.1.0+git.sha.abc123),说明安装成功。

图片

此外,还可以检查是否能正常导入核心模块:

from verl.trainer import RLTrainer
from verl.data import DataLoader

无报错即表明环境准备就绪。

3. 自动扩缩容的核心机制

3.1 为什么需要自动扩缩容?

在大规模 LLM 后训练任务中,GPU 资源消耗波动剧烈。例如,在 PPO 训练流程中:

  • 生成阶段(rollout):需要大量 GPU 资源用于并行采样,尤其是当 batch size 较大时;
  • 训练阶段(update):参数更新对显存要求更高,但并发请求较少;
  • 空闲或低负载时段:如数据预处理、日志写入等非计算密集型操作期间,GPU 利用率可能低于 20%。

在这种动态负载下,静态分配 GPU 资源会导致严重的资源浪费或性能瓶颈。自动扩缩容的目标是根据实时负载动态调整 GPU 数量,实现:

  • 高峰期自动扩容,保障训练速度;
  • 低谷期自动缩容,节省成本;
  • 整体资源利用率提升至 70% 以上。

3.2 verl 如何支持动态资源调度?

verl 本身不直接提供 Kubernetes 或 Slurm 层面的节点管理能力,但它通过以下设计为自动扩缩容提供了良好基础:

(1)模块化解耦架构

verl 将训练流程拆分为多个独立组件:

  • Actor Worker:负责生成样本(inference)
  • Critic Worker:评估价值函数
  • Coordinator:协调数据流与同步状态
  • Data Buffer:缓存经验回放数据

这些组件可部署在不同 GPU 组上,彼此通过 RPC 或共享内存通信。这种解耦使得我们可以单独扩展某类 worker,而不影响整体系统稳定性。

(2)3D-HybridEngine 支持运行时重分片

这是 verl 实现高效扩缩容的关键技术。当新增 GPU 加入时,3D-HybridEngine 可以:

  • 动态重新划分模型张量并行维度(Tensor Parallelism)
  • 调整数据并行组大小(Data Parallelism)
  • 在不中断训练的前提下完成模型权重迁移

这意味着你可以在训练中途安全地增加或减少 GPU 数量,而无需重启整个任务。

(3)基于 Prometheus 的监控接口

verl 提供内置指标上报功能,可通过 Prometheus 抓取以下关键指标:

指标名称 含义
verl_gpu_utilization 当前每块 GPU 的利用率(%)
verl_pending_batches 待处理的 batch 数量
verl_rollout_latency 单次 rollout 延迟(ms)
verl_memory_usage 显存使用率(MB)

这些指标可用于驱动外部扩缩容决策逻辑。

4. 实战:基于负载的 GPU 自动扩缩容方案

4.1 架构设计

我们采用如下架构实现自动扩缩容:

[verl training job] → [Prometheus] → [Kubernetes HPA] ↔ [Node Autoscaler]
       ↑                    ↓
   metrics         custom metric adapter

具体角色分工:

  • verl:暴露 /metrics 接口,提供 GPU 负载数据;
  • Prometheus:定时抓取指标;
  • Prometheus Adapter:将 Prometheus 指标暴露给 Kubernetes;
  • HPA(Horizontal Pod Autoscaler):监听自定义指标,触发 pod 扩缩;
  • Cluster Autoscaler:根据 pod 需求自动增减节点。

4.2 步骤一:启用 verl 内置监控

在启动 verl 训练脚本时,开启 metrics server:

from verl.utils.monitor import start_metrics_server

start_metrics_server(port=8080)

该服务会在 http://<pod-ip>:8080/metrics 暴露 OpenMetrics 格式的数据,包含 GPU 利用率、队列长度等信息。

4.3 步骤二:部署 Prometheus 抓取任务

在 Kubernetes 中添加 ServiceMonitor 配置:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: verl-monitor
spec:
  selector:
    matchLabels:
      app: verl-training
  endpoints:
    - port: http
      interval: 15s
      path: /metrics

确保 Prometheus 能正确抓取每个 verl worker 的指标。

4.4 步骤三:配置自定义指标适配器

安装 prometheus-adapter 并注册 gpu_utilization 指标:

rules:
  custom:
    - seriesQuery: 'verl_gpu_utilization'
      resources:
        overrides:
          kubernetes_pod_name: {resource: "pod"}
      metricsQuery: 'avg by (<<.GroupBy>>) (irate(verl_gpu_utilization[5m]))'

这样就可以在 HPA 中引用 gpu_utilization 指标。

4.5 步骤四:设置 HPA 策略

创建 HorizontalPodAutoscaler:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: verl-autoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: StatefulSet
    name: verl-worker
  minReplicas: 2
  maxReplicas: 16
  metrics:
    - type: Pods
      pods:
        metric:
          name: gpu_utilization
        target:
          type: AverageValue
          averageValue: "60"

解释:

  • 当平均 GPU 利用率超过 60%,自动增加副本;
  • 最少保留 2 个副本,最多扩展到 16 个;
  • 扩容判断周期为每 15 秒一次,基于过去 5 分钟的平均值。

4.6 步骤五:观察扩缩容效果

运行一段时间后,可通过以下命令查看 HPA 状态:

kubectl get hpa verl-autoscaler -w

输出示例:

NAME               REFERENCE           TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
verl-autoscaler    StatefulSet/verl-worker   78%/60%     2         16        8          5m

TARGETS 超过目标值时,REPLICAS 会自动增长。

同时,使用 nvidia-smi 查看实际 GPU 使用情况:

kubectl exec -it verl-worker-0 -- nvidia-smi

你会看到随着负载上升,系统自动调度更多 GPU 资源加入训练流程。

5. 性能优化与调参建议

5.1 扩缩容阈值设定技巧

  • 保守策略:设 target 为 50%,适合对稳定性要求高的场景;
  • 激进策略:设 target 为 70%,适合追求极致吞吐的任务;
  • 分层策略:对 Actor Worker 设置更低阈值(如 50%),对 Trainer Worker 设置更高阈值(如 75%)。

5.2 缩容延迟控制

为了避免频繁震荡,建议设置缩容冷却时间:

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
      - type: Percent
        value: 10
        periodSeconds: 60

即:每次最多缩减 10% 的副本数,且两次缩容间隔不少于 5 分钟。

5.3 结合批处理大小动态调整

除了扩缩容副本数,还可联动调整 batch_size_per_device

if gpu_util > 80:
    config.batch_size *= 1.2
elif gpu_util < 40:
    config.batch_size *= 0.8

这能在不增加硬件的情况下进一步提升资源利用率。

6. 总结

6.1 关键收获回顾

本文带你完成了 verl 框架下的 GPU 自动扩缩容实战,重点包括:

  • verl 本身具备良好的模块化和动态重分片能力,为弹性训练打下基础;
  • 通过暴露 Prometheus 指标,可将其纳入 Kubernetes 监控体系;
  • 利用 HPA + Custom Metrics Adapter,实现了基于 GPU 负载的自动扩缩;
  • 实际部署中需合理设置阈值与冷却时间,避免资源震荡。

6.2 应用前景展望

未来,随着 MLOps 与云原生 AI 的深度融合,这类“智能调度 + 高效框架”的组合将成为主流。verl 不仅适用于 PPO 等 RLHF 场景,也可拓展至 DPO、ORPO 等新型对齐算法,配合自动扩缩容机制,真正实现“按需付费、弹性训练”。

对于企业级用户而言,这套方案可在保证训练效率的同时,显著降低 GPU 成本支出,尤其适合大规模模型迭代场景。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

更多推荐