Saltar al contenido principal
Etapa 4 · Capítulo 20 · Práctica

20. Preparando el dataset VLA de SO-ARM

Capítulo 20 del curso para principiantes de SO-ARM Physical AI — convierte un dataset LeRobot de la Etapa 3 en un dataset VLA listo para GR00T: anotaciones de lenguaje, meta/modality.json, la etiqueta new_embodiment y la configuración so100_dualcam, verificación de dimensiones y organización multitarea.

20.1 Requisitos previos​

Requisitos

20.1 Requisitos previos

Necesitas:

  • Un dataset limpio de la Etapa 3 grabado en el SO-ARM (Capítulos 11-13): dos vistas (front + side), 50+ episodios, una tarea por episodio, calidad verificada;
  • El repositorio Isaac-GR00T clonado en tu máquina de entrenamiento (el Capítulo 21 instala el entorno completo — este capítulo solo edita archivos del dataset);
  • La receta oficial de referencia: Ajustar GR00T N1.5 en SO101.
tip

Tu dataset ACT existente es la materia prima — GR00T reutiliza los mismos episodios LeRobot. Este capítulo solo añade los metadatos de lenguaje y modalidad.

20.2 Comprobar el dataset LeRobot​

Comprobación

20.2 Comprobar el dataset LeRobot

Estructura del directorio​

~/.cache/huggingface/lerobot/seeedstudio123/test/
├── meta/
│ ├── info.json ← fps, características, claves de cámara
│ ├── tasks.jsonl ← descripciones de tarea (¡editar aquí!)
│ ├── episodes/... ← metadatos por episodio
│ └── stats/... ← estadísticas de normalización
├── data/ ← fotogramas parquet
└── videos/ ← flujos de cámara

Comprobación rápida con Python​

from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

ds = LeRobotDataset("seeedstudio123/test", root="~/.cache/huggingface/lerobot")
print(ds.meta.info) # fps, características
print(ds[0]["observation.state"].shape) # esperado torch.Size([6])
print(ds[0]["action"].shape) # esperado torch.Size([6])

Lista de comprobación​

  • observation.state y action de 6 dimensiones (5 articulaciones + pinza);
  • Exactamente dos características de imagen, p. ej. observation.images.front / observation.images.side;
  • Cada episodio pertenece a una tarea con descripción significativa;
  • Sin episodios rotos conocidos (limpieza del Capítulo 13).

20.3 Añadir descripciones de tarea en lenguaje​

Lenguaje

20.3 Añadir descripciones de tarea en lenguaje

Método A: escribir al grabar (recomendado)​

Si grabas un dataset nuevo para la Etapa 4, liga la instrucción al grabar con el mismo --dataset.single_task que ya usas:

--dataset.single_task="Pick up the block at point A and place it at point B"

Una tarea = una frase corta que empieza por verbo — fluye automáticamente a los metadatos.

Método B: rellenar meta/tasks.jsonl​

Para un dataset existente, edita meta/tasks.jsonl para que cada índice mapee a una instrucción correcta. Mantén el mapeo estable: el modelo aprenderá esas cadenas exactas.

Directrices de anotación​

  1. Una tarea = una frase fija; nunca dos redacciones para la misma;
  2. Empezar por verbo y ser concreto: "Pon el bloque en la caja" mejor que "manejo del bloque";
  3. Chino o inglés ambos valen — el VLM de GR00T entiende ambos — pero no mezcles idiomas dentro de una tarea.

20.4 Crear meta/modality.json​

Modalidad

20.4 Crear meta/modality.json

modality.json dice a GR00T qué campos del dataset alimentan qué entradas del modelo. El montaje estándar de dos cámaras del SO-ARM corresponde a la configuración oficial so100_dualcam; el equivalente mínimo para un dataset local:

{
"state": {
"single_arm": [0, 5],
"gripper": [5, 6]
},
"action": {
"single_arm": [0, 5],
"gripper": [5, 6]
},
"video": {
"front": "observation.images.front",
"side": "observation.images.side"
},
"annotation": {
"human.task_description": "task_description"
}
}

Descripción de campos​

CampoSignificado
state.single_armCorte [inicio, fin) de observation.state para las 5 articulaciones
state.gripperCorte de la pinza
action.*Los mismos cortes en el vector action
videoClave de cámara → característica del dataset (debe coincidir letra por letra con lo grabado)
annotation.human.task_descriptionDe dónde viene la instrucción (clave recomendada del Capítulo 18)
nota

La configuración so100_dualcam del repositorio Isaac-GR00T es la versión canónica de este archivo — si tu montaje coincide con el estándar (dos cámaras, estado/acción de 6), es mejor pasar --data-config so100_dualcam al entrenar que mantener una copia a mano.

20.5 Fijar la etiqueta de embodiment​

Embodiment

20.5 Fijar la etiqueta de embodiment

El SO-ARM se ajusta como embodiment nuevo: etiqueta new_embodiment. Rara vez se escribe en el dataset mismo — es un argumento de entrenamiento/inferencia (Capítulo 21: --embodiment-tag new_embodiment en el servicio; la receta SO101 lo fija al entrenar).

Lo que importa a nivel de dataset es que la configuración de datos coincida con la realidad: dos cámaras y estado/acción de 6, verificado en 20.2.

20.6 Verificar orden de articulaciones y dimensiones​

Verificación

20.6 Verificar orden de articulaciones y dimensiones

Paso 1: imprimir los metadatos​

Confirma la lista de características y dimensiones (ver 20.2): 6/6 para estado/acción, dos características de imagen.

Paso 2: verificar los cortes de modalidad​

Si escribiste un modality.json propio, los cortes deben cubrir exactamente [0,6), sin huecos ni solapes.

Paso 3: visualizar​

lerobot-dataset-viz \
--repo-id seeedstudio123/test \
--mode local \
--episode-index 0

Comprueba: imágenes de las cámaras correctas, la pinza abre/cierra al agarrar, las articulaciones se mueven en orden plausible.

Paso 4: comprobación estadística​

meta/stats: los mínimos/máximos de estado dentro del rango calibrado; el brillo medio de las imágenes lejos de 0 o 255 (grabaciones negras o quemadas).

20.7 Organización multitarea​

Multitarea

20.7 Organización multitarea

Método A: mismo repo_id, varios task_index (recomendado)​

Graba varias tareas en un dataset; cada episodio guarda su task_index, y tasks.jsonl mapea cada índice a su instrucción. Es la forma natural del ajuste condicionado al lenguaje.

Método B: fusionar varios datasets​

Fusiona datasets por tarea con el kit del Capítulo 13 (--operation.type merge). Requisitos: configuración de cámara idéntica, disposición robot/características idéntica y frases de tarea distintas y consistentes por fuente.

Volúmenes recomendados​

MontajeEpisodiosNotas
Tarea única, A→B fijo~50Validar el ajuste
Tarea única, posiciones variadas50-100El volumen por defecto de la Etapa 3
Multitarea (3-5 tareas)50-100 por tareaEl condicionamiento necesita cobertura por tarea

20.8 Lista de comprobación de calidad​

Lista

20.8 Lista de comprobación de calidad

  • Cada episodio con una instrucción correcta y única;
  • Claves de cámara de modality.json idénticas carácter a carácter a las del dataset;
  • state / action de 6 dimensiones y cortes correctos (single_arm / gripper);
  • Episodios fallidos y atípicos borrados (Capítulo 13);
  • Estadísticas presentes (meta/stats) — nunca entrenes con una sesión matada a mitad;
  • Copia de seguridad del dataset final antes de que el Capítulo 21 toque nada.

Dataset listo — el próximo capítulo ajusta GR00T sobre él.

Loading Comments...