
Sprawdzony przewodnik po dostrajaniu NVIDIA GR00T N1.7 na zbiorze danych LeRobot SO-100: rzeczywiste flagi, modality.json, wymaganie v2.1, koszt uruchomienia i pułapki.
NVIDIA dostarcza przykład dostrajania dla dokładnie tego ramienia, które prawdopodobnie posiadasz. W repozytorium Isaac-GR00T znajduje się folder o nazwie demo_data/cube_to_bowl_5: pięć epizodów, 4148 klatek przy 30 kl./s, już zapisanych jako LeRobot v2.1, z pasującą konfiguracją modalności w examples/SO100/. Jego meta/info.json raportuje robot_type: so101_follower, co w LeRobot jest tą samą klasą konfiguracji co so100_follower. To jest naprawdę przydatne, ponieważ oznacza to, że ścieżka referencyjna dla GR00T N1.7 na sześciu-stopniach swobody ramienia hobbystycznego jest utrzymywana przez osoby, które napisały model. To nie jest zmniejszone demo humanoidalne, to jest to samo ramię.
Zła wiadomość to odległość między Nagrałem 60 epizodów a ramię wykonuje zadanie. Istnieje około sześciu miejsc, gdzie ten potok zawodzi po cichu, a nie głośno, a cztery z nich znajdują się w plikach, których większość ludzi nigdy nie otwiera: meta/modality.json, konfiguracja danych Pythona, meta/relative_stats.json oraz własny ciąg wersji zbioru danych. Ten przewodnik przedstawia ręczną ścieżkę od początku do końca z prawdziwymi poleceniami, następnie pokazuje to samo zadanie jako formularz na AY-Robots. Wszystko poniżej zostało sprawdzone względem głównej gałęzi Isaac-GR00T z dnia 20 sierpnia 2026 (linia wydania n1.7) i lerobot 0.6.1, opublikowanego na PyPI 3 sierpnia 2026. Upstream szybko się zmienia, a tam, gdzie zmieniono nazwę flagi, ten artykuł o tym informuje.
Co musisz wiedzieć, zanim zaczniesz
- •Dostrajanie GR00T N1.7 wymaga 40 GB lub więcej pamięci VRAM. NVIDIA zaleca węzły H100 lub L40. Karta RTX 4090 z 24 GB nie wykona tego zadania, choć będzie trenować SmolVLA i ACT.
- •Zbiór danych musi być LeRobot v2 (v2.0 lub v2.1) plus specyficzny dla GR00T meta/modality.json. Zbiór danych LeRobot v3.0 nie ładuje się i musi zostać przekonwertowany w dół.
- •Punktem wejścia jest gr00t/experiment/launch_finetune.py, CLI tyro. Nie posiada flagi --seed, więc uruchomienia nie są odtwarzalne bit po bicie.
- •Dla niestandardowego ramienia tag ucieleśnienia to NEW_EMBODIMENT, a ten tag sprawia, że --modality-config-path jest obowiązkowy.
- •Dostarczona receptura SO-100 przewiduje stawy ramienia jako DELTY WZGLĘDNE, a chwytak jako CEL BEZWZGLĘDNY. Odwrócenie tej pary jest cichą awarią, a nie błędem.
- •Na AY-Robots to samo zadanie to formularz: 20000 kroków, batch 32, współczynnik uczenia 1e-4, około 4 do 12 USD na poziomie A100 80 GB lub H100.
Czym właściwie jest GR00T N1.7
GR00T N1.7 to model wizualno-językowo-akcyjny z dwusystemową architekturą opisaną w oryginalnym dokumencie GR00T N1: moduł wizualno-językowy, który odczytuje dane z kamer i instrukcje, oraz transformator dyfuzyjny, który przekształca je w ciągłe komendy silnika. N1.7 zastąpił pierwszą połowę. Rdzeń Eagle z N1.6 został usunięty, zastąpiony przez nvidia/Cosmos-Reason2-2B na architekturze Qwen3-VL, a model został wstępnie wytrenowany na około 20 000 godzinach egocentrycznych nagrań wideo z udziałem ludzi, oprócz danych robota. Własny opis NVIDIA podaje liczbę 20 854 godzin i informuje, że przejście z 1 tys. do 20 tys. godzin ponad dwukrotnie zwiększa średnie ukończenie zadania.
Druga połowa również uległa zmianie, w sposób istotny dla Twojego uruchomienia. Głowica akcji zmniejszyła się z 32 warstw dyfuzyjnych do 16, przewidywany fragment akcji wzrósł z 16 do 40 kroków, a maksymalna szerokość stanu i akcji wzrosła z 29 do 132. Te trzy liczby pochodzą z dziennika zmian w pliku README repozytorium; własny post NVIDIA dotyczący premiery nadal opisuje System 1 jako 32-warstwowy DiT, więc tam, gdzie te dwa źródła się różnią, zaufaj repozytorium, które zamierzasz sklonować. Akcje są domyślnie wyrażane w względnej przestrzeni efektora końcowego, jako delty od bieżącej pozycji, a nie jako cele absolutne, co pozwala na przeniesienie priorytetów manipulacji nauczonych z ludzkich nagrań wideo do sterowania robotem. Sama głowica to dopasowująca przepływ transformator dyfuzyjny, z tej samej rodziny co Pi0.5, ale z innym rdzeniem przed nim. Jeśli nadal korzystasz z poprzedniej generacji, N1.7 kontra N1.5 omawia, czy aktualizacja uzasadnia przebudowę Twojego potoku.
| Właściwość | Wartość | Źródło |
|---|---|---|
| Parametry | 3,000,000,000 | Karta modelu Hugging Face |
| Rdzeń wizualno-językowy | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | README repozytorium |
| Głowica akcji | Transformator dyfuzyjny dopasowujący przepływ, 16 warstw (N1.6 miał 32) | README repozytorium |
| Przewidywany horyzont akcji | 40 steps for the base checkpoint (N1.6 had 16) | getting_started/policy.md i README repozytorium |
| Maksymalna szerokość stanu i akcji | 132 (N1.6 had 29) | README repozytorium |
| Licencja kodu | Apache 2.0 | Isaac-GR00T repository |
| Licencja wag | NVIDIA Open Model License Agreement | karta modelu |
| Opóźnienie, H100 80 GB, PyTorch eager, 4 kroki odszumiania, 1 kamera | 85.8 ms end to end, 11.7 Hz | tabela czasów karty modelu |
| Ten sam sprzęt, pełny potok TensorRT | 27.9 ms end to end, 35.9 Hz | tabela czasów karty modelu |
| Opóźnienie podawane przez AY-Robots dla serwowanego GR00T N1.7 | 152 ms per action step | AY-Robots policy catalog |
Te ostatnie trzy wiersze wyjaśniają większość rozczarowań, o których ludzie donoszą. Nagłówkowe 27.9 ms to silnik TensorRT na H100 z jedną kamerą i czterema krokami odszumiania. Czysty PyTorch na tej samej karcie to 85.8 ms, a karta modelu określa różnicę na 3.08x. Żadna z tych liczb nie obejmuje warstwy serwującej, drugiej kamery ani skoku sieciowego. 152 ms na krok akcji, które AY-Robots podaje dla swojego serwowanego GR00T N1.7, to wartość z serwowaniem w pętli, a do tego dochodzi jeszcze czas podróży w obie strony przez publiczny internet. Więcej na ten temat na końcu. Dla liczb obok innych modeli, GR00T N1.7 kontra Pi0.5 i GR00T N1.7 kontra SmolVLA przedstawiają je obok siebie.

Czego potrzebuje uruchomienie, zanim cokolwiek wpiszesz
| Wymaganie | Dostrajanie | Wnioskowanie |
|---|---|---|
| VRAM, wytyczne NVIDIA | 40 GB lub więcej, zalecane H100 lub L40 | 16 GB lub więcej, działa RTX 4090 |
| Python i CUDA na dGPU | 3.12 i CUDA 12.8 | 3.12 i CUDA 12.8 |
| Backend wideo | torchcodec 0.8.0, FFmpeg 4 to 7 only | to samo |
| Format zbioru danych | LeRobot v2 plus meta/modality.json | nie dotyczy |
| Dostęp do Hugging Face | approved for nvidia/Cosmos-Reason2-2B | to samo |
| Inne narzędzia | git-lfs and uv | uv |
| Warstwa GPU AY-Robots dla trainera groot1.7 | A100 80 GB or H100 80 GB | pod przydzielany automatycznie |
Każdy punkt kontrolny GR00T, w tym bazowy nvidia/GR00T-N1.7-3B, ładuje nvidia/Cosmos-Reason2-2B przy pierwszym użyciu, a to repozytorium jest bramkowane. Plik README dokładnie opisuje błąd: ładowanie modelu kończy się niepowodzeniem z komunikatem GatedRepoError / 401 Client Error. Nie wspomina jednak, kiedy to następuje, co ma miejsce po wynajęciu karty i rozpoczęciu uruchomienia. Poproś o dostęp na stronie modelu, a następnie uruchom uv run huggingface-cli login lub wyeksportuj HF_TOKEN, zanim cokolwiek wynajmiesz.
Krok 0: same epizody
Wszystko poniżej zakłada, że masz już nagrane epizody. Jeśli nie, to jest to prawdziwy pierwszy krok i to on decyduje o tym, jak dobry może być wynik, ponieważ uczenie przez imitację nie może odzyskać informacji, których nie ma w danych. Najpierw skalibruj oba ramiona, a następnie steruj ramieniem podążającym za pomocą ramienia wiodącego podczas gdy lerobot-record zapisuje pliki parquet i strumienie z kamer. Jeśli kalibracja jest wyłączona, wartości połączeń w Twoim zbiorze danych opisują nieco innego robota niż ten, który później wykona politykę, i żadna ilość treningu tego nie naprawi.
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=trueWłasna rada LeRobot to nagranie co najmniej 50 epizodów, po około 10 na każdą lokalizację obiektu, utrzymanie kamer w stałej pozycji i zachowanie spójnego zachowania chwytania. Dodaj wariacje później, nie na początku. Warto pamiętać o zasadzie: jeśli nie byłbyś w stanie wykonać zadania samodzielnie, bazując tylko na obrazach z kamer, to polityka również nie może. W przypadku konfiguracji specyficznej dla ramienia, rozpoczęcie pracy z SO-100 oraz strona LeRobot dla SO-100 obejmują porty, kalibrację i indeksy kamer. Na AY-Robots możesz to również zrobić przez internet z przeglądarki, używając teleoperacji i nagrywać bezpośrednio z sesji.
Krok 1: zbiór danych musi być w formacie LeRobot v2.1
To jest najczęstsza przeszkoda. Obecna CODEBASE_VERSION w głównej gałęzi to v3.0, więc wszystko, co nagrasz dzisiaj za pomocą aktualnego łańcucha narzędzi, będzie w wersji v3.0. Loader GR00T oczekuje wersji v2. Repozytorium jasno wyjaśnia dlaczego: wiele zewnętrznych zbiorów danych, takich jak DROID, LIBERO i Bridge, jest publikowanych w wersji v2, a natywne wsparcie dla obu jest planowane, ale jeszcze nie zaimplementowane. Konwersja leży więc po Twojej stronie i działa we własnym wirtualnym środowisku z konkretnego powodu: scripts/lerobot_conversion posiada własny plik pyproject, który wymaga Pythona 3.10 lub 3.11 i przypina lerobot do jednego commita git, podczas gdy sam Isaac-GR00T wymaga Pythona 3.12. Zainstalowanie konwertera z katalogu głównego repozytorium spowoduje, że zamiast tego otrzymasz pakiet gr00t – co jest błędem, przed którym ostrzega plik README. Jeśli nie znasz formatu, Zbiór danych LeRobot w glosariuszu wyjaśnia, co faktycznie znajduje się w środku.
# 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_lerobotJeśli zbiór danych v3.0 już istnieje lokalnie, skrypt tworzy obok niego układ v2.1, a następnie zamienia: oryginał jest przenoszony do folderu rodzeństwa z dołączoną wersją, <name>_v3.0, a przekonwertowana kopia zajmuje oryginalną ścieżkę. (Docstring skryptu nazywa ten folder _v30; kod dołącza ciąg wersji, więc faktycznie otrzymujesz _v3.0.) Druga niespodzianka: dane wyjściowe zawsze lądują pod <root>/<repo-id>, więc --root examples/SO100/my_dataset_lerobot daje examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset>, a ta dłuższa ścieżka jest tą, której później oczekuje --dataset-path. Gdy zadanie treningowe odrzuci Twój zbiór danych z powodu wersji, strona o odrzuceniu zbioru danych jako v3 wymienia dokładne objawy.
Struktura, której GR00T oczekuje po konwersji, to klasyczny układ v2: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, pliki parquet w katalogu data/chunk-000/, pliki MP4 w katalogu videos/chunk-000/observation.images.
Krok 2: modality.json, sześć liczb, które decydują o wszystkim
W zbiorze danych LeRobot stan robota i akcja są przechowywane jako płaskie tablice float32. Dla SO-100 oba mają kształt [6]: pięć przegubów ramienia i chwytak. Demonstracyjny zbiór danych nazywa je shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, ale te nazwy znajdują się w info.json i nic w pliku parquet nie wskazuje, który indeks jest który. meta/modality.json dostarcza to mapowanie, a GR00T nie będzie trenować bez niego. Oto plik, który repozytorium dostarcza dla SO-100, dosłownie.
{
"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"
}
}
}Skopiuj go do swojego przekonwertowanego zbioru danych pod meta/modality.json i zmień nazwy kluczy wideo na rzeczywiste nazwy twoich kamer. Jeśli nagrywałeś jedną kamerą górną o nazwie top, to original_key to observation.images.top, a przyjazna nazwa to ta, do której będzie odwoływać się twoja konfiguracja danych. Te dwie nazwy muszą być zgodne, a żadna z nich nie sprawdza drugiej za ciebie. Adnotacja językowa jest gorsza, ponieważ ten sam klucz musi pojawić się w trzech miejscach.
| Warstwa | Plik | Forma SO-100 używana w repozytorium |
|---|---|---|
| Kolumna Parquet | data/chunk-*/episode_*.parquet | annotation.human.task_description |
| Klucz modality.json | meta/modality.json, pod "annotation", bez prefiksu annotation. | human.task_description |
| Klucze modality_keys w konfiguracji danych | twój so100_config.py | annotation.human.task_description |
Segmenty po annotation. są wybierane przez autora zbioru danych. Dane demonstracyjne SO-100 używają annotation.human.task_description; LIBERO i SimplerEnv używają annotation.human.action.task_description. Oba są prawidłowe. Jeśli skopiowałeś konfigurację z przykładu LIBERO i wskazałeś ją na własne nagranie SO-100, kanał językowy nie zostanie rozpoznany, a model będzie trenował na pustej instrukcji. Strata nadal spada. Polityka nadal coś robi. Po prostu ignoruje to, co jej powiedziałeś.
Krok 3: konfiguracja danych, ramię względne i chwytak absolutny
Konfiguracja modalności to plik Pythona, a nie JSON, ponieważ decyduje również o tym, jak reprezentowana jest każda grupa akcji. Jest to część przepływu pracy N1.7, która nie istniała w tej samej formie w N1.5 i którą warto przeczytać dwukrotnie. Dostarczona konfiguracja SO-100 przewiduje pięć stawów ramienia jako Względne delty od bieżącego stanu, a chwytak jako Bezwzględną pozycję docelową, ponieważ binarny sygnał otwarcia/zamknięcia działa lepiej jako cel niż jako delta.
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.embodiment_tags import EmbodimentTag
from gr00t.data.types import (
ActionConfig, ActionFormat, ActionRepresentation, ActionType, ModalityConfig,
)
so100_config = {
"video": ModalityConfig(
delta_indices=[0], # current frame only
modality_keys=["front", "wrist"], # must match modality.json
),
"state": ModalityConfig(
delta_indices=[0],
modality_keys=["single_arm", "gripper"],
),
"action": ModalityConfig(
delta_indices=list(range(0, 16)), # predict 16 future steps
modality_keys=["single_arm", "gripper"],
action_configs=[
ActionConfig(rep=ActionRepresentation.RELATIVE, # arm joints
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT),
ActionConfig(rep=ActionRepresentation.ABSOLUTE, # gripper
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT),
],
),
"language": ModalityConfig(
delta_indices=[0],
modality_keys=["annotation.human.task_description"],
),
}
register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)Dwa szczegóły, które mogą kosztować Cię dzień, jeśli ich nie znasz. Po pierwsze, action_configs jest pozycyjne: dokumentacja wymaga tej samej długości i tej samej kolejności co modality_keys, i jasno określają konsekwencje błędu, którym jest ciche zastosowanie niewłaściwej reprezentacji. Twój chwytak zostanie wytrenowany jako delta, a ramię jako cel bezwzględny, i nie pojawi się żaden komunikat o błędzie. Po drugie, register_modality_config sprawdza, czy tag nie jest już zarejestrowany, więc druga konfiguracja NEW_EMBODIMENT w tym samym procesie Pythona zakończy się błędem Embodiment tag ... already registered. Nie możesz zaimportować dwóch takich konfiguracji do jednego skryptu. Trzecia zasada jest egzekwowana później, podczas wdrożenia: akcja delta_indices musi być ciągłym zakresem zaczynającym się od zera. Rzadkie okno, takie jak [0, 4, 8], jest odrzucane, ponieważ wszystko w dalszej części potoku indeksuje przewidywany fragment liniowo i w przeciwnym razie wykonałoby niewłaściwe wiersze.
Statystyki normalizacji, w szczególności meta/relative_stats.json, są obliczane dla długości horyzontu, którą miałeś podczas ich generowania. Skrócenie horyzontu akcji z 16 do 8 bez ponownego generowania spowoduje zatrzymanie treningu z błędem IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. Rozwiązaniem jest jedno polecenie: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Uruchom je po każdej zmianie delta_indices.
Krok 4: środowisko
N1.7 przeniósł repozytorium do i Python 3.12. Stara ścieżka conda plus pip install -e . nadal istnieje w zwiniętej sekcji pliku README, ale ostrzega, że zależności GPU, w tym flash-attn i TensorRT, mogą wymagać ręcznej instalacji. Użyj uv, chyba że masz konkretny powód, aby tego nie robić. W kwestii flash-attn, jeden szczegół pozwala uniknąć zamieszania: zobaczysz Installing flash-attn wydrukowane przy każdym uv run. Nie jest to ponowna kompilacja. uv ponownie waliduje przypięty do URL-a wheel, który jest już w pamięci podręcznej, i zajmuje to dwie lub trzy sekundy.
- 1Zainstaluj git-lfs, a następnie sklonuj z podmodułami
git-lfs jest wymagany, nie opcjonalny. Bez niego pliki parquet w demo_data/ pobierane są jako puste wskaźniki, a uruchomienie demo kończy się niepowodzeniem na zestawie danych, który wydaje się być obecny na liście plików.
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2Zainstaluj uv i zsynchronizuj środowisko
Domyślna instalacja pobiera zależności GPU, w tym flash-attn i TensorRT. Na świeżym obrazie A100 lub H100 jest to najdłuższy pojedynczy krok, więc wykonaj go, zanim zaczniesz zwracać uwagę na cokolwiek innego.
bashcurl -LsSf https://astral.sh/uv/install.sh | sh sudo apt-get update && sudo apt-get install -y ffmpeg uv sync --python 3.12 uv run python -c "import gr00t; print('GR00T installed successfully')" - 3Uwierzytelnij się w Hugging Face
Zrób to przed pierwszym uruchomieniem treningu, a nie po tym, jak zawiedzie po ośmiu minutach.
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4Sprawdzenie poprawności na dostarczonych danych demo SO-100
Zanim dotkniesz własnego nagrania, uruchom 2000 kroków na demo_data/cube_to_bowl_5. To pięć epizodów, kończy się szybko i dowodzi poprawności środowiska, a nie twoich danych. Jeśli to uruchomienie zawiedzie, nic, co zrobisz ze swoim zestawem danych, nie pomoże.
bashCUDA_VISIBLE_DEVICES=0 uv run python \ gr00t/experiment/launch_finetune.py \ --base-model-path nvidia/GR00T-N1.7-3B \ --dataset-path demo_data/cube_to_bowl_5 \ --embodiment-tag NEW_EMBODIMENT \ --modality-config-path examples/SO100/so100_config.py \ --num-gpus 1 \ --output-dir /tmp/test_finetune \ --max-steps 2000 \ --global-batch-size 32 \ --dataloader-num-workers 4
FFmpeg 8. torchcodec 0.8.0 obsługuje tylko FFmpeg od 4 do 7, a Ubuntu 25.10 i nowsze dostarczają wersję 8. Błąd to Could not load libtorchcodec, co wygląda na uszkodzoną instalację, a nie konflikt wersji. Zainstaluj starsze środowisko uruchomieniowe, na przykład conda install -c conda-forge 'ffmpeg<8', i umieść jego biblioteki w LD_LIBRARY_PATH. CUDA_HOME jest niezdefiniowane. Dostrajanie całkowicie zawodzi. Uruchom bash scripts/deployment/dgpu/install_deps.sh raz, lub po prostu export CUDA_HOME=/usr/local/cuda.
Krok 5: polecenie fine-tune i jakie są jego rzeczywiste wartości domyślne flag
Zamień demonstracyjny zestaw danych na swój własny i dodaj parametry, które faktycznie chcesz. Poniżej znajduje się pełna forma, której repozytorium używa w swoim własnym samouczku dotyczącym nowego wcielenia, w tym flagi augmentacji i punktów kontrolnych, które krótki przykład z README pomija. To jest w wąskim sensie: rdzeń językowy i koder wizualny pozostają zamrożone, a trenowane są projektor i głowica akcji dyfuzyjnej.
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| Flaga | Wartość domyślna w FinetuneConfig | Co robi |
|---|---|---|
| --global-batch-size | 64 | Całkowita partia danych na wszystkich procesorach graficznych przed akumulacją gradientu. Dostarczone przykłady używają 32. |
| --learning-rate | 1e-4 | Ta sama wartość, którą AY-Robots wysyła dla swojego trainera groot1.7. |
| --max-steps | 10000 | Całkowita liczba kroków optymalizatora. Wrapper examples/finetune.sh również domyślnie ustawia 10000. |
| --gradient-accumulation-steps | 1 | Mnoży efektywną partię danych. Wartości powyżej 1 generują ostrzeżenie informujące o skumulowanym rozmiarze. |
| --save-steps and --save-total-limit | 1000 and 5 | Częstotliwość punktów kontrolnych i ile z nich jest przechowywanych. Starsze są usuwane. |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | Również jawnie ustawione przez examples/finetune.sh. |
| --state-dropout-prob | 0.2 in the CLI, 0.8 in the model config | Losowo pomija stan proprioceptywny podczas treningu. Zmniejsz tę wartość, jeśli twoje zadanie opiera się na stanie. |
| --tune-llm and --tune-visual | False and False | Rdzeń pozostaje domyślnie zamrożony. |
| --tune-projector and --tune-diffusion-model | True and True | Projektor i głowica akcji dyfuzyjnej to elementy, które faktycznie są trenowane. |
| --use-percentiles | True | Normalizuj za pomocą q01 i q99 zamiast surowych wartości min i max. |
| --dataloader-num-workers | 2 | Loader jest zaprojektowany jako oparty na CPU. Przykłady zwiększają tę wartość do 4. |
| --seed | does not exist | W tym CLI nie ma flagi seed. |
Ten ostatni wiersz to nie literówka. launch_finetune.py to CLI tyro wygenerowane z dataclass, a ta dataclass nie ma pola seed. Plik README osobno odnotowuje 5 do 6 procent wariancji między uruchomieniami spowodowanej niedeterministyczną augmentacją obrazu. Dwa uruchomienia z identycznymi flagami nie wygenerują identycznych punktów kontrolnych, co ma duże znaczenie, gdy próbujesz zdecydować, czy zmiana hiperparametru pomogła, czy też miałeś szczęście. Dla porównania, własny trener lerobot domyślnie używa seed 1000, a przepis LeRobot GR00T przekazuje --seed=42 jawnie.
Dostrajanie odbywa się z eval_strategy="no", więc w ogóle nie ma krzywej straty walidacyjnej. Otrzymujesz tylko stratę treningową i nic więcej. Przewodnik po nowym wcieleniu mówi, aby włączyć ją za pomocą --eval-strategy steps --eval-steps 500, ale ta flaga nie istnieje w launch_finetune.py: CLI jest generowane przez tyro z dataclass FinetuneConfig, a eval_strategy, eval_steps i eval_batch_size są polami TrainingConfig. Ich domyślne wartości to "no", 500 i 2. Aby do nich dotrzeć, użyj pełniejszego punktu wejścia gr00t/experiment/launch_train.py, gdzie zagnieżdżona flaga to --training.eval-strategy. Tak czy inaczej, sama spadająca strata treningowa mówi bardzo niewiele o generalizacji, co jest dokładnie sytuacją opisaną w strata spada, ale polityka nic nie robi.
Ile kosztuje uruchomienie 20000 kroków
GR00T N1.7 wymaga karty 80 GB, więc pytanie o koszt ma wąską odpowiedź. Na AY-Robots trener groot1.7 działa na poziomie A100 80 GB lub H100 80 GB, gdzie uruchomienie zajmuje od 3 do 6 godzin przy koszcie od 1.20 do 2.00 USD za godzinę na rynku spot. To jest około 4 do 12 USD za domyślne zadanie 20000 kroków. To samo zadanie na SmolVLA lub ACT ląduje na karcie 24 GB przy koszcie od 0.30 do 0.60 USD za godzinę i od 1 do 3 USD za uruchomienie. To jest prawdziwy kompromis: GR00T kosztuje około cztery razy więcej za próbę, a nie możesz go uruchomić na karcie 4090 pod biurkiem.
| Model | Poziom GPU | Typowy czas działania | Typowy koszt | Minimalna liczba epizodów |
|---|---|---|---|---|
| GR00T N1.7 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| GR00T N1.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| Pi0.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| SmolVLA | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 30 |
| ACT | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 50 |
Minimalna liczba epizodów wynosząca 50 to epizod minimum, a nie cel. Własne FAQ NVIDII jest bardziej wymagające: około 100 trajektorii dla prostego podnoszenia i odkładania w stałej lokalizacji, 500 lub więcej dla złożonych lub wieloetapowych scen, oraz od 100 do 500 dla precyzyjnej manipulacji. Jeśli masz tylko 20 epizodów, poświęć popołudnie na nagrywanie, zamiast wieczorem na strojenie. przewodnik po zbieraniu danych opisuje, co odróżnia użyteczny epizod od zmarnowanego, nagraj swój pierwszy zbiór danych to krótka wersja, a zbieranie danych SO-100 to wersja specyficzna dla ramienia.

Krok 6: ocena w otwartej pętli, zanim dotkniesz ramienia
Nie umieszczaj świeżego punktu kontrolnego na fizycznym ramieniu, aby sprawdzić, czy trening zadziałał. Najpierw uruchom ewaluację w otwartej pętli. Odtwarza ona nagrany epizod, prosi model o akcje na każdym kroku i wykreśla przewidywania w porównaniu z prawdą podstawową, używając MSE i MAE. Nic nie kosztuje i wyłapuje błędy mapowania z kroków 2 i 3.
uv run python gr00t/eval/open_loop_eval.py \
--dataset-path ./my_dataset_lerobot \
--embodiment-tag NEW_EMBODIMENT \
--model-path /tmp/so100/checkpoint-20000 \
--traj-ids 0 \
--execution-horizon 16 \
--steps 400 \
--modality-keys single_arm gripperRepozytorium celowo odmawia publikowania docelowego MSE dla niestandardowych danych, i jest to słuszna decyzja: liczba zależy od twoich jednostek akcji, twojego zadania i rozmiaru twojego zbioru danych, więc próg skopiowany z ramienia kogoś innego nic nie znaczy. Znaczący jest trend. Oto referencyjne uruchomienie, które repozytorium dokumentuje na pojedynczym H100 z pięcioodcinkowym demonstracyjnym zbiorem danych i 2000 krokami.
| Punkt kontrolny | Średnie MSE na trajektorii 0 | Średnie MAE na trajektorii 0 |
|---|---|---|
| 500 | 87.5 | 5.63 |
| 1000 | 25.4 | 3.30 |
| 1500 | 13.2 | 2.18 |
| 2000 | 10.0 | 1.76 |
Kształt jest sygnałem, a nie wartościami bezwzględnymi. Błąd powinien systematycznie spadać w miarę kroków treningowych akumulacji. Uśredniony dla wszystkich pięciu epizodów treningowych, a nie tylko dla trajektorii 0, końcowy punkt kontrolny repozytorium uzyskał wynik około 7.5 MSE i 1.5 MAE, więc nawet uruchomienie referencyjne daje różne odczyty w zależności od tego, które epizody uśredniasz. Zarejestruj własną linię bazową na niezmodyfikowanym poleceniu demo, zanim zmienisz cokolwiek w swoich danych: jeśli nie możesz odtworzyć znanego, poprawnego uruchomienia, nie możesz odróżnić błędu konfiguracji od problemu z danymi. Repozytorium mapuje również typowe objawy do przyczyn, a każdy z nich jest operacyjny, a nie błędem modelu.
| Objaw | Prawdopodobna przyczyna |
|---|---|
| MSE płaskie lub rosnące w punktach kontrolnych | Zbyt niska szybkość uczenia lub dane w ogóle się nie ładują. Sprawdź --dataset-path i procesy ładowania danych (dataloader workers). |
| Krzywa predykcji jest płaska lub stała | Klucze modality.json lub --modality-config-path nie pasują. Klucze akcji nie są mapowane. |
| MSE ogromne lub strata NaN podczas treningu | Normalizacja akcji i stanu. Zweryfikuj meta/stats i upewnij się, że zakresy akcji są fizycznie wiarygodne. |
| Dobre na traj 0, słabe na epizodach wstrzymanych | Niedobór danych, nie błąd. Pięć epizodów demo nie może uogólniać. |
Inna droga: lerobot-train zamiast Isaac-GR00T
Obecna wersja LeRobot, 0.6.1 na PyPI od 3 sierpnia 2026, oferuje drugi i zupełnie inny sposób na dostrojenie tych samych wag bazowych. LeRobot udostępnia GR00T N1.7 jako typ polityki i trenuje go poprzez własny punkt wejścia lerobot-train. Dwie rzeczy są tu ważne. CLI LeRobot to zestaw skryptów konsolowych, więc wszystko, co czytasz, mówiące python lerobot/scripts/train.py, jest przestarzałe i nie zadziała. LeRobot całkowicie usunął wsparcie dla GR00T N1.5, odrzucając punkty kontrolne i konfiguracje N1.5 z notatką o migracji, więc jeśli potrzebujesz N1.5 przez LeRobot, musisz przypiąć lerobot==0.5.1, ostatnią wersję, która go obsługuje, opublikowaną 7 kwietnia 2026.
pip install "lerobot[groot]" "lerobot[training]"
hf auth login
lerobot-train \
--dataset.repo_id=$HF_USER/$DATASET_NAME \
--dataset.image_transforms.enable=true \
--policy.type=groot \
--policy.device=cuda \
--policy.base_model_path=nvidia/GR00T-N1.7-3B \
--policy.embodiment_tag=new_embodiment \
--policy.chunk_size=16 \
--policy.n_action_steps=16 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]' \
--policy.use_bf16=true \
--seed=42 \
--batch_size=64 \
--steps=20000 \
--save_freq=5000 \
--output_dir=$OUTPUT_DIR| Aspekt | Isaac-GR00T launch_finetune.py | lerobot-train --policy.type=groot |
|---|---|---|
| Wersja zbioru danych | Tylko LeRobot v2, wymagana konwersja | Natywny zbiór danych LeRobot, bez obniżania wersji |
| Mapowanie modalności | meta/modality.json plus konfiguracja danych w Pythonie | brak modality.json; zachowanie ustawiane przez flagi --policy.* w wierszu poleceń |
| Ziarno | brak flagi seed | --seed, domyślne LeRobot 1000 |
| Akcje względne | ActionConfig dla każdego klucza w konfiguracji danych | --policy.use_relative_actions plus --policy.relative_exclude_joints |
| Opublikowane wyniki referencyjne | Trend MSE w otwartej pętli SO-100 na danych demonstracyjnych | Zestawy LIBERO, średnio 96,5 procent w czterech zestawach |
| Ścieżka wdrożenia | run_gr00t_server.py plus eval_so100.py przez ZMQ | lerobot-rollout, z fragmentowaniem w czasie rzeczywistym (queue_threshold powinno pozostać na poziomie 5 lub poniżej) |
- Każda flaga jest widoczna i zmienna. Możesz odblokować wizualny koder, zmienić state_dropout_prob lub skrócić horyzont akcji.
- Wykresy otwartej pętli to pliki lokalne. Porównywanie checkpoint-5000 z checkpoint-20000 to polecenie shella.
- Nie zależysz od tego, czy jakakolwiek platforma pozostaje online, a punkt kontrolny znajduje się na Twoim dysku w standardowym formacie.
- Przykłady benchmarków repozytorium dla LIBERO, SimplerEnv i DROID dają Ci sprawdzone uruchomienia do odtworzenia, zanim zaufasz własnym danym.
- Środowisko to większość pracy. Wersja FFmpeg, CUDA_HOME, git-lfs, bramkowany backbone, torchcodec: żaden z nich nie jest problemem modelu, a każdy z nich zatrzymuje uruchomienie.
- Konwersja z v3.0 do v2.1 wymaga oddzielnego wirtualnego środowiska z własnym krokiem instalacji i nadpisuje katalog zbioru danych w miejscu.
- Wynajem GPU zaczyna być naliczany, gdy rozpoczynasz debugowanie, a nie gdy rozpoczyna się trening, i nic nie zatrzymuje instancji po zakończeniu uruchomienia.
- Brak ziarna oznacza brak odtwarzalności bit po bicie, oprócz 5 do 6 procent zmienności między uruchomieniami wynikającej z samej augmentacji.
Dwa sposoby na uzyskanie tego samego punktu kontrolnego
Wynajmujesz GPU i kontrolujesz każdy krok. Realistycznie, za pierwszym razem zajmie to popołudnie, a potem dwadzieścia minut za każdym kolejnym razem.
- Nagrywaj epizody za pomocą lerobot-record na SO-100. Otrzymasz zestaw danych LeRobot v3.0.
- Skonwertuj go do wersji v2.1 za pomocą scripts/lerobot_conversion/convert_v3_to_v2.py w osobnym środowisku wirtualnym.
- Napisz meta/modality.json i konfigurację modalności w Pythonie, zarejestrowaną pod EmbodimentTag.NEW_EMBODIMENT.
- Wynajmij kartę 80 GB, sklonuj z podmodułami, zsynchronizuj uv, uwierzytelnij się w Hugging Face.
- Uruchom launch_finetune.py, a następnie open_loop_eval.py na kilku punktach kontrolnych i porównaj trend MSE przed dotknięciem sprzętu.
- Pobierz punkt kontrolny z maszyny, zanim zniszczysz instancję, a następnie zbuduj ścieżkę serwowania do ramienia.
Skopiuj punkt kontrolny z wynajętej instancji, zanim ją wyłączysz. `--save-total-limit 5` oznacza również, że starsze punkty kontrolne są usuwane w miarę postępu treningu, więc punkt kontrolny, który chciałeś na kroku 5000, może już nie istnieć na kroku 20000.
To samo zadanie w formie formularza. Wybierasz model i zestaw danych, backend wynajmuje GPU na rynku spot według wymaganego VRAM, uruchamia trener i zapisuje punkty kontrolne w pamięci obiektowej. Przewodnik GR00T N1.7 na SO-100 to dokładnie ta kombinacja; matryca treningowa zawiera każdą inną parę modelu i ramienia, w tym GR00T N1.7 na SO-101.
| Co wysyła trener groot1.7 | Wartość |
|---|---|
| Rozmiar partii | 32 |
| Współczynnik uczenia | 1e-4 |
| Maksymalna liczba kroków | 20000 |
| Akumulacja gradientu | 1, i ma to wpływ na ten trener |
| Dodatkowe pokrętło dostępne w formularzu | saveSteps |
| Bazowy punkt kontrolny | nvidia/GR00T-N1.7-3B |
| Akceptowany format zestawu danych | LeRobot v2.0 or v2.1 |
Zestaw danych może pochodzić z repozytorium Hugging Face, z Twojej własnej maszyny lub z sesji nagranej za pomocą klienta desktopowego. Inferencia to osobny krok: platforma udostępnia pod, który obsługuje politykę, a Twój lokalny klient robota komunikuje się z tym punktem końcowym. Pody posiadają mechanizm watchdog dla bezczynności i niszczą się po okresie bezczynności, więc zapomniana karta przeglądarki nie generuje rachunków przez noc. Jeśli wolisz nie klikać, te same operacje są dostępne na CLI i serwerze MCP.
GR00T N1.7 i Pi0.5 są tutaj dostępne tylko w chmurze; tylko SmolVLA i ACT działają również lokalnie. Wymóg v2.1 również nie znika, ponieważ zestaw danych v3.0 nadal musi zostać skonwertowany, zanim ładowarka GR00T go zaakceptuje. I nic nie zapisuje za Ciebie semantyki modality.json: jeśli klucze Twojej kamery lub klucz językowy są błędne, są błędne na obu trasach. Zobacz dokumentację treningową, aby dowiedzieć się, co backend robi, a czego nie robi w Twoim imieniu.

Przywracanie punktu kontrolnego na ramię
Isaac-GR00T wykorzystuje podział serwer-klient przez ZMQ. Polityka działa na GPU, a cienki klient na maszynie robota wysyła obserwacje i odbiera fragmenty akcji. Przykład SO-100 jest wystarczająco kompletny, aby go skopiować: uruchom run_gr00t_server.py z Twoim punktem kontrolnym i --embodiment-tag NEW_EMBODIMENT, a następnie uruchom eval_so100.py po stronie robota z portem szeregowym, identyfikatorem robota, indeksami kamer i instrukcją językową. Nazwy kamer w tym poleceniu muszą odpowiadać przyjaznym nazwom z Twojego modality.json, a nie numerom urządzeń systemu operacyjnego.
# 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"Podczas ponownego podłączania ramienia: SO-100 używa serw Feetech STS3215 na szynie 7.4 V. Podanie im 12 V niszczy je, a jest to łatwy błąd, jeśli posiadasz również LeKiwi, którego podstawa działa na 12 V, podczas gdy ramię nie. Sprawdź zasilanie przed pierwszym uruchomieniem, a nie po dymie. Zobacz stronę sprzętową SO-100 oraz SO-100 kontra LeKiwi. Jeśli ramię się uruchamia, ale nic się nie rusza, serwo nie odpowiada to miejsce, od którego należy zacząć.
Teraz szczera część o tym, gdzie działa polityka, ponieważ szkolenie i serwowanie mają różne historie sprzętowe. Dostrajanie wymaga 40 GB lub więcej. Ingerencja nie: README podaje 16 GB lub więcej i wyraźnie wymienia RTX 4090, więc karta, którą już posiadasz, może obsługiwać punkt kontrolny, którego nigdy nie mogła wyprodukować. To, co decyduje o tym, czy polityka jest responsywna, to nie VRAM, ale miejsce, w którym znajduje się serwer. Na AY-Robots GR00T N1.7 jest tylko w chmurze, więc pętla sterowania płaci za podróż w obie strony przez publiczny internet, oprócz 152 ms na krok akcji, i tylko SmolVLA i ACT również działają lokalnie. W przypadku wolnego podnoszenia i odkładania zdalny pod jest do przeżycia. W przypadku czegokolwiek reaktywnego nie: polityka staje się niezdecydowana w sposób, który wygląda dokładnie jak błąd szkoleniowy, a nim nie jest. ACT przy 20 ms na krok akcji to model, który toleruje najciaśniejszą pętlę, SmolVLA działa przy 245 ms, a żadna ilość dostrajania opóźnień nie odkupi podróży w obie strony, która już została wydana. Uruchom swoją pierwszą politykę przeprowadza przez stronę serwującą od początku do końca.
Co faktycznie idzie nie tak
- Błąd GatedRepoError przy pierwszym uruchomieniu. Nie otrzymałeś dostępu do nvidia/Cosmos-Reason2-2B lub nie uwierzytelniłeś się. Dzieje się to po uruchomieniu zegara GPU.
- Zbiór danych odrzucony podczas ładowania. Prawie zawsze jest to zbiór danych w wersji v3.0. Skonwertuj go do niższej wersji. Zobacz zbiór danych odrzucony jako v3.
- Błąd IndexError dotyczący niezgodnych wymiarów logicznych. Zmieniłeś delta_indices i nie wygenerowałeś ponownie statystyk.
- Brak pamięci przy partii 32. Zmniejsz --global-batch-size i zwiększ --gradient-accumulation-steps, lub zmniejsz --num-shards-per-epoch, co konfiguracja wyraźnie sugeruje, gdy pamięć VRAM jest ograniczona. Zobacz brak pamięci podczas treningu.
- Strata spada, polityka nic nie robi. Domyślnie nie ma podziału walidacyjnego, więc czysta krzywa treningowa niewiele dowodzi. Ta strona opisuje diagnozę.
- Działa w Twojej konfiguracji i nigdzie indziej. Spodziewane przy małym zbiorze danych nagranym w jednym warunku oświetleniowym. NVIDIA zaleca augmentację z jitterem kolorów plus 20 do 50 epizodów w różnych warunkach oświetleniowych. Więcej tutaj.
- Chwytak nigdy nie zamyka się prawidłowo. Sprawdź, czy akcja chwytaka jest ABSOLUTE, a stawy ramienia RELATIVE, w tej kolejności w action_configs. Chwytak się nie zamyka wymienia inne przyczyny.
- Kamera cicho przestaje działać w trakcie nagrywania. Epizod nadal się zapisuje, a klucz wideo nadal istnieje, dlatego jest to tak nieprzyjemne. Kamera niewykryta opisuje to.
Cały indeks trybów awarii znajduje się na . Jeśli wybierasz między modelami, a nie debugujesz jeden, oraz mają dołączone liczby benchmarkowe ze źródłami, a to porównanie, którego większość ludzi faktycznie potrzebuje, ponieważ jest to wybór między modelem, który możesz trenować na karcie pod biurkiem, a takim, do którego musisz wynająć węzeł 80 GB, aby go dostroić. Aby zrozumieć, dlaczego te modele zachowują się w ten sposób, oraz warto przeczytać najpierw. A jeśli jeszcze nie posiadasz ramienia, transmituje fizyczne SO-100 bez konieczności rejestracji.
Ile epizodów potrzebuję, zanim dostrajanie GR00T N1.7 będzie tego warte?▾
AY-Robots ustala minimum 50 epizodów dla trenera groot1.7. Własne FAQ NVIDII jest bardziej wymagające: około 100 trajektorii dla prostego podnoszenia i umieszczania w stałej lokalizacji, 500 lub więcej dla złożonych lub wieloetapowych scen, oraz 100 do 500 dla precyzyjnej manipulacji. Poniżej 50 epizodów prawie zawsze lepiej jest nagrać więcej danych niż dostrajać hiperparametry. Jeśli sukces osiągnie plateau po tym, NVIDIA zaleca HG-DAgger: uruchom politykę, interweniuj, gdy zawiedzie, i dodaj te korekty do zbioru danych.
Dlaczego mój zbiór danych nie ładuje się i jak sprawdzić, która to wersja?▾
Otwórz meta/info.json i odczytaj codebase_version. Obecna wersja CODEBASE_VERSION LeRobot na main to v3.0, więc wszystko nagrane za pomocą niedawnego łańcucha narzędzi to v3.0, a ładowarka GR00T oczekuje v2. Konwertuj za pomocą scripts/lerobot_conversion/convert_v3_to_v2.py z repozytorium Isaac-GR00T, który zapisuje codebase_version: v2.1 do skonwertowanego zbioru danych. Skrypt działa we własnym wirtualnym środowisku, ponieważ potrzebuje innej wersji lerobot niż ta, którą przypina GR00T.
Czy mogę dostroić GR00T N1.7 na RTX 4090?▾
Nie. NVIDIA zaleca 40 GB lub więcej pamięci VRAM do dostrajania i wymienia węzły H100 lub L40; inne karty działają, ale zajmuje to znacznie więcej czasu. Karta 4090 ma 24 GB. AY-Robots oferuje GR00T N1.7 tylko na poziomie A100 80 GB i H100 80 GB z tego samego powodu. Ingerencja to inna historia: 16 GB wystarcza do obsługi modelu, więc 4090 może uruchomić politykę, której nie może trenować. Jeśli chcesz VLA, który możesz trenować na 24 GB, to jest to SmolVLA z około 450 M parametrami lub ACT z około 80 M.
Dlaczego dwa uruchomienia z identycznymi flagami dają różne punkty kontrolne?▾
Ponieważ launch_finetune.py nie ma seeda. Jest to CLI tyro wygenerowane z dataclass, które nie zawiera pola seed, więc nic nie przypina RNG. Repozytorium osobno odnotowuje 5 do 6 procent wariancji między uruchomieniami spowodowanej niedeterministyczną augmentacją obrazu. Jeśli zależy na powtarzalności, użyj zamiast tego ścieżki LeRobot: lerobot-train przyjmuje --seed, a opublikowana receptura GR00T przekazuje --seed=42.
Czy powinienem używać Isaac-GR00T czy lerobot-train?▾
Użyj Isaac-GR00T, jeśli chcesz implementacji referencyjnej, kontroli reprezentacji akcji na klucz, eksportu TensorRT lub przykładów benchmarkowych do odtworzenia, zanim zaufasz własnym danym. Użyj lerobot-train, jeśli Twój zbiór danych jest już w wersji LeRobot v3.0 i wolisz go nie konwertować, jeśli chcesz seeda, lub jeśli reszta Twojego stosu to już LeRobot. Oba dostrajają te same wagi nvidia/GR00T-N1.7-3B. Zauważ, że LeRobot całkowicie zrezygnował ze wsparcia dla GR00T N1.5: punkty kontrolne N1.5 są odrzucane z notatką o migracji, i musisz przypiąć lerobot==0.5.1, aby nadal ich używać.
Czy naprawdę potrzebuję kamery nadgarstkowej oprócz kamery przedniej?▾
Dostarczona konfiguracja SO-100 używa obu, a modality.json mapuje przód i nadgarstek jako oddzielne klucze wideo. Możesz trenować z jedną kamerą, a tabela opóźnień karty modelu jest mierzona z jedną kamerą, ale widok z nadgarstka dostarcza polityce użytecznych informacji o chwytaku w momencie kontaktu. Jeśli chwytak zamyka się w niewłaściwym momencie w Twoich uruchomieniach, brakująca lub źle ustawiona kamera nadgarstkowa jest jedną z pierwszych rzeczy do sprawdzenia.
Dostrój GR00T N1.7 na swoim SO-100 bez wcześniejszego budowania środowiska
Wybierz model, zbiór danych i hiperparametry w formularzu. Backend wynajmuje A100 80 GB lub H100 na rynku spot, uruchamia trenera z partią 32, współczynnikiem uczenia 1e-4 i 20000 krokami, i zapisuje punkty kontrolne do pamięci obiektowej. Około 4 do 12 USD za uruchomienie.
Otwórz przewodnik treningowy GR00T N1.7Sources
- NVIDIA Isaac-GR00T repository README, N1.7 main branch
- Isaac-GR00T: Fine-tune on Custom Embodiments (NEW_EMBODIMENT)
- Isaac-GR00T: Finetuning Models for the SO100/SO101 Robot
- Isaac-GR00T: Robot Data Preparation Guide, the GR00T LeRobot format
- Isaac-GR00T: modality config and ActionConfig reference
- Isaac-GR00T: Policy API Guide and the embodiment tag list
- Isaac-GR00T: FinetuneConfig dataclass with every CLI default
- Isaac-GR00T: the shared finetune launcher wrapper
- GR00T N1.7 FAQ: data volume, augmentation and deployment
- nvidia/GR00T-N1.7-3B model card, including the inference timing table
- nvidia/Cosmos-Reason2-2B, the gated VLM backbone used by N1.7
- GR00T N1: An Open Foundation Model for Generalist Humanoid Robots
- NVIDIA Isaac GR00T N1.7: Open Reasoning VLA Model for Humanoid Robots
- LeRobot: GR00T Policy, the lerobot-train recipe
- LeRobot: Imitation Learning on Real-World Robots (lerobot-record, lerobot-train)
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started