Pagina de ghid AY-Robots pentru antrenarea GR00T N1.7 pe un braț SO-100, arătând nivelul GPU necesar, formatul setului de date și setările implicite ale antrenorului
GR00T N1.7SO-100Reglare finăLeRobotVLA

Cum să antrenezi GR00T N1.7 pe propriul tău set de date SO-100

AY-Robots ResearchAugust 23, 202628 min de citit

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ă.

ProprietateValoareSursa
Parametri3,000,000,000Hugging Face model card
Backbone viziune-limbajnvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Facerepo README
Cap de acțiuneFlow-matching diffusion transformer, 16 layers (N1.6 had 32)repo README
Orizont de acțiune prezis40 steps for the base checkpoint (N1.6 had 16)getting_started/policy.md and repo README
Lățime maximă stare și acțiune132 (N1.6 had 29)repo README
Licență codApache 2.0Isaac-GR00T repository
Licență ponderiNVIDIA Open Model License Agreementmodel card
Latență, H100 80 GB, PyTorch eager, 4 pași de denoising, 1 cameră85.8 ms end to end, 11.7 Hzmodel card timing table
Același hardware, pipeline complet TensorRT27.9 ms end to end, 35.9 Hzmodel card timing table
Latența citată de AY-Robots pentru GR00T N1.7 servit152 ms per action stepAY-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.

Pagina modelului AY-Robots pentru GR00T N1.7, afișând numărul de parametri, nivelul GPU, latența inferenței și punctele forte și limitele declarate ale modelului
Pagina /policies/groot-n1-7 conține aceeași bandă de specificații pe care altfel ați asambla-o manual din fișa modelului și din fișierul README al depozitului.

Ce necesită rularea înainte de a introduce orice

CerințăAntrenare finăInferență
VRAM, recomandări NVIDIA40 GB sau mai mult, H100 sau L40 recomandat16 GB sau mai mult, un RTX 4090 funcționează
Python și CUDA pe dGPU3.12 și CUDA 12.83.12 și CUDA 12.8
Backend videotorchcodec 0.8.0, doar FFmpeg 4 până la 7idem
Format set de dateLeRobot v2 plus meta/modality.jsonnu se aplică
Acces Hugging Faceaprobat pentru nvidia/Cosmos-Reason2-2Bidem
Alte instrumentegit-lfs și uvuv
Nivel GPU AY-Robots pentru antrenorul groot1.7A100 80 GB sau H100 80 GBpod alocat automat
Backbone-ul restricționat te va opri la prima rulare

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.

bash
lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower_arm \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_leader_arm \
    --dataset.repo_id=${HF_USER}/cube-into-bowl \
    --dataset.num_episodes=60 \
    --dataset.single_task="put the cube in the yellow bowl" \
    --display_data=true
lerobot-record pe un LeRobot actual. Lungimea episodului este implicit 60 s și timpul de resetare 60 s. so100_follower și so101_follower sunt ambele înregistrate în aceeași clasă de configurare LeRobot, motiv pentru care exemplul Isaac-GR00T SO100 folosește numele so101; oricare funcționează pe un SO-100. Numele camerelor pe care le alegeți aici (front, wrist) sunt numele care trebuie să reapară în modality.json.

Recomandarea 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.

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

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

# or, back in the repo root, keep it next to the SO-100 example
uv run --project scripts/lerobot_conversion \
  python scripts/lerobot_conversion/convert_v3_to_v2.py \
  --repo-id <your-hf-user>/<your-dataset> \
  --root examples/SO100/my_dataset_lerobot
Convertorul acceptă --repo-id, un --root opțional și --force-conversion, care șterge orice instantaneu local existent și îl descarcă din nou. Acesta scrie codebase_version: v2.1 în meta/info.json.
Conversia suprascrie pe loc

Dacă 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./, și un fișier suplimentar pe care LeRobot standard nu îl are. Acel fișier suplimentar este locul unde se găsesc majoritatea eșecurilor rămase.

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.

json
{
  "state": {
    "single_arm": {
      "start": 0,
      "end": 5
    },
    "gripper": {
      "start": 5,
      "end": 6
    }
  },
  "action": {
    "single_arm": {
      "start": 0,
      "end": 5
    },
    "gripper": {
      "start": 5,
      "end": 6
    }
  },
  "video": {
    "front": {
      "original_key": "observation.images.front"
    },
    "wrist": {
      "original_key": "observation.images.wrist"
    }
  },
  "annotation": {
    "human.task_description": {
      "original_key": "task_index"
    }
  }
}
examples/SO100/modality.json. Indicii sunt bazați pe zero și urmează slicing-ul Python, deci single_arm este [0:5] și gripper este [5:6].

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.

StratFișierForma SO-100 utilizată în depozit
Coloană Parquetdata/chunk-*/episode_*.parquetannotation.human.task_description
Cheie modality.jsonmeta/modality.json, under "annotation", without the annotation. prefixhuman.task_description
modality_keys în configurația de dateyour so100_config.pyannotation.human.task_description
De ce cheia de limbaj creează probleme

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ă.

python
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.embodiment_tags import EmbodimentTag
from gr00t.data.types import (
    ActionConfig, ActionFormat, ActionRepresentation, ActionType, ModalityConfig,
)

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

register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)
examples/SO100/so100_config.py, redus la elementele esențiale. NON_EEF înseamnă spațiu articular; EEF ar aștepta un vector nouă-dimensional de x, y, z plus o rotație 6D.

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.

Modifică delta_indices și trebuie să regenerezi statisticile

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.

  1. 1
    Instalaț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.

    bash
    sudo apt install git-lfs && git lfs install
    git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
  2. 2
    Instalaț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.

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

    Faceți acest lucru înainte de prima lansare a antrenamentului, nu după ce eșuează după opt minute.

    bash
    uv run huggingface-cli login   # or: export HF_TOKEN=<your_token>
  4. 4
    Verificare 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.

    bash
    CUDA_VISIBLE_DEVICES=0 uv run python \
        gr00t/experiment/launch_finetune.py \
        --base-model-path nvidia/GR00T-N1.7-3B \
        --dataset-path demo_data/cube_to_bowl_5 \
        --embodiment-tag NEW_EMBODIMENT \
        --modality-config-path examples/SO100/so100_config.py \
        --num-gpus 1 \
        --output-dir /tmp/test_finetune \
        --max-steps 2000 \
        --global-batch-size 32 \
        --dataloader-num-workers 4
Două capcane de mediu care par a fi erori de model

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.

bash
export NUM_GPUS=1
CUDA_VISIBLE_DEVICES=0 uv run python \
    gr00t/experiment/launch_finetune.py \
    --base-model-path nvidia/GR00T-N1.7-3B \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --modality-config-path examples/SO100/so100_config.py \
    --num-gpus $NUM_GPUS \
    --output-dir /tmp/so100 \
    --save-total-limit 5 \
    --save-steps 2000 \
    --max-steps 20000 \
    --use-wandb \
    --global-batch-size 32 \
    --color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \
    --dataloader-num-workers 4
Un singur GPU. Pentru opt plăci, înlocuiți lansatorul cu uv run torchrun --nproc_per_node=8 --master_port=29500 și setați --num-gpus 8. Folosiți uv run torchrun, nu doar torchrun, altfel veți obține un mediu greșit.
FlagValoare implicită în FinetuneConfigCe face
--global-batch-size64Batch total pe toate GPU-urile înainte de acumularea gradientului. Exemplele livrate folosesc 32.
--learning-rate1e-4Aceeași valoare pe care AY-Robots o trimite pentru antrenorul său groot1.7.
--max-steps10000Număr total de pași ai optimizatorului. Wrapper-ul examples/finetune.sh are, de asemenea, o valoare implicită de 10000.
--gradient-accumulation-steps1Multiplică batch-ul efectiv. Valorile peste 1 emit un avertisment care indică dimensiunea acumulată.
--save-steps and --save-total-limit1000 and 5Frecvența checkpoint-urilor și câte sunt păstrate. Cele mai vechi sunt șterse.
--weight-decay and --warmup-ratio1e-5 and 0.05Setat explicit și de examples/finetune.sh.
--state-dropout-prob0.2 in the CLI, 0.8 in the model configElimină aleatoriu starea proprioceptivă în timpul antrenamentului. Reduceți-o dacă sarcina dumneavoastră se bazează pe stare.
--tune-llm and --tune-visualFalse and FalseColoana vertebrală rămâne înghețată implicit.
--tune-projector and --tune-diffusion-modelTrue and TrueProiectorul și capul de acțiune de difuzie sunt cele care se antrenează de fapt.
--use-percentilesTrueNormalizează cu q01 și q99 în loc de min și max brute.
--dataloader-num-workers2Încărcătorul este bazat pe CPU prin design. Exemplele ridică această valoare la 4.
--seednu 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.

Validarea este dezactivată implicit, iar flag-ul documentat nu este disponibil în acest CLI

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.

ModelNivel GPUDurată tipicăCost tipicEpisoade minime
GR00T N1.7A100 80 GB or H100 80 GB3 to 6 hours4 to 12 USD50
GR00T N1.5A100 80 GB or H100 80 GB3 to 6 hours4 to 12 USD50
Pi0.5A100 80 GB or H100 80 GB3 to 6 hours4 to 12 USD50
SmolVLARTX 4090 or any 24 GB card2 to 5 hours1 to 3 USD30
ACTRTX 4090 or any 24 GB card2 to 5 hours1 to 3 USD50

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.

Ghidul de antrenament AY-Robots pentru GR00T N1.7 pe SO-100, arătând banda de specificații cu nivelul GPU, formatul necesar al setului de date și valorile implicite ale antrenorului
Ghidul /train/groot-n1-7-on-so-100 prezintă faptele pe care altfel le-ați reconstrui manual: nivelul GPU, formatul setului de date și valorile implicite exacte trimise de antrenor.

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.

bash
uv run python gr00t/eval/open_loop_eval.py \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --model-path /tmp/so100/checkpoint-20000 \
    --traj-ids 0 \
    --execution-horizon 16 \
    --steps 400 \
    --modality-keys single_arm gripper
Graficele sunt salvate în /tmp/open_loop_eval/traj_<id>.jpeg, cu excepția cazului în care specificați --save-plot-path. Valori implicite: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

Repozitoriul 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 controlMSE mediu pe traiectoria 0MAE mediu pe traiectoria 0
50087.55.63
100025.43.30
150013.22.18
200010.01.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.

SimptomCauză probabilă
MSE plat sau în creștere pe parcursul punctelor de controlRata 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 antrenamentuluiNormalizarea 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 validareLipsa 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.

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

lerobot-train \
  --dataset.repo_id=$HF_USER/$DATASET_NAME \
  --dataset.image_transforms.enable=true \
  --policy.type=groot \
  --policy.device=cuda \
  --policy.base_model_path=nvidia/GR00T-N1.7-3B \
  --policy.embodiment_tag=new_embodiment \
  --policy.chunk_size=16 \
  --policy.n_action_steps=16 \
  --policy.use_relative_actions=true \
  --policy.relative_exclude_joints='["gripper"]' \
  --policy.use_bf16=true \
  --seed=42 \
  --batch_size=64 \
  --steps=20000 \
  --save_freq=5000 \
  --output_dir=$OUTPUT_DIR
Rețeta GR00T N1.7 nativă LeRobot. Rețineți relative_exclude_joints: gripper-ul este exclus din acțiunile relative, ceea ce este aceeași decizie pe care o ia so100_config.py cu ActionRepresentation.ABSOLUTE.
AspectIsaac-GR00T launch_finetune.pylerobot-train --policy.type=groot
Versiunea setului de dateDoar LeRobot v2, este necesară conversiaSet de date LeRobot nativ, fără retrogradare
Maparea modalitățiimeta/modality.json plus o configurație de date Pythonfără modality.json; comportamentul este setat de flag-urile --policy.* din linia de comandă
Seedfără niciun flag seed--seed, LeRobot default 1000
Acțiuni relativeActionConfig per-cheie în configurația datelor--policy.use_relative_actions plus --policy.relative_exclude_joints
Rezultate de referință publicateTendința MSE în buclă deschisă SO-100 pe date demoSuite LIBERO, medie de 96.5 procente pe patru suite
Calea de implementarerun_gr00t_server.py plus eval_so100.py over ZMQlerobot-rollout, with real-time chunking (queue_threshold should stay at or below 5)
Rularea fine-tune-ului pe cont propriu
Avantaje
  • 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.
Compromisuri
  • 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ă.

  1. Înregistrează episoade cu lerobot-record pe SO-100. Vei obține un set de date LeRobot v3.0.
  2. Convertește-l la v2.1 cu scripts/lerobot_conversion/convert_v3_to_v2.py în propriul său virtualenv.
  3. Scrie meta/modality.json și o configurație de modalitate Python, înregistrată sub EmbodimentTag.NEW_EMBODIMENT.
  4. Închiriază o placă de 80 GB, clonează cu submodules, uv sync, autentifică-te la Hugging Face.
  5. 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.
  6. Extrage punctul de control de pe mașină înainte de a distruge instanța, apoi construiește calea de servire către braț.
Pasul pe care toată lumea îl uită

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.

Matricea de antrenament AY-Robots cu cinci modele de politici ca rânduri și patru brațe robotice ca coloane, fiecare celulă făcând legătura către un ghid de antrenament specific
Matricea /train: cinci modele versus patru brațe. Rândul GR00T N1.7 acoperă, de asemenea, SO-101, Koch v1.1 și LeKiwi.

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.

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

# robot side, from gr00t/eval/real_robot/SO100
uv run --no-sync python eval_so100.py \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM2 \
  --robot.id=orange_follower \
  --robot.cameras="{ front: {type: opencv, index_or_path: 6, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
  --policy_host=localhost --policy_port=5555 \
  --lang_instruction="put the cube in the yellow bowl"
--execution-horizon controlează câți dintre pașii prezisi sunt executați înainte de re-planificare. Trebuie să fie cel mult action_horizon-ul politicii, iar acel număr este lungimea delta_indices-urilor acțiunii în configurația modalității dvs., nu a modelului de bază. Configurația SO-100 livrată prezice 16, deci 16 este limita superioară; checkpoint-ul de bază nvidia/GR00T-N1.7-3B este configurat pentru 40, iar policy.md afirmă clar că checkpoint-urile finetunate pot diferi. Depășiți-l și veți primi un ValueError care menționează ambele numere. 8 este valoarea sugerată de documentație pentru implementarea în timp real. Vechiul nume de flag --action-horizon funcționează în continuare, dar emite o avertizare.
7.4 V, nu 12 V

Î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.7

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started