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

> 原文链接：https://robotics.hellobike.com/pitfalls/isaac-gr00t-lerobot-parquet-action-horizon-mismatch
> 频道：pitfalls | 更新日期：2026-10-21 | 标签：Isaac-GR00T, LeRobot, VLA微调, modality.json, 宇树G1
> 核心摘要：GR00T N1.5/N1.6 要求数据集目录下包含严格的 meta/modality.json 切片映射；未对齐关节索引或缺少 decord/av 解码后端会导致训练中断。

# 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 格式视频而无需重转码。

## 原始参考来源 (Sources)

- [GitHub NVIDIA/Isaac-GR00T](https://github.com/NVIDIA/Isaac-GR00T)