最佳实践:从模型开发到仿真评测全链路
本文以 GR00T 模型 + 宇树 G1 仿真场景为例,演示如何在具身智能平台上完成从模型开发到仿真评测的全链路流程。
前提条件
已创建具身智能平台实例并登录(参见创建并登录具身智能平台)。
已配置 ACR 镜像仓库。
已配置公网 NAT 网关(参见为开发机开通公网访问)。
已上传训练数据集(LeRobot v2 格式)。
全链路概述
整个流程分为 5 个阶段:
阶段一:模型开发 → 阶段二:一键训练 → 阶段三:推理部署 → 阶段四:仿真开发 → 阶段五:仿真评测阶段 | 目标 |
模型开发 | 创建开发机,适配数据,本地调试训练和推理 |
一键训练 | 提交训练任务,获取训练好的模型 |
推理部署 | 将模型部署为推理服务 |
仿真开发 | 搭建仿真环境,验证评测流程 |
仿真评测 | 提交自动化评测任务,查看评测报告 |
阶段一:模型开发
1.1 创建模型开发机
在模型开发页面,单击新建开发环境。
选择 gr00t1.7 官方镜像和 GPU 规格(推荐 ADB.MLTensor.2)。
配置 SSH 公钥,单击确定。
等待状态变为运行中后,通过 SSH 登录:
ssh -i ~/.ssh/id_rsa root@<SSH地址>
1.2 确认环境
登录后确认目录结构:
ls /mnt/workspace # 工作目录(持久化)
ls /data # 数据集挂载
ls /official-models # 官方预训练模型1.3 适配机器人数据
这是整个流程中最关键的一步——告诉模型如何理解您的机器人数据。需要准备两个配置文件。
modality.json:定义 state/action 数组中各模态的切片范围、视频和标注字段的键映射关系。以宇树 G1 + 夹爪(16 维 state/action)为例:
{
"state": {
"left_arm": {"start": 0, "end": 7},
"right_arm": {"start": 7, "end": 14},
"left_gripper": {"start": 14, "end": 15},
"right_gripper": {"start": 15, "end": 16}
},
"action": {
"left_arm": {"start": 0, "end": 7},
"right_arm": {"start": 7, "end": 14},
"left_gripper": {"start": 14, "end": 15},
"right_gripper": {"start": 15, "end": 16}
},
"video": {
"cam_left_high": {"original_key": "observation.images.cam_left_high"},
"cam_left_wrist": {"original_key": "observation.images.cam_left_wrist"},
"cam_right_wrist":{"original_key": "observation.images.cam_right_wrist"}
},
"annotation": {
"human.task_description": {"original_key": "task_index"}
}
}配置要点:
start/end遵循 Python 切片规则[start:end],根据机器人关节自由度填写。video > original_key必须与 parquet 文件中的列名完全一致。文件可放在数据集的
meta/目录下(优先级最高),也可通过--modality-json参数指定。
*_config.py:定义模型如何处理数据(相机选择、动作表示、预测步数等)。
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.embodiment_tags import EmbodimentTag
from gr00t.data.types import (
ActionConfig, ActionFormat, ActionRepresentation, ActionType, ModalityConfig,
)
config = {
"video": ModalityConfig(
delta_indices=[0],
modality_keys=["cam_left_high", "cam_left_wrist", "cam_right_wrist"],
),
"state": ModalityConfig(
delta_indices=[0],
modality_keys=["left_arm", "right_arm", "left_gripper", "right_gripper"],
),
"action": ModalityConfig(
delta_indices=list(range(16)),
modality_keys=["left_arm", "right_arm", "left_gripper", "right_gripper"],
action_configs=[
ActionConfig(rep=ActionRepresentation.RELATIVE, type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT, state_key="left_arm"),
ActionConfig(rep=ActionRepresentation.RELATIVE, type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT, state_key="right_arm"),
ActionConfig(rep=ActionRepresentation.ABSOLUTE, type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT, state_key="left_gripper"),
ActionConfig(rep=ActionRepresentation.ABSOLUTE, type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT, state_key="right_gripper"),
],
),
"language": ModalityConfig(
delta_indices=[0],
modality_keys=["annotation.human.task_description"],
),
}
register_modality_config(config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)配置要点:
modality_keys必须与modality.json中对应 section 的键名一致。手臂关节建议使用
RELATIVE,夹爪使用ABSOLUTE。文件末尾必须调用
register_modality_config(..., EmbodimentTag.NEW_EMBODIMENT)。
1.4 本地调试训练
在开发机上先用少量 step 验证代码可以正常跑通:
python /home/code/Isaac-GR00T/gr00t/experiment/launch_finetune.py \
--base_model_path /official-models/GR00T-N1.7-3B \
--backbone_model_name_or_path /official-models/Cosmos-Reason2-2B \
--dataset-path /data/<数据集名称> \
--embodiment_tag new_embodiment \
--modality_config_path /mnt/workspace/gr00t_config/my_robot_config.py \
--modality_json /mnt/workspace/gr00t_config/modality.json \
--output_dir /mnt/workspace/checkpoints/debug_run \
--max_steps 100 \
--save_steps 50 \
--global_batch_size 4 \
--num_gpus 1 \
--report_to tensorboard关键参数说明:
参数 | 说明 |
| 预训练模型路径。 |
| 视觉语言骨干模型路径。 |
| 数据集路径。 |
| 具身配置标签。 |
| 上一步中的 Python 配置文件路径。 |
| 上一步中的 modality.json 路径。 |
| checkpoint 输出目录,建议放在 /mnt/workspace/ 下。 |
| 总训练步数。 |
| 每隔多少步保存一次 checkpoint。 |
| 全局 batch size。 |
| GPU 数量,多卡时自动使用 torchrun。 |
| 实验追踪方式,建议使用 tensorboard。 |
调试时把 --max_steps 设小(如 100),确认 Loss 可以正常下降即可。如出现数据加载报错,一般是 modality.json 的 key 与数据集不匹配。
1.5 本地推理验证
训练完几个步后,可先在开发机上启动推理服务验证模型输出是否合理:
python /home/code/Isaac-GR00T/gr00t/eval/run_http_server.py \
--model-path /mnt/workspace/checkpoints/debug_run \
--embodiment-tag new_embodiment \
--modality_config_path /mnt/workspace/gr00t_config/my_robot_config.py \
--modality_json /mnt/workspace/gr00t_config/modality.json \
--port 8100--model-path会自动选择目录下最新的 checkpoint。--port对应开发机创建时配置的服务端口。
在另一个终端中验证推理服务是否正常:
curl http://localhost:8100/health
# 返回 {"status": "ok"} 即表示服务就绪1.6 制作镜像
验证通过后,将开发环境打包为自定义镜像并推送到 ACR,用于后续的训练和评测。
阶段二:一键训练
2.1 创建训练模板
在模型训练页面,单击开始训练。
切换训练来源为自定义模型。
配置训练参数:
训练镜像:选择阶段一制作的自定义镜像。
数据集路径查询:查看数据集存储路径(需自行配置到启动命令或环境变量中)。
资源规格:选择 GPU 规格。
启动命令:填写完整的训练命令。
TensorBoard 日志路径:填写日志目录路径。
开启保存为模板,填写模板名称。
单击确定。
2.2 监控训练
在模型训练列表中:
查看训练状态(训练中 / 已完成 / 失败)。
通过 Ray Dashboard 查看训练日志和资源使用情况。训练指标(Loss 曲线、学习率等)通过训练任务列表的更多 > 查看指标查看。
2.3 下载训练结果
训练完成后:
小于 200 MB 的模型文件可直接通过浏览器下载。
更大的文件建议导出到 OSS,再使用 ossutil 下载到本地。
阶段三:推理部署
根据模型类型选择部署方式:
官方模型一键部署
在模型部署页面,找到训练完成的模型(状态为空闲)。
单击部署推理服务。
部署自动完成,记录推理服务 URL,后续仿真评测需要使用。
自定义模型手动部署
在开发机中手动启动推理服务。
通过端口映射对外暴露服务端口。
记录推理服务的访问地址。
阶段四:仿真开发
4.1 创建仿真开发机
在仿真开发页面,单击新建仿真环境。
选择 unitree 官方仿真镜像(包含 Isaac Sim 5.1 + xpra)。
选择 GPU 规格,配置 SSH 公钥。
单击确定,等待环境就绪后通过 SSH 登录。
4.2 安装仿真资产
在仿真资产页面,确认所需的宇树 G1 机器人模型已安装。
如未安装,单击目标资产的安装按钮。
安装完成后,资产自动挂载到仿真开发机中。
4.3 仿真任务与机器人配置对应关系
根据您的机器人和训练配置,选择匹配的仿真任务:
模型训练配置 | --robot_type | 末端执行器参数 | 示例任务 |
G1 + Dex1 夹爪(16 维) | g129 | --enable_dex1_dds | Isaac-PickPlace-Cylinder-G129-Dex1-Joint |
G1 + Dex3 灵巧手(28 维) | g129 | --enable_dex3_dds | Isaac-PickPlace-RedBlock-G129-Dex3-Joint |
G1 + Inspire 灵巧手 | g129 | --enable_inspire_dds | Isaac-Stack-RgyBlock-G129-Inspire-Joint |
H1-2 + Inspire 灵巧手 | h1_2 | --enable_inspire_dds | Isaac-PickPlace-Cylinder-H12-27dof-Inspire-Joint |
4.4 在开发机中验证评测流程
在仿真开发机中执行以下命令发起评测,验证仿真环境和推理服务的连通性:
python /home/code/unitree_sim_isaaclab/adb/evaluate.py \
--serve_url http://<推理服务地址>:8100 \
--task Isaac-PickPlace-RedBlock-G129-Dex1-Joint \
--task_desc "Pick up the red cup on the table." \
--robot_type g129 \
--enable_dex1_dds \
--n_episodes 5 \
--max_steps 500 \
--output_dir /mnt/workspace/eval_output \
--device cuda:0 \
--enable_cameras开发机中可通过浏览器访问 20001 端口(xpra 远程桌面)实时查看仿真 GUI 画面。如不需要 GUI,可添加 --headless 参数加速运行。
关键参数说明:
参数 | 说明 |
| 远程推理服务 URL,格式: |
| 仿真任务 ID,必须与模型训练的机器人配置匹配。 |
| 任务描述文本,发送给推理模型用于理解任务意图。 |
| 机器人类型: |
| 启用 Dex1 夹爪模式(state=16 维)。 |
| 评测轮数,每轮 reset 一次环境(物体位置随机化)。 |
| 每轮最大仿真步数,超过则判定失败。 |
| 评测报告输出目录,建议保存到 /mnt/workspace/。 |
| GPU 设备,如 |
| 启用相机渲染(评测必须开启)。 |
| 无头模式运行。一键评测时必须开启。 |
4.5 查看评测报告
评测完成后,报告保存在 --output_dir 指定目录下的 eval_report.json,包含以下关键指标:
指标 | 说明 |
success_rate | 任务成功率。 |
avg_steps_to_success | 成功 episode 的平均步数(越小越好)。 |
avg_reward | 平均累计奖励。 |
total_time_seconds | 总评测耗时。 |
4.6 制作仿真镜像
验证通过后,将仿真环境打包为自定义镜像,用于后续的自动化评测。
阶段五:仿真评测
5.1 创建评测模板
在仿真评测页面,单击新建评测。
配置评测参数:
推理服务 URL:阶段三获取的推理服务地址。
仿真镜像:选择阶段四制作的自定义仿真镜像。
资源规格:选择 GPU 规格。
启动命令:填写评测脚本命令。
Headless:必须开启。平台一键评测必须使用 --headless 模式。
开启存为模板。
单击确定。
5.2 监控评测
在仿真评测列表中查看任务状态,通过 Ray Dashboard 监控执行详情。
5.3 查看评测报告
评测完成后,下载评测结果文件,分析模型在仿真环境中的表现。根据评测结果决定是否需要迭代优化:
成功率不达标:返回阶段一调整数据或训练参数。
成功率达标:进入真机部署阶段。