
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.
| Eigenschaft | Wert | Quelle |
|---|---|---|
| Parameter | 3,000,000,000 | Hugging Face Modellkarte |
| Vision-Sprach-Backbone | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | Repo README |
| Aktionskopf | Flow-Matching Diffusionstransformer, 16 Schichten (N1.6 hatte 32) | Repo README |
| Vorhergesagter Aktionshorizont | 40 steps for the base checkpoint (N1.6 had 16) | getting_started/policy.md und Repo README |
| Maximale Zustands- und Aktionsbreite | 132 (N1.6 hatte 29) | Repo README |
| Code-Lizenz | Apache 2.0 | Isaac-GR00T Repository |
| Gewichts-Lizenz | NVIDIA Open Model License Agreement | Modellkarte |
| Latenz, H100 80 GB, PyTorch eager, 4 Denoising-Schritte, 1 Kamera | 85.8 ms end to end, 11.7 Hz | Modellkarten-Timing-Tabelle |
| Gleiche Hardware, TensorRT vollständige Pipeline | 27.9 ms end to end, 35.9 Hz | Modellkarten-Timing-Tabelle |
| Latenz, die AY-Robots für sein bereitgestelltes GR00T N1.7 angibt | 152 ms per action step | AY-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.

Was der Lauf benötigt, bevor Sie etwas eingeben
| Anforderung | Feinabstimmung | Inferenz |
|---|---|---|
| VRAM, NVIDIA-Empfehlung | 40 GB oder mehr, H100 oder L40 empfohlen | 16 GB oder mehr, eine RTX 4090 funktioniert |
| Python und CUDA auf dGPU | 3.12 and CUDA 12.8 | 3.12 and CUDA 12.8 |
| Video-Backend | torchcodec 0.8.0, FFmpeg 4 to 7 only | dasselbe |
| Datensatzformat | LeRobot v2 plus meta/modality.json | nicht zutreffend |
| Hugging Face-Zugriff | genehmigt für nvidia/Cosmos-Reason2-2B | dasselbe |
| Weitere Tools | git-lfs and uv | uv |
| AY-Robots GPU-Klasse für den groot1.7 Trainer | A100 80 GB or H100 80 GB | Pod automatisch bereitgestellt |
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.
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=trueLeRobots 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.
# 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_lerobotWenn 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.
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.
{
"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"
}
}
}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.
| Ebene | Datei | SO-100-Formular, das im Repo verwendet wird |
|---|---|---|
| Parquet-Spalte | data/chunk-*/episode_*.parquet | annotation.human.task_description |
| modality.json-Schlüssel | meta/modality.json, unter "annotation", ohne das annotation.-Präfix | human.task_description |
| modality_keys in der Datenkonfiguration | your so100_config.py | annotation.human.task_description |
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.
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)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.
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.
- 1git-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.
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2uv 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.
bashcurl -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')" - 3Authentifizierung bei Hugging Face
Tun Sie dies vor dem ersten Trainingsstart, nicht nachdem es nach acht Minuten fehlschlägt.
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4Funktionstest 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.
bashCUDA_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
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.
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| Flag | Standardwert in FinetuneConfig | Funktion |
|---|---|---|
| --global-batch-size | 64 | Gesamt-Batch über alle GPUs vor der Gradientenakkumulation. Die mitgelieferten Beispiele verwenden 32. |
| --learning-rate | 1e-4 | Der gleiche Wert, den AY-Robots für seinen `groot1.7`-Trainer sendet. |
| --max-steps | 10000 | Gesamtzahl der Optimiererschritte. Der `examples/finetune.sh`-Wrapper verwendet ebenfalls 10000 als Standardwert. |
| --gradient-accumulation-steps | 1 | Multipliziert den effektiven Batch. Werte über 1 geben eine Warnung aus, die die akkumulierte Größe angibt. |
| --save-steps and --save-total-limit | 1000 and 5 | Checkpoint-Frequenz und wie viele davon behalten werden. Ältere werden gelöscht. |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | Wird auch explizit durch `examples/finetune.sh` gesetzt. |
| --state-dropout-prob | 0.2 in the CLI, 0.8 in the model config | Lö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-visual | False and False | Der Backbone bleibt standardmäßig eingefroren. |
| --tune-projector and --tune-diffusion-model | True and True | Der Projektor und der Diffusions-Aktionskopf sind das, was tatsächlich trainiert wird. |
| --use-percentiles | True | Normalisiert mit q01 und q99 anstelle von rohem Minimum und Maximum. |
| --dataloader-num-workers | 2 | Der Loader ist von Grund auf CPU-basiert. Die Beispiele erhöhen diesen Wert auf 4. |
| --seed | existiert nicht | Es 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.
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.
| Modell | GPU-Klasse | Typische Laufzeit | Typische Kosten | Mindestanzahl Episoden |
|---|---|---|---|---|
| GR00T N1.7 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| GR00T N1.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| Pi0.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| SmolVLA | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 30 |
| ACT | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 50 |
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.

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.
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 gripperDas 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.
| Checkpoint | Durchschnittliches MSE auf Trajektorie 0 | Durchschnittliches MAE auf Trajektorie 0 |
|---|---|---|
| 500 | 87.5 | 5.63 |
| 1000 | 25.4 | 3.30 |
| 1500 | 13.2 | 2.18 |
| 2000 | 10.0 | 1.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.
| Symptom | Wahrscheinliche Ursache |
|---|---|
| MSE flach oder steigend über Checkpoints hinweg | Lernrate zu niedrig, oder die Daten werden überhaupt nicht geladen. Überprüfen Sie --dataset-path und die Dataloader-Worker. |
| Vorhersagekurve ist flach oder konstant | modality.json-Schlüssel oder --modality-config-path stimmen nicht überein. Die Aktionsschlüssel sind nicht zugeordnet. |
| MSE enorm, oder NaN-Verlust während des Trainings | Aktions- 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 Episoden | Datenknappheit, 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.
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| Aspekt | Isaac-GR00T launch_finetune.py | lerobot-train --policy.type=groot |
|---|---|---|
| LeRobot v2 only, Konvertierung erforderlich | Natives LeRobot-Dataset, kein Downgrade | |
| meta/modality.json plus eine Python-Datenkonfiguration | keine 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 Demodaten | LIBERO Suiten, 96,5 Prozent Durchschnitt über vier Suiten | |
| run_gr00t_server.py plus eval_so100.py über ZMQ | lerobot-rollout, mit Echtzeit-Chunking (queue_threshold sollte bei oder unter 5 bleiben) |
- 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.
- 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.
- Episoden mit lerobot-record auf dem SO-100 aufzeichnen. Sie erhalten einen LeRobot v3.0 Datensatz.
- Konvertieren Sie ihn mit scripts/lerobot_conversion/convert_v3_to_v2.py in einer eigenen virtuellen Umgebung auf v2.1.
- meta/modality.json und eine Python-Modalitätskonfiguration schreiben, registriert unter EmbodimentTag.NEW_EMBODIMENT.
- Eine 80 GB Karte mieten, mit Submodulen klonen, uv sync ausführen, sich bei Hugging Face authentifizieren.
- launch_finetune.py ausführen, dann open_loop_eval.py auf mehreren Checkpoints, und den MSE-Trend vergleichen, bevor Hardware angefasst wird.
- Den Checkpoint von der Maschine holen, bevor Sie die Instanz zerstören, dann den Serving-Pfad zum Arm aufbauen.
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.
Dieselbe Aufgabe als Formular. Sie wählen das Modell und den Datensatz, das Backend mietet eine GPU auf dem Spotmarkt basierend auf dem benötigten VRAM, führt den Trainer aus und schreibt Checkpoints in den Objektspeicher. Der GR00T N1.7 auf SO-100 Leitfaden ist genau diese Kombination; die Trainingsmatrix enthält jede andere Modell- und Armpaarung, einschließlich GR00T N1.7 auf dem SO-101.
| Was der groot1.7 Trainer sendet | Wert |
|---|---|
| Batch-Größe | 32 |
| Lernrate | 1e-4 |
| Max. Schritte | 20000 |
| Gradientenakkumulation | 1, und es wirkt sich auf diesen Trainer aus |
| Zusätzliche Einstellung im Formular | saveSteps |
| Basis-Checkpoint | nvidia/GR00T-N1.7-3B |
| Akzeptiertes Datensatzformat | LeRobot v2.0 or v2.1 |
Der Datensatz kann von einer Hugging Face Repo-ID, von Ihrem eigenen Rechner oder von einer Sitzung stammen, die Sie mit dem Desktop-Client aufgezeichnet haben. Inferenz ist ein separater Schritt: Die Plattform stellt einen Pod bereit, der die Policy bedient, und Ihr lokaler Roboter-Client kommuniziert mit diesem Endpunkt. Pods verfügen über einen Idle-Watchdog und zerstören sich nach einer Leerlaufzeit selbst, sodass ein vergessener Browser-Tab nicht über Nacht Kosten verursacht. Wenn Sie lieber nicht klicken möchten, existieren dieselben Operationen auf der CLI und dem MCP-Server.
GR00T N1.7 und Pi0.5 sind hier nur in der Cloud verfügbar; nur SmolVLA und ACT laufen auch lokal. Die v2.1-Anforderung entfällt ebenfalls nicht, da ein v3.0-Datensatz immer noch konvertiert werden muss, bevor der GR00T-Loader ihn akzeptiert. Und nichts schreibt Ihre modality.json-Semantik für Sie: Wenn Ihre Kameratasten oder Ihr Sprachschlüssel falsch sind, sind sie auf beiden Wegen falsch. Siehe die Trainingsdokumentation, was das Backend für Sie tut und was nicht.

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.
# 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"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 öffnenQuellen
- NVIDIA Isaac-GR00T repository README, N1.7 main branch
- Isaac-GR00T: Fine-tune on Custom Embodiments (NEW_EMBODIMENT)
- Isaac-GR00T: Finetuning Models for the SO100/SO101 Robot
- Isaac-GR00T: Robot Data Preparation Guide, the GR00T LeRobot format
- Isaac-GR00T: modality config and ActionConfig reference
- Isaac-GR00T: Policy API Guide and the embodiment tag list
- Isaac-GR00T: FinetuneConfig dataclass with every CLI default
- Isaac-GR00T: the shared finetune launcher wrapper
- GR00T N1.7 FAQ: data volume, augmentation and deployment
- nvidia/GR00T-N1.7-3B model card, including the inference timing table
- nvidia/Cosmos-Reason2-2B, the gated VLM backbone used by N1.7
- GR00T N1: An Open Foundation Model for Generalist Humanoid Robots
- NVIDIA Isaac GR00T N1.7: Open Reasoning VLA Model for Humanoid Robots
- LeRobot: GR00T Policy, the lerobot-train recipe
- LeRobot: Imitation Learning on Real-World Robots (lerobot-record, lerobot-train)
Bereit für hochwertige Robotik-Daten?
AY-Robots verbindet Ihre Roboter mit qualifizierten Operatoren weltweit.
Jetzt starten