SO-100 आर्म पर GR00T N1.7 को प्रशिक्षित करने के लिए AY-Robots गाइड पेज, जिसमें आवश्यक GPU टियर, डेटासेट प्रारूप और ट्रेनर डिफॉल्ट्स दिखाए गए हैं
GR00T N1.7SO-100फाइन-ट्यूनिंगLeRobotVLA

अपने SO-100 डेटासेट पर GR00T N1.7 को कैसे प्रशिक्षित करें

AY-Robots ResearchAugust 23, 202628 मिनट का पठन

SO-100 LeRobot डेटासेट पर NVIDIA GR00T N1.7 को फाइन-ट्यून करने के लिए एक परीक्षित मार्गदर्शिका: वास्तविक फ़्लैग, modality.json, v2.1 की आवश्यकता, एक रन की लागत क्या है, और इसमें आने वाली बाधाएँ।

NVIDIA आपके पास मौजूद आर्म के लिए एक फाइन-ट्यूनिंग उदाहरण प्रदान करता है। Isaac-GR00T रिपॉजिटरी के अंदर demo_data/cube_to_bowl_5 नामक एक फ़ोल्डर है: पाँच एपिसोड, 30 एफपीएस पर 4,148 फ़्रेम, पहले से ही LeRobot v2.1 के रूप में लिखे गए हैं, जिसमें एक मिलान मोडेलिटी कॉन्फ़िग है 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 पर एक फॉर्म के रूप में दिखाती है। नीचे दी गई सभी जानकारी 20 अगस्त 2026 तक Isaac-GR00T मुख्य शाखा (n1.7-रिलीज़ लाइन) और 3 अगस्त 2026 को PyPI पर प्रकाशित lerobot 0.6.1 के विरुद्ध जाँची गई थी। अपस्ट्रीम तेजी से आगे बढ़ता है, और जहाँ एक फ़्लैग का नाम बदला गया था, यह लेख ऐसा कहता है।

शुरू करने से पहले आपको क्या जानना चाहिए

  • GR00T N1.7 फाइन-ट्यूनिंग के लिए 40 GB या अधिक VRAM की आवश्यकता होती है। NVIDIA H100 या L40 नोड्स की सिफारिश करता है। एक 24 GB RTX 4090 यह काम नहीं कर पाएगा, हालांकि यह 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, A100 80 GB या H100 टियर पर लगभग 4 से 12 USD।

GR00T N1.7 वास्तव में क्या है

GR00T N1.7 एक विजन-लैंग्वेज-एक्शन मॉडल है जिसमें मूल GR00T N1 पेपर में वर्णित डुअल-सिस्टम लेआउट है: एक विजन-लैंग्वेज मॉड्यूल जो कैमरों और निर्देशों को पढ़ता है, और एक डिफ्यूजन ट्रांसफार्मर जो उसे निरंतर मोटर कमांड के एक हिस्से में बदल देता है। N1.7 ने पहले आधे हिस्से को बदल दिया। 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 यह बताता है कि क्या अपग्रेड आपकी पाइपलाइन को फिर से बनाने को उचित ठहराता है।

PropertyValueWhere it comes from
पैरामीटर3,000,000,000हगिंग फेस मॉडल कार्ड
विजन-लैंग्वेज बैकबोनnvidia/Cosmos-Reason2-2B (Qwen3-VL), हगिंग फेस पर गेटेडrepo README
एक्शन हेडफ्लो-मैचिंग डिफ्यूजन ट्रांसफार्मर, 16 लेयर्स (N1.6 में 32 थे)repo README
अनुमानित एक्शन होराइजनबेस चेकपॉइंट के लिए 40 स्टेप्स (N1.6 में 16 थे)getting_started/policy.md और repo README
अधिकतम स्टेट और एक्शन चौड़ाई132 (N1.6 में 29 थे)repo README
कोड लाइसेंसApache 2.0Isaac-GR00T repository
वेट्स लाइसेंसNVIDIA Open Model License Agreementमॉडल कार्ड
लेटेंसी, H100 80 GB, PyTorch ईगर, 4 डिनोइजिंग स्टेप्स, 1 कैमरा85.8 ms एंड टू एंड, 11.7 Hzमॉडल कार्ड टाइमिंग टेबल
वही हार्डवेयर, TensorRT फुल पाइपलाइन27.9 ms एंड टू एंड, 35.9 Hzमॉडल कार्ड टाइमिंग टेबल
AY-Robots द्वारा अपने सर्व किए गए GR00T N1.7 के लिए उद्धृत लेटेंसी152 ms प्रति एक्शन स्टेपAY-Robots policy catalog

वे अंतिम तीन पंक्तियाँ लोगों द्वारा बताई गई अधिकांश निराशा को समझाती हैं। मुख्य 27.9 ms एक H100 पर एक TensorRT इंजन है जिसमें एक कैमरा और चार डिनोइजिंग स्टेप्स हैं। उसी कार्ड पर प्लेन PyTorch 85.8 ms है, और मॉडल कार्ड इस अंतर को 3.08x बताता है। किसी भी संख्या में सर्विंग लेयर, दूसरा कैमरा या नेटवर्क हॉप शामिल नहीं है। AY-Robots द्वारा अपने सर्व किए गए GR00T N1.7 के लिए उद्धृत 152 ms प्रति एक्शन स्टेप वह आंकड़ा है जिसमें सर्विंग लूप में है, और एक सार्वजनिक-इंटरनेट राउंड ट्रिप इसके ऊपर बैठता है। इस पर अंत में और अधिक। अन्य मॉडलों के बगल में संख्याओं के लिए, GR00T N1.7 बनाम Pi0.5 और GR00T N1.7 बनाम SmolVLA उन्हें साथ-साथ रखते हैं।

The AY-Robots model page for GR00T N1.7 showing parameter count, GPU tier, inference latency and the model's stated strengths and limits
The /policies/groot-n1-7 page carries the same spec strip you would otherwise assemble by hand from the model card and the repo README.

कुछ भी टाइप करने से पहले रन को क्या चाहिए

आवश्यकताफाइन-ट्यूनिंगअनुमान
VRAM, NVIDIA मार्गदर्शन40 GB या अधिक, H100 या L40 अनुशंसित16 GB या अधिक, एक RTX 4090 काम करता है
dGPU पर Python और CUDA3.12 and CUDA 12.83.12 and CUDA 12.8
वीडियो बैकएंडtorchcodec 0.8.0, FFmpeg 4 to 7 onlyवही
डेटासेट प्रारूपLeRobot v2 plus meta/modality.jsonलागू नहीं
Hugging Face एक्सेसnvidia/Cosmos-Reason2-2B के लिए स्वीकृतवही
अन्य उपकरणgit-lfs and uvuv
groot1.7 ट्रेनर के लिए AY-Robots GPU टियरA100 80 GB or 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 पारकेट फ़ाइलें और कैमरा स्ट्रीम लिखता है। यदि कैलिब्रेशन बंद है, तो आपके डेटासेट में संयुक्त मान उस रोबोट से थोड़ा अलग रोबोट का वर्णन करते हैं जो बाद में पॉलिसी को निष्पादित करेगा, और कोई भी प्रशिक्षण इसे ठीक नहीं कर सकता है।

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 पर lerobot-record। एपिसोड की लंबाई डिफ़ॉल्ट रूप से 60 s और रीसेट समय 60 s होता है। so100_follower और so101_follower दोनों एक ही LeRobot कॉन्फ़िग क्लास के विरुद्ध पंजीकृत हैं, यही कारण है कि Isaac-GR00T SO100 उदाहरण so101 नामों का उपयोग करता है; SO-100 पर कोई भी काम करता है। यहां आप जो कैमरा नाम (front, wrist) चुनते हैं, वे वही नाम हैं जो modality.json में फिर से दिखाई देने चाहिए।

LeRobot की अपनी सलाह है कि कम से कम 50 एपिसोड रिकॉर्ड करें, जिसमें प्रति वस्तु स्थान लगभग 10 हों, कैमरों को स्थिर रखें, और ग्रैस्पिंग व्यवहार को सुसंगत रखें। भिन्नता बाद में जोड़ें, शुरुआत में नहीं। याद रखने योग्य अंगूठे का नियम: यदि आप केवल कैमरा छवियों से स्वयं कार्य नहीं कर सकते, तो पॉलिसी भी नहीं कर सकती। आर्म-विशिष्ट सेटअप के लिए, SO-100 गेटिंग स्टार्टेड और SO-100 LeRobot पेज पोर्ट, कैलिब्रेशन और कैमरा इंडेक्स को कवर करते हैं। AY-Robots पर आप ब्राउज़र का उपयोग करके इंटरनेट पर भी यह कर सकते हैं टेलीऑपरेशन और सीधे सत्र से रिकॉर्ड करें।

चरण 1: डेटासेट LeRobot v2.1 होना चाहिए

यह सबसे आम बाधा है। LeRobot का मुख्य पर वर्तमान CODEBASE_VERSION v3.0 है, इसलिए आज आप किसी भी वर्तमान टूलचेन के साथ जो कुछ भी रिकॉर्ड करते हैं वह v3.0 के रूप में आता है। GR00T का लोडर v2 की अपेक्षा करता है। रिपॉजिटरी स्पष्ट रूप से बताती है कि क्यों: DROID, LIBERO और Bridge जैसे कई अपस्ट्रीम डेटासेट v2 में प्रकाशित होते हैं, और दोनों के लिए मूल समर्थन की योजना है लेकिन इसे शिप नहीं किया गया है। इसलिए रूपांतरण आपकी जिम्मेदारी है, और यह एक ठोस कारण से अपने स्वयं के वर्चुअलएनवी में चलता है: scripts/lerobot_conversion अपना स्वयं का पायप्रोजेक्ट रखता है जो Python 3.10 या 3.11 मांगता है और लेरोबोट को एक गिट कमिट पर पिन करता है, जबकि 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, data/chunk-000/ के तहत पारके फाइलें, videos/chunk-000/observation.images./ के तहत MP4 फाइलें, और एक अतिरिक्त फाइल जो मानक LeRobot में नहीं होती है। वह अतिरिक्त फाइल ही है जहाँ अधिकांश शेष विफलताएँ रहती हैं।

चरण 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 में रहते हैं और पारके फाइल में कुछ भी यह नहीं बताता कि कौन सा इंडेक्स कौन सा है। 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। इंडेक्स शून्य-आधारित हैं और Python स्लाइसिंग का पालन करते हैं, इसलिए single_arm [0:5] है और gripper [5:6] है।

इसे अपने परिवर्तित डेटासेट में meta/modality.json पर कॉपी करें और वीडियो कुंजियों का नाम बदलकर वह रखें जो आपके कैमरों का वास्तविक नाम है। यदि आपने 'top' नामक एक सिंगल ओवरहेड कैमरे से रिकॉर्ड किया है, तो 'original_key' 'observation.images.top' है और अनुकूल नाम वह है जिसे आपका डेटा कॉन्फ़िग संदर्भित करेगा। दोनों को सहमत होना होगा, और उनमें से कोई भी आपके लिए दूसरे की जाँच नहीं करता है। भाषा एनोटेशन और भी बुरा है, क्योंकि एक ही कुंजी को तीन स्थानों पर दिखना होता है।

परतफ़ाइलरेपो में प्रयुक्त SO-100 फ़ॉर्म
पार्केट कॉलमdata/chunk-*/episode_*.parquetannotation.human.task_description
modality.json कुंजीmeta/modality.json, under "annotation", without the annotation. prefixhuman.task_description
डेटा कॉन्फ़िग में modality_keysyour so100_config.pyannotation.human.task_description
भाषा कुंजी लोगों को क्यों भ्रमित करती है

annotation. के बाद के खंड डेटासेट के लेखक द्वारा चुने जाते हैं। SO-100 डेमो डेटा annotation.human.task_description का उपयोग करता है; LIBERO और SimplerEnv annotation.human.action.task_description का उपयोग करते हैं। दोनों मान्य हैं। यदि आपने LIBERO उदाहरण से एक कॉन्फ़िग कॉपी किया और उसे अपनी SO-100 रिकॉर्डिंग पर इंगित किया, तो भाषा चैनल कुछ भी नहीं सुलझाता है और मॉडल एक खाली निर्देश पर प्रशिक्षित होता है। हानि फिर भी कम होती है। नीति फिर भी कुछ करती है। यह बस उस बात को अनदेखा कर देती है जो आपने उसे करने के लिए कहा था।

चरण 3: डेटा कॉन्फ़िग, सापेक्ष आर्म और निरपेक्ष ग्रिपर

मोडेलिटी कॉन्फ़िग JSON के बजाय एक Python फ़ाइल है, क्योंकि यह यह भी तय करती है कि प्रत्येक एक्शन ग्रुप को कैसे दर्शाया जाता है। यह N1.7 वर्कफ़्लो का वह हिस्सा है जो N1.5 में उसी रूप में मौजूद नहीं था, और वह हिस्सा जिसे दो बार पढ़ना उचित है। शिप किए गए SO-100 कॉन्फ़िग पांच आर्म जॉइंट्स को वर्तमान स्थिति से रिलेटिव डेल्टा के रूप में और ग्रिपर को एक एब्सोल्यूट लक्ष्य स्थिति के रूप में अनुमानित करता है, क्योंकि एक बाइनरी ओपन-या-क्लोज्ड सिग्नल डेल्टा की तुलना में लक्ष्य के रूप में बेहतर व्यवहार करता है।

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 यह दावा करता है कि टैग पहले से पंजीकृत नहीं है, इसलिए उसी Python प्रक्रिया में दूसरा 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.pydelta_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-पिन किए गए व्हील को फिर से मान्य कर रहा है जो पहले से ही कैश किया गया है, और इसमें दो या तीन सेकंड लगते हैं।

  1. 1
    git-lfs स्थापित करें, फिर सबमॉड्यूल के साथ क्लोन करें

    git-lfs आवश्यक है, वैकल्पिक नहीं। इसके बिना 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 पर 2000 चरण चलाएँ। इसमें पाँच एपिसोड हैं, यह तेज़ी से समाप्त होता है, और यह आपके डेटा के बजाय वातावरण को सिद्ध करता है। यदि यह रन विफल हो जाता है, तो आपके डेटासेट के लिए कुछ भी मदद नहीं करेगा।

    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 का समर्थन करता है, और 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 उदाहरण छोड़ देता है। यह संकीर्ण अर्थ में है: भाषा बैकबोन और विज़ुअल एनकोडर जमे रहते हैं, और जो प्रशिक्षित होता है वह प्रोजेक्टर और डिफ्यूजन एक्शन हेड है।

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
सिंगल जीपीयू। आठ कार्डों के लिए, लॉन्चर को uv run torchrun --nproc_per_node=8 --master_port=29500 से बदलें और --num-gpus 8 सेट करें। uv run torchrun का उपयोग करें, न कि केवल torchrun का, अन्यथा आपको गलत वातावरण मिलेगा।
फ़्लैगFinetuneConfig में डिफ़ॉल्टयह क्या करता है
--global-batch-size64ग्रेडिएंट एक्यूमुलेशन से पहले सभी जीपीयू में कुल बैच। दिए गए उदाहरण 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.05examples/finetune.sh द्वारा भी स्पष्ट रूप से सेट किया गया है।
--state-dropout-probCLI में 0.2, मॉडल कॉन्फ़िग में 0.8प्रशिक्षण के दौरान प्रोप्रियोसेप्टिव स्थिति को यादृच्छिक रूप से छोड़ देता है। यदि आपका कार्य स्थिति पर निर्भर करता है तो इसे कम करें।
--tune-llm and --tune-visualFalse and Falseबैकबोन डिफ़ॉल्ट रूप से जमे रहते हैं।
--tune-projector and --tune-diffusion-modelTrue and Trueप्रोजेक्टर और डिफ्यूजन एक्शन हेड ही वास्तव में प्रशिक्षित होते हैं।
--use-percentilesTrueकच्चे न्यूनतम और अधिकतम के बजाय q01 और q99 के साथ सामान्यीकृत करें।
--dataloader-num-workers2लोडर डिज़ाइन द्वारा सीपीयू-आधारित है। उदाहरण इसे 4 तक बढ़ाते हैं।
--seedमौजूद नहीं हैइस CLI पर कोई सीड फ़्लैग नहीं है।

वह आखिरी पंक्ति कोई टाइपो नहीं है। launch_finetune.py एक डेटाक्लास से जनरेट किया गया टायरो सीएलआई है, और उस डेटाक्लास में कोई सीड फ़ील्ड नहीं है। README में अलग से बताया गया है कि नॉन-डिटरमिनिस्टिक इमेज ऑग्मेंटेशन के कारण रन के बीच 5 से 6 प्रतिशत का अंतर होता है। एक जैसे फ़्लैग वाले दो रन एक जैसे चेकपॉइंट नहीं बनाएंगे, जो यह तय करते समय बहुत मायने रखता है कि क्या हाइपरपैरामीटर परिवर्तन से मदद मिली या आप भाग्यशाली थे। तुलना के लिए, lerobot का अपना ट्रेनर डिफ़ॉल्ट रूप से सीड 1000 पर सेट होता है, और LeRobot GR00T रेसिपी स्पष्ट रूप से --seed=42 पास करती है।

वैलिडेशन डिफ़ॉल्ट रूप से बंद है, और दस्तावेज़ में दिया गया फ़्लैग इस सीएलआई पर नहीं है

फ़ाइन-ट्यूनिंग eval_strategy="no" के साथ चलती है, इसलिए कोई वैलिडेशन लॉस कर्व नहीं होता है। आपको केवल ट्रेनिंग लॉस मिलता है और कुछ नहीं। नई-एम्बॉडमेंट गाइड आपको इसे --eval-strategy steps --eval-steps 500 के साथ चालू करने के लिए कहती है, लेकिन वह फ़्लैग launch_finetune.py पर मौजूद नहीं है: सीएलआई टायरो द्वारा 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 GB कार्ड की आवश्यकता होती है, इसलिए लागत के प्रश्न का एक सीमित उत्तर है। AY-Robots पर groot1.7 ट्रेनर A100 80 GB या H100 80 GB टियर पर चलता है, जहाँ स्पॉट मार्केट में एक रन को 1.20 से 2.00 USD प्रति घंटे की दर से 3 से 6 घंटे लगते हैं। यह डिफ़ॉल्ट 20000-स्टेप जॉब के लिए लगभग 4 से 12 USD है। वही कार्य SmolVLA या ACT 24 GB कार्ड पर 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

50 का-एपिसोड न्यूनतम एक आधार है, लक्ष्य नहीं। NVIDIA का अपना FAQ अधिक मांग वाला है: एक साधारण निश्चित-स्थान पिक एंड प्लेस के लिए लगभग 100 ट्रेजेक्टरी, जटिल या बहु-चरणीय दृश्यों के लिए 500 या अधिक, और सूक्ष्म हेरफेर के लिए 100 से 500। यदि आप 20 एपिसोड पर हैं, तो शाम को ट्यूनिंग करने के बजाय दोपहर रिकॉर्डिंग में बिताएं। डेटा संग्रह गाइड बताता है कि एक उपयोगी एपिसोड को बेकार एपिसोड से क्या अलग करता है, अपना पहला डेटासेट रिकॉर्ड करें इसका संक्षिप्त संस्करण है, और SO-100 डेटा संग्रह आर्म-विशिष्ट संस्करण है।

The AY-Robots training guide for GR00T N1.7 on the SO-100, showing the spec strip with GPU tier, required dataset format and the trainer defaults
The /train/groot-n1-7-on-so-100 guide leads with the facts you would otherwise reconstruct by hand: GPU tier, dataset format, and the exact defaults the trainer sends.

चरण 6: हाथ को छूने से पहले ओपन-लूप मूल्यांकन

ताज़ा चेकपॉइंट किसी भौतिक आर्म पर यह जानने के लिए न डालें कि प्रशिक्षण काम किया या नहीं। पहले ओपन-लूप मूल्यांकन चलाएँ। यह एक रिकॉर्ड किए गए एपिसोड को फिर से चलाता है, मॉडल से प्रत्येक चरण पर क्रियाओं के लिए पूछता है, और MSE और MAE के साथ ग्राउंड ट्रुथ के मुकाबले भविष्यवाणी को प्लॉट करता है। इसमें कुछ भी खर्च नहीं होता है और यह चरण 2 और 3 से मैपिंग की गलतियों को पकड़ लेता है।

bash
uv run python gr00t/eval/open_loop_eval.py \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --model-path /tmp/so100/checkpoint-20000 \
    --traj-ids 0 \
    --execution-horizon 16 \
    --steps 400 \
    --modality-keys single_arm gripper
प्लॉट /tmp/open_loop_eval/traj_<id>.jpeg में बनते हैं जब तक कि आप --save-plot-path पास न करें। डिफ़ॉल्ट: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0।

रिपॉजिटरी जानबूझकर कस्टम डेटा के लिए एक लक्ष्य MSE प्रकाशित करने से इनकार करती है, और यह सही निर्णय है: यह संख्या आपकी एक्शन इकाइयों, आपके कार्य और आपके डेटासेट के आकार पर निर्भर करती है, इसलिए किसी और के आर्म से कॉपी की गई सीमा का कोई मतलब नहीं है। जो सार्थक है वह प्रवृत्ति है। यहां वह संदर्भ रन है जिसे रेपो एक सिंगल H100 पर पांच-एपिसोड डेमो डेटासेट और 2000 चरणों के साथ दस्तावेज़ित करता है।

चेकपॉइंटtraj 0 पर औसत MSEtraj 0 पर औसत MAE
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 और एक्शन रेंज के भौतिक रूप से प्रशंसनीय होने की पुष्टि करें।
traj 0 पर अच्छा, रोके गए एपिसोड पर खराबडेटा की कमी, बग नहीं। पाँच डेमो एपिसोड सामान्यीकरण नहीं कर सकते।

दूसरा मार्ग: Isaac-GR00T के बजाय lerobot-train

वर्तमान LeRobot रिलीज़, 3 अगस्त 2026 से PyPI पर 0.6.1, समान आधार भार को फाइन-ट्यून करने का एक दूसरा और काफी अलग तरीका प्रदान करती है। LeRobot GR00T N1.7 को एक पॉलिसी प्रकार के रूप में उजागर करता है और इसे अपने स्वयं के lerobot-train एंट्री पॉइंट के माध्यम से प्रशिक्षित करता है। यहाँ दो बातें मायने रखती हैं। LeRobot CLI कंसोल स्क्रिप्ट का एक सेट है, इसलिए जो कुछ भी आप पढ़ते हैं जिसमें लिखा है python lerobot/scripts/train.py पुराना है और चलेगा नहीं। और LeRobot ने GR00T N1.5 समर्थन को पूरी तरह से हटा दिया, N1.5 चेकपॉइंट्स और कॉन्फ़िग्स को एक माइग्रेशन नोट के साथ अस्वीकार कर दिया, इसलिए यदि आपको LeRobot के माध्यम से N1.5 की आवश्यकता है तो आपको lerobot==0.5.1, जो इसका समर्थन करने वाली अंतिम रिलीज़ है, 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
LeRobot-नेटिव GR00T N1.7 रेसिपी। relative_exclude_joints पर ध्यान दें: ग्रिपर को रिलेटिव एक्शन से बाहर रखा गया है, जो वही निर्णय है जो so100_config.py ActionRepresentation.ABSOLUTE के साथ लेता है।
पहलूIsaac-GR00T launch_finetune.pylerobot-train --policy.type=groot
Dataset versionLeRobot v2 केवल, रूपांतरण आवश्यकनेटिव लेरोबोट डेटासेट, कोई डाउनग्रेड नहीं
Modality mappingmeta/modality.json और एक पायथन डेटा कॉन्फ़िगकोई modality.json नहीं; व्यवहार कमांड लाइन पर --policy.* फ़्लैग द्वारा निर्धारित होता है
Seedकोई सीड फ़्लैग नहीं--seed, लेरोबोट डिफ़ॉल्ट 1000
Relative actionsडेटा कॉन्फ़िग में प्रति-कुंजी ActionConfig--policy.use_relative_actions और --policy.relative_exclude_joints
Reference results publishedडेमो डेटा पर SO-100 ओपन-लूप MSE ट्रेंडLIBERO सूट्स, चार सूट्स में 96.5 प्रतिशत औसत
Deployment pathZMQ पर run_gr00t_server.py और eval_so100.pylerobot-rollout, रीयल-टाइम चंकिंग के साथ (queue_threshold 5 या उससे कम रहना चाहिए)
फाइन-ट्यून स्वयं चलाना
फायदे
  • हर फ़्लैग दृश्यमान और परिवर्तनीय है। आप विज़ुअल एनकोडर को अनफ़्रीज़ कर सकते हैं, state_dropout_prob को स्थानांतरित कर सकते हैं, या एक्शन होराइजन को छोटा कर सकते हैं।
  • ओपन-लूप प्लॉट स्थानीय फ़ाइलें हैं। चेकपॉइंट-5000 को चेकपॉइंट-20000 के खिलाफ डिफ़ करना एक शेल कमांड है।
  • आप किसी भी प्लेटफॉर्म के ऑनलाइन रहने पर निर्भर नहीं करते हैं, और चेकपॉइंट आपकी डिस्क पर एक मानक प्रारूप में रहता है।
  • LIBERO, SimplerEnv और DROID के लिए रेपो के बेंचमार्क उदाहरण आपको अपने डेटा पर भरोसा करने से पहले ज्ञात-अच्छे रन को पुन: उत्पन्न करने का अवसर देते हैं।
नुकसान
  • पर्यावरण ही अधिकांश काम है। FFmpeg संस्करण, CUDA_HOME, git-lfs, गेटेड बैकबोन, torchcodec: इनमें से कोई भी मॉडल की समस्या नहीं है और हर एक रन को रोक देता है।
  • v3.0 से v2.1 रूपांतरण के लिए अपने स्वयं के इंस्टॉलेशन स्टेप के साथ एक अलग वर्चुअलएनवी की आवश्यकता होती है, और यह आपकी डेटासेट डायरेक्टरी को वहीं पर फिर से लिख देता है।
  • GPU रेंटल तब बिलिंग शुरू करता है जब आप डीबगिंग शुरू करते हैं, न कि जब ट्रेनिंग शुरू होती है, और रन खत्म होने पर कोई भी इंस्टेंस को नहीं रोकता है।
  • कोई सीड न होने का मतलब बिट-फॉर-बिट रिप्रोड्यूसिबिलिटी नहीं है, इसके अलावा केवल ऑग्मेंटेशन से 5 से 6 प्रतिशत रन-टू-रन भिन्नता होती है।

एक ही चेकपॉइंट प्राप्त करने के दो तरीके

आप GPU किराए पर लेते हैं और हर कदम के मालिक होते हैं। यथार्थवादी रूप से, पहली बार में इसमें एक दोपहर लगती है और उसके बाद हर बार बीस मिनट।

  1. SO-100 पर lerobot-record के साथ एपिसोड रिकॉर्ड करें। आपको एक LeRobot v3.0 डेटासेट मिलता है।
  2. इसे अपने वर्चुअलएनवी में scripts/lerobot_conversion/convert_v3_to_v2.py का उपयोग करके v2.1 में बदलें।
  3. meta/modality.json और एक Python मोडेलिटी कॉन्फ़िग लिखें, जिसे EmbodimentTag.NEW_EMBODIMENT के तहत पंजीकृत किया गया हो।
  4. एक 80 GB कार्ड किराए पर लें, सबमॉड्यूल के साथ क्लोन करें, uv सिंक करें, Hugging Face के विरुद्ध प्रमाणित करें।
  5. launch_finetune.py चलाएँ, फिर कई चेकपॉइंट्स पर open_loop_eval.py चलाएँ, और हार्डवेयर को छूने से पहले MSE प्रवृत्ति की तुलना करें।
  6. इंस्टेंस को नष्ट करने से पहले मशीन से चेकपॉइंट खींच लें, फिर आर्म तक सर्विंग पाथ बनाएँ।
वह कदम जिसे हर कोई भूल जाता है

किराए के इंस्टेंस को बंद करने से पहले चेकपॉइंट को कॉपी कर लें। --save-total-limit 5 का मतलब यह भी है कि प्रशिक्षण आगे बढ़ने पर पुराने चेकपॉइंट हटा दिए जाते हैं, इसलिए स्टेप 5000 पर आप जो चेकपॉइंट चाहते थे, वह स्टेप 20000 पर मौजूद नहीं हो सकता है।

The AY-Robots training matrix with five policy models as rows and four robot arms as columns, each cell linking to a specific training guide
The /train matrix: five models against four arms. The GR00T N1.7 row also covers the SO-101, Koch v1.1 and LeKiwi.

चेकपॉइंट को वापस आर्म पर लाना

Isaac-GR00T ZMQ पर एक सर्वर-क्लाइंट विभाजन का उपयोग करता है। पॉलिसी GPU पर चलती है, और रोबोट मशीन पर एक पतला क्लाइंट अवलोकन भेजता है और एक्शन चंक्स प्राप्त करता है। SO-100 उदाहरण कॉपी करने के लिए पर्याप्त पूर्ण है: run_gr00t_server.py को अपने चेकपॉइंट और --embodiment-tag NEW_EMBODIMENT के साथ शुरू करें, फिर रोबोट की तरफ सीरियल पोर्ट, रोबोट आईडी, कैमरा इंडेक्स और भाषा निर्देश के साथ eval_so100.py चलाएँ। उस कमांड में कैमरा नाम आपके modality.json से अनुकूल नामों से मेल खाने चाहिए, न कि OS डिवाइस नंबरों से।

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 से अधिक नहीं होना चाहिए, और वह संख्या आपके मॉड्यूलरिटी कॉन्फ़िग में एक्शन डेल्टा_इंडेक्स की लंबाई है, न कि बेस मॉडल की। शिप किए गए SO-100 कॉन्फ़िग में 16 का अनुमान लगाया गया है, इसलिए 16 आपकी ऊपरी सीमा है; बेस nvidia/GR00T-N1.7-3B चेकपॉइंट 40 के लिए कॉन्फ़िगर किया गया है, और policy.md स्पष्ट रूप से कहता है कि फाइन-ट्यून किए गए चेकपॉइंट भिन्न हो सकते हैं। यदि आप इसे पार करते हैं तो आपको दोनों संख्याओं का नामकरण करते हुए एक ValueError मिलेगा। वास्तविक समय परिनियोजन के लिए दस्तावेज़ों द्वारा सुझाया गया मान 8 है। पुराना फ़्लैग नाम --action-horizon अभी भी काम करता है लेकिन चेतावनी देता है।
7.4 V, 12 V नहीं

जब आप आर्म को वापस तार रहे हों: SO-100, 7.4 V रेल पर Feetech STS3215 बस सर्वो चलाता है। उन्हें 12 V देना उन्हें नष्ट कर देता है, और यह एक आसान गलती है यदि आपके पास LeKiwi भी है, जिसका बेस 12 V पर चलता है जबकि उसका आर्म नहीं। पहली बार पावर-अप करने से पहले आपूर्ति की जाँच करें, धुएं के बाद नहीं। SO-100 हार्डवेयर पेज और LeKiwi के मुकाबले SO-100 देखें। यदि आर्म चालू हो जाता है लेकिन कुछ भी नहीं चलता है, तो सर्वो प्रतिक्रिया नहीं दे रहा है से शुरुआत करें।

अब नीति कहाँ चलती है, इसके बारे में ईमानदार बात, क्योंकि प्रशिक्षण और सेवा के लिए अलग-अलग हार्डवेयर आवश्यकताएँ हैं। फाइन-ट्यूनिंग के लिए 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 तक पहुंच प्रदान नहीं की गई है, या आपने प्रमाणीकरण नहीं किया है। यह GPU घड़ी के पहले ही शुरू होने के बाद होता है।
  • लोड होने पर डेटासेट अस्वीकृत। लगभग हमेशा एक v3.0 डेटासेट होता है। इसे निचले संस्करण में बदलें। देखें v3 के रूप में अस्वीकृत डेटासेट
  • गलत बूलियन आयामों के बारे में IndexError। आपने delta_indices बदल दिए और आँकड़े फिर से उत्पन्न नहीं किए।
  • बैच 32 पर मेमोरी से बाहर। --global-batch-size कम करें और --gradient-accumulation-steps बढ़ाएँ, या --num-shards-per-epoch कम करें, जिसकी कॉन्फ़िग स्पष्ट रूप से VRAM सीमित होने पर सलाह देती है। देखें प्रशिक्षण के दौरान मेमोरी से बाहर
  • हानि कम होती है, नीति कुछ नहीं करती। डिफ़ॉल्ट रूप से कोई सत्यापन विभाजन नहीं होता है, इसलिए एक स्वच्छ प्रशिक्षण वक्र बहुत कम साबित करता है। यह पृष्ठ निदान को कवर करता है।
  • आपके सेटअप में काम करता है और कहीं नहीं। एक ही प्रकाश व्यवस्था की स्थिति में फिल्माए गए छोटे डेटासेट के साथ अपेक्षित। NVIDIA रंग जिटर ऑग्मेंटेशन के साथ-साथ विभिन्न प्रकाश व्यवस्था में 20 से 50 एपिसोड की सलाह देता है। अधिक जानकारी यहाँ
  • ग्रिपर कभी ठीक से बंद नहीं होता। जांचें कि action_configs में ग्रिपर एक्शन ABSOLUTE है और आर्म जॉइंट्स RELATIVE हैं, इसी क्रम में। ग्रिपर बंद नहीं होता अन्य कारणों को सूचीबद्ध करता है।
  • रिकॉर्डिंग के बीच में एक कैमरा चुपचाप बंद हो जाता है। एपिसोड अभी भी सहेजता है और वीडियो कुंजी अभी भी मौजूद है, यही कारण है कि यह समस्या गंभीर है। कैमरा डिटेक्ट नहीं हुआ इसे कवर करता है।

विफलता मोड का पूरा सूचकांक पर रहता है। यदि आप किसी एक मॉडल को डीबग करने के बजाय मॉडलों के बीच चयन कर रहे हैं, तो और में संलग्न स्रोतों के साथ बेंचमार्क संख्याएँ हैं, और वह तुलना है जिसकी अधिकांश लोगों को वास्तव में आवश्यकता होती है, क्योंकि यह आपके डेस्क के नीचे कार्ड पर प्रशिक्षित किए जा सकने वाले मॉडल और 80 GB नोड किराए पर लेकर फाइन-ट्यून किए जाने वाले मॉडल के बीच का चुनाव है। इन मॉडलों के ऐसे व्यवहार करने के पीछे की पृष्ठभूमि के लिए, और पहले पढ़ने लायक हैं। और यदि आपके पास अभी तक कोई आर्म नहीं है, तो बिना साइनअप के एक भौतिक SO-100 स्ट्रीम करता है।

GR00T N1.7 को फाइन-ट्यून करने से पहले मुझे कितने एपिसोड की आवश्यकता है?

AY-Robots groot1.7 ट्रेनर के लिए 50 एपिसोड की एक कठोर न्यूनतम सीमा निर्धारित करता है। NVIDIA का अपना FAQ अधिक मांग वाला है: एक निश्चित स्थान पर एक साधारण पिक एंड प्लेस के लिए लगभग 100 प्रक्षेपवक्र, जटिल या बहु-चरणीय दृश्यों के लिए 500 या अधिक, और सूक्ष्म हेरफेर के लिए 100 से 500। 50 से कम होने पर आप हाइपरपैरामीटर ट्यून करने की तुलना में अधिक डेटा रिकॉर्ड करना लगभग हमेशा बेहतर होता है। यदि उसके बाद सफलता स्थिर हो जाती है, तो NVIDIA HG-DAgger की सलाह देता है: नीति चलाएँ, जब वह विफल हो तो हस्तक्षेप करें, और उन सुधारों को डेटासेट में जोड़ें।

मेरा डेटासेट लोड क्यों नहीं होता, और मैं कैसे बताऊँ कि यह कौन सा संस्करण है?

meta/info.json खोलें और codebase_version पढ़ें। LeRobot का मुख्य पर वर्तमान CODEBASE_VERSION v3.0 है, इसलिए हाल के टूलचेन के साथ रिकॉर्ड किया गया कुछ भी v3.0 है, और GR00T लोडर v2 की अपेक्षा करता है। Isaac-GR00T रेपो से scripts/lerobot_conversion/convert_v3_to_v2.py के साथ परिवर्तित करें, जो परिवर्तित डेटासेट में codebase_version: v2.1 लिखता है। स्क्रिप्ट अपने स्वयं के वर्चुअलएनवी में चलती है क्योंकि इसे GR00T पिन की तुलना में एक अलग lerobot संस्करण की आवश्यकता होती है।

क्या मैं RTX 4090 पर GR00T N1.7 को फाइन-ट्यून कर सकता हूँ?

नहीं। 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 पर प्रशिक्षित कर सकते हैं, तो वह लगभग 450 M पैरामीटर पर SmolVLA या लगभग 80 M पर ACT है।

समान फ़्लैग के साथ दो रन अलग-अलग चेकपॉइंट क्यों देते हैं?

क्योंकि launch_finetune.py में कोई सीड नहीं है। यह एक डेटाक्लास से उत्पन्न एक टायरो सीएलआई है जिसमें कोई सीड फ़ील्ड नहीं है, इसलिए कुछ भी RNG को पिन नहीं करता है। रेपो अलग से गैर-नियतात्मक छवि संवर्द्धन के कारण रन के बीच 5 से 6 प्रतिशत भिन्नता नोट करता है। यदि पुनरुत्पादनशीलता मायने रखती है, तो इसके बजाय LeRobot मार्ग का उपयोग करें: lerobot-train --seed लेता है और प्रकाशित GR00T रेसिपी --seed=42 पास करती है।

क्या मुझे Isaac-GR00T या lerobot-train का उपयोग करना चाहिए?

यदि आप संदर्भ कार्यान्वयन, एक्शन प्रतिनिधित्व पर प्रति-कुंजी नियंत्रण, TensorRT निर्यात, या अपने स्वयं के डेटा पर भरोसा करने से पहले बेंचमार्क उदाहरणों को पुन: उत्पन्न करना चाहते हैं तो Isaac-GR00T का उपयोग करें। यदि आपका डेटासेट पहले से ही LeRobot v3.0 है और आप इसे परिवर्तित नहीं करना चाहते हैं, यदि आप एक सीड चाहते हैं, या यदि आपके स्टैक का बाकी हिस्सा पहले से ही LeRobot है तो lerobot-train का उपयोग करें। दोनों एक ही nvidia/GR00T-N1.7-3B वज़न को फाइन-ट्यून करते हैं। ध्यान दें कि LeRobot ने GR00T N1.5 समर्थन पूरी तरह से छोड़ दिया है: N1.5 चेकपॉइंट्स को एक माइग्रेशन नोट के साथ अस्वीकार कर दिया जाता है, और आपको उनका उपयोग जारी रखने के लिए lerobot==0.5.1 को पिन करना होगा।

क्या मुझे फ्रंट कैमरे के साथ-साथ एक रिस्ट कैमरे की भी आवश्यकता है?

शिप की गई SO-100 कॉन्फ़िगरेशन दोनों का उपयोग करती है, और modality.json फ्रंट और रिस्ट को अलग-अलग वीडियो कुंजियों के रूप में मैप करता है। आप एक कैमरे के साथ प्रशिक्षित कर सकते हैं, और मॉडल कार्ड की विलंबता तालिका को एक कैमरे के साथ मापा जाता है, लेकिन रिस्ट व्यू ही वह है जो संपर्क के क्षण में ग्रिपर के बारे में नीति को उपयोगी जानकारी देता है। यदि आपके रोलआउट में ग्रिपर गलत समय पर बंद होता है, तो एक गायब या खराब तरीके से लक्षित रिस्ट कैमरा जांचने वाली पहली चीजों में से एक है।

पहले वातावरण बनाए बिना अपने SO-100 पर GR00T N1.7 को फाइन-ट्यून करें

एक फॉर्म में मॉडल, डेटासेट और हाइपरपैरामीटर चुनें। बैकएंड स्पॉट मार्केट पर एक A100 80 GB या H100 किराए पर लेता है, बैच 32, लर्निंग रेट 1e-4 और 20000 स्टेप्स के साथ ट्रेनर चलाता है, और चेकपॉइंट्स को ऑब्जेक्ट स्टोरेज में लिखता है। प्रति रन लगभग 4 से 12 USD।

GR00T N1.7 प्रशिक्षण मार्गदर्शिका खोलें

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started