صفحه راهنمای AY-Robots برای آموزش GR00T N1.7 روی بازوی SO-100، نمایش‌دهنده سطح GPU مورد نیاز، فرمت مجموعه داده و تنظیمات پیش‌فرض آموزش‌دهنده
GR00T N1.7SO-100تنظیم دقیقLeRobotVLA

چگونه GR00T N1.7 را روی مجموعه داده SO-100 خودتان آموزش دهیم

AY-Robots ResearchAugust 23, 202628 دقیقه مطالعه

یک راهنمای عملی و آزمایش‌شده برای تنظیم دقیق 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 Facerepo 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جدول زمان‌بندی کارت مدل
همان سخت‌افزار، پایپ‌لاین کامل TensorRT27.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 آن‌ها را در کنار هم قرار می‌دهند.

صفحه مدل AY-Robots برای GR00T N1.7 که تعداد پارامترها، رده GPU، تأخیر استنتاج و نقاط قوت و محدودیت‌های اعلام شده مدل را نشان می‌دهد.
صفحه /policies/groot-n1-7 همان نوار مشخصاتی را دارد که در غیر این صورت باید به صورت دستی از کارت مدل و فایل README مخزن جمع‌آوری می‌کردید.

آنچه اجرا قبل از هرگونه تایپ نیاز دارد

نیازتنظیم دقیقاستنتاج
VRAM، راهنمایی NVIDIA40 گیگابایت یا بیشتر، H100 یا L40 توصیه می‌شود16 گیگابایت یا بیشتر، RTX 4090 کار می‌کند
پایتون و CUDA روی dGPU3.12 و CUDA 12.83.12 و CUDA 12.8
بک‌اند ویدئوtorchcodec 0.8.0, FFmpeg 4 تا 7 فقطمشابه
فرمت مجموعه دادهLeRobot v2 به علاوه meta/modality.jsonقابل اجرا نیست
دسترسی به Hugging Faceتأیید شده برای nvidia/Cosmos-Reason2-2Bمشابه
ابزارهای دیگرgit-lfs و uvuv
رده GPU AY-Robots برای آموزش‌دهنده groot1.7A100 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 فایل‌های پارکت و جریان‌های دوربین را می‌نویسد. اگر کالیبراسیون نادرست باشد، مقادیر مفصلی در مجموعه داده شما رباتی کمی متفاوت از رباتی که بعداً سیاست را اجرا خواهد کرد، توصیف می‌کنند و هیچ مقدار آموزشی این مشکل را برطرف نمی‌کند.

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 روی یک LeRobot فعلی. طول اپیزود به طور پیش‌فرض ۶۰ ثانیه و زمان بازنشانی ۶۰ ثانیه است. so100_follower و so101_follower هر دو در برابر یک کلاس پیکربندی LeRobot ثبت شده‌اند، به همین دلیل مثال Isaac-GR00T SO100 از نام‌های so101 استفاده می‌کند؛ هر دو روی SO-100 کار می‌کنند. نام‌های دوربینی که در اینجا انتخاب می‌کنید (front, wrist) نام‌هایی هستند که باید در modality.json دوباره ظاهر شوند.

توصیه خود 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 توضیح می‌دهد که واقعاً چه چیزی در آن وجود دارد.

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
مبدل پارامترهای --repo-id، یک --root اختیاری، و --force-conversion را می‌پذیرد که هر اسنپ‌شات محلی موجود را حذف کرده و دوباره دانلود می‌کند. این مبدل codebase_version: v2.1 را در meta/info.json می‌نویسد.
تبدیل در محل بازنویسی می‌کند

اگر مجموعه داده 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./, و یک فایل اضافی که LeRobot استاندارد آن را ندارد. این فایل اضافی جایی است که بیشتر خطاهای باقی‌مانده در آن قرار دارند.

گام ۲: 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 ارائه می‌دهد، عیناً آورده شده است.

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. شاخص‌ها از صفر شروع می‌شوند و از برش‌دهی پایتون پیروی می‌کنند، بنابراین single_arm برابر [0:5] و gripper برابر [5:6] است.

آن را در مجموعه داده تبدیل شده خود در meta/modality.json کپی کنید و کلیدهای ویدئو را به هر نامی که دوربین‌های شما واقعاً دارند تغییر دهید. اگر با یک دوربین سقفی به نام top ضبط کرده‌اید، آنگاه original_key برابر است با observation.images.top و نام دوستانه هر چیزی است که پیکربندی داده شما به آن ارجاع می‌دهد. این دو باید با هم مطابقت داشته باشند و هیچ یک از آنها دیگری را برای شما بررسی نمی‌کند. حاشیه‌نویسی زبان بدتر است، زیرا همان کلید باید در سه مکان ظاهر شود.

لایهفایلفرم SO-100 مورد استفاده در مخزن
ستون Parquetdata/chunk-*/episode_*.parquetannotation.human.task_description
کلید modality.jsonmeta/modality.json, under "annotation", without the annotation. prefixhuman.task_description
کلیدهای modality در پیکربندی دادهyour so100_config.pyannotation.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 پیش‌بینی می‌کند، زیرا یک سیگنال باینری باز یا بسته به عنوان هدف بهتر از دلتا عمل می‌کند.

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، کوتاه شده به موارد ضروری. NON_EEF به معنای فضای مفصل است؛ EEF یک بردار نه‌بعدی از x، y، z به علاوه یک چرخش 6D را انتظار دارد.

دو جزئیات در اینجا وجود دارد که اگر آنها را ندانید، یک روز از وقت شما را خواهد گرفت. اول، action_configs موقعیتی است: مستندات همان طول و همان ترتیب را برای modality_keys الزامی می‌کنند، و در مورد عواقب اشتباه گرفتن آن صریح هستند، که این است که نمایش اشتباه به صورت بی‌صدا اعمال می‌شود. گریپر شما به عنوان دلتا و بازوی شما به عنوان یک هدف مطلق آموزش می‌بیند و هیچ پیام خطایی وجود ندارد. دوم، register_modality_config تأیید می‌کند که تگ قبلاً ثبت نشده است، بنابراین یک پیکربندی NEW_EMBODIMENT دوم در همان فرآیند پایتون با خطای Embodiment tag ... already registered از کار می‌افتد. شما نمی‌توانید دو مورد از اینها را در یک اسکریپت وارد کنید. قانون سوم بعداً، در زمان استقرار، اعمال می‌شود: delta_indices عمل باید محدوده پیوسته ای باشد که از صفر شروع می‌شود. یک پنجره پراکنده مانند [0, 4, 8] رد می‌شود، زیرا هر چیزی در پایین‌دست، بخش پیش‌بینی شده را به صورت خطی ایندکس می‌کند و در غیر این صورت ردیف‌های اشتباه را اجرا می‌کند.

delta_indices را تغییر دهید و باید آمار را بازسازی کنید

آمار نرمال‌سازی، به ویژه 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 است که قبلاً کش شده است و این کار دو یا سه ثانیه طول می‌کشد.

  1. 1
    git-lfs را نصب کنید، سپس با زیرماژول‌ها کلون کنید

    git-lfs الزامی است، نه اختیاری. بدون آن، فایل‌های parquet در demo_data/ به صورت اشاره‌گرهای ناقص دانلود می‌شوند و اجرای دمو بر روی مجموعه‌داده‌ای که در لیست فایل‌ها موجود به نظر می‌رسد، با شکست مواجه می‌شود.

    bash
    sudo apt install git-lfs && git lfs install
    git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
  2. 2
    uv را نصب و محیط را همگام‌سازی کنید

    نصب پیش‌فرض، وابستگی‌های GPU از جمله flash-attn و TensorRT را دانلود می‌کند. در یک ایمیج تازه A100 یا H100، این طولانی‌ترین مرحله است، بنابراین قبل از اینکه به چیز دیگری توجه کنید، آن را انجام دهید.

    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
    احراز هویت در برابر Hugging Face

    این کار را قبل از اولین راه‌اندازی آموزش انجام دهید، نه بعد از اینکه هشت دقیقه بعد با شکست مواجه شد.

    bash
    uv run huggingface-cli login   # or: export HF_TOKEN=<your_token>
  4. 4
    بررسی سلامت بر روی داده‌های دمو SO-100 ارائه شده

    قبل از دست زدن به ضبط خودتان، ۲۰۰۰ گام را روی demo_data/cube_to_bowl_5 اجرا کنید. این شامل پنج اپیزود است، سریع تمام می‌شود و محیط را تأیید می‌کند نه داده‌های شما را. اگر این اجرا با شکست مواجه شود، هیچ کاری که با مجموعه‌داده خود انجام دهید کمکی نخواهد کرد.

    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
دو تله محیطی که شبیه باگ‌های مدل به نظر می‌رسند

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) است.

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
یک GPU. برای هشت کارت، راه‌انداز را با uv run torchrun --nproc_per_node=8 --master_port=29500 جایگزین کنید و --num-gpuses را 8 قرار دهید. از uv run torchrun استفاده کنید، نه فقط torchrun، در غیر این صورت محیط اشتباهی خواهید داشت.
پرچمپیش‌فرض در FinetuneConfigعملکرد
--global-batch-size64اندازه کلی بچ در تمام GPUها قبل از انباشت گرادیان. مثال‌های ارائه شده از 32 استفاده می‌کنند.
--learning-rate1e-4همان مقداری که AY-Robots برای آموزش‌دهنده groot1.7 خود ارسال می‌کند.
--max-steps10000تعداد کل گام‌های بهینه‌ساز. پوشش examples/finetune.sh نیز به طور پیش‌فرض 10000 است.
--gradient-accumulation-steps1بچ موثر را ضرب می‌کند. مقادیر بالای 1 یک هشدار صادر می‌کنند که اندازه انباشته شده را به شما می‌گوید.
--save-steps and --save-total-limit1000 and 5تعداد دفعات نقطه‌بازرسی و تعداد نگهداری شده. موارد قدیمی‌تر حذف می‌شوند.
--weight-decay and --warmup-ratio1e-5 and 0.05همچنین به طور صریح توسط examples/finetune.sh تنظیم شده است.
--state-dropout-prob0.2 in the CLI, 0.8 in the model configبه طور تصادفی وضعیت حس عمقی (proprioceptive state) را در طول آموزش حذف می‌کند. اگر وظیفه شما به وضعیت متکی است، آن را کاهش دهید.
--tune-llm and --tune-visualFalse and Falseستون فقرات به طور پیش‌فرض ثابت می‌ماند.
--tune-projector and --tune-diffusion-modelTrue and Trueپروژکتور و سر عمل انتشار (diffusion action head) همان‌هایی هستند که واقعاً آموزش می‌بینند.
--use-percentilesTrueبا q01 و q99 نرمال‌سازی می‌کند به جای حداقل و حداکثر خام.
--dataloader-num-workers2لودر به طور طراحی مبتنی بر CPU است. مثال‌ها این مقدار را به 4 افزایش می‌دهند.
--seeddoes not existهیچ پرچم seed در این CLI وجود ندارد.

آن ردیف آخر اشتباه تایپی نیست. launch_finetune.py یک CLI tyro است که از یک dataclass تولید شده است، و آن dataclass فیلد seed ندارد. فایل README به طور جداگانه به 5 تا 6 درصد واریانس بین اجراها اشاره می‌کند که ناشی از افزایش غیرقطعی تصویر است. دو اجرا با پرچم‌های یکسان، نقاط بازرسی یکسانی تولید نخواهند کرد، که هنگام تلاش برای تصمیم‌گیری در مورد اینکه آیا تغییر یک هایپرپارامتر کمک کرده است یا فقط شانس آورده‌اید، اهمیت زیادی دارد. برای مقایسه، trainer خود lerobot به طور پیش‌فرض از seed 1000 استفاده می‌کند، و دستورالعمل LeRobot GR00T به صراحت --seed=42 را ارسال می‌کند.

اعتبارسنجی به طور پیش‌فرض خاموش است، و پرچم مستند شده در این CLI وجود ندارد

تنظیم دقیق با 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.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

حداقل ۵۰ اپیزود حداقل است، نه یک هدف. سوالات متداول خود NVIDIA سخت‌گیرانه‌تر است: تقریباً ۱۰۰ مسیر برای یک عملیات ساده برداشتن و قرار دادن در مکان ثابت، ۵۰۰ یا بیشتر برای صحنه‌های پیچیده یا چند مرحله‌ای، و ۱۰۰ تا ۵۰۰ برای دستکاری دقیق. اگر در ۲۰ اپیزود هستید، بعدازظهر را به ضبط اختصاص دهید تا اینکه شب را به تنظیم بپردازید. راهنمای جمع‌آوری داده توضیح می‌دهد که چه چیزی یک اپیزود مفید را از یک اپیزود هدر رفته جدا می‌کند، اولین مجموعه داده خود را ضبط کنید نسخه کوتاه است، و جمع‌آوری داده SO-100 نسخه مخصوص بازو است.

گام ۶: ارزیابی حلقه باز قبل از دست زدن به بازو

یک چک‌پوینت جدید را مستقیماً روی یک بازوی فیزیکی قرار ندهید تا بفهمید آیا آموزش موفق بوده است یا خیر. ابتدا ارزیابی حلقه باز را اجرا کنید. این ارزیابی یک اپیزود ضبط شده را بازپخش می‌کند، در هر مرحله از مدل برای اقدامات درخواست می‌کند و پیش‌بینی را در برابر حقیقت زمینی با MSE و MAE رسم می‌کند. این کار هیچ هزینه‌ای ندارد و خطاهای نگاشت از مراحل ۲ و ۳ را شناسایی می‌کند.

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
نمودارها در /tmp/open_loop_eval/traj_<id>.jpeg ذخیره می‌شوند مگر اینکه شما --save-plot-path را ارسال کنید. پیش‌فرض‌ها: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

مخزن عمداً از انتشار یک MSE هدف برای داده‌های سفارشی خودداری می‌کند، و این تصمیم درستی است: این عدد به واحدهای عملیاتی شما، وظیفه شما و اندازه مجموعه داده شما بستگی دارد، بنابراین یک آستانه کپی شده از بازوی شخص دیگری بی‌معنی است. آنچه معنی‌دار است، روند است. در اینجا اجرای مرجعی که مخزن روی یک H100 با مجموعه داده دمو پنج اپیزودی و ۲۰۰۰ گام مستند کرده است، آورده شده است.

چک‌پوینتمیانگین MSE در مسیر 0میانگین MAE در مسیر 0
50087.55.63
100025.43.30
150013.22.18
200010.01.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 منتشر شده است.

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
دستورالعمل GR00T N1.7 بومی LeRobot. به relative_exclude_joints توجه کنید: گریپر از اقدامات نسبی مستثنی شده است، که همان تصمیمی است که so100_config.py با ActionRepresentation.ABSOLUTE می‌گیرد.
جنبهIsaac-GR00T launch_finetune.pylerobot-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 از طریق ZMQlerobot-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 را اجاره می‌کنید و کنترل کامل هر مرحله را در اختیار دارید. واقع‌بینانه، این کار برای اولین بار یک بعدازظهر طول می‌کشد و پس از آن هر بار بیست دقیقه.

  1. قسمت‌ها را با lerobot-record روی SO-100 ضبط کنید. یک مجموعه داده LeRobot v3.0 به دست می‌آورید.
  2. آن را با scripts/lerobot_conversion/convert_v3_to_v2.py در یک محیط مجازی جداگانه به v2.1 تبدیل کنید.
  3. meta/modality.json و یک پیکربندی مدالیته پایتون را بنویسید که تحت EmbodimentTag.NEW_EMBODIMENT ثبت شده باشد.
  4. یک کارت 80 گیگابایتی اجاره کنید، با زیرماژول‌ها کلون کنید، uv sync را اجرا کنید، و در Hugging Face احراز هویت کنید.
  5. launch_finetune.py را اجرا کنید، سپس open_loop_eval.py را روی چندین نقطه بازرسی اجرا کنید و روند MSE را قبل از دست زدن به سخت‌افزار مقایسه کنید.
  6. نقطه بازرسی را قبل از از بین بردن نمونه از دستگاه خارج کنید، سپس مسیر سرویس‌دهی به بازو را بسازید.
مرحله‌ای که همه فراموش می‌کنند

نقطه بازرسی را قبل از خاموش کردن نمونه اجاره‌ای کپی کنید. --save-total-limit 5 همچنین به این معنی است که نقاط بازرسی قدیمی‌تر با پیشرفت آموزش حذف می‌شوند، بنابراین نقطه بازرسی که در مرحله 5000 می‌خواستید ممکن است در مرحله 20000 دیگر وجود نداشته باشد.

ماتریس آموزش AY-Robots با پنج مدل سیاست به عنوان ردیف و چهار بازوی ربات به عنوان ستون، که هر سلول به یک راهنمای آموزشی خاص پیوند دارد
ماتریس /train: پنج مدل در برابر چهار بازو. ردیف GR00T N1.7 همچنین SO-101، Koch v1.1 و LeKiwi را پوشش می‌دهد.

بازگرداندن نقطه بازرسی به بازو

Isaac-GR00T از تقسیم سرور-کلاینت بر روی ZMQ استفاده می‌کند. سیاست روی GPU اجرا می‌شود، و یک کلاینت سبک روی دستگاه ربات مشاهدات را ارسال کرده و قطعات عمل را دریافت می‌کند. مثال SO-100 به اندازه کافی کامل است که بتوان آن را کپی کرد: run_gr00t_server.py را با نقطه بازرسی خود و --embodiment-tag NEW_EMBODIMENT شروع کنید، سپس eval_so100.py را در سمت ربات با پورت سریال، شناسه ربات، شاخص‌های دوربین و دستور زبان اجرا کنید. نام‌های دوربین در آن دستور باید با نام‌های دوستانه از modality.json شما مطابقت داشته باشند، نه با شماره‌های دستگاه سیستم عامل.

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 کنترل می‌کند که چند گام پیش‌بینی‌شده قبل از برنامه‌ریزی مجدد اجرا شوند. این مقدار باید حداکثر برابر با action_horizon سیاست باشد، و آن عدد طول delta_indices عمل در پیکربندی modality شماست، نه مدل پایه. پیکربندی SO-100 ارائه‌شده 16 گام را پیش‌بینی می‌کند، بنابراین 16 سقف شماست؛ checkpoint پایه nvidia/GR00T-N1.7-3B برای 40 گام پیکربندی شده است، و policy.md به وضوح بیان می‌کند که checkpointهای fine-tuned ممکن است متفاوت باشند. اگر از آن فراتر روید، یک ValueError دریافت خواهید کرد که هر دو عدد را نام می‌برد. 8 مقداری است که مستندات برای استقرار بلادرنگ پیشنهاد می‌کنند. نام پرچم قدیمی --action-horizon همچنان کار می‌کند اما هشدار می‌دهد.
7.4 V، نه 12 V

در حالی که بازو را دوباره سیم‌کشی می‌کنید: 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 را باز کنید

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started