Strona przewodnika AY-Robots dotycząca trenowania GR00T N1.7 na ramieniu SO-100, pokazująca wymagany poziom GPU, format zbioru danych i domyślne ustawienia trenera
GR00T N1.7SO-100DostrajanieLeRobotVLA

Jak trenować GR00T N1.7 na własnym zbiorze danych SO-100

AY-Robots ResearchAugust 23, 202628 min czytania

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
Parametry3,000,000,000Karta modelu Hugging Face
Rdzeń wizualno-językowynvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging FaceREADME repozytorium
Głowica akcjiTransformator dyfuzyjny dopasowujący przepływ, 16 warstw (N1.6 miał 32)README repozytorium
Przewidywany horyzont akcji40 steps for the base checkpoint (N1.6 had 16)getting_started/policy.md i README repozytorium
Maksymalna szerokość stanu i akcji132 (N1.6 had 29)README repozytorium
Licencja koduApache 2.0Isaac-GR00T repository
Licencja wagNVIDIA Open Model License Agreementkarta modelu
Opóźnienie, H100 80 GB, PyTorch eager, 4 kroki odszumiania, 1 kamera85.8 ms end to end, 11.7 Hztabela czasów karty modelu
Ten sam sprzęt, pełny potok TensorRT27.9 ms end to end, 35.9 Hztabela czasów karty modelu
Opóźnienie podawane przez AY-Robots dla serwowanego GR00T N1.7152 ms per action stepAY-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.

Strona modelu AY-Robots dla GR00T N1.7 pokazująca liczbę parametrów, poziom GPU, opóźnienie wnioskowania oraz deklarowane mocne strony i ograniczenia modelu
Strona /policies/groot-n1-7 zawiera ten sam pasek specyfikacji, który w innym przypadku musiałbyś ręcznie złożyć z karty modelu i pliku README repozytorium.

Czego potrzebuje uruchomienie, zanim cokolwiek wpiszesz

WymaganieDostrajanieWnioskowanie
VRAM, wytyczne NVIDIA40 GB lub więcej, zalecane H100 lub L4016 GB lub więcej, działa RTX 4090
Python i CUDA na dGPU3.12 i CUDA 12.83.12 i CUDA 12.8
Backend wideotorchcodec 0.8.0, FFmpeg 4 to 7 onlyto samo
Format zbioru danychLeRobot v2 plus meta/modality.jsonnie dotyczy
Dostęp do Hugging Faceapproved for nvidia/Cosmos-Reason2-2Bto samo
Inne narzędziagit-lfs and uvuv
Warstwa GPU AY-Robots dla trainera groot1.7A100 80 GB or H100 80 GBpod przydzielany automatycznie
Bramkowany szkielet zatrzyma Cię przy pierwszym uruchomieniu

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.

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 na aktualnym LeRobot. Długość epizodu domyślnie wynosi 60 s, a czas resetu 60 s. so100_follower i so101_follower są zarejestrowane w tej samej klasie konfiguracji LeRobot, dlatego przykład Isaac-GR00T SO100 używa nazw so101; oba działają na SO-100. Nazwy kamer, które wybierzesz tutaj (front, wrist), to nazwy, które muszą pojawić się ponownie w modality.json.

Wł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.

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
Konwerter przyjmuje --repo-id, opcjonalny --root oraz --force-conversion, który usuwa istniejącą lokalną migawkę i pobiera ją ponownie. Zapisuje codebase_version: v2.1 do meta/info.json.
Konwersja nadpisuje w miejscu

Jeś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./, oraz jeden dodatkowy plik, którego standardowy LeRobot nie posiada. Ten dodatkowy plik jest źródłem większości pozostałych błędów.

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.

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. Indeksy są zerowe i zgodne z wycinkami Pythona, więc single_arm to [0:5], a gripper to [5:6].

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.

WarstwaPlikForma SO-100 używana w repozytorium
Kolumna Parquetdata/chunk-*/episode_*.parquetannotation.human.task_description
Klucz modality.jsonmeta/modality.json, pod "annotation", bez prefiksu annotation.human.task_description
Klucze modality_keys w konfiguracji danychtwój so100_config.pyannotation.human.task_description
Dlaczego klucz językowy sprawia problemy

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.

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, skrócony do najważniejszych elementów. NON_EEF oznacza przestrzeń stawów; EEF oczekiwałby dziewięciowymiarowego wektora x, y, z plus 6D rotacji.

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.

Zmień delta_indices, a musisz ponownie wygenerować statystyki

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.

  1. 1
    Zainstaluj 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.

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

    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
    Uwierzytelnij się w Hugging Face

    Zrób to przed pierwszym uruchomieniem treningu, a nie po tym, jak zawiedzie po ośmiu minutach.

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

    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
Dwie pułapki środowiskowe, które wyglądają jak błędy modelu

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.

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
Pojedynczy procesor graficzny. Dla ośmiu kart, zastąp launcher poleceniem uv run torchrun --nproc_per_node=8 --master_port=29500 i ustaw --num-gpus 8. Użyj uv run torchrun, a nie samego torchrun, w przeciwnym razie otrzymasz niewłaściwe środowisko.
FlagaWartość domyślna w FinetuneConfigCo robi
--global-batch-size64Całkowita partia danych na wszystkich procesorach graficznych przed akumulacją gradientu. Dostarczone przykłady używają 32.
--learning-rate1e-4Ta sama wartość, którą AY-Robots wysyła dla swojego trainera groot1.7.
--max-steps10000Całkowita liczba kroków optymalizatora. Wrapper examples/finetune.sh również domyślnie ustawia 10000.
--gradient-accumulation-steps1Mnoży efektywną partię danych. Wartości powyżej 1 generują ostrzeżenie informujące o skumulowanym rozmiarze.
--save-steps and --save-total-limit1000 and 5Częstotliwość punktów kontrolnych i ile z nich jest przechowywanych. Starsze są usuwane.
--weight-decay and --warmup-ratio1e-5 and 0.05Również jawnie ustawione przez examples/finetune.sh.
--state-dropout-prob0.2 in the CLI, 0.8 in the model configLosowo pomija stan proprioceptywny podczas treningu. Zmniejsz tę wartość, jeśli twoje zadanie opiera się na stanie.
--tune-llm and --tune-visualFalse and FalseRdzeń pozostaje domyślnie zamrożony.
--tune-projector and --tune-diffusion-modelTrue and TrueProjektor i głowica akcji dyfuzyjnej to elementy, które faktycznie są trenowane.
--use-percentilesTrueNormalizuj za pomocą q01 i q99 zamiast surowych wartości min i max.
--dataloader-num-workers2Loader jest zaprojektowany jako oparty na CPU. Przykłady zwiększają tę wartość do 4.
--seeddoes not existW 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.

Walidacja jest domyślnie wyłączona, a udokumentowana flaga nie jest dostępna w tym CLI

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.

ModelPoziom GPUTypowy czas działaniaTypowy kosztMinimalna liczba epizodów
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

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.

Przewodnik szkoleniowy AY-Robots dla GR00T N1.7 na SO-100, pokazujący pasek specyfikacji z poziomem GPU, wymaganym formatem zbioru danych i domyślnymi ustawieniami trenera
Przewodnik /train/groot-n1-7-on-so-100 przedstawia fakty, które w przeciwnym razie musiałbyś odtworzyć ręcznie: poziom GPU, format zbioru danych oraz dokładne wartości domyślne wysyłane przez trener.

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.

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
Wykresy lądują w /tmp/open_loop_eval/traj_<id>.jpeg, chyba że podasz --save-plot-path. Domyślne wartości: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

Repozytorium 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
50087.55.63
100025.43.30
150013.22.18
200010.01.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.

ObjawPrawdopodobna przyczyna
MSE płaskie lub rosnące w punktach kontrolnychZbyt 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łaKlucze modality.json lub --modality-config-path nie pasują. Klucze akcji nie są mapowane.
MSE ogromne lub strata NaN podczas treninguNormalizacja akcji i stanu. Zweryfikuj meta/stats i upewnij się, że zakresy akcji są fizycznie wiarygodne.
Dobre na traj 0, słabe na epizodach wstrzymanychNiedobó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.

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
Przepis GR00T N1.7 natywny dla LeRobot. Zwróć uwagę na relative_exclude_joints: chwytak jest wykluczony z akcji względnych, co jest tą samą decyzją, którą so100_config.py podejmuje z ActionRepresentation.ABSOLUTE.
AspektIsaac-GR00T launch_finetune.pylerobot-train --policy.type=groot
Wersja zbioru danychTylko LeRobot v2, wymagana konwersjaNatywny zbiór danych LeRobot, bez obniżania wersji
Mapowanie modalnościmeta/modality.json plus konfiguracja danych w Pythoniebrak modality.json; zachowanie ustawiane przez flagi --policy.* w wierszu poleceń
Ziarnobrak flagi seed--seed, domyślne LeRobot 1000
Akcje względneActionConfig dla każdego klucza w konfiguracji danych--policy.use_relative_actions plus --policy.relative_exclude_joints
Opublikowane wyniki referencyjneTrend MSE w otwartej pętli SO-100 na danych demonstracyjnychZestawy LIBERO, średnio 96,5 procent w czterech zestawach
Ścieżka wdrożeniarun_gr00t_server.py plus eval_so100.py przez ZMQlerobot-rollout, z fragmentowaniem w czasie rzeczywistym (queue_threshold powinno pozostać na poziomie 5 lub poniżej)
Samodzielne uruchamianie dostrajania
Zalety
  • 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.
Kompromisy
  • Ś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.

  1. Nagrywaj epizody za pomocą lerobot-record na SO-100. Otrzymasz zestaw danych LeRobot v3.0.
  2. Skonwertuj go do wersji v2.1 za pomocą scripts/lerobot_conversion/convert_v3_to_v2.py w osobnym środowisku wirtualnym.
  3. Napisz meta/modality.json i konfigurację modalności w Pythonie, zarejestrowaną pod EmbodimentTag.NEW_EMBODIMENT.
  4. Wynajmij kartę 80 GB, sklonuj z podmodułami, zsynchronizuj uv, uwierzytelnij się w Hugging Face.
  5. 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.
  6. Pobierz punkt kontrolny z maszyny, zanim zniszczysz instancję, a następnie zbuduj ścieżkę serwowania do ramienia.
Krok, o którym wszyscy zapominają

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.

Matryca treningowa AY-Robots z pięcioma modelami polityki jako wierszami i czterema ramionami robotów jako kolumnami, każda komórka linkuje do konkretnego przewodnika treningowego
Matryca /train: pięć modeli kontra cztery ramiona. Wiersz GR00T N1.7 obejmuje również SO-101, Koch v1.1 i LeKiwi.

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.

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 kontroluje, ile przewidywanych kroków jest wykonywanych przed ponownym planowaniem. Musi być co najwyżej równe action_horizon polityki, a ta liczba to długość action delta_indices w konfiguracji modalności, a nie modelu bazowego. Dostarczona konfiguracja SO-100 przewiduje 16, więc 16 to Twój limit; bazowy punkt kontrolny nvidia/GR00T-N1.7-3B jest skonfigurowany na 40, a policy.md jasno mówi, że dostrojone punkty kontrolne mogą się różnić. Przekroczenie tej wartości spowoduje błąd ValueError, podając obie liczby. 8 to wartość sugerowana w dokumentacji dla wdrożeń w czasie rzeczywistym. Stara nazwa flagi --action-horizon nadal działa, ale ostrzega.
7.4 V, nie 12 V

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

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started