Octo 机器人策略模型实战:从零到真机推理的最短路径
【免费下载链接】octoOcto is a transformer-based robot policy trained on a diverse mix of 800k robot trajectories.项目地址: https://gitcode.com/gh_mirrors/oc/octo
Octo 是一个基于 Transformer 的机器人策略模型,在 80 万条多样化机器人轨迹上预训练,目标是把"拿起勺子"这类动作交给它完成——不用为每种机械臂从零采集数据。这篇 Octo 上手指南带你用一条最短路径跑通:首次推理 → 换传感器微调 → Gym 评估 → 真机部署,覆盖具身智能部署与模仿学习微调的完整工程链路。
📊 对比两个规格,选对你的起点
Octo 提供 Base 与 Small 两档,差别在参数量和微调自由度,选小模型入门更省心。
| 模型规格 | 适用场景 | 硬件门槛 |
|---|---|---|
| Octo-Base(93M 参数,13 it/sec) | 多机器人控制零样本评估、追求上限 | 1 张 NVIDIA 4090 级 GPU |
| Octo-Small(27M 参数,17 it/sec) | 模仿学习微调起步、资源有限入门 | 消费级显卡即可 |
🚀 跑通首次推理:一条命令链装完环境
克隆、建环境、装依赖、验证,这四步按顺序粘进终端即可,总共 8 行代码。
git clone https://gitcode.com/gh_mirrors/oc/octo cd octo conda create -n octo python=3.10 && conda activate octo pip install -e . pip install -r requirements.txt # 装完立刻验证:用内置 debug 数据集跑一次微调,CPU 也能过 python scripts/finetune.py --config.pretrained_path=hf://rail-berkeley/octo-small-1.5 --debug有 GPU 的话,把 JAX 换成带 CUDA 的版本:
pip install --upgrade "jax[cuda11_pip]==0.4.20" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html。这步容易卡住,版本必须和项目锁定的 0.4.20 一致。
🤖 从单次推理到换传感器微调
推理链路只有三步:加载模型、构造观测、采样动作。
from octo.model.octo_model import OctoModel import jax, numpy as np model = OctoModel.load_pretrained("hf://rail-berkeley/octo-small-1.5") # 拉取预训练权重 observation = {"image_primary": img[None, None, ...], # 图像加 batch 和时间维 "timestep_pad_mask": np.array([[True]])} # 标记哪些时间步有效 task = model.create_tasks(texts=["pick up the spoon"]) # 语言指令转成任务 token action = model.sample_actions( # 采样出归一化动作序列 observation, task, unnormalization_statistics=model.dataset_statistics["bridge_dataset"]["action"], rng=jax.random.PRNGKey(0))最后一行是整条链路的核心:它返回的不是单步动作,而是一段动作块(预训练默认 4 步),执行时整块执行或只执行首步都可行。完整轨迹级推理与可视化对比见 examples/01_inference_pretrained.ipynb。
换你自己的传感器和动作空间,就是微调的活:删掉用不到的观测头、加 proprio 编码器、换 14 维双臂动作头,然后把预训练权重合并进来。
# 跑通这个脚本,你就有了换传感器微调的完整模板 python examples/02_finetune_new_observation_action.py \ --pretrained_path=hf://rail-berkeley/octo-small-1.5 --data_dir=<你的RLDS数据>也可以用配置化的脚本替代,按数据量选冻结策略:--config=finetune_config.py:head_only,image_conditioned(只调输出头)或:full(全模型微调)。
微调完先别急着上真机,在 Gym 环境里滚几局看成功率:
env = gym.make("aloha-sim-cube-v0") # 你的环境 env = NormalizeProprio(env, model.dataset_statistics) # 归一化本体感知 env = HistoryWrapper(env, horizon=1) # 自动拼历史帧和掩码 env = RHCWrapper(env, exec_horizon=50) # 动作块的回退执行 actions = model.sample_actions(obs, task, unnormalization_statistics=..., rng=key) obs, reward, done, trunc, info = env.step(actions) # 环境前进一步对应脚本 examples/03_eval_finetuned.py。最后一步是真机部署:把策略接上 WidowX 相机和控制器,滚出一条完整轨迹,写法直接抄 examples/04_eval_finetuned_on_robot.py,环境接入约定见 examples/envs/README.md。
🛠 排掉三个高频坑,再接你的传感器
- 现象:装完依赖后加载模型报 CUDA 或 device 相关错误。原因:JAX 默认是 CPU 版,或版本与项目锁定的 0.4.20 不一致。解法:按上节 blockquote 的命令安装 CUDA 版 JAX,装完用
--debug那条命令复验。 - 现象:喂观测时报
timestep_pad_mask形状不匹配。原因:Octo 训练时用 2 步历史窗口,轨迹开头没有"上一步",直接全填 True 就会错位。解法:首个时间步掩码设 False;用 gym_wrappers.py 里的HistoryWrapper包装环境,掩码由它自动补好。 - 现象:微调后机器人乱动、动作尺度异常。原因:
sample_actions返回的是归一化动作,拿原始值直接下发必然失控。解法:始终传入unnormalization_statistics,取自模型dataset_statistics里对应数据集的条目,用法见 examples/03_eval_finetuned.py。
想深入该读哪个模块:模型加载、保存与推理的总入口是 octo_model.py,配合 action_heads.py 看动作空间怎么换,这两个文件吃透后,微调配置里的每处改动你都能对上号。
跑通上面四步,你就可以接自己的传感器了。
【免费下载链接】octoOcto is a transformer-based robot policy trained on a diverse mix of 800k robot trajectories.项目地址: https://gitcode.com/gh_mirrors/oc/octo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考