
یک راهنمای عملی و آزمایششده برای تنظیم دقیق NVIDIA GR00T N1.7 روی یک مجموعه داده LeRobot SO-100: پرچمهای واقعی، modality.json، نیاز به v2.1، هزینه یک اجرا، و چالشها.
NVIDIA یک مثال تنظیم دقیق (fine-tuning) را دقیقاً برای بازویی که احتمالاً شما دارید، ارائه میدهد. داخل مخزن Isaac-GR00T پوشهای به نام demo_data/cube_to_bowl_5: پنج اپیزود، ۴,۱۴۸ فریم با سرعت ۳۰ فریم بر ثانیه، که قبلاً به فرمت LeRobot v2.1 نوشته شدهاند، با یک پیکربندی مدالیته (modality config) منطبق در زیر examples/SO100/ قرار دارد. فایل meta/info.json آن گزارش میدهد robot_type: so101_follower، که در LeRobot همان کلاس پیکربندی است که so100_follower. این واقعاً مفید است، زیرا به این معنی است که مسیر مرجع برای GR00T N1.7 روی یک بازوی سرگرمی شش-درجه آزادی توسط افرادی که مدل را نوشتند، نگهداری میشود. این یک دمو انسانی کوچکشده نیست، بلکه همان بازو است.
خبر بد این است که فاصله بین I recorded 60 episodes و the arm does the task. حدود شش نقطه وجود دارد که این پایپلاین به جای اینکه با صدای بلند شکست بخورد، بیصدا از کار میافتد، و چهار مورد از آنها در فایلهایی قرار دارند که اکثر مردم هرگز باز نمیکنند: meta/modality.json، پیکربندی داده پایتون، meta/relative_stats.json، و رشته نسخه خود مجموعه داده. این راهنما مسیر دستی را از ابتدا تا انتها با دستورات واقعی طی میکند، سپس همین کار را به صورت یک فرم در AY-Robots نشان میدهد. تمام موارد زیر در تاریخ ۲۰ آگوست ۲۰۲۶ (خط انتشار n1.7) با شاخه اصلی Isaac-GR00T و lerobot 0.6.1 که در ۳ آگوست ۲۰۲۶ در PyPI منتشر شد، بررسی شده است. توسعهدهندگان به سرعت پیش میروند، و در صورتی که نام یک پرچم (flag) تغییر کرده باشد، این مقاله به آن اشاره میکند.
آنچه قبل از شروع باید بدانید
- •تنظیم دقیق GR00T N1.7 به ۴۰ گیگابایت یا بیشتر VRAM نیاز دارد. NVIDIA گرههای H100 یا L40 را توصیه میکند. یک RTX 4090 با ۲۴ گیگابایت این کار را انجام نخواهد داد، اگرچه SmolVLA و ACT را آموزش میدهد.
- •مجموعه داده باید LeRobot v2 (v2.0 یا v2.1) به علاوه یک فایل meta/modality.json مخصوص GR00T باشد. یک مجموعه داده LeRobot v3.0 بارگذاری نمیشود و باید به نسخه پایینتر تبدیل شود.
- •نقطه ورودی gr00t/experiment/launch_finetune.py است، یک CLI از نوع tyro. این ابزار پرچم --seed ندارد، بنابراین اجراها به صورت بیت به بیت قابل بازتولید نیستند.
- •برای یک بازوی سفارشی، تگ embodiment برابر با NEW_EMBODIMENT است، و این تگ --modality-config-path را اجباری میکند.
- •دستورالعمل SO-100 ارائه شده، مفاصل بازو را به عنوان دلتاهای RELATIVE و گریپر را به عنوان یک هدف ABSOLUTE پیشبینی میکند. برعکس کردن این جفتسازی یک شکست بیصدا است، نه یک خطا.
- •در AY-Robots همین کار به صورت یک فرم است: ۲۰۰۰۰ گام، بچ ۳۲، نرخ یادگیری 1e-4، تقریباً ۴ تا ۱۲ دلار در رده 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 را به عنوان یک DiT 32 لایه توصیف میکند، بنابراین در جایی که این دو با هم اختلاف دارند، به مخزنی که قصد کلون کردن آن را دارید اعتماد کنید. اعمال به طور پیشفرض در یک فضای نسبی اند-افکتور بیان میشوند، یعنی دلتاها از وضعیت فعلی به جای اهداف مطلق، که همین امر باعث میشود اولویتهای دستکاری آموخته شده از ویدیوی انسانی به کنترل ربات منتقل شوند. خود سر یک تطبیق جریان ترانسفورمر انتشار است، همان خانواده Pi0.5 اما با یک ستون فقرات متفاوت در جلوی آن. اگر هنوز از نسل قبلی استفاده میکنید، N1.7 در برابر N1.5 بررسی میکند که آیا ارتقاء، بازسازی پایپلاین شما را توجیه میکند یا خیر.
| ویژگی | مقدار | منبع |
|---|---|---|
| پارامترها | 3,000,000,000 | کارت مدل Hugging Face |
| ستون فقرات بینایی-زبان | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | repo README |
| سر عمل | ترانسفورمر انتشار تطبیق جریان، 16 لایه (N1.6 دارای 32 لایه بود) | repo README |
| افق عمل پیشبینی شده | 40 steps for the base checkpoint (N1.6 had 16) | getting_started/policy.md و repo README |
| حداکثر عرض حالت و عمل | 132 (N1.6 دارای 29 بود) | repo README |
| مجوز کد | Apache 2.0 | مخزن Isaac-GR00T |
| مجوز وزنها | NVIDIA Open Model License Agreement | کارت مدل |
| تأخیر، H100 80 GB، PyTorch eager، 4 denoising steps، 1 دوربین | 85.8 ms end to end, 11.7 Hz | جدول زمانبندی کارت مدل |
| همان سختافزار، پایپلاین کامل TensorRT | 27.9 ms end to end, 35.9 Hz | جدول زمانبندی کارت مدل |
| تأخیر AY-Robots برای GR00T N1.7 سرو شده خود | 152 ms per action step | کاتالوگ سیاست AY-Robots |
آن سه ردیف آخر بیشتر ناامیدیهایی را که مردم گزارش میدهند توضیح میدهند. عنوان 27.9 میلیثانیه مربوط به یک موتور TensorRT بر روی H100 با یک دوربین و چهار گام حذف نویز است. PyTorch ساده بر روی همان کارت 85.8 میلیثانیه است، و کارت مدل این شکاف را 3.08 برابر نشان میدهد. هیچ یک از این اعداد شامل لایه سرویسدهی، دوربین دوم یا پرش شبکه نمیشود. 152 میلیثانیه در هر گام عمل که AY-Robots برای GR00T N1.7 سرو شده خود اعلام میکند، رقمی است که با سرویسدهی در حلقه محاسبه شده است، و یک رفت و برگشت اینترنتی عمومی نیز بر روی آن قرار میگیرد. جزئیات بیشتر در این مورد در انتها آمده است. برای اعداد مربوط به مدلهای دیگر، GR00T N1.7 در برابر Pi0.5 و GR00T N1.7 در برابر SmolVLA آنها را در کنار هم قرار میدهند.

آنچه اجرا قبل از هرگونه تایپ نیاز دارد
| نیاز | تنظیم دقیق | استنتاج |
|---|---|---|
| VRAM، راهنمایی NVIDIA | 40 گیگابایت یا بیشتر، H100 یا L40 توصیه میشود | 16 گیگابایت یا بیشتر، RTX 4090 کار میکند |
| پایتون و 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 |
| رده GPU 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 را قبل از اجاره هر چیزی صادر کنید.
گام ۰: خود اپیزودها
تمام موارد زیر فرض میکنند که شما قبلاً اپیزودهایی را ضبط کردهاید. اگر این کار را نکردهاید، این اولین گام واقعی است و گامی است که تعیین میکند نتیجه چقدر میتواند خوب باشد، زیرا یادگیری تقلیدی نمیتواند اطلاعاتی را که در دادهها نیستند بازیابی کند. ابتدا هر دو بازو را کالیبره کنید، سپس بازوی دنبالکننده را با یک بازوی رهبر در حالی که lerobot-record فایلهای پارکت و جریانهای دوربین را مینویسد. اگر کالیبراسیون نادرست باشد، مقادیر مفصلی در مجموعه داده شما رباتی کمی متفاوت از رباتی که بعداً سیاست را اجرا خواهد کرد، توصیف میکنند و هیچ مقدار آموزشی این مشکل را برطرف نمیکند.
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 این است که حداقل ۵۰ اپیزود با حدود ۱۰ اپیزود برای هر مکان شیء ضبط کنید، دوربینها را ثابت نگه دارید و رفتار گرفتن را ثابت نگه دارید. تغییرات را بعداً اضافه کنید، نه در ابتدا. قانون کلی که ارزش به خاطر سپردن دارد: اگر خودتان نمیتوانستید کار را تنها از تصاویر دوربین انجام دهید، سیاست نیز نمیتواند. برای تنظیمات خاص بازو، شروع کار با SO-100 و صفحه LeRobot برای SO-100 پورتها، کالیبراسیون و شاخصهای دوربین را پوشش میدهند. در AY-Robots میتوانید این کار را از طریق اینترنت و از مرورگر با استفاده از تلهاپریشن انجام دهید و مستقیماً از جلسه ضبط کنید.
گام ۱: مجموعه داده باید LeRobot v2.1 باشد
این رایجترین مانع است. نسخه فعلی LeRobot CODEBASE_VERSION در شاخه اصلی v3.0 است، بنابراین هر چیزی که امروز با ابزار فعلی ضبط کنید، به صورت v3.0 خواهد بود. لودر GR00T انتظار v2 را دارد. مخزن به وضوح دلیل آن را بیان میکند: بسیاری از مجموعهدادههای بالادستی مانند DROID، LIBERO و Bridge در v2 منتشر شدهاند و پشتیبانی بومی از هر دو برنامهریزی شده اما هنوز ارائه نشده است. بنابراین تبدیل بر عهده شماست و به یک دلیل مشخص در محیط مجازی خود اجرا میشود: scripts/lerobot_conversion دارای pyproject مخصوص به خود است که به Python 3.10 یا 3.11 نیاز دارد و lerobot را به یک کامیت گیت خاص محدود میکند، در حالی که 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، منتقل میشود و کپی تبدیل شده مسیر اصلی را میگیرد. (داکاسترینگ خود اسکریپت آن پوشه را _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.
گام ۲: 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 در پیکربندی داده | 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 خود ارجاع دهید، کانال زبان به هیچ چیز حل نمیشود و مدل بر روی یک دستورالعمل خالی آموزش میبیند. افت (Loss) همچنان کاهش مییابد. سیاست (Policy) همچنان کاری انجام میدهد. فقط آنچه را که به آن گفتهاید نادیده میگیرد.
گام 3: پیکربندی داده، بازوی نسبی و گریپر مطلق
پیکربندی مدالیته به جای JSON یک فایل پایتون است، زیرا نحوه نمایش هر گروه عملیاتی را نیز تعیین میکند. این بخشی از گردش کار N1.7 است که در N1.5 به همین شکل وجود نداشت و بخشی است که ارزش دو بار خواندن را دارد. پیکربندی SO-100 ارائه شده، پنج مفصل بازو را به صورت دلتاهای RELATIVE از حالت فعلی و گریپر را به عنوان یک موقعیت هدف ABSOLUTE پیشبینی میکند، زیرا یک سیگنال باینری باز یا بسته به عنوان هدف بهتر از دلتا عمل میکند.
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 دوم در همان فرآیند پایتون با خطای 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 اجرا کنید.
گام ۴: محیط
N1.7 مخزن را به و پایتون 3.12 منتقل کرد. مسیر قدیمی کاندای به همراه pip install -e . هنوز در بخش جمعشده README وجود دارد، اما هشدار میدهد که وابستگیهای GPU از جمله flash-attn و TensorRT ممکن است نیاز به نصب دستی داشته باشند. از uv استفاده کنید مگر اینکه دلیل خاصی برای عدم استفاده از آن داشته باشید. در مورد flash-attn، یک جزئیات از سردرگمی جلوگیری میکند: شما خواهید دید Installing flash-attn در هر بار اجرای uv run چاپ میشود. این به معنای بازسازی نیست. uv در حال اعتبارسنجی مجدد یک wheel پینشده به URL است که قبلاً کش شده است و این کار دو یا سه ثانیه طول میکشد.
- 1git-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 - 2uv را نصب و محیط را همگامسازی کنید
نصب پیشفرض، وابستگیهای 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 ارائه شده
قبل از دست زدن به ضبط خودتان، ۲۰۰۰ گام را روی 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 پشتیبانی میکند و اوبونتو 25.10 و نسخههای بعدی، نسخه 8 را ارائه میدهند. خطا Could not load libtorchcodec است که بیشتر شبیه یک نصب خراب به نظر میرسد تا تضاد نسخه. یک زمان اجرای قدیمیتر را نصب کنید، برای مثال conda install -c conda-forge 'ffmpeg<8'، و کتابخانههای آن را در LD_LIBRARY_PATH قرار دهید. CUDA_HOME تنظیم نشده است. تنظیم دقیق (fine-tuning) به طور کامل با شکست مواجه میشود. یک بار bash scripts/deployment/dgpu/install_deps.sh را اجرا کنید، یا فقط export CUDA_HOME=/usr/local/cuda را تنظیم کنید.
گام 5: دستور fine-tune و مقادیر پیشفرض واقعی پرچمهای آن
مجموعه داده نمایشی را با مجموعه داده خودتان جایگزین کنید و تنظیمات مورد نظر خود را اضافه کنید. در ادامه، فرم کامل دستوری که مخزن در آموزش new-embodiment خود استفاده میکند، آورده شده است، شامل پرچمهای افزایش داده (augmentation) و نقطهبازرسی (checkpointing) که در مثال کوتاه README حذف شدهاند. این به معنای محدود است: ستون فقرات زبانی و رمزگذار بصری ثابت میمانند، و آنچه آموزش میبیند، پروژکتور و سر عمل انتشار (diffusion action head) است.
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 | اندازه کلی بچ در تمام GPUها قبل از انباشت گرادیان. مثالهای ارائه شده از 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 | به طور تصادفی وضعیت حس عمقی (proprioceptive state) را در طول آموزش حذف میکند. اگر وظیفه شما به وضعیت متکی است، آن را کاهش دهید. |
| --tune-llm and --tune-visual | False and False | ستون فقرات به طور پیشفرض ثابت میماند. |
| --tune-projector and --tune-diffusion-model | True and True | پروژکتور و سر عمل انتشار (diffusion action head) همانهایی هستند که واقعاً آموزش میبینند. |
| --use-percentiles | True | با q01 و q99 نرمالسازی میکند به جای حداقل و حداکثر خام. |
| --dataloader-num-workers | 2 | لودر به طور طراحی مبتنی بر CPU است. مثالها این مقدار را به 4 افزایش میدهند. |
| --seed | does not exist | هیچ پرچم seed در این CLI وجود ندارد. |
آن ردیف آخر اشتباه تایپی نیست. launch_finetune.py یک CLI tyro است که از یک dataclass تولید شده است، و آن dataclass فیلد seed ندارد. فایل README به طور جداگانه به 5 تا 6 درصد واریانس بین اجراها اشاره میکند که ناشی از افزایش غیرقطعی تصویر است. دو اجرا با پرچمهای یکسان، نقاط بازرسی یکسانی تولید نخواهند کرد، که هنگام تلاش برای تصمیمگیری در مورد اینکه آیا تغییر یک هایپرپارامتر کمک کرده است یا فقط شانس آوردهاید، اهمیت زیادی دارد. برای مقایسه، trainer خود lerobot به طور پیشفرض از seed 1000 استفاده میکند، و دستورالعمل LeRobot GR00T به صراحت --seed=42 را ارسال میکند.
تنظیم دقیق با eval_strategy="no" اجرا میشود، بنابراین هیچ منحنی افت اعتبارسنجی وجود ندارد. شما فقط افت آموزش را دریافت میکنید و هیچ چیز دیگری. راهنمای new-embodiment به شما میگوید که آن را با --eval-strategy steps --eval-steps 500 روشن کنید، اما این پرچم در launch_finetune.py وجود ندارد: CLI توسط tyro از dataclass FinetuneConfig تولید میشود، و eval_strategy، eval_steps و eval_batch_size به جای آن فیلدهای TrainingConfig هستند. مقادیر پیشفرض آنها در آنجا "no"، 500 و 2 هستند. برای دسترسی به آنها، از نقطه ورودی کاملتر gr00t/experiment/launch_train.py استفاده کنید، جایی که پرچم تو در تو --training.eval-strategy است. در هر صورت، افت آموزش به تنهایی اطلاعات بسیار کمی در مورد تعمیمپذیری به شما میدهد، که دقیقاً همان وضعیتی است که در افت میکند اما سیاست هیچ کاری نمیکند توضیح داده شده است.
هزینه یک اجرای 20000 مرحلهای
GR00T N1.7 به یک کارت 80 گیگابایتی نیاز دارد، بنابراین سوال هزینه پاسخ محدودی دارد. در AY-Robots، trainer groot1.7 روی رده A100 80 GB یا H100 80 GB اجرا میشود، جایی که یک اجرا 3 تا 6 ساعت طول میکشد با هزینه 1.20 تا 2.00 USD در ساعت در بازار لحظهای. این تقریباً 4 تا 12 USD برای کار پیشفرض 20000 مرحلهای است. همین کار روی SmolVLA یا ACT روی یک کارت 24 گیگابایتی با هزینه 0.30 تا 0.60 USD در ساعت و 1 تا 3 USD در هر اجرا انجام میشود. این همان بدهبستان واقعی است: GR00T تقریباً چهار برابر بیشتر در هر تلاش هزینه دارد، و شما نمیتوانید آن را روی 4090 زیر میز خود اجرا کنید.
| مدل | سطح GPU | اجرای معمول | هزینه معمول | حداقل اپیزودها |
|---|---|---|---|---|
| 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 |
حداقل ۵۰ اپیزود حداقل است، نه یک هدف. سوالات متداول خود NVIDIA سختگیرانهتر است: تقریباً ۱۰۰ مسیر برای یک عملیات ساده برداشتن و قرار دادن در مکان ثابت، ۵۰۰ یا بیشتر برای صحنههای پیچیده یا چند مرحلهای، و ۱۰۰ تا ۵۰۰ برای دستکاری دقیق. اگر در ۲۰ اپیزود هستید، بعدازظهر را به ضبط اختصاص دهید تا اینکه شب را به تنظیم بپردازید. راهنمای جمعآوری داده توضیح میدهد که چه چیزی یک اپیزود مفید را از یک اپیزود هدر رفته جدا میکند، اولین مجموعه داده خود را ضبط کنید نسخه کوتاه است، و جمعآوری داده SO-100 نسخه مخصوص بازو است.
گام ۶: ارزیابی حلقه باز قبل از دست زدن به بازو
یک چکپوینت جدید را مستقیماً روی یک بازوی فیزیکی قرار ندهید تا بفهمید آیا آموزش موفق بوده است یا خیر. ابتدا ارزیابی حلقه باز را اجرا کنید. این ارزیابی یک اپیزود ضبط شده را بازپخش میکند، در هر مرحله از مدل برای اقدامات درخواست میکند و پیشبینی را در برابر حقیقت زمینی با MSE و MAE رسم میکند. این کار هیچ هزینهای ندارد و خطاهای نگاشت از مراحل ۲ و ۳ را شناسایی میکند.
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 با مجموعه داده دمو پنج اپیزودی و ۲۰۰۰ گام مستند کرده است، آورده شده است.
| چکپوینت | میانگین MSE در مسیر 0 | میانگین MAE در مسیر 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 را بررسی کنید و اطمینان حاصل کنید که محدودههای عمل از نظر فیزیکی معقول هستند. |
| در مسیر 0 خوب، در اپیزودهای نگه داشته شده ضعیف | کمبود داده، نه یک اشکال. پنج اپیزود دمو نمیتوانند تعمیم یابند. |
مسیر دیگر: lerobot-train به جای Isaac-GR00T
نسخه فعلی LeRobot، 0.6.1 در PyPI از 3 آگوست 2026، راه دوم و کاملاً متفاوتی را برای تنظیم دقیق همان وزنهای پایه ارائه میدهد. LeRobot، GR00T N1.7 را به عنوان یک نوع سیاست (policy type) معرفی میکند و آن را از طریق نقطه ورودی lerobot-train خود آموزش میدهد. دو نکته در اینجا اهمیت دارد. CLI مربوط به LeRobot مجموعهای از اسکریپتهای کنسول است، بنابراین هر چیزی که میخوانید و میگوید python lerobot/scripts/train.py منسوخ شده است و اجرا نخواهد شد. و LeRobot پشتیبانی از GR00T N1.5 را به طور کامل حذف کرد و نقاط بازرسی و تنظیمات N1.5 را با یک یادداشت مهاجرت رد کرد، بنابراین اگر به N1.5 از طریق LeRobot نیاز دارید، باید lerobot==0.5.1 را پین (pin) کنید، آخرین نسخهای که از آن پشتیبانی میکند و در 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 به علاوه یک پیکربندی داده پایتون | بدون modality.json؛ رفتار توسط پرچمهای --policy.* در خط فرمان تنظیم میشود |
| سید | بدون پرچم سید | --seed، پیشفرض LeRobot 1000 |
| اقدامات نسبی | ActionConfig به ازای هر کلید در پیکربندی داده | --policy.use_relative_actions به علاوه --policy.relative_exclude_joints |
| نتایج مرجع منتشر شده | روند MSE حلقه باز SO-100 بر روی دادههای دمو | مجموعههای LIBERO، میانگین 96.5 درصد در چهار مجموعه |
| مسیر استقرار | run_gr00t_server.py به علاوه eval_so100.py از طریق 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 نیاز به یک محیط مجازی جداگانه با مرحله نصب خاص خود دارد و دایرکتوری مجموعه داده شما را درجا بازنویسی میکند.
- اجاره GPU از زمانی که شروع به اشکالزدایی میکنید، نه زمانی که آموزش شروع میشود، صورتحساب را آغاز میکند و هیچ چیز نمونه را پس از اتمام اجرا متوقف نمیکند.
- عدم وجود سید به معنای عدم قابلیت بازتولید بیت به بیت است، علاوه بر 5 تا 6 درصد واریانس اجرا به اجرا تنها از طریق افزایش داده.
دو راه برای به دست آوردن یک نقطه بازرسی
شما GPU را اجاره میکنید و کنترل کامل هر مرحله را در اختیار دارید. واقعبینانه، این کار برای اولین بار یک بعدازظهر طول میکشد و پس از آن هر بار بیست دقیقه.
- قسمتها را با lerobot-record روی SO-100 ضبط کنید. یک مجموعه داده LeRobot v3.0 به دست میآورید.
- آن را با scripts/lerobot_conversion/convert_v3_to_v2.py در یک محیط مجازی جداگانه به v2.1 تبدیل کنید.
- meta/modality.json و یک پیکربندی مدالیته پایتون را بنویسید که تحت EmbodimentTag.NEW_EMBODIMENT ثبت شده باشد.
- یک کارت 80 گیگابایتی اجاره کنید، با زیرماژولها کلون کنید، uv sync را اجرا کنید، و در Hugging Face احراز هویت کنید.
- launch_finetune.py را اجرا کنید، سپس open_loop_eval.py را روی چندین نقطه بازرسی اجرا کنید و روند MSE را قبل از دست زدن به سختافزار مقایسه کنید.
- نقطه بازرسی را قبل از از بین بردن نمونه از دستگاه خارج کنید، سپس مسیر سرویسدهی به بازو را بسازید.
نقطه بازرسی را قبل از خاموش کردن نمونه اجارهای کپی کنید. --save-total-limit 5 همچنین به این معنی است که نقاط بازرسی قدیمیتر با پیشرفت آموزش حذف میشوند، بنابراین نقطه بازرسی که در مرحله 5000 میخواستید ممکن است در مرحله 20000 دیگر وجود نداشته باشد.
همان کار به صورت یک فرم. شما مدل و مجموعه داده را انتخاب میکنید، بکاند یک GPU را در بازار لحظهای بر اساس VRAM مورد نیاز اجاره میکند، آموزشدهنده را اجرا میکند و نقاط بازرسی را در فضای ذخیرهسازی اشیاء مینویسد. راهنمای GR00T N1.7 روی SO-100 دقیقاً همین ترکیب است؛ ماتریس آموزش شامل هر مدل و جفت بازوی دیگری است، از جمله GR00T N1.7 روی SO-101.
| آنچه آموزشدهنده groot1.7 ارسال میکند | Value |
|---|---|
| اندازه دسته | 32 |
| نرخ یادگیری | 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، از دستگاه خودتان، یا از یک جلسهای که با کلاینت دسکتاپ ضبط کردهاید، باشد. استنتاج یک مرحله جداگانه است: پلتفرم یک پاد را برای سرویسدهی به سیاست فراهم میکند، و کلاینت ربات محلی شما با آن نقطه پایانی ارتباط برقرار میکند. پادها دارای یک نگهبان بیکار هستند و پس از یک دوره بیکاری خود را از بین میبرند، بنابراین یک تب مرورگر فراموش شده صورتحساب شبانه ایجاد نمیکند. اگر ترجیح میدهید کلیک نکنید، همین عملیات در 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 را در سمت ربات با پورت سریال، شناسه ربات، شاخصهای دوربین و دستور زبان اجرا کنید. نامهای دوربین در آن دستور باید با نامهای دوستانه از 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 مراجعه کنید. اگر بازو روشن میشود اما چیزی حرکت نمیکند، سروو پاسخ نمیدهد نقطه شروع است.
اکنون بخش صادقانه در مورد محل اجرای سیاست، زیرا آموزش و سرویسدهی داستانهای سختافزاری متفاوتی دارند. Fine-tuning به 40 GB یا بیشتر نیاز دارد. استنتاج اینطور نیست: README آن را 16 GB یا بیشتر ذکر میکند و به صراحت از RTX 4090 نام میبرد، بنابراین کارتی که از قبل دارید میتواند یک checkpoint را سرویسدهی کند که هرگز نمیتوانست تولید کند. آنچه تعیین میکند که آیا سیاست پاسخگو به نظر میرسد VRAM نیست، بلکه محل قرارگیری سرور است. در AY-Robots، GR00T N1.7 فقط ابری است، بنابراین حلقه کنترل علاوه بر 152 ms در هر گام عملیاتی، هزینه یک رفت و برگشت اینترنتی عمومی را نیز میپردازد، و فقط SmolVLA و ACT نیز به صورت محلی اجرا میشوند. برای عملیات کند برداشتن و قرار دادن، یک پاد از راه دور قابل تحمل است. برای هر چیز واکنشی اینطور نیست: سیاست به گونهای مردد میشود که دقیقاً شبیه یک شکست آموزشی به نظر میرسد و اینطور نیست. ACT با 20 ms در هر گام عملیاتی مدلی است که تنگترین حلقه را تحمل میکند، SmolVLA در 245 ms قرار دارد، و هیچ مقدار از تنظیم تأخیر نمیتواند یک رفت و برگشت را که قبلاً صرف شده است، جبران کند. اولین سیاست خود را اجرا کنید بخش سرویسدهی را به طور کامل توضیح میدهد.
چه چیزی واقعاً اشتباه پیش میرود
- خطای GatedRepoError در اولین اجرا. شما به nvidia/Cosmos-Reason2-2B دسترسی ندارید، یا احراز هویت نکردهاید. این اتفاق پس از شروع به کار ساعت GPU رخ میدهد.
- مجموعه داده هنگام بارگذاری رد شد. تقریباً همیشه یک مجموعه داده v3.0 است. آن را به نسخه پایینتر تبدیل کنید. به رد شدن مجموعه داده به عنوان v3 مراجعه کنید.
- خطای IndexError در مورد ابعاد بولی نامنظم. شما delta_indices را تغییر دادهاید و آمار را بازسازی نکردهاید.
- کمبود حافظه در بچ 32. --global-batch-size را کاهش دهید و --gradient-accumulation-steps را افزایش دهید، یا --num-shards-per-epoch را کاهش دهید، که پیکربندی به صراحت در صورت محدودیت VRAM پیشنهاد میکند. به کمبود حافظه در طول آموزش مراجعه کنید.
- کاهش Loss، عدم عملکرد policy. به طور پیشفرض تقسیم اعتبارسنجی وجود ندارد، بنابراین یک منحنی آموزش تمیز چیز زیادی را ثابت نمیکند. این صفحه تشخیص را پوشش میدهد.
- فقط در تنظیمات شما کار میکند و نه جای دیگر. این انتظار با یک مجموعه داده کوچک که تحت یک شرایط نوری فیلمبرداری شده است، وجود دارد. NVIDIA افزایش رنگ (colour jitter augmentation) به علاوه 20 تا 50 اپیزود در نورپردازیهای مختلف را توصیه میکند. اطلاعات بیشتر اینجا.
- گریپر هرگز به درستی بسته نمیشود. بررسی کنید که عمل گریپر ABSOLUTE و مفاصل بازو RELATIVE باشند، به همین ترتیب در action_configs. گریپر بسته نمیشود سایر علل را فهرست میکند.
- یک دوربین در حین ضبط بیصدا از کار میافتد. اپیزود همچنان ذخیره میشود و کلید ویدیو همچنان وجود دارد، به همین دلیل این مورد ناخوشایند است. دوربین شناسایی نشد آن را پوشش میدهد.
فهرست کامل حالتهای خرابی در قرار دارد. اگر در حال انتخاب بین مدلها هستید تا اشکالزدایی یک مدل، و دارای اعداد بنچمارک با منابع پیوست شده هستند، و مقایسهای است که اکثر مردم واقعاً به آن نیاز دارند، زیرا این انتخاب بین مدلی است که میتوانید روی کارت زیر میز خود آموزش دهید و مدلی که باید یک گره 80 GB را برای fine-tune اجاره کنید. برای اطلاعات پسزمینه در مورد اینکه چرا این مدلها به این شکل رفتار میکنند، و ارزش خواندن اولیه را دارند. و اگر هنوز بازوی ربات ندارید، یک SO-100 فیزیکی را بدون نیاز به ثبتنام پخش میکند.
چند اپیزود نیاز دارم تا fine-tuning GR00T N1.7 ارزشش را داشته باشد؟▾
AY-Robots حداقل 50 اپیزود را برای trainer groot1.7 تعیین میکند. FAQ خود NVIDIA سختگیرانهتر است: تقریباً 100 مسیر برای یک عملیات ساده برداشتن و قرار دادن در یک مکان ثابت، 500 یا بیشتر برای صحنههای پیچیده یا چند مرحلهای، و 100 تا 500 برای دستکاری دقیق. زیر 50 اپیزود، تقریباً همیشه بهتر است دادههای بیشتری ضبط کنید تا اینکه hyperparameterها را تنظیم کنید. اگر موفقیت پس از آن به ثبات رسید، NVIDIA HG-DAgger را توصیه میکند: policy را اجرا کنید، هنگام شکست مداخله کنید و آن اصلاحات را به مجموعه داده اضافه کنید.
چرا مجموعه داده من بارگذاری نمیشود و چگونه میتوانم بفهمم کدام نسخه است؟▾
meta/info.json را باز کنید و codebase_version را بخوانید. CODEBASE_VERSION فعلی LeRobot در main، v3.0 است، بنابراین هر چیزی که با یک toolchain اخیر ضبط شده باشد v3.0 است، و loader GR00T انتظار v2 را دارد. با scripts/lerobot_conversion/convert_v3_to_v2.py از مخزن Isaac-GR00T تبدیل کنید، که codebase_version: v2.1 را در مجموعه داده تبدیل شده مینویسد. این اسکریپت در virtualenv خود اجرا میشود زیرا به نسخه lerobot متفاوتی نسبت به آنچه GR00T مشخص کرده است، نیاز دارد.
آیا میتوانم GR00T N1.7 را روی یک RTX 4090 fine-tune کنم؟▾
خیر. NVIDIA برای fine-tuning 40 GB یا بیشتر VRAM را توصیه میکند و گرههای H100 یا L40 را نام میبرد؛ کارتهای دیگر کار میکنند اما زمان بسیار بیشتری میبرند. یک 4090 دارای 24 GB است. AY-Robots به همین دلیل GR00T N1.7 را فقط در رده A100 80 GB و H100 80 GB ارائه میدهد. Inference داستان متفاوتی است: 16 GB برای سرویسدهی مدل کافی است، بنابراین یک 4090 میتواند یک policy را اجرا کند که نمیتواند آن را آموزش دهد. اگر یک VLA میخواهید که بتوانید روی 24 GB آموزش دهید، آن SmolVLA با حدود 450 M پارامتر یا ACT با حدود 80 M است.
چرا دو اجرا با flagهای یکسان، checkpointهای متفاوتی میدهند؟▾
زیرا launch_finetune.py هیچ seedی ندارد. این یک CLI tyro است که از یک dataclass بدون فیلد seed تولید شده است، بنابراین چیزی RNG را ثابت نمیکند. مخزن به طور جداگانه به 5 تا 6 درصد واریانس بین اجراها اشاره میکند که ناشی از افزایش تصویر غیرقطعی است. اگر قابلیت بازتولید مهم است، به جای آن از مسیر LeRobot استفاده کنید: lerobot-train پارامتر --seed را میگیرد و دستورالعمل منتشر شده GR00T پارامتر --seed=42 را ارسال میکند.
آیا باید از Isaac-GR00T استفاده کنم یا lerobot-train؟▾
اگر پیادهسازی مرجع، کنترل بر نمایش عمل به ازای هر کلید، خروجی TensorRT، یا مثالهای بنچمارک را برای بازتولید قبل از اعتماد به دادههای خود میخواهید، از Isaac-GR00T استفاده کنید. اگر مجموعه داده شما از قبل LeRobot v3.0 است و ترجیح میدهید آن را تبدیل نکنید، اگر seed میخواهید، یا اگر بقیه stack شما از قبل LeRobot است، از lerobot-train استفاده کنید. هر دو، وزنهای nvidia/GR00T-N1.7-3B را fine-tune میکنند. توجه داشته باشید که LeRobot پشتیبانی از GR00T N1.5 را به طور کامل کنار گذاشته است: checkpointهای N1.5 با یک یادداشت مهاجرت رد میشوند، و برای ادامه استفاده از آنها باید lerobot==0.5.1 را مشخص کنید.
آیا واقعاً به یک دوربین مچی علاوه بر دوربین جلو نیاز دارم؟▾
پیکربندی SO-100 ارائه شده از هر دو استفاده میکند، و modality.json دوربین جلو و مچ را به عنوان کلیدهای ویدیویی جداگانه نگاشت میکند. میتوانید با یک دوربین آموزش دهید، و جدول تأخیر کارت مدل با یک دوربین اندازهگیری میشود، اما نمای مچ همان چیزی است که اطلاعات قابل استفادهای در مورد گریپر در لحظه تماس به policy میدهد. اگر گریپر در زمان اشتباهی در rollouts شما بسته میشود، یک دوربین مچی گم شده یا بد تنظیم شده یکی از اولین چیزهایی است که باید بررسی شود.
GR00T N1.7 را روی SO-100 خود fine-tune کنید بدون اینکه ابتدا محیط را بسازید
مدل، مجموعه داده و hyperparameterها را در یک فرم انتخاب کنید. backend یک A100 80 GB یا H100 را در بازار لحظهای اجاره میکند، trainer را با بچ 32، نرخ یادگیری 1e-4 و 20000 گام اجرا میکند، و checkpointها را در فضای ذخیرهسازی اشیاء مینویسد. تقریباً 4 تا 12 USD برای هر اجرا.
راهنمای آموزش GR00T N1.7 را باز کنیدSources
- 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