
Проверен водич за фино подесување на NVIDIA GR00T N1.7 на SO-100 LeRobot сет на податоци: вистински знаменца, modality.json, барањето за v2.1, колку чини едно извршување и замките.
NVIDIA испорачува пример за фино подесување токму за раката што веројатно ја поседувате. Внатре во Isaac-GR00T складиште има папка наречена demo_data/cube_to_bowl_5: пет епизоди, 4.148 кадри со 30 fps, веќе напишани како LeRobot v2.1, со соодветна конфигурација на модалитет под examples/SO100/. Неговиот meta/info.json известува robot_type: so101_follower, што во LeRobot е истата класа на конфигурација како so100_follower. Тоа е навистина корисно, бидејќи значи дека референтната патека за GR00T N1.7 на шест-степени на слобода хоби рака е одржувана од луѓето кои го напишале моделот. Тоа не е хуманоидна демо верзија намалена, тоа е истата рака.
Лошата вест е растојанието помеѓу Снимив 60 епизоди и раката ја извршува задачата. Постојат околу шест места каде што овој процес тивко пропаѓа наместо гласно, а четири од нив се наоѓаат во датотеки кои повеќето луѓе никогаш не ги отвораат: meta/modality.json, конфигурацијата на податоци на Python, meta/relative_stats.json, и сопствениот стринг за верзија на множеството податоци. Овој водич ја поминува рачната рута од почеток до крај со вистинските команди, а потоа ја покажува истата работа како формулар на AY-Robots. Сè подолу беше проверено според главната гранка на Isaac-GR00T од 20 август 2026 година (линијата n1.7-release) и lerobot 0.6.1, објавен на PyPI на 3 август 2026 година. Upstream се движи брзо, и каде што знаменцето било преименувано, овој напис го наведува тоа.
Што треба да знаете пред да започнете
- •За фино подесување на GR00T N1.7 потребни се 40 GB или повеќе VRAM. NVIDIA препорачува H100 или L40 јазли. RTX 4090 со 24 GB нема да ја заврши оваа работа, иако ќе тренира SmolVLA и ACT.
- •Множеството податоци мора да биде LeRobot v2 (v2.0 или v2.1) плус GR00T-специфичен meta/modality.json. Множество податоци LeRobot v3.0 не се вчитува и мора да се конвертира надолу.
- •Влезната точка е gr00t/experiment/launch_finetune.py, tyro CLI. Нема знаменце --seed, така што извршувањата не се репродуцибилни бит-по-бит.
- •За прилагодена рака, ознаката за отелотворување е NEW_EMBODIMENT, и таа ознака го прави --modality-config-path задолжителен.
- •Испорачаниот SO-100 рецепт ги предвидува зглобовите на раката како RELATIVE делти, а грабежот како ABSOLUTE цел. Обратното спарување е тивка грешка, а не грешка.
- •На AY-Robots истата работа е формулар: 20000 чекори, серија 32, стапка на учење 1e-4, приближно 4 до 12 УСД на нивото A100 80 GB или H100.
Што е всушност GR00T N1.7
GR00T N1.7 е визио-јазичен-акционен модел со двосистемски распоред опишан во оригиналниот труд GR00T N1: визио-јазичен модул кој ги чита камерите и инструкцијата, и дифузионен трансформатор кој тоа го претвора во дел од континуирани моторни команди. N1.7 ја замени првата половина. Eagle основата од N1.6 е отстранета, заменет со nvidia/Cosmos-Reason2-2B на Qwen3-VL архитектура, а моделот беше претрениран на приближно 20,000 часа егоцентрично човечко видео покрај податоците од роботот. Сопствениот извештај на NVIDIA ја наведува бројката од 20,854 часа и известува дека преминот од 1k на 20k часа повеќе од двојно го зголемува просечното завршување на задачите.
Втората половина исто така се промени, на начини кои се важни за вашето извршување. Акционата глава се намали од 32 дифузиони слоеви на 16, предвидениот акционен дел порасна од 16 чекори на 40, а максималната ширина на состојбата и акцијата се зголеми од 29 на 132. Овие три бројки доаѓаат од дневникот на промени во README на репозиториумот; сопствената објава за лансирање на NVIDIA сè уште го опишува Систем 1 како 32-слоен DiT, па каде што двете не се согласуваат, верувајте му на репозиториумот што ќе го клонирате. Акциите стандардно се изразуваат во релативен краен ефектор простор, делта од моменталната поза наместо апсолутни цели, што овозможува пренос на манипулативни претходни знаења научени од човечко видео во контрола на робот. Самата глава е усогласување на проток дифузионен трансформатор, од истото семејство како Pi0.5 но со различна основа пред него. Ако сè уште сте на претходната генерација, N1.7 наспроти N1.5 опфаќа дали надградбата го оправдува преправањето на вашиот работен тек.
| Својство | Вредност | Од каде потекнува |
|---|---|---|
| Параметри | 3,000,000,000 | Hugging Face model card |
| Визио-јазична основа | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | repo README |
| Акциона глава | Flow-matching diffusion transformer, 16 слоеви (N1.6 имаше 32) | repo README |
| Предвиден акционен хоризонт | 40 чекори за основниот checkpoint (N1.6 имаше 16) | getting_started/policy.md и repo README |
| Максимална ширина на состојба и акција | 132 (N1.6 имаше 29) | repo README |
| Лиценца за код | Apache 2.0 | Isaac-GR00T repository |
| Лиценца за тежини | NVIDIA Open Model License Agreement | model card |
| Латентност, H100 80 GB, PyTorch eager, 4 чекори на деноизирање, 1 камера | 85.8 ms end to end, 11.7 Hz | model card timing table |
| Ист хардвер, TensorRT целосен pipeline | 27.9 ms end to end, 35.9 Hz | model card timing table |
| Латентност што AY-Robots ја наведува за својот сервисиран GR00T N1.7 | 152 ms per action step | AY-Robots policy catalog |
Последните три реда објаснуваат поголем дел од разочарувањето што луѓето го пријавуваат. Насловните 27.9 ms се TensorRT engine на H100 со една камера и четири чекори на деноизирање. Чист PyTorch на истата картичка е 85.8 ms, а model card го става јазот на 3.08x. Ниту една бројка не вклучува слој за опслужување, втора камера или мрежен скок. 152 ms по акционен чекор што AY-Robots ги наведува за својот сервисиран GR00T N1.7 е бројката со serving во циклусот, а јавно-интернетско повратно патување е над тоа. Повеќе за ова на крајот. За бројките до другите модели, GR00T N1.7 наспроти Pi0.5 и GR00T N1.7 наспроти SmolVLA ги поставуваат еден до друг.

Што е потребно за извршувањето пред да напишете нешто
| Барање | Фино подесување | Заклучување |
|---|---|---|
| VRAM, упатство од NVIDIA | 40 GB или повеќе, препорачано H100 или L40 | 16 GB или повеќе, работи RTX 4090 |
| Python и CUDA на dGPU | 3.12 и CUDA 12.8 | 3.12 и CUDA 12.8 |
| Видео позадина | torchcodec 0.8.0, само FFmpeg 4 до 7 | исто |
| Формат на податочно множество | LeRobot v2 плус meta/modality.json | не е применливо |
| Пристап до Hugging Face | одобрен за nvidia/Cosmos-Reason2-2B | исто |
| Други алатки | git-lfs и uv | uv |
| Ниво на графички процесор AY-Robots за обучувачот groot1.7 | A100 80 GB или H100 80 GB | под обезбеден автоматски |
Секоја контролна точка на GR00T, вклучувајќи ја и основната nvidia/GR00T-N1.7-3B, го вчитува nvidia/Cosmos-Reason2-2B при првата употреба, а тој репозиториум е затворен. README-то точно го наведува неуспехот: вчитувањето на моделот не успева со GatedRepoError / 401 Client Error. Она што не го спомнува е кога тоа се случува, а тоа е откако ќе ја изнајмите картичката и ќе започне извршувањето. Побарајте пристап на страницата на моделот, потоа извршете uv run huggingface-cli login или извезете HF_TOKEN пред да изнајмите нешто.
Чекор 0: самите епизоди
Сè подолу претпоставува дека веќе имате снимени епизоди. Ако немате, тоа е вистинскиот прв чекор и тој е оној што одлучува колку добар може да биде резултатот, бидејќи учење со имитација не може да поврати информации што не се во податоците. Прво калибрирајте ги двете раце, а потоа управувајте го следбеникот со рака-водач додека lerobot-record ги запишува parquet датотеките и преносите од камерата. Ако калибрацијата е исклучена, вредностите на зглобовите во вашето множество податоци опишуваат малку поинаков робот од оној што подоцна ќе ја изврши политиката, и никаква количина на тренирање не го поправа тоа.
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 е да снимите најмалку 50 епизоди со околу 10 по локација на објектот, да ги држите камерите фиксирани и да го одржувате однесувањето на фаќање конзистентно. Додадете варијации подоцна, не на почетокот. Правилото што вреди да се запамети: ако не можевте сами да ја извршите задачата само од сликите од камерата, политиката не може ниту таа. За поставувањето специфично за раката, почеток со SO-100 и страницата на LeRobot за SO-100 ги покриваат портовите, калибрацијата и индексите на камерата. На AY-Robots можете да го направите ова и преку интернет од прелистувачот користејќи телеоперација и да снимате директно од сесијата.
Чекор 1: множеството податоци мора да биде LeRobot v2.1
Ова е најчестата пречка. Тековната CODEBASE_VERSION на главната гранка е v3.0, така што сè што ќе снимите денес со тековен сет алатки излегува како v3.0. Вчитувачот на GR00T очекува v2. Репозиториумот е експлицитен зошто: многу податочни множества од повисоко ниво како DROID, LIBERO и Bridge се објавени во v2, а матичната поддршка за двете е планирана, но не е испорачана. Значи, конверзијата е на вас, и таа работи во сопствено виртуелно опкружување од конкретна причина: scripts/lerobot_conversion носи свој pyproject кој бара Python 3.10 или 3.11 и го врзува lerobot за еден git commit, додека самиот Isaac-GR00T бара Python 3.12. Инсталирајте го конверторот од коренот на репозиториумот и ќе го добиете пакетот gr00t наместо тоа, што е грешката за која предупредува неговиот README. Ако сте нови во форматот, записот во речникот LeRobot множество податоци објаснува што всушност има во него.
# 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Ако множеството податоци v3.0 веќе постои локално, скриптата го гради распоредот v2.1 до него, а потоа ги менува: оригиналот се преместува во сестринска папка со додадена верзија, <name>_v3.0, а конвертираната копија ја зазема оригиналната патека. (Сопствениот docstring на скриптата ја нарекува таа папка _v30; кодот ја додава низата на верзија, така што она што всушност го добивате е _v3.0.) Второ изненадување: излезот секогаш завршува под <root>/<repo-id>, така што --root examples/SO100/my_dataset_lerobot ви дава examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset>, и таа подолга патека е онаа што --dataset-path ја бара подоцна. Кога задачата за обука ќе го отфрли вашето множество податоци поради причини за верзија, страницата за множество податоци отфрлено како v3 ги наведува точните симптоми.
Структурата што GR00T ја сака по конверзијата е класичниот v2 распоред: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, parquet датотеки под data/chunk-000/, MP4 датотеки под videos/chunk-000/observation.images.
Чекор 2: modality.json, шесте броеви што одлучуваат сè
Во LeRobot збир на податоци, состојбата на роботот и акцијата се зачувани како рамни float32 низи. За SO-100, и двете имаат форма [6]: пет зглобови на раката и фаќач. Демо збирот на податоци ги именува како shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, но тие имиња живеат во info.json и ништо во parquet датотеката не кажува кој индекс е кој. meta/modality.json го обезбедува тоа мапирање, и GR00T нема да тренира без него. Еве го оној што го испорачува репозиториумот за SO-100, дословно.
{
"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"
}
}
}Копирајте го во вашиот конвертиран сет на податоци на meta/modality.json и преименувајте ги видео клучевите во она како што всушност се нарекуваат вашите камери. Ако сте снимале со една надземна камера наречена top, тогаш original_key е observation.images.top а пријателското име е она на што ќе се повикува вашата конфигурација на податоци. Двете мора да се согласуваат, и ниту една од нив не ја проверува другата за вас. Анотацијата на јазикот е полоша, бидејќи истиот клуч мора да се појави на три места.
| Слој | Датотека | SO-100 форма користена во репозиториумот |
|---|---|---|
| Parquet колона | data/chunk-*/episode_*.parquet | annotation.human.task_description |
| modality.json клуч | meta/modality.json, under "annotation", without the annotation. prefix | human.task_description |
| modality_keys во конфигурацијата на податоци | your so100_config.py | annotation.human.task_description |
Сегментите по annotation. се избрани од оној што го создал сетот на податоци. Демо податоците на SO-100 користат annotation.human.task_description; LIBERO и SimplerEnv користат annotation.human.action.task_description. Двете се валидни. Ако сте копирале конфигурација од LIBERO пример и сте ја насочиле кон вашата сопствена SO-100 снимка, јазичниот канал се решава во ништо и моделот тренира на празна инструкција. Загубата сè уште опаѓа. Политиката сè уште прави нешто. Само игнорира што сте ѝ кажале да направи.
Чекор 3: конфигурацијата на податоци, релативна рака и апсолутен грипер
Конфигурацијата на модалитетот е Python датотека наместо JSON, бидејќи таа исто така одлучува како е претставена секоја акциона група. Ова е делот од работниот тек на N1.7 што не постоеше во иста форма во N1.5, и делот што вреди да се прочита двапати. Испорачаната SO-100 конфигурација ги предвидува петте зглобови на раката како РЕЛАТИВНИ делти од моменталната состојба и фаќачот како АПСОЛУТНА целна позиција, бидејќи бинарен сигнал отворено-или-затворено се однесува подобро како цел отколку како делта.
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)Два детали овде ќе ве чинат еден ден ако не ги знаете. Прво, action_configs е позиционален: документацијата бара иста должина и ист редослед како modality_keys, и тие се директни за последицата од грешка, а тоа е дека погрешната репрезентација се применува тивко. Вашиот фаќач се тренира како делта, а вашата рака како апсолутна цел, и нема порака за грешка. Второ, register_modality_config тврди дека ознаката сè уште не е регистрирана, така што втора NEW_EMBODIMENT конфигурација во истиот Python процес умира со Embodiment tag ... already registered. Не можете да увезете две од овие во една скрипта. Трето правило се применува подоцна, при распоредување: акцијата delta_indices мора да биде континуиран опсег почнувајќи од нула. Реткиот прозорец како [0, 4, 8] се отфрла, бидејќи сè низводно го индексира предвидениот дел линеарно и инаку би извршило погрешни редови.
Статистиките за нормализација, особено meta/relative_stats.json, се пресметуваат за должината на хоризонтот што сте ја имале кога сте ги генерирале. Скратете го акциониот хоризонт од 16 на 8 без регенерирање и тренирањето умира со IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16. Поправката е една команда: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. Извршете ја по секоја промена на delta_indices.
Чекор 4: околината
N1.7 го премести складиштето на и Python 3.12. Старата conda плус pip install -e . патеката сè уште постои во скриен дел од README, но предупредува дека зависностите од GPU, вклучувајќи flash-attn и TensorRT, можеби ќе бараат рачна инсталација. Користете uv освен ако немате конкретна причина да не го сторите тоа. Што се однесува до flash-attn, еден детал спречува забуна: ќе видите Installing flash-attn отпечатено при секое uv run. Не се преизградува. uv повторно го потврдува URL-закачениот wheel кој е веќе кеширан, и тоа трае две или три секунди.
- 1Инсталирајте git-lfs, потоа клонирајте со подмодули
git-lfs е задолжителен, не е опционален. Без него, parquet датотеките во demo_data/ се преземаат како покажувачки стабови, а демо извршувањето пропаѓа на податочно множество кое изгледа присутно во листата на датотеки.
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2Инсталирајте uv и синхронизирајте ја околината
Стандардната инсталација ги повлекува зависностите од GPU, вклучувајќи flash-attn и TensorRT. На свежа слика A100 или H100, ова е најдолгиот чекор, затоа направете го пред да обрнете внимание на што било друго.
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')" - 3Автентицирајте се со Hugging Face
Направете го ова пред првото стартување на тренирањето, а не откако ќе пропадне по осум минути.
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4Проверка на интегритетот на испорачаните SO-100 демо податоци
Пред да ја допрете вашата сопствена снимка, извршете 2000 чекори на demo_data/cube_to_bowl_5. Тоа се пет епизоди, завршува брзо и ја докажува околината, а не вашите податоци. Ако ова извршување пропадне, ништо што ќе направите со вашето податочно множество нема да помогне.
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 поддржува само FFmpeg 4 до 7, а Ubuntu 25.10 и поновите верзии испорачуваат верзија 8. Грешката е Could not load libtorchcodec, што изгледа како неисправна инсталација, а не конфликт на верзии. Инсталирајте постара верзија, на пример conda install -c conda-forge 'ffmpeg<8', и ставете ги нејзините библиотеки на LD_LIBRARY_PATH. CUDA_HOME е непоставена. Финото подесување целосно пропаѓа. Извршете bash scripts/deployment/dgpu/install_deps.sh еднаш, или само export CUDA_HOME=/usr/local/cuda.
Чекор 5: командата за фино подесување и кои се нејзините стандардни вредности на знаменцата
Заменете го демо податочното множество со вашето и додадете ги опциите што навистина ги сакате. Подолу е целосната форма што ја користи репозиториумот во својот туторијал за ново отелотворување, вклучувајќи ги знаменцата за аугментација и контролни точки што краткиот пример од README ги изоставува. Ова е во потесна смисла: јазичната основа и визуелниот енкодер остануваат замрзнати, а она што се тренира е проекторот и главата за дифузно дејство.
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| Знаменце | Стандардно во FinetuneConfig | Што прави |
|---|---|---|
| --global-batch-size | 64 | Вкупна серија низ сите графички процесори пред акумулација на градиенти. Испорачаните примери користат 32. |
| --learning-rate | 1e-4 | Истата вредност што AY-Robots ја испраќа за својот groot1.7 тренер. |
| --max-steps | 10000 | Вкупни чекори на оптимизаторот. Обвивката examples/finetune.sh исто така стандардно поставува 10000. |
| --gradient-accumulation-steps | 1 | Ја множи ефективната серија. Вредностите над 1 издаваат предупредување кое ја покажува акумулираната големина. |
| --save-steps and --save-total-limit | 1000 and 5 | Фреквенција на контролни точки и колку се чуваат. Постарите се бришат. |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | Експлицитно поставено и од examples/finetune.sh. |
| --state-dropout-prob | 0.2 in the CLI, 0.8 in the model config | Случајно ја испушта проприоцептивната состојба за време на тренирањето. Намалете ја ако вашата задача зависи од состојбата. |
| --tune-llm and --tune-visual | False and False | Основата останува замрзната стандардно. |
| --tune-projector and --tune-diffusion-model | True and True | Проекторот и главата за дифузно дејство се она што всушност се тренира. |
| --use-percentiles | True | Нормализирајте со q01 и q99 наместо со сурови мин и макс. |
| --dataloader-num-workers | 2 | Вчитувачот е базиран на процесор по дизајн. Примерите го зголемуваат ова на 4. |
| --seed | does not exist | Нема знаменце за seed на оваа командна линија. |
Тој последен ред не е печатна грешка. launch_finetune.py е tyro CLI генериран од dataclass, и тој dataclass нема поле за seed. README одделно забележува 5 до 6 проценти варијанса помеѓу извршувањата предизвикана од недетерминистичка аугментација на слики. Две извршувања со идентични знаменца нема да произведат идентични контролни точки, што е многу важно кога се обидувате да одлучите дали промената на хиперпараметарот помогнала или сте имале среќа. За споредба, сопствениот тренер на lerobot стандардно користи seed 1000, а рецептот LeRobot GR00T експлицитно го предава --seed=42 .
Фино подесување се извршува со eval_strategy="no", така што воопшто нема крива на загуба при валидација. Добивате загуба при тренирање и ништо друго. Водичот за ново отелотворување ви кажува да го вклучите со --eval-strategy steps --eval-steps 500, но тоа знаменце не постои на launch_finetune.py: CLI е генериран од tyro од FinetuneConfig dataclass, а eval_strategy, eval_steps и eval_batch_size се полиња на TrainingConfig наместо тоа. Нивните стандардни вредности таму се "no", 500 и 2. За да ги достигнете, користете ја поцелосната влезна точка gr00t/experiment/launch_train.py, каде што вгнезденото знаменце е --training.eval-strategy. Во секој случај, опаѓачката загуба при тренирање сама по себе ви кажува многу малку за генерализацијата, што е токму ситуацијата опишана на загубата паѓа, но политиката не прави ништо.
Колку чини извршување од 20000 чекори
GR00T N1.7 бара картичка од 80 GB, така што прашањето за цената има тесен одговор. На AY-Robots, тренерот groot1.7 работи на нивото A100 80 GB или H100 80 GB, каде што едно извршување трае 3 до 6 часа по цена од 1.20 до 2.00 USD на час на спот пазарот. Тоа е приближно 4 до 12 USD за стандардната работа од 20000 чекори. Истата задача на SmolVLA или ACT се извршува на картичка од 24 GB по цена од 0.30 до 0.60 USD на час и 1 до 3 USD по извршување. Тоа е вистинскиот компромис: GR00T чини околу четири пати повеќе по обид, и не можете да го извршите на 4090 под вашето биро.
| Модел | Ниво на ГПУ | Типично траење | Типична цена | Минимум епизоди |
|---|---|---|---|---|
| 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 |
Минимумот од 50 епизоди е долна граница, а не цел. ЧПП на NVIDIA е позахтевно: приближно 100 траектории за едноставно подигање и поставување на фиксна локација, 500 или повеќе за сложени или повеќечекорни сцени, и 100 до 500 за фина манипулација. Ако имате 20 епизоди, посветете го попладнето на снимање наместо вечерта на подесување. Водичот за собирање податоци опфаќа што ја одвојува корисната епизода од залудната, снимањето на вашето прво множество податоци е кратката верзија, а собирањето податоци за SO-100 е специфичната за раката.

Чекор 6: евалуација со отворена јамка пред да ја допрете раката
Не ставајте нов контролна точка на физичка рака за да дознаете дали обуката функционирала. Прво извршете ја евалуацијата со отворена јамка. Таа репродуцира снимена епизода, бара од моделот дејства на секој чекор и исцртува предвидување наспроти вистинската вредност со MSE и MAE. Не чини ништо и ги фаќа грешките во мапирањето од чекорите 2 и 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 gripperРепозиториумот намерно одбива да објави целен MSE за сопствени податоци, и тоа е правилна одлука: бројката зависи од вашите акциони единици, вашата задача и големината на вашиот сет на податоци, така што праг копиран од туѓа рака не значи ништо. Она што е значајно е трендот. Еве го референтното извршување што репозиториумот го документира на еден H100 со демо сетот на податоци од пет епизоди и 2000 чекори.
| Контролна точка | Просечен MSE на traj 0 | Просечен MAE на traj 0 |
|---|---|---|
| 500 | 87.5 | 5.63 |
| 1000 | 25.4 | 3.30 |
| 1500 | 13.2 | 2.18 |
| 2000 | 10.0 | 1.76 |
Обликот е сигналот, а не апсолутните вредности. Грешката треба постојано да опаѓа како што се акумулираат. Просечно пресметано за сите пет епизоди на тренирање, наместо само за траекторија 0, конечната контролна точка на репозиториумот постигна приближно 7.5 MSE и 1.5 MAE, така што дури и референтниот резултат се чита различно во зависност од тоа кои епизоди ги просекувате. Запишете ја вашата сопствена основна линија на непроменетата демо команда пред да промените нешто во вашите податоци: ако не можете да репродуцирате познато-добра изведба, не можете да разликувате грешка во поставувањето од проблем со податоците. Репозиториумот исто така ги мапира вообичаените симптоми до причините, и секоја од нив е оперативна, а не грешка во моделот.
| Симптом | Веројатна причина |
|---|---|
| MSE е рамно или расте низ контролните точки | Стапката на учење е премногу ниска, или податоците воопшто не се вчитуваат. Проверете --dataset-path и работниците на вчитувачот на податоци. |
| Кривата на предвидување е рамна или константна | Клучевите на modality.json или --modality-config-path не се совпаѓаат. Клучевите за акција не се мапирани. |
| MSE е огромен, или NaN загуба за време на тренирањето | Нормализација на акцијата и состојбата. Проверете meta/stats и дека опсезите на акција се физички веродостојни. |
| Добро на traj 0, лошо на задржани епизоди | Недостаток на податоци, а не грешка. Пет демо епизоди не можат да генерализираат. |
Другиот пат: lerobot-train наместо Isaac-GR00T
Тековното издание на LeRobot, 0.6.1 на PyPI од 3 август 2026 година, нуди втор и сосема поинаков начин за фино подесување на истите основни тежини. LeRobot го изложува GR00T N1.7 како тип на политика и го тренира преку сопствената lerobot-train влезна точка. Овде се важни две работи. LeRobot CLI е збир на конзолни скрипти, така што сè што читате што вели python lerobot/scripts/train.py е застарено и нема да работи. И LeRobot целосно ја отстрани поддршката за GR00T N1.5, отфрлајќи ги N1.5 контролните точки и конфигурации со белешка за миграција, па ако ви треба N1.5 преку LeRobot, мора да го закачите lerobot==0.5.1, последното издание што го поддржува, објавено на 7 април 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| Аспект | Isaac-GR00T launch_finetune.py | lerobot-train --policy.type=groot |
|---|---|---|
| Верзија на податочно множество | Само LeRobot v2, потребна е конверзија | Изворно LeRobot податочно множество, без намалување на верзијата |
| Мапирање на модалитети | meta/modality.json плус Python конфигурација на податоци | без modality.json; однесувањето е поставено со --policy.* знаменца во командната линија |
| Сид | воопшто нема знаменце за сид | --seed, LeRobot default 1000 |
| Релативни дејства | ActionConfig по клуч во конфигурацијата на податоци | --policy.use_relative_actions plus --policy.relative_exclude_joints |
| Објавени референтни резултати | SO-100 тренд на MSE со отворена јамка на демо податоци | LIBERO пакети, 96.5 проценти просек низ четири пакети |
| Патека за распоредување | run_gr00t_server.py plus eval_so100.py over ZMQ | lerobot-rollout, со парчиња во реално време (queue_threshold треба да остане на или под 5) |
- Секое знаменце е видливо и променливо. Можете да го одмрзнете визуелниот енкодер, да го преместите state_dropout_prob, или да го скратите акциониот хоризонт.
- Графиконите со отворена јамка се локални датотеки. Споредувањето на checkpoint-5000 со checkpoint-20000 е командна линија.
- Не зависите од тоа дали некоја платформа ќе остане онлајн, а контролната точка се наоѓа на вашиот диск во стандарден формат.
- Примерите за бенчмарк на репозиториумот за LIBERO, SimplerEnv и DROID ви даваат познати добри извршувања за репродукција пред да им верувате на вашите сопствени податоци.
- Околината е најголемиот дел од работата. FFmpeg верзија, CUDA_HOME, git-lfs, затворената основа, torchcodec: ниту еден од овие не се проблеми со моделот и секој од нив го запира извршувањето.
- Конверзијата од v3.0 во v2.1 бара посебна виртуелна околина со сопствен чекор за инсталација, и го презапишува вашиот директориум со податочното множество на место.
- Изнајмувањето на графички процесор започнува со наплата кога ќе започнете со дебагирање, а не кога ќе започне обуката, и ништо не ја запира инстанцата кога ќе заврши извршувањето.
- Без сид значи без репродуктивност бит-за-бит, покрај 5 до 6 проценти варијанса од извршување до извршување само од аугментација.
Два начини да се добие истата контролна точка
Изнајмувате графичка картичка (GPU) и го контролирате секој чекор. Реално, првиот пат ќе ви одземе едно попладне, а потоа по дваесет минути секој нареден пат.
- Снимајте епизоди со lerobot-record на SO-100. Добивате LeRobot v3.0 податочно множество.
- Конвертирајте го во v2.1 со scripts/lerobot_conversion/convert_v3_to_v2.py во сопствено виртуелно опкружување (virtualenv).
- Напишете meta/modality.json и Python конфигурација за модалитет, регистрирана под EmbodimentTag.NEW_EMBODIMENT.
- Изнајмете картичка од 80 GB, клонирајте со подмодули (submodules), uv sync, автентицирајте се со Hugging Face.
- Стартувајте launch_finetune.py, потоа open_loop_eval.py на неколку контролни точки (checkpoints) и споредете го трендот на MSE пред да го допрете хардверот.
- Префрлете ја контролната точка од машината пред да ја уништите инстанцата, потоа изградете ја патеката за сервирање до раката.
Копирајте ја контролната точка од изнајмената инстанца пред да ја исклучите. --save-total-limit 5 исто така значи дека постарите контролни точки се бришат како што напредува тренирањето, така што контролната точка што ја сакавте на чекор 5000 можеби повеќе нема да постои на чекор 20000.
Истата работа како формулар. Вие го избирате моделот и податочното множество, позадината изнајмува графичка картичка (GPU) на спот пазарот според потребната VRAM, го извршува тренерот и ги запишува контролните точки во складиштето за објекти. Водичот за GR00T N1.7 на SO-100 е токму оваа комбинација; матрицата за тренирање ги содржи сите други парови модели и раце, вклучувајќи го и GR00T N1.7 на SO-101.
| Што испраќа тренерот groot1.7 | Вредност |
|---|---|
| Големина на серија (Batch size) | 32 |
| Стапка на учење (Learning rate) | 1e-4 |
| Максимални чекори | 20000 |
| Акумулација на градиент | 1, and it does take effect for this trainer |
| Дополнителна опција изложена во формата | saveSteps |
| Основна контролна точка | nvidia/GR00T-N1.7-3B |
| Прифатен формат на податочно множество | LeRobot v2.0 or v2.1 |
Податочното множество може да дојде од Hugging Face repo id, од вашата машина или од сесија што сте ја снимиле со десктоп клиентот. Заклучувањето (Inference) е посебен чекор: платформата обезбедува под (pod) што ја служи политиката, а вашиот локален роботски клиент комуницира со таа крајна точка. Подовите имаат надзорник за неактивност (idle watchdog) и се уништуваат по период на неактивност, така што заборавена картичка во прелистувачот нема да ви наплатува преку ноќ. Ако не сакате да кликате, истите операции постојат на CLI и MCP серверот.
GR00T N1.7 и Pi0.5 се достапни само во облак овде; само SmolVLA и ACT работат и локално. Барањето за v2.1 исто така не исчезнува, бидејќи податочното множество v3.0 сè уште мора да се конвертира пред GR00T вчитувачот да го прифати. И ништо не ги пишува вашите modality.json семантики за вас: ако вашите клучеви за камера или вашиот јазичен клуч се погрешни, тие се погрешни на двете рути. Погледнете ги документите за тренирање за тоа што позадината прави и не прави во ваше име.

Враќање на контролната точка на раката
Isaac-GR00T користи поделба сервер-клиент преку ZMQ. Политиката работи на графичката картичка (GPU), а тенок клиент на роботската машина испраќа набљудувања и прима делови од акции. Примерот SO-100 е доволно комплетен за копирање: стартувајте run_gr00t_server.py со вашата контролна точка и --embodiment-tag NEW_EMBODIMENT, потоа извршете eval_so100.py на страната на роботот со серискиот порт, ID на роботот, индексите на камерата и јазичната инструкција. Имињата на камерите во таа команда мора да се совпаѓаат со пријателските имиња од вашиот modality.json, а не со броевите на уредите на оперативниот систем.
# 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"Додека ја поврзувате раката назад: SO-100 работи со Feetech STS3215 автобуски серво мотори на 7.4 V шина. Напојувањето со 12 V ги уништува, и тоа е лесна грешка ако поседувате и LeKiwi, чија основа работи на 12 V додека нејзината рака не. Проверете го напојувањето пред првото вклучување, а не по чадот. Видете ја страницата за хардвер на SO-100 и SO-100 наспроти LeKiwi. Ако раката се вклучи, но ништо не се движи, серво не реагира е местото за почеток.
Сега искрениот дел за тоа каде работи политиката, бидејќи обуката и сервирањето имаат различни хардверски приказни. Финото подесување бара 40 GB или повеќе. Заклучувањето не: README го става на 16 GB или повеќе и експлицитно ја именува RTX 4090, така што картичка што веќе ја поседувате може да служи контролен пункт што никогаш не можела да го произведе. Она што одлучува дали политиката се чувствува одговорна не е VRAM, туку каде се наоѓа серверот. На AY-Robots GR00T N1.7 е само во облак, така што контролната јамка плаќа повратно патување преку јавен интернет покрај 152 ms по чекор на акција, и само SmolVLA и ACT исто така работат локално. За бавно земање и поставување, далечинскиот под е преживлив. За сè што е реактивно не е: политиката станува колеблива на начин што изгледа токму како неуспех во обуката, а не е. ACT со 20 ms по чекор на акција е моделот што ја толерира најтесната јамка, SmolVLA е на 245 ms, и никаква количина на подесување на латентност не може да го врати повратното патување што веќе е потрошено. Стартувајте ја вашата прва политика поминува низ страната за сервирање од почеток до крај.
Што всушност тргнува наопаку
- GatedRepoError при првото извршување. Не ви е одобрен пристап до nvidia/Cosmos-Reason2-2B, или не сте се автентицирале. Ова се случува откако часовникот на графичката картичка веќе е стартуван.
- Податочното множество е одбиено при вчитување. Речиси секогаш е податочно множество v3.0. Конвертирајте го во пониска верзија. Видете податочно множество одбиено како v3.
- IndexError за неусогласени булеви димензии. Ги променивте delta_indices и не ги регенериравте статистиките.
- Нема доволно меморија при серија 32. Намалете --global-batch-size и зголемете --gradient-accumulation-steps, или намалете --num-shards-per-epoch, што конфигурацијата експлицитно го сугерира кога VRAM е ограничена. Видете нема доволно меморија за време на тренирање.
- Загубата паѓа, политиката не прави ништо. По дифолт нема поделба за валидација, така што чистата крива на тренирање докажува многу малку. Оваа страница ја покрива дијагнозата.
- Работи во вашата поставка и никаде на друго место. Очекувано со мало податочно множество снимено под еден светлосен услов. NVIDIA препорачува аугментација со треперење на боите плус 20 до 50 епизоди под различно осветлување. Повеќе тука.
- Грајферот никогаш не се затвора правилно. Проверете дали дејството на грајферот е ABSOLUTE, а зглобовите на раката RELATIVE, по тој редослед во action_configs. Грајферот не се затвора ги наведува другите причини.
- Камерата тивко се исклучува среде снимање. Епизодата сè уште се зачувува и видео клучот сè уште постои, поради што ова е незгодно. Камерата не е детектирана го покрива ова.
Целиот индекс на режими на откажување се наоѓа на . Ако избирате помеѓу модели наместо да дебагирате еден, и имаат референтни бројки со приложени извори, и е споредбата што повеќето луѓе всушност ја требаат, бидејќи тоа е изборот помеѓу модел што можете да го тренирате на картичката под вашето биро и модел за кој треба да изнајмите јазол од 80 GB за фино подесување. За позадина зошто овие модели се однесуваат така како што се однесуваат, и вреди да се прочитаат прво. И ако сè уште немате рака, пренесува физички SO-100 без регистрација.
Колку епизоди ми се потребни пред да вреди фино подесувањето на GR00T N1.7?▾
AY-Robots поставува минимум од 50 епизоди за тренерот groot1.7. Сопствените ЧПП на NVIDIA се позахтевни: приближно 100 траектории за едноставно земање и поставување на фиксна локација, 500 или повеќе за сложени или повеќечекорни сцени, и 100 до 500 за фина манипулација. Под 50 епизоди речиси секогаш е подобро да снимите повеќе податоци отколку да ги подесувате хиперпараметрите. Ако успехот стагнира потоа, NVIDIA препорачува HG-DAgger: извршете ја политиката, интервенирајте кога ќе пропадне и додадете ги тие корекции во податочното множество.
Зошто моето податочно множество не се вчитува, и како да знам која верзија е?▾
Отворете meta/info.json и прочитајте codebase_version. Тековната CODEBASE_VERSION на LeRobot на main е v3.0, така што сè што е снимено со неодамнешен синџир на алатки е v3.0, а вчитувачот на GR00T очекува v2. Конвертирајте со scripts/lerobot_conversion/convert_v3_to_v2.py од Isaac-GR00T репозиториумот, кој запишува codebase_version: v2.1 во конвертираното податочно множество. Скриптата работи во сопствено виртуелно опкружување бидејќи ѝ е потребна различна верзија на lerobot од онаа што ја користи GR00T.
Може ли да го фино подесам GR00T N1.7 на RTX 4090?▾
Не. NVIDIA препорачува 40 GB или повеќе VRAM за фино подесување и ги наведува јазлите H100 или L40; другите картички работат, но траат многу подолго. 4090 има 24 GB. AY-Robots го нуди GR00T N1.7 само на нивото A100 80 GB и H100 80 GB од истата причина. Инференцата е друга приказна: 16 GB е доволно за да се опслужи моделот, така што 4090 може да изврши политика што не може да ја тренира. Ако сакате VLA што можете да го тренирате на 24 GB, тоа е SmolVLA со околу 450 M параметри или ACT со околу 80 M.
Зошто две извршувања со идентични знаменца даваат различни контролни точки?▾
Бидејќи launch_finetune.py нема seed. Тоа е tyro CLI генериран од dataclass што не содржи поле seed, така што ништо не го фиксира RNG. Репозиториумот одделно забележува 5 до 6 проценти варијанса помеѓу извршувањата предизвикана од недетерминистичка аугментација на слики. Ако репродуктивноста е важна, користете го патот на LeRobot наместо тоа: lerobot-train прифаќа --seed, а објавената GR00T рецепта предава --seed=42.
Дали треба да користам Isaac-GR00T или lerobot-train?▾
Користете Isaac-GR00T ако сакате референтна имплементација, контрола по клуч над претставувањето на дејствата, TensorRT извоз, или референтни примери за репродукција пред да им верувате на вашите податоци. Користете lerobot-train ако вашето податочно множество е веќе LeRobot v3.0 и не сакате да го конвертирате, ако сакате seed, или ако остатокот од вашиот стек е веќе LeRobot. И двете фино подесуваат исти nvidia/GR00T-N1.7-3B тежини. Забележете дека LeRobot целосно ја отфрли поддршката за GR00T N1.5: N1.5 контролните точки се одбиваат со белешка за миграција, и мора да го фиксирате lerobot==0.5.1 за да продолжите да ги користите.
Дали навистина ми треба камера за зглоб покрај предна камера?▾
Испорачаната SO-100 конфигурација ги користи двете, а modality.json ги мапира предната и зглобната камера како посебни видео клучеви. Можете да тренирате со една камера, а табелата за латенција на картичката на моделот е измерена со една камера, но погледот од зглобот е она што ѝ дава на политиката корисни информации за грајферот во моментот на контакт. Ако грајферот се затвори во погрешно време во вашите извршувања, исчезната или лошо насочена камера за зглоб е една од првите работи што треба да се проверат.
Фино подесете го GR00T N1.7 на вашиот SO-100 без претходно да ја изградите околината
Изберете модел, податочно множество и хиперпараметри во форма. Бекендот изнајмува A100 80 GB или H100 на спот пазарот, го извршува тренерот со серија 32, стапка на учење 1e-4 и 20000 чекори, и ги запишува контролните точки во објектно складирање. Приближно 4 до 12 USD по извршување.
Отворете го водичот за тренирање на 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