AY-Robots vadovo puslapis, skirtas apmokyti GR00T N1.7 SO-100 robotą, rodantis reikalingą GPU lygį, duomenų rinkinio formatą ir treniruoklio numatytuosius nustatymus
GR00T N1.7SO-100TikslinimasLeRobotVLA

Kaip apmokyti GR00T N1.7 savo SO-100 duomenų rinkinyje

AY-Robots ResearchAugust 23, 202628 min. skaitymo

Išbandytas vadovas, skirtas tikslinti NVIDIA GR00T N1.7 SO-100 LeRobot duomenų rinkinyje: tikrosios vėliavėlės, modality.json, v2.1 reikalavimas, kiek kainuoja paleidimas ir spąstai.

NVIDIA pateikia tikslaus derinimo pavyzdį būtent tai rankai, kurią tikriausiai turite. Viduje Isaac-GR00T saugyklos yra aplankas pavadinimu demo_data/cube_to_bowl_5: penki epizodai, 4 148 kadrai 30 kadrų per sekundę greičiu, jau parašyti kaip LeRobot v2.1, su atitinkama modalumo konfigūracija po examples/SO100/. Jo meta/info.json praneša robot_type: so101_follower, kuri LeRobot sistemoje yra ta pati konfigūracijos klasė kaip so100_follower. Tai tikrai naudinga, nes tai reiškia, kad nuorodos kelias į GR00T N1.7 ant šešių laisvės laipsnių hobių rankos yra palaikomas žmonių, kurie parašė modelį. Tai nėra sumažinta humanoido demonstracija, tai yra ta pati ranka.

Bloga žinia yra atstumas tarp I recorded 60 episodes ir the arm does the task. Yra maždaug šešios vietos, kur ši konvejerio grandinė tyliai, o ne garsiai, sugenda, ir keturios iš jų yra failuose, kurių dauguma žmonių niekada neatidaro: meta/modality.json, Python duomenų konfigūracija, meta/relative_stats.json, ir paties duomenų rinkinio versijos eilutė. Šis vadovas parodo rankinį kelią nuo pradžios iki pabaigos su tikromis komandomis, tada parodo tą patį darbą kaip formą AY-Robots. Viskas, kas pateikta žemiau, buvo patikrinta pagal Isaac-GR00T pagrindinę šaką nuo 2026 m. rugpjūčio 20 d. (n1.7-release linija) ir lerobot 0.6.1, paskelbtą PyPI 2026 m. rugpjūčio 3 d. Aukštesnė versija juda greitai, ir jei vėliavėlė buvo pervadinta, šiame straipsnyje tai nurodoma.

Ką reikia žinoti prieš pradedant

  • GR00T N1.7 tiksliajam derinimui reikia 40 GB ar daugiau VRAM. NVIDIA rekomenduoja H100 arba L40 mazgus. 24 GB RTX 4090 šio darbo neatliks, nors ji apmokys SmolVLA ir ACT.
  • Duomenų rinkinys turi būti LeRobot v2 (v2.0 arba v2.1) plius GR00T specifinis meta/modality.json. LeRobot v3.0 duomenų rinkinys neįkeliamas ir turi būti konvertuojamas į žemesnę versiją.
  • Įėjimo taškas yra gr00t/experiment/launch_finetune.py, tyro CLI. Jis neturi --seed vėliavėlės, todėl paleidimai nėra bitas į bitą atkuriami.
  • Individualizuotai rankai įkūnijimo žyma yra NEW_EMBODIMENT, ir ši žyma daro --modality-config-path privalomą.
  • Pateiktas SO-100 receptas numato rankos jungtis kaip RELATIVE deltas, o griebtuvą kaip ABSOLUTE tikslą. Šio poravimo atvirkštinis atlikimas yra tylus gedimas, o ne klaida.
  • AY-Robots sistemoje tas pats darbas yra forma: 20000 žingsnių, paketas 32, mokymosi greitis 1e-4, maždaug 4–12 USD A100 80 GB arba H100 lygyje.

Kas iš tikrųjų yra GR00T N1.7

GR00T N1.7 yra regos-kalbos-veiksmų modelis su dviejų sistemų išdėstymu, aprašytu originaliame GR00T N1 dokumente: regos-kalbos modulis, kuris nuskaito kameras ir instrukcijas, ir difuzijos transformatorius, kuris tai paverčia nepertraukiamų variklio komandų bloku. N1.7 pakeitė pirmąją pusę. „Eagle“ pagrindas iš N1.6 dingo, pakeistas į nvidia/Cosmos-Reason2-2B ant Qwen3-VL architektūros, o modelis buvo iš anksto apmokytas maždaug 20 000 valandų egocentrinio žmogaus vaizdo įrašų, be roboto duomenų. Pačios NVIDIA aprašyme nurodomas 20 854 valandų skaičius ir teigiama, kad padidinus nuo 1 tūkst. iki 20 tūkst. valandų, vidutinis užduočių atlikimas padidėja daugiau nei dvigubai.

Antroji pusė taip pat pasikeitė, ir tai svarbu jūsų vykdymui. Veiksmų galvutė sumažėjo nuo 32 difuzijos sluoksnių iki 16, numatytas veiksmų blokas išaugo nuo 16 žingsnių iki 40, o maksimalus būsenos ir veiksmo plotis padidėjo nuo 29 iki 132. Šie trys skaičiai paimti iš saugyklos README pakeitimų žurnalo; pačios NVIDIA paleidimo įraše vis dar aprašoma 1 sistema kaip 32 sluoksnių DiT, todėl, jei šie du šaltiniai nesutampa, pasitikėkite saugykla, kurią ketinate klonuoti. Veiksmai pagal numatytuosius nustatymus išreiškiami santykine galinio efektoriaus erdve, t. y. dabartinės pozos delta, o ne absoliučiais tikslais, o tai leidžia manipuliavimo prioritetams, išmoktiems iš žmogaus vaizdo įrašų, persikelti į roboto valdymą. Pati galvutė yra srauto derinimo difuzijos transformatorius, tos pačios šeimos kaip Pi0.5, bet su kitu pagrindu priešais jį. Jei vis dar naudojate ankstesnę kartą, N1.7 prieš N1.5 aprašo, ar atnaujinimas pateisina jūsų konvejerio perdarymą.

SavybėVertėŠaltinis
Parametrai3,000,000,000Hugging Face model card
Regos-kalbos pagrindasnvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Facerepo README
Veiksmų galvutėFlow-matching diffusion transformer, 16 layers (N1.6 had 32)repo README
Numatytas veiksmų horizontas40 steps for the base checkpoint (N1.6 had 16)getting_started/policy.md and repo README
Maksimalus būsenos ir veiksmo plotis132 (N1.6 had 29)repo README
Kodo licencijaApache 2.0Isaac-GR00T repository
Svorio licencijaNVIDIA Open Model License Agreementmodel card
Vėlavimas, H100 80 GB, PyTorch eager, 4 triukšmo šalinimo žingsniai, 1 kamera85.8 ms end to end, 11.7 Hzmodel card timing table
Ta pati aparatinė įranga, TensorRT pilnas konvejeris27.9 ms end to end, 35.9 Hzmodel card timing table
Vėlavimas, kurį AY-Robots nurodo savo aptarnaujamam GR00T N1.7152 ms per action stepAY-Robots policy catalog

Šios paskutinės trys eilutės paaiškina didžiąją dalį žmonių pranešamo nusivylimo. Antraštėje nurodytas 27.9 ms yra TensorRT variklis H100 su viena kamera ir keturiais triukšmo šalinimo žingsniais. Paprastas PyTorch toje pačioje kortelėje yra 85.8 ms, o modelio kortelė nurodo, kad skirtumas yra 3.08x. Nė vienas skaičius neapima aptarnavimo sluoksnio, antros kameros ar tinklo šuolio. 152 ms per veiksmo žingsnį, kurį AY-Robots nurodo savo aptarnaujamam GR00T N1.7, yra skaičius su aptarnavimu cikle, o viešojo interneto kelionė pirmyn ir atgal yra virš to. Daugiau apie tai pabaigoje. Norėdami pamatyti skaičius šalia kitų modelių, GR00T N1.7 prieš Pi0.5 ir GR00T N1.7 prieš SmolVLA pateikia juos vienas šalia kito.

The AY-Robots model page for GR00T N1.7 showing parameter count, GPU tier, inference latency and the model's stated strengths and limits
The /policies/groot-n1-7 page carries the same spec strip you would otherwise assemble by hand from the model card and the repo README.

Ko reikia paleidimui prieš ką nors įvedant

ReikalavimasTikslinimasIšvada
VRAM, NVIDIA rekomendacijos40 GB ar daugiau, rekomenduojama H100 arba L4016 GB ar daugiau, tinka RTX 4090
Python ir CUDA dGPU3.12 ir CUDA 12.83.12 ir CUDA 12.8
Vaizdo posistemėtorchcodec 0.8.0, tik FFmpeg 4 iki 7tas pats
Duomenų rinkinio formatasLeRobot v2 plius meta/modality.jsonnetaikoma
Hugging Face prieigapatvirtinta nvidia/Cosmos-Reason2-2Btas pats
Kiti įrankiaigit-lfs ir uvuv
AY-Robots GPU lygis groot1.7 treniruokliuiA100 80 GB arba H100 80 GBpodas automatiškai parūpinamas
Uždara pagrindinė sistema sustabdys jus pirmojo paleidimo metu

Kiekvienas GR00T kontrolinis taškas, įskaitant bazinį nvidia/GR00T-N1.7-3B, pirmojo naudojimo metu įkelia nvidia/Cosmos-Reason2-2B, ir ši saugykla yra uždara. README faile tiksliai nurodomas gedimas: modelio įkėlimas nepavyksta su GatedRepoError / 401 Client Error. Ko jame neminima, tai kada tai įvyksta, o tai yra po to, kai išsinuomojote kortelę ir paleidimas prasidėjo. Prašykite prieigos modelio puslapyje, tada paleiskite uv run huggingface-cli login arba eksportuokite HF_TOKEN prieš ką nors nuomodami.

0 žingsnis: patys epizodai

Viskas toliau daroma prielaida, kad jau įrašėte epizodus. Jei ne, tai yra tikrasis pirmasis žingsnis ir būtent jis lemia, koks geras gali būti rezultatas, nes mokymasis imitacija negali atkurti informacijos, kurios nėra duomenyse. Pirmiausia sukalibruokite abi rankas, tada valdykite sekėją su lyderio ranka kol lerobot-record rašo parquet failus ir kamerų srautus. Jei kalibravimas yra netikslus, jūsų duomenų rinkinio jungčių vertės apibūdina šiek tiek kitokį robotą nei tas, kuris vėliau vykdys politiką, ir joks apmokymas to nepataisys.

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 dabartiniame LeRobot. Epizodo trukmė numatytoji 60 s, o atstatymo laikas 60 s. so100_follower ir so101_follower yra abu registruoti toje pačioje LeRobot konfigūracijos klasėje, todėl Isaac-GR00T SO100 pavyzdys naudoja so101 pavadinimus; abu veikia su SO-100. Kamerų pavadinimai, kuriuos pasirenkate čia (front, wrist), yra tie pavadinimai, kurie turi vėl atsirasti modality.json.

Pats LeRobot pataria įrašyti bent 50 epizodų, maždaug po 10 kiekvienai objekto vietai, laikyti kameras fiksuotas ir išlaikyti nuoseklų sugriebimo elgesį. Variacijas pridėkite vėliau, ne pradžioje. Verta prisiminti taisyklę: jei negalėjote atlikti užduoties patys vien tik iš kameros vaizdų, politika taip pat negali. Dėl rankos specifikos nustatymo, SO-100 pradžia ir SO-100 LeRobot puslapis apima prievadus, kalibravimą ir kamerų indeksus. AY-Robots taip pat galite tai atlikti internetu iš naršyklės, naudodami teleoperacija ir įrašyti tiesiai iš sesijos.

1 žingsnis: duomenų rinkinys turi būti LeRobot v2.1

Tai yra dažniausiai pasitaikanti kliūtis. Dabartinė LeRobot CODEBASE_VERSION pagrindinėje šakoje yra v3.0, todėl viskas, ką įrašote šiandien su dabartine įrankių grandine, bus v3.0. GR00T įkėliklis tikisi v2. Saugykla aiškiai nurodo priežastį: daugelis aukštesnio lygio duomenų rinkinių, tokių kaip DROID, LIBERO ir Bridge, yra publikuojami v2 versijoje, o gimtoji abiejų palaikymas yra planuojamas, bet dar neįdiegtas. Taigi konvertavimas priklauso nuo jūsų, ir jis vykdomas atskiroje virtualioje aplinkoje dėl konkrečios priežasties: scripts/lerobot_conversion turi savo pyproject, kuris reikalauja Python 3.10 arba 3.11 ir pririša lerobot prie vieno git įrašo, o pats Isaac-GR00T reikalauja Python 3.12. Įdiekite konverterį iš saugyklos šaknies ir gausite gr00t paketą, o tai yra klaida, apie kurią įspėja jo README. Jei esate naujokas šiame formate, LeRobot duomenų rinkinio žodyno įrašas paaiškina, kas iš tikrųjų yra viduje.

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
Konverteris priima --repo-id, neprivalomą --root ir --force-conversion, kuris ištrina bet kokią esamą vietinę momentinę kopiją ir atsisiunčia ją iš naujo. Jis įrašo codebase_version: v2.1 į meta/info.json.
Konvertavimas perrašo vietoje

Jei v3.0 duomenų rinkinys jau egzistuoja vietoje, scenarijus sukuria v2.1 išdėstymą šalia jo ir tada sukeičia: originalas perkeliamas į gretimą aplanką su pridėta versija, <name>_v3.0, o konvertuota kopija užima originalų kelią. (Paties scenarijaus docstringas tą aplanką vadina _v30; kodas prideda versijos eilutę, todėl iš tikrųjų gaunate _v3.0.) Antras netikėtumas: išvestis visada atsiduria po <root>/<repo-id>, todėl --root examples/SO100/my_dataset_lerobot suteikia jums examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset>, ir tas ilgesnis kelias yra tas, kurio vėliau nori --dataset-path. Kai mokymo užduotis atmeta jūsų duomenų rinkinį dėl versijos priežasčių, duomenų rinkinio, atmesto kaip v3, puslapyje pateikiami tikslūs simptomai.

Struktūra, kurios GR00T nori po konversijos, yra klasikinė v2 išdėstymo: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, parquet failai po data/chunk-000/, MP4 failai po videos/chunk-000/observation.images./, ir vienas papildomas failas, kurio standartinis LeRobot neturi. Tame papildomame faile slypi dauguma likusių gedimų.

2 žingsnis: modality.json, šeši skaičiai, kurie viską lemia

LeRobot duomenų rinkinyje roboto būsena ir veiksmas saugomi kaip plokšti float32 masyvai. SO-100 atveju abu turi formą [6]: penkių rankos jungčių ir griebtuvo. Demonstracinis duomenų rinkinys juos pavadina shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, tačiau tie pavadinimai yra info.json ir niekas parquet faile nenurodo, kuris indeksas yra kuris. meta/modality.json pateikia tą atvaizdavimą, ir GR00T netreniruos be jo. Štai tas, kurį saugykla pateikia SO-100, pažodžiui.

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. Indeksai yra nulio pagrindu ir atitinka Python pjaustymą, todėl single_arm yra [0:5], o gripper yra [5:6].

Nukopijuokite jį į savo konvertuotą duomenų rinkinį adresu meta/modality.json ir pervadinkite vaizdo įrašų raktus į tikruosius savo kamerų pavadinimus. Jei įrašėte su viena viršutine kamera, pavadinta top, tada original_key yra observation.images.top ir patogus pavadinimas yra tas, į kurį nurodys jūsų duomenų konfigūracija. Jie abu turi sutapti, ir nė vienas iš jų netikrina kito už jus. Kalbos anotacija yra blogesnė, nes tas pats raktas turi pasirodyti trijose vietose.

SluoksnisFailasSO-100 forma, naudojama repozitorijoje
Parquet stulpelisdata/chunk-*/episode_*.parquetannotation.human.task_description
modality.json raktasmeta/modality.json, skiltyje "annotation", be annotation. priešdėliohuman.task_description
modality_keys duomenų konfigūracijojeyour so100_config.pyannotation.human.task_description
Kodėl kalbos raktas klaidina žmones

Segmentus po annotation. pasirenka tas, kas sukūrė duomenų rinkinį. SO-100 demonstraciniai duomenys naudoja annotation.human.task_description; LIBERO ir SimplerEnv naudoja annotation.human.action.task_description. Abu yra galiojantys. Jei nukopijavote konfigūraciją iš LIBERO pavyzdžio ir nukreipėte ją į savo SO-100 įrašą, kalbos kanalas nieko neišsprendžia ir modelis apmokomas tuščia instrukcija. Nuostoliai vis tiek mažėja. Politika vis tiek kažką daro. Ji tiesiog ignoruoja tai, ką jai liepėte daryti.

3 žingsnis: duomenų konfigūracija, santykinė ranka ir absoliutus griebtuvas

Modality konfigūracija yra Python failas, o ne JSON, nes ji taip pat nustato, kaip atvaizduojama kiekviena veiksmų grupė. Tai yra N1.7 darbo eigos dalis, kuri neegzistavo tokia pačia forma N1.5, ir dalis, kurią verta perskaityti du kartus. Pristatyta SO-100 konfigūracija numato penkias rankos jungtis kaip SANTYKINIUS deltas nuo dabartinės būsenos, o griebtuvą kaip ABSOLIUČIĄ tikslinę poziciją, nes dvejetainis atidarymo ar uždarymo signalas geriau veikia kaip tikslas, o ne kaip delta.

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, sutrumpinta iki esminių dalykų. NON_EEF reiškia jungčių erdvę; EEF tikėtųsi devynių matmenų vektoriaus x, y, z plius 6D rotacija.

Dvi detalės čia kainuos jums dieną, jei jų nežinosite. Pirma, action_configs yra pozicinis: dokumentacija reikalauja tokio pat ilgio ir tokios pat tvarkos kaip modality_keys, ir jie atvirai kalba apie klaidos pasekmes, t. y., kad neteisingas atvaizdavimas pritaikomas tyliai. Jūsų griebtuvas apmokomas kaip delta, o jūsų ranka kaip absoliutus tikslas, ir nėra jokio klaidos pranešimo. Antra, register_modality_config patvirtina, kad žyma dar nėra užregistruota, todėl antra NEW_EMBODIMENT konfigūracija tame pačiame Python procese žūsta su Embodiment tag ... already registered. Negalite importuoti dviejų tokių į vieną scenarijų. Trečia taisyklė įgyvendinama vėliau, diegimo metu: veiksmo delta_indices turi būti ištisinis diapazonas, prasidedantis nuo nulio. Retas langas, pvz., [0, 4, 8], atmetamas, nes viskas toliau indeksuoja numatytą fragmentą tiesiškai ir priešingu atveju vykdytų neteisingas eilutes.

Pakeiskite delta_indices ir turite iš naujo sugeneruoti statistiką

Normalizavimo statistika, ypač meta/relative_stats.json, apskaičiuojama pagal horizonto ilgį, kurį turėjote juos generuodami. Sutrumpinus veiksmų horizontą nuo 16 iki 8 be pakartotinio generavimo, apmokymas nutrūksta su IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. Sprendimas yra viena komanda: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Paleiskite ją po bet kokio delta_indices pakeitimo.

4 žingsnis: aplinka

N1.7 perkėlė repozitoriją į uv ir Python 3.12. Senasis conda plius pip install -e . kelias vis dar egzistuoja sutrauktoje README skyriaus dalyje, tačiau jame įspėjama, kad GPU priklausomybėms, įskaitant flash-attn ir TensorRT, gali prireikti rankinio diegimo. Naudokite uv, nebent turite konkrečią priežastį to nedaryti. Kalbant apie flash-attn, viena detalė padeda išvengti painiavos: matysite Installing flash-attn atspausdintą kiekvieną kartą, kai paleidžiate uv run. Tai nėra perstatymas. uv iš naujo patvirtina URL-pririštą ratą, kuris jau yra talpykloje, ir tai užtrunka dvi ar tris sekundes.

  1. 1
    Įdiekite git-lfs, tada klonuokite su submoduliais

    git-lfs yra privalomas, ne pasirenkamas. Be jo parquet failai demo_data/ atsisiunčiami kaip rodyklių šablonai, o demonstracinis paleidimas nepavyksta su duomenų rinkiniu, kuris atrodo esantis failų sąraše.

    bash
    sudo apt install git-lfs && git lfs install
    git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
  2. 2
    Įdiekite uv ir sinchronizuokite aplinką

    Numatytasis diegimas atsisiunčia GPU priklausomybes, įskaitant flash-attn ir TensorRT. Šviežiame A100 arba H100 atvaizde tai yra ilgiausias vienas žingsnis, todėl atlikite tai prieš pradėdami kreipti dėmesį į ką nors kita.

    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
    Autentifikuokite su Hugging Face

    Atlikite tai prieš pirmąjį mokymo paleidimą, o ne po to, kai jis nepavyksta po aštuonių minučių.

    bash
    uv run huggingface-cli login   # or: export HF_TOKEN=<your_token>
  4. 4
    Sveikatos patikrinimas su pateiktais SO-100 demonstraciniais duomenimis

    Prieš liesdami savo įrašą, paleiskite 2000 žingsnių demo_data/cube_to_bowl_5. Tai penki epizodai, jis greitai baigiasi ir patvirtina aplinką, o ne jūsų duomenis. Jei šis paleidimas nepavyksta, niekas, ką darysite su savo duomenų rinkiniu, nepadės.

    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
Dvi aplinkos spąstai, kurie atrodo kaip modelio klaidos

FFmpeg 8. torchcodec 0.8.0 palaiko tik FFmpeg 4–7 versijas, o Ubuntu 25.10 ir naujesnės versijos pateikia 8 versiją. Klaida yra Could not load libtorchcodec, kuri atrodo kaip sugadintas diegimas, o ne versijų konfliktas. Įdiekite senesnę vykdymo aplinką, pavyzdžiui, conda install -c conda-forge 'ffmpeg<8', ir įdėkite jos bibliotekas į LD_LIBRARY_PATH. CUDA_HOME nenustatytas. Tikslinimas visiškai nepavyksta. Paleiskite bash scripts/deployment/dgpu/install_deps.sh vieną kartą, arba tiesiog export CUDA_HOME=/usr/local/cuda.

Žingsnis 5: tikslaus derinimo komanda ir kokios yra jos vėliavėlių numatytosios reikšmės

Pakeiskite demonstracinį duomenų rinkinį savuoju ir pridėkite norimus parametrus. Žemiau pateikiama visa forma, kurią saugykla naudoja savo naujo įkūnijimo pamokoje, įskaitant papildymo ir kontrolinių taškų vėliavėles, kurias trumpas README pavyzdys praleidžia. Tai yra siaurąja prasme: kalbos pagrindas ir vizualinis kodavimo įrenginys lieka užšaldyti, o apmokomi yra projektorius ir difuzijos veiksmo galvutė.

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
Vienas GPU. Aštuonioms kortelėms paleidiklį pakeiskite į uv run torchrun --nproc_per_node=8 --master_port=29500 ir nustatykite --num-gpus 8. Naudokite uv run torchrun, o ne tik torchrun, kitaip gausite neteisingą aplinką.
VėliavėlėNumatytoji reikšmė FinetuneConfigKą ji daro
--global-batch-size64Bendras partijos dydis visuose GPU prieš gradiento kaupimą. Pateiktuose pavyzdžiuose naudojama 32.
--learning-rate1e-4Ta pati reikšmė, kurią AY-Robots siunčia savo groot1.7 treniruokliui.
--max-steps10000Bendras optimizatoriaus žingsnių skaičius. examples/finetune.sh apvalkalas taip pat numato 10000.
--gradient-accumulation-steps1Daugina efektyvią partiją. Reikšmės, didesnės nei 1, išduoda įspėjimą, nurodantį sukauptą dydį.
--save-steps and --save-total-limit1000 and 5Kontrolinių taškų dažnumas ir kiek jų saugoma. Senesni ištrinami.
--weight-decay and --warmup-ratio1e-5 and 0.05Taip pat aiškiai nustatyta examples/finetune.sh.
--state-dropout-prob0.2 in the CLI, 0.8 in the model configAtsitiktinai atmeta propriocepcinę būseną treniruočių metu. Sumažinkite ją, jei jūsų užduotis priklauso nuo būsenos.
--tune-llm and --tune-visualFalse and FalsePagrindas pagal numatytuosius nustatymus lieka užšaldytas.
--tune-projector and --tune-diffusion-modelTrue and TrueProjektorius ir difuzijos veiksmo galvutė yra tai, kas iš tikrųjų treniruojama.
--use-percentilesTrueNormalizuoti naudojant q01 ir q99, o ne neapdorotus min ir max.
--dataloader-num-workers2Įkėlimo programa pagal dizainą yra pagrįsta CPU. Pavyzdžiai padidina šį skaičių iki 4.
--seedneegzistuojaŠioje CLI nėra sėklos vėliavėlės.

Paskutinė eilutė nėra klaida. launch_finetune.py yra tyro CLI, sugeneruotas iš duomenų klasės, ir ta duomenų klasė neturi sėklos lauko. README atskirai pažymi 5–6 procentų skirtumą tarp paleidimų, kurį sukelia nedeterministinis vaizdo papildymas. Du paleidimai su identiškomis vėliavėlėmis nesukurs identiškų kontrolinių taškų, o tai labai svarbu, kai bandote nuspręsti, ar hiperparametro pakeitimas padėjo, ar jums tiesiog pasisekė. Palyginimui, lerobot treneris pagal numatytuosius nustatymus naudoja sėklą 1000, o LeRobot GR00T receptas aiškiai perduoda --seed=42.

Validavimas pagal numatytuosius nustatymus išjungtas, o dokumentuota vėliavėlė nėra šiame CLI

Tikslinimas vykdomas su eval_strategy="no", todėl apskritai nėra validavimo nuostolių kreivės. Gaunate tik treniravimo nuostolius ir nieko daugiau. Naujo įkūnijimo vadovas nurodo jį įjungti su --eval-strategy steps --eval-steps 500, tačiau ši vėliavėlė neegzistuoja launch_finetune.py: CLI yra sugeneruotas tyro iš FinetuneConfig duomenų klasės, o eval_strategy, eval_steps ir eval_batch_size yra TrainingConfig laukai. Jų numatytosios reikšmės yra "no", 500 ir 2. Norėdami juos pasiekti, naudokite išsamesnį įėjimo tašką gr00t/experiment/launch_train.py, kur įdėta vėliavėlė yra --training.eval-strategy. Bet kuriuo atveju, vien tik mažėjantys treniravimo nuostoliai labai mažai pasako apie apibendrinimą, o tai yra būtent situacija, aprašyta nuostoliai mažėja, bet politika nieko nedaro.

Kiek kainuoja 20000 žingsnių paleidimas

GR00T N1.7 reikalinga 80 GB kortelė, todėl kainos klausimas turi siaurą atsakymą. AY-Robots platformoje groot1.7 treneris veikia A100 80 GB arba H100 80 GB lygyje, kur paleidimas trunka nuo 3 iki 6 valandų, kainuojant 1.20–2.00 USD už valandą momentinėje rinkoje. Tai yra maždaug 4–12 USD už numatytąjį 20000 žingsnių darbą. Ta pati užduotis SmolVLA arba ACT atliekama su 24 GB kortele, kainuojant 0.30–0.60 USD už valandą ir 1–3 USD už paleidimą. Tai yra tikrasis kompromisas: GR00T kainuoja maždaug keturis kartus daugiau už bandymą, ir jo negalima paleisti ant 4090 po jūsų stalu.

ModelisGPU lygisĮprastas vykdymasĮprasta kainaMinimalus epizodų skaičius
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

Minimalus 50-epizodų yra apatinė riba, o ne tikslas. Pačios NVIDIA DUK yra reiklesnis: maždaug 100 trajektorijų paprastam fiksavimui ir padėjimui fiksuotoje vietoje, 500 ar daugiau sudėtingoms ar daugiapakopėms scenoms, ir nuo 100 iki 500 smulkiam manipuliavimui. Jei turite 20 epizodų, praleiskite popietę įrašinėdami, o ne vakare derindami. duomenų rinkimo vadovas aprašo, kas skiria naudingą epizodą nuo iššvaistyto, įrašykite savo pirmąjį duomenų rinkinį yra trumpoji versija, o SO-100 duomenų rinkimas yra specifinė rankai skirta versija.

AY-Robots treniruočių vadovas, skirtas GR00T N1.7 ant SO-100, rodantis specifikacijų juostą su GPU lygiu, reikiamu duomenų rinkinio formatu ir treniruoklio numatytosiomis nuostatomis
Vadovas /train/groot-n1-7-on-so-100 pateikia faktus, kuriuos kitu atveju tektų atkurti rankiniu būdu: GPU lygį, duomenų rinkinio formatą ir tikslias numatytąsias nuostatas, kurias siunčia treniruoklis.

6 žingsnis: atvirojo ciklo vertinimas prieš liečiant ranką

Nedėkite naujo kontrolinio taško ant fizinės rankos, kad sužinotumėte, ar apmokymas pavyko. Pirmiausia paleiskite atviro ciklo vertinimą. Jis atkuria įrašytą epizodą, kiekviename žingsnyje prašo modelio veiksmų ir braižo prognozę prieš tikrąją reikšmę su MSE ir MAE. Tai nieko nekainuoja ir pagauna atvaizdavimo klaidas iš 2 ir 3 žingsnių.

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
Grafikai atsiduria /tmp/open_loop_eval/traj_<id>.jpeg, nebent nurodysite --save-plot-path. Numatytosios reikšmės: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

Repozitorija sąmoningai atsisako skelbti tikslinį MSE pasirinktiniams duomenims, ir tai yra teisingas sprendimas: skaičius priklauso nuo jūsų veiksmų vienetų, jūsų užduoties ir jūsų duomenų rinkinio dydžio, todėl slenkstis, nukopijuotas nuo kito asmens rankos, nieko nereiškia. Svarbi yra tendencija. Štai etaloninis paleidimas, kurį repozitorija dokumentuoja viename H100 su penkių epizodų demonstraciniu duomenų rinkiniu ir 2000 žingsnių.

Kontrolinis taškasVidutinis MSE trajektorijoje 0Vidutinis MAE trajektorijoje 0
50087.55.63
100025.43.30
150013.22.18
200010.01.76

Forma yra signalas, o ne absoliučios vertės. Klaida turėtų nuolat mažėti, kai kaupiasi. Apskaičiuota per visus penkis mokymo epizodus, o ne tik per 0 trajektoriją, galutinis saugyklos kontrolinis taškas surinko maždaug 7.5 MSE ir 1.5 MAE, todėl net ir etaloninis paleidimas skiriasi priklausomai nuo to, kuriuos epizodus vidutiniškai vertinate. Įrašykite savo pradinę reikšmę naudodami nepakeistą demonstracinę komandą prieš keisdami bet ką savo duomenyse: jei negalite atkartoti žinomo gero paleidimo, negalėsite atskirti sąrankos klaidos nuo duomenų problemos. Saugykla taip pat susieja dažnus simptomus su priežastimis, ir kiekviena iš jų yra operacinė, o ne modelio klaida.

SimptomasTikėtina priežastis
MSE plokščias arba didėjantis per kontrolinius taškusMokymosi greitis per mažas, arba duomenys visai neįkeliami. Patikrinkite --dataset-path ir duomenų įkėlimo darbuotojus.
Prognozės kreivė yra plokščia arba pastovimodality.json raktai arba --modality-config-path nesutampa. Veiksmų raktai nėra susieti.
MSE milžiniškas, arba NaN nuostolis mokymo metuVeiksmų ir būsenos normalizavimas. Patikrinkite meta/stats ir įsitikinkite, kad veiksmų diapazonai yra fiziškai pagrįsti.
Geras 0 trajektorijoje, prastas neįtrauktuose epizoduoseDuomenų trūkumas, o ne klaida. Penki demonstraciniai epizodai negali apibendrinti.

Kitas kelias: lerobot-train vietoj Isaac-GR00T

Dabartinė LeRobot versija, 0.6.1 PyPI nuo 2026 m. rugpjūčio 3 d., siūlo antrą ir gana skirtingą būdą tiksliai sureguliuoti tuos pačius bazinius svorius. LeRobot atskleidžia GR00T N1.7 kaip politikos tipą ir apmoko jį per savo lerobot-train įėjimo tašką. Čia svarbūs du dalykai. LeRobot CLI yra konsolės scenarijų rinkinys, todėl viskas, ką skaitote, kas sako python lerobot/scripts/train.py, yra pasenę ir neveiks. Ir LeRobot visiškai pašalino GR00T N1.5 palaikymą, atmesdamas N1.5 kontrolinius taškus ir konfigūracijas su migracijos pastaba, todėl, jei jums reikia N1.5 per LeRobot, turite nurodyti lerobot==0.5.1, paskutinę versiją, kuri jį palaiko, išleistą 2026 m. balandžio 7 d.

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
LeRobot-native GR00T N1.7 receptas. Atkreipkite dėmesį į relative_exclude_joints: griebtuvas neįtraukiamas į santykinius veiksmus, o tai yra tas pats sprendimas, kurį so100_config.py priima su ActionRepresentation.ABSOLUTE.
AspektasIsaac-GR00T launch_finetune.pylerobot-train --policy.type=groot
Duomenų rinkinio versijaTik LeRobot v2, reikalingas konvertavimasNatyvus LeRobot duomenų rinkinys, nereikia sumažinti versijos
Modalumų atvaizdavimasmeta/modality.json plius Python duomenų konfigūracijanėra modality.json; elgesys nustatomas --policy.* vėliavėlėmis komandų eilutėje
Sėklaišvis nėra sėklos vėliavėlės--seed, LeRobot numatytasis 1000
Santykinių veiksmųkiekvieno rakto ActionConfig duomenų konfigūracijoje--policy.use_relative_actions plius --policy.relative_exclude_joints
Paskelbti etaloniniai rezultataiSO-100 atviro ciklo MSE tendencija demonstraciniuose duomenyseLIBERO rinkiniai, 96.5 procento vidurkis keturiuose rinkiniuose
Diegimo keliasrun_gr00t_server.py plius eval_so100.py per ZMQlerobot-rollout, su realaus laiko skaidymu (queue_threshold turėtų likti ties 5 arba žemiau)
Pataisymo vykdymas patiems
Privalumai
  • Kiekviena vėliavėlė yra matoma ir keičiama. Galite atšaldyti vizualinį kodavimo įrenginį, perkelti state_dropout_prob arba sutrumpinti veiksmų horizontą.
  • Atviro ciklo grafikai yra vietiniai failai. Palyginti checkpoint-5000 su checkpoint-20000 yra shell komanda.
  • Jūs nepriklausote nuo jokios platformos, kuri turi būti prisijungusi, o kontrolinis taškas yra jūsų diske standartiniu formatu.
  • Repozitorijos etaloniniai pavyzdžiai LIBERO, SimplerEnv ir DROID suteikia jums žinomus gerus vykdymus, kuriuos galite atkartoti, prieš pasitikėdami savo duomenimis.
Kompromisai
  • Aplinka yra didžioji darbo dalis. FFmpeg versija, CUDA_HOME, git-lfs, uždaras pagrindas, torchcodec: nė viena iš šių nėra modelio problemos ir kiekviena iš jų sustabdo vykdymą.
  • v3.0 į v2.1 konvertavimui reikalingas atskiras virtualenv su savo diegimo žingsniu, ir jis perrašo jūsų duomenų rinkinio katalogą vietoje.
  • GPU nuoma pradedama apmokestinti, kai pradedate derinimą, o ne kai prasideda apmokymai, ir niekas nesustabdo instancijos, kai vykdymas baigiasi.
  • Jokios sėklos reiškia jokio bitų tikslumo atkartojamumo, be to, 5–6 procentų vykdymo variacija vien dėl duomenų papildymo.

Du būdai gauti tą patį kontrolinį tašką

Jūs nuomojatės GPU ir valdote kiekvieną žingsnį. Realistiškai, pirmą kartą tai užtruks pusę dienos, o vėliau – po dvidešimt minučių.

  1. Įrašykite epizodus su lerobot-record ant SO-100. Gausite LeRobot v3.0 duomenų rinkinį.
  2. Konvertuokite jį į v2.1 naudodami scripts/lerobot_conversion/convert_v3_to_v2.py savo virtualioje aplinkoje.
  3. Parašykite meta/modality.json ir Python modalumo konfigūraciją, užregistruotą po EmbodimentTag.NEW_EMBODIMENT.
  4. Išsinuomokite 80 GB kortelę, klonuokite su submoduliais, atlikite uv sync, autentifikuokite prieš Hugging Face.
  5. Paleiskite launch_finetune.py, tada open_loop_eval.py ant kelių kontrolinių taškų ir palyginkite MSE tendenciją prieš liesdami aparatinę įrangą.
  6. Nukopijuokite kontrolinį tašką iš mašinos prieš sunaikindami instanciją, tada sukurkite aptarnavimo kelią iki roboto rankos.
Žingsnis, kurį visi pamiršta

Nukopijuokite kontrolinį tašką iš nuomojamos instancijos prieš ją išjungdami. --save-total-limit 5 taip pat reiškia, kad senesni kontroliniai taškai yra ištrinami mokymui vykstant, todėl kontrolinis taškas, kurio norėjote 5000 žingsnyje, gali nebeegzistuoti 20000 žingsnyje.

AY-Robots mokymo matrica su penkiais politikos modeliais kaip eilutėmis ir keturiomis roboto rankomis kaip stulpeliais, kiekviena langelė susieta su konkrečiu mokymo vadovu.
`/train` matrica: penki modeliai prieš keturias rankas. GR00T N1.7 eilutė taip pat apima SO-101, Koch v1.1 ir LeKiwi.

Grąžinant kontrolinį tašką atgal ant roboto rankos

Isaac-GR00T naudoja serverio-kliento padalijimą per ZMQ. Politika vykdoma GPU, o plonas klientas roboto mašinoje siunčia stebėjimus ir gauna veiksmų fragmentus. SO-100 pavyzdys yra pakankamai išsamus, kad jį būtų galima nukopijuoti: paleiskite run_gr00t_server.py su savo kontroliniu tašku ir --embodiment-tag NEW_EMBODIMENT, tada paleiskite eval_so100.py roboto pusėje su nuosekliuoju prievadu, roboto ID, kamerų indeksais ir kalbos instrukcija. Kamerų pavadinimai toje komandoje turi atitikti draugiškus pavadinimus iš jūsų modality.json, o ne OS įrenginių numerius.

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 kontroliuoja, kiek numatytų žingsnių yra įvykdoma prieš perplanavimą. Jis turi būti ne didesnis nei politikos action_horizon, ir tas skaičius yra veiksmo delta_indices ilgis jūsų modalumo konfigūracijoje, o ne bazinio modelio. Pristatyta SO-100 konfigūracija numato 16, taigi 16 yra jūsų viršutinė riba; bazinis nvidia/GR00T-N1.7-3B kontrolinis taškas sukonfigūruotas 40, o policy.md aiškiai nurodo, kad patobulinti kontroliniai taškai gali skirtis. Viršijus jį, gausite ValueError, nurodantį abu skaičius. 8 yra reikšmė, kurią dokumentacija siūlo realaus laiko diegimui. Senas žymės pavadinimas --action-horizon vis dar veikia, bet įspėja.
7.4 V, ne 12 V

Kol jungiate ranką atgal: SO-100 naudoja Feetech STS3215 magistralinius servovariklius ant 7.4 V linijos. Maitinant juos 12 V, jie sugenda, ir tai yra lengva klaida, jei taip pat turite LeKiwi, kurio bazė veikia 12 V, o ranka – ne. Patikrinkite maitinimą prieš pirmąjį įjungimą, o ne po dūmų. Žr. SO-100 techninės įrangos puslapį ir SO-100 prieš LeKiwi. Jei ranka įsijungia, bet niekas nejuda, servovariklis nereaguoja yra vieta, nuo kurios reikia pradėti.

Dabar sąžininga dalis apie tai, kur veikia politika, nes apmokymas ir aptarnavimas turi skirtingas techninės įrangos istorijas. Tiksliniam derinimui reikia 40 GB ar daugiau. Išvadoms nereikia: README nurodo 16 GB ar daugiau ir aiškiai įvardija RTX 4090, todėl kortelė, kurią jau turite, gali aptarnauti kontrolinį tašką, kurio ji niekada negalėjo sukurti. Kas lemia, ar politika atrodo reaguojanti, yra ne VRAM, o tai, kur yra serveris. AY-Robots GR00T N1.7 yra tik debesyje, todėl valdymo ciklas moka už viešojo interneto kelionę pirmyn ir atgal, be 152 ms už veiksmo žingsnį, ir tik SmolVLA ir ACT taip pat veikia lokaliai. Lėtam paėmimui ir padėjimui nuotolinis podas yra išgyvenamas. Bet kam reaktyviam – ne: politika tampa nedrąsi taip, kad atrodo lygiai kaip apmokymo klaida, bet tokia nėra. ACT, veikiantis 20 ms per veiksmo žingsnį, yra modelis, kuris toleruoja griežčiausią ciklą, SmolVLA veikia 245 ms, ir joks vėlavimo derinimas neatperka jau išleistos kelionės pirmyn ir atgal. Paleiskite savo pirmąją politiką išsamiai aprašo aptarnavimo pusę.

Kas iš tikrųjų nutinka ne taip

  • GatedRepoError pirmojo paleidimo metu. Jums nebuvo suteikta prieiga prie nvidia/Cosmos-Reason2-2B, arba neautentifikavote. Tai nutinka, kai GPU laikrodis jau yra paleistas.
  • Duomenų rinkinys atmestas įkeliant. Beveik visada v3.0 duomenų rinkinys. Konvertuokite jį į senesnę versiją. Žr. duomenų rinkinys atmestas kaip v3.
  • IndexError dėl nesutampančių bulio logikos matmenų. Pakeitėte delta_indices ir neatkūrėte statistikos.
  • Trūksta atminties ties 32 paketu. Sumažinkite --global-batch-size ir padidinkite --gradient-accumulation-steps, arba sumažinkite --num-shards-per-epoch, ką konfigūracija aiškiai siūlo, kai VRAM yra ribota. Žr. atminties trūkumas apmokymo metu.
  • Nuostolis mažėja, politika nieko nedaro. Pagal numatytuosius nustatymus nėra validavimo padalijimo, todėl švari apmokymo kreivė įrodo labai mažai. Šis puslapis aprašo diagnostiką.
  • Veikia jūsų nustatymuose ir niekur kitur. Tikėtina su mažu duomenų rinkiniu, nufilmuotu vienoje apšvietimo sąlygoje. NVIDIA rekomenduoja spalvų virpėjimo (colour jitter) papildymą plius 20–50 epizodų esant skirtingam apšvietimui. Daugiau čia.
  • Griebtuvas niekada neužsidaro tinkamai. Patikrinkite, ar griebtuvo veiksmas yra ABSOLUTE, o rankos jungtys RELATIVE, tokia tvarka action_configs. Griebtuvas neužsidaro išvardija kitas priežastis.
  • Kamera tyliai atsijungia įrašymo metu. Epizodas vis tiek išsaugomas, o vaizdo įrašo raktas vis dar egzistuoja, todėl tai yra nemalonu. Kamera neaptikta aprašo tai.

Visas gedimų režimų indeksas yra . Jei renkatės tarp modelių, o ne derinate vieną, ir turi etaloninius skaičius su pridėtais šaltiniais, o yra palyginimas, kurio daugumai žmonių iš tikrųjų reikia, nes tai yra pasirinkimas tarp modelio, kurį galite apmokyti ant kortelės po savo stalu, ir to, kuriam reikia išsinuomoti 80 GB mazgą, kad jį tiksliai sureguliuotumėte. Norėdami sužinoti, kodėl šie modeliai elgiasi taip, kaip elgiasi, pirmiausia verta perskaityti ir . Ir jei dar neturite roboto rankos, transliuoja fizinį SO-100 be registracijos.

Kiek epizodų man reikia, kad GR00T N1.7 tikslus sureguliavimas būtų vertas pastangų?

AY-Robots nustato griežtą 50 epizodų ribą groot1.7 apmokymo programai. Pačios NVIDIA DUK yra reiklesnės: maždaug 100 trajektorijų paprastam paėmimui ir padėjimui fiksuotoje vietoje, 500 ar daugiau sudėtingoms ar daugiapakopėms scenoms ir 100–500 smulkiam manipuliavimui. Žemiau 50 beveik visada geriau įrašyti daugiau duomenų, nei derinti hiperparametrus. Jei sėkmė po to stabilizuojasi, NVIDIA rekomenduoja HG-DAgger: paleiskite politiką, įsikiškite, kai ji nepavyksta, ir pridėkite tuos pataisymus prie duomenų rinkinio.

Kodėl mano duomenų rinkinys neįkeliamas ir kaip sužinoti, kokios jis versijos?

Atidarykite meta/info.json ir perskaitykite codebase_version. LeRobot dabartinė CODEBASE_VERSION pagrindinėje šakoje yra v3.0, todėl viskas, kas įrašyta su naujausia įrankių grandine, yra v3.0, o GR00T įkėliklis tikisi v2. Konvertuokite naudodami scripts/lerobot_conversion/convert_v3_to_v2.py iš Isaac-GR00T saugyklos, kuri įrašo codebase_version: v2.1 į konvertuotą duomenų rinkinį. Scenarijus veikia savo virtualenv, nes jam reikia kitos lerobot versijos nei GR00T nustato.

Ar galiu tiksliai sureguliuoti GR00T N1.7 ant RTX 4090?

Ne. NVIDIA rekomenduoja 40 GB ar daugiau VRAM tiksliam sureguliavimui ir nurodo H100 arba L40 mazgus; kitos kortelės veikia, bet užtrunka daug ilgiau. 4090 turi 24 GB. AY-Robots siūlo GR00T N1.7 tik A100 80 GB ir H100 80 GB lygiu dėl tos pačios priežasties. Išvada yra kita istorija: 16 GB pakanka modeliui aptarnauti, todėl 4090 gali vykdyti politiką, kurios negali apmokyti. Jei norite VLA, kurį galite apmokyti su 24 GB, tai yra SmolVLA su maždaug 450 M parametrų arba ACT su maždaug 80 M.

Kodėl du paleidimai su identiškomis vėliavėlėmis duoda skirtingus kontrolinius taškus?

Nes launch_finetune.py neturi sėklos. Tai yra tyro CLI, sugeneruotas iš duomenų klasės, kurioje nėra sėklos lauko, todėl niekas nefiksuoja RNG. Saugykla atskirai pažymi 5–6 procentų skirtumą tarp paleidimų, kurį sukelia nedeterministinis vaizdo papildymas. Jei svarbu atkuriamumas, naudokite LeRobot kelią: lerobot-train priima --seed, o paskelbta GR00T receptūra perduoda --seed=42.

Ar turėčiau naudoti Isaac-GR00T ar lerobot-train?

Naudokite Isaac-GR00T, jei norite etaloninės implementacijos, valdymą pagal raktą veiksmų atvaizdavimui, TensorRT eksportą arba etaloninius pavyzdžius, kuriuos reikia atkurti prieš pasitikint savo duomenimis. Naudokite lerobot-train, jei jūsų duomenų rinkinys jau yra LeRobot v3.0 ir nenorite jo konvertuoti, jei norite sėklos, arba jei likusi jūsų sistemos dalis jau yra LeRobot. Abu tiksliai sureguliuoja tuos pačius nvidia/GR00T-N1.7-3B svorius. Atkreipkite dėmesį, kad LeRobot visiškai atsisakė GR00T N1.5 palaikymo: N1.5 kontroliniai taškai atmetami su migracijos pastaba, ir turite nustatyti lerobot==0.5.1, kad galėtumėte juos toliau naudoti.

Ar man tikrai reikia riešo kameros, be priekinės kameros?

Pristatyta SO-100 konfigūracija naudoja abi, o modality.json atvaizduoja priekinę ir riešo kameras kaip atskirus vaizdo raktus. Galite apmokyti su viena kamera, o modelio kortelės vėlavimo lentelė matuojama su viena kamera, tačiau riešo vaizdas suteikia politikai naudingos informacijos apie griebtuvą kontakto metu. Jei griebtuvas užsidaro netinkamu metu jūsų paleidimuose, trūkstama arba blogai nukreipta riešo kamera yra vienas iš pirmųjų dalykų, kuriuos reikia patikrinti.

Tiksliai sureguliuokite GR00T N1.7 ant savo SO-100, pirmiausia nesukūrę aplinkos

Pasirinkite modelį, duomenų rinkinį ir hiperparametrus formoje. Galinė sistema išsinuomoja A100 80 GB arba H100 vietoje, paleidžia apmokymo programą su 32 paketu, mokymosi greičiu 1e-4 ir 20000 žingsnių, ir įrašo kontrolinius taškus į objektų saugyklą. Maždaug 4–12 USD už paleidimą.

Atidaryti GR00T N1.7 apmokymo vadovą

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started