
SO-100 LeRobot डेटासेटमा NVIDIA GR00T N1.7 को फाइन-ट्यूनिङका लागि परीक्षण गरिएको विस्तृत मार्गनिर्देशन: वास्तविक फ्ल्यागहरू, modality.json, v2.1 आवश्यकता, एक रनको लागत, र चुनौतीहरू।
NVIDIA ले तपाईंसँग भएको पाखुराको लागि ठीक फाइन-ट्यूनिङ उदाहरण पठाउँछ। भित्र Isaac-GR00T भण्डार एउटा फोल्डर छ जसलाई भनिन्छ demo_data/cube_to_bowl_5: पाँच एपिसोड, 30 fps मा 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 (n1.7-release लाइन) सम्मको Isaac-GR00T मुख्य शाखा र 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 बाट Eagle ब्याकबोन हटाइएको छ, र यसको सट्टा nvidia/Cosmos-Reason2-2B लाई Qwen3-VL आर्किटेक्चरमा राखिएको छ, र यो मोडेल रोबोट डेटाको अतिरिक्त लगभग 20,000 घण्टाको इगोसेन्ट्रिक मानव भिडियोमा प्रिट्रेन गरिएको थियो। NVIDIA को आफ्नै रिपोर्टले यो संख्या 20,854 घण्टा रहेको बताउँछ र 1k बाट 20k घण्टामा जाँदा औसत कार्य सम्पन्नता दोब्बर भन्दा बढी हुने रिपोर्ट गर्छ।
दोस्रो आधा पनि परिवर्तन भयो, जुन तपाईंको सञ्चालनका लागि महत्त्वपूर्ण छ। एक्शन हेड 32 डिफ्युजन लेयरबाट 16 मा झर्यो, अनुमानित एक्शन चङ्क 16 स्टेपबाट 40 मा बढ्यो, र अधिकतम स्टेट र एक्शन चौडाइ 29 बाट 132 मा गयो। यी तीन संख्याहरू रिपोजिटरी README मा रहेको चेन्जलगबाट आएका हुन्; NVIDIA को आफ्नै लन्च पोस्टले अझै पनि System 1 लाई 32-लेयर DiT को रूपमा वर्णन गर्दछ, त्यसैले जहाँ दुई फरक पर्छन्, तपाईंले क्लोन गर्न लागेको रेपोलाई विश्वास गर्नुहोस्। कार्यहरू पूर्वनिर्धारित रूपमा सापेक्षिक एन्ड-इफेक्टर स्पेसमा व्यक्त गरिन्छ, जुन हालको पोजबाट डेल्टा हुन् न कि निरपेक्ष लक्ष्यहरू, जसले मानव भिडियोबाट सिकेका म्यानिपुलेसन प्रायरहरूलाई रोबोट नियन्त्रणमा स्थानान्तरण गर्न दिन्छ। हेड आफैं एउटा फ्लो-म्याचिङ डिफ्युजन ट्रान्सफर्मर हो, जुन Pi0.5 जस्तै परिवारको हो तर यसको अगाडि फरक ब्याकबोन छ। यदि तपाईं अझै अघिल्लो जेनेरेसनमा हुनुहुन्छ भने, N1.7 बनाम N1.5 ले अपग्रेडले तपाईंको पाइपलाइन पुन: निर्माण गर्न लायक छ कि छैन भनेर बताउँछ।
| गुण | मान | स्रोत |
|---|---|---|
| प्यारामिटरहरू | 3,000,000,000 | Hugging Face मोडेल कार्ड |
| भिजन-भाषा ब्याकबोन | nvidia/Cosmos-Reason2-2B (Qwen3-VL), Hugging Face मा गेट गरिएको | 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 रिपोजिटरी |
| वेट्स लाइसेन्स | NVIDIA Open Model License Agreement | मोडेल कार्ड |
| लेटेंसी, H100 80 GB, PyTorch eager, 4 डिनोइजिङ स्टेप, 1 क्यामेरा | 85.8 ms एन्ड-टु-एन्ड, 11.7 Hz | मोडेल कार्ड टाइमिङ तालिका |
| उही हार्डवेयर, TensorRT पूर्ण पाइपलाइन | 27.9 ms एन्ड-टु-एन्ड, 35.9 Hz | मोडेल कार्ड टाइमिङ तालिका |
| AY-Robots ले यसको सेवा गरिएको GR00T N1.7 को लागि उद्धृत गरेको लेटेंसी | 152 ms प्रति एक्शन स्टेप | AY-Robots नीति सूची |
ती अन्तिम तीन पङ्क्तिहरूले मानिसहरूले रिपोर्ट गर्ने अधिकांश निराशाको व्याख्या गर्छन्। हेडलाइन 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 पहुँच | approved for 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 निर्यात गर्नुहोस्।
चरण ०: एपिसोडहरू आफैं
तलका सबै कुराले तपाईंले पहिले नै एपिसोडहरू रेकर्ड गरिसक्नुभएको छ भनी मान्दछ। यदि तपाईंले गर्नुभएको छैन भने, त्यो नै वास्तविक पहिलो चरण हो र यसले परिणाम कति राम्रो हुन सक्छ भन्ने निर्धारण गर्दछ, किनभने अनुकरण सिकाइ डेटामा नभएको जानकारी पुन: प्राप्त गर्न सक्दैन। पहिले दुवै हात क्यालिब्रेट गर्नुहोस्, त्यसपछि अनुयायीलाई नेता हात प्रयोग गरेर चलाउनुहोस् जब 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 ले आफ्नै pyproject बोक्छ जसले Python 3.10 वा 3.11 माग्छ र lerobot लाई एउटा git कमिटमा पिन गर्छ, जबकि Isaac-GR00T लाई Python 3.12 चाहिन्छ। रिपोजिटरीको रुटबाट कन्भर्टर स्थापना गर्नुहोस् र तपाईंले gr00t प्याकेज पाउनुहुनेछ, जुन यसको README ले चेतावनी दिएको गल्ती हो। यदि तपाईं ढाँचामा नयाँ हुनुहुन्छ भने, LeRobot डेटासेट शब्दावली प्रविष्टिले वास्तवमा यस भित्र के छ भनेर व्याख्या गर्दछ।
# from the Isaac-GR00T repo root
cd scripts/lerobot_conversion
uv venv
source .venv/bin/activate
uv pip install -e . --verbose
# pulls the dataset from the Hub and writes a v2.1 copy into the default cache
python convert_v3_to_v2.py --repo-id <your-hf-user>/<your-dataset>
# or, back in the repo root, keep it next to the SO-100 example
uv run --project scripts/lerobot_conversion \
python scripts/lerobot_conversion/convert_v3_to_v2.py \
--repo-id <your-hf-user>/<your-dataset> \
--root examples/SO100/my_dataset_lerobotयदि v3.0 डेटासेट पहिले नै स्थानीय रूपमा अवस्थित छ भने, स्क्रिप्टले यसको छेउमा v2.1 लेआउट बनाउँछ र त्यसपछि साट्छ: मूललाई संस्करण जोडिएको, <name>_v3.0, एक समान फोल्डरमा सारिन्छ, र रूपान्तरित प्रतिलिपिले मूल मार्ग लिन्छ। (स्क्रिप्टको आफ्नै डकस्ट्रिङले त्यो फोल्डरलाई _v30 भन्छ; कोडले संस्करण स्ट्रिङ जोड्छ, त्यसैले तपाईंले वास्तवमा _v3.0 पाउनुहुन्छ।) दोस्रो आश्चर्य: आउटपुट सधैं <root>/<repo-id> अन्तर्गत आउँछ, त्यसैले --root examples/SO100/my_dataset_lerobot ले तपाईंलाई examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset> दिन्छ, र त्यो लामो मार्ग नै हो जुन --dataset-path ले पछि चाहन्छ। जब कुनै प्रशिक्षण कार्यले संस्करणका कारण तपाईंको डेटासेट अस्वीकार गर्छ, v3 को रूपमा अस्वीकृत डेटासेट पृष्ठ ले सही लक्षणहरू सूचीबद्ध गर्दछ।
रूपान्तरण पछि GR00T ले चाहेको संरचना क्लासिक v2 लेआउट हो: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, parquet फाइलहरू अन्तर्गत data/chunk-000/, MP4 फाइलहरू अन्तर्गत videos/chunk-000/observation.images.
चरण २: modality.json, सबै कुरा निर्धारण गर्ने छ वटा संख्याहरू
LeRobot डेटासेटमा रोबोटको अवस्था र कार्यलाई फ्ल्याट float32 एरेको रूपमा भण्डारण गरिन्छ। SO-100 को लागि दुवैको आकार [6]: पाँच हातका जोइन्टहरू र एउटा ग्रिपर। डेमो डेटासेटले तिनीहरूलाई shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos, तर ती नामहरू info.json मा छन् र parquet फाइलमा कुन इन्डेक्स कुन हो भनी केही भनिएको छैन। meta/modality.json ले त्यो म्यापिङ प्रदान गर्दछ, र GR00T यस बिना तालिम दिनेछैन। SO-100 को लागि भण्डारले पठाएको यो म्यापिङ यहाँ जस्ताको तस्तै छ।
{
"state": {
"single_arm": {
"start": 0,
"end": 5
},
"gripper": {
"start": 5,
"end": 6
}
},
"action": {
"single_arm": {
"start": 0,
"end": 5
},
"gripper": {
"start": 5,
"end": 6
}
},
"video": {
"front": {
"original_key": "observation.images.front"
},
"wrist": {
"original_key": "observation.images.wrist"
}
},
"annotation": {
"human.task_description": {
"original_key": "task_index"
}
}
}यसलाई तपाईंको रूपान्तरित डेटासेटमा प्रतिलिपि गर्नुहोस् meta/modality.json र भिडियो कुञ्जीहरूलाई तपाईंको क्यामेराहरू वास्तवमा जे भनिन्छ, त्यही नाम दिनुहोस्। यदि तपाईंले एउटै ओभरहेड क्यामेरा प्रयोग गरेर रेकर्ड गर्नुभयो जसको नाम top, तब original_key हो observation.images.top र मैत्री नाम तपाईंको डेटा कन्फिगले सन्दर्भ गर्ने जे पनि हो। दुवै सहमत हुनुपर्छ, र तिनीहरूमध्ये कुनैले पनि तपाईंको लागि अर्कोलाई जाँच गर्दैन। भाषा एनोटेशन अझ खराब छ, किनभने एउटै कुञ्जी तीन ठाउँमा देखा पर्नुपर्छ।
| तह | फाइल | रेपोमा प्रयोग गरिएको SO-100 फारम |
|---|---|---|
| पार्केट स्तम्भ | 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 को सट्टा पाइथन फाइल हो, किनभने यसले प्रत्येक कार्य समूहलाई कसरी प्रतिनिधित्व गरिन्छ भन्ने पनि निर्णय गर्छ। यो N1.7 कार्यप्रवाहको त्यो भाग हो जुन N1.5 मा उही रूपमा अवस्थित थिएन, र यो दुई पटक पढ्न लायकको भाग हो। पठाइएको SO-100 कन्फिगले पाँचवटा आर्म जोइन्टहरूलाई RELATIVE हालको अवस्थाबाट डेल्टाको रूपमा र ग्रिपरलाई ABSOLUTE लक्ष्य स्थितिको रूपमा भविष्यवाणी गर्छ, किनभने बाइनरी खुला-वा-बन्द संकेत डेल्टाको सट्टा लक्ष्यको रूपमा राम्रो व्यवहार गर्छ।
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.embodiment_tags import EmbodimentTag
from gr00t.data.types import (
ActionConfig, ActionFormat, ActionRepresentation, ActionType, ModalityConfig,
)
so100_config = {
"video": ModalityConfig(
delta_indices=[0], # current frame only
modality_keys=["front", "wrist"], # must match modality.json
),
"state": ModalityConfig(
delta_indices=[0],
modality_keys=["single_arm", "gripper"],
),
"action": ModalityConfig(
delta_indices=list(range(0, 16)), # predict 16 future steps
modality_keys=["single_arm", "gripper"],
action_configs=[
ActionConfig(rep=ActionRepresentation.RELATIVE, # arm joints
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT),
ActionConfig(rep=ActionRepresentation.ABSOLUTE, # gripper
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT),
],
),
"language": ModalityConfig(
delta_indices=[0],
modality_keys=["annotation.human.task_description"],
),
}
register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)यहाँ दुईवटा विवरणहरू छन् जुन तपाईंलाई थाहा नभएमा एक दिन खर्च हुन सक्छ। पहिलो, action_configs स्थितिगत हुन्छ: कागजातहरूले modality_keys जस्तै लम्बाइ र उही क्रम आवश्यक पर्दछ, र तिनीहरूले गल्ती गर्दाको परिणामबारे स्पष्ट रूपमा बताउँछन्, जुन गलत प्रतिनिधित्व चुपचाप लागू हुन्छ। तपाईंको ग्रिपरलाई डेल्टाको रूपमा र तपाईंको पाखुरालाई निरपेक्ष लक्ष्यको रूपमा तालिम दिइन्छ, र त्यहाँ कुनै त्रुटि सन्देश हुँदैन। दोस्रो, register_modality_config ले ट्याग पहिले नै दर्ता नभएको दाबी गर्छ, त्यसैले एउटै पाइथन प्रक्रियामा दोस्रो NEW_EMBODIMENT कन्फिग Embodiment tag ... already registered सँग समाप्त हुन्छ। तपाईंले यी मध्ये दुईलाई एउटै स्क्रिप्टमा आयात गर्न सक्नुहुन्न। तेस्रो नियम पछि, डिप्लोयमेन्टमा लागू हुन्छ: कार्य delta_indices शून्यबाट सुरु हुने निरन्तर दायरा हुनुपर्छ। [0, 4, 8] जस्तो विरल विन्डो अस्वीकृत हुन्छ, किनभने डाउनस्ट्रीममा सबै कुराले अनुमानित खण्डलाई रैखिक रूपमा अनुक्रमणिका गर्छ र अन्यथा गलत पङ्क्तिहरू कार्यान्वयन गर्दछ।
सामान्यीकरण तथ्याङ्कहरू, विशेष गरी meta/relative_stats.json, तपाईंले तिनीहरूलाई उत्पन्न गर्दाको क्षितिज लम्बाइको लागि गणना गरिन्छ। पुन: उत्पन्न नगरी कार्य क्षितिजलाई 16 बाट 8 मा छोटो पार्नुहोस् र प्रशिक्षण IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16 सँग समाप्त हुन्छ। समाधान एउटा आदेश हो: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py। delta_indices मा कुनै पनि परिवर्तन पछि यसलाई चलाउनुहोस्।
चरण 4: वातावरण
N1.7 ले भण्डारलाई युभी र Python 3.12 मा सार्यो। पुरानो कोन्डा प्लस pip install -e . मार्ग अझै README को एक संकुचित खण्डमा अवस्थित छ, तर यसले GPU निर्भरताहरू जस्तै flash-attn र TensorRT लाई म्यानुअल स्थापना आवश्यक हुन सक्छ भनेर चेतावनी दिन्छ। यदि तपाईंसँग नगर्नुको कुनै विशेष कारण छैन भने uv प्रयोग गर्नुहोस्। flash-attn को सन्दर्भमा, एउटा विवरणले भ्रम बचाउँछ: तपाईंले Installing flash-attn प्रत्येक uv run मा छापिएको देख्नुहुनेछ। यो पुनर्निर्माण भइरहेको छैन। uv ले पहिले नै क्यास गरिएको URL-पिन गरिएको व्हीललाई पुन: प्रमाणीकरण गरिरहेको छ, र यसले दुई वा तीन सेकेन्ड लिन्छ।
- 1git-lfs स्थापना गर्नुहोस्, त्यसपछि सबमोड्युलहरूसँग क्लोन गर्नुहोस्
git-lfs आवश्यक छ, वैकल्पिक होइन। यस बिना demo_data/ मा भएका parquet फाइलहरू पोइन्टर स्टबको रूपमा आउँछन्, र फाइल सूचीमा उपस्थित देखिने डेटासेटमा डेमो रन असफल हुन्छ।
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2uv स्थापना गर्नुहोस् र वातावरण सिंक गर्नुहोस्
पूर्वनिर्धारित स्थापनाले flash-attn र TensorRT सहित GPU निर्भरताहरू तान्छ। नयाँ 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 उदाहरणले छोडेका वृद्धि (augmentation) र चेकपोइन्टिङ फ्ल्यागहरू पनि समावेश छन्। यो संकीर्ण अर्थमा हो: भाषा ब्याकबोन र भिजुअल एन्कोडर स्थिर रहन्छन्, र जुन तालिम हुन्छ त्यो प्रोजेक्टर र डिफ्युजन एक्शन हेड हो।
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| Flag | FinetuneConfig मा पूर्वनिर्धारित | यसले के गर्छ |
|---|---|---|
| --global-batch-size | 64 | ग्रेडियन्ट सञ्चय (gradient accumulation) अघि सबै GPU हरूमा कुल ब्याच। पठाइएका उदाहरणहरूले 32 प्रयोग गर्छन्। |
| --learning-rate | 1e-4 | AY-Robots ले आफ्नो groot1.7 ट्रेनरका लागि पठाउने समान मान। |
| --max-steps | 10000 | कुल अप्टिमाइजर चरणहरू। examples/finetune.sh र्यापर पनि 10000 मा पूर्वनिर्धारित हुन्छ। |
| --gradient-accumulation-steps | 1 | प्रभावी ब्याचलाई गुणन गर्छ। 1 भन्दा माथिका मानहरूले सञ्चित आकार बताउने चेतावनी दिन्छन्। |
| --save-steps and --save-total-limit | 1000 and 5 | चेकपोइन्ट आवृत्ति, र कति राखिन्छन्। पुरानाहरू मेटाइन्छन्। |
| --weight-decay and --warmup-ratio | 1e-5 and 0.05 | examples/finetune.sh द्वारा पनि स्पष्ट रूपमा सेट गरिएको छ। |
| --state-dropout-prob | 0.2 in the CLI, 0.8 in the model config | तालिमको क्रममा प्रोप्रियोसेप्टिभ अवस्थालाई अनियमित रूपमा छोड्छ। यदि तपाईंको कार्य अवस्थामा निर्भर छ भने यसलाई कम गर्नुहोस्। |
| --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 | लोडर डिजाइन अनुसार CPU-आधारित छ। उदाहरणहरूले यसलाई 4 मा बढाउँछन्। |
| --seed | does not exist | यस CLI मा कुनै सीड फ्ल्याग छैन। |
त्यो अन्तिम पङ्क्ति गल्ती होइन। launch_finetune.py एउटा डेटाक्लासबाट उत्पन्न भएको टायरो CLI हो, र त्यो डेटाक्लासमा कुनै सीड फिल्ड छैन। README ले गैर-निर्धारित छवि वृद्धि (non-deterministic image augmentation) को कारणले गर्दा रनहरू बीच ५ देखि ६ प्रतिशत भिन्नता रहेको छुट्टै उल्लेख गर्दछ। समान फ्ल्यागहरू भएका दुई रनहरूले समान चेकपोइन्टहरू उत्पादन गर्दैनन्, जुन हाइपरप्यारामिटर परिवर्तनले मद्दत गर्यो वा तपाईं भाग्यमानी हुनुभयो भनेर निर्णय गर्ने प्रयास गर्दा धेरै महत्त्वपूर्ण हुन्छ। तुलनाका लागि, lerobot को आफ्नै ट्रेनरले सीड 1000 मा पूर्वनिर्धारित गर्दछ, र LeRobot GR00T रेसिपीले --seed=42 स्पष्ट रूपमा पास गर्दछ।
फाइन-ट्यूनिङ eval_strategy="no" सँग चल्छ, त्यसैले त्यहाँ कुनै प्रमाणीकरण हानि वक्र (validation loss curve) छैन। तपाईंले प्रशिक्षण हानि (training loss) मात्र पाउनुहुन्छ र अरू केही होइन। नयाँ-इम्बोडिमेन्ट गाइडले तपाईंलाई --eval-strategy steps --eval-steps 500 सँग यसलाई अन गर्न भन्छ, तर त्यो फ्ल्याग launch_finetune.py मा अवस्थित छैन: CLI टायरोद्वारा FinetuneConfig डेटाक्लासबाट उत्पन्न हुन्छ, र eval_strategy, eval_steps र eval_batch_size TrainingConfig का फिल्डहरू हुन्। तिनीहरूका पूर्वनिर्धारित मानहरू "no", 500 र 2 हुन्। तिनीहरूलाई पहुँच गर्न, पूर्ण प्रवेश बिन्दु gr00t/experiment/launch_train.py प्रयोग गर्नुहोस्, जहाँ नेस्टेड फ्ल्याग --training.eval-strategy हो। जे भए पनि, आफैंमा घट्दो प्रशिक्षण हानि (training loss) ले सामान्यीकरण (generalization) बारे धेरै कम बताउँछ, जुन हानि घट्छ तर नीतिले केही गर्दैन मा वर्णन गरिएको अवस्था हो।
२००००-चरणको रनको लागत कति हुन्छ
GR00T N1.7 लाई ८० GB कार्ड चाहिन्छ, त्यसैले लागतको प्रश्नको सीमित उत्तर छ। AY-Robots मा groot1.7 ट्रेनर A100 80 GB वा H100 80 GB टियरमा चल्छ, जहाँ एक रनलाई स्पट बजारमा प्रति घण्टा 1.20 देखि 2.00 USD मा ३ देखि ६ घण्टा लाग्छ। पूर्वनिर्धारित २००००-चरणको कामको लागि त्यो लगभग 4 देखि 12 USD हो। मा समान कार्य SmolVLA वा ACT प्रति घण्टा 0.30 देखि 0.60 USD र प्रति रन 1 देखि 3 USD मा २४ GB कार्डमा हुन्छ। त्यो वास्तविक ट्रेड-अफ हो: GR00T प्रति प्रयास लगभग चार गुणा बढी महँगो छ, र तपाईं यसलाई आफ्नो डेस्क मुनिको 4090 मा चलाउन सक्नुहुन्न।
| मोडेल | GPU टियर | सामान्य रन | सामान्य लागत | न्यूनतम एपिसोडहरू |
|---|---|---|---|---|
| GR00T N1.7 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| GR00T N1.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| Pi0.5 | A100 80 GB or H100 80 GB | 3 to 6 hours | 4 to 12 USD | 50 |
| SmolVLA | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 30 |
| ACT | RTX 4090 or any 24 GB card | 2 to 5 hours | 1 to 3 USD | 50 |
५०-एपिसोड न्यूनतम एउटा आधार हो, लक्ष्य होइन। NVIDIA को आफ्नै FAQ अझ बढी माग गर्दछ: साधारण निश्चित-स्थान पिक र प्लेसका लागि लगभग १०० ट्र्याजेक्टोरीहरू, जटिल वा बहु-चरण दृश्यहरूका लागि ५०० वा सोभन्दा बढी, र सूक्ष्म हेरफेरका लागि १०० देखि ५००। यदि तपाईंसँग २० एपिसोडहरू छन् भने, साँझ ट्युन गर्नुको सट्टा दिउँसो रेकर्डिङमा खर्च गर्नुहोस्। डाटा सङ्कलन गाइडले उपयोगी एपिसोडलाई खेर गएको एपिसोडबाट के कुराले अलग गर्छ भन्ने कुरा समेट्छ, आफ्नो पहिलो डेटासेट रेकर्ड गर्नुहोस्छोटो संस्करण हो, र SO-100 डाटा सङ्कलनहात-विशेष संस्करण हो।

चरण 6: तपाईंले पाखुरा छुनु अघि ओपन-लूप मूल्याङ्कन
ताजा चेकपोइन्टलाई तालिमले काम गर्यो कि गरेन भनेर पत्ता लगाउन भौतिक हातमा नराख्नुहोस्। पहिले ओपन-लूप मूल्याङ्कन चलाउनुहोस्। यसले रेकर्ड गरिएको एपिसोडलाई पुन: प्ले गर्छ, प्रत्येक चरणमा कार्यहरूको लागि मोडेललाई सोध्छ, र MSE र MAE सँग ग्राउन्ड ट्रुथ विरुद्ध भविष्यवाणी प्लट गर्छ। यसको कुनै लागत लाग्दैन र यसले चरण २ र ३ बाट म्यापिङ त्रुटिहरू पत्ता लगाउँछ।
uv run python gr00t/eval/open_loop_eval.py \
--dataset-path ./my_dataset_lerobot \
--embodiment-tag NEW_EMBODIMENT \
--model-path /tmp/so100/checkpoint-20000 \
--traj-ids 0 \
--execution-horizon 16 \
--steps 400 \
--modality-keys single_arm gripperरिपोजिटरीले जानाजानी अनुकूलन डेटाको लागि लक्षित MSE प्रकाशित गर्न अस्वीकार गर्दछ, र त्यो सही निर्णय हो: संख्या तपाईंको कार्य एकाइहरू, तपाईंको कार्य र तपाईंको डेटासेट आकारमा निर्भर गर्दछ, त्यसैले अरू कसैको हातबाट प्रतिलिपि गरिएको थ्रेसहोल्डको कुनै अर्थ छैन। के अर्थपूर्ण छ त्यो प्रवृत्ति हो। यहाँ एकल H100 मा पाँच-एपिसोड डेमो डेटासेट र 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 |
आकार नै संकेत हो, निरपेक्ष मानहरू होइनन्। त्रुटि निरन्तर घट्नुपर्छ जब प्रशिक्षण चरणहरू जम्मा हुन्छन्। ट्र्याजेक्टरी ० मात्र नभई सबै पाँच प्रशिक्षण एपिसोडहरूमा औसत गर्दा, रेपोको अन्तिम चेकपोइन्टले लगभग 7.5 MSE र 1.5 MAE स्कोर गर्यो, त्यसैले सन्दर्भ रन पनि तपाईंले कुन एपिसोडहरूलाई औसत गर्नुहुन्छ भन्ने आधारमा फरक देखिन्छ। तपाईंले आफ्नो डेटामा कुनै पनि परिवर्तन गर्नु अघि अपरिवर्तित डेमो कमाण्डमा आफ्नै बेसलाइन रेकर्ड गर्नुहोस्: यदि तपाईंले ज्ञात-राम्रो रन पुन: उत्पादन गर्न सक्नुहुन्न भने, तपाईंले सेटअप गल्तीलाई डेटा समस्याबाट छुट्याउन सक्नुहुन्न। भण्डारले सामान्य लक्षणहरूलाई कारणहरूसँग पनि नक्सा गर्दछ, र ती सबै मोडेल बगको सट्टा परिचालन हुन्।
| लक्षण | सम्भावित कारण |
|---|---|
| चेकपोइन्टहरूमा MSE समतल वा बढ्दै | लर्निङ रेट धेरै कम छ, वा डेटा लोड भइरहेको छैन। --dataset-path र dataloader workers जाँच गर्नुहोस्। |
| भविष्यवाणी वक्र समतल वा स्थिर छ | modality.json कुञ्जीहरू वा --modality-config-path मिल्दैनन्। कार्य कुञ्जीहरू म्याप गरिएका छैनन्। |
| MSE अत्यधिक, वा प्रशिक्षणको समयमा NaN हानि | कार्य र अवस्था सामान्यीकरण। meta/stats र कार्य दायराहरू भौतिक रूपमा सम्भाव्य छन् भनी प्रमाणित गर्नुहोस्। |
| traj 0 मा राम्रो, राखिएका एपिसोडहरूमा कमजोर | डेटाको कमी, बग होइन। पाँच डेमो एपिसोडहरू सामान्यीकरण गर्न सक्दैनन्। |
अर्को मार्ग: Isaac-GR00T को सट्टा lerobot-train
LeRobot को हालको संस्करण, 0.6.1 PyPI मा 3 अगस्त 2026 देखि उपलब्ध छ, यसले समान आधारभूत वजनहरूलाई फाइन-ट्यून गर्ने दोस्रो र एकदम फरक तरिका प्रदान गर्दछ। LeRobot ले GR00T N1.7 लाई नीति प्रकारको रूपमा प्रस्तुत गर्दछ र यसलाई आफ्नै lerobot-train प्रवेश बिन्दु मार्फत तालिम दिन्छ। यहाँ दुई कुरा महत्त्वपूर्ण छन्। LeRobot CLI कन्सोल स्क्रिप्टहरूको सेट हो, त्यसैले तपाईंले पढ्नुभएको कुनै पनि कुरा जसले भन्छ python lerobot/scripts/train.py पुरानो हो र चल्ने छैन। र LeRobot ले GR00T N1.5 समर्थन पूर्ण रूपमा हटायो, N1.5 चेकपोइन्टहरू र कन्फिगहरूलाई माइग्रेसन नोटको साथ अस्वीकार गर्दै, त्यसैले यदि तपाईंलाई 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 |
|---|---|---|
| डेटासेट संस्करण | LeRobot v2 मात्र, रूपान्तरण आवश्यक | नेटिभ LeRobot डेटासेट, कुनै डाउनग्रेड छैन |
| मोडालिटी म्यापिङ | meta/modality.json र एक Python डेटा कन्फिग | कुनै modality.json छैन; व्यवहार कमान्ड लाइनमा --policy.* फ्ल्यागहरूद्वारा सेट गरिन्छ |
| सीड | कुनै सीड फ्ल्याग छैन | --seed, LeRobot पूर्वनिर्धारित 1000 |
| सापेक्षिक कार्यहरू | डेटा कन्फिगमा प्रति-कुञ्जी ActionConfig | --policy.use_relative_actions र --policy.relative_exclude_joints |
| प्रकाशित सन्दर्भ परिणामहरू | डेमो डेटामा SO-100 ओपन-लूप MSE प्रवृत्ति | LIBERO सुइटहरू, चार सुइटहरूमा 96.5 प्रतिशत औसत |
| डिप्लोयमेन्ट मार्ग | run_gr00t_server.py र ZMQ मा eval_so100.py | lerobot-rollout, वास्तविक-समय चंकिङको साथ (queue_threshold 5 वा सोभन्दा कम रहनुपर्छ) |
- प्रत्येक फ्ल्याग देखिने र परिवर्तन गर्न सकिने हुन्छ। तपाईं भिजुअल इन्कोडरलाई अनफ्रिज गर्न सक्नुहुन्छ, state_dropout_prob सार्न सक्नुहुन्छ, वा कार्य क्षितिज छोटो पार्न सक्नुहुन्छ।
- ओपन-लूप प्लटहरू स्थानीय फाइलहरू हुन्। checkpoint-5000 लाई checkpoint-20000 सँग तुलना गर्नु एउटा शेल कमान्ड हो।
- तपाईं कुनै पनि प्लेटफर्म अनलाइन रहिरहनमा निर्भर हुनुहुन्न, र चेकपोइन्ट तपाईंको डिस्कमा मानक ढाँचामा बस्छ।
- LIBERO, SimplerEnv र DROID का लागि रेपोका बेन्चमार्क उदाहरणहरूले तपाईंलाई आफ्नै डेटामा विश्वास गर्नु अघि पुनरुत्पादन गर्नका लागि ज्ञात-राम्रो रनहरू दिन्छन्।
- वातावरण नै धेरैजसो काम हो। FFmpeg संस्करण, CUDA_HOME, git-lfs, गेटेड ब्याकबोन, torchcodec: यी मध्ये कुनै पनि मोडेल समस्या होइनन् र ती सबैले रन रोक्छन्।
- v3.0 बाट v2.1 रूपान्तरणका लागि आफ्नै इन्स्टल चरणसहितको छुट्टै virtualenv चाहिन्छ, र यसले तपाईंको डेटासेट डाइरेक्टरीलाई यथास्थानमा पुनःलेखन गर्छ।
- GPU भाडा डिबगिङ सुरु गर्दा बिलिङ सुरु हुन्छ, तालिम सुरु गर्दा होइन, र रन सकिएपछि कुनै पनि कुराले इन्स्ट्यान्स रोक्दैन।
- कुनै सीड नहुनुको अर्थ बिट-फर-बिट पुनरुत्पादनशीलता छैन, साथै एक्लै वृद्धिबाट 5 देखि 6 प्रतिशत रन-टु-रन भिन्नता हुन्छ।
एउटै चेकपोइन्ट प्राप्त गर्ने दुई तरिकाहरू
तपाईंले GPU भाडामा लिनुहुन्छ र हरेक चरणको स्वामित्व लिनुहुन्छ। यथार्थमा, यो पहिलो पटक दिउँसोको काम हो र त्यसपछि हरेक पटक बीस मिनेट लाग्छ।
- SO-100 मा lerobot-record प्रयोग गरेर एपिसोडहरू रेकर्ड गर्नुहोस्। तपाईंले LeRobot v3.0 डेटासेट प्राप्त गर्नुहुन्छ।
- यसलाई यसको आफ्नै virtualenv मा scripts/lerobot_conversion/convert_v3_to_v2.py प्रयोग गरेर v2.1 मा रूपान्तरण गर्नुहोस्।
- meta/modality.json र एउटा Python modality कन्फिग लेख्नुहोस्, जुन EmbodimentTag.NEW_EMBODIMENT अन्तर्गत दर्ता गरिएको छ।
- 80 GB कार्ड भाडामा लिनुहोस्, सबमोड्युलहरूसँग क्लोन गर्नुहोस्, uv sync गर्नुहोस्, Hugging Face विरुद्ध प्रमाणीकरण गर्नुहोस्।
- launch_finetune.py चलाउनुहोस्, त्यसपछि धेरै चेकपोइन्टहरूमा open_loop_eval.py चलाउनुहोस्, र हार्डवेयर छुनु अघि MSE प्रवृत्ति तुलना गर्नुहोस्।
- तपाईंले इन्स्ट्यान्स नष्ट गर्नु अघि मेसिनबाट चेकपोइन्ट तान्नुहोस्, त्यसपछि आर्ममा सर्भिङ पाथ निर्माण गर्नुहोस्।
तपाईंले भाडामा लिएको इन्स्ट्यान्स बन्द गर्नु अघि चेकपोइन्ट प्रतिलिपि गर्नुहोस्। --save-total-limit 5 को अर्थ प्रशिक्षण अगाडि बढ्दै जाँदा पुराना चेकपोइन्टहरू मेटिन्छन्, त्यसैले तपाईंले 5000 चरणमा चाहेको चेकपोइन्ट 20000 चरणमा अब नहुन सक्छ।
फारमको रूपमा उही काम। तपाईंले मोडेल र डेटासेट छान्नुहुन्छ, ब्याकएन्डले आवश्यक VRAM अनुसार स्पट बजारमा GPU भाडामा लिन्छ, ट्रेनर चलाउँछ, र चेकपोइन्टहरू वस्तु भण्डारणमा लेख्छ। SO-100 मा GR00T N1.7 गाइड यो ठ्याक्कै यही संयोजन हो; प्रशिक्षण म्याट्रिक्स मा अन्य सबै मोडेल र आर्म जोडीहरू छन्, जसमा SO-101 मा GR00T N1.7 पनि समावेश छ।
| groot1.7 ट्रेनरले के पठाउँछ | Value |
|---|---|
| ब्याच साइज | 32 |
| लर्निङ रेट | 1e-4 |
| अधिकतम चरणहरू | 20000 |
| ग्रेडियन्ट सञ्चय | 1, and it does take effect for this trainer |
| फारममा देखाइएको अतिरिक्त नब | saveSteps |
| आधार चेकपोइन्ट | nvidia/GR00T-N1.7-3B |
| स्वीकृत डेटासेट ढाँचा | LeRobot v2.0 or v2.1 |
डेटासेट Hugging Face repo id बाट, तपाईंको आफ्नै मेसिनबाट, वा तपाईंले डेस्कटप क्लाइन्ट मार्फत रेकर्ड गरेको सत्रबाट आउन सक्छ। अनुमान एक छुट्टै चरण हो: प्लेटफर्मले नीति सेवा गर्ने पोड प्रदान गर्दछ, र तपाईंको स्थानीय रोबोट क्लाइन्टले त्यो अन्तिम बिन्दुसँग कुरा गर्छ। पोडहरूले निष्क्रिय वाचडग बोक्छन् र निष्क्रिय अवधि पछि आफैं नष्ट हुन्छन्, त्यसैले बिर्सिएको ब्राउजर ट्याबले रातभर बिल गर्दैन। यदि तपाईं क्लिक गर्न चाहनुहुन्न भने, उही कार्यहरू 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 लेख्छ। स्क्रिप्ट आफ्नै virtualenv मा चल्छ किनभने यसलाई 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 ले तालिम दिन नसक्ने नीति चलाउन सक्छ। यदि तपाईं 24 GB मा तालिम दिन सक्ने VLA चाहनुहुन्छ भने, त्यो लगभग 450 M प्यारामिटरमा SmolVLA वा लगभग 80 M मा ACT हो।
किन समान फ्ल्यागहरू भएका दुई रनले फरक चेकपोइन्टहरू दिन्छन्?▾
किनभने launch_finetune.py मा कुनै seed छैन। यो dataclass बाट उत्पन्न गरिएको tyro CLI हो जसमा कुनै seed फिल्ड छैन, त्यसैले कुनै पनि कुराले RNG लाई पिन गर्दैन। रेपोले गैर-निर्धारित छवि वृद्धिको कारणले रनहरू बीच 5 देखि 6 प्रतिशत भिन्नता नोट गर्दछ। यदि पुनरुत्पादनशीलता महत्त्वपूर्ण छ भने, यसको सट्टा LeRobot मार्ग प्रयोग गर्नुहोस्: lerobot-train ले --seed लिन्छ र प्रकाशित GR00T रेसिपीले --seed=42 पास गर्छ।
के मैले Isaac-GR00T वा lerobot-train प्रयोग गर्नुपर्छ?▾
यदि तपाईं सन्दर्भ कार्यान्वयन, कार्य प्रतिनिधित्वमा प्रति-कुञ्जी नियन्त्रण, TensorRT निर्यात, वा तपाईंको आफ्नै डेटामा विश्वास गर्नु अघि पुनरुत्पादन गर्न बेन्चमार्क उदाहरणहरू चाहनुहुन्छ भने Isaac-GR00T प्रयोग गर्नुहोस्। यदि तपाईंको डेटासेट पहिले नै LeRobot v3.0 हो र तपाईं यसलाई रूपान्तरण गर्न चाहनुहुन्न भने, यदि तपाईंलाई seed चाहिन्छ भने, वा यदि तपाईंको बाँकी स्ट्याक पहिले नै 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