
Ověřený návod pro dolaďování NVIDIA GR00T N1.7 na SO-100 LeRobot datasetu: skutečné flagy, modality.json, požadavek v2.1, co stojí spuštění a úskalí.
NVIDIA dodává příklad jemného doladění přesně pro rameno, které pravděpodobně vlastníte. Uvnitř úložiště Isaac-GR00T je složka s názvem demo_data/cube_to_bowl_5: pět epizod, 4 148 snímků při 30 fps, již zapsaných jako LeRobot v2.1, s odpovídající konfigurací modality pod examples/SO100/. Jeho meta/info.json hlásí robot_type: so101_follower, což je v LeRobot stejná konfigurační třída jako so100_follower. To je skutečně užitečné, protože to znamená, že referenční cesta pro GR00T N1.7 na šest-stupňovém volnosti hobby rameni je udržována lidmi, kteří model napsali. Není to zmenšená humanoidní ukázka, je to stejné rameno.
Špatná zpráva je vzdálenost mezi I recorded 60 episodes a the arm does the task. Existuje asi šest míst, kde tento pipeline selže tiše, spíše než hlasitě, a čtyři z nich se nacházejí v souborech, které většina lidí nikdy neotevře: meta/modality.json, konfigurace dat Pythonu, meta/relative_stats.json, a vlastní řetězec verze datové sady. Tento průvodce provede manuální cestou od začátku do konce se skutečnými příkazy, poté ukáže stejnou úlohu jako formulář na AY-Robots. Vše níže bylo zkontrolováno proti hlavní větvi Isaac-GR00T k 20. srpnu 2026 (řada n1.7-release) a lerobot 0.6.1, publikovanému na PyPI 3. srpna 2026. Upstream se rychle mění, a pokud byl nějaký příznak přejmenován, tento článek to uvádí.
Co potřebujete vědět, než začnete
- •Jemné doladění GR00T N1.7 vyžaduje 40 GB nebo více VRAM. NVIDIA doporučuje uzly H100 nebo L40. 24 GB RTX 4090 tuto práci nezvládne, i když bude trénovat SmolVLA a ACT.
- •Datová sada musí být LeRobot v2 (v2.0 nebo v2.1) plus GR00T-specifický meta/modality.json. Datová sada LeRobot v3.0 se nenačte a musí být převedena na nižší verzi.
- •Vstupním bodem je gr00t/experiment/launch_finetune.py, CLI tyro. Nemá příznak --seed, takže spuštění nejsou bitově reprodukovatelná.
- •Pro vlastní rameno je tag embodiment NEW_EMBODIMENT, a tento tag činí --modality-config-path povinným.
- •Dodávaný recept SO-100 předpovídá klouby ramene jako RELATIVNÍ delty a chapadlo jako ABSOLUTNÍ cíl. Obrácení tohoto párování je tiché selhání, nikoli chyba.
- •Na AY-Robots je stejná úloha formulář: 20000 kroků, dávka 32, rychlost učení 1e-4, zhruba 4 až 12 USD na úrovni A100 80 GB nebo H100.
Co GR00T N1.7 skutečně je
GR00T N1.7 je vizuálně-jazykový akční model s uspořádáním duálního systému popsaným v původním článku GR00T N1: vizuálně-jazykovým modulem, který čte kamery a instrukce, a difuzním transformátorem, který to převádí na blok souvislých motorických příkazů. N1.7 nahradil první polovinu. Původní páteř Eagle z N1.6 byla odstraněna a nahrazena nvidia/Cosmos-Reason2-2B na architektuře Qwen3-VL a model byl předtrénován na přibližně 20 000 hodinách egocentrického lidského videa navíc k datům robota. Vlastní zpráva NVIDIA uvádí číslo 20 854 hodin a uvádí, že přechod z 1k na 20k hodin více než zdvojnásobuje průměrné dokončení úkolu.
Druhá polovina se také změnila, a to způsoby, které jsou důležité pro váš běh. Akční hlava klesla z 32 difuzních vrstev na 16, předpokládaný akční blok se zvětšil z 16 kroků na 40 a maximální šířka stavu a akce se změnila z 29 na 132. Tato tři čísla pocházejí ze záznamu změn v README repozitáře; vlastní spouštěcí příspěvek NVIDIA stále popisuje Systém 1 jako 32vrstvý DiT, takže tam, kde se tyto dva zdroje liší, důvěřujte repozitáři, který se chystáte klonovat. Akce jsou ve výchozím nastavení vyjádřeny v relativním prostoru koncového efektoru, jako delty od aktuální pozice spíše než absolutní cíle, což umožňuje přenos manipulačních priorit naučených z lidského videa do řízení robota. Samotná hlava je difuzní transformátor s flow-matching, stejná rodina jako Pi0.5, ale s jinou páteří před ním. Pokud stále používáte předchozí generaci, N1.7 proti N1.5 pojednává o tom, zda upgrade ospravedlňuje přepracování vašeho pipeline.
| Vlastnost | Hodnota | Zdroj |
|---|---|---|
| Parametry | 3,000,000,000 | Karta modelu Hugging Face |
| Vizuálně-jazyková páteř | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | README repozitáře |
| Akční hlava | Flow-matching diffusion transformer, 16 layers (N1.6 had 32) | README repozitáře |
| Předpokládaný akční horizont | 40 steps for the base checkpoint (N1.6 had 16) | getting_started/policy.md a README repozitáře |
| Maximální šířka stavu a akce | 132 (N1.6 had 29) | README repozitáře |
| Licence kódu | Apache 2.0 | Repozitář Isaac-GR00T |
| Licence vah | NVIDIA Open Model License Agreement | Karta modelu |
| Latence, H100 80 GB, PyTorch eager, 4 kroky denoisingu, 1 kamera | 85.8 ms end to end, 11.7 Hz | Tabulka časování karty modelu |
| Stejný hardware, plný pipeline TensorRT | 27.9 ms end to end, 35.9 Hz | Tabulka časování karty modelu |
| Latence, kterou AY-Robots uvádí pro svůj nasazený GR00T N1.7 | 152 ms per action step | Katalog politik AY-Robots |
Tyto poslední tři řádky vysvětlují většinu zklamání, které lidé uvádějí. Titulních 27.9 ms je engine TensorRT na H100 s jednou kamerou a čtyřmi kroky denoisingu. Čistý PyTorch na stejné kartě je 85.8 ms a karta modelu uvádí rozdíl 3.08x. Ani jedno číslo nezahrnuje obslužnou vrstvu, druhou kameru nebo síťový skok. Hodnota 152 ms na akční krok, kterou AY-Robots uvádí pro svůj nasazený GR00T N1.7, je údaj s obsluhou v cyklu, a k tomu se přidává zpáteční cesta přes veřejný internet. Více o tom na konci. Pro srovnání čísel s jinými modely, GR00T N1.7 proti Pi0.5 a GR00T N1.7 proti SmolVLA je uvádějí vedle sebe.

Co je potřeba pro spuštění, než cokoli napíšete
| Požadavek | Jemné doladění | Inference |
|---|---|---|
| VRAM, doporučení NVIDIA | 40 GB nebo více, doporučeno H100 nebo L40 | 16 GB nebo více, funguje RTX 4090 |
| Python a CUDA na dGPU | 3.12 a CUDA 12.8 | 3.12 a CUDA 12.8 |
| Video backend | torchcodec 0.8.0, pouze FFmpeg 4 až 7 | stejné |
| Formát datové sady | LeRobot v2 plus meta/modality.json | nepoužitelné |
| Přístup k Hugging Face | schváleno pro nvidia/Cosmos-Reason2-2B | stejné |
| Další nástroje | git-lfs a uv | uv |
| Úroveň GPU AY-Robots pro tréninkový model groot1.7 | A100 80 GB nebo H100 80 GB | pod automaticky zřízen |
Každý checkpoint GR00T, včetně základního nvidia/GR00T-N1.7-3B, načítá nvidia/Cosmos-Reason2-2B při prvním použití a tento repozitář je uzavřený. Soubor README přesně uvádí chybu: načítání modelu selže s GatedRepoError / 401 Client Error. Co však nezmiňuje, je, kdy k tomu dojde, což je poté, co si pronajmete kartu a spuštění již začalo. Požádejte o přístup na stránce modelu a poté spusťte uv run huggingface-cli login nebo exportujte HF_TOKEN, než si cokoli pronajmete.
Krok 0: samotné epizody
Vše níže předpokládá, že již máte nahrané epizody. Pokud ne, je to skutečný první krok a je to ten, který rozhoduje o tom, jak dobrý může být výsledek, protože učení napodobováním nemůže obnovit informace, které nejsou v datech. Nejprve zkalibrujte obě ramena, poté ovládejte následovníka pomocí vedoucího ramene zatímco lerobot-record zapisuje soubory parquet a streamy z kamer. Pokud kalibrace je vypnutá, hodnoty kloubů ve vašem datasetu popisují mírně odlišného robota, než ten, který později provede politiku, a žádné množství tréninku to nenapraví.
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=trueVlastní rada LeRobotu je nahrát alespoň 50 epizod, přibližně 10 pro každou polohu objektu, udržovat kamery pevné a zachovat konzistentní chování uchopení. Variace přidávejte později, ne na začátku. Pravidlo, které stojí za to si zapamatovat: pokud byste úkol nedokázali provést sami pouze z obrazů kamer, politika to také nedokáže. Pro nastavení specifické pro rameno, začínáme s SO-100 a stránka SO-100 LeRobot pokrývají porty, kalibraci a indexy kamer. Na AY-Robots to můžete provést také přes internet z prohlížeče pomocí teleoperace a nahrávat přímo ze sezení.
Krok 1: datová sada musí být LeRobot v2.1
Toto je nejčastější překážka. Aktuální CODEBASE_VERSION LeRobota na main je v3.0, takže cokoli, co dnes zaznamenáte s aktuálním toolchainem, bude ve verzi v3.0. Loader GR00T očekává v2. Repozitář jasně vysvětluje proč: mnoho upstreamových datových sad, jako jsou DROID, LIBERO a Bridge, je publikováno ve v2 a nativní podpora pro obě je plánována, ale zatím není dodána. Konverze je tedy na vás a běží ve vlastním virtualenvu z konkrétního důvodu: scripts/lerobot_conversion má svůj vlastní pyproject, který vyžaduje Python 3.10 nebo 3.11 a připíná lerobot k jednomu git commitu, zatímco Isaac-GR00T sám vyžaduje Python 3.12. Nainstalujte konvertor z kořenového adresáře repozitáře a místo toho získáte balíček gr00t, což je chyba, před kterou varuje jeho README. Pokud jste v tomto formátu noví, datová sada LeRobot v glosáři vysvětluje, co se v ní skutečně nachází.
# 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_lerobotPokud datová sada v3.0 již existuje lokálně, skript vytvoří rozložení v2.1 vedle ní a poté provede výměnu: originál se přesune do sourozenecké složky s připojenou verzí, <name>_v3.0, a převedená kopie zaujme původní cestu. (Docstring samotného skriptu nazývá tuto složku _v30; kód připojuje řetězec verze, takže ve skutečnosti získáte _v3.0.) Druhé překvapení: výstup vždy skončí pod <root>/<repo-id>, takže --root examples/SO100/my_dataset_lerobot vám dá examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset>, a tato delší cesta je ta, kterou později vyžaduje --dataset-path. Když tréninková úloha odmítne vaši datovou sadu z důvodů verze, stránka o odmítnutí datové sady jako v3 uvádí přesné příznaky.
Struktura, kterou GR00T po konverzi vyžaduje, je klasické rozložení v2: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, soubory parquet pod data/chunk-000/, soubory MP4 pod videos/chunk-000/observation.images.
Krok 2: modality.json, šest čísel, která rozhodují o všem
V datové sadě LeRobot jsou stav robota a akce uloženy jako plochá pole float32. Pro SO-100 mají obě tvar [6]: pět kloubů ramene a chapadlo. Demo datová sada je pojmenovává shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, ale tato jména jsou v info.json a nic v souboru parquet neříká, který index je který. meta/modality.json poskytuje toto mapování a GR00T bez něj nebude trénovat. Zde je ten, který repozitář dodává pro SO-100, doslovně.
{
"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"
}
}
}Zkopírujte jej do svého převedeného datasetu na meta/modality.json a přejmenujte klíče videí na skutečné názvy vašich kamer. Pokud jste nahrávali s jedinou stropní kamerou s názvem top, pak original_key je observation.images.top a uživatelsky přívětivý název je ten, na který se bude odkazovat vaše datová konfigurace. Tyto dva názvy se musí shodovat a ani jeden z nich nekontroluje ten druhý za vás. Jazyková anotace je horší, protože stejný klíč se musí objevit na třech místech.
| Vrstva | Soubor | Formát SO-100 použitý v repozitáři |
|---|---|---|
| Sloupec Parquet | data/chunk-*/episode_*.parquet | annotation.human.task_description |
| Klíč modality.json | meta/modality.json, under "annotation", without the annotation. prefix | human.task_description |
| modality_keys v datové konfiguraci | your so100_config.py | annotation.human.task_description |
Segmenty za annotation. jsou zvoleny autorem datasetu. Demo data SO-100 používají annotation.human.task_description; LIBERO a SimplerEnv používají annotation.human.action.task_description. Oba jsou platné. Pokud jste zkopírovali konfiguraci z příkladu LIBERO a nasměrovali ji na vlastní nahrávku SO-100, jazykový kanál se vyřeší na nic a model se trénuje na prázdnou instrukci. Ztráta stále klesá. Politika stále něco dělá. Jen ignoruje, co jste jí řekli, aby udělala.
Krok 3: konfigurace dat, relativní rameno a absolutní chapadlo
Konfigurace modality je soubor Pythonu spíše než JSON, protože také rozhoduje o tom, jak je reprezentována každá akční skupina. Toto je část pracovního postupu N1.7, která v N1.5 v této podobě neexistovala, a část, kterou stojí za to si přečíst dvakrát. Dodávaná konfigurace SO-100 předpovídá pět kloubů paže jako RELATIVNÍ delty z aktuálního stavu a chapadlo jako ABSOLUTNÍ cílovou pozici, protože binární signál otevřeno/zavřeno se chová lépe jako cíl než jako delta.
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)Dva detaily zde vás budou stát den, pokud je neznáte. Zaprvé, action_configs je poziční: dokumentace vyžaduje stejnou délku a stejné pořadí jako modality_keys, a jsou nekompromisní ohledně důsledků chyby, což je tiché použití špatné reprezentace. Vaše chapadlo se trénuje jako delta a vaše paže jako absolutní cíl, a bez chybové zprávy. Zadruhé, register_modality_config tvrdí, že tag není již registrován, takže druhá konfigurace NEW_EMBODIMENT ve stejném procesu Pythonu selže s Embodiment tag ... already registered. Nemůžete importovat dvě z těchto konfigurací do jednoho skriptu. Třetí pravidlo je vynuceno později, při nasazení: akční delta_indices musí být souvislý rozsah začínající nulou. Řídké okno jako [0, 4, 8] je odmítnuto, protože vše navazující indexuje předpovězený blok lineárně a jinak by provedlo špatné řádky.
Normalizační statistiky, zejména meta/relative_stats.json, jsou vypočítány pro délku horizontu, kterou jste měli při jejich generování. Zkrátíte-li akční horizont z 16 na 8 bez opětovného generování, trénink selže s IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. Oprava je jeden příkaz: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Spusťte jej po jakékoli změně delta_indices.
Krok 4: prostředí
N1.7 přesunul repozitář na a Python 3.12. Stará cesta přes conda plus pip install -e . stále existuje ve sbalené sekci README, ale upozorňuje, že závislosti GPU včetně flash-attn a TensorRT mohou vyžadovat ruční instalaci. Použijte uv, pokud nemáte konkrétní důvod to nedělat. Co se týče flash-attn, jeden detail zabrání zmatkům: uvidíte Installing flash-attn vytištěno při každém uv run. Neprobíhá opětovné sestavování. uv znovu ověřuje wheel připnutý k URL, který je již v mezipaměti, a trvá to dvě nebo tři sekundy.
- 1Nainstalujte git-lfs, poté klonujte se submoduly
git-lfs je povinný, nikoli volitelný. Bez něj se soubory parquet v demo_data/ stáhnou jako zástupné ukazatele a demo běh selže na datové sadě, která se ve výpisu souborů jeví jako přítomná.
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2Nainstalujte uv a synchronizujte prostředí
Výchozí instalace stáhne závislosti GPU včetně flash-attn a TensorRT. Na čistém obraze A100 nebo H100 je to nejdelší jednotlivý krok, takže jej proveďte, než se začnete věnovat čemukoli jinému.
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')" - 3Ověření proti Hugging Face
Udělejte to před prvním spuštěním tréninku, ne až poté, co selže po osmi minutách.
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4Kontrola funkčnosti na dodaných demo datech SO-100
Než se dotknete vlastního záznamu, spusťte 2000 kroků na demo_data/cube_to_bowl_5. Je to pět epizod, dokončí se rychle a prokáže prostředí spíše než vaše data. Pokud tento běh selže, nic, co uděláte se svou datovou sadou, nepomůže.
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 podporuje pouze FFmpeg 4 až 7 a Ubuntu 25.10 a novější dodávají verzi 8. Chyba je Could not load libtorchcodec, což vypadá spíše jako poškozená instalace než konflikt verzí. Nainstalujte starší runtime, například conda install -c conda-forge 'ffmpeg<8', a umístěte jeho knihovny do LD_LIBRARY_PATH. CUDA_HOME není nastaveno. Jemné doladění zcela selže. Spusťte bash scripts/deployment/dgpu/install_deps.sh jednou, nebo jen export CUDA_HOME=/usr/local/cuda.
Krok 5: příkaz pro jemné doladění a jaké jsou skutečné výchozí hodnoty jeho příznaků
Vyměňte demo datovou sadu za svou vlastní a přidejte ovládací prvky, které skutečně chcete. Níže je uvedena úplná forma, kterou repozitář používá ve svém vlastním tutoriálu pro nové ztělesnění, včetně příznaků pro augmentaci a ukládání kontrolních bodů, které krátký příklad v README vynechává. Toto je v užším smyslu: jazyková páteř a vizuální kodér zůstávají zmrazené a trénuje se projektor a difuzní akční hlava.
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| Příznak | Výchozí hodnota v FinetuneConfig | Co dělá |
|---|---|---|
| --global-batch-size | 64 | Celková dávka napříč všemi GPU před akumulací gradientu. Dodávané příklady používají 32. |
| --learning-rate | 1e-4 | Stejná hodnota, kterou AY-Robots posílá pro svůj tréninkový model groot1.7. |
| --max-steps | 10000 | Celkový počet kroků optimalizátoru. Wrapper examples/finetune.sh má také výchozí hodnotu 10000. |
| --gradient-accumulation-steps | 1 | Násobí efektivní dávku. Hodnoty nad 1 vydají varování o akumulované velikosti. |
| --save-steps and --save-total-limit | 1000 and 5 | Frekvence kontrolních bodů a kolik jich je uchováno. Starší jsou smazány. |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | Nastaveno explicitně také souborem examples/finetune.sh. |
| --state-dropout-prob | 0.2 in the CLI, 0.8 in the model config | Náhodně vynechává proprioceptivní stav během tréninku. Snižte ji, pokud váš úkol závisí na stavu. |
| --tune-llm and --tune-visual | False and False | Páteř zůstává ve výchozím nastavení zmrazená. |
| --tune-projector and --tune-diffusion-model | True and True | Projektor a difuzní akční hlava jsou to, co se skutečně trénuje. |
| --use-percentiles | True | Normalizuje pomocí q01 a q99 namísto syrových minim a maxim. |
| --dataloader-num-workers | 2 | Načítání je navrženo jako CPU-založené. Příklady to zvyšují na 4. |
| --seed | does not exist | Na tomto CLI neexistuje příznak pro seed. |
Ten poslední řádek není překlep. launch_finetune.py je CLI nástroj tyro vygenerovaný z datové třídy a tato datová třída nemá pole pro seed. Soubor README samostatně uvádí 5 až 6 procentní odchylku mezi spuštěními způsobenou nedeterministickou augmentací obrazu. Dvě spuštění se stejnými příznaky nebudou produkovat identické kontrolní body, což je velmi důležité, když se snažíte rozhodnout, zda změna hyperparametru pomohla, nebo zda jste měli štěstí. Pro srovnání, vlastní trénovací nástroj lerobotu má výchozí seed 1000 a recept LeRobot GR00T explicitně předává --seed=42 explicitně.
Jemné ladění běží s eval_strategy="no", takže vůbec neexistuje křivka validační ztráty. Získáte pouze tréninkovou ztrátu a nic jiného. Průvodce pro nové ztělesnění vám říká, abyste ji zapnuli pomocí --eval-strategy steps --eval-steps 500, ale tento příznak neexistuje v launch_finetune.py: CLI je generováno tyro z datové třídy FinetuneConfig a eval_strategy, eval_steps a eval_batch_size jsou místo toho pole třídy TrainingConfig. Jejich výchozí hodnoty jsou "no", 500 a 2. Abyste se k nim dostali, použijte úplnější vstupní bod gr00t/experiment/launch_train.py, kde je vnořený příznak --training.eval-strategy. Tak či onak, klesající tréninková ztráta sama o sobě vám říká velmi málo o generalizaci, což je přesně situace popsaná na ztráta klesá, ale politika nic nedělá.
Co stojí běh s 20000 kroky
GR00T N1.7 potřebuje 80 GB kartu, takže otázka nákladů má úzkou odpověď. Na AY-Robots běží trénovací nástroj groot1.7 na úrovni A100 80 GB nebo H100 80 GB, kde běh trvá 3 až 6 hodin za 1.20 až 2.00 USD za hodinu na spotovém trhu. To je zhruba 4 až 12 USD za výchozí úlohu s 20000 kroky. Stejný úkol na SmolVLA nebo ACT běží na 24 GB kartě za 0.30 až 0.60 USD za hodinu a 1 až 3 USD za běh. To je skutečný kompromis: GR00T stojí zhruba čtyřikrát tolik za pokus a nemůžete ho spustit na 4090 pod vaším stolem.
| Model | Úroveň GPU | Typický běh | Typické náklady | Minimální počet epizod |
|---|---|---|---|---|
| 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 |
Minimální počet epizod 50-epizod není cílem, ale minimem. Vlastní FAQ společnosti NVIDIA je náročnější: zhruba 100 trajektorií pro jednoduché uchopení a umístění na pevném místě, 500 a více pro složité nebo vícestupňové scény a 100 až 500 pro jemnou manipulaci. Pokud máte 20 epizod, věnujte odpoledne nahrávání namísto večerního ladění. průvodce sběrem dat popisuje, co odlišuje užitečnou epizodu od zbytečné, nahrajte svůj první dataset je krátká verze a sběr dat pro SO-100 je verze specifická pro rameno.
Krok 6: vyhodnocení v otevřené smyčce, než se dotknete ramene
Nepoužívejte čerstvý kontrolní bod na fyzickém rameni, abyste zjistili, zda trénink fungoval. Nejprve spusťte vyhodnocení v otevřené smyčce. Přehrává zaznamenanou epizodu, v každém kroku se ptá modelu na akce a vykresluje predikci proti skutečnosti s MSE a MAE. Nic to nestojí a zachytí to chyby mapování z kroků 2 a 3.
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 gripperRepozitář záměrně odmítá zveřejnit cílovou MSE pro vlastní data, a to je správné rozhodnutí: číslo závisí na vašich akčních jednotkách, vašem úkolu a velikosti vašeho datového souboru, takže práh zkopírovaný z cizího ramene nic neznamená. Smysluplný je trend. Zde je referenční běh, který repozitář dokumentuje na jednom H100 s demo datovou sadou pěti epizod a 2000 kroky.
| Kontrolní bod | Průměrné MSE na trajektorii 0 | Průměrné MAE na trajektorii 0 |
|---|---|---|
| 500 | 87.5 | 5.63 |
| 1000 | 25.4 | 3.30 |
| 1500 | 13.2 | 2.18 |
| 2000 | 10.0 | 1.76 |
Tvar je signál, nikoli absolutní hodnoty. Chyba by měla stabilně klesat, jak se tréninkové kroky akumulují. Zprůměrováno přes všech pět tréninkových epizod, nikoli pouze trajektorii 0, konečný kontrolní bod repozitáře dosáhl přibližně 7.5 MSE a 1.5 MAE, takže i referenční běh se čte jinak v závislosti na tom, které epizody zprůměrujete. Zaznamenejte si vlastní základní linii na neupraveném demo příkazu, než cokoli změníte ve svých vlastních datech: pokud nemůžete reprodukovat známý funkční běh, nemůžete rozlišit chybu nastavení od problému s daty. Repozitář také mapuje běžné symptomy k příčinám a každý z nich je provozní, nikoli chyba modelu.
| Symptom | Pravděpodobná příčina |
|---|---|
| MSE ploché nebo stoupající napříč kontrolními body | Příliš nízká rychlost učení, nebo se data vůbec nenačítají. Zkontrolujte --dataset-path a dataloader workers. |
| Predikční křivka je plochá nebo konstantní | modality.json klíče nebo --modality-config-path se neshodují. Akční klíče nejsou namapovány. |
| MSE obrovské, nebo NaN ztráta během tréninku | Normalizace akcí a stavů. Ověřte meta/stats a že rozsahy akcí jsou fyzicky věrohodné. |
| Dobré na traj 0, špatné na vynechaných epizodách | Nedostatek dat, nikoli chyba. Pět demo epizod nemůže zobecnit. |
Jiná cesta: lerobot-train namísto Isaac-GR00T
Současná verze LeRobot, 0.6.1 na PyPI od 3. srpna 2026, nabízí druhý a zcela odlišný způsob, jak doladit stejné základní váhy. LeRobot zpřístupňuje GR00T N1.7 jako typ politiky a trénuje ji prostřednictvím vlastního lerobot-train vstupního bodu. Zde jsou důležité dvě věci. LeRobot CLI je sada konzolových skriptů, takže cokoli, co čtete a říká python lerobot/scripts/train.py je zastaralé a nebude fungovat. A LeRobot zcela odstranil podporu GR00T N1.5, odmítá kontrolní body a konfigurace N1.5 s poznámkou o migraci, takže pokud potřebujete N1.5 přes LeRobot, musíte připnout lerobot==0.5.1, poslední vydání, které ji podporuje, publikované 7. dubna 2026.
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 |
|---|---|---|
| Verze datasetu | Pouze LeRobot v2, vyžaduje konverzi | Nativní dataset LeRobot, bez downgrade |
| Mapování modality | meta/modality.json plus Python datová konfigurace | žádný modality.json; chování nastaveno pomocí flagů --policy.* na příkazové řádce |
| Seed | žádný flag pro seed | --seed, LeRobot výchozí 1000 |
| Relativní akce | ActionConfig pro každý klíč v datové konfiguraci | --policy.use_relative_actions plus --policy.relative_exclude_joints |
| Publikované referenční výsledky | SO-100 open-loop MSE trend na demo datech | Sady LIBERO, průměr 96.5 procenta napříč čtyřmi sadami |
| Cesta nasazení | run_gr00t_server.py plus eval_so100.py přes ZMQ | lerobot-rollout, s chunkováním v reálném čase (queue_threshold by měl zůstat na nebo pod 5) |
- Každý flag je viditelný a měnitelný. Můžete odmrazit vizuální kodér, přesunout state_dropout_prob nebo zkrátit akční horizont.
- Grafy s otevřenou smyčkou jsou lokální soubory. Porovnání checkpoint-5000 s checkpoint-20000 je shell příkaz.
- Nezávisíte na tom, zda nějaká platforma zůstane online, a checkpoint se nachází na vašem disku ve standardním formátu.
- Příklady benchmarků repozitáře pro LIBERO, SimplerEnv a DROID vám poskytnou známé dobré běhy k reprodukci, než budete důvěřovat vlastním datům.
- Prostředí je většina práce. Verze FFmpeg, CUDA_HOME, git-lfs, gated backbone, torchcodec: žádný z těchto problémů není problémem modelu a každý z nich zastaví běh.
- Konverze z v3.0 na v2.1 vyžaduje samostatné virtuální prostředí s vlastním instalačním krokem a přepíše váš adresář datasetu na místě.
- Pronájem GPU začíná účtovat, když začnete ladit, nikoli když začne trénink, a nic nezastaví instanci, když běh skončí.
- Žádný seed znamená žádnou bit-po-bit reprodukovatelnost, navíc k 5 až 6 procentní varianci mezi běhy pouze z augmentace.
Dva způsoby, jak získat stejný checkpoint
Pronajmete si GPU a každý krok je ve vaší režii. Realisticky to poprvé zabere odpoledne a poté pokaždé dvacet minut.
- Nahrávejte epizody pomocí lerobot-record na SO-100. Získáte dataset LeRobot v3.0.
- Převeďte jej na v2.1 pomocí scripts/lerobot_conversion/convert_v3_to_v2.py ve vlastním virtuálním prostředí.
- Napište meta/modality.json a konfigurační soubor Python modality, registrovaný pod EmbodimentTag.NEW_EMBODIMENT.
- Pronajměte si 80 GB kartu, naklonujte s podmoduly, uv sync, autentizujte se proti Hugging Face.
- Spusťte launch_finetune.py, poté open_loop_eval.py na několika kontrolních bodech a porovnejte trend MSE, než se dotknete hardwaru.
- Stáhněte kontrolní bod ze stroje, než zničíte instanci, a poté vytvořte cestu pro obsluhu k rameni.
Zkopírujte kontrolní bod z pronajaté instance, než ji vypnete. --save-total-limit 5 také znamená, že starší kontrolní body jsou s postupujícím tréninkem mazány, takže kontrolní bod, který jste chtěli v kroku 5000, již nemusí existovat v kroku 20000.
Stejná práce jako formulář. Vyberete model a dataset, backend pronajme GPU na spotovém trhu podle požadované VRAM, spustí trénink a zapíše kontrolní body do objektového úložiště. Průvodce GR00T N1.7 na SO-100 je přesně tato kombinace; tréninková matice obsahuje každou další dvojici modelů a ramen, včetně GR00T N1.7 na SO-101.
| Co odesílá tréninkový program groot1.7 | Hodnota |
|---|---|
| Velikost dávky | 32 |
| Rychlost učení | 1e-4 |
| Maximální počet kroků | 20000 |
| Akumulace gradientu | 1, a pro tento tréninkový program to má účinek |
| Dodatečné nastavení dostupné ve formuláři | saveSteps |
| Základní kontrolní bod | nvidia/GR00T-N1.7-3B |
| Přijímaný formát datasetu | LeRobot v2.0 or v2.1 |
Dataset může pocházet z Hugging Face repo id, z vašeho vlastního stroje, nebo ze sezení, které jste nahráli pomocí desktopového klienta. Inference je samostatný krok: platforma zřídí pod, který obsluhuje politiku, a váš lokální robotický klient komunikuje s tímto koncovým bodem. Pody obsahují hlídače nečinnosti a po určité době nečinnosti se samy zničí, takže zapomenutá záložka prohlížeče nebude účtována přes noc. Pokud byste raději neklikali, stejné operace jsou dostupné na CLI a na MCP serveru.
GR00T N1.7 a Pi0.5 jsou zde pouze pro cloud; pouze SmolVLA a ACT běží také lokálně. Požadavek na v2.1 také nezmizí, protože dataset v3.0 musí být stále převeden, než jej GR00T loader přijme. A nic za vás nenapíše sémantiku vašeho modality.json: pokud jsou vaše klíče kamery nebo jazykový klíč špatně, jsou špatně na obou cestách. Viz dokumentace k tréninku, co backend dělá a nedělá za vás.

Nahrání kontrolního bodu zpět na rameno
Isaac-GR00T používá rozdělení server-klient přes ZMQ. Politika běží na GPU a tenký klient na robotickém stroji odesílá pozorování a přijímá akční bloky. Příklad SO-100 je dostatečně kompletní k zkopírování: spusťte run_gr00t_server.py s vaším kontrolním bodem a --embodiment-tag NEW_EMBODIMENT, poté spusťte eval_so100.py na straně robota se sériovým portem, ID robota, indexy kamery a jazykovou instrukcí. Názvy kamer v tomto příkazu musí odpovídat uživatelským jménům z vašeho modality.json, nikoli číslům zařízení OS.
# 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"Zatímco zapojujete rameno zpět: SO-100 používá sběrnicové serva Feetech STS3215 na 7.4 V napájecí liště. Napájení 12 V je zničí, a je to snadná chyba, pokud vlastníte i LeKiwi, jehož základna běží na 12 V, zatímco jeho rameno ne. Zkontrolujte napájení před prvním zapnutím, ne až po kouři. Viz hardwarová stránka SO-100 a SO-100 proti LeKiwi. Pokud se rameno zapne, ale nic se nepohybuje, servo nereaguje je místo, kde začít.
Nyní upřímná část o tom, kde běží politika, protože trénink a obsluha mají odlišné hardwarové požadavky. Jemné doladění vyžaduje 40 GB nebo více. Inference nikoli: README uvádí 16 GB nebo více a výslovně zmiňuje RTX 4090, takže karta, kterou již vlastníte, může obsluhovat checkpoint, který by nikdy nemohla vytvořit. To, co rozhoduje o tom, zda se politika zdá být citlivá, není VRAM, ale to, kde se nachází server. Na AY-Robots GR00T N1.7 je pouze cloudový, takže řídicí smyčka platí za zpáteční cestu přes veřejný internet navíc k 152 ms na akční krok, a pouze SmolVLA a ACT běží také lokálně. Pro pomalé zvedání a umisťování je vzdálený pod přežitelný. Pro cokoli reaktivního nikoli: politika se stává váhavou způsobem, který vypadá přesně jako selhání tréninku a není jím. ACT s 20 ms na akční krok je model, který toleruje nejtěsnější smyčku, SmolVLA se pohybuje na 245 ms, a žádné množství ladění latence nezíská zpět zpáteční cestu, která již byla vynaložena. Spuštění vaší první politiky provede obslužnou stranu od začátku do konce.
Co se skutečně pokazí
- GatedRepoError při prvním spuštění. Nebyl vám udělen přístup k nvidia/Cosmos-Reason2-2B, nebo jste se neautentizovali. K tomu dochází poté, co se již spustily hodiny GPU.
- Datová sada odmítnuta při načítání. Téměř vždy se jedná o datovou sadu v3.0. Převeďte ji na nižší verzi. Viz datová sada odmítnuta jako v3.
- IndexError ohledně neshodných booleovských dimenzí. Změnili jste delta_indices a nevygenerovali jste znovu statistiky.
- Nedostatek paměti u dávky 32. Snižte --global-batch-size a zvyšte --gradient-accumulation-steps, nebo snižte --num-shards-per-epoch, což konfigurace výslovně doporučuje, když je VRAM omezená. Viz nedostatek paměti během tréninku.
- Ztráta klesá, politika nic nedělá. Ve výchozím nastavení neexistuje validační rozdělení, takže čistá tréninková křivka dokazuje jen velmi málo. Tato stránka se zabývá diagnostikou.
- Funguje ve vašem nastavení a nikde jinde. Očekáváno u malé datové sady natočené za jedné světelné podmínky. NVIDIA doporučuje augmentaci barevného chvění plus 20 až 50 epizod napříč různým osvětlením. Více zde.
- Chapák se nikdy správně nezavře. Zkontrolujte, zda je akce chapáku ABSOLUTNÍ a klouby ramene RELATIVNÍ, v tomto pořadí v action_configs. Chapák se nezavírá uvádí další příčiny.
- Kamera se tiše odpojí uprostřed nahrávání. Epizoda se stále ukládá a klíč videa stále existuje, proto je to tak nepříjemné. Kamera nebyla detekována to pokrývá.
Celý index režimů selhání se nachází na . Pokud si vybíráte mezi modely, spíše než ladíte jeden, a mají čísla benchmarků s připojenými zdroji, a je porovnání, které většina lidí skutečně potřebuje, protože je to volba mezi modelem, který můžete trénovat na kartě pod vaším stolem, a modelem, pro který si musíte pronajmout 80 GB uzel k doladění. Pro pochopení, proč se tyto modely chovají tak, jak se chovají, je a stojí za to si přečíst jako první. A pokud ještě nevlastníte rameno, streamuje fyzické SO-100 bez nutnosti registrace.
Kolik epizod potřebuji, než se vyplatí doladit GR00T N1.7?▾
AY-Robots stanovuje minimální hranici 50 epizod pro tréninkový program groot1.7. Vlastní FAQ společnosti NVIDIA je náročnější: zhruba 100 trajektorií pro jednoduché uchopení a umístění na pevném místě, 500 nebo více pro složité nebo vícestupňové scény a 100 až 500 pro jemnou manipulaci. Pod 50 epizod je téměř vždy lepší nahrát více dat než ladit hyperparametry. Pokud se úspěšnost poté ustálí, NVIDIA doporučuje HG-DAgger: spusťte politiku, zasáhněte, když selže, a přidejte tyto korekce do datové sady.
Proč se moje datová sada nenačítá a jak poznám, jaká je to verze?▾
Otevřete meta/info.json a přečtěte codebase_version. Aktuální CODEBASE_VERSION LeRobota na main je v3.0, takže cokoli nahraného s nedávným toolchainem je v3.0, a GR00T loader očekává v2. Převeďte pomocí scripts/lerobot_conversion/convert_v3_to_v2.py z repozitáře Isaac-GR00T, který zapíše codebase_version: v2.1 do převedené datové sady. Skript běží ve vlastním virtualenvu, protože potřebuje jinou verzi lerobot než GR00T.
Mohu doladit GR00T N1.7 na RTX 4090?▾
Ne. NVIDIA doporučuje 40 GB nebo více VRAM pro doladění a uvádí uzly H100 nebo L40; jiné karty fungují, ale trvá to mnohem déle. Karta 4090 má 24 GB. AY-Robots nabízí GR00T N1.7 pouze na úrovni A100 80 GB a H100 80 GB ze stejného důvodu. Inference je jiná věc: 16 GB stačí k obsluze modelu, takže 4090 může spustit politiku, kterou nemůže trénovat. Pokud chcete VLA, kterou můžete trénovat na 24 GB, je to SmolVLA s přibližně 450 miliony parametrů nebo ACT s přibližně 80 miliony.
Proč dva běhy se stejnými příznaky dávají různé kontrolní body?▾
Protože launch_finetune.py nemá žádné semeno. Je to tyro CLI generované z dataclass, která neobsahuje pole pro semeno, takže nic nefixuje RNG. Repozitář samostatně uvádí 5 až 6 procentní variabilitu mezi běhy způsobenou nedeterministickou augmentací obrazu. Pokud záleží na reprodukovatelnosti, použijte místo toho cestu LeRobot: lerobot-train přijímá --seed a publikovaný recept GR00T předává --seed=42.
Mám použít Isaac-GR00T nebo lerobot-train?▾
Použijte Isaac-GR00T, pokud chcete referenční implementaci, kontrolu nad reprezentací akcí pro každý klíč, export TensorRT nebo příklady benchmarků k reprodukci, než budete důvěřovat vlastním datům. Použijte lerobot-train, pokud je vaše datová sada již LeRobot v3.0 a raději byste ji nepřeváděli, pokud chcete semeno, nebo pokud je zbytek vašeho stacku již LeRobot. Oba doladí stejné váhy nvidia/GR00T-N1.7-3B. Všimněte si, že LeRobot zcela zrušil podporu GR00T N1.5: kontrolní body N1.5 jsou odmítnuty s poznámkou o migraci a musíte připnout lerobot==0.5.1, abyste je mohli nadále používat.
Opravdu potřebuji kameru na zápěstí i přední kameru?▾
Dodávaná konfigurace SO-100 používá obě, a modality.json mapuje přední a zápěstní kameru jako samostatné video klíče. Můžete trénovat s jednou kamerou, a tabulka latence modelu je měřena s jednou kamerou, ale pohled ze zápěstí je to, co dává politice použitelné informace o chapáku v okamžiku kontaktu. Pokud se chapák zavře ve špatnou dobu ve vašich rolloutech, chybějící nebo špatně zaměřená kamera na zápěstí je jednou z prvních věcí, které je třeba zkontrolovat.
Dolaďte GR00T N1.7 na vašem SO-100 bez předchozího sestavení prostředí
Vyberte model, datovou sadu a hyperparametry ve formuláři. Backend pronajme A100 80 GB nebo H100 na spotovém trhu, spustí tréninkový program s dávkou 32, rychlostí učení 1e-4 a 20000 kroky a zapíše kontrolní body do objektového úložiště. Přibližně 4 až 12 USD za běh.
Otevřít průvodce tréninkem GR00T N1.7Sources
- 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)
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started