使用 Prometheus 和 Grafana 监控 Rollout

作者: https://github.com/meituan-search

最后更新:11/12/2025.

在使用 verl 时,使用 Prometheus 和 Grafana 来监控 rollout 计算过程,以增强系统的可观测性,并便于进一步的性能优化。

我们提供额外的训练监控能力,借助 Prometheus 和 Grafana 来在训练期间展示 rollout 信息,并增强系统可观测性,以便于进一步的性能优化。

系统会自动配置 Prometheus 来从 rollout 服务器抓取指标,从而消除手动配置的步骤。

注意:SGLang 集成目前正在开发和调试中。某些功能可能无法按预期工作,且实现可能会发生变化。请在生产环境中谨慎使用。

概述

下图展示了 Qwen235B 在 AIME2024 数据集上的性能,响应长度为 20k,其中长尾问题的出现非常明显。

fully_async_policy_structure

下图展示了 Qwen235B 模型的完全异步训练。这里,资源闲置问题非常明显,表明 rollout 资源可以减少。

fully_async_policy_structure

通过以上两个示例,我们也展示了系统可观测性的必要性。

架构概述

整体工作流程包括以下步骤:

  1. 多节点 Ray 集群设置:在多个节点上启动 Ray 集群,并在主节点的环境变量中配置 Grafana 和 Prometheus 的信息

  2. 启动 Grafana 服务:在主节点上启动 Grafana,用于监控仪表盘的可视化

  3. 启动 Prometheus 服务:在主节点上启动 Prometheus,用于指标收集和存储

  4. verl 异步 Rollout 模式:verl 使用异步 rollout 模式来获取 rollout 服务器的端口和 IP 地址

  5. 自动 Prometheus 配置:verl 自动重写 Prometheus 配置,以添加对 rollout 服务器的监控,并通知 Prometheus 重新加载配置

  6. 指标收集:程序执行后,可以在 Prometheus 中查看指标

  7. 仪表盘可视化:在 Grafana 仪表盘中上传并查看监控指标

详细设置步骤

步骤 1:环境变量设置并启动 Ray 集群

首先,设置必要的环境变量并启动 Ray 服务。

# 主节点环境变量
export GF_SERVER_HTTP_PORT=3000                     # Grafana 服务默认端口(可自定义)
export PROMETHEUS_PORT=9090                         # Prometheus 服务默认端口(可自定义)
export RAY_HEAD_PORT=6379                           # Ray 主节点端口(可自定义)
export RAY_DASHBOARD_PORT=8265                      # Ray 仪表盘默认端口(可自定义)
export GRAFANA_PATHS_DATA=/tmp/grafana              # Grafana 数据存储目录(可自定义)
export RAY_GRAFANA_HOST="http://${master_ip}:${GF_SERVER_HTTP_PORT}"        # Ray 关联的 Grafana 地址
export RAY_PROMETHEUS_HOST="http://${master_ip}:${PROMETHEUS_PORT}"         # Ray 关联的 Prometheus 地址

# 在主节点启动 Ray
ray start --head --port=${RAY_HEAD_PORT} --dashboard-port=${RAY_DASHBOARD_PORT}

# 在工作节点启动 Ray
ray start --address={master_addr}:${RAY_HEAD_PORT}

验证: 访问 http://master_ip:8265 以确认 Ray 已成功启动。

步骤 2:启动 Grafana(可视化仪表盘)

Grafana 用于展示 Prometheus 收集的指标(例如缓存命中率、吞吐量等):

# 主节点
nohup grafana-server \
  --config /tmp/ray/session_latest/metrics/grafana/grafana.ini \
  --homepath /usr/share/grafana \
  web > grafana.log 2>&1 &

验证: 访问 http://master_ip:3000 以确认 Grafana 已成功启动(默认凭据:admin/admin)。

如果需要更改端口,请修改 GF_SERVER_HTTP_PORT 环境变量,grafana-server 会自动识别它。

步骤 3:启动 Prometheus(指标收集)

Prometheus 负责从 vLLM 服务抓取指标,并将其存储为时间序列数据:

# 主节点
nohup prometheus \
  --config.file /tmp/ray/session_latest/metrics/prometheus/prometheus.yml \
  --web.enable-lifecycle \
  --web.listen-address=:${PROMETHEUS_PORT} \
  > prometheus.log 2>&1 &

验证: 访问 http://master_ip:9090 以确认 Prometheus 服务已成功启动。

步骤 4 和 5:启动 verl 训练

使用以下参数配置来启动 verl 训练:

必需配置:

  • actor_rollout_ref.rollout.mode="async"

  • actor_rollout_ref.rollout.disable_log_stats=False

  • actor_rollout_ref.rollout.prometheus.enable=True

如果使用默认端口,此参数可以省略。

  • actor_rollout_ref.rollout.prometheus.port=9090

如果使用默认路径,此参数可以省略。

  • actor_rollout_ref.rollout.prometheus.file="/tmp/ray/session_latest/metrics/prometheus/prometheus.yml"

served_model_name 默认使用 model_path.split("/")[-1] 进行数据统计。用户也可以自定义其他别名:

  • actor_rollout_ref.rollout.prometheus.served_model_name="Qwen3-235B"

Shell 脚本示例:

WORKING_DIR=${WORKING_DIR:-"${PWD}"}
RUNTIME_ENV=${RUNTIME_ENV:-"${WORKING_DIR}/verl/trainer/runtime_env.yaml"}

rollout_mode="async"
rollout_name="vllm"  # 选项:sglang 或 vllm
if [ "$rollout_mode" = "async" ]; then
    export VLLM_USE_V1=1
    return_raw_chat="True"
fi

# 同步训练
ray job submit --no-wait --runtime-env="${RUNTIME_ENV}" \
    --working-dir "${WORKING_DIR}" \
    -- python3 -m verl.trainer.main_ppo \
    data.return_raw_chat=${return_raw_chat} \
    actor_rollout_ref.rollout.name=${rollout_name} \
    actor_rollout_ref.rollout.mode=${rollout_mode} \
    actor_rollout_ref.rollout.disable_log_stats=False \
    actor_rollout_ref.rollout.prometheus.enable=True
    ...
    
# 异步训练
ray job submit --no-wait --runtime-env="${RUNTIME_ENV}" \
    --working-dir "${WORKING_DIR}" \
    -- python3 recipe.fully_async_policy.fully_async_main \
    data.return_raw_chat=${return_raw_chat} \
    actor_rollout_ref.rollout.name=${rollout_name} \
    actor_rollout_ref.rollout.mode=${rollout_mode} \
    actor_rollout_ref.rollout.disable_log_stats=False \
    actor_rollout_ref.rollout.prometheus.enable=True
    ...

步骤 6:在 Prometheus 中查看指标

任务执行后,验证 Prometheus 是否正确收集指标。

验证: 访问 Prometheus 界面 http://master_ip:9090 并搜索 vllm:sglang: 以确认指标正在正确报告。

故障排除:

如果没有指标出现:

  1. 检查 AgentLoopManager 的日志以查找服务器端口

  2. 访问 http://master_ip:server_port/metrics 以验证服务器指标是否可用

  3. 确认已设置 actor_rollout_ref.rollout.disable_log_stats=False

步骤 7:在 Grafana 中查看指标

任务执行后,登录 Grafana 以查看和自定义监控仪表盘。

登录: 访问 http://master_ip:3000(默认凭据:admin/admin

导入仪表盘:

  1. 选择 “仪表盘” → “新建” → “导入” → “上传仪表盘 JSON 文件”

  2. 上传预构建的仪表盘 JSON 文件

可用仪表盘:

其他资源