《从零开始:Ubuntu 22.04 + RTX 4060 复现 RLinf 具身智能框架记录(上)》

82 阅读4分钟

前言

官方项目链接github.com/RLinf/RLinf…
官方文档(中文版)rlinf.readthedocs.io/zh-cn/lates…
官方文档(英文版rlinf.readthedocs.io/en/latest/r…

笔者开始复现前系统状态(刚重装了ubuntu22.04,近乎裸机,适合萌新参考)

  • OS:Ubuntu 22.04
  • Driver:535.288.01(终端输入 nvidia-smi即可查询,后面步骤要求更新到nvidia-driver-590
  • CUDA toolkit:12.4(终端输入 nvcc -V即可查询)
  • GPU:RTX 4060 8GB(即8188MiB)(终端输入nvidia-smi 即可查询)

总体目录与推荐路径(笔者根目录为 lwb@isus:~$

建议把所有工作目录固定在:

  • 项目根目录(宿主机)~/work/RLinf
  • 模型/数据(宿主机)~/data/rlinf/
  • 结果(宿主机)~/work/RLinf/results(或用项目默认的 ../results,但我建议挂载出来)

这样 Docker 里统一挂载到 /workspace/RLinf,模型数据挂载到 /workspace/data,不会因为容器删掉丢东西。

A. 宿主机:Docker + NVIDIA Container Toolkit 全流程

目标:让 docker run --gpus all nvidia/cuda:12.4-base nvidia-smi 正常输出
这是后续一切的“验收门槛”。

A0) 先确认现状

nvidia-smi
nvcc -V

image.pngimage.png 如图,笔者Driver是535.288.01,必须升级到高版本,推荐NVIDIA-SMI 590

1. 安装驱动
sudo apt update
sudo apt install nvidia-driver-590

(如果安装过程中弹出紫色屏幕询问 Secure Boot 相关设置,建议选择 Disable 或者设定一个密码,并在重启时按照提示操作。最省事的办法是在 BIOS 里直接关掉 Secure Boot)

2. 重启宿主机(必须)

驱动安装涉及内核模块更新,不重启不会生效。

sudo reboot
3. 验证与验收

重启回来后,在终端输入:

nvidia-smi

image.png

A1) 安装 Docker Engine(推荐 docker-ce,而不是 ubuntu 自带 docker.io)

  1. 卸载可能存在的旧组件(安全起见):
sudo apt-get remove -y docker docker-engine docker.io containerd runc || true

2. 安装依赖并添加 Docker 官方源:

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3. 安装 Docker(注意此时要把梯子关掉,否则会安装失败,导致步骤4报错):

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4. 允许当前用户免 sudo 用 docker(建议做,不然每条命令都 sudo):

sudo usermod -aG docker $USER
newgrp docker

注意如果运行后,报错usermod:“docker”组不存在,说明步骤3梯子没关,导致docker安装失败,需要关掉梯子代理后重新执行步骤3

  1. 验收:
docker version
image.png
docker run --rm hello-world
  • 如果你在国内,遇到网络问题时(镜像拉取速度慢) 等待一会报错如下图

  • image.png 解决办法 可以通过使用国内的 Docker 镜像源来加速拉取速度,使用阿里云等国内镜像。可以参考以下步骤配置阿里云的 Docker 镜像源:

  • 配置阿里云的 Docker 镜像源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' 
{ 
"registry-mirrors": ["<your-aliyun-mirror-url>"] ,
"https://docker.m.daocloud.io"]
} 
EOF 
  • 注意:替换其中的 <your-aliyun-mirror-url> 为你自己的阿里云镜像 URL,具体地址可以通过 阿里云 Docker 镜像加速器 获得。

  • image.png

  • 重新配置并清理 Docker 设置
    确保 /etc/docker/daemon.json 文件只包含你信任的几个镜像源。然后,执行以下步骤:

    • 清理 Docker 缓存:

      docker system prune -af
      
    • 重新加载配置并重启 Docker:

      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
  • 检查是否能访问 Docker Hub 镜像源

    docker pull hello-world
    

    接着可以通过以下命令运行 hello-world 镜像来验证 Docker 是否配置正常:

    docker run --rm hello-world
    

    成功结果如下:

  • image.pngimage.png

A2) 安装 NVIDIA Container Toolkit(GPU 透传)

RLinf 文档明确要求 NVIDIA Container Toolkit(并给出版本要求)。

  1. 添加 NVIDIA 源并安装:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

2. 配置 Docker runtime:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

3. 验收 GPU 透传(非常关键):

docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

看到 4060 信息就说明 Docker GPU 透传成功。

image.png


B. 拉取 RLinf 官方镜像 + 挂载目录(推荐最稳的方式)

RLinf 官方文档
(
官方文档中文版rlinf.readthedocs.io/zh-cn/lates…
官方文档英文版rlinf.readthedocs.io/en/latest/r…
)
提供两个快速开始镜像:

  • 数学推理镜像(最适合你 4060 8GB 先跑通)rlinf/rlinf:math-rlinf0.1-torch2.6.0-sglang0.4.6.post5-vllm0.8.5-megatron0.13.0-te2.1
  • 具身镜像(OpenVLA / Libero / ManiSkill 等,显存/资源压力更大)rlinf/rlinf:agentic-rlinf0.1-torch2.6.0-openvla-openvlaoft-pi0

我们先走数学推理镜像Quickstart 2(最低资源、官方单卡配置)


B1) 建目录(宿主机)

mkdir -p ~/work/RLinf
mkdir -p ~/data/rlinf/models
mkdir -p ~/data/rlinf/datasets
mkdir -p ~/data/rlinf/cache/hf
mkdir -p ~/data/rlinf/cache/torch

B2) 拉镜像(数学推理镜像)

  • 先给Docker 配置文件添加代理设置

运行以下命令来创建和编辑 Docker 的 systemd 配置文件:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/override.conf

在打开的 override.conf 文件中,添加以下内容(注意图中代理地址127.0.0.1和端口7890,要根据自己的代理配置修改):

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
  • 保存并退出

    • nano 编辑器中,按 Ctrl + O 保存,按 Y 确认保存,然后按 Ctrl + X退出编辑器。
  • 重新加载 Docker 配置并重启 Docker
    执行以下命令来重新加载 Docker 配置并重启 Docker 服务,使新的代理设置生效:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  • 验证代理设置
    代理配置完成后,尝试拉取镜像:

    docker pull rlinf/rlinf:math-rlinf0.1-torch2.6.0-sglang0.4.6.post5-vllm0.8.5-megatron0.13.0-te2.1
    

image.png

这里想吐嘈一下,笔者第一次拉取下载了快两个小时,快下完的时候报错中断了,见下图

image.png 遇到这种情况的朋友不要担心,重新拉取一遍docker pull rlinf/rlinf:math-rlinf0.1-torch2.6.0-sglang0.4.6.post5-vllm0.8.5-megatron0.13.0-te2.1这一次会快很多,笔者又等了30分钟就完成了


B3) 克隆 RLinf 仓库到宿主机(方便编辑yaml)

cd ~/work
git clone https://github.com/RLinf/RLinf.git
cd RLinf

B4) 启动容器(强烈推荐按这个写法:挂载代码 + 数据 + cache)

这样你在宿主机改 config,容器里立刻生效;模型和数据也都在宿主机落盘。

cd ~/work/RLinf
docker run -it --rm --gpus all \
  --shm-size 20g \
  --network host \
  --name rlinf-math \
  -e NVIDIA_DRIVER_CAPABILITIES=all \
  -e HF_HOME=/workspace/cache/hf \
  -e TORCH_HOME=/workspace/cache/torch \
  -v $(pwd):/workspace/RLinf \
  -v ~/data/rlinf:/workspace/data \
  -v ~/data/rlinf/cache:/workspace/cache \
  rlinf/rlinf:math-rlinf0.1-torch2.6.0-sglang0.4.6.post5-vllm0.8.5-megatron0.13.0-te2.1 \
  /bin/bash

image.png 容器里你应当在:

cd /workspace/RLinf

B5) 容器内做一次最基础验收(GPU + PyTorch)

在容器里执行:

nvidia-smi
python -c "import torch; print('torch', torch.__version__); print('cuda?', torch.cuda.is_available()); print('gpu', torch.cuda.get_device_name(0) if torch.cuda.is_available() else None)"

image.png 这一步通过,说明“宿主机驱动 + Docker 透传 + 容器依赖”闭环。


C. 跑通 RLinf 最轻量 Demo(优先:Quickstart 2 单 GPU GRPO on MATH)

官方 Quickstart 2 明确给了:

  • 要下载一个 1.5B 模型 checkpoint
  • 下载 boba 数据集
  • 修改 examples/reasoning/config/math/qwen2.5-1.5b-single-gpu.yaml
    并且说明这个配置默认单 GPU

C1) 在容器内安装 huggingface-hub

pip install -U huggingface-hub

C2) 下载模型与数据(落在宿主机挂载目录,避免容器删掉丢失)

在容器里:

方案一:使用 Hugging Face 国内镜像

(优先尝试 方案一 。因为代理有时候带宽不够或者连接不稳定,下载大模型容易断连。国内镜像站 hf-mirror.com 通常非常稳定且速度极快)

cd /workspace/data
# 设置 HF 镜像环境变量
export HF_ENDPOINT=https://hf-mirror.com

# 模型
hf download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \
  --local-dir /workspace/data/models/DeepSeek-R1-Distill-Qwen-1.5B

# 数据集
hf download inclusionAI/AReaL-boba-Data --repo-type=dataset \
  --local-dir /workspace/data/datasets/boba

如何永久生效? 如果你希望每次进入容器都不用重新输这行命令,可以把它写入容器的配置文件:

echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc
source ~/.bashrc

方案二:在容器内配置代理

如果你想让容器内的所有流量(不仅是 HF,还包括 pip install github 等)都走代理,可以使用这个方法。

因为你启动容器时加了 --network host,容器和宿主机共享网络,所以容器内的 127.0.0.1 就是宿主机的 127.0.0.1

在容器内的终端执行(假设你的代理端口是 7890):

cd /workspace/data
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

# 模型
hf download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \
  --local-dir /workspace/data/models/DeepSeek-R1-Distill-Qwen-1.5B

# 数据集
hf download inclusionAI/AReaL-boba-Data --repo-type=dataset \
  --local-dir /workspace/data/datasets/boba

如何永久生效? 同样写入 .bashrc

echo 'export http_proxy=http://127.0.0.1:7890' >> ~/.bashrc
echo 'export https_proxy=http://127.0.0.1:7890' >> ~/.bashrc
source ~/.bashrc

显存建议(4060 8GB)
1.5B 量级通常作为起点能更稳跑通。不要一开始就上 7B/更大。

C3) 修改 YAML 配置

配置文件路径(宿主机和容器一致,因为挂载了代码,所以直接在宿主机改文件即可):

  • /workspace/RLinf/examples/reasoning/config/math/qwen2.5-1.5b-single-gpu.yaml

image.png 需要按文档修改这几个字段(官方列出的关键字段):

  • rollout.model.model_path
  • data.train_data_paths
  • data.val_data_paths
  • actor.tokenizer.tokenizer_model

把它们改成你实际路径(我们刚下载到 /workspace/data/...)。

推荐值(对应上面下载位置):

  • rollout.model.model_path: /workspace/data/models/DeepSeek-R1-Distill-Qwen-1.5B

  • actor.tokenizer.tokenizer_model: /workspace/data/models/DeepSeek-R1-Distill-Qwen-1.5B

  • 数据集里你需要找到 AReaL-boba-106k.jsonl 的实际位置(文档提到这个文件名)。
    可以先:

    #容器中输入
    find /workspace/data/datasets/boba -maxdepth 4 -type f -name "*106k*.jsonl" -o -name "*.jsonl" | head
    

image.png
找到的 jsonl 路径 data.train_data_pathsdata.val_data_paths

  • data.train_data_paths: /workspace/data/datasets/boba/AReaL-boba-106k.jsonl
  • data.val_data_paths: /workspace/data/datasets/boba/AReaL-boba-106k.jsonl

qwen2.5-1.5b-single-gpu.yaml文件具体修改如下:

#部分代码
model:
    model_path: /workspace/data/models/DeepSeek-R1-Distill-Qwen-1.5B
    model_type: qwen2.5
    precision: ${actor.model.precision}             # precision for rollout model, support [fp16, bf16, fp32]
    
tokenizer:
    tokenizer_model: /workspace/data/models/DeepSeek-R1-Distill-Qwen-1.5B
    use_fast: False
    trust_remote_code: True
    padding_side: 'right'
    
train_data_paths: ["/workspace/data/datasets/boba/AReaL-boba-106k.jsonl"]
val_data_paths: ["/workspace/data/datasets/boba/AReaL-boba-106k.jsonl"]

C4) 启动训练(用官方提供的 launch script)

Quickstart 2 写的是“Execute the provided launch script”,并且配置默认单 GPU。
不同版本仓库脚本名字可能会变,但一定能在仓库 examples/reasoning/examples/ 下找到启动脚本。我建议这样做,保证不走错:

  1. 先列出 reasoning 例子目录:
ls -lah /workspace/RLinf/examples/reasoning
find /workspace/RLinf/examples/reasoning -maxdepth 2 -type f -name "*.sh" -o -name "*.py"

image.png 2. 找到与 MATH / grpo / launch 相关的脚本后运行它,并把你刚改的 yaml 作为参数(如果脚本支持)。

如果你希望我把“具体启动命令行”写成一条(不靠你自己 find),我也可以——但要以你仓库里实际的脚本文件名为准。你把 find ... -name "*.sh" 的输出贴出来,我就能给出精确到文件名的一行命令。

cd /workspace/RLinf/examples/reasoning
bash run_main_grpo_math.sh qwen2.5-1.5b-single-gpu

image.png

C5) 结果与日志位置

Quickstart 2 写了训练结果在 ../results,TensorBoard 在 ../results/grpo-1.5b/tensorboard/
在宿主机可以看到如下生成的三个文件夹: image.png


现在我们已经跑通了 GRPO on MATH(单卡) ,这说明我们的配置成功了,RLinf 的“训练主流程”至少在 reasoning 任务上可跑,下一篇文章将逐渐提高难度,把 RLinf 的数学推理(LLM)链路具身训练链路跑完