LeRobot入门教程 07:LeRobot 环境与网络
1. LeRobot 是什么
LeRobot 是 Hugging Face 维护的机器人学习开源库。机器人学习里最容易「每个实验室各写一套」的几件事,它都收进了统一接口:
| 环节 | LeRobot 里的对象 | 本套教程在哪讲 |
|---|---|---|
| 数据集读写 | LeRobotDataset | 08 册《LeRobot 数据集》 |
| 仿真环境 | make_env + envs.configs.*Env | 09 册《LeRobot 仿真》 |
| 策略模型 | make_policy + PreTrainedConfig | 10 册《LeRobot 策略推理》 |
| 评测 | 命令行 lerobot-eval | 11 册《LeRobot 评测》 |
| 真机部署 | 命令行 lerobot-rollout | 12 册《LeRobot 真机部署》 |
| 微调 | 命令行 lerobot-train | 13 册《LeRobot 微调》 |
| 奖励模型 / 强化学习 | lerobot.rewards / lerobot.rl | 14 册《奖励模型》、15 册《强化学习》 |
07–15 这九册的代码都跑在 LeRobot 0.6.1 上
2. 为什么第一件事是配置网络
LeRobot 的模型和数据集都托管在 Hugging Face Hub 上。第一次运行时需要下载的东西不小:
lerobot/libero数据集:1693 条演示、27 万帧,含视频文件;lerobot/pi0_libero_finetuned策略:π0 系列视觉语言动作模型;- LIBERO 仿真资产、RoboMeter-4B 奖励模型(约 4B 参数,8 GB 量级)。
国内直连 Hub 经常几十 KB/s 甚至直接超时。AutoDL 提供了 /etc/network_turbo 学术加速脚本(第 05 册 5.2 节讲过)。
但这里有个坑:在 Jupyter 里写 !source /etc/network_turbo 只对那一个子进程生效,下一个格子照样没有代理。所以本册不 source,而是用 Python 把脚本里的 export 解析进当前 kernel 进程的 os.environ,这样后面所有格子(包括 from_pretrained 触发的下载)都能走加速通道。
3. 两个必须提前设好的环境变量
第一格代码里有两行看起来不起眼、但漏了就会报错的设置:
| 环境变量 | 值 | 为什么 |
|---|---|---|
MUJOCO_GL | egl | MuJoCo 渲染画面需要 OpenGL 上下文。这台服务器没有显示器、也没有 X11,只能用 GPU 离屏渲染(EGL)。不设会退化到需要图形界面的后端而初始化失败;设成 osmesa 则改成 CPU 软件渲染。 |
TORCHDYNAMO_DISABLE | 1 | 关掉 torch.compile。仿真 + 大模型组合下 dynamo 编译容易在第一次调用时长时间卡住甚至编译失败,先关掉更稳。 |
这两行都要在 import torch 之前生效,所以它们写在格子最前面。
import os, re
for line in open("/etc/network_turbo").read().replace("&&", "\n").splitlines():
m = re.match(r"\s*export\s+([A-Za-z_]+)=(.*)", line)
if m:
os.environ[m.group(1)] = m.group(2).strip().strip('"')
os.environ.setdefault("MUJOCO_GL", "egl")
os.environ["TORCHDYNAMO_DISABLE"] = "1"
try:
from huggingface_hub.utils._http import close_session
close_session()
except Exception:
pass
import torch, lerobot
print("lerobot", lerobot.__version__, "| torch", torch.__version__, "| cuda", torch.cuda.is_available())
lerobot 0.6.1 | torch 2.8.0+cu128 | cuda True
4. 逐行看懂这一格
| 代码 | 作用 |
|---|---|
open("/etc/network_turbo").read().replace("&&", "\n") | 该文件里存在 export A=1 && export B=2 这种一行多个的写法,先把 && 换成换行,才能一行一个 export |
re.match(r"\s*export\s+([A-Za-z_]+)=(.*)", line) | 只认 export 名字=值 的行,注释和空行自动跳过 |
os.environ[m.group(1)] = m.group(2).strip().strip('"') | 写进当前进程环境变量,并去掉值两边可能带的引号 |
os.environ.setdefault("MUJOCO_GL", "egl") | 用 setdefault 而不是直接赋值:如果外部已经指定了渲染后端(比如调试时想换 osmesa),就不覆盖 |
try: ... close_session() ... except: pass | huggingface_hub 会复用长连接,代理切换后旧连接可能还指向老路由,这里主动关掉。包版本不同时这个内部函数可能不存在,所以用 try 包住 |
print("lerobot", ...) | 一行确认三件事:lerobot 版本、torch 版本、CUDA 是否可用 |
5. 这一格跑完应该看到什么
lerobot 0.6.1 | torch 2.8.0+cu128 | cuda True
三个信息分别代表:
lerobot 0.6.1:版本对上了,后面的参数名才对得上;torch 2.8.0+cu128:+cu128表示这个 wheel 带 CUDA 12.8 运行时;cuda True:能看到 GPU。如果是 False,后面所有推理、训练都会退到 CPU,第一次加载模型就可能几十分钟,先解决这个再往下走。
6. 常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
下载卡在 Fetching files 或超时 | 当前 kernel 没走加速通道 | 回到第 1 节这一格重跑;确认 os.environ 里有 http_proxy |
cuda 是 False | GPU 被别的任务占满,或驱动/CUDA 不匹配 | nvidia-smi 看显存;确认没有别的进程占着卡 |
TypeError: unexpected keyword argument | lerobot 版本不是 0.6.1 | 按项目要求安装对应版本,别随意 pip install -U |
| 上一格设了代理,这一格还是慢 | 每开一个新 kernel 都要重新跑第 1 节 | 九册里凡是下载相关的格子,前面都依赖这一格 |