Octo 机器人策略模型实战:从零到真机推理的最短路径
2026/8/23 9:58:21 网站建设 项目流程

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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询