Die AY-Robots Anleitungsseite zum Training von GR00T N1.7 auf einem SO-100 Arm, zeigt die erforderliche GPU-Stufe, das Datensatzformat und die Trainer-Standardeinstellungen
GR00T N1.7SO-100FeinabstimmungLeRobotVLA

Wie man GR00T N1.7 auf dem eigenen SO-100 Datensatz trainiert

AY-Robots Research23. August 202628 Min. Lesezeit

Eine erprobte Anleitung zur Feinabstimmung von NVIDIA GR00T N1.7 auf einem SO-100 LeRobot Datensatz: echte Flags, modality.json, die v2.1-Anforderung, was ein Durchlauf kostet und die Fallstricke.

NVIDIA liefert ein Fine-Tuning-Beispiel für genau den Arm, den Sie wahrscheinlich besitzen. Im Isaac-GR00T Repository gibt es einen Ordner namens demo_data/cube_to_bowl_5: fünf Episoden, 4.148 Frames bei 30 fps, bereits als LeRobot v2.1 geschrieben, mit einer passenden Modalitätskonfiguration unter examples/SO100/. Seine meta/info.json meldet robot_type: so101_follower, was in LeRobot dieselbe Konfigurationsklasse ist wie so100_follower. Das ist wirklich nützlich, denn es bedeutet, dass der Referenzpfad für GR00T N1.7 an einem sechs-Freiheitsgrad Hobbyarm von den Leuten gepflegt wird, die das Modell geschrieben haben. Es ist keine herunterskalierte humanoide Demo, es ist derselbe Arm.

Die schlechte Nachricht ist der Abstand zwischen I recorded 60 episodes und the arm does the task. Es gibt etwa sechs Stellen, an denen diese Pipeline eher still als lautlos fehlschlägt, und vier davon befinden sich in Dateien, die die meisten Leute nie öffnen: meta/modality.json, die Python-Datenkonfiguration, meta/relative_stats.json, und der eigenen Versionszeichenfolge des Datensatzes. Dieser Leitfaden beschreibt den manuellen Weg von Anfang bis Ende mit den echten Befehlen und zeigt dann dieselbe Aufgabe als Formular auf AY-Robots. Alles unten Genannte wurde am 20. August 2026 (der n1.7-Release-Linie) mit dem Isaac-GR00T-Hauptzweig und lerobot 0.6.1, veröffentlicht auf PyPI am 3. August 2026, abgeglichen. Upstream bewegt sich schnell, und wo ein Flag umbenannt wurde, wird dies in diesem Artikel erwähnt.

Was Sie vor dem Start wissen müssen

  • GR00T N1.7 Fine-Tuning benötigt 40 GB oder mehr VRAM. NVIDIA empfiehlt H100- oder L40-Knoten. Eine 24 GB RTX 4090 wird diese Aufgabe nicht bewältigen, obwohl sie SmolVLA und ACT trainieren kann.
  • Der Datensatz muss LeRobot v2 (v2.0 oder v2.1) plus eine GR00T-spezifische meta/modality.json sein. Ein LeRobot v3.0 Datensatz wird nicht geladen und muss konvertiert werden.
  • Der Einstiegspunkt ist gr00t/experiment/launch_finetune.py, ein tyro CLI. Es hat kein --seed Flag, daher sind die Läufe nicht bit-für-bit reproduzierbar.
  • Für einen benutzerdefinierten Arm ist das Embodiment-Tag NEW_EMBODIMENT, und dieses Tag macht --modality-config-path obligatorisch.
  • Das mitgelieferte SO-100-Rezept prognostiziert Armgelenke als RELATIVE Deltas und den Greifer als ABSOLUTES Ziel. Diese Paarung zu vertauschen, ist ein stiller Fehler, keine Fehlermeldung.
  • Auf AY-Robots ist dieselbe Aufgabe ein Formular: 20000 Schritte, Batch 32, Lernrate 1e-4, ungefähr 4 bis 12 USD auf dem A100 80 GB oder H100 Tier.

Was GR00T N1.7 tatsächlich ist

GR00T N1.7 ist ein Vision-Sprach-Aktionsmodell mit dem Dualsystem-Layout, das im ursprünglichen GR00T N1 Paper: einem Vision-Sprach-Modul, das die Kameras und die Anweisung liest, und einem Diffusionstransformer, der dies in einen Block kontinuierlicher Motorbefehle umwandelt. N1.7 ersetzte die erste Hälfte. Das Eagle-Backbone von N1.6 ist verschwunden und wurde ersetzt durch nvidia/Cosmos-Reason2-2B auf einer Qwen3-VL-Architektur, und das Modell wurde auf Basis von etwa 20.000 Stunden egozentrischem menschlichem Video zusätzlich zu den Robotikdaten vortrainiert. NVIDIAs eigene Beschreibung beziffert die Zahl auf 20.854 Stunden und berichtet, dass der Übergang von 1.000 auf 20.000 Stunden die durchschnittliche Aufgabenerfüllung mehr als verdoppelt.

Auch die zweite Hälfte änderte sich, und zwar auf Weisen, die für Ihren Lauf relevant sind. Der Aktionskopf reduzierte sich von 32 Diffusionsschichten auf 16, der vorhergesagte Aktions-Chunk wuchs von 16 Schritten auf 40, und die maximale Zustands- und Aktionsbreite stieg von 29 auf 132. Diese drei Zahlen stammen aus dem Changelog im Repository-README; NVIDIAs eigener Launch-Post beschreibt System 1 immer noch als 32-Schichten-DiT, daher sollten Sie, wo die beiden nicht übereinstimmen, dem Repository vertrauen, das Sie klonen werden. Aktionen werden standardmäßig in einem relativen Endeffektor Raum ausgedrückt, als Deltas von der aktuellen Pose statt als absolute Ziele, was überhaupt erst ermöglicht, dass aus menschlichen Videos gelernte Manipulations-Priors in die Robotersteuerung übertragen werden können. Der Kopf selbst ist ein Flow-Matching Diffusionstransformer, derselben Familie wie Pi0.5, aber mit einem anderen Backbone davor. Wenn Sie noch die vorherige Generation verwenden, N1.7 gegenüber N1.5 behandelt, ob das Upgrade eine Neugestaltung Ihrer Pipeline rechtfertigt.

EigenschaftWertQuelle
Parameter3,000,000,000Hugging Face Modellkarte
Vision-Sprach-Backbonenvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging FaceRepo README
AktionskopfFlow-Matching Diffusionstransformer, 16 Schichten (N1.6 hatte 32)Repo README
Vorhergesagter Aktionshorizont40 steps for the base checkpoint (N1.6 had 16)getting_started/policy.md und Repo README
Maximale Zustands- und Aktionsbreite132 (N1.6 hatte 29)Repo README
Code-LizenzApache 2.0Isaac-GR00T Repository
Gewichts-LizenzNVIDIA Open Model License AgreementModellkarte
Latenz, H100 80 GB, PyTorch eager, 4 Denoising-Schritte, 1 Kamera85.8 ms end to end, 11.7 HzModellkarten-Timing-Tabelle
Gleiche Hardware, TensorRT vollständige Pipeline27.9 ms end to end, 35.9 HzModellkarten-Timing-Tabelle
Latenz, die AY-Robots für sein bereitgestelltes GR00T N1.7 angibt152 ms per action stepAY-Robots Policy-Katalog

Diese letzten drei Zeilen erklären den Großteil der Enttäuschung, die Menschen berichten. Die Schlagzeile von 27.9 ms bezieht sich auf eine TensorRT-Engine auf einer H100 mit einer Kamera und vier Denoising-Schritten. Reines PyTorch auf derselben Karte beträgt 85.8 ms, und die Modellkarte beziffert den Unterschied auf das 3.08-fache. Keine der Zahlen beinhaltet eine Serving-Schicht, eine zweite Kamera oder einen Netzwerk-Hop. Die 152 ms pro Aktionsschritt, die AY-Robots für sein bereitgestelltes GR00T N1.7 angibt, ist der Wert mit Serving im Loop, und eine Roundtrip-Zeit über das öffentliche Internet kommt noch hinzu. Mehr dazu am Ende. Für die Zahlen im Vergleich zu anderen Modellen, GR00T N1.7 gegenüber Pi0.5 und GR00T N1.7 gegenüber SmolVLA legen sie nebeneinander dar.

Die AY-Robots Modellseite für GR00T N1.7 zeigt die Parameteranzahl, GPU-Klasse, Inferenzlatenz sowie die angegebenen Stärken und Grenzen des Modells.
Die Seite /policies/groot-n1-7 enthält denselben Spezifikationsstreifen, den Sie sonst manuell aus der Modellkarte und der Repo-README zusammenstellen würden.

Was der Lauf benötigt, bevor Sie etwas eingeben

AnforderungFeinabstimmungInferenz
VRAM, NVIDIA-Empfehlung40 GB oder mehr, H100 oder L40 empfohlen16 GB oder mehr, eine RTX 4090 funktioniert
Python und CUDA auf dGPU3.12 and CUDA 12.83.12 and CUDA 12.8
Video-Backendtorchcodec 0.8.0, FFmpeg 4 to 7 onlydasselbe
DatensatzformatLeRobot v2 plus meta/modality.jsonnicht zutreffend
Hugging Face-Zugriffgenehmigt für nvidia/Cosmos-Reason2-2Bdasselbe
Weitere Toolsgit-lfs and uvuv
AY-Robots GPU-Klasse für den groot1.7 TrainerA100 80 GB or H100 80 GBPod automatisch bereitgestellt
Das geschützte Backbone wird Sie beim ersten Lauf aufhalten

Jeder GR00T-Checkpoint, einschließlich des Basis-nvidia/GR00T-N1.7-3B, lädt bei der ersten Verwendung nvidia/Cosmos-Reason2-2B, und dieses Repository ist geschützt. Die README beschreibt den Fehler genau: Das Laden des Modells schlägt mit einem GatedRepoError / 401 Client Error fehl. Was nicht erwähnt wird, ist, wann dies geschieht, nämlich nachdem Sie die Karte gemietet und der Lauf gestartet wurde. Fordern Sie den Zugriff auf der Modellseite an und führen Sie dann uv run huggingface-cli login aus oder exportieren Sie HF_TOKEN, bevor Sie etwas mieten.

Schritt 0: Die Episoden selbst

Alles unten geht davon aus, dass Sie bereits Episoden aufgezeichnet haben. Falls nicht, ist das der eigentliche erste Schritt und derjenige, der entscheidet, wie gut das Ergebnis sein kann, denn Imitationslernen kann keine Informationen wiederherstellen, die nicht in den Daten enthalten sind. Kalibrieren Sie zuerst beide Arme und steuern Sie dann den Follower mit einem Leader-Arm während lerobot-record die Parquet-Dateien und die Kamerastreams schreibt. Wenn die Kalibrierung nicht stimmt, beschreiben die Gelenkwerte in Ihrem Datensatz einen leicht anderen Roboter als den, der später die Policy ausführen wird, und kein Training kann das beheben.

bash
lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower_arm \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_leader_arm \
    --dataset.repo_id=${HF_USER}/cube-into-bowl \
    --dataset.num_episodes=60 \
    --dataset.single_task="put the cube in the yellow bowl" \
    --display_data=true
lerobot-record auf einem aktuellen LeRobot. Die Episodenlänge beträgt standardmäßig 60 s und die Reset-Zeit 60 s. so100_follower und so101_follower sind beide gegen dieselbe LeRobot-Konfigurationsklasse registriert, weshalb das Isaac-GR00T SO100 Beispiel die so101-Namen verwendet; beide funktionieren auf einem SO-100. Die hier gewählten Kameranamen (front, wrist) sind die Namen, die in modality.json wieder auftauchen müssen.

LeRobots eigener Rat ist, mindestens 50 Episoden mit etwa 10 pro Objektposition aufzuzeichnen, die Kameras fixiert zu lassen und das Greifverhalten konsistent zu halten. Fügen Sie Variationen später hinzu, nicht am Anfang. Die Faustregel, die man sich merken sollte: Wenn Sie die Aufgabe nicht selbst nur anhand der Kamerabilder erledigen könnten, kann die Policy es auch nicht. Für die armspezifische Einrichtung decken SO-100 Erste Schritte und die SO-100 LeRobot Seite Ports, Kalibrierung und Kamera-Indizes ab. Auf AY-Robots können Sie dies auch über das Internet vom Browser aus mit Teleoperation tun und direkt aus der Sitzung aufzeichnen.

Schritt 1: Das Dataset muss LeRobot v2.1 sein

Dies ist die häufigste Hürde. Die aktuelle CODEBASE_VERSION von LeRobot auf main ist v3.0, sodass alles, was Sie heute mit einer aktuellen Toolchain aufzeichnen, als v3.0 ausgegeben wird. Der Loader von GR00T erwartet v2. Das Repository erklärt explizit den Grund: Viele Upstream-Datasets wie DROID, LIBERO und Bridge werden in v2 veröffentlicht, und die native Unterstützung für beide ist geplant, aber noch nicht implementiert. Die Konvertierung liegt also bei Ihnen, und sie läuft aus einem konkreten Grund in einer eigenen virtuellen Umgebung: scripts/lerobot_conversion enthält ein eigenes pyproject, das Python 3.10 oder 3.11 erfordert und lerobot an einen bestimmten Git-Commit bindet, während Isaac-GR00T selbst Python 3.12 benötigt. Installieren Sie den Konverter aus dem Repository-Root und Sie erhalten stattdessen das gr00t Paket, was der Fehler ist, vor dem die README warnt. Wenn Sie neu in diesem Format sind, erklärt der LeRobot-Dataset Glossareintrag, was sich tatsächlich darin befindet.

bash
# from the Isaac-GR00T repo root
cd scripts/lerobot_conversion
uv venv
source .venv/bin/activate
uv pip install -e . --verbose

# pulls the dataset from the Hub and writes a v2.1 copy into the default cache
python convert_v3_to_v2.py --repo-id <your-hf-user>/<your-dataset>

# or, back in the repo root, keep it next to the SO-100 example
uv run --project scripts/lerobot_conversion \
  python scripts/lerobot_conversion/convert_v3_to_v2.py \
  --repo-id <your-hf-user>/<your-dataset> \
  --root examples/SO100/my_dataset_lerobot
Der Konverter akzeptiert --repo-id, ein optionales --root und --force-conversion, das alle vorhandenen lokalen Snapshots löscht und neu herunterlädt. Er schreibt codebase_version: v2.1 in meta/info.json.
Die Konvertierung überschreibt direkt

Wenn das v3.0-Dataset bereits lokal existiert, erstellt das Skript das v2.1-Layout daneben und tauscht dann aus: Das Original wird in einen Geschwisterordner mit angehängter Version, <name>_v3.0, verschoben, und die konvertierte Kopie übernimmt den ursprünglichen Pfad. (Der Docstring des Skripts nennt diesen Ordner _v30; der Code hängt die Versionszeichenfolge an, sodass Sie tatsächlich _v3.0 erhalten.) Zweite Überraschung: Die Ausgabe landet immer unter <root>/<repo-id>, sodass --root examples/SO100/my_dataset_lerobot Ihnen examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset> liefert, und dieser längere Pfad ist der, den --dataset-path später benötigt. Wenn ein Trainingsjob Ihr Dataset aus Versionsgründen ablehnt, listet die Seite 'Dataset als v3 abgelehnt' die genauen Symptome auf.

Die Struktur, die GR00T nach der Konvertierung erwartet, ist das klassische v2-Layout: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, Parquet-Dateien unter data/chunk-000/, MP4-Dateien unter videos/chunk-000/observation.images./, und eine zusätzliche Datei, die das Standard-LeRobot nicht hat. In dieser zusätzlichen Datei liegen die meisten der verbleibenden Fehler.

Schritt 2: modality.json, die sechs Zahlen, die alles entscheiden

In einem LeRobot-Datensatz werden der Roboterzustand und die Aktion als flache float32-Arrays gespeichert. Für einen SO-100 haben beide die Form [6]: fünf Armgelenke und ein Greifer. Der Demo-Datensatz benennt sie shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, aber diese Namen befinden sich in info.json und nichts in der Parquet-Datei gibt an, welcher Index welcher ist. meta/modality.json liefert diese Zuordnung, und GR00T wird ohne sie nicht trainieren. Hier ist die, die das Repository für den SO-100 liefert, wörtlich.

json
{
  "state": {
    "single_arm": {
      "start": 0,
      "end": 5
    },
    "gripper": {
      "start": 5,
      "end": 6
    }
  },
  "action": {
    "single_arm": {
      "start": 0,
      "end": 5
    },
    "gripper": {
      "start": 5,
      "end": 6
    }
  },
  "video": {
    "front": {
      "original_key": "observation.images.front"
    },
    "wrist": {
      "original_key": "observation.images.wrist"
    }
  },
  "annotation": {
    "human.task_description": {
      "original_key": "task_index"
    }
  }
}
examples/SO100/modality.json. Indizes sind nullbasiert und folgen dem Python-Slicing, daher ist single_arm [0:5] und gripper ist [5:6].

Kopieren Sie sie in Ihr konvertiertes Dataset unter meta/modality.json und benennen Sie die Video-Schlüssel um, wie Ihre Kameras tatsächlich heißen. Wenn Sie mit einer einzelnen Überkopfkamera namens top aufgenommen haben, dann ist original_key observation.images.top und der Anzeigename ist das, worauf Ihre Datenkonfiguration verweisen wird. Die beiden müssen übereinstimmen, und keiner von beiden überprüft den anderen für Sie. Die Sprachannotation ist schlimmer, da derselbe Schlüssel an drei Stellen erscheinen muss.

EbeneDateiSO-100-Formular, das im Repo verwendet wird
Parquet-Spaltedata/chunk-*/episode_*.parquetannotation.human.task_description
modality.json-Schlüsselmeta/modality.json, unter "annotation", ohne das annotation.-Präfixhuman.task_description
modality_keys in der Datenkonfigurationyour so100_config.pyannotation.human.task_description
Warum der Sprachschlüssel Probleme bereitet

Die Segmente nach annotation. werden von demjenigen gewählt, der das Dataset erstellt hat. Die SO-100-Demodaten verwenden annotation.human.task_description; LIBERO und SimplerEnv verwenden annotation.human.action.task_description. Beide sind gültig. Wenn Sie eine Konfiguration aus einem LIBERO-Beispiel kopiert und auf Ihre eigene SO-100-Aufnahme verwiesen haben, löst der Sprachkanal nichts auf und das Modell trainiert mit einer leeren Anweisung. Der Verlust sinkt trotzdem. Die Policy tut immer noch etwas. Sie ignoriert nur, was Sie ihr gesagt haben.

Schritt 3: die Datenkonfiguration, relativer Arm und absoluter Greifer

Die Modalitätskonfiguration ist eine Python-Datei und kein JSON, da sie auch entscheidet, wie jede Aktionsgruppe dargestellt wird. Dies ist der Teil des N1.7-Workflows, der in N1.5 in dieser Form nicht existierte, und der Teil, der es wert ist, zweimal gelesen zu werden. Die ausgelieferte SO-100-Konfiguration prognostiziert die fünf Armgelenke als RELATIVE Deltas vom aktuellen Zustand und den Greifer als eine ABSOLUTE Zielposition, da sich ein binäres Offen-oder-Geschlossen-Signal besser als Ziel denn als Delta verhält.

python
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,
)

so100_config = {
    "video": ModalityConfig(
        delta_indices=[0],                       # current frame only
        modality_keys=["front", "wrist"],        # must match modality.json
    ),
    "state": ModalityConfig(
        delta_indices=[0],
        modality_keys=["single_arm", "gripper"],
    ),
    "action": ModalityConfig(
        delta_indices=list(range(0, 16)),        # predict 16 future steps
        modality_keys=["single_arm", "gripper"],
        action_configs=[
            ActionConfig(rep=ActionRepresentation.RELATIVE,   # arm joints
                         type=ActionType.NON_EEF,
                         format=ActionFormat.DEFAULT),
            ActionConfig(rep=ActionRepresentation.ABSOLUTE,   # gripper
                         type=ActionType.NON_EEF,
                         format=ActionFormat.DEFAULT),
        ],
    ),
    "language": ModalityConfig(
        delta_indices=[0],
        modality_keys=["annotation.human.task_description"],
    ),
}

register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)
examples/SO100/so100_config.py, auf das Wesentliche gekürzt. NON_EEF bedeutet Gelenkraum; EEF würde einen neundimensionalen Vektor aus x, y, z plus einer 6D-Rotation erwarten.

Zwei Details hier werden Sie einen Tag kosten, wenn Sie sie nicht kennen. Erstens, action_configs ist positionsabhängig: Die Dokumentation erfordert die gleiche Länge und die gleiche Reihenfolge wie modality_keys, und sie ist unmissverständlich bezüglich der Konsequenz eines Fehlers, nämlich dass die falsche Darstellung stillschweigend angewendet wird. Ihr Greifer wird als Delta und Ihr Arm als absolutes Ziel trainiert, und es gibt keine Fehlermeldung. Zweitens, register_modality_config stellt sicher, dass der Tag nicht bereits registriert ist, sodass eine zweite NEW_EMBODIMENT-Konfiguration im selben Python-Prozess mit Embodiment tag ... already registered stirbt. Sie können nicht zwei davon in ein Skript importieren. Eine dritte Regel wird später, bei der Bereitstellung, erzwungen: die Aktion delta_indices muss der zusammenhängende Bereich sein, der bei Null beginnt. Ein spärliches Fenster wie [0, 4, 8] wird abgelehnt, da alles nachgelagerte den vorhergesagten Block linear indiziert und sonst die falschen Zeilen ausführen würde.

Ändern Sie delta_indices und Sie müssen die Statistiken neu generieren

Normalisierungsstatistiken, insbesondere meta/relative_stats.json, werden für die Horizontlänge berechnet, die Sie beim Generieren hatten. Verkürzen Sie den Aktionshorizont von 16 auf 8, ohne neu zu generieren, und das Training stirbt mit IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. Die Lösung ist ein Befehl: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Führen Sie ihn nach jeder Änderung an delta_indices aus.

Schritt 4: die Umgebung

N1.7 hat das Repository nach und Python 3.12 verschoben. Der alte Pfad mit conda plus pip install -e . existiert noch in einem ausgeklappten Abschnitt der README, warnt aber davor, dass GPU-Abhängigkeiten wie flash-attn und TensorRT möglicherweise manuell installiert werden müssen. Verwenden Sie uv, es sei denn, Sie haben einen bestimmten Grund, dies nicht zu tun. Was flash-attn betrifft, so erspart ein Detail Verwirrung: Sie werden bei jedem uv run die Meldung Installing flash-attn sehen. Es wird nicht neu gebaut. uv validiert ein URL-gebundenes Wheel neu, das bereits im Cache liegt, und das dauert zwei oder drei Sekunden.

  1. 1
    git-lfs installieren, dann mit Submodulen klonen

    git-lfs ist erforderlich, nicht optional. Ohne es werden die Parquet-Dateien in demo_data/ als Zeiger-Stubs heruntergeladen, und der Demo-Lauf schlägt bei einem Datensatz fehl, der in der Dateiliste vorhanden zu sein scheint.

    bash
    sudo apt install git-lfs && git lfs install
    git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
  2. 2
    uv installieren und die Umgebung synchronisieren

    Die Standardinstallation zieht die GPU-Abhängigkeiten einschließlich flash-attn und TensorRT. Auf einem frischen A100- oder H100-Image ist dies der längste einzelne Schritt, also erledigen Sie ihn, bevor Sie sich um etwas anderes kümmern.

    bash
    curl -LsSf https://astral.sh/uv/install.sh | sh
    sudo apt-get update && sudo apt-get install -y ffmpeg
    uv sync --python 3.12
    uv run python -c "import gr00t; print('GR00T installed successfully')"
  3. 3
    Authentifizierung bei Hugging Face

    Tun Sie dies vor dem ersten Trainingsstart, nicht nachdem es nach acht Minuten fehlschlägt.

    bash
    uv run huggingface-cli login   # or: export HF_TOKEN=<your_token>
  4. 4
    Funktionstest mit den mitgelieferten SO-100 Demo-Daten

    Bevor Sie Ihre eigene Aufnahme anfassen, führen Sie 2000 Schritte auf demo_data/cube_to_bowl_5 aus. Es sind fünf Episoden, es ist schnell erledigt und es beweist die Umgebung und nicht Ihre Daten. Wenn dieser Lauf fehlschlägt, wird nichts, was Sie mit Ihrem Datensatz tun, helfen.

    bash
    CUDA_VISIBLE_DEVICES=0 uv run python \
        gr00t/experiment/launch_finetune.py \
        --base-model-path nvidia/GR00T-N1.7-3B \
        --dataset-path demo_data/cube_to_bowl_5 \
        --embodiment-tag NEW_EMBODIMENT \
        --modality-config-path examples/SO100/so100_config.py \
        --num-gpus 1 \
        --output-dir /tmp/test_finetune \
        --max-steps 2000 \
        --global-batch-size 32 \
        --dataloader-num-workers 4
Zwei Umgebungsfallen, die wie Modellfehler aussehen

FFmpeg 8. torchcodec 0.8.0 unterstützt nur FFmpeg 4 bis 7, und Ubuntu 25.10 und höher liefern Version 8. Der Fehler ist Could not load libtorchcodec, was eher nach einer fehlerhaften Installation als nach einem Versionskonflikt aussieht. Installieren Sie eine ältere Laufzeitumgebung, zum Beispiel conda install -c conda-forge 'ffmpeg<8', und legen Sie deren Bibliotheken auf LD_LIBRARY_PATH ab. CUDA_HOME ist nicht gesetzt. Das Fine-Tuning schlägt sofort fehl. Führen Sie bash scripts/deployment/dgpu/install_deps.sh einmal aus, oder einfach export CUDA_HOME=/usr/local/cuda.

Schritt 5: Der `fine-tune`-Befehl und seine tatsächlichen Standardwerte

Ersetzen Sie den Demo-Datensatz durch Ihren eigenen und fügen Sie die gewünschten Einstellungen hinzu. Unten ist die vollständige Form, die das Repository in seinem eigenen `new-embodiment`-Tutorial verwendet, einschließlich der Augmentierungs- und Checkpointing-Flags, die das kurze README-Beispiel weglässt. Dies ist im engeren Sinne: Der Sprach-Backbone und der visuelle Encoder bleiben eingefroren, und was trainiert wird, sind der Projektor und der Diffusions-Aktionskopf.

bash
export NUM_GPUS=1
CUDA_VISIBLE_DEVICES=0 uv run python \
    gr00t/experiment/launch_finetune.py \
    --base-model-path nvidia/GR00T-N1.7-3B \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --modality-config-path examples/SO100/so100_config.py \
    --num-gpus $NUM_GPUS \
    --output-dir /tmp/so100 \
    --save-total-limit 5 \
    --save-steps 2000 \
    --max-steps 20000 \
    --use-wandb \
    --global-batch-size 32 \
    --color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \
    --dataloader-num-workers 4
Einzelne GPU. Für acht Karten ersetzen Sie den Launcher durch `uv run torchrun --nproc_per_node=8 --master_port=29500` und setzen Sie `--num-gpus 8`. Verwenden Sie `uv run torchrun`, nicht `torchrun` allein, sonst erhalten Sie die falsche Umgebung.
FlagStandardwert in FinetuneConfigFunktion
--global-batch-size64Gesamt-Batch über alle GPUs vor der Gradientenakkumulation. Die mitgelieferten Beispiele verwenden 32.
--learning-rate1e-4Der gleiche Wert, den AY-Robots für seinen `groot1.7`-Trainer sendet.
--max-steps10000Gesamtzahl der Optimiererschritte. Der `examples/finetune.sh`-Wrapper verwendet ebenfalls 10000 als Standardwert.
--gradient-accumulation-steps1Multipliziert den effektiven Batch. Werte über 1 geben eine Warnung aus, die die akkumulierte Größe angibt.
--save-steps and --save-total-limit1000 and 5Checkpoint-Frequenz und wie viele davon behalten werden. Ältere werden gelöscht.
--weight-decay and --warmup-ratio1e-5 and 0.05Wird auch explizit durch `examples/finetune.sh` gesetzt.
--state-dropout-prob0.2 in the CLI, 0.8 in the model configLöscht zufällig den propriozeptiven Zustand während des Trainings. Reduzieren Sie ihn, wenn Ihre Aufgabe stark vom Zustand abhängt.
--tune-llm and --tune-visualFalse and FalseDer Backbone bleibt standardmäßig eingefroren.
--tune-projector and --tune-diffusion-modelTrue and TrueDer Projektor und der Diffusions-Aktionskopf sind das, was tatsächlich trainiert wird.
--use-percentilesTrueNormalisiert mit q01 und q99 anstelle von rohem Minimum und Maximum.
--dataloader-num-workers2Der Loader ist von Grund auf CPU-basiert. Die Beispiele erhöhen diesen Wert auf 4.
--seedexistiert nichtEs gibt kein `--seed`-Flag in diesem CLI.

Die letzte Zeile ist kein Tippfehler. launch_finetune.py ist ein tyro CLI, das aus einer Dataclass generiert wird, und diese Dataclass hat kein Seed-Feld. Die README weist separat auf eine Varianz von 5 bis 6 Prozent zwischen den Läufen hin, die durch nicht-deterministische Bildaugmentation verursacht wird. Zwei Läufe mit identischen Flags werden keine identischen Checkpoints erzeugen, was sehr wichtig ist, wenn man entscheiden will, ob eine Hyperparameteränderung geholfen hat oder ob man Glück hatte. Zum Vergleich: Der eigene Trainer von lerobot verwendet standardmäßig seed 1000, und das LeRobot GR00T Rezept übergibt --seed=42 explizit.

Validierung ist standardmäßig deaktiviert, und das dokumentierte Flag ist in diesem CLI nicht vorhanden

Fine-Tuning-Läufe erfolgen mit eval_strategy="no", sodass es überhaupt keine Validierungs-Verlustkurve gibt. Man erhält nur den Trainingsverlust und nichts anderes. Der Leitfaden für neue Embodiments weist darauf hin, dies mit --eval-strategy steps --eval-steps 500 zu aktivieren, aber dieses Flag existiert nicht in launch_finetune.py: das CLI wird von tyro aus der FinetuneConfig Dataclass generiert, und eval_strategy, eval_steps und eval_batch_size sind stattdessen Felder von TrainingConfig. Ihre Standardwerte dort sind "no", 500 und 2. Um sie zu erreichen, verwenden Sie den vollständigeren Einstiegspunkt gr00t/experiment/launch_train.py, wo das verschachtelte Flag --training.eval-strategy lautet. So oder so sagt ein allein fallender Trainingsverlust sehr wenig über die Generalisierung aus, was genau die Situation ist, die unter Verlust fällt, aber die Policy tut nichts beschrieben wird.

Was ein 20000-Schritte-Lauf kostet

GR00T N1.7 benötigt eine 80-GB-Karte, daher ist die Kostenfrage eng beantwortet. Bei AY-Robots läuft der groot1.7 Trainer auf der A100 80 GB oder H100 80 GB Stufe, wo ein Lauf 3 bis 6 Stunden dauert und 1.20 bis 2.00 USD pro Stunde auf dem Spotmarkt kostet. Das sind ungefähr 4 bis 12 USD für den standardmäßigen 20000-Schritte-Job. Die gleiche Aufgabe auf SmolVLA oder ACT läuft auf einer 24-GB-Karte zu 0.30 bis 0.60 USD pro Stunde und 1 bis 3 USD pro Lauf. Das ist der eigentliche Kompromiss: GR00T kostet pro Versuch etwa viermal so viel, und man kann es nicht auf der 4090 unter dem Schreibtisch ausführen.

ModellGPU-KlasseTypische LaufzeitTypische KostenMindestanzahl Episoden
GR00T N1.7A100 80 GB or H100 80 GB3 to 6 hours4 to 12 USD50
GR00T N1.5A100 80 GB or H100 80 GB3 to 6 hours4 to 12 USD50
Pi0.5A100 80 GB or H100 80 GB3 to 6 hours4 to 12 USD50
SmolVLARTX 4090 or any 24 GB card2 to 5 hours1 to 3 USD30
ACTRTX 4090 or any 24 GB card2 to 5 hours1 to 3 USD50

Das Minimum von 50 Episoden ist eine Untergrenze, kein Ziel. NVIDIAs eigene FAQ ist anspruchsvoller: etwa 100 Trajektorien für ein einfaches Pick-and-Place an einem festen Ort, 500 oder mehr für komplexe oder mehrstufige Szenen und 100 bis 500 für feine Manipulationen. Wenn Sie bei 20 Episoden sitzen, verbringen Sie den Nachmittag mit der Aufnahme statt den Abend mit dem Tuning. Der Leitfaden zur Datenerfassung behandelt, was eine nützliche Episode von einer verschwendeten unterscheidet, nehmen Sie Ihren ersten Datensatz auf ist die Kurzversion, und SO-100 Datenerfassung ist die armspezifische Version.

Der AY-Robots Trainingsleitfaden für GR00T N1.7 auf dem SO-100, der den Spezifikationsstreifen mit GPU-Klasse, erforderlichem Datensatzformat und den Trainer-Standardeinstellungen zeigt
Der Leitfaden /train/groot-n1-7-on-so-100 liefert die Fakten, die Sie sonst von Hand rekonstruieren müssten: GPU-Klasse, Datensatzformat und die genauen Standardwerte, die der Trainer sendet.

Schritt 6: Open-Loop-Evaluierung, bevor Sie den Arm berühren

Legen Sie kein frisches Checkpoint auf einen physischen Arm, um herauszufinden, ob das Training funktioniert hat. Führen Sie zuerst die Open-Loop-Evaluierung durch. Sie spielt eine aufgezeichnete Episode ab, fragt das Modell bei jedem Schritt nach Aktionen und plottet die Vorhersage gegen die Ground Truth mit MSE und MAE. Sie kostet nichts und fängt die Mapping-Fehler aus den Schritten 2 und 3 ab.

bash
uv run python gr00t/eval/open_loop_eval.py \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --model-path /tmp/so100/checkpoint-20000 \
    --traj-ids 0 \
    --execution-horizon 16 \
    --steps 400 \
    --modality-keys single_arm gripper
Plots landen in /tmp/open_loop_eval/traj_<id>.jpeg, es sei denn, Sie übergeben --save-plot-path. Standardwerte: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

Das Repository weigert sich bewusst, ein Ziel-MSE für benutzerdefinierte Daten zu veröffentlichen, und das ist die richtige Entscheidung: Die Zahl hängt von Ihren Aktionseinheiten, Ihrer Aufgabe und Ihrer Dataset-Größe ab, daher bedeutet ein von einem anderen Arm kopierter Schwellenwert nichts. Was aussagekräftig ist, ist der Trend. Hier ist der Referenzlauf, den das Repository auf einer einzelnen H100 mit dem Fünf-Episoden-Demo-Dataset und 2000 Schritten dokumentiert.

CheckpointDurchschnittliches MSE auf Trajektorie 0Durchschnittliches MAE auf Trajektorie 0
50087.55.63
100025.43.30
150013.22.18
200010.01.76

Die Form ist das Signal, nicht die absoluten Werte. Der Fehler sollte stetig fallen, wenn akkumulieren. Im Durchschnitt über alle fünf Trainingsepisoden und nicht nur über Trajektorie 0 erzielte der finale Checkpoint des Repositories ungefähr 7.5 MSE und 1.5 MAE, sodass selbst der Referenzlauf je nachdem, welche Episoden Sie mitteln, unterschiedlich interpretiert wird. Erfassen Sie Ihre eigene Baseline mit dem unveränderten Demo-Befehl, bevor Sie Änderungen an Ihren eigenen Daten vornehmen: Wenn Sie einen bekanntermaßen guten Lauf nicht reproduzieren können, können Sie einen Einrichtungsfehler nicht von einem Datenproblem unterscheiden. Das Repository ordnet auch die häufigsten Symptome den Ursachen zu, und jedes davon ist operativ und kein Modellfehler.

SymptomWahrscheinliche Ursache
MSE flach oder steigend über Checkpoints hinwegLernrate zu niedrig, oder die Daten werden überhaupt nicht geladen. Überprüfen Sie --dataset-path und die Dataloader-Worker.
Vorhersagekurve ist flach oder konstantmodality.json-Schlüssel oder --modality-config-path stimmen nicht überein. Die Aktionsschlüssel sind nicht zugeordnet.
MSE enorm, oder NaN-Verlust während des TrainingsAktions- und Zustandsnormalisierung. Überprüfen Sie meta/stats und stellen Sie sicher, dass die Aktionsbereiche physikalisch plausibel sind.
Gut auf Trajektorie 0, schlecht auf zurückgehaltenen EpisodenDatenknappheit, kein Fehler. Fünf Demo-Episoden können nicht generalisieren.

Der andere Weg: lerobot-train statt Isaac-GR00T

Die aktuelle LeRobot-Version, 0.6.1 auf PyPI seit dem 3. August 2026, bietet eine zweite und ganz andere Möglichkeit, dieselben Basisgewichte zu feinabzustimmen. LeRobot stellt GR00T N1.7 als Richtlinientyp zur Verfügung und trainiert es über seinen eigenen lerobot-train Einstiegspunkt. Zwei Dinge sind hier wichtig. Die LeRobot CLI ist eine Sammlung von Konsolenskripten, daher ist alles, was Sie lesen und das sagt python lerobot/scripts/train.py ist veraltet und wird nicht ausgeführt. Und LeRobot hat die Unterstützung für GR00T N1.5 vollständig entfernt, indem es N1.5-Checkpoints und -Konfigurationen mit einem Migrationshinweis ablehnt. Wenn Sie also N1.5 über LeRobot benötigen, müssen Sie lerobot==0.5.1, die letzte Version, die es unterstützt, veröffentlicht am 7. April 2026, anpinnen.

bash
pip install "lerobot[groot]" "lerobot[training]"
hf auth login

lerobot-train \
  --dataset.repo_id=$HF_USER/$DATASET_NAME \
  --dataset.image_transforms.enable=true \
  --policy.type=groot \
  --policy.device=cuda \
  --policy.base_model_path=nvidia/GR00T-N1.7-3B \
  --policy.embodiment_tag=new_embodiment \
  --policy.chunk_size=16 \
  --policy.n_action_steps=16 \
  --policy.use_relative_actions=true \
  --policy.relative_exclude_joints='["gripper"]' \
  --policy.use_bf16=true \
  --seed=42 \
  --batch_size=64 \
  --steps=20000 \
  --save_freq=5000 \
  --output_dir=$OUTPUT_DIR
Das LeRobot-native GR00T N1.7 Rezept. Beachten Sie relative_exclude_joints: Der Greifer ist von relativen Aktionen ausgeschlossen, was dieselbe Entscheidung ist, die so100_config.py mit ActionRepresentation.ABSOLUTE trifft.
AspektIsaac-GR00T launch_finetune.pylerobot-train --policy.type=groot
LeRobot v2 only, Konvertierung erforderlichNatives LeRobot-Dataset, kein Downgrade
meta/modality.json plus eine Python-Datenkonfigurationkeine modality.json; Verhalten wird durch --policy.* Flags in der Befehlszeile festgelegt
überhaupt kein Seed-Flag--seed, LeRobot Standard 1000
pro-Schlüssel ActionConfig in der Datenkonfiguration--policy.use_relative_actions plus --policy.relative_exclude_joints
SO-100 Open-Loop MSE-Trend auf DemodatenLIBERO Suiten, 96,5 Prozent Durchschnitt über vier Suiten
run_gr00t_server.py plus eval_so100.py über ZMQlerobot-rollout, mit Echtzeit-Chunking (queue_threshold sollte bei oder unter 5 bleiben)
Das Fine-Tuning selbst durchführen
Vorteile
  • Jedes Flag ist sichtbar und änderbar. Sie können den visuellen Encoder entfrieren, state_dropout_prob verschieben oder den Aktionshorizont verkürzen.
  • Die Open-Loop-Plots sind lokale Dateien. Das Diffen von Checkpoint-5000 gegen Checkpoint-20000 ist ein Shell-Befehl.
  • Sie sind nicht davon abhängig, dass eine Plattform online bleibt, und der Checkpoint liegt in einem Standardformat auf Ihrer Festplatte.
  • Die Benchmark-Beispiele des Repos für LIBERO, SimplerEnv und DROID liefern Ihnen bekannte, gute Läufe zur Reproduktion, bevor Sie Ihren eigenen Daten vertrauen.
Kompromisse
  • Die Umgebung ist der größte Teil der Arbeit. FFmpeg-Version, CUDA_HOME, git-lfs, der gated Backbone, torchcodec: Keines davon sind Modellprobleme und jedes einzelne stoppt den Lauf.
  • Die Konvertierung von v3.0 zu v2.1 erfordert eine separate virtuelle Umgebung mit einem eigenen Installationsschritt und überschreibt Ihr Dataset-Verzeichnis direkt.
  • Die GPU-Miete beginnt mit der Abrechnung, wenn Sie mit dem Debugging beginnen, nicht wenn das Training startet, und nichts stoppt die Instanz, wenn der Lauf beendet ist.
  • Kein Seed bedeutet keine bitgenaue Reproduzierbarkeit, zusätzlich zu einer Varianz von 5 bis 6 Prozent von Lauf zu Lauf allein durch Augmentierung.

Zwei Wege, um denselben Checkpoint zu erhalten

Sie mieten die GPU und haben jeden Schritt selbst in der Hand. Realistisch gesehen dauert es beim ersten Mal einen Nachmittag und danach jedes Mal zwanzig Minuten.

  1. Episoden mit lerobot-record auf dem SO-100 aufzeichnen. Sie erhalten einen LeRobot v3.0 Datensatz.
  2. Konvertieren Sie ihn mit scripts/lerobot_conversion/convert_v3_to_v2.py in einer eigenen virtuellen Umgebung auf v2.1.
  3. meta/modality.json und eine Python-Modalitätskonfiguration schreiben, registriert unter EmbodimentTag.NEW_EMBODIMENT.
  4. Eine 80 GB Karte mieten, mit Submodulen klonen, uv sync ausführen, sich bei Hugging Face authentifizieren.
  5. launch_finetune.py ausführen, dann open_loop_eval.py auf mehreren Checkpoints, und den MSE-Trend vergleichen, bevor Hardware angefasst wird.
  6. Den Checkpoint von der Maschine holen, bevor Sie die Instanz zerstören, dann den Serving-Pfad zum Arm aufbauen.
Der Schritt, den jeder vergisst

Kopieren Sie den Checkpoint von der gemieteten Instanz, bevor Sie sie herunterfahren. --save-total-limit 5 bedeutet auch, dass ältere Checkpoints während des Trainings gelöscht werden, sodass der Checkpoint, den Sie bei Schritt 5000 wollten, bei Schritt 20000 möglicherweise nicht mehr existiert.

Die AY-Robots Trainingsmatrix mit fünf Policy-Modellen als Zeilen und vier Roboterarmen als Spalten, wobei jede Zelle auf einen spezifischen Trainingsleitfaden verlinkt
Die /train-Matrix: fünf Modelle gegen vier Arme. Die GR00T N1.7-Zeile deckt auch den SO-101, Koch v1.1 und LeKiwi ab.

Den Checkpoint zurück auf den Arm bringen

Isaac-GR00T verwendet eine Server-Client-Aufteilung über ZMQ. Die Policy läuft auf der GPU, und ein Thin Client auf der Robotermaschine sendet Beobachtungen und empfängt Aktions-Chunks. Das SO-100 Beispiel ist vollständig genug zum Kopieren: Starten Sie run_gr00t_server.py mit Ihrem Checkpoint und --embodiment-tag NEW_EMBODIMENT, dann führen Sie eval_so100.py auf der Roboterseite mit dem seriellen Port, der Roboter-ID, den Kamera-Indizes und der Sprachanweisung aus. Die Kameranamen in diesem Befehl müssen mit den Anzeigenamen aus Ihrer modality.json übereinstimmen, nicht mit den OS-Gerätenummern.

bash
# GPU side
uv run python gr00t/eval/run_gr00t_server.py \
  --model-path /tmp/so100/checkpoint-20000 \
  --embodiment-tag NEW_EMBODIMENT \
  --device cuda:0 \
  --host 0.0.0.0 --port 5555

# robot side, from gr00t/eval/real_robot/SO100
uv run --no-sync python eval_so100.py \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM2 \
  --robot.id=orange_follower \
  --robot.cameras="{ front: {type: opencv, index_or_path: 6, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
  --policy_host=localhost --policy_port=5555 \
  --lang_instruction="put the cube in the yellow bowl"
--execution-horizon steuert, wie viele der vorhergesagten Schritte ausgeführt werden, bevor neu geplant wird. Es muss höchstens der action_horizon der Policy sein, und diese Zahl ist die Länge der action delta_indices in Ihrer Modality-Konfiguration, nicht die des Basismodells. Die ausgelieferte SO-100-Konfiguration prognostiziert 16, also ist 16 Ihre Obergrenze; der Basis-nvidia/GR00T-N1.7-3B-Checkpoint ist für 40 konfiguriert, und policy.md besagt ausdrücklich, dass feinabgestimmte Checkpoints abweichen können. Überschreiten Sie dies, erhalten Sie einen ValueError, der beide Zahlen nennt. 8 ist der Wert, den die Dokumentation für den Echtzeit-Einsatz vorschlägt. Der alte Flag-Name --action-horizon funktioniert immer noch, gibt aber eine Warnung aus.
7.4 V, nicht 12 V

Während Sie den Arm wieder verkabeln: Der SO-100 betreibt Feetech STS3215 Bus-Servos an einer 7.4 V-Schiene. Das Zuführen von 12 V zerstört sie, und es ist ein leichter Fehler, wenn Sie auch einen LeKiwi besitzen, dessen Basis mit 12 V läuft, während sein Arm dies nicht tut. Überprüfen Sie die Stromversorgung vor dem ersten Einschalten, nicht nach dem Rauch. Siehe die SO-100 Hardware-Seite und SO-100 gegen LeKiwi. Wenn der Arm hochfährt, sich aber nichts bewegt, ist Servo reagiert nicht der richtige Ausgangspunkt.

Nun zum ehrlichen Teil, wo die Policy läuft, denn Training und Serving haben unterschiedliche Hardware-Anforderungen. Fine-Tuning benötigt 40 GB oder mehr. Inferenz nicht: Die README gibt 16 GB oder mehr an und nennt explizit die RTX 4090, sodass eine Karte, die Sie bereits besitzen, einen Checkpoint bereitstellen kann, den sie niemals hätte produzieren können. Was entscheidet, ob sich die Policy reaktionsschnell anfühlt, ist nicht der VRAM, sondern wo der Server steht. Bei AY-Robots ist GR00T N1.7 nur in der Cloud verfügbar, sodass der Regelkreis zusätzlich zu den 152 ms pro Aktionsschritt einen Roundtrip über das öffentliche Internet bezahlt, und nur SmolVLA und ACT laufen auch lokal. Für langsames Pick-and-Place ist ein Remote-Pod überlebensfähig. Für alles Reaktive ist er es nicht: Die Policy wird zögerlich auf eine Weise, die genau wie ein Trainingsfehler aussieht und keiner ist. ACT mit 20 ms pro Aktionsschritt ist das Modell, das die engste Schleife toleriert, SmolVLA liegt bei 245 ms, und keine Menge an Latenz-Optimierung macht einen bereits verbrauchten Roundtrip wett. Führen Sie Ihre erste Policy aus führt Sie Schritt für Schritt durch die Serving-Seite.

Was tatsächlich schiefgeht

  • GatedRepoError beim ersten Lauf. Ihnen wurde kein Zugriff auf nvidia/Cosmos-Reason2-2B gewährt, oder Sie haben sich nicht authentifiziert. Dies geschieht, nachdem die GPU-Uhr bereits gestartet wurde.
  • Datensatz beim Laden abgelehnt. Fast immer ein v3.0-Datensatz. Konvertieren Sie ihn herunter. Siehe Datensatz als v3 abgelehnt.
  • IndexError wegen nicht übereinstimmender boolescher Dimensionen. Sie haben delta_indices geändert und die Statistiken nicht neu generiert.
  • Speicherüberlauf bei Batch 32. Reduzieren Sie --global-batch-size und erhöhen Sie --gradient-accumulation-steps, oder reduzieren Sie --num-shards-per-epoch, was die Konfiguration explizit vorschlägt, wenn der VRAM begrenzt ist. Siehe Speicherüberlauf während des Trainings.
  • Verlust fällt, Policy tut nichts. Standardmäßig gibt es keine Validierungsaufteilung, daher beweist eine saubere Trainingskurve sehr wenig. Diese Seite behandelt die Diagnose.
  • Funktioniert in Ihrem Setup und nirgendwo sonst. Erwartet bei einem kleinen Datensatz, der unter einer einzigen Beleuchtungsbedingung gefilmt wurde. NVIDIA empfiehlt Farb-Jitter-Augmentierung plus 20 bis 50 Episoden unter verschiedenen Beleuchtungsbedingungen. Mehr dazu hier.
  • Greifer schließt nie richtig. Überprüfen Sie, ob die Greiferaktion ABSOLUT und die Armgelenke RELATIV sind, in dieser Reihenfolge in action_configs. Greifer schließt nicht listet die anderen Ursachen auf.
  • Eine Kamera fällt während der Aufnahme stillschweigend aus. Die Episode wird trotzdem gespeichert und der Videoschlüssel existiert weiterhin, weshalb dies besonders ärgerlich ist. Kamera nicht erkannt behandelt dies.

Der gesamte Index der Fehlermodi befindet sich unter . Wenn Sie zwischen Modellen wählen, anstatt eines zu debuggen, und enthalten Benchmark-Zahlen mit Quellenangaben, und ist der Vergleich, den die meisten Leute tatsächlich benötigen, da es die Wahl zwischen einem Modell ist, das Sie auf der Karte unter Ihrem Schreibtisch trainieren können, und einem, für das Sie einen 80-GB-Knoten mieten müssen, um es zu feinabzustimmen. Für Hintergrundinformationen, warum diese Modelle sich so verhalten, wie sie es tun, sind die und der zuerst lesenswert. Und wenn Sie noch keinen Arm besitzen, streamt einen physischen SO-100 ohne Anmeldung.

Wie viele Episoden benötige ich, bevor sich das Fine-Tuning von GR00T N1.7 lohnt?

AY-Robots setzt eine Untergrenze von 50 Episoden für den groot1.7-Trainer. NVIDIAs eigene FAQ ist anspruchsvoller: etwa 100 Trajektorien für ein einfaches Pick-and-Place an einem festen Ort, 500 oder mehr für komplexe oder mehrstufige Szenen und 100 bis 500 für feine Manipulationen. Unter 50 ist es fast immer besser, mehr Daten aufzuzeichnen, als Hyperparameter zu optimieren. Wenn der Erfolg danach stagniert, empfiehlt NVIDIA HG-DAgger: Führen Sie die Policy aus, greifen Sie ein, wenn sie fehlschlägt, und fügen Sie diese Korrekturen dem Datensatz hinzu.

Warum lässt sich mein Datensatz nicht laden und wie erkenne ich, welche Version er ist?

Öffnen Sie meta/info.json und lesen Sie codebase_version. LeRobots aktuelle CODEBASE_VERSION auf main ist v3.0, daher ist alles, was mit einer aktuellen Toolchain aufgezeichnet wurde, v3.0, und der GR00T-Loader erwartet v2. Konvertieren Sie mit scripts/lerobot_conversion/convert_v3_to_v2.py aus dem Isaac-GR00T-Repo, das codebase_version: v2.1 in den konvertierten Datensatz schreibt. Das Skript läuft in einer eigenen virtuellen Umgebung, da es eine andere lerobot-Version benötigt, als GR00T festlegt.

Kann ich GR00T N1.7 auf einer RTX 4090 feinabstimmen?

Nein. NVIDIA empfiehlt 40 GB oder mehr VRAM für das Fine-Tuning und nennt H100- oder L40-Knoten; andere Karten funktionieren, dauern aber viel länger. Eine 4090 hat 24 GB. AY-Robots bietet GR00T N1.7 aus demselben Grund nur auf der A100 80 GB und H100 80 GB Stufe an. Inferenz ist eine andere Geschichte: 16 GB reichen aus, um das Modell zu bedienen, sodass eine 4090 eine Policy ausführen kann, die sie nicht trainieren kann. Wenn Sie ein VLA wünschen, das Sie auf 24 GB trainieren können, ist das SmolVLA mit etwa 450 Millionen Parametern oder ACT mit etwa 80 Millionen.

Warum ergeben zwei Läufe mit identischen Flags unterschiedliche Checkpoints?

Weil launch_finetune.py keinen Seed hat. Es ist ein tyro-CLI, das aus einer Datenklasse generiert wird, die kein Seed-Feld enthält, sodass nichts den RNG festlegt. Das Repo weist separat auf eine Varianz von 5 bis 6 Prozent zwischen den Läufen hin, die durch nicht-deterministische Bildaugmentierung verursacht wird. Wenn Reproduzierbarkeit wichtig ist, verwenden Sie stattdessen den LeRobot-Weg: lerobot-train akzeptiert --seed und das veröffentlichte GR00T-Rezept übergibt --seed=42.

Sollte ich Isaac-GR00T oder lerobot-train verwenden?

Verwenden Sie Isaac-GR00T, wenn Sie die Referenzimplementierung, die schlüsselbasierte Kontrolle über die Aktionsdarstellung, den TensorRT-Export oder die Benchmark-Beispiele reproduzieren möchten, bevor Sie Ihren eigenen Daten vertrauen. Verwenden Sie lerobot-train, wenn Ihr Datensatz bereits LeRobot v3.0 ist und Sie ihn lieber nicht konvertieren möchten, wenn Sie einen Seed wünschen oder wenn der Rest Ihres Stacks bereits LeRobot ist. Beide stimmen dieselben nvidia/GR00T-N1.7-3B-Gewichte fein ab. Beachten Sie, dass LeRobot die Unterstützung für GR00T N1.5 vollständig eingestellt hat: N1.5-Checkpoints werden mit einem Migrationshinweis abgelehnt, und Sie müssen lerobot==0.5.1 festlegen, um sie weiterhin verwenden zu können.

Benötige ich wirklich eine Handgelenkkamera zusätzlich zu einer Frontkamera?

Die ausgelieferte SO-100-Konfiguration verwendet beide, und modality.json ordnet Front- und Handgelenk als separate Videoschlüssel zu. Sie können mit einer Kamera trainieren, und die Latenztabelle der Modellkarte wird mit einer Kamera gemessen, aber die Handgelenkansicht liefert der Policy nutzbare Informationen über den Greifer im Moment des Kontakts. Wenn der Greifer in Ihren Rollouts zum falschen Zeitpunkt schließt, ist eine fehlende oder schlecht ausgerichtete Handgelenkkamera eines der ersten Dinge, die Sie überprüfen sollten.

GR00T N1.7 auf Ihrem SO-100 feinabstimmen, ohne zuerst die Umgebung aufzubauen

Wählen Sie Modell, Datensatz und Hyperparameter in einem Formular aus. Das Backend mietet einen A100 80 GB oder H100 auf dem Spotmarkt, führt den Trainer mit Batch 32, Lernrate 1e-4 und 20000 Schritten aus und schreibt Checkpoints in den Objektspeicher. Grob 4 bis 12 USD pro Lauf.

GR00T N1.7 Trainingsanleitung öffnen

Bereit für hochwertige Robotik-Daten?

AY-Robots verbindet Ihre Roboter mit qualifizierten Operatoren weltweit.

Jetzt starten