Az AY-Robots útmutató oldala a GR00T N1.7 SO-100 karon történő képzéséhez, bemutatva a szükséges GPU szintet, adatkészlet formátumot és a tréner alapértelmezett beállításait
GR00T N1.7SO-100FinomhangolásLeRobotVLA

Hogyan képezzük a GR00T N1.7-et saját SO-100 adatkészletünkön

AY-Robots ResearchAugust 23, 202628 perc olvasás

Egy tesztelt útmutató az NVIDIA GR00T N1.7 finomhangolásához egy SO-100 LeRobot adatkészleten: valós flag-ek, modality.json, a v2.1 követelmény, egy futtatás költségei és a buktatók.

Az NVIDIA szállít egy finomhangolási példát pontosan ahhoz a karhoz, amellyel valószínűleg rendelkezik. Az Isaac-GR00T tárolóban található egy mappa, melynek neve demo_data/cube_to_bowl_5: öt epizód, 4148 képkocka 30 fps sebességgel, már LeRobot v2.1 formátumban írva, hozzáillő modalitás konfigurációval a examples/SO100/ alatt. A meta/info.json a következőket jelenti: robot_type: so101_follower, ami a LeRobotban ugyanaz a konfigurációs osztály, mint a so100_follower. Ez valóban hasznos, mert azt jelenti, hogy a referenciaútvonal a GR00T N1.7 egy hat-szabadságfokú hobbi karhoz a modellt írók tartják karban. Ez nem egy lekicsinyített humanoid demó, hanem ugyanaz a kar.

A rossz hír az, hogy mekkora a távolság a 60 epizódot rögzítettem és a a kar elvégzi a feladatot között. Körülbelül hat helyen hibázik ez a pipeline csendesen, nem pedig hangosan, és ezek közül négy olyan fájlban található, amelyet a legtöbb ember soha nem nyit meg: meta/modality.json, a Python adatkonfiguráció, meta/relative_stats.json, valamint az adatkészlet saját verziószáma. Ez az útmutató végigvezeti a manuális útvonalon a valós parancsokkal, majd bemutatja ugyanezt a feladatot űrlapként a AY-Robots platformon. Az alábbiak mindegyike ellenőrizve lett az Isaac-GR00T fő ágával szemben 2026. augusztus 20-án (az n1.7-kiadási vonal), valamint a lerobot 0.6.1-gyel, amelyet 2026. augusztus 3-án tettek közzé a PyPI-n. Az upstream gyorsan változik, és ahol egy flag átnevezésre került, ott ez a cikk jelzi.

Amit tudnia kell, mielőtt elkezdi

  • A GR00T N1.7 finomhangolásához 40 GB vagy több VRAM szükséges. Az NVIDIA H100 vagy L40 csomópontokat ajánl. Egy 24 GB-os RTX 4090 nem fogja elvégezni ezt a feladatot, bár a SmolVLA és az ACT betanítására alkalmas.
  • Az adatkészletnek LeRobot v2 (v2.0 vagy v2.1) formátumúnak kell lennie, plusz egy GR00T-specifikus meta/modality.json fájlnak. Egy LeRobot v3.0 adatkészlet nem töltődik be, és le kell konvertálni.
  • A belépési pont a gr00t/experiment/launch_finetune.py, egy tyro CLI. Nincs --seed flagje, így a futtatások nem bitről bitre reprodukálhatók.
  • Egyedi kar esetén az embodiment tag a NEW_EMBODIMENT, és ez a tag teszi kötelezővé a --modality-config-path paramétert.
  • A szállított SO-100 recept a karízületeket RELATIVE deltákként, a megfogót pedig ABSOLUTE célként jósolja. Ennek a párosításnak a fordítottja csendes hiba, nem pedig tévedés.
  • Az AY-Robots platformon ugyanez a feladat egy űrlap: 20000 lépés, 32-es batch, 1e-4 tanulási ráta, nagyjából 4-12 USD az A100 80 GB vagy H100 szinten.

Mi is valójában a GR00T N1.7

A GR00T N1.7 egy látás-nyelv-akció modell, amely az eredeti GR00T N1 tanulmányban leírt kettős rendszerű elrendezést használja: egy látás-nyelv modult, amely beolvassa a kamerákat és az utasítást, valamint egy diffúziós transzformert, amely ezt folyamatos motorparancsokká alakítja. Az N1.7 az első felét cserélte le. Az N1.6-ból származó Eagle gerinc eltűnt, helyette nvidia/Cosmos-Reason2-2B egy Qwen3-VL architektúrán, és a modellt nagyjából 20 000 órányi egocentrikus emberi videón előképezték a robotadatok mellett. Az NVIDIA saját leírása 20 854 órára teszi az adatot, és arról számol be, hogy 1k-ról 20k órára növelve az átlagos feladatvégzés több mint kétszeresére nő.

A második fele is megváltozott, olyan módon, ami fontos a futtatás szempontjából. Az akciófej 32 diffúziós rétegről 16-ra csökkent, az előre jelzett akciócsomag 16 lépésről 40-re nőtt, és a maximális állapot- és akciószélesség 29-ről 132-re emelkedett. Ez a három szám a tároló README-jében található változásnaplóból származik; az NVIDIA saját bejelentő posztja továbbra is 32 rétegű DiT-ként írja le az 1. rendszert, így ahol a kettő eltér, bízzon abban a tárolóban, amelyet klónozni készül. Az akciók alapértelmezés szerint relatív végrehajtó térben vannak kifejezve, az aktuális pózból származó deltaként, nem pedig abszolút célpontokként, ami lehetővé teszi, hogy az emberi videókból tanult manipulációs előismeretek egyáltalán átkerüljenek a robotvezérlésbe. Maga a fej egy áramlás-illesztő diffúziós transzformer, ugyanaz a család, mint a Pi0.5, de más gerinccel előtte. Ha még az előző generációnál tart, a N1.7 az N1.5 ellen tárgyalja, hogy a frissítés indokolja-e a pipeline újbóli elkészítését.

TulajdonságÉrtékForrás
Paraméterek3,000,000,000Hugging Face modellkártya
Látás-nyelv gerincnvidia/Cosmos-Reason2-2B (Qwen3-VL), Hugging Face-en keresztül elérhetőrepo README
AkciófejÁramlás-illesztő diffúziós transzformer, 16 réteg (az N1.6 32-vel rendelkezett)repo README
Előre jelzett akcióhorizont40 lépés az alap ellenőrzőponthoz (az N1.6 16-tal rendelkezett)getting_started/policy.md és repo README
Maximális állapot- és akciószélesség132 (az N1.6 29-cel rendelkezett)repo README
Kód licencApache 2.0Isaac-GR00T repository
Súlyok licencNVIDIA Open Model License Agreementmodellkártya
Késleltetés, H100 80 GB, PyTorch eager, 4 zajcsökkentő lépés, 1 kamera85.8 ms végponttól végpontig, 11.7 Hzmodellkártya időzítési táblázat
Ugyanaz a hardver, TensorRT teljes pipeline27.9 ms végponttól végpontig, 35.9 Hzmodellkártya időzítési táblázat
Késleltetés, amit az AY-Robots idéz a szolgáltatott GR00T N1.7-hez152 ms akció lépésenkéntAY-Robots policy katalógus

Az utolsó három sor magyarázza az emberek által jelentett csalódások nagy részét. A címlapon szereplő 27.9 ms egy TensorRT motor egy H100-on, egy kamerával és négy zajcsökkentő lépéssel. Az egyszerű PyTorch ugyanazon a kártyán 85.8 ms, és a modellkártya 3.08x-es különbséget jelez. Egyik szám sem tartalmazza a kiszolgáló réteget, egy második kamerát vagy egy hálózati ugrást. Az AY-Robots által a szolgáltatott GR00T N1.7-hez idézett 152 ms akció lépésenként az a szám, amely a kiszolgálást is tartalmazza, és ehhez jön még egy nyilvános internetes oda-vissza út. Erről bővebben a végén. Más modellek melletti számokhoz, GR00T N1.7 a Pi0.5 ellen és GR00T N1.7 a SmolVLA ellen egymás mellé helyezi őket.

Az AY-Robots GR00T N1.7 modelloldala, amely a paraméterek számát, a GPU szintjét, az inferencia késleltetését, valamint a modell megadott erősségeit és korlátait mutatja.
A /policies/groot-n1-7 oldal ugyanazt a specifikációs sávot tartalmazza, amelyet egyébként kézzel állítana össze a modellkártyából és a repo README-jéből.

Amire a futtatásnak szüksége van, mielőtt bármit beírna

KövetelményFinomhangolásInferencia
VRAM, NVIDIA útmutatás40 GB vagy több, H100 vagy L40 ajánlott16 GB vagy több, egy RTX 4090 működik
Python és CUDA dGPU-n3.12 és CUDA 12.83.12 és CUDA 12.8
Videó háttérrendszertorchcodec 0.8.0, csak FFmpeg 4-től 7-igugyanaz
Adatkészlet formátumLeRobot v2 plusz meta/modality.jsonnem alkalmazható
Hugging Face hozzáférésjóváhagyva a nvidia/Cosmos-Reason2-2B számáraugyanaz
Egyéb eszközökgit-lfs és uvuv
AY-Robots GPU szint a groot1.7 trénerhezA100 80 GB vagy H100 80 GBpod automatikusan biztosítva
A zárolt gerinc megállítja az első futtatáskor

Minden GR00T ellenőrzőpont, beleértve az alap nvidia/GR00T-N1.7-3B-t is, betölti a nvidia/Cosmos-Reason2-2B-t az első használatkor, és ez a tároló zárolt. A README pontosan leírja a hibát: a modell betöltése sikertelen egy GatedRepoError / 401 Client Error hibával. Amit nem említ, az az, hogy mikor történik ez, ami azután van, hogy kibérelte a kártyát és a futtatás elindult. Kérjen hozzáférést a modelloldalon, majd futtassa a uv run huggingface-cli login parancsot, vagy exportálja az HF_TOKEN-t, mielőtt bármit bérelne.

0. lépés: maguk az epizódok

Minden alábbi feltételezés szerint már rögzített epizódokkal rendelkezik. Ha nem, az az igazi első lépés, és ez dönti el, milyen jó lehet az eredmény, mert utánzásos tanulás nem tudja visszanyerni az adatban nem szereplő információkat. Először kalibrálja mindkét kart, majd vezesse a követő kart egy vezető karral miközben lerobot-record írja a parquet fájlokat és a kamera streameket. Ha a kalibráció pontatlan, az adatkészletében lévő ízületi értékek kissé eltérő robotot írnak le, mint az, amelyik később végrehajtja a házirendet, és ezt semmilyen mennyiségű képzés nem orvosolja.

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 egy aktuális LeRobot rendszeren. Az epizód hossza alapértelmezetten 60 másodperc, a visszaállítási idő pedig 60 másodperc. Az so100_follower és az so101_follower is ugyanahhoz a LeRobot konfigurációs osztályhoz van regisztrálva, ezért használja az Isaac-GR00T SO100 példa az so101 neveket; mindkettő működik egy SO-100-on. Az itt választott kamera nevek (front, wrist) azok a nevek, amelyeknek újra meg kell jelenniük a modality.json fájlban.

A LeRobot saját tanácsa szerint legalább 50 epizódot kell rögzíteni, körülbelül 10-et tárgyhelyenként, a kamerákat rögzítve kell tartani, és a megfogási viselkedést konzisztensen kell tartani. A variációkat később, ne az elején adja hozzá. Az emlékezetes ökölszabály: ha Ön sem tudta volna elvégezni a feladatot pusztán a kamera képei alapján, akkor a házirend sem tudja. A kar-specifikus beállításhoz a SO-100 első lépések és a SO-100 LeRobot oldal tárgyalja a portokat, a kalibrációt és a kamera indexeket. Az AY-Robots rendszereken ezt az interneten keresztül is megteheti a böngészőből, a távvezérlés segítségével, és közvetlenül a munkamenetből rögzíthet.

1. lépés: az adathalmaznak LeRobot v2.1 formátumúnak kell lennie

Ez a leggyakoribb akadály. A LeRobot aktuális CODEBASE_VERSION a fő ágon v3.0, így bármi, amit ma egy aktuális eszközkészlettel rögzít, v3.0-ként jelenik meg. A GR00T betöltője v2-t vár. Az adattár egyértelműen megmagyarázza, miért: számos upstream adathalmaz, mint például a DROID, LIBERO és Bridge, v2-ben van közzétéve, és mindkettő natív támogatása tervezett, de még nem került kiadásra. Tehát az átalakítás az Ön feladata, és egy konkrét okból kifolyólag saját virtualenv-ben fut: scripts/lerobot_conversion saját pyproject-et tartalmaz, amely Python 3.10 vagy 3.11-et igényel, és a lerobot-ot egy adott git commit-hoz rögzíti, míg maga az Isaac-GR00T Python 3.12-t igényel. Telepítse az átalakítót az adattár gyökeréből, és a gr00t csomagot kapja helyette, ami az a hiba, amire a README figyelmeztet. Ha még új a formátumban, a LeRobot adathalmaz szószedet bejegyzés elmagyarázza, mi is van valójában benne.

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
Az átalakító a --repo-id, egy opcionális --root, és a --force-conversion paramétereket fogadja, amely törli a meglévő helyi pillanatképet és újra letölti azt. A codebase_version: v2.1 értéket írja a meta/info.json fájlba.
Az átalakítás felülírja a helyén

Ha a v3.0 adathalmaz már létezik helyileg, a szkript mellette felépíti a v2.1 elrendezést, majd felcseréli: az eredeti egy testvér mappába kerül, a verzióval kiegészítve, <name>_v3.0, és az átalakított másolat veszi át az eredeti útvonalat. (A szkript saját docstring-je _v30-nak nevezi ezt a mappát; a kód a verziósztringet fűzi hozzá, így valójában _v3.0-t kap.) Második meglepetés: a kimenet mindig a <root>/<repo-id> alá kerül, így a --root examples/SO100/my_dataset_lerobot a examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset> útvonalat adja, és ez a hosszabb útvonal az, amit a --dataset-path később elvár. Amikor egy betanítási feladat verzióproblémák miatt elutasítja az adathalmazt, az adathalmaz v3-ként elutasítva oldal felsorolja a pontos tüneteket.

A GR00T által konverzió után elvárt struktúra a klasszikus v2 elrendezés: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, parquet fájlok a data/chunk-000/ alatt, MP4 fájlok a videos/chunk-000/observation.images./ alatt, és egy extra fájl, amivel a standard LeRobot nem rendelkezik. Ez az extra fájl az, ahol a fennmaradó hibák nagy része található.

2. lépés: modality.json, a hat szám, ami mindent eldönt

Egy LeRobot adatkészletben a robot állapota és az akció lapos float32 tömbökként vannak tárolva. Egy SO-100 esetében mindkettő alakja [6]: öt karízület és egy megfogó. A demó adatkészlet a következőképpen nevezi el őket: shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, de ezek a nevek az info.json fájlban találhatók, és a parquet fájlban semmi sem jelzi, hogy melyik index melyik. A meta/modality.json biztosítja ezt a leképezést, és a GR00T enélkül nem fog betanulni. Íme az, amit a tároló szállít az SO-100-hoz, szó szerint.

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. Az indexek nullától kezdődnek és követik a Python szeletelést, így a single_arm [0:5] és a gripper [5:6].

Másolja be az átalakított adathalmazba a meta/modality.json és nevezze át a videó kulcsokat arra, ahogyan a kamerái valójában hívják őket. Ha egyetlen, felülről elhelyezett kamerával rögzített, melynek neve top, akkor original_key az observation.images.top és a felhasználóbarát név az, amire az adatkonfigurációja hivatkozni fog. A kettőnek egyeznie kell, és egyik sem ellenőrzi a másikat Ön helyett. A nyelvi annotáció rosszabb, mert ugyanannak a kulcsnak három helyen kell megjelennie.

RétegFájlA repóban használt SO-100 forma
Parquet oszlopdata/chunk-*/episode_*.parquetannotation.human.task_description
modality.json kulcsmeta/modality.json, under "annotation", without the annotation. prefixhuman.task_description
modality_keys az adatkonfigurációbanyour so100_config.pyannotation.human.task_description
Miért okoz gondot a nyelvi kulcs

Az annotation. utáni szegmenseket az adathalmaz szerzője választja ki. Az SO-100 demó adatok az annotation.human.task_description-t használják; a LIBERO és a SimplerEnv az annotation.human.action.task_description-t. Mindkettő érvényes. Ha egy LIBERO példából másolt konfigurációt, és azt a saját SO-100 felvételére irányította, a nyelvi csatorna semmire sem oldódik fel, és a modell egy üres utasításon edz. A veszteség továbbra is csökken. A szabályzat továbbra is csinál valamit. Egyszerűen figyelmen kívül hagyja, amit mondott neki.

3. lépés: az adatkonfiguráció, relatív kar és abszolút megfogó

A modalitás konfiguráció egy Python fájl JSON helyett, mert az is eldönti, hogyan reprezentálódik minden egyes akciócsoport. Ez az N1.7 munkafolyamat azon része, amely N1.5-ben nem létezett ugyanebben a formában, és az a rész, amit érdemes kétszer is elolvasni. A szállított SO-100 konfiguráció az öt karízületet RELATIVE deltákként prediktálja az aktuális állapotból, a megfogót pedig ABSOLUTE célpozícióként, mert egy bináris nyitott-vagy-zárt jel jobban viselkedik célként, mint deltájaként.

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, a lényegre vágva. A NON_EEF ízületteret jelent; az EEF egy kilencdimenziós vektort várna x, y, z, plusz egy 6D rotációval.

Két részlet, ami egy napodba kerülhet, ha nem tudod őket. Először is, az action_configs pozicionális: a dokumentáció ugyanazt a hosszt és sorrendet írja elő, mint a modality_keys, és nyersen fogalmaznak a hibás beállítás következményeiről, miszerint a rossz reprezentáció csendben alkalmazódik. A megfogód deltájaként, a karod pedig abszolút célként lesz betanítva, és nincs hibaüzenet. Másodszor, a register_modality_config ellenőrzi, hogy a címke még nincs regisztrálva, így egy második NEW_EMBODIMENT konfiguráció ugyanabban a Python folyamatban leáll a következő üzenettel: Embodiment tag ... already registered. Nem importálhatsz kettőt ezek közül egy szkriptbe. Egy harmadik szabályt később, a telepítéskor érvényesítenek: az akció delta_indices mezőjének nullától kezdődő, összefüggő tartománynak kell lennie. Egy ritka ablak, mint például a [0, 4, 8], elutasításra kerül, mert minden downstream elem lineárisan indexeli az előrejelzett darabot, és egyébként rossz sorokat hajtana végre.

A delta_indices módosítása esetén újra kell generálni a statisztikákat

A normalizációs statisztikák, különösen a meta/relative_stats.json, ahhoz a horizont hosszhoz vannak kiszámítva, amellyel generáltad őket. Ha a cselekvési horizontot 16-ról 8-ra rövidíted újragenerálás nélkül, a betanítás leáll a következő hibával: IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. A javítás egyetlen parancs: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Futtasd minden delta_indices módosítás után.

4. lépés: a környezet

Az N1.7 áthelyezte a tárolót ide: és Python 3.12. A régi conda plus pip install -e . útvonal még létezik a README egy összecsukott szakaszában, de figyelmeztet, hogy a GPU függőségek, beleértve a flash-attn-t és a TensorRT-t, manuális telepítést igényelhetnek. Használja az uv-t, hacsak nincs különleges oka ennek elkerülésére. A flash-attn-nel kapcsolatban egy részlet elkerüli a zavart: látni fogja, hogy Installing flash-attn kiírva minden uv run. Nem épül újra. Az uv újraérvényesíti egy URL-hez rögzített, már gyorsítótárazott wheel-t, és ez két-három másodpercet vesz igénybe.

  1. 1
    Telepítse a git-lfs-t, majd klónozza az almodulokkal

    A git-lfs kötelező, nem opcionális. Enélkül a demo_data/ mappában lévő parquet fájlok mutató csonkokként töltődnek le, és a demó futtatása meghiúsul egy olyan adathalmazon, amely a fájllistában jelenlévőnek tűnik.

    bash
    sudo apt install git-lfs && git lfs install
    git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
  2. 2
    Telepítse az uv-t és szinkronizálja a környezetet

    Az alapértelmezett telepítés letölti a GPU függőségeket, beleértve a flash-attn-t és a TensorRT-t. Egy friss A100 vagy H100 image-en ez a leghosszabb lépés, ezért végezze el, mielőtt bármi másra figyelne.

    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
    Hitelesítés a Hugging Face-szel

    Ezt az első tréning indítása előtt tegye meg, ne azután, hogy nyolc perc után meghiúsul.

    bash
    uv run huggingface-cli login   # or: export HF_TOKEN=<your_token>
  4. 4
    Egészségügyi ellenőrzés a mellékelt SO-100 demó adatokon

    Mielőtt hozzányúlna a saját felvételéhez, futtasson 2000 lépést a demo_data/cube_to_bowl_5 adathalmazon. Ez öt epizódot jelent, gyorsan befejeződik, és a környezetet igazolja, nem az adatait. Ha ez a futtatás meghiúsul, semmi, amit az adathalmazával tesz, nem fog segíteni.

    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
Két környezeti csapda, amelyek modellhibáknak tűnnek

FFmpeg 8. A torchcodec 0.8.0 csak az FFmpeg 4-7-et támogatja, és az Ubuntu 25.10 és újabb verziók a 8-as verziót szállítják. A hiba Could not load libtorchcodec, ami inkább hibás telepítésnek tűnik, mint verziókonfliktusnak. Telepítsen egy régebbi futtatókörnyezetet, például conda install -c conda-forge 'ffmpeg<8', és tegye a könyvtárait az LD_LIBRARY_PATH-ra. A CUDA_HOME nincs beállítva. A finomhangolás azonnal meghiúsul. Futtassa egyszer a bash scripts/deployment/dgpu/install_deps.sh parancsot, vagy egyszerűen export CUDA_HOME=/usr/local/cuda.

5. lépés: a finomhangolási parancs és a jelzőinek tényleges alapértelmezett értékei

Cserélje le a demó adatkészletet a sajátjára, és adja hozzá a kívánt beállításokat. Alább látható a teljes forma, amelyet a tároló használ a saját új-megtestesülési oktatóanyagában, beleértve az augmentációs és ellenőrzőpont-jelzőket, amelyeket a rövid README példa kihagy. Ez a szűkebb értelemben: a nyelvi gerinc és a vizuális kódoló befagyasztva marad, és ami edzésre kerül, az a projektor és a diffúziós akciófej.

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
Egyetlen GPU. Nyolc kártya esetén cserélje le az indítót uv run torchrun --nproc_per_node=8 --master_port=29500 parancsra, és állítsa be a --num-gpus 8 értéket. Használja az uv run torchrun parancsot, ne a sima torchrun-t, különben rossz környezetet kap.
JelzőAlapértelmezett a FinetuneConfig-banMit csinál
--global-batch-size64Teljes köteg az összes GPU-n a gradiens akkumuláció előtt. A mellékelt példák 32-t használnak.
--learning-rate1e-4Ugyanaz az érték, amit az AY-Robots küld a groot1.7 tréneréhez.
--max-steps10000Összes optimalizáló lépés. Az examples/finetune.sh burkoló is 10000-re állítja az alapértelmezett értéket.
--gradient-accumulation-steps1Megszorozza a tényleges köteget. Az 1 feletti értékek figyelmeztetést adnak ki az akkumulált méretről.
--save-steps and --save-total-limit1000 and 5Ellenőrzőpont gyakorisága, és hányat tart meg. A régebbiek törlődnek.
--weight-decay and --warmup-ratio1e-5 and 0.05Az examples/finetune.sh is expliciten beállítja.
--state-dropout-prob0.2 in the CLI, 0.8 in the model configVéletlenszerűen eldobja a proprioceptív állapotot az edzés során. Csökkentse, ha a feladata az állapoton alapul.
--tune-llm and --tune-visualFalse and FalseA gerinc alapértelmezetten befagyasztva marad.
--tune-projector and --tune-diffusion-modelTrue and TrueA projektor és a diffúziós akciófej az, ami ténylegesen edzésre kerül.
--use-percentilesTrueNormalizálás q01 és q99 értékekkel a nyers min és max helyett.
--dataloader-num-workers2A betöltő alapvetően CPU-alapú. A példák ezt 4-re emelik.
--seeddoes not existNincs seed jelző ezen a CLI-n.

Az utolsó sor nem elírás. launch_finetune.py egy tyro CLI, amelyet egy adatosztályból generáltak, és ez az adatosztály nem tartalmaz seed mezőt. A README külön megjegyzi, hogy a futtatások között 5-6 százalékos eltérés tapasztalható a nem determinisztikus képaugmentáció miatt. Két, azonos flaggel futtatott folyamat nem fog azonos ellenőrzőpontokat eredményezni, ami nagyon fontos, amikor azt próbálja eldönteni, hogy egy hiperparaméter-változtatás segített-e, vagy csak szerencséje volt. Összehasonlításképpen, a lerobot saját trénere alapértelmezetten 1000-es seedet használ, és a LeRobot GR00T receptje expliciten átadja a --seed=42 értéket.

Az érvényesítés alapértelmezetten ki van kapcsolva, és a dokumentált flag nem található ezen a CLI-n

A finomhangolás eval_strategy="no" beállítással fut, így egyáltalán nincs validációs veszteséggörbe. Csak a tréning veszteséget kapja meg, semmi mást. Az új-embodiment útmutató azt javasolja, hogy kapcsolja be a --eval-strategy steps --eval-steps 500 paranccsal, de ez a flag nem létezik a launch_finetune.py fájlban: a CLI-t a tyro generálja a FinetuneConfig adatosztályból, és az eval_strategy, eval_steps és eval_batch_size a TrainingConfig mezői. Az alapértelmezett értékeik ott "no", 500 és 2. Elérésükhöz használja a teljesebb belépési pontot, a gr00t/experiment/launch_train.py fájlt, ahol a beágyazott flag a --training.eval-strategy. Akárhogy is, az önmagában csökkenő tréning veszteség nagyon keveset árul el az általánosításról, ami pontosan az a helyzet, amit a veszteség csökken, de a policy nem csinál semmit leír.

Mennyibe kerül egy 20000 lépéses futtatás

A GR00T N1.7-nek 80 GB-os kártyára van szüksége, így a költségkérdésre szűk a válasz. Az AY-Robots platformon a groot1.7 tréner az A100 80 GB vagy H100 80 GB szinten fut, ahol egy futtatás 3-6 órát vesz igénybe, óránként 1.20-2.00 USD áron a spot piacon. Ez nagyjából 4-12 USD a 20000 lépéses alapértelmezett feladatra. Ugyanez a feladat a SmolVLA vagy ACT egy 24 GB-os kártyán fut, óránként 0.30-0.60 USD áron, és 1-3 USD futtatásonként. Ez az igazi kompromisszum: a GR00T körülbelül négyszer annyiba kerül kísérletenként, és nem futtathatja az asztala alatt lévő 4090-en.

ModellGPU szintTipikus futásTipikus költségMinimum epizódok
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

Az 50-epizód minimum egy alsó határ, nem cél. Az NVIDIA saját GYIK-je igényesebb: nagyjából 100 trajektória egy egyszerű, rögzített helyű felvételhez és elhelyezéshez, 500 vagy több komplex vagy többlépéses jelenetekhez, és 100-500 finom manipulációhoz. Ha 20 epizódnál tart, inkább délután rögzítsen, mint este hangoljon. A adatgyűjtési útmutató lefedi, mi különbözteti meg a hasznos epizódot az elpazarolttól, rögzítse első adatkészletét a rövid változat, és SO-100 adatgyűjtés a kar-specifikus.

Az AY-Robots GR00T N1.7 tréning útmutatója az SO-100-hoz, amely a specifikációs sávot mutatja a GPU szinttel, a szükséges adatkészlet formátummal és a tréner alapértelmezett beállításaival
A /train/groot-n1-7-on-so-100 útmutató azokat a tényeket mutatja be, amelyeket egyébként kézzel kellene rekonstruálnia: GPU szint, adatkészlet formátum és a tréner által küldött pontos alapértelmezett értékek.

6. lépés: nyílt hurkú kiértékelés, mielőtt hozzáérne a karhoz

Ne tegyen friss ellenőrzőpontot egy fizikai karra, hogy megtudja, működött-e a tréning. Először futtassa az open-loop kiértékelést. Ez visszajátssza egy rögzített epizódot, minden lépésnél akciókat kér a modelltől, és ábrázolja az előrejelzést a valósággal szemben MSE és MAE értékekkel. Semmibe sem kerül, és elkapja a 2. és 3. lépésből származó leképezési hibákat.

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
Az ábrák a /tmp/open_loop_eval/traj_<id>.jpeg helyre kerülnek, hacsak nem adja meg a --save-plot-path paramétert. Alapértelmezések: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

A tároló szándékosan nem tesz közzé cél MSE értéket egyedi adatokhoz, és ez a helyes döntés: a szám az akcióegységektől, a feladattól és az adathalmaz méretétől függ, így egy más karjáról másolt küszöbérték semmit sem jelent. Ami értelmes, az a trend. Itt van a referencia futtatás, amelyet a tároló dokumentál egyetlen H100-on az ötepizódos demo adathalmazzal és 2000 lépéssel.

EllenőrzőpontÁtlagos MSE a 0. trajektóriánÁtlagos MAE a 0. trajektórián
50087.55.63
100025.43.30
150013.22.18
200010.01.76

Az alak a jel, nem az abszolút értékek. A hiba egyenletesen csökkenjen, ahogy képzési lépések halmozódnak. Az összes öt képzési epizód átlagában, nem csak a 0. trajektória alapján, a tároló utolsó ellenőrzőpontja körülbelül 7.5 MSE és 1.5 MAE pontszámot ért el, így még a referencia futás is eltérően olvasható attól függően, hogy mely epizódokat átlagolja. Rögzítse saját alapvonalát a módosítatlan demo paranccsal, mielőtt bármit is változtatna a saját adataival kapcsolatban: ha nem tud reprodukálni egy ismert, jól működő futtatást, akkor nem tudja megkülönböztetni a beállítási hibát az adatproblémától. A tároló a gyakori tüneteket is okokhoz rendeli, és mindegyikük működési, nem pedig modellhiba.

TünetValószínű ok
MSE lapos vagy emelkedő az ellenőrzőpontokon keresztülA tanulási ráta túl alacsony, vagy az adatok egyáltalán nem töltődnek be. Ellenőrizze a --dataset-path és a dataloader munkásokat.
A predikciós görbe lapos vagy állandóA modality.json kulcsok vagy a --modality-config-path nem egyeznek. Az akciókulcsok nincsenek leképezve.
MSE hatalmas, vagy NaN veszteség a képzés soránAkció- és állapotnormalizálás. Ellenőrizze a meta/stats-t és azt, hogy az akciótartományok fizikailag hihetőek-e.
Jó a 0. trajektórián, gyenge a visszatartott epizódokonAdathiány, nem hiba. Öt demo epizód nem tud általánosítani.

A másik út: lerobot-train Isaac-GR00T helyett

A LeRobot jelenlegi kiadása, a 0.6.1 a PyPI-n 2026. augusztus 3. óta, egy második és egészen más módot kínál ugyanazoknak az alap súlyoknak a finomhangolására. A LeRobot a GR00T N1.7-et házirend típusként teszi elérhetővé, és a saját lerobot-train belépési pontján keresztül képzi. Két dolog fontos itt. A LeRobot CLI konzol szkriptek halmaza, így bármi, amit olvas, és azt mondja, hogy python lerobot/scripts/train.py elavult és nem fog futni. A LeRobot teljesen eltávolította a GR00T N1.5 támogatását, elutasítva az N1.5 ellenőrzőpontokat és konfigurációkat egy migrációs megjegyzéssel, így ha N1.5-re van szüksége a LeRoboton keresztül, akkor rögzítenie kell a lerobot==0.5.1, az utolsó kiadást, amely támogatja, 2026. április 7-én jelent meg.

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
A LeRobot-natív GR00T N1.7 recept. Megjegyzés relative_exclude_joints: a gripper ki van zárva a relatív akciókból, ami ugyanaz a döntés, amit a so100_config.py hoz az ActionRepresentation.ABSOLUTE-tal.
AspektusIsaac-GR00T launch_finetune.pylerobot-train --policy.type=groot
Csak LeRobot v2, konverzió szükségesNatív LeRobot adatkészlet, nincs visszaminősítés
meta/modality.json plusz egy Python adatkonfigurációnincs modality.json; a viselkedést a parancssori --policy.* flagek határozzák meg
egyáltalán nincs seed flag--seed, LeRobot alapértelmezett 1000
kulcsonkénti ActionConfig az adatkonfigurációban--policy.use_relative_actions plusz --policy.relative_exclude_joints
SO-100 nyílt hurkú MSE trend demo adatokonLIBERO csomagok, 96.5 százalékos átlag négy csomagban
run_gr00t_server.py plusz eval_so100.py ZMQ-n keresztüllerobot-rollout, valós idejű chunkinggal (a queue_threshold 5-ön vagy az alatt maradjon)
A finomhangolás futtatása saját kezűleg
Előnyök
  • Minden flag látható és módosítható. Feloldhatja a vizuális enkóder fagyasztását, áthelyezheti a state_dropout_prob-ot, vagy lerövidítheti az akcióhorizontot.
  • A nyílt hurkú ábrák helyi fájlok. A checkpoint-5000 és a checkpoint-20000 közötti különbség megtekintése egy shell parancs.
  • Nem függ semmilyen platform online állapotától, és a checkpoint szabványos formátumban van a lemezén.
  • A repo LIBERO, SimplerEnv és DROID benchmark példái ismert, jól működő futtatásokat biztosítanak, amelyeket reprodukálhat, mielőtt megbízna a saját adataiban.
Kompromisszumok
  • A környezet a munka nagy része. FFmpeg verzió, CUDA_HOME, git-lfs, a zárt backbone, torchcodec: ezek egyike sem modellprobléma, és mindegyik leállítja a futtatást.
  • A v3.0-ról v2.1-re való konverzióhoz külön virtualenv szükséges saját telepítési lépéssel, és felülírja az adatkészlet könyvtárát a helyén.
  • A GPU bérlés akkor kezd el számlázni, amikor elkezdi a hibakeresést, nem pedig akkor, amikor a tréning elkezdődik, és semmi sem állítja le az instanciát, amikor a futtatás befejeződik.
  • Nincs seed azt jelenti, hogy nincs bitről bitre reprodukálhatóság, ráadásul 5-6 százalékos futtatásról futtatásra változó eltérés csak az augmentációból adódóan.

Két módja ugyanazon checkpoint elérésének

Bérled a GPU-t, és minden lépés a te irányításod alatt áll. Reálisan nézve ez első alkalommal egy délután, utána pedig minden alkalommal húsz perc.

  1. Rögzíts epizódokat a lerobot-record segítségével az SO-100-on. Egy LeRobot v3.0 adatkészletet kapsz.
  2. Konvertáld le v2.1-re a scripts/lerobot_conversion/convert_v3_to_v2.py szkripttel a saját virtuális környezetében.
  3. Írd meg a meta/modality.json fájlt és egy Python modalitás konfigurációt, regisztrálva az EmbodimentTag.NEW_EMBODIMENT alatt.
  4. Bérelj egy 80 GB-os kártyát, klónozz almodulokkal, uv sync, hitelesítés a Hugging Face-hez.
  5. Futtasd a launch_finetune.py-t, majd az open_loop_eval.py-t több ellenőrzőponton, és hasonlítsd össze az MSE trendet, mielőtt hardverhez nyúlnál.
  6. Húzd le az ellenőrzőpontot a gépről, mielőtt megsemmisíted az instanciát, majd építsd ki a kiszolgálási útvonalat a karhoz.
Az a lépés, amit mindenki elfelejt

Másold le az ellenőrzőpontot a bérelt instanciáról, mielőtt leállítod. A --save-total-limit 5 azt is jelenti, hogy a régebbi ellenőrzőpontok törlődnek a képzés előrehaladtával, így az 5000. lépésnél kívánt ellenőrzőpont már nem létezhet a 20000. lépésnél.

Az AY-Robots képzési mátrix öt szabályzatmodellel sorokként és négy robotkarral oszlopokként, ahol minden cella egy specifikus képzési útmutatóra mutat.
A /train mátrix: öt modell négy kar ellen. A GR00T N1.7 sor az SO-101-et, a Koch v1.1-et és a LeKiwi-t is lefedi.

Az ellenőrzőpont visszahelyezése a karra

Az Isaac-GR00T szerver-kliens felosztást használ ZMQ-n keresztül. A szabályzat a GPU-n fut, és egy vékony kliens a robotgépen megfigyeléseket küld és akció darabokat fogad. Az SO-100 példa elég teljes ahhoz, hogy lemásolható legyen: indítsd el a run_gr00t_server.py fájlt az ellenőrzőpontoddal és a --embodiment-tag NEW_EMBODIMENT flaggel, majd futtasd az eval_so100.py fájlt a robot oldalon a soros porttal, a robot azonosítóval, a kamera indexekkel és a nyelvi utasítással. A kamera neveknek ebben a parancsban meg kell egyezniük a modality.json fájlban szereplő barátságos nevekkel, nem az operációs rendszer eszközszámaival.

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 szabályozza, hogy a prediktált lépések közül hányat hajtson végre a rendszer az újratervezés előtt. Legfeljebb a policy action_horizon értékével egyezhet meg, és ez a szám a modality konfigurációjában található action delta_indices hossza, nem az alapmodellé. A szállított SO-100 konfiguráció 16-ot prediktál, tehát 16 a felső határ; az alap nvidia/GR00T-N1.7-3B checkpoint 40-re van konfigurálva, és a policy.md egyértelműen kimondja, hogy a finomhangolt checkpointok eltérhetnek. Ha túllépi, ValueError hibát kap, amely mindkét számot megnevezi. A dokumentáció 8-at javasol valós idejű telepítéshez. A régi --action-horizon flag név továbbra is működik, de figyelmeztetést ad.
7.4 V, nem 12 V

Amíg visszaköti a kart: az SO-100 Feetech STS3215 busz szervókat működtet egy 7.4 V-os sínről. 12 V-tal táplálva tönkreteszi őket, és ez könnyű hiba, ha Önnek is van LeKiwi-je, amelynek alapja 12 V-on működik, míg a karja nem. Ellenőrizze a tápellátást az első bekapcsolás előtt, ne a füst után. Lásd az SO-100 hardver oldalát és az SO-100-at a LeKiwi ellenében. Ha a kar bekapcsol, de semmi sem mozog, a szervó nem reagál a kiindulópont.

Most jöjjön az őszinte rész arról, hogy hol fut a policy, mert a képzésnek és a kiszolgálásnak eltérő hardverigényei vannak. A finomhangoláshoz 40 GB vagy több szükséges. Az inferenciához nem: a README 16 GB-ot vagy többet említ, és kifejezetten megnevezi az RTX 4090-et, így egy már meglévő kártya is képes kiszolgálni egy olyan checkpointot, amelyet soha nem tudott volna előállítani. Azt, hogy a policy mennyire érződik reszponzívnak, nem a VRAM dönti el, hanem az, hogy hol található a szerver. Az AY-Robots GR00T N1.7 csak felhőben érhető el, így a vezérlőhurok a műveleti lépésenkénti 152 ms-on felül egy nyilvános internetes oda-vissza utat is fizet, és csak SmolVLA és ACT is fut helyben. Lassú pick and place feladatokhoz egy távoli pod túlélhető. Bármilyen reaktív feladathoz azonban nem az: a policy tétovázóvá válik, ami pontosan úgy néz ki, mint egy képzési hiba, pedig nem az. Az ACT 20 ms-os műveleti lépésenkénti sebességgel a legszűkebb hurkot toleráló modell, a SmolVLA 245 ms-nál tart, és semmilyen mértékű késleltetés hangolás nem hozza vissza az már elköltött oda-vissza utat. Futtassa első policy-jét végigvezeti a kiszolgálási oldalon, elejétől a végéig.

Mi romlik el valójában

  • GatedRepoError az első futtatáskor. Nem kapott hozzáférést az nvidia/Cosmos-Reason2-2B-hez, vagy nem hitelesítette magát. Ez azután történik, hogy a GPU órajele már elindult.
  • Adatkészlet elutasítva betöltéskor. Szinte mindig v3.0 adatkészlet. Konvertálja lefelé. Lásd: v3-ként elutasított adatkészlet.
  • IndexError az eltérő logikai dimenziókról. Megváltoztatta a delta_indices-t, és nem generálta újra a statisztikákat.
  • Memóriahiány a 32. batch-nél. Csökkentse a --global-batch-size értéket és növelje a --gradient-accumulation-steps értéket, vagy csökkentse a --num-shards-per-epoch értéket, amit a konfiguráció kifejezetten javasol, ha a VRAM korlátozott. Lásd: memóriahiány a képzés során.
  • A veszteség csökken, a policy nem csinál semmit. Alapértelmezés szerint nincs validációs felosztás, így egy tiszta képzési görbe nagyon keveset bizonyít. Ez az oldal tárgyalja a diagnózist.
  • Csak az Ön beállításában működik, máshol nem. Várható egy kis adatkészlettel, amelyet egyetlen fényviszonyok között rögzítettek. Az NVIDIA színjitter augmentációt, valamint 20-50 epizódot javasol különböző megvilágítások mellett. További információ itt.
  • A gripper soha nem záródik be megfelelően. Ellenőrizze, hogy a gripper művelet ABSOLUTE, és a kar ízületei RELATIVE értékűek, ebben a sorrendben az action_configs-ban. A gripper nem záródik be felsorolja a többi okot.
  • Egy kamera csendben kiesik a felvétel közben. Az epizód továbbra is mentésre kerül, és a videókulcs is létezik, ezért ez különösen kellemetlen. Kamera nem észlelhető tárgyalja.

A hibamódok teljes indexe itt található: . Ha modellek közül választ, ahelyett, hogy egyet hibakeresne, és tartalmaz benchmark számokat mellékelt forrásokkal, és az az összehasonlítás, amire a legtöbb embernek szüksége van, mert ez a választás egy olyan modell között, amelyet az asztala alatt lévő kártyán képezhet, és egy olyan között, amelyhez egy 80 GB-os csomópontot kell bérelnie a finomhangoláshoz. Annak hátteréhez, hogy ezek a modellek miért viselkednek úgy, ahogy, a és a érdemes először elolvasni. És ha még nem rendelkezik karral, streamel egy fizikai SO-100-at regisztráció nélkül.

Hány epizódra van szükségem, mielőtt megéri finomhangolni a GR00T N1.7-et?

Az AY-Robots 50 epizódban határozza meg a groot1.7 tréner minimális követelményét. Az NVIDIA saját GYIK-je igényesebb: nagyjából 100 trajektória egy egyszerű felvételhez és elhelyezéshez rögzített helyen, 500 vagy több komplex vagy többlépcsős jelenetekhez, és 100-500 finom manipulációhoz. 50 alatt szinte mindig jobban jár, ha több adatot rögzít, mintsem hiperparamétereket hangol. Ha a siker ezután stagnál, az NVIDIA az HG-DAgger-t javasolja: futtassa a policy-t, avatkozzon be, ha az hibázik, és adja hozzá ezeket a korrekciókat az adatkészlethez.

Miért nem töltődik be az adatkészletem, és hogyan tudom megállapítani, melyik verzió?

Nyissa meg a meta/info.json fájlt, és olvassa el a codebase_version-t. A LeRobot jelenlegi CODEBASE_VERSION-je a main ágon v3.0, így bármi, amit egy friss eszköztárral rögzítettek, v3.0, és a GR00T betöltő v2-t vár. Konvertálja a scripts/lerobot_conversion/convert_v3_to_v2.py szkripttel az Isaac-GR00T repóból, amely a codebase_version: v2.1 értéket írja a konvertált adatkészletbe. A szkript saját virtualenv-ben fut, mert más lerobot verzióra van szüksége, mint amit a GR00T rögzít.

Finomhangolhatom a GR00T N1.7-et egy RTX 4090-en?

Nem. Az NVIDIA 40 GB vagy több VRAM-ot javasol a finomhangoláshoz, és H100 vagy L40 csomópontokat nevez meg; más kártyák is működnek, de sokkal tovább tartanak. Egy 4090-es 24 GB-tal rendelkezik. Az AY-Robots ugyanezen okból csak az A100 80 GB és H100 80 GB szinten kínálja a GR00T N1.7-et. Az inferencia más történet: 16 GB elegendő a modell kiszolgálásához, így egy 4090-es futtathat egy policy-t, amit nem tud képezni. Ha olyan VLA-t szeretne, amit 24 GB-on képezhet, az a SmolVLA körülbelül 450 millió paraméterrel vagy az ACT körülbelül 80 millióval.

Miért ad két, azonos flag-ekkel futtatott futtatás különböző checkpointokat?

Mert a launch_finetune.py-nak nincs seed-je. Ez egy tyro CLI, amelyet egy olyan dataclass-ból generáltak, amely nem tartalmaz seed mezőt, így semmi sem rögzíti az RNG-t. A repo külön megjegyzi, hogy a futtatások között 5-6 százalékos eltérés van, amelyet a nem determinisztikus képaugmentáció okoz. Ha a reprodukálhatóság számít, használja inkább a LeRobot útvonalat: a lerobot-train elfogadja a --seed-et, és a közzétett GR00T recept átadja a --seed=42-t.

Az Isaac-GR00T-t vagy a lerobot-train-t használjam?

Használja az Isaac-GR00T-t, ha a referencia implementációt, kulcsonkénti vezérlést az akcióreprezentáció felett, TensorRT exportot, vagy a benchmark példákat szeretné reprodukálni, mielőtt megbízna saját adataiban. Használja a lerobot-train-t, ha az adatkészlete már LeRobot v3.0, és inkább nem konvertálná, ha seed-et szeretne, vagy ha a stack többi része már LeRobot. Mindkettő ugyanazokat az nvidia/GR00T-N1.7-3B súlyokat finomhangolja. Vegye figyelembe, hogy a LeRobot teljesen megszüntette a GR00T N1.5 támogatását: az N1.5 checkpointokat migrációs megjegyzéssel elutasítják, és a lerobot==0.5.1-et kell rögzítenie a további használathoz.

Valóban szükségem van csuklókamerára is az elülső kamera mellett?

A szállított SO-100 konfiguráció mindkettőt használja, és a modality.json az elülső és csukló kamerát külön videókulcsokként térképezi fel. Képezhet egy kamerával, és a modellkártya késleltetési táblázata is egy kamerával van mérve, de a csuklónézet az, ami a policy-nek hasznos információt ad a gripper-ről az érintkezés pillanatában. Ha a gripper rosszkor záródik a rolloutok során, az egyik első dolog, amit ellenőrizni kell, egy hiányzó vagy rosszul beállított csuklókamera.

Finomhangolja a GR00T N1.7-et az SO-100-án anélkül, hogy először felépítené a környezetet

Válassza ki a modellt, az adatkészletet és a hiperparamétereket egy űrlapon. A backend bérel egy A100 80 GB-os vagy H100-as gépet a spot piacon, futtatja a trénert 32-es batch mérettel, 1e-4-es tanulási rátával és 20000 lépéssel, majd a checkpointokat objektumtárolóba írja. Körülbelül 4-12 USD futtatásonként.

Nyissa meg a GR00T N1.7 képzési útmutatót

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started