Skip to content

踩坑github.com8 天前

Isaac-GR00T 微调自定义 LeRobot v2 数据集时 modality.json 动作维度与视频解码报错 ​

硬件与软件环境 ​

  • 模型:NVIDIA Isaac GR00T N1-2B / N1.5-3B / N1.6
  • 数据集格式:LeRobot v2.0(data/chunk-000/*.parquet + videos/chunk-000/*/*.mp4 + meta/info.json)

故障现象与报错 ​

把标准 LeRobot 采集的数据集直接传给 scripts/gr00t_finetune.py --dataset-path ./my_dataset 时:

  1. 报错 FileNotFoundError: .../meta/modality.json not found;
  2. 手动补充 modality.json 后报 IndexError: slice index out of range 或 ValueError: Unsupported video backend decord。

根因分析 ​

  1. GR00T 专属 modality.json 切片协议:标准 LeRobot 数据集的 observation.state 和 action 通常是一个拼接的一维浮点数组(例如宇树 G1 的 29 维全身关节,或双臂 14 维 + 灵巧手 12 维 = 26 维),而 GR00T 的跨本体动作头(Embodiment-Specific Action Projector)需要通过 meta/modality.json 明确知道 left_arm、right_arm、left_hand、right_hand、waist 分别对应一维数组中的哪个 [start, end) 下标区间。
  2. AV1 编码视频与默认 decord 后端不兼容:LeRobot v2 默认常使用 libsvtav1 编码 MP4 视频,而旧版 CPU decord 无法软解 AV1 流。

解决步骤 ​

  1. 在数据集 meta/modality.json 中精确声明切片起止下标: 以双 7 自由度手臂 + 双 6 自由度灵巧手(共 26 维)为例:
    json
    {
      "state": {
        "left_arm": {"start": 0, "end": 7},
        "right_arm": {"start": 7, "end": 14},
        "left_hand": {"start": 14, "end": 20},
        "right_hand": {"start": 20, "end": 26}
      },
      "action": {
        "left_arm": {"start": 0, "end": 7},
        "right_arm": {"start": 7, "end": 14},
        "left_hand": {"start": 14, "end": 20},
        "right_hand": {"start": 20, "end": 26}
      },
      "video": {
        "ego_view": {"original_key": "observation.images.cam_high"}
      },
      "annotation": {
        "human.action.task_description": {"original_key": "task_index"}
      }
    }
    注意 end 必须等于 observation.state 在 meta/info.json 中的总长度,不能越界。
  2. 切换视频解码后端为 torchvision_av: 在启动 gr00t_finetune.py 时加上参数 --video-backend torchvision_av,即可直接解码 LeRobot AV1 格式视频而无需重转码。

来源

本页事实对应的公开页面,以原文为准。

  1. GitHub NVIDIA/Isaac-GR00T访问 2026-10-21