
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 यह बताता है कि क्या अपग्रेड आपकी पाइपलाइन को फिर से बनाने को उचित ठहराता है।
| Property | Value | Where 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.0 | Isaac-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 उन्हें साथ-साथ रखते हैं।

कुछ भी टाइप करने से पहले रन को क्या चाहिए
| आवश्यकता | फाइन-ट्यूनिंग | अनुमान |
|---|---|---|
| VRAM, NVIDIA मार्गदर्शन | 40 GB या अधिक, H100 या L40 अनुशंसित | 16 GB या अधिक, एक RTX 4090 काम करता है |
| dGPU पर Python और CUDA | 3.12 and CUDA 12.8 | 3.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 uv | uv |
| 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 पारकेट फ़ाइलें और कैमरा स्ट्रीम लिखता है। यदि कैलिब्रेशन बंद है, तो आपके डेटासेट में संयुक्त मान उस रोबोट से थोड़ा अलग रोबोट का वर्णन करते हैं जो बाद में पॉलिसी को निष्पादित करेगा, और कोई भी प्रशिक्षण इसे ठीक नहीं कर सकता है।
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=trueLeRobot की अपनी सलाह है कि कम से कम 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 डेटासेट शब्दावली प्रविष्टि बताती है कि वास्तव में इसके अंदर क्या है।
# 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, data/chunk-000/ के तहत पारके फाइलें, videos/chunk-000/observation.images.
चरण 2: modality.json, वे छह संख्याएँ जो सब कुछ तय करती हैं
एक LeRobot डेटासेट में रोबोट की स्थिति और क्रिया को फ्लैट float32 एरे के रूप में संग्रहीत किया जाता है। एक SO-100 के लिए दोनों का आकार [6] होता है: पाँच आर्म जॉइंट्स और एक ग्रिपर। डेमो डेटासेट उन्हें shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos नाम देता है, लेकिन वे नाम info.json में रहते हैं और पारके फाइल में कुछ भी यह नहीं बताता कि कौन सा इंडेक्स कौन सा है। 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 फ़ॉर्म |
|---|---|---|
| पार्केट कॉलम | data/chunk-*/episode_*.parquet | annotation.human.task_description |
| modality.json कुंजी | meta/modality.json, under "annotation", without the annotation. prefix | human.task_description |
| डेटा कॉन्फ़िग में modality_keys | your so100_config.py | annotation.human.task_description |
annotation. के बाद के खंड डेटासेट के लेखक द्वारा चुने जाते हैं। SO-100 डेमो डेटा annotation.human.task_description का उपयोग करता है; LIBERO और SimplerEnv annotation.human.action.task_description का उपयोग करते हैं। दोनों मान्य हैं। यदि आपने LIBERO उदाहरण से एक कॉन्फ़िग कॉपी किया और उसे अपनी SO-100 रिकॉर्डिंग पर इंगित किया, तो भाषा चैनल कुछ भी नहीं सुलझाता है और मॉडल एक खाली निर्देश पर प्रशिक्षित होता है। हानि फिर भी कम होती है। नीति फिर भी कुछ करती है। यह बस उस बात को अनदेखा कर देती है जो आपने उसे करने के लिए कहा था।
चरण 3: डेटा कॉन्फ़िग, सापेक्ष आर्म और निरपेक्ष ग्रिपर
मोडेलिटी कॉन्फ़िग JSON के बजाय एक Python फ़ाइल है, क्योंकि यह यह भी तय करती है कि प्रत्येक एक्शन ग्रुप को कैसे दर्शाया जाता है। यह N1.7 वर्कफ़्लो का वह हिस्सा है जो N1.5 में उसी रूप में मौजूद नहीं था, और वह हिस्सा जिसे दो बार पढ़ना उचित है। शिप किए गए SO-100 कॉन्फ़िग पांच आर्म जॉइंट्स को वर्तमान स्थिति से रिलेटिव डेल्टा के रूप में और ग्रिपर को एक एब्सोल्यूट लक्ष्य स्थिति के रूप में अनुमानित करता है, क्योंकि एक बाइनरी ओपन-या-क्लोज्ड सिग्नल डेल्टा की तुलना में लक्ष्य के रूप में बेहतर व्यवहार करता है।
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.embodiment_tags import EmbodimentTag
from gr00t.data.types import (
ActionConfig, ActionFormat, ActionRepresentation, ActionType, ModalityConfig,
)
so100_config = {
"video": ModalityConfig(
delta_indices=[0], # current frame only
modality_keys=["front", "wrist"], # must match modality.json
),
"state": ModalityConfig(
delta_indices=[0],
modality_keys=["single_arm", "gripper"],
),
"action": ModalityConfig(
delta_indices=list(range(0, 16)), # predict 16 future steps
modality_keys=["single_arm", "gripper"],
action_configs=[
ActionConfig(rep=ActionRepresentation.RELATIVE, # arm joints
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT),
ActionConfig(rep=ActionRepresentation.ABSOLUTE, # gripper
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT),
],
),
"language": ModalityConfig(
delta_indices=[0],
modality_keys=["annotation.human.task_description"],
),
}
register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)यहां दो विवरण हैं जो आपको पता न होने पर एक दिन का नुकसान करा सकते हैं। पहला, action_configs स्थितिजन्य है: दस्तावेज़ों को modality_keys के समान लंबाई और समान क्रम की आवश्यकता होती है, और वे इसे गलत करने के परिणाम के बारे में स्पष्ट हैं, जो यह है कि गलत प्रतिनिधित्व चुपचाप लागू हो जाता है। आपका ग्रिपर डेल्टा के रूप में प्रशिक्षित होता है और आपकी भुजा एक पूर्ण लक्ष्य के रूप में, और कोई त्रुटि संदेश नहीं होता है। दूसरा, register_modality_config यह दावा करता है कि टैग पहले से पंजीकृत नहीं है, इसलिए उसी Python प्रक्रिया में दूसरा 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 में किसी भी बदलाव के बाद इसे चलाएं।
चरण 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-पिन किए गए व्हील को फिर से मान्य कर रहा है जो पहले से ही कैश किया गया है, और इसमें दो या तीन सेकंड लगते हैं।
- 1git-lfs स्थापित करें, फिर सबमॉड्यूल के साथ क्लोन करें
git-lfs आवश्यक है, वैकल्पिक नहीं। इसके बिना 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')" - 3Hugging Face के विरुद्ध प्रमाणित करें
इसे पहले प्रशिक्षण लॉन्च से पहले करें, न कि आठ मिनट बाद विफल होने पर।
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4भेजे गए SO-100 डेमो डेटा पर सैनिटी-चेक
अपनी खुद की रिकॉर्डिंग को छूने से पहले, demo_data/cube_to_bowl_5 पर 2000 चरण चलाएँ। इसमें पाँच एपिसोड हैं, यह तेज़ी से समाप्त होता है, और यह आपके डेटा के बजाय वातावरण को सिद्ध करता है। यदि यह रन विफल हो जाता है, तो आपके डेटासेट के लिए कुछ भी मदद नहीं करेगा।
bashCUDA_VISIBLE_DEVICES=0 uv run python \ gr00t/experiment/launch_finetune.py \ --base-model-path nvidia/GR00T-N1.7-3B \ --dataset-path demo_data/cube_to_bowl_5 \ --embodiment-tag NEW_EMBODIMENT \ --modality-config-path examples/SO100/so100_config.py \ --num-gpus 1 \ --output-dir /tmp/test_finetune \ --max-steps 2000 \ --global-batch-size 32 \ --dataloader-num-workers 4
FFmpeg 8. torchcodec 0.8.0 केवल FFmpeg 4 से 7 का समर्थन करता है, और Ubuntu 25.10 और बाद के संस्करण 8 के साथ आते हैं। त्रुटि Could not load libtorchcodec है, जो संस्करण संघर्ष के बजाय एक टूटी हुई इंस्टॉलेशन की तरह लगती है। एक पुराना रनटाइम स्थापित करें, उदाहरण के लिए conda install -c conda-forge 'ffmpeg<8', और इसकी लाइब्रेरीज़ को LD_LIBRARY_PATH पर रखें। CUDA_HOME अनसेट है। फाइन-ट्यूनिंग पूरी तरह से विफल हो जाती है। bash scripts/deployment/dgpu/install_deps.sh को एक बार चलाएँ, या बस export CUDA_HOME=/usr/local/cuda।
चरण 5: फाइन-ट्यून कमांड और इसके फ़्लैग वास्तव में डिफ़ॉल्ट रूप से क्या होते हैं
डेमो डेटासेट को अपने डेटासेट से बदलें और वे नॉब जोड़ें जो आप वास्तव में चाहते हैं। नीचे वह पूर्ण रूप है जिसका उपयोग रिपॉजिटरी अपने नए-एम्बॉडमेंट ट्यूटोरियल में करती है, जिसमें ऑग्मेंटेशन और चेकपॉइंटिंग फ़्लैग शामिल हैं जिन्हें संक्षिप्त README उदाहरण छोड़ देता है। यह संकीर्ण अर्थ में है: भाषा बैकबोन और विज़ुअल एनकोडर जमे रहते हैं, और जो प्रशिक्षित होता है वह प्रोजेक्टर और डिफ्यूजन एक्शन हेड है।
export NUM_GPUS=1
CUDA_VISIBLE_DEVICES=0 uv run python \
gr00t/experiment/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.7-3B \
--dataset-path ./my_dataset_lerobot \
--embodiment-tag NEW_EMBODIMENT \
--modality-config-path examples/SO100/so100_config.py \
--num-gpus $NUM_GPUS \
--output-dir /tmp/so100 \
--save-total-limit 5 \
--save-steps 2000 \
--max-steps 20000 \
--use-wandb \
--global-batch-size 32 \
--color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \
--dataloader-num-workers 4| फ़्लैग | FinetuneConfig में डिफ़ॉल्ट | यह क्या करता है |
|---|---|---|
| --global-batch-size | 64 | ग्रेडिएंट एक्यूमुलेशन से पहले सभी जीपीयू में कुल बैच। दिए गए उदाहरण 32 का उपयोग करते हैं। |
| --learning-rate | 1e-4 | वही मान जो AY-Robots अपने groot1.7 ट्रेनर के लिए भेजता है। |
| --max-steps | 10000 | कुल ऑप्टिमाइज़र स्टेप्स। examples/finetune.sh रैपर भी डिफ़ॉल्ट रूप से 10000 पर सेट होता है। |
| --gradient-accumulation-steps | 1 | प्रभावी बैच को गुणा करता है। 1 से ऊपर के मान एक चेतावनी देते हैं जो आपको संचित आकार बताता है। |
| --save-steps and --save-total-limit | 1000 and 5 | चेकपॉइंट आवृत्ति, और कितने रखे जाते हैं। पुराने वाले हटा दिए जाते हैं। |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | examples/finetune.sh द्वारा भी स्पष्ट रूप से सेट किया गया है। |
| --state-dropout-prob | CLI में 0.2, मॉडल कॉन्फ़िग में 0.8 | प्रशिक्षण के दौरान प्रोप्रियोसेप्टिव स्थिति को यादृच्छिक रूप से छोड़ देता है। यदि आपका कार्य स्थिति पर निर्भर करता है तो इसे कम करें। |
| --tune-llm and --tune-visual | False and False | बैकबोन डिफ़ॉल्ट रूप से जमे रहते हैं। |
| --tune-projector and --tune-diffusion-model | True and True | प्रोजेक्टर और डिफ्यूजन एक्शन हेड ही वास्तव में प्रशिक्षित होते हैं। |
| --use-percentiles | True | कच्चे न्यूनतम और अधिकतम के बजाय q01 और q99 के साथ सामान्यीकृत करें। |
| --dataloader-num-workers | 2 | लोडर डिज़ाइन द्वारा सीपीयू-आधारित है। उदाहरण इसे 4 तक बढ़ाते हैं। |
| --seed | मौजूद नहीं है | इस 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.7 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| GR00T N1.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| Pi0.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| SmolVLA | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 30 |
| ACT | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 50 |
50 का-एपिसोड न्यूनतम एक आधार है, लक्ष्य नहीं। NVIDIA का अपना FAQ अधिक मांग वाला है: एक साधारण निश्चित-स्थान पिक एंड प्लेस के लिए लगभग 100 ट्रेजेक्टरी, जटिल या बहु-चरणीय दृश्यों के लिए 500 या अधिक, और सूक्ष्म हेरफेर के लिए 100 से 500। यदि आप 20 एपिसोड पर हैं, तो शाम को ट्यूनिंग करने के बजाय दोपहर रिकॉर्डिंग में बिताएं। डेटा संग्रह गाइड बताता है कि एक उपयोगी एपिसोड को बेकार एपिसोड से क्या अलग करता है, अपना पहला डेटासेट रिकॉर्ड करें इसका संक्षिप्त संस्करण है, और SO-100 डेटा संग्रह आर्म-विशिष्ट संस्करण है।

चरण 6: हाथ को छूने से पहले ओपन-लूप मूल्यांकन
ताज़ा चेकपॉइंट किसी भौतिक आर्म पर यह जानने के लिए न डालें कि प्रशिक्षण काम किया या नहीं। पहले ओपन-लूप मूल्यांकन चलाएँ। यह एक रिकॉर्ड किए गए एपिसोड को फिर से चलाता है, मॉडल से प्रत्येक चरण पर क्रियाओं के लिए पूछता है, और MSE और MAE के साथ ग्राउंड ट्रुथ के मुकाबले भविष्यवाणी को प्लॉट करता है। इसमें कुछ भी खर्च नहीं होता है और यह चरण 2 और 3 से मैपिंग की गलतियों को पकड़ लेता है।
uv run python gr00t/eval/open_loop_eval.py \
--dataset-path ./my_dataset_lerobot \
--embodiment-tag NEW_EMBODIMENT \
--model-path /tmp/so100/checkpoint-20000 \
--traj-ids 0 \
--execution-horizon 16 \
--steps 400 \
--modality-keys single_arm gripperरिपॉजिटरी जानबूझकर कस्टम डेटा के लिए एक लक्ष्य MSE प्रकाशित करने से इनकार करती है, और यह सही निर्णय है: यह संख्या आपकी एक्शन इकाइयों, आपके कार्य और आपके डेटासेट के आकार पर निर्भर करती है, इसलिए किसी और के आर्म से कॉपी की गई सीमा का कोई मतलब नहीं है। जो सार्थक है वह प्रवृत्ति है। यहां वह संदर्भ रन है जिसे रेपो एक सिंगल H100 पर पांच-एपिसोड डेमो डेटासेट और 2000 चरणों के साथ दस्तावेज़ित करता है।
| चेकपॉइंट | traj 0 पर औसत MSE | traj 0 पर औसत MAE |
|---|---|---|
| 500 | 87.5 | 5.63 |
| 1000 | 25.4 | 3.30 |
| 1500 | 13.2 | 2.18 |
| 2000 | 10.0 | 1.76 |
आकृति ही संकेत है, निरपेक्ष मान नहीं। त्रुटि लगातार कम होनी चाहिए जैसे-जैसे प्रशिक्षण चरण जमा होते हैं। केवल प्रक्षेपवक्र 0 के बजाय सभी पाँच प्रशिक्षण एपिसोड पर औसत निकालने पर, रेपो के अंतिम चेकपॉइंट ने लगभग 7.5 MSE और 1.5 MAE स्कोर किया, इसलिए संदर्भ रन भी इस बात पर निर्भर करता है कि आप किन एपिसोड का औसत निकालते हैं। अपने डेटा में कुछ भी बदलने से पहले अपरिवर्तित डेमो कमांड पर अपनी खुद की बेसलाइन रिकॉर्ड करें: यदि आप एक ज्ञात-अच्छे रन को पुन: उत्पन्न नहीं कर सकते हैं, तो आप सेटअप की गलती को डेटा समस्या से अलग नहीं कर सकते। रिपॉजिटरी सामान्य लक्षणों को कारणों से भी जोड़ती है, और उनमें से हर एक मॉडल बग के बजाय परिचालन संबंधी है।
| लक्षण | संभावित कारण |
|---|---|
| चेकपॉइंट्स में MSE सपाट या बढ़ रहा है | लर्निंग रेट बहुत कम है, या डेटा बिल्कुल लोड नहीं हो रहा है। --dataset-path और डेटालोडर वर्कर्स की जाँच करें। |
| भविष्यवाणी वक्र सपाट या स्थिर है | modality.json कुंजियाँ या --modality-config-path मेल नहीं खाते। एक्शन कुंजियाँ मैप नहीं की गई हैं। |
| MSE बहुत अधिक है, या प्रशिक्षण के दौरान NaN लॉस | एक्शन और स्टेट नॉर्मलाइजेशन। meta/stats और एक्शन रेंज के भौतिक रूप से प्रशंसनीय होने की पुष्टि करें। |
| traj 0 पर अच्छा, रोके गए एपिसोड पर खराब | डेटा की कमी, बग नहीं। पाँच डेमो एपिसोड सामान्यीकरण नहीं कर सकते। |
दूसरा मार्ग: 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 को प्रकाशित हुई थी।
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 |
|---|---|---|
| Dataset version | LeRobot v2 केवल, रूपांतरण आवश्यक | नेटिव लेरोबोट डेटासेट, कोई डाउनग्रेड नहीं |
| Modality mapping | meta/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 path | ZMQ पर run_gr00t_server.py और eval_so100.py | lerobot-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 किराए पर लेते हैं और हर कदम के मालिक होते हैं। यथार्थवादी रूप से, पहली बार में इसमें एक दोपहर लगती है और उसके बाद हर बार बीस मिनट।
- SO-100 पर lerobot-record के साथ एपिसोड रिकॉर्ड करें। आपको एक LeRobot v3.0 डेटासेट मिलता है।
- इसे अपने वर्चुअलएनवी में scripts/lerobot_conversion/convert_v3_to_v2.py का उपयोग करके v2.1 में बदलें।
- meta/modality.json और एक Python मोडेलिटी कॉन्फ़िग लिखें, जिसे EmbodimentTag.NEW_EMBODIMENT के तहत पंजीकृत किया गया हो।
- एक 80 GB कार्ड किराए पर लें, सबमॉड्यूल के साथ क्लोन करें, uv सिंक करें, Hugging Face के विरुद्ध प्रमाणित करें।
- launch_finetune.py चलाएँ, फिर कई चेकपॉइंट्स पर open_loop_eval.py चलाएँ, और हार्डवेयर को छूने से पहले MSE प्रवृत्ति की तुलना करें।
- इंस्टेंस को नष्ट करने से पहले मशीन से चेकपॉइंट खींच लें, फिर आर्म तक सर्विंग पाथ बनाएँ।
किराए के इंस्टेंस को बंद करने से पहले चेकपॉइंट को कॉपी कर लें। --save-total-limit 5 का मतलब यह भी है कि प्रशिक्षण आगे बढ़ने पर पुराने चेकपॉइंट हटा दिए जाते हैं, इसलिए स्टेप 5000 पर आप जो चेकपॉइंट चाहते थे, वह स्टेप 20000 पर मौजूद नहीं हो सकता है।
एक फॉर्म के रूप में वही काम। आप मॉडल और डेटासेट चुनते हैं, बैकएंड आवश्यक VRAM के अनुसार स्पॉट मार्केट पर एक GPU किराए पर लेता है, ट्रेनर चलाता है, और चेकपॉइंट्स को ऑब्जेक्ट स्टोरेज में लिखता है। GR00T N1.7 on SO-100 गाइड यही सटीक संयोजन है; प्रशिक्षण मैट्रिक्स में हर दूसरा मॉडल और आर्म पेयरिंग है, जिसमें SO-101 पर GR00T N1.7 शामिल है।
| groot1.7 ट्रेनर क्या भेजता है | मान |
|---|---|
| बैच आकार | 32 |
| लर्निंग रेट | 1e-4 |
| अधिकतम स्टेप्स | 20000 |
| ग्रेडिएंट एक्यूमुलेशन | 1, और यह इस ट्रेनर के लिए प्रभावी होता है |
| फॉर्म में उजागर अतिरिक्त नॉब | 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 की आवश्यकता भी समाप्त नहीं होती है, क्योंकि GR00T लोडर इसे स्वीकार करने से पहले एक v3.0 डेटासेट को अभी भी परिवर्तित करना होगा। और कोई भी आपके लिए modality.json सिमेंटिक्स नहीं लिखता है: यदि आपकी कैमरा कुंजियाँ या आपकी भाषा कुंजी गलत हैं, तो वे दोनों मार्गों पर गलत होंगी। बैकएंड आपकी ओर से क्या करता है और क्या नहीं करता है, इसके लिए प्रशिक्षण दस्तावेज़ देखें।

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