
Un ghid testat pentru reglarea fină a NVIDIA GR00T N1.7 pe un set de date LeRobot SO-100: flag-uri reale, modality.json, cerința v2.1, cât costă o rulare și capcanele.
NVIDIA livrează un exemplu de reglaj fin (fine-tuning) pentru exact brațul pe care probabil îl dețineți. În cadrul depozitului Isaac-GR00T există un folder numit demo_data/cube_to_bowl_5: cinci episoade, 4.148 de cadre la 30 fps, deja scrise ca LeRobot v2.1, cu o configurație de modalitate corespunzătoare sub examples/SO100/. Fișierul său meta/info.json raportează robot_type: so101_follower, care în LeRobot este aceeași clasă de configurare ca și so100_follower. Acest lucru este cu adevărat util, deoarece înseamnă că calea de referință pentru GR00T N1.7 pe un braț hobby cu șase grade de libertate este menținută de persoanele care au scris modelul. Nu este o demonstrație umanoidă redusă, este același braț.
Vestea proastă este distanța dintre I recorded 60 episodes și the arm does the task. Există aproximativ șase locuri unde această conductă eșuează în liniște, mai degrabă decât zgomotos, iar patru dintre ele se găsesc în fișiere pe care majoritatea oamenilor nu le deschid niciodată: meta/modality.json, configurația de date Python, meta/relative_stats.json, și șirul de versiune propriu al setului de date. Acest ghid parcurge ruta manuală de la un capăt la altul cu comenzile reale, apoi arată aceeași sarcină ca un formular pe AY-Robots. Tot ce urmează a fost verificat în raport cu ramura principală Isaac-GR00T la data de 20 august 2026 (linia de lansare n1.7) și lerobot 0.6.1, publicat pe PyPI la 3 august 2026. Dezvoltarea este rapidă, iar acolo unde un flag a fost redenumit, acest articol menționează acest lucru.
Ce trebuie să știți înainte de a începe
- •Reglajul fin (fine-tuning) GR00T N1.7 necesită 40 GB sau mai mult de VRAM. NVIDIA recomandă noduri H100 sau L40. Un RTX 4090 de 24 GB nu va îndeplini această sarcină, deși va antrena SmolVLA și ACT.
- •Setul de date trebuie să fie LeRobot v2 (v2.0 sau v2.1) plus un fișier meta/modality.json specific GR00T. Un set de date LeRobot v3.0 nu se încarcă și trebuie convertit la o versiune anterioară.
- •Punctul de intrare este gr00t/experiment/launch_finetune.py, un CLI tyro. Nu are flag-ul --seed, deci rulările nu sunt reproductibile bit cu bit.
- •Pentru un braț personalizat, eticheta de întruchipare este NEW_EMBODIMENT, iar această etichetă face ca --modality-config-path să fie obligatoriu.
- •Rețeta SO-100 livrată prezice articulațiile brațului ca delte RELATIVE și gripper-ul ca o țintă ABSOLUTĂ. Inversarea acestei asocieri este un eșec silențios, nu o eroare.
- •Pe AY-Robots, aceeași sarcină este un formular: 20000 de pași, batch 32, rată de învățare 1e-4, aproximativ 4 până la 12 USD pe nivelul A100 80 GB sau H100.
Ce este de fapt GR00T N1.7
GR00T N1.7 este un model viziune-limbaj-acțiune cu arhitectura dual-sistem descrisă în lucrarea originală GR00T N1: un modul viziune-limbaj care citește camerele și instrucțiunea, și un transformator de difuzie care transformă asta într-o secvență de comenzi motorii continue. N1.7 a înlocuit prima jumătate. Backbone-ul Eagle de la N1.6 a fost eliminat, înlocuit cu nvidia/Cosmos-Reason2-2B pe o arhitectură Qwen3-VL, iar modelul a fost preantrenat pe aproximativ 20.000 de ore de înregistrări video umane egocentrice, pe lângă datele robotului. Propria descriere a NVIDIA indică cifra de 20.854 de ore și raportează că trecerea de la 1k la 20k ore mai mult decât dublează rata medie de finalizare a sarcinilor.
A doua jumătate s-a schimbat și ea, în moduri care contează pentru execuția dumneavoastră. Capul de acțiune a scăzut de la 32 de straturi de difuzie la 16, secvența de acțiuni a crescut de la 16 pași la 40, iar lățimea maximă a stării și acțiunii a trecut de la 29 la 132. Aceste trei numere provin din jurnalul de modificări din README-ul depozitului; propria postare de lansare a NVIDIA descrie în continuare Sistemul 1 ca un DiT cu 32 de straturi, așa că, acolo unde cele două nu sunt de acord, aveți încredere în depozitul pe care sunteți pe cale să-l clonați. Acțiunile sunt exprimate implicit într-un spațiu relativ al efectorului final , delte față de poziția curentă, mai degrabă decât ținte absolute, ceea ce permite transferul priorităților de manipulare învățate din video-uri umane în controlul robotului. Capul în sine este un transformator de difuzie flow-matching , aceeași familie ca Pi0.5, dar cu un backbone diferit în față. Dacă sunteți încă la generația anterioară, N1.7 versus N1.5 acoperă dacă actualizarea justifică refacerea pipeline-ului dumneavoastră.
| Proprietate | Valoare | Sursa |
|---|---|---|
| Parametri | 3,000,000,000 | Hugging Face model card |
| Backbone viziune-limbaj | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | repo README |
| Cap de acțiune | Flow-matching diffusion transformer, 16 layers (N1.6 had 32) | repo README |
| Orizont de acțiune prezis | 40 steps for the base checkpoint (N1.6 had 16) | getting_started/policy.md and repo README |
| Lățime maximă stare și acțiune | 132 (N1.6 had 29) | repo README |
| Licență cod | Apache 2.0 | Isaac-GR00T repository |
| Licență ponderi | NVIDIA Open Model License Agreement | model card |
| Latență, H100 80 GB, PyTorch eager, 4 pași de denoising, 1 cameră | 85.8 ms end to end, 11.7 Hz | model card timing table |
| Același hardware, pipeline complet TensorRT | 27.9 ms end to end, 35.9 Hz | model card timing table |
| Latența citată de AY-Robots pentru GR00T N1.7 servit | 152 ms per action step | AY-Robots policy catalog |
Ultimele trei rânduri explică cea mai mare parte a dezamăgirii raportate de oameni. Titlul de 27.9 ms reprezintă un motor TensorRT pe un H100 cu o cameră și patru pași de denoising. PyTorch simplu pe aceeași placă este de 85.8 ms, iar fișa modelului indică un decalaj de 3.08x. Niciunul dintre numere nu include un strat de servire, o a doua cameră sau un salt de rețea. Cei 152 ms per pas de acțiune citați de AY-Robots pentru GR00T N1.7 servit este cifra cu servirea în buclă, iar o călătorie dus-întors pe internetul public se adaugă la aceasta. Mai multe despre acest subiect la final. Pentru numerele alături de alte modele, GR00T N1.7 versus Pi0.5 și GR00T N1.7 versus SmolVLA le prezintă una lângă alta.

Ce necesită rularea înainte de a introduce orice
| Cerință | Antrenare fină | Inferență |
|---|---|---|
| VRAM, recomandări NVIDIA | 40 GB sau mai mult, H100 sau L40 recomandat | 16 GB sau mai mult, un RTX 4090 funcționează |
| Python și CUDA pe dGPU | 3.12 și CUDA 12.8 | 3.12 și CUDA 12.8 |
| Backend video | torchcodec 0.8.0, doar FFmpeg 4 până la 7 | idem |
| Format set de date | LeRobot v2 plus meta/modality.json | nu se aplică |
| Acces Hugging Face | aprobat pentru nvidia/Cosmos-Reason2-2B | idem |
| Alte instrumente | git-lfs și uv | uv |
| Nivel GPU AY-Robots pentru antrenorul groot1.7 | A100 80 GB sau H100 80 GB | pod alocat automat |
Fiecare checkpoint GR00T, inclusiv baza nvidia/GR00T-N1.7-3B, încarcă nvidia/Cosmos-Reason2-2B la prima utilizare, iar acel depozit este restricționat. Fișierul README specifică exact eșecul: încărcarea modelului eșuează cu o eroare GatedRepoError / 401 Client Error. Ceea ce nu menționează este când se întâmplă acest lucru, adică după ce ați închiriat placa și rularea a început. Solicitați acces pe pagina modelului, apoi rulați uv run huggingface-cli login sau exportați HF_TOKEN înainte de a închiria orice.
Pasul 0: episoadele în sine
Tot ce urmează presupune că aveți deja episoade înregistrate. Dacă nu, acesta este adevăratul prim pas și este cel care decide cât de bun poate fi rezultatul, deoarece nu poate recupera informații care nu se află în date. Calibrați ambele brațe mai întâi, apoi conduceți brațul urmăritor cu un braț lider în timp ce lerobot-record scrie fișierele parquet și fluxurile camerei. Dacă este incorectă, valorile articulațiilor din setul de date descriu un robot ușor diferit de cel care va executa ulterior politica, și nicio cantitate de antrenament nu poate remedia asta.
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=trueRecomandarea LeRobot este să înregistrați cel puțin 50 de episoade, cu aproximativ 10 pentru fiecare locație a obiectului, să mențineți camerele fixe și să păstrați un comportament de prindere consistent. Adăugați variații mai târziu, nu la început. Regula generală de reținut: dacă nu ați putea îndeplini sarcina singur doar din imaginile camerei, nici nu poate. Pentru configurarea specifică brațului, și acoperă porturile, calibrarea și indicii camerei. Pe AY-Robots puteți face acest lucru și prin internet din browser folosind și înregistra direct din sesiune.
Pasul 1: setul de date trebuie să fie LeRobot v2.1
Acesta este cel mai frecvent obstacol. Versiunea curentă a CODEBASE_VERSION a LeRobot pe ramura principală este v3.0, deci orice înregistrați astăzi cu un set de instrumente actual va fi v3.0. Încărcătorul GR00T se așteaptă la v2. Depozitul este explicit cu privire la motiv: multe seturi de date upstream, cum ar fi DROID, LIBERO și Bridge, sunt publicate în v2, iar suportul nativ pentru ambele este planificat, dar nu a fost încă livrat. Așadar, conversia vă revine, și rulează în propriul său virtualenv dintr-un motiv concret: scripts/lerobot_conversion conține propriul său pyproject care solicită Python 3.10 sau 3.11 și fixează lerobot la un anumit commit git, în timp ce Isaac-GR00T însuși necesită Python 3.12. Instalați convertorul din rădăcina depozitului și veți obține pachetul gr00t în schimb, ceea ce este greșeala despre care avertizează README-ul său. Dacă sunteți nou în format, intrarea din glosar setul de date LeRobot explică ce se află de fapt în interiorul acestuia.
# 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_lerobotDacă setul de date v3.0 există deja local, scriptul construiește structura v2.1 lângă el și apoi le inversează: originalul este mutat într-un folder învecinat cu versiunea adăugată, <name>_v3.0, iar copia convertită preia calea originală. (Docstring-ul scriptului numește acel folder _v30; codul adaugă șirul versiunii, deci ceea ce obțineți de fapt este _v3.0.) A doua surpriză: ieșirea ajunge întotdeauna sub <root>/<repo-id>, deci --root examples/SO100/my_dataset_lerobot vă oferă examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset>, iar acea cale mai lungă este cea pe care --dataset-path o dorește mai târziu. Atunci când o sarcină de antrenament respinge setul dvs. de date din motive de versiune, pagina setului de date respins ca v3 listează simptomele exacte.
Structura pe care GR00T o dorește după conversie este layout-ul clasic v2: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, fișiere parquet sub data/chunk-000/, fișiere MP4 sub videos/chunk-000/observation.images.
Pasul 2: modality.json, cele șase numere care decid totul
Într-un set de date LeRobot, starea robotului și acțiunea sunt stocate ca array-uri plate float32. Pentru un SO-100, ambele au forma [6]: cinci articulații ale brațului și un gripper. Setul de date demo le denumește shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, dar acele nume se găsesc în info.json și nimic din fișierul parquet nu indică ce index este ce. meta/modality.json furnizează acea mapare, iar GR00T nu se va antrena fără ea. Iată cea pe care o livrează repository-ul pentru SO-100, verbatim.
{
"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"
}
}
}Copiați-l în setul de date convertit la meta/modality.json și redenumiți cheile video la numele reale ale camerelor dumneavoastră. Dacă ați înregistrat cu o singură cameră de deasupra numită top, atunci original_key este observation.images.top și numele prietenos este cel la care va face referire configurația dumneavoastră de date. Cele două trebuie să se potrivească, și niciuna dintre ele nu o verifică pe cealaltă pentru dumneavoastră. Adnotarea limbajului este mai complicată, deoarece aceeași cheie trebuie să apară în trei locuri.
| Strat | Fișier | Forma SO-100 utilizată în depozit |
|---|---|---|
| Coloană Parquet | data/chunk-*/episode_*.parquet | annotation.human.task_description |
| Cheie modality.json | meta/modality.json, under "annotation", without the annotation. prefix | human.task_description |
| modality_keys în configurația de date | your so100_config.py | annotation.human.task_description |
Segmentele de după annotation. sunt alese de autorul setului de date. Datele demo SO-100 utilizează annotation.human.task_description; LIBERO și SimplerEnv utilizează annotation.human.action.task_description. Ambele sunt valide. Dacă ați copiat o configurație dintr-un exemplu LIBERO și ați îndreptat-o către propria înregistrare SO-100, canalul de limbaj nu se rezolvă la nimic și modelul se antrenează pe o instrucțiune goală. Pierderea continuă să scadă. Politica încă face ceva. Doar că ignoră ceea ce i-ați spus să facă.
Pasul 3: configurația datelor, brațul relativ și gripperul absolut
Fișierul de configurare a modalității este un fișier Python, nu JSON, deoarece decide și modul în care este reprezentat fiecare grup de acțiuni. Aceasta este partea fluxului de lucru N1.7 care nu a existat în aceeași formă în N1.5 și partea care merită citită de două ori. Configurația SO-100 livrată prezice cele cinci articulații ale brațului ca delte relative față de starea curentă și prehensorul ca o poziție țintă absolută, deoarece un semnal binar deschis-sau-închis se comportă mai bine ca o țintă decât ca o deltă.
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)Două detalii aici te vor costa o zi dacă nu le cunoști. În primul rând, action_configs este pozițional: documentația cere aceeași lungime și aceeași ordine ca modality_keys, și este directă în privința consecinței unei greșeli, și anume că reprezentarea greșită este aplicată în mod silențios. Prehensorul tău este antrenat ca o deltă și brațul tău ca o țintă absolută, și nu există niciun mesaj de eroare. În al doilea rând, register_modality_config afirmă că eticheta nu este deja înregistrată, astfel încât o a doua configurație NEW_EMBODIMENT în același proces Python eșuează cu Embodiment tag ... already registered. Nu poți importa două dintre acestea într-un singur script. O a treia regulă este aplicată ulterior, la implementare: delta_indices pentru acțiune trebuie să fie un interval contiguu începând de la zero. O fereastră rară, cum ar fi [0, 4, 8], este respinsă, deoarece tot ce urmează indexează liniar segmentul prezis și altfel ar executa rândurile greșite.
Statisticile de normalizare, în special meta/relative_stats.json, sunt calculate pentru lungimea orizontului pe care o aveai când le-ai generat. Scurtează orizontul de acțiune de la 16 la 8 fără a regenera și antrenamentul eșuează cu IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. Soluția este o singură comandă: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Ruleaz-o după orice modificare a delta_indices.
Pasul 4: mediul
N1.7 a mutat depozitul la și Python 3.12. Vechea cale conda plus pip install -e . încă există într-o secțiune restrânsă a fișierului README, dar avertizează că dependențele GPU, inclusiv flash-attn și TensorRT, ar putea necesita instalare manuală. Utilizați uv, cu excepția cazului în care aveți un motiv specific să nu o faceți. În ceea ce privește flash-attn, un detaliu evită confuzia: veți vedea Installing flash-attn afișat la fiecare uv run. Nu se reconstruiește. uv re-validează o roată fixată prin URL care este deja în cache și durează două sau trei secunde.
- 1Instalați git-lfs, apoi clonați cu submoduluri
git-lfs este necesar, nu opțional. Fără el, fișierele parquet din demo_data/ sunt descărcate ca stub-uri de pointer, iar rularea demo-ului eșuează pe un set de date care pare prezent în lista de fișiere.
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2Instalați uv și sincronizați mediul
Instalarea implicită descarcă dependențele GPU, inclusiv flash-attn și TensorRT. Pe o imagine proaspătă A100 sau H100, acesta este cel mai lung pas, așa că faceți-l înainte de a acorda atenție oricărui altceva.
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')" - 3Autentificați-vă la Hugging Face
Faceți acest lucru înainte de prima lansare a antrenamentului, nu după ce eșuează după opt minute.
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4Verificare de bază pe datele demo SO-100 livrate
Înainte de a utiliza propria înregistrare, rulați 2000 de pași pe demo_data/cube_to_bowl_5. Sunt cinci episoade, se termină rapid și validează mediul, nu datele dumneavoastră. Dacă această rulare eșuează, nimic din ceea ce faceți cu setul dumneavoastră de date nu va ajuta.
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 suportă doar FFmpeg 4 până la 7, iar Ubuntu 25.10 și versiunile ulterioare livrează versiunea 8. Eroarea este Could not load libtorchcodec, ceea ce sună mai degrabă ca o instalare defectă decât un conflict de versiuni. Instalați o versiune mai veche a runtime-ului, de exemplu conda install -c conda-forge 'ffmpeg<8', și plasați bibliotecile sale pe LD_LIBRARY_PATH. CUDA_HOME este nesetat. Reglajul fin eșuează complet. Rulați bash scripts/deployment/dgpu/install_deps.sh o dată, sau pur și simplu export CUDA_HOME=/usr/local/cuda.
Pasul 5: comanda de fine-tuning și valorile implicite reale ale flag-urilor sale
Înlocuiți setul de date demo cu al dumneavoastră și adăugați parametrii pe care îi doriți cu adevărat. Mai jos este forma completă pe care o folosește depozitul în propriul său tutorial de nou-încarnare, incluzând flag-urile de augmentare și checkpointing pe care exemplul scurt din README le omite. Acesta este în sens restrâns: coloana vertebrală lingvistică și codificatorul vizual rămân înghețate, iar ceea ce se antrenează este proiectorul și capul de acțiune de difuzie.
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 | Valoare implicită în FinetuneConfig | Ce face |
|---|---|---|
| --global-batch-size | 64 | Batch total pe toate GPU-urile înainte de acumularea gradientului. Exemplele livrate folosesc 32. |
| --learning-rate | 1e-4 | Aceeași valoare pe care AY-Robots o trimite pentru antrenorul său groot1.7. |
| --max-steps | 10000 | Număr total de pași ai optimizatorului. Wrapper-ul examples/finetune.sh are, de asemenea, o valoare implicită de 10000. |
| --gradient-accumulation-steps | 1 | Multiplică batch-ul efectiv. Valorile peste 1 emit un avertisment care indică dimensiunea acumulată. |
| --save-steps and --save-total-limit | 1000 and 5 | Frecvența checkpoint-urilor și câte sunt păstrate. Cele mai vechi sunt șterse. |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | Setat explicit și de examples/finetune.sh. |
| --state-dropout-prob | 0.2 in the CLI, 0.8 in the model config | Elimină aleatoriu starea proprioceptivă în timpul antrenamentului. Reduceți-o dacă sarcina dumneavoastră se bazează pe stare. |
| --tune-llm and --tune-visual | False and False | Coloana vertebrală rămâne înghețată implicit. |
| --tune-projector and --tune-diffusion-model | True and True | Proiectorul și capul de acțiune de difuzie sunt cele care se antrenează de fapt. |
| --use-percentiles | True | Normalizează cu q01 și q99 în loc de min și max brute. |
| --dataloader-num-workers | 2 | Încărcătorul este bazat pe CPU prin design. Exemplele ridică această valoare la 4. |
| --seed | nu există | Nu există un flag de seed în această interfață CLI. |
Ultimul rând nu este o greșeală de tipar. launch_finetune.py este un CLI tyro generat dintr-o clasă de date, iar acea clasă de date nu are un câmp pentru seed. README-ul menționează separat o variație de 5 până la 6 procente între rulări, cauzată de augmentarea nedeterministică a imaginilor. Două rulări cu flag-uri identice nu vor produce checkpoint-uri identice, ceea ce contează mult atunci când încerci să decizi dacă o modificare a hiperparametrilor a ajutat sau dacă ai avut noroc. Pentru comparație, propriul antrenor al lerobot folosește implicit seed 1000, iar rețeta LeRobot GR00T transmite --seed=42 în mod explicit.
Fine-tuning-ul rulează cu eval_strategy="no", deci nu există deloc o curbă de pierdere de validare. Obții doar pierderea de antrenament și nimic altceva. Ghidul pentru noua implementare îți spune să o activezi cu --eval-strategy steps --eval-steps 500, dar acest flag nu există în launch_finetune.py: CLI-ul este generat de tyro din clasa de date FinetuneConfig, iar eval_strategy, eval_steps și eval_batch_size sunt câmpuri ale TrainingConfig în schimb. Valorile lor implicite acolo sunt "no", 500 și 2. Pentru a le accesa, folosește punctul de intrare complet gr00t/experiment/launch_train.py, unde flag-ul imbricat este --training.eval-strategy. Oricum, o pierdere de antrenament în scădere, de una singură, îți spune foarte puțin despre generalizare, ceea ce este exact situația descrisă la pierderea scade, dar politica nu face nimic.
Cât costă o rulare de 20000 de pași
GR00T N1.7 necesită o placă de 80 GB, deci întrebarea costului are un răspuns restrâns. Pe AY-Robots, antrenorul groot1.7 rulează pe nivelul A100 80 GB sau H100 80 GB, unde o rulare durează 3 până la 6 ore la 1.20 până la 2.00 USD pe oră pe piața spot. Asta înseamnă aproximativ 4 până la 12 USD pentru job-ul implicit de 20000 de pași. Aceeași sarcină pe SmolVLA sau ACT rulează pe o placă de 24 GB la 0.30 până la 0.60 USD pe oră și 1 până la 3 USD pe rulare. Aceasta este adevărata compensație: GR00T costă de aproximativ patru ori mai mult per încercare și nu îl poți rula pe 4090-ul de sub biroul tău.
| Model | Nivel GPU | Durată tipică | Cost tipic | Episoade minime |
|---|---|---|---|---|
| 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 |
Minimul de 50 de episoade nu este o țintă, ci un prag minim. FAQ-ul NVIDIA este mai exigent: aproximativ 100 de traiectorii pentru o operațiune simplă de ridicare și plasare într-o locație fixă, 500 sau mai multe pentru scene complexe sau cu mai mulți pași și 100 până la 500 pentru manipulare fină. Dacă aveți 20 de episoade, petreceți după-amiaza înregistrând, mai degrabă decât seara ajustând. Ghidul de colectare a datelor acoperă ce anume separă un episod util de unul irosit, înregistrați primul dvs. set de date este versiunea scurtă, iar colectarea datelor SO-100 este cea specifică brațului.

Pasul 6: evaluare în buclă deschisă înainte de a atinge brațul
Nu aplica un nou punct de control pe un braț fizic pentru a afla dacă antrenamentul a funcționat. Rulează mai întâi evaluarea în buclă deschisă. Aceasta redă un episod înregistrat, cere modelului acțiuni la fiecare pas și trasează predicția în raport cu adevărul fundamental, folosind MSE și MAE. Nu costă nimic și prinde erorile de mapare de la pașii 2 și 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 gripperRepozitoriul refuză în mod deliberat să publice un MSE țintă pentru date personalizate, și aceasta este decizia corectă: numărul depinde de unitățile dvs. de acțiune, de sarcina dvs. și de dimensiunea setului de date, astfel încât un prag copiat de la brațul altcuiva nu înseamnă nimic. Ceea ce este semnificativ este tendința. Iată rularea de referință documentată de repozitoriu pe un singur H100 cu setul de date demonstrativ de cinci episoade și 2000 de pași.
| Punct de control | MSE mediu pe traiectoria 0 | MAE mediu pe traiectoria 0 |
|---|---|---|
| 500 | 87.5 | 5.63 |
| 1000 | 25.4 | 3.30 |
| 1500 | 13.2 | 2.18 |
| 2000 | 10.0 | 1.76 |
Forma este semnalul, nu valorile absolute. Eroarea ar trebui să scadă constant pe măsură ce se acumulează. Mediat pe toate cele cinci episoade de antrenament, mai degrabă decât doar pe traiectoria 0, punctul de control final al depozitului a obținut aproximativ 7.5 MSE și 1.5 MAE, astfel încât chiar și rularea de referință este interpretată diferit în funcție de episoadele pe care le mediați. Înregistrați-vă propria linie de bază folosind comanda demo nemodificată înainte de a schimba orice legat de propriile date: dacă nu puteți reproduce o rulare validă cunoscută, nu puteți distinge o eroare de configurare de o problemă de date. Depozitul mapează, de asemenea, simptomele comune la cauze, și fiecare dintre ele este operațională, mai degrabă decât o eroare de model.
| Simptom | Cauză probabilă |
|---|---|
| MSE plat sau în creștere pe parcursul punctelor de control | Rata de învățare prea mică, sau datele nu se încarcă deloc. Verificați --dataset-path și workerii dataloader-ului. |
| Curba de predicție este plată sau constantă | Cheile modality.json sau --modality-config-path nu se potrivesc. Cheile de acțiune nu sunt mapate. |
| MSE enorm, sau pierdere NaN în timpul antrenamentului | Normalizarea acțiunii și a stării. Verificați meta/stats și că intervalele de acțiune sunt plauzibile fizic. |
| Bun pe traiectoria 0, slab pe episoadele de validare | Lipsa datelor, nu o eroare. Cinci episoade demo nu pot generaliza. |
Cealaltă cale: lerobot-train în loc de Isaac-GR00T
Versiunea actuală LeRobot, 0.6.1 pe PyPI începând cu 3 august 2026, oferă o a doua modalitate, destul de diferită, de a ajusta aceleași ponderi de bază. LeRobot expune GR00T N1.7 ca tip de politică și îl antrenează prin propriul său lerobot-train punct de intrare. Două lucruri contează aici. CLI-ul LeRobot este un set de scripturi de consolă, deci orice citiți care spune python lerobot/scripts/train.py este învechit și nu va rula. Și LeRobot a eliminat complet suportul pentru GR00T N1.5, respingând punctele de control și configurațiile N1.5 cu o notă de migrare, deci dacă aveți nevoie de N1.5 prin LeRobot trebuie să fixați versiunea lerobot==0.5.1, ultima versiune care îl suportă, publicată pe 7 aprilie 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| Aspect | Isaac-GR00T launch_finetune.py | lerobot-train --policy.type=groot |
|---|---|---|
| Versiunea setului de date | Doar LeRobot v2, este necesară conversia | Set de date LeRobot nativ, fără retrogradare |
| Maparea modalității | meta/modality.json plus o configurație de date Python | fără modality.json; comportamentul este setat de flag-urile --policy.* din linia de comandă |
| Seed | fără niciun flag seed | --seed, LeRobot default 1000 |
| Acțiuni relative | ActionConfig per-cheie în configurația datelor | --policy.use_relative_actions plus --policy.relative_exclude_joints |
| Rezultate de referință publicate | Tendința MSE în buclă deschisă SO-100 pe date demo | Suite LIBERO, medie de 96.5 procente pe patru suite |
| Calea de implementare | run_gr00t_server.py plus eval_so100.py over ZMQ | lerobot-rollout, with real-time chunking (queue_threshold should stay at or below 5) |
- Fiecare flag este vizibil și modificabil. Puteți debloca encoderul vizual, muta state_dropout_prob sau scurta orizontul de acțiune.
- Graficele în buclă deschisă sunt fișiere locale. Compararea checkpoint-5000 cu checkpoint-20000 este o comandă shell.
- Nu depindeți de nicio platformă care să rămână online, iar checkpoint-ul se află pe disc într-un format standard.
- Exemplele de benchmark ale repo-ului pentru LIBERO, SimplerEnv și DROID vă oferă rulări cunoscute ca fiind bune de reprodus înainte de a vă încrede în propriile date.
- Mediul este cea mai mare parte a muncii. Versiunea FFmpeg, CUDA_HOME, git-lfs, backbone-ul cu poartă, torchcodec: niciuna dintre acestea nu sunt probleme ale modelului și fiecare dintre ele oprește rularea.
- Conversia de la v3.0 la v2.1 necesită un virtualenv separat cu propriul pas de instalare și rescrie directorul setului de date pe loc.
- Închirierea GPU începe să factureze când începeți depanarea, nu când începe antrenamentul, și nimic nu oprește instanța când rularea se termină.
- Lipsa unui seed înseamnă lipsa reproductibilității bit-cu-bit, pe lângă o varianță de 5 până la 6 procente de la o rulare la alta doar din augmentare.
Două moduri de a obține același checkpoint
Închiriezi GPU-ul și deții controlul fiecărui pas. Realist vorbind, prima dată durează o după-amiază, iar apoi douăzeci de minute de fiecare dată.
- Înregistrează episoade cu lerobot-record pe SO-100. Vei obține un set de date LeRobot v3.0.
- Convertește-l la v2.1 cu scripts/lerobot_conversion/convert_v3_to_v2.py în propriul său virtualenv.
- Scrie meta/modality.json și o configurație de modalitate Python, înregistrată sub EmbodimentTag.NEW_EMBODIMENT.
- Închiriază o placă de 80 GB, clonează cu submodules, uv sync, autentifică-te la Hugging Face.
- Rulează launch_finetune.py, apoi open_loop_eval.py pe mai multe puncte de control și compară tendința MSE înainte de a atinge hardware-ul.
- Extrage punctul de control de pe mașină înainte de a distruge instanța, apoi construiește calea de servire către braț.
Copiază punctul de control de pe instanța închiriată înainte de a o opri. --save-total-limit 5 înseamnă, de asemenea, că punctele de control mai vechi sunt șterse pe măsură ce antrenamentul progresează, deci punctul de control pe care îl doreai la pasul 5000 ar putea să nu mai existe la pasul 20000.
Aceeași sarcină, sub formă de formular. Alegi modelul și setul de date, backend-ul închiriază un GPU de pe piața spot în funcție de VRAM-ul necesar, rulează antrenorul și scrie punctele de control în stocarea de obiecte. Ghidul GR00T N1.7 pe SO-100 este exact această combinație; matricea de antrenament conține orice altă pereche de model și braț, inclusiv GR00T N1.7 pe SO-101.
| Ce trimite antrenorul groot1.7 | Valoare |
|---|---|
| Dimensiune batch | 32 |
| Rată de învățare | 1e-4 |
| Pași maximi | 20000 |
| Acumulare gradient | 1, and it does take effect for this trainer |
| Parametru suplimentar expus în formular | saveSteps |
| Punct de control de bază | nvidia/GR00T-N1.7-3B |
| Format set de date acceptat | LeRobot v2.0 or v2.1 |
Setul de date poate proveni dintr-un ID de repo Hugging Face, de pe propria mașină sau dintr-o sesiune înregistrată cu clientul desktop. Inferența este un pas separat: platforma provizionează un pod care servește politica, iar clientul robot local comunică cu acel endpoint. Podurile includ un watchdog de inactivitate și se distrug singure după o perioadă de inactivitate, astfel încât o filă de browser uitată nu va genera costuri peste noapte. Dacă preferi să nu dai click, aceleași operațiuni există pe CLI și pe serverul MCP.
GR00T N1.7 și Pi0.5 sunt disponibile doar în cloud aici; doar SmolVLA și ACT rulează și local. Cerința v2.1 nu dispare nici ea, deoarece un set de date v3.0 trebuie încă convertit înainte ca încărcătorul GR00T să-l accepte. Și nimic nu scrie semantica modality.json pentru tine: dacă cheile camerei sau cheia limbii sunt greșite, ele sunt greșite pe ambele rute. Vezi documentația de antrenament pentru a înțelege ce face și ce nu face backend-ul în numele tău.

Reîncărcarea punctului de control pe braț
Isaac-GR00T utilizează o arhitectură server-client peste ZMQ. Politica rulează pe GPU, iar un client subțire de pe mașina robotului trimite observații și primește fragmente de acțiuni. Exemplul SO-100 este suficient de complet pentru a fi copiat: pornește run_gr00t_server.py cu punctul tău de control și --embodiment-tag NEW_EMBODIMENT, apoi rulează eval_so100.py pe partea robotului cu portul serial, ID-ul robotului, indicii camerei și instrucțiunea lingvistică. Numele camerelor din acea comandă trebuie să se potrivească cu numele prietenoase din modality.json, nu cu numerele dispozitivelor din sistemul de operare.
# 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"În timp ce reconectați brațul: SO-100 utilizează servo-uri de autobuz Feetech STS3215 pe o șină de 7.4 V. Alimentarea lor cu 12 V le distruge, și este o greșeală ușoară dacă dețineți și un LeKiwi, a cărui bază funcționează la 12 V în timp ce brațul său nu. Verificați alimentarea înainte de prima pornire, nu după ce iese fum. Vezi pagina hardware a SO-100 și SO-100 versus LeKiwi. Dacă brațul pornește, dar nimic nu se mișcă, servo nu răspunde este locul de unde să începeți.
Acum partea sinceră despre unde rulează politica, deoarece antrenamentul și servirea au istorii hardware diferite. Fine-tuning-ul necesită 40 GB sau mai mult. Inferența nu: README-ul o plasează la 16 GB sau mai mult și menționează explicit RTX 4090, deci o placă pe care o dețineți deja poate servi un checkpoint pe care nu l-ar fi putut produce niciodată. Ceea ce decide dacă politica se simte responsivă nu este VRAM-ul, ci unde se află serverul. Pe AY-Robots GR00T N1.7 este doar în cloud, deci bucla de control plătește o călătorie dus-întors prin internetul public pe lângă cei 152 ms per pas de acțiune, și doar SmolVLA și ACT rulează și local. Pentru operațiuni lente de pick and place, un pod la distanță este suportabil. Pentru orice reactiv, nu este: politica devine ezitantă într-un mod care arată exact ca o eroare de antrenament și nu este una. ACT la 20 ms per pas de acțiune este modelul care tolerează cea mai strânsă buclă, SmolVLA se situează la 245 ms, și nicio cantitate de reglaj al latenței nu recuperează o călătorie dus-întors care a fost deja cheltuită. Rulați prima dvs. politică parcurge partea de servire de la un capăt la altul.
Ce merge de fapt greșit
- GatedRepoError la prima rulare. Nu vi s-a acordat acces la nvidia/Cosmos-Reason2-2B sau nu v-ați autentificat. Acest lucru se întâmplă după ce ceasul GPU a pornit deja.
- Set de date respins la încărcare. Aproape întotdeauna un set de date v3.0. Convertiți-l la o versiune anterioară. Vezi set de date respins ca v3.
- IndexError privind dimensiunile booleene neconcordante. Ați modificat delta_indices și nu ați regenerat statisticile.
- Memorie insuficientă la lotul 32. Reduceți --global-batch-size și creșteți --gradient-accumulation-steps, sau reduceți --num-shards-per-epoch, ceea ce configurația sugerează explicit când VRAM este limitată. Vezi memorie insuficientă în timpul antrenamentului.
- Pierderea scade, politica nu face nimic. Nu există o împărțire de validare implicită, deci o curbă de antrenament curată demonstrează foarte puțin. Această pagină acoperă diagnosticul.
- Funcționează în configurația dvs. și nicăieri altundeva. De așteptat cu un set de date mic filmat într-o singură condiție de iluminare. NVIDIA recomandă augmentarea cu variații de culoare (colour jitter) plus 20 până la 50 de episoade în condiții de iluminare diferite. Mai multe aici.
- Prehensorul nu se închide niciodată corect. Verificați ca acțiunea prehensorului să fie ABSOLUTĂ și articulațiile brațului RELATIVE, în această ordine în action_configs. Prehensorul nu se închide listează celelalte cauze.
- O cameră se deconectează silențios în timpul înregistrării. Episodul se salvează în continuare și cheia video încă există, motiv pentru care aceasta este o problemă neplăcută. Camera nu este detectată acoperă acest aspect.
Întregul index de moduri de eșec se găsește la . Dacă alegeți între modele, mai degrabă decât să depanați unul, și au numere de referință cu surse atașate, iar este comparația de care majoritatea oamenilor au nevoie de fapt, deoarece este alegerea între un model pe care îl puteți antrena pe placa de sub birou și unul pentru care trebuie să închiriați un nod de 80 GB pentru a-l ajusta fin. Pentru contextul motivului pentru care aceste modele se comportă așa cum o fac, și merită citite mai întâi. Și dacă nu dețineți încă un braț, transmite în flux un SO-100 fizic fără înregistrare.
Câte episoade am nevoie înainte ca ajustarea fină a GR00T N1.7 să merite?▾
AY-Robots stabilește un prag minim de 50 de episoade pentru antrenorul groot1.7. FAQ-ul propriu al NVIDIA este mai exigent: aproximativ 100 de traiectorii pentru o operațiune simplă de ridicare și plasare într-o locație fixă, 500 sau mai multe pentru scene complexe sau cu mai mulți pași, și 100 până la 500 pentru manipulare fină. Sub 50 de episoade, este aproape întotdeauna mai bine să înregistrați mai multe date decât să ajustați hiperparametrii. Dacă succesul stagnează după aceea, NVIDIA recomandă HG-DAgger: rulați politica, interveniți când eșuează și adăugați acele corecții la setul de date.
De ce nu se încarcă setul meu de date și cum îmi dau seama ce versiune este?▾
Deschideți meta/info.json și citiți codebase_version. CODEBASE_VERSION-ul curent al LeRobot pe main este v3.0, deci orice înregistrat cu un set de instrumente recent este v3.0, iar încărcătorul GR00T se așteaptă la v2. Convertiți cu scripts/lerobot_conversion/convert_v3_to_v2.py din depozitul Isaac-GR00T, care scrie codebase_version: v2.1 în setul de date convertit. Scriptul rulează în propriul său virtualenv deoarece are nevoie de o versiune lerobot diferită de cea specificată de GR00T.
Pot ajusta fin GR00T N1.7 pe un RTX 4090?▾
Nu. NVIDIA recomandă 40 GB sau mai mult de VRAM pentru ajustare fină și menționează noduri H100 sau L40; alte plăci funcționează, dar durează mult mai mult. Un 4090 are 24 GB. AY-Robots oferă GR00T N1.7 doar pe nivelul A100 80 GB și H100 80 GB din același motiv. Inferența este o altă poveste: 16 GB sunt suficienți pentru a servi modelul, deci un 4090 poate rula o politică pe care nu o poate antrena. Dacă doriți un VLA pe care îl puteți antrena pe 24 GB, acesta este SmolVLA la aproximativ 450 M parametri sau ACT la aproximativ 80 M.
De ce două rulări cu aceleași flag-uri dau checkpoint-uri diferite?▾
Deoarece launch_finetune.py nu are un seed. Este o interfață CLI tyro generată dintr-o dataclass care nu conține un câmp seed, deci nimic nu fixează RNG-ul. Depozitul notează separat o varianță de 5 până la 6 procente între rulări cauzată de augmentarea nedeterministică a imaginilor. Dacă reproductibilitatea contează, utilizați ruta LeRobot în schimb: lerobot-train acceptă --seed, iar rețeta GR00T publicată transmite --seed=42.
Ar trebui să folosesc Isaac-GR00T sau lerobot-train?▾
Utilizați Isaac-GR00T dacă doriți implementarea de referință, control per-cheie asupra reprezentării acțiunilor, export TensorRT sau exemplele de benchmark pentru a le reproduce înainte de a vă încrede în propriile date. Utilizați lerobot-train dacă setul dvs. de date este deja LeRobot v3.0 și preferați să nu îl convertiți, dacă doriți un seed sau dacă restul stack-ului dvs. este deja LeRobot. Ambele ajustează fin aceleași ponderi nvidia/GR00T-N1.7-3B. Rețineți că LeRobot a renunțat complet la suportul GR00T N1.5: checkpoint-urile N1.5 sunt respinse cu o notă de migrare și trebuie să fixați lerobot==0.5.1 pentru a le putea utiliza în continuare.
Am nevoie cu adevărat de o cameră de încheietură pe lângă o cameră frontală?▾
Configurația SO-100 livrată utilizează ambele, iar modality.json mapează camera frontală și cea de încheietură ca chei video separate. Puteți antrena cu o singură cameră, iar tabelul de latență al cardului modelului este măsurat cu o singură cameră, dar vizualizarea de la încheietură este cea care oferă politicii informații utile despre prehensor în momentul contactului. Dacă prehensorul se închide la momentul nepotrivit în rulările dvs., o cameră de încheietură lipsă sau prost orientată este unul dintre primele lucruri de verificat.
Ajustați fin GR00T N1.7 pe SO-100-ul dvs. fără a construi mai întâi mediul
Alegeți modelul, setul de date și hiperparametrii într-un formular. Backend-ul închiriază un A100 80 GB sau H100 de pe piața spot, rulează antrenorul cu lotul 32, rata de învățare 1e-4 și 20000 de pași, și scrie checkpoint-urile în stocarea de obiecte. Aproximativ 4 până la 12 USD per rulare.
Deschideți ghidul de antrenament 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