通过百舸平台快速部署 RLinf v0.3版本环境并开始训练
概述
Rlinf是一个面向 Embodied AI(具身智能) 和 Agentic AI(智能体 AI) 的开源强化学习基础框架。
通过百舸快速开始,您可以使用通过开发机调试部署 Rlinf v0.3最新版本,启动不同模型的训练任务,并通过 TensorBoard、Ray Dashboard、训练日志和 GPU 指标监控训练进展,本文将以 OpenVLA 与 π0.5 模型为例。
适用场景
- 使用 RLinf 框架训练不同仿真环境下的机器人任务策略模型。
- 使用不同基座模型继续进行 GRPO 强化学习训练。
- 上复现
libero_90_grpo_openvlaoft或迁移到libero_130_grpo_openvlaoft。 - 在单机开发机上排查调试 仿真环境、模型、robosuite、transformers、Ray 和 TensorBoard 相关训练问题。
- 对 rollout 阶段耗时、cgroup OOM、Ray worker 异常或 rollout 后 soft hang 进行定位。
- 在 /root/workspace/目录下已经为您准备了可以按顺序执行的 notebook,您可以参考运行。
训练规格参考 & 环境配置
推荐训练配置如下:
| 项目 | 推荐配置 |
|---|---|
| GPU | 单机 8 卡,单卡约 96-97GiB显存 |
| CPU | 建议 80 核以上 |
| 容器内存 | 建议 900GiB 以上;90/130 原始配置更稳妥给到 1TiB+ |
| 存储空间 | 如果您需要下载资源测试,建议不少于 600G |
项目目录配置如下表所示:
| 项目 | 推荐配置 |
|---|---|
| CUDA / 驱动 | 建议使用满足平台镜像要求的默认驱动环境 |
| 工作目录 | /root/workspace/RLinf |
| Python 环境 | /root/workspace/RLinf/.venv |
| OpenVLA-OFT | /root/workspace/openvla-oft |
| 训练入口 | /root/workspace/RLinf/examples/embodiment/train_embodied_agent.py |
| 模型目录 | /root/workspace/models |
| 日志目录 | /root/workspace/logs |
预期效果参考
统一模型在 LIBERO 多个任务组和 90/130 综合任务集上的评测结果(以 OpenVLA 为例):
| 模型 | Object | Spatial | Goal | Long | 90 | 130 |
|---|---|---|---|---|---|---|
| huggingface OpenVLA-OFT (LoRA-base) | 50.20% | 51.61% | 49.40% | 11.90% | 42.67% | 42.09% |
| huggingface OpenVLA-OFT (RLinf-GRPO) | 99.60% | 98.69% | 98.09% | 93.45% | 98.02% | 97.85% |
| 效果提升 | +49.40% | +47.08% | +48.69% | +81.55% | +55.35% | +55.76% |
准备工作
如果您所在网络环境访问 HuggingFace 较慢,建议提前配置 HuggingFace 镜像源,或配置代理加速。
huggingface 镜像配置:
1export HF_ENDPOINT=https://hf-mirror.com
2export HF_HUB_ENABLE_HF_TRANSFER=1
百舸平台已提供数据集和模型权重的 BOS 地址,您也可以直接从 BOS 下载到训练任务的工作目录,避免依赖外部网络。
环境说明
说明:本文中的路径均以百舸训练任务内的
/root/workspace为例。实际使用时,可根据任务挂载目录调整。
当前实跑使用以下目录:
1/root/workspace/RLinf
2/root/workspace/RLinf/.venv
3/root/workspace/openvla-oft
4/root/workspace/models
5/root/workspace/logs
步骤一:准备模型权重
训练需要准备 RLinf OpenVLA-OFT LIBERO Base-Lora 权重,90 任务和 130 任务分别使用对应模型目录。
方式一:通过 HuggingFace 下载模型权重
1export HF_ENDPOINT=https://hf-mirror.com
2export HF_HUB_ENABLE_HF_TRANSFER=1
3mkdir -p /root/workspace/models
4
5huggingface-cli download RLinf/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora \
6 --repo-type model \
7 --revision v3.0 \
8 --local-dir /root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora
9huggingface-cli download RLinf/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora \
10 --repo-type model \
11 --revision v3.0 \
12 --local-dir /root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora
方式二:通过 BOS 下载
已知 BOS 模型路径(目录路径必须带结尾 /):
1bos:/aihc-models-bj/RLinf/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora/
2bos:/aihc-models-bj/RLinf/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora/
建议下载到:
1/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora
2/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora
从 BOS 下载,建议放入 tmux 并持续检查结果:
1mkdir -p /root/workspace/models /root/workspace/logs
2SESSION=bos_download_models
3LOG=/root/workspace/logs/bos_download_models.log
4
5cat > /tmp/download_rlinf_models.sh <<'EOF'
6#!/usr/bin/env bash
7set -euo pipefail
8{
9 date
10 echo "download 90 start"
11 bcecmd bos cp -r \
12 bos:/aihc-models-bj/RLinf/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora/ \
13 /root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora/
14 echo "download 130 start"
15 bcecmd bos cp -r \
16 bos:/aihc-models-bj/RLinf/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora/ \
17 /root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora/
18 echo "download done"
19 date
20} 2>&1 | tee -a /root/workspace/logs/bos_download_models.log
21EOF
22chmod +x /tmp/download_rlinf_models.sh
23
24tmux new-session -d -s "$SESSION" /tmp/download_rlinf_models.sh
查看下载进度:
1tmux ls 2>/dev/null | grep bos_download_models || true
2tail -100 /root/workspace/logs/bos_download_models.log
3du -sh /root/workspace/models/* 2>/dev/null || true
4find /root/workspace/models -maxdepth 3 -type f | wc -l
如果 bcecmd 报 Object don't exist,先执行以下命令确认真实目录和结尾 /:
1bcecmd bos ls bos:/aihc-models-bj/RLinf/
验证模型目录:
1for MODEL in \
2 /root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora \
3 /root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora
4do
5 echo "===== $MODEL ====="
6 ls "$MODEL"
7 find "$MODEL" -maxdepth 2 -type f | head -50
8done
步骤二:确认训练配置
以 libero_90_grpo_openvlaoft 为例,核心配置如下:
1cluster:
2 num_nodes: 1
3 component_placement:
4 actor,env,rollout: all
5
6algorithm:
7 group_size: 8
8 adv_type: grpo
9 loss_type: actor
10 reward_type: action_level
11 logprob_type: token_level
12 entropy_type: token_level
13 loss_agg_func: token-mean
14 kl_beta: 0.0
15 clip_ratio_high: 0.28
16 clip_ratio_low: 0.2
17 reward_coef: 5.0
18
19env:
20 train:
21 rollout_epoch: 64
22 total_num_envs: 64
23 group_size: 8
24 eval:
25 total_num_envs: 500
26
27actor:
28 global_batch_size: 16384
29 micro_batch_size: 32
30
31rollout:
32 pipeline_stage_num: 1
原始 YAML 中模型路径通常仍是占位符:
1/path/to/model/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora/
实际启动时请通过 Hydra CLI override 注入真实模型路径:
1rollout.model.model_path=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora
2actor.model.model_path=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora
如果使用官方 run_embodiment.sh,需要确认脚本是否支持透传额外 Hydra override。当前实跑环境中该脚本不透传额外参数,因此使用直接 Python 入口启动。
推荐参数分档
在 8 卡 显存 96 GB 显卡和 1.5TB 容器内存环境中,原始 rollout_epoch=64 + actor.global_batch_size=16384 可以完成 rollout,但可能在 rollout 后长时间无主日志、无 TensorBoard scalar,表现为疑似 soft hang。建议按以下档位逐步启动:
| 档位 | 参数 | 用途 |
|---|---|---|
| 稳定首跑 | env.train.rollout_epoch=16 actor.global_batch_size=8192 |
90/130 任务推荐首跑配置 |
| 130 降 KL 稳定档 | env.train.rollout_epoch=16 actor.global_batch_size=8192 actor.optim.lr=1.0e-5 |
130 任务如 step=0 approx_kl 明显偏高,优先降学习率后重跑 |
| 提升吞吐 | env.train.rollout_epoch=32 actor.global_batch_size=8192 actor.optim.lr=1.0e-5 |
130 降 KL 后连续多个 step 稳定,再扩大采样量 |
| 原始复现 | env.train.rollout_epoch=64 actor.global_batch_size=16384 |
仅在稳定首跑确认无 soft hang 且 KL 稳定后使用 |
90/130 稳定首跑推荐 override:
1env.train.rollout_epoch=16 \
2env.train.total_num_envs=64 \
3algorithm.group_size=8 \
4actor.micro_batch_size=32 \
5actor.global_batch_size=8192
130 降 KL 稳定档推荐 override:
1env.train.rollout_epoch=16 \
2env.train.total_num_envs=64 \
3algorithm.group_size=8 \
4actor.micro_batch_size=32 \
5actor.global_batch_size=8192 \
6actor.optim.lr=1.0e-5
实测 130 默认学习率 2.0e-5 时,step=0 train/actor/approx_kl≈0.884 偏高;加入 actor.optim.lr=1.0e-5 后可稳定推进到 Global Step 17/1000,TensorBoard 连续写入 17 个 step,step=16 train/actor/approx_kl≈0.0103,KL 明显回落。130 任务建议默认采用降 KL 稳定档。
步骤三:启动训练
建议使用 tmux 启动训练,避免 SSH 断开导致任务中止。
以下命令使用稳定首跑配置启动。先按任务选择变量:90 任务使用 libero_90_grpo_openvlaoft,130 任务使用 libero_130_grpo_openvlaoft。若需要原始复现,可将 env.train.rollout_epoch=16 改为 64、actor.global_batch_size=8192 改为 16384,但应优先确认稳定首跑无 soft hang。
1cd /root/workspace/RLinf
2
3# 90 任务
4SESSION=libero90_train
5CONFIG=libero_90_grpo_openvlaoft
6MODEL=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-90-Base-Lora
7START_SCRIPT=/tmp/start_libero90_train.sh
8
9# 130 任务改用以下变量
10# SESSION=libero130_train
11# CONFIG=libero_130_grpo_openvlaoft
12# MODEL=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora
13# START_SCRIPT=/tmp/start_libero130_train.sh
14
15LOG_DIR=/root/workspace/logs/$(date +%Y%m%d-%H:%M:%S)-${CONFIG}_rollout16_gbs8192
16LOG_FILE=${LOG_DIR}/run_embodiment.log
17mkdir -p "$LOG_DIR"
18
19cat > "$START_SCRIPT" <<EOF
20#!/usr/bin/env bash
21set -e
22cd /root/workspace/RLinf
23export PATH=/root/workspace/RLinf/.venv/bin:\$PATH
24export EMBODIED_PATH=/root/workspace/RLinf/examples/embodiment
25export REPO_PATH=/root/workspace/RLinf
26export SRC_FILE=/root/workspace/RLinf/examples/embodiment/train_embodied_agent.py
27export MUJOCO_GL=egl
28export PYOPENGL_PLATFORM=egl
29export ROBOTWIN_PATH=/path/to/RoboTwin
30export PYTHONPATH=/root/workspace/RLinf:/root/workspace/openvla-oft:/path/to/RoboTwin:\$PYTHONPATH
31export OMNIGIBSON_NO_OMNI_LOGS=1
32export OMNIGIBSON_DEBUG=0
33export ROBOT_PLATFORM=LIBERO
34export RAY_memory_usage_threshold=0.98
35export TOKENIZERS_PARALLELISM=false
36CMD="python /root/workspace/RLinf/examples/embodiment/train_embodied_agent.py --config-path /root/workspace/RLinf/examples/embodiment/config/ --config-name ${CONFIG} runner.logger.log_path=${LOG_DIR} rollout.model.model_path=${MODEL} actor.model.model_path=${MODEL} env.train.rollout_epoch=16 env.train.total_num_envs=64 algorithm.group_size=8 actor.micro_batch_size=32 actor.global_batch_size=8192"
37echo "\$CMD" > ${LOG_FILE}
38echo "LOG_DIR=${LOG_DIR}" >> ${LOG_FILE}
39echo "MODEL=${MODEL}" >> ${LOG_FILE}
40\$CMD 2>&1 | tee -a ${LOG_FILE}
41EOF
42
43chmod +x "$START_SCRIPT"
44
45if tmux has-session -t "$SESSION" 2>/dev/null; then
46 tmux kill-session -t "$SESSION"
47fi
48
49tmux new-session -d -s "$SESSION" "$START_SCRIPT"
50printf "session=%s\nlog=%s\n" "$SESSION" "$LOG_FILE"
稳定首跑已验证:rollout_epoch=16、actor.global_batch_size=8192 可以越过原始 run 的 rollout 后 soft hang 点,并写出 TensorBoard scalar。90/130 任务默认先使用该档;如需扩大采样量,再升到 rollout_epoch=32 或原始复现档。
从 90 任务切换到 130 任务
如果需要停止当前 90 任务并重新运行 130 任务,优先通过 tmux 停止,不使用 pkill -f train_embodied_agent.py:
1if tmux has-session -t libero90_train 2>/dev/null; then
2 tmux kill-session -t libero90_train
3fi
4sleep 8
5
6ps -eo pid,stat,pcpu,pmem,rss,args --sort=-pcpu | \
7 grep -E 'train_embodied_agent.py|ray::EmbodiedFSDPActor.run_training|ray::MultiStepRolloutWorker|ray::CollectiveManager' | grep -v grep || true
确认 130 模型目录存在且非空:
1MODEL=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora
2if [ ! -d "$MODEL" ] || [ -z "$(find "$MODEL" -maxdepth 2 -type f 2>/dev/null | head -1)" ]; then
3 echo "ERROR: 130 model missing or empty: $MODEL" >&2
4 exit 2
5fi
130 降 KL 稳定档启动命令已验证:
1python /root/workspace/RLinf/examples/embodiment/train_embodied_agent.py \
2 --config-path /root/workspace/RLinf/examples/embodiment/config/ \
3 --config-name libero_130_grpo_openvlaoft \
4 runner.logger.log_path=${LOG_DIR} \
5 rollout.model.model_path=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora \
6 actor.model.model_path=/root/workspace/models/RLinf-OpenVLAOFT-LIBERO-130-Base-Lora \
7 env.train.rollout_epoch=16 \
8 env.train.total_num_envs=64 \
9 algorithm.group_size=8 \
10 actor.micro_batch_size=32 \
11 actor.global_batch_size=8192 \
12 actor.optim.lr=1.0e-5
启动后验证点:
tmux ls中存在libero130_train。- 日志中
--config-name libero_130_grpo_openvlaoft。 - Hydra 配置中
task_suite_name: libero_130。 - Ray 启动并识别 1 node / 8 accelerators。
- 无
Traceback、RayOutOfMemory、worker died。
训练启动后建议立即打开 TensorBoard 和 Ray Dashboard:
1ssh -p <port> -L 6006:127.0.0.1:6006 -L 18265:127.0.0.1:8265 root@<host>
重点查看:
- TensorBoard:
env/success_once、env/reward、rollout/rewards、train/actor/*、time/actor/* - Ray Dashboard:actor/rollout worker 状态、CPU/GPU 使用、异常 worker
- 主日志:rollout 进度、
global_step、异常栈和 OOM 信息
步骤四:监控训练
查看主日志:
1tail -f /root/workspace/logs/<run-dir>/run_embodiment.log
提取关键进展:
1grep -nE 'Generating Rollout Epochs|global_step|success_once|reward=|actor/|Traceback|Exception|RayOutOfMemory|worker died' \
2 /root/workspace/logs/<run-dir>/run_embodiment.log | tail -100
查看 GPU:
1watch -n 2 'nvidia-smi --query-gpu=index,utilization.gpu,memory.used,memory.total --format=csv,noheader,nounits'
查看 cgroup 内存和 OOM:
1watch -n 2 'cat /sys/fs/cgroup/memory.current; cat /sys/fs/cgroup/memory.max; cat /sys/fs/cgroup/memory.events'
查看 Ray worker:
1ps -eo pid,stat,pcpu,pmem,rss,args --sort=-pcpu | \
2 grep -E 'train_embodied_agent.py|ray::EmbodiedFSDPActor.run_training|ray::MultiStepRolloutWorker|ray::CollectiveManager' | head -30
步骤五:启动 TensorBoard 和 Ray Dashboard(可选)
启动 TensorBoard:
1cd /root/workspace/RLinf
2export PATH=/root/workspace/RLinf/.venv/bin:$PATH
3tmux new-session -d -s tensorboard_rlinf \
4 'cd /root/workspace/RLinf && tensorboard --logdir /root/workspace/logs --port 6006 --host 127.0.0.1'
本地访问:
1ssh -p 5259 -L 6006:127.0.0.1:6006 root@xxx.xxx.xxx.xxx
浏览器打开:
1http://127.0.0.1:6006
Ray Dashboard 远端默认监听:
1127.0.0.1:8265
本地访问:
1ssh -p 5259 -L 18265:127.0.0.1:8265 root@xxx.xxx.xxx.xxx
浏览器打开:
1http://127.0.0.1:18265
远端验证 Ray Dashboard:
1curl -s http://127.0.0.1:8265/api/version
步骤六:解析 TensorBoard 指标
使用脚本读取 TensorBoard scalar:
1cd /root/workspace/RLinf
2export PATH=/root/workspace/RLinf/.venv/bin:$PATH
3export TF_CPP_MIN_LOG_LEVEL=3
4
5python - <<'PY'
6from pathlib import Path
7from tensorboard.backend.event_processing.event_accumulator import EventAccumulator
8run = Path('/root/workspace/logs/<run-dir>')
9for event in sorted((run / 'tensorboard').glob('events.out.tfevents.*')):
10 print(f'EVENT {event.name} size={event.stat().st_size}')
11 ea = EventAccumulator(str(event), size_guidance={'scalars': 0})
12 ea.Reload()
13 for tag in sorted(ea.Tags().get('scalars', [])):
14 vals = ea.Scalars(tag)
15 if vals:
16 v = vals[-1]
17 print(f'{tag}\tcount={len(vals)}\tstep={v.step}\tvalue={v.value}')
18PY
重点关注:
env/success_onceenv/rewardenv/returnrollout/rewardstrain/actor/policy_losstrain/actor/approx_kltrain/actor/grad_normtime/actor/run_trainingtime/actor/actor/recv_trajtime/actor/actor/sync_model_to_rollout
90 稳定首跑已观测关键指标:
| 指标 | 值 |
|---|---|
env/success_once |
0.7763671875 |
env/reward |
0.0315093882 |
env/return |
3.8818359375 |
env/num_trajectories |
1024 |
rollout/rewards |
0.0106468508 |
time/actor/run_training |
886.1267 |
time/actor/actor/recv_traj |
862.7485 |
time/actor/actor/sync_model_to_rollout |
23.0961 |
train/actor/approx_kl |
0.0723108 |
train/actor/grad_norm |
0.335577 |
train/actor/lr |
2.0e-05 |
train/actor/policy_loss |
0.00241828 |
130 降 KL 稳定档已观测关键指标(actor.optim.lr=1.0e-5):
| 指标 | 值 |
|---|---|
global_step |
17/1000 |
env/success_once |
0.158203125 |
env/reward |
0.0062359129 |
env/return |
0.791015625 |
env/num_trajectories |
1024 |
rollout/rewards |
0.0043383949 |
time/actor/run_training |
885.4130 |
time/generate_rollouts |
854.4069 |
time/step |
1755.9901 |
train/actor/approx_kl |
0.0102794 |
train/actor/grad_norm |
0.4322200 |
train/actor/policy_loss |
5.23655e-05 |
train/actor/total_loss |
1.63642e-06 |
性能参考:
| 指标 | 当前已观测参考 |
|---|---|
| rollout 64 epoch | 约 56 分钟,约 52.7 秒/epoch |
| rollout 16 epoch | 约 13-15 分钟 |
| rollout 32 epoch | 预计约 28-30 分钟 |
| 稳定首跑 actor run_training | 约 886 秒 |
| 稳定首跑 actor sync_model_to_rollout | 约 23 秒 |
| 稳定首跑 actor recv_traj | 约 863 秒 |
常见问题处理
| 问题 | 解决方案 |
|---|---|
模型路径仍是 /path/to/model/... |
启动命令必须追加 rollout.model.model_path=$MODEL actor.model.model_path=$MODEL |
| Ray worker 被 memory killer 杀 | 检查 /sys/fs/cgroup/memory.max 和 /sys/fs/cgroup/memory.events,优先调大容器内存到 900GiB+ |
| rollout 后主日志停在 100% | 先看 TensorBoard、GPU、worker CPU、actor worker 日志;不要只凭主日志判断停止 |
| rollout 后疑似 soft hang | 表现为 rollout 100% 后长时间无主日志、TensorBoard event 仅几十字节且无 scalar,但 GPU/worker 仍活跃;先抓栈保留现场,再用稳定首跑配置 env.train.rollout_epoch=16 actor.global_batch_size=8192 重启验证 |
评价此篇文章
