Skip to content

在 AIStudio 开发机中准备和验证 RLinf VLA 运行环境

注意

本文中的平台预置镜像地址是示例。使用前,请在镜像中心或当前实例的预置镜像列表中确认当前可用区提供了对应仓库及 tag;如果列表中不存在,请改用页面显示的可用镜像地址。替换 Registry 域名并不能保证相同仓库或 tag 在其他环境或可用区中存在。

RLinf 的 VLA 场景同时使用模型计算、ManiSkill 仿真和相机渲染。正式运行训练配置前,先在 AIStudio 开发机中确认 GPU、Vulkan/EGL、共享内存、Python 环境和共享存储能够一起工作,可以更快定位镜像或运行时问题。

本文介绍两种开发机方式:在 Ubuntu 开发机中启动 RLinf Docker 容器,或者直接使用 RLinf 镜像创建开发机。完成检查后,再进入对应的场景教程运行完整的模型加载、rollout 和训练更新。

实战目标

完成本文后,您可以:

  • 根据调试需求选择开发机内 Docker 或直接使用 RLinf 镜像;
  • 确认共享存储不是容器临时目录,并且可以保存代码、模型、资产和运行结果;
  • 检查 NVIDIA 驱动、GPU 数量、/dev/shm、Vulkan/EGL 和目标 Python 环境;
  • 确认 RLinf 代码、模型和 ManiSkill 资产已经具备进入具体场景教程的基本条件。

本文的环境检查不会执行 PPO 更新,也不能代替具体场景教程中的完整训练验证。

场景信息

项目本场景使用的基线
RLinfcommit c5ca51cc21c007a41d287159f9e1b14e0200000e
平台预置镜像cr.infini-ai.com/infini-ai/rlinf:agentic-rlinf0.1-maniskill_libero
Python 环境OpenVLA 使用 /opt/venv/openvla;OpenVLA-OFT 使用 /opt/venv/openvla-oft
开发机内 DockerOpenVLA 双 A100 和 OpenVLA-OFT 单 A100 的缩减 PPO 运行均已通过
直接使用 RLinf 镜像OpenVLA-OFT 单 A100 的缩减 PPO 运行已通过
共享存储示例路径/mnt/rlinf-training;实际路径以开发机挂载配置和 findmnt 输出为准
本文运行范围开发机运行时和固定输入检查;不执行完整训练配置

镜像标签中的 rlinf0.1 是镜像版本标识,不对应 RLinf Git commit。使用其他 RLinf commit、镜像标签或 GPU 型号时,请重新完成本文检查和对应场景的训练验证。

本场景在 AIStudio 中怎样运行

AIStudio 为开发机提供 GPU、驱动、共享内存和共享存储。选择开发机内 Docker 时,Ubuntu 主容器负责交互和 Docker 服务,RLinf 内部容器提供 Python、CUDA 和仿真依赖;直接使用 RLinf 镜像时,这些依赖就在开发机主容器中。

language-text
开发机内 Docker
AIStudio 开发机 / Ubuntu
├── GPU、驱动和共享存储
└── RLinf Docker 容器
    └── VLA Python、Ray、ManiSkill 和 SAPIEN

直接使用 RLinf 镜像
AIStudio 开发机 / RLinf
├── GPU、驱动和共享存储
└── VLA Python、Ray、ManiSkill 和 SAPIEN

两种方式最终都从共享存储读取代码、模型和资产。具体场景教程可以复用同一份固定输入,不需要在 GPU 任务中重新下载。

选择开发机运行方式

运行方式适用情况需要注意
开发机内 Docker希望保留通用 Ubuntu 开发机,并在其中切换或重建 RLinf 容器需要显式传入 GPU、/dev/shm、网络和共享存储
直接使用 RLinf 镜像希望减少容器层级,直接检查 RLinf 镜像和平台运行时GPU、/dev/shm 和挂载由开发机配置决定;当前适用范围是 OpenVLA-OFT 单卡路径

如果目标是按照固定配置完成 ManiSkill PPO OpenVLA 快速验证,完成本文的开发机检查后,再进入对应的 AIStudio 场景教程。具体场景教程负责给出模型、资产、脚本、任务配置和完成信号。

开始前准备

创建开发机前,准备以下内容:

  • 根据目标训练配置选择 GPU 数量和内存。已验证的 OpenVLA 快速上手配置使用 2 张 A100,OpenVLA-OFT 快速上手配置使用 1 张 A100;
  • 准备目标可用区中的共享存储卷,用于保存 RLinf checkout、模型、ManiSkill 资产和运行结果;
  • 如果使用开发机内 Docker,选择支持 Docker 容器功能的 Ubuntu 24.04 开发机;
  • 按具体场景教程准备固定版本的代码、模型和资产;本文从固定输入检查开始。

本文使用平台预置镜像 cr.infini-ai.com/infini-ai/rlinf:agentic-rlinf0.1-maniskill_libero,无需自行下载、导入或准备租户镜像。

VLA 相机观测依赖 Vulkan/EGL,模型计算依赖 CUDA。GPU 能被 PyTorch 识别,并不代表 ManiSkill 的图形链路也已经可用,后续步骤会分别检查两部分。

准备和验证开发机环境

Step 1 按所选方式创建开发机

根据资源来源创建弹性资源开发机包年包月资源开发机,然后按所选方式配置:

使用开发机内 Docker

  • 镜像:选择页面提供的 Ubuntu 24.04 镜像;
  • Docker 容器:打开;
  • GPU 规格:与目标训练配置一致;
  • 共享高性能存储:挂载到 /mnt/rlinf-training,或记录实际挂载路径。

直接使用 RLinf 镜像

  • 镜像:选择平台预置镜像 cr.infini-ai.com/infini-ai/rlinf:agentic-rlinf0.1-maniskill_libero
  • Docker 容器:关闭;
  • GPU 规格:与目标训练配置一致;
  • 共享高性能存储:选择已经包含固定输入的存储卷,并记录容器内挂载路径。

下面的规格截图是 OpenVLA 双 A100 开发机示例,不是所有 VLA 场景的固定要求:

OpenVLA 双 GPU 环境检查使用的开发机示例规格,包含两张 NVIDIA A100-80G

Step 2 启动或进入 RLinf 运行环境

直接使用 RLinf 镜像时,登录开发机后即可进入下一步。使用开发机内 Docker 时,先在 Ubuntu 开发机终端中检查 Docker 服务并启动具名容器:

language-shell
set -euo pipefail

export WORK_ROOT=/mnt/rlinf-training
export RLINF_CONTAINER=rlinf-vla
export RLINF_IMAGE="cr.infini-ai.com/infini-ai/rlinf:agentic-rlinf0.1-maniskill_libero"
export RLINF_SHM_SIZE=100g

dockerctl status
test -w "$WORK_ROOT"
docker pull "$RLINF_IMAGE"

docker run -d \
  --name "$RLINF_CONTAINER" \
  --gpus all \
  --shm-size "$RLINF_SHM_SIZE" \
  --network host \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  -e NVIDIA_DRIVER_CAPABILITIES=all \
  -e WORK_ROOT="$WORK_ROOT" \
  -v "$WORK_ROOT:$WORK_ROOT" \
  --entrypoint /bin/bash \
  "$RLINF_IMAGE" \
  -lc 'exec sleep infinity'

docker inspect "$RLINF_CONTAINER" \
  --format 'Status={{.State.Status}} Image={{.Config.Image}} ShmBytes={{.HostConfig.ShmSize}} Network={{.HostConfig.NetworkMode}}'
docker exec -it "$RLINF_CONTAINER" /bin/bash

Status 应为 runningImage 应为选择的完整 tag,Network 应为 host。OpenVLA-OFT 的已验证单卡配置使用 64 GiB 容器共享内存;其他训练配置按自身要求设置 RLINF_SHM_SIZE

如果同名容器已经存在,先用 docker inspect rlinf-vla 核对镜像、挂载和共享内存。需要重建时,确认代码、模型和输出都位于共享存储,再停止并删除旧容器;容器可写层中的文件不会保留。

Step 3 确认共享存储挂载可写

在当前 RLinf 运行环境中,将 WORK_ROOT 设置为实际挂载路径并检查:

language-shell
set -euo pipefail

export WORK_ROOT=/mnt/rlinf-training

findmnt -T "$WORK_ROOT"
df -hT "$WORK_ROOT"
test -w "$WORK_ROOT"

WRITE_PROBE="$(mktemp "$WORK_ROOT/.rlinf-write-probe.XXXXXX")"
rm -f "$WRITE_PROBE"

findmnt 应显示创建开发机时选择的存储卷,挂载选项应包含 rw。目录存在或 mkdir 成功不能证明共享存储已经挂载;如果目标仍指向容器根文件系统的 overlay,先修正挂载。

直接使用 RLinf 镜像时,平台可能将用户目录存储挂载到 /mnt/user_dir/<用户目录>。可以继续使用该路径,也可以在创建开发机时将系统挂载路径统一为 /mnt/rlinf-training;后续命令必须与实际挂载路径一致。

Step 4 选择目标 VLA Python 环境

使用绝对路径调用虚拟环境中的 Python,不依赖交互式 Shell 是否执行激活脚本:

language-shell
set -euo pipefail

export VLA_ENV=openvla
export VLA_PYTHON="/opt/venv/$VLA_ENV/bin/python"

test -x "$VLA_PYTHON"
"$VLA_PYTHON" -c \
  'import torch; print(f"PYTORCH={torch.__version__} CUDA_AVAILABLE={torch.cuda.is_available()}")'
"/opt/venv/$VLA_ENV/bin/ray" --version

运行 OpenVLA-OFT 时,将 VLA_ENV 改为 openvla-oft。后续具体教程也应直接调用对应虚拟环境中的 Python,避免不同 Shell 会话落入另一个环境。

Step 5 检查 GPU、驱动和共享内存

在 RLinf 容器或直接镜像开发机中运行:

language-shell
set -euo pipefail

printf 'NVIDIA_DRIVER_VERSION='
nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits \
  | sort -u \
  | paste -sd, -
nvidia-smi -L
df -h /dev/shm

"$VLA_PYTHON" -c \
  'import torch; assert torch.cuda.is_available(); print(f"GPU_COUNT={torch.cuda.device_count()}", [torch.cuda.get_device_name(i) for i in range(torch.cuda.device_count())])'

驱动版本必须正常输出,GPU_COUNT 应满足目标训练配置的 Placement。/dev/shm 必须达到目标训练配置的要求;开发机内 Docker 使用 --shm-size 控制内部容器的值,直接镜像方式使用开发机规格提供的值。

镜像 tag 固定容器文件系统,不会固定平台分配的 GPU、主机驱动或图形库。开发机改配、重新调度或切换 GPU 规格后,重新执行本步骤。

Step 6 检查 Vulkan、EGL 和仿真依赖

language-shell
set -euo pipefail

test "${NVIDIA_DRIVER_CAPABILITIES:-}" = all
test -r /etc/vulkan/icd.d/nvidia_icd.json
test -r /usr/share/glvnd/egl_vendor.d/10_nvidia.json

ldconfig -p | grep 'libEGL_nvidia.so'
ldconfig -p | grep 'libGLX_nvidia.so'

"$VLA_PYTHON" -c \
  'import mani_skill, sapien; print("MANISKILL_IMPORT=passed SAPIEN_IMPORT=passed")'

所有命令都应以退出码 0 结束。SAPIEN 可能提示使用内置 Vulkan loader;该提示本身不表示渲染回退到 CPU。具体场景教程会创建实际的 ManiSkill GPU 环境,并以环境设备和训练结果判断图形链路是否可用。

如果 $HOME/.maniskill$HOME/.sapien 链接缺失,可以运行镜像提供的 link_assets 恢复镜像内置标准资产。该命令不会下载 RLinf 训练配置需要的自定义资产。

Step 7 检查代码、模型和 ManiSkill 资产

本文固定基线使用 RLinf commit c5ca51cc21c007a41d287159f9e1b14e0200000e。将下面的示例路径改成当前共享存储中的实际路径:

language-shell
set -euo pipefail

export RLINF_COMMIT=c5ca51cc21c007a41d287159f9e1b14e0200000e
export RLINF_ROOT="$WORK_ROOT/RLinf"
export MODEL_ROOT="$WORK_ROOT/models/openvla-7b-rlvla-warmup"
export ASSET_ROOT="$RLINF_ROOT/rlinf/envs/maniskill/assets"

test "$(git -C "$RLINF_ROOT" rev-parse HEAD)" = "$RLINF_COMMIT"
test -z "$(git -C "$RLINF_ROOT" status --porcelain)"
test -r "$RLINF_ROOT/examples/embodiment/train_embodied_agent.py"
test -s "$MODEL_ROOT/config.json"
test -s "$MODEL_ROOT/model.safetensors.index.json"
find "$MODEL_ROOT" -maxdepth 1 -type f -name 'model-*.safetensors' -size +0c \
  -print -quit | grep -q .
test -d "$ASSET_ROOT/carrot"

这些检查只用于确认开发机能够读取固定输入。具体场景教程会给出自己的目录布局、版本和完整性校验;如果教程使用版本化目录或独立资产目录,以该教程为准。无需为了匹配本页示例路径而复制大模型。

Step 8 根据目标进入具体场景教程

完成前面检查后,开发机环境已经具备进入具体场景验证的基础条件。下一步根据训练目标选择:

目标下一步
在 AIStudio 训练任务中验证 ManiSkill PPO OpenVLA进入对应的 AIStudio 场景教程,准备版本化输入并验证轨迹生成和 PPO 更新
在开发机中评估 OpenVLA-OFT参考 RLinf 上游 VLA 快速上手,先保留本文已检查的镜像、GPU 和共享存储条件,再为目标配置执行完整验证
更换 RLinf 镜像、commit、模型或 GPU重新执行本文环境检查,再按照目标训练配置验证模型加载、rollout、训练更新和输出持久化

本页的依赖导入检查通过后,还需要在具体场景中检查模型完整加载、ManiSkill GPU 环境创建、预期轨迹数量、训练指标、进程退出状态和共享存储输出,才能判断训练验证是否通过。

处理开发机环境问题

RLinf Docker 容器无法启动

使用 dockerctl status 检查开发机 Docker 服务,再用 docker inspect rlinf-vla 查看镜像、挂载、共享内存和容器错误。同名容器存在时,不要重复执行 docker run;先判断是否可以继续使用,或在保留共享存储数据后重建。

共享存储检查指向 overlay

当前路径没有落在共享存储卷上。返回开发机配置检查存储卷、系统挂载路径和权限,再用 findmnt -T <路径> 确认。不要把模型和结果继续写入开发机或容器临时根目录。

GPU 可见但 Vulkan 或 EGL 检查失败

检查当前镜像是否为预期 tag、NVIDIA_DRIVER_CAPABILITIES=all 是否在容器创建时生效,以及开发机改配后平台是否重新注入 NVIDIA 图形库。运行中的容器缺少图形库时,仅在 Shell 中重新导出环境变量不能补充已经缺失的库。

Python 导入来自错误环境

运行 command -v python"$VLA_PYTHON" -c 'import sys; print(sys.executable)' 比较路径。后续命令继续使用 /opt/venv/openvla/bin/python/opt/venv/openvla-oft/bin/python,不要依赖当前 Shell 的默认 python

模型目录存在但文件不完整

目录大小或目录存在不能证明下载完成。返回具体场景的准备步骤,按固定版本重新下载,并检查模型索引引用的全部分片或该教程提供的 SHA256SUMS。输入校验通过后再启用离线模式。

查看环境检查的适用范围

完成本文后,可以确认当前开发机或 RLinf 容器能够读取共享存储,并且目标 Python 环境可以访问 CUDA、Ray、ManiSkill、SAPIEN 和 NVIDIA 图形库。

本文结果不覆盖:

  • 完整 ManiSkill 环境创建、模型权重加载、rollout 或 PPO 更新;
  • 默认规模训练、策略收敛、checkpoint 保存和恢复;
  • AIStudio 训练任务、多 Worker、托管 Ray 或 RDMA;
  • rlinf0.4 镜像、其他 CUDA/Python 组合或其他 GPU 型号。

这些结果必须在对应场景教程中使用固定输入和正向完成信号单独验证。