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 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 पर्यंतच्या Isaac-GR00T मुख्य शाखेच्या (n1.7-release लाइन) आणि 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 हे अपग्रेड तुमच्या पाइपलाइनमध्ये बदल करण्यासारखे आहे की नाही हे स्पष्ट करते.

गुणधर्ममूल्यस्रोत
पॅरामीटर्स3,000,000,000Hugging Face मॉडेल कार्ड
व्हिजन-लँग्वेज बॅकबोनnvidia/Cosmos-Reason2-2B (Qwen3-VL), Hugging Face वर गेटेडरेपो README
ॲक्शन हेडफ्लो-मॅचिंग डिफ्यूजन ट्रान्सफॉर्मर, 16 लेयर्स (N1.6 मध्ये 32 होते)रेपो README
अंदाजित ॲक्शन होरायझनबेस चेकपॉईंटसाठी 40 स्टेप्स (N1.6 मध्ये 16 होते)getting_started/policy.md आणि रेपो README
कमाल स्टेट आणि ॲक्शन रुंदी132 (N1.6 मध्ये 29 होती)रेपो README
कोड परवानाApache 2.0Isaac-GR00T रिपॉझिटरी
वेट्स परवाना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 msAY-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 त्यांची बाजूला बाजू मांडणी करतात.

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 आणि CUDA 12.83.12 आणि CUDA 12.8
व्हिडिओ बॅकएंडtorchcodec 0.8.0, फक्त FFmpeg 4 ते 7तेच
डेटासेट स्वरूपLeRobot v2 अधिक meta/modality.jsonलागू नाही
Hugging Face प्रवेशnvidia/Cosmos-Reason2-2B साठी मंजूरतेच
इतर साधनेgit-lfs आणि uvuv
groot1.7 ट्रेनरसाठी AY-Robots GPU टियरA100 80 GB किंवा H100 80 GBपॉड आपोआप प्रदान केले जाते
गेटेड बॅकबोन तुम्हाला पहिल्या रनवर थांबवेल

प्रत्येक GR00T चेकपॉईंट, ज्यात बेस nvidia/GR00T-N1.7-3B समाविष्ट आहे, पहिल्या वापरावेळी nvidia/Cosmos-Reason2-2B लोड करतो, आणि ते रिपॉझिटरी गेटेड आहे. README मध्ये अपयश स्पष्टपणे नमूद केले आहे: मॉडेल लोडिंग GatedRepoError / 401 Client Error सह अयशस्वी होते. ते कधी घडते हे नमूद केलेले नाही, जे तुम्ही कार्ड भाड्याने घेतल्यानंतर आणि रन सुरू झाल्यानंतर होते. मॉडेल पेजवर प्रवेशाची विनंती करा, त्यानंतर काहीही भाड्याने घेण्यापूर्वी uv run huggingface-cli login चालवा किंवा HF_TOKEN एक्सपोर्ट करा.

पायरी 0: भाग स्वतः

खालील सर्व गोष्टी गृहीत धरतात की तुम्ही आधीच भाग (episodes) रेकॉर्ड केले आहेत. जर तुम्ही केले नसतील, तर ती खरी पहिली पायरी आहे आणि तीच ठरवते की परिणाम किती चांगला असू शकतो, कारण अनुकरण शिक्षण डेटा मध्ये नसलेली माहिती परत मिळवू शकत नाही. प्रथम दोन्ही हात कॅलिब्रेट करा, नंतर फॉलोअरला लीडर आर्म वापरून 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 भाग असावेत, कॅमेरे स्थिर ठेवावेत आणि पकडण्याची (grasping) वर्तणूक सुसंगत ठेवावी. विविधता नंतर जोडा, सुरुवातीला नाही. लक्षात ठेवण्यासारखा एक नियम: जर तुम्ही केवळ कॅमेरा इमेजेसवरून स्वतः कार्य करू शकला नसता, तर पॉलिसी देखील करू शकत नाही. आर्म-विशिष्ट सेटअपसाठी, 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 ची मागणी करतो आणि lerobot ला एका गिट कमिटवर पिन करतो, तर Isaac-GR00T ला स्वतःला Python 3.12 ची आवश्यकता आहे. रिपॉझिटरीच्या मूळातून कनवर्टर स्थापित करा आणि तुम्हाला त्याऐवजी gr00t पॅकेज मिळेल, जी त्याच्या README मध्ये चेतावणी दिलेली चूक आहे. जर तुम्ही या फॉरमॅटसाठी नवीन असाल, तर LeRobot डेटासेट शब्दावलीमध्ये प्रत्यक्षात काय आहे हे स्पष्ट केले आहे.

bash
# from the Isaac-GR00T repo root
cd scripts/lerobot_conversion
uv venv
source .venv/bin/activate
uv pip install -e . --verbose

# pulls the dataset from the Hub and writes a v2.1 copy into the default cache
python convert_v3_to_v2.py --repo-id <your-hf-user>/<your-dataset>

# or, back in the repo root, keep it next to the SO-100 example
uv run --project scripts/lerobot_conversion \
  python scripts/lerobot_conversion/convert_v3_to_v2.py \
  --repo-id <your-hf-user>/<your-dataset> \
  --root examples/SO100/my_dataset_lerobot
कनवर्टर --repo-id, एक पर्यायी --root, आणि --force-conversion घेतो, जे कोणतीही स्थानिक स्नॅपशॉट हटवते आणि ते पुन्हा डाउनलोड करते. ते codebase_version: v2.1 meta/info.json मध्ये लिहिते.
रूपांतरण जागेवरच अधिलिखित करते

जर v3.0 डेटासेट स्थानिक पातळीवर आधीच अस्तित्वात असेल, तर स्क्रिप्ट त्याच्या शेजारी v2.1 लेआउट तयार करते आणि नंतर अदलाबदल करते: मूळ फोल्डरला आवृत्ती जोडून, <name>_v3.0, एका शेजारील फोल्डरमध्ये हलवले जाते आणि रूपांतरित प्रत मूळ मार्ग घेते. (स्क्रिप्टच्या स्वतःच्या डॉकस्ट्रिंगमध्ये त्या फोल्डरला _v30 असे म्हटले आहे; कोड आवृत्ती स्ट्रिंग जोडतो, त्यामुळे तुम्हाला प्रत्यक्षात _v3.0 मिळते.) दुसरे आश्चर्य: आउटपुट नेहमी <root>/<repo-id> अंतर्गत येते, त्यामुळे --root examples/SO100/my_dataset_lerobot तुम्हाला examples/SO100/my_dataset_lerobot/<your-hf-user>/<your-dataset> देते, आणि तो लांब मार्गच --dataset-path ला नंतर हवा असतो. जेव्हा प्रशिक्षण कार्य तुमच्या डेटासेटला आवृत्तीच्या कारणास्तव नाकारते, तेव्हा v3 म्हणून नाकारलेला डेटासेट पृष्ठ अचूक लक्षणे सूचीबद्ध करते.

रूपांतरणानंतर GR00T ला हवी असलेली रचना क्लासिक v2 लेआउट आहे: meta/info.json, meta/episodes.jsonl, meta/tasks.jsonl, पार्केट फाइल्स खाली data/chunk-000/, MP4 फाइल्स खाली videos/chunk-000/observation.images./, आणि एक अतिरिक्त फाइल जी मानक 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 is [0:5] and gripper is [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 ऐवजी पायथन फाइल आहे, कारण ते प्रत्येक ॲक्शन ग्रुपचे प्रतिनिधित्व कसे केले जाते हे देखील ठरवते. N1.7 वर्कफ्लोचा हा भाग N1.5 मध्ये त्याच स्वरूपात अस्तित्वात नव्हता आणि हा भाग दोनदा वाचण्यासारखा आहे. शिप केलेले SO-100 कॉन्फिग पाच आर्म जॉइंट्सना RELATIVE सध्याच्या स्थितीपासून डेल्टा म्हणून आणि ग्रिपरला ABSOLUTE लक्ष्य स्थिती म्हणून भाकीत करते, कारण बायनरी ओपन-किंवा-क्लोज्ड सिग्नल डेल्टापेक्षा लक्ष्य म्हणून चांगले कार्य करतो.

python
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.embodiment_tags import EmbodimentTag
from gr00t.data.types import (
    ActionConfig, ActionFormat, ActionRepresentation, ActionType, ModalityConfig,
)

so100_config = {
    "video": ModalityConfig(
        delta_indices=[0],                       # current frame only
        modality_keys=["front", "wrist"],        # must match modality.json
    ),
    "state": ModalityConfig(
        delta_indices=[0],
        modality_keys=["single_arm", "gripper"],
    ),
    "action": ModalityConfig(
        delta_indices=list(range(0, 16)),        # predict 16 future steps
        modality_keys=["single_arm", "gripper"],
        action_configs=[
            ActionConfig(rep=ActionRepresentation.RELATIVE,   # arm joints
                         type=ActionType.NON_EEF,
                         format=ActionFormat.DEFAULT),
            ActionConfig(rep=ActionRepresentation.ABSOLUTE,   # gripper
                         type=ActionType.NON_EEF,
                         format=ActionFormat.DEFAULT),
        ],
    ),
    "language": ModalityConfig(
        delta_indices=[0],
        modality_keys=["annotation.human.task_description"],
    ),
}

register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)
examples/SO100/so100_config.py, आवश्यक गोष्टींपर्यंत कमी केले आहे. NON_EEF म्हणजे जॉइंट स्पेस; EEF ला x, y, z अधिक 6D रोटेशनचा नऊ-आयामी वेक्टर अपेक्षित असेल.

येथे दोन तपशील आहेत जे तुम्हाला माहीत नसल्यास तुमचा एक दिवस वाया घालवतील. पहिले, action_configs हे पोझिशनल आहे: डॉक्सना modality_keys, इतकीच लांबी आणि तोच क्रम आवश्यक आहे, आणि ते चुकीचे झाल्यास त्याचे परिणाम स्पष्टपणे सांगतात, म्हणजे चुकीचे प्रतिनिधित्व शांतपणे लागू केले जाते. तुमचा ग्रिपर डेल्टा म्हणून प्रशिक्षित होतो आणि तुमचा आर्म ॲब्सोल्यूट लक्ष्य म्हणून, आणि कोणतीही त्रुटी संदेश येत नाही. दुसरे, register_modality_config हे टॅग आधीच नोंदणीकृत नाही याची खात्री करते, त्यामुळे त्याच पायथन प्रक्रियेतील दुसरे NEW_EMBODIMENT कॉन्फिग Embodiment tag ... already registered या त्रुटीसह बंद पडते. तुम्ही यापैकी दोन एका स्क्रिप्टमध्ये आयात करू शकत नाही. तिसरा नियम नंतर, डिप्लॉयमेंटच्या वेळी लागू केला जातो: ॲक्शन delta_indices शून्य पासून सुरू होणारी सलग श्रेणी असणे आवश्यक आहे. [0, 4, 8] सारखी विरळ विंडो नाकारली जाते, कारण डाउनस्ट्रीममधील सर्व काही अंदाजित चंकला रेखीयपणे अनुक्रमित करते आणि अन्यथा चुकीच्या पंक्ती कार्यान्वित करेल.

delta_indices बदलल्यास तुम्हाला स्टॅट्स पुन्हा जनरेट करावे लागतील

नॉर्मलायझेशन स्टॅटिस्टिक्स, विशेषतः meta/relative_stats.json, तुम्ही ते जनरेट केले तेव्हा असलेल्या होरायझन लांबीसाठी मोजले जातात. ॲक्शन होरायझन 16 वरून 8 पर्यंत पुन्हा जनरेट न करता कमी केल्यास, प्रशिक्षण IndexError: boolean index did not match indexed array ... dimension is 8 but corresponding boolean dimension is 16 या त्रुटीसह बंद पडते. याचे निराकरण एक कमांड आहे: python gr00t/data/stats.py --dataset-path <path> --embodiment-tag NEW_EMBODIMENT --modality-config-path examples/SO100/so100_config.py. delta_indices मध्ये कोणताही बदल केल्यानंतर हे चालवा.

पायरी 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/ मधील parquet फाइल्स पॉइंटर स्टब्स म्हणून येतात आणि फाइल सूचीमध्ये उपस्थित दिसणाऱ्या डेटासेटवर डेमो रन अयशस्वी होतो.

    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 स्थापित करा आणि वातावरण सिंक करा

    डीफॉल्ट इन्स्टॉल flash-attn आणि TensorRT सह GPU अवलंबित्व खेचते. नवीन 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
सिंगल GPU साठी. आठ कार्डसाठी, लाँचरला uv run torchrun --nproc_per_node=8 --master_port=29500 ने बदला आणि --num-gpus 8 सेट करा. uv run torchrun वापरा, नुसते torchrun नाही, अन्यथा तुम्हाला चुकीचे वातावरण मिळेल.
फ्लॅगFinetuneConfig मधील डीफॉल्टते काय करते
--global-batch-size64ग्रेडियंट ॲक्युमुलेशनपूर्वी सर्व GPUs मधील एकूण बॅच. प्रदान केलेल्या उदाहरणांमध्ये 32 वापरले जाते.
--learning-rate1e-4AY-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-prob0.2 in the CLI, 0.8 in the model configप्रशिक्षणादरम्यान प्रोप्रियोसेप्टिव्ह स्थिती यादृच्छिकपणे वगळते. जर तुमचे कार्य स्थितीवर अवलंबून असेल तर ते कमी करा.
--tune-llm and --tune-visualFalse and Falseबॅकबोन डीफॉल्टनुसार गोठलेले राहते.
--tune-projector and --tune-diffusion-modelTrue and Trueप्रोजेक्टर आणि डिफ्यूजन ॲक्शन हेड हेच प्रत्यक्षात प्रशिक्षित होतात.
--use-percentilesTrueकच्च्या किमान आणि कमाल मूल्यांऐवजी q01 आणि q99 सह सामान्यीकरण करा.
--dataloader-num-workers2लोडर डिझाइननुसार CPU-आधारित आहे. उदाहरणे हे 4 पर्यंत वाढवतात.
--seeddoes not existया CLI वर सीड फ्लॅग नाही.

ती शेवटची ओळ टायपो नाही. launch_finetune.py हे एका डेटाक्लासपासून तयार केलेले टायरो CLI आहे आणि त्या डेटाक्लासमध्ये 'seed' फील्ड नाही. README मध्ये स्वतंत्रपणे नमूद केले आहे की नॉन-डिटरमिनिस्टिक इमेज ऑगमेंटेशनमुळे रनमध्ये 5 ते 6 टक्के फरक येऊ शकतो. सारख्याच फ्लॅगसह दोन रन केल्यास सारखे चेकपॉइंट्स तयार होणार नाहीत, जे हायपरपॅरामीटर बदलामुळे मदत झाली की फक्त नशीब चांगले होते हे ठरवताना खूप महत्त्वाचे आहे. तुलनेसाठी, lerobot चा स्वतःचा ट्रेनर डीफॉल्टनुसार seed 1000 वापरतो आणि LeRobot GR00T रेसिपी स्पष्टपणे --seed=42 पास करते.

डीफॉल्टनुसार प्रमाणीकरण बंद आहे आणि नमूद केलेला फ्लॅग या CLI वर नाही

eval_strategy="no" सह फाइन-ट्यूनिंग चालते, त्यामुळे कोणतेही प्रमाणीकरण लॉस कर्व्ह (validation loss curve) उपलब्ध नाही. तुम्हाला फक्त ट्रेनिंग लॉस मिळतो आणि दुसरे काहीही नाही. नवीन-एम्बॉडमेंट मार्गदर्शक तुम्हाला --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 आहे. कोणत्याही परिस्थितीत, केवळ कमी होणारा ट्रेनिंग लॉस तुम्हाला सामान्यीकरणाबद्दल (generalization) फार कमी माहिती देतो, जी लॉस कमी होतो पण पॉलिसी काही करत नाही यावर वर्णन केलेल्या परिस्थितीसारखीच आहे.

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 data collection हे आर्म-विशिष्ट आहे.

SO-100 वरील GR00T N1.7 साठी AY-Robots प्रशिक्षण मार्गदर्शक, GPU स्तर, आवश्यक डेटासेट स्वरूप आणि ट्रेनर डीफॉल्टसह स्पेसिफिकेशन स्ट्रिप दर्शवित आहे
The /train/groot-n1-7-on-so-100 मार्गदर्शक तुम्हाला अन्यथा हाताने पुन्हा तयार कराव्या लागणाऱ्या तथ्यांसह माहिती देतो: GPU स्तर, डेटासेट स्वरूप आणि ट्रेनरने पाठवलेले अचूक डीफॉल्ट.

पायरी 6: तुम्ही आर्मला स्पर्श करण्यापूर्वी ओपन-लूप मूल्यांकन

नवीन चेकपॉईंट प्रत्यक्ष आर्मवर (physical arm) वापरू नका हे पाहण्यासाठी की प्रशिक्षण (training) यशस्वी झाले की नाही. प्रथम ओपन-लूप मूल्यांकन (open-loop evaluation) चालवा. हे रेकॉर्ड केलेला एपिसोड पुन्हा प्ले करते, प्रत्येक टप्प्यावर मॉडेलला कृतींसाठी विचारते आणि MSE आणि MAE सह ग्राउंड ट्रुथच्या विरुद्ध भविष्यवाणी (prediction) प्लॉट करते. याला काहीही खर्च येत नाही आणि ते पायऱ्या 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
तुम्ही --save-plot-path पास न केल्यास, प्लॉट्स /tmp/open_loop_eval/traj_<id>.jpeg मध्ये तयार होतात. डिफॉल्ट्स: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

रिपॉझिटरी (repository) हेतुपुरस्सर कस्टम डेटासाठी (custom data) लक्ष्य MSE प्रकाशित करण्यास नकार देते, आणि हा योग्य निर्णय आहे: ही संख्या तुमच्या ॲक्शन युनिट्स (action units), तुमच्या कार्यावर (task) आणि तुमच्या डेटासेटच्या आकारावर (dataset size) अवलंबून असते, त्यामुळे दुसऱ्याच्या आर्ममधून कॉपी केलेली मर्यादा (threshold) निरर्थक आहे. महत्त्वाचा आहे तो ट्रेंड (trend). येथे संदर्भ रन (reference run) आहे जो रिपो (repo) एका H100 वर पाच-एपिसोड डेमो डेटासेट (five-episode demo dataset) आणि 2000 स्टेप्ससह (steps) डॉक्युमेंट करतो.

चेकपॉईंट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 वर चांगले, परंतु बाजूला ठेवलेल्या एपिसोड्सवर खराबडेटाची कमतरता, बग नाही. पाच डेमो एपिसोड्स सामान्यीकरण करू शकत नाहीत.

दुसरा मार्ग: lerobot-train ऐवजी Isaac-GR00T

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 versionफक्त LeRobot v2, रूपांतरण आवश्यकनेटिव्ह LeRobot डेटासेट, डाउनग्रेड नाही
Modality mappingmeta/modality.json अधिक पायथन डेटा कॉन्फिगmodality.json नाही; कमांड लाइनवरील --policy.* फ्लॅगद्वारे वर्तन सेट केले जाते
Seedकोणताही सीड फ्लॅग नाही--seed, LeRobot डीफॉल्ट 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 हलवू शकता किंवा ॲक्शन होरायझन कमी करू शकता.
  • ओपन-लूप प्लॉट्स स्थानिक फाइल्स आहेत. checkpoint-5000 ला checkpoint-20000 विरुद्ध डिफ करणे ही एक शेल कमांड आहे.
  • तुम्ही कोणत्याही प्लॅटफॉर्मवर ऑनलाइन राहण्यावर अवलंबून नाही, आणि चेकपॉइंट तुमच्या डिस्कवर मानक स्वरूपात असतो.
  • LIBERO, SimplerEnv आणि DROID साठी रेपोची बेंचमार्क उदाहरणे तुम्हाला तुमच्या स्वतःच्या डेटावर विश्वास ठेवण्यापूर्वी पुनरुत्पादित करण्यासाठी ज्ञात-चांगले रन देतात.
तडजोडी
  • पर्यावरण हे बहुतेक काम आहे. FFmpeg आवृत्ती, CUDA_HOME, git-lfs, गेटेड बॅकबोन, torchcodec: यापैकी कोणतीही मॉडेल समस्या नाही आणि त्यापैकी प्रत्येक रन थांबवते.
  • v3.0 ते v2.1 रूपांतरणासाठी स्वतःच्या इन्स्टॉल स्टेपसह स्वतंत्र व्हर्च्युअलएनव्हीची आवश्यकता आहे आणि ते तुमच्या डेटासेट डिरेक्टरीला जागेवरच पुन्हा लिहिते.
  • जीपीयू भाड्याचे बिलिंग तुम्ही डीबगिंग सुरू करता तेव्हा सुरू होते, प्रशिक्षण सुरू झाल्यावर नाही, आणि रन पूर्ण झाल्यावर कोणतीही इन्स्टन्स थांबवत नाही.
  • सीड नसल्यामुळे बिट-फॉर-बिट पुनरुत्पादनक्षमता नाही, केवळ ऑगमेंटेशनमुळे 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 वर कदाचित अस्तित्वात नसेल.

AY-Robots प्रशिक्षण मॅट्रिक्स, ज्यात पाच पॉलिसी मॉडेल्स पंक्ती म्हणून आणि चार रोबोट आर्म्स स्तंभ म्हणून आहेत, प्रत्येक सेल विशिष्ट प्रशिक्षण मार्गदर्शकाशी जोडलेला आहे.
The /train matrix: पाच मॉडेल्स विरुद्ध चार आर्म्स. GR00T N1.7 ही ओळ SO-101, Koch v1.1 आणि LeKiwi यांना देखील समाविष्ट करते.

चेकपॉईंट आर्मवर परत आणणे

Isaac-GR00T ZMQ वर सर्व्हर-क्लायंट स्प्लिट वापरतो. पॉलिसी GPU वर चालते आणि रोबोट मशीनवरील एक थिन क्लायंट निरीक्षणे पाठवतो आणि ॲक्शन चंक्स प्राप्त करतो. SO-100 उदाहरण कॉपी करण्यासाठी पुरेसे पूर्ण आहे: सुरू करा run_gr00t_server.py तुमच्या चेकपॉईंटसह आणि --embodiment-tag NEW_EMBODIMENT, नंतर चालवा eval_so100.py रोबोट बाजूने सिरीयल पोर्ट, रोबोट आयडी, कॅमेरा इंडेक्स आणि भाषेच्या सूचनांसह. त्या कमांडमधील कॅमेरा नावे तुमच्या modality.json मधील फ्रेंडली नावांशी जुळली पाहिजेत, 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 पेक्षा जास्त नसावे आणि ती संख्या तुमच्या मॉडेलिटी कॉन्फिगमधील ॲक्शन delta_indices ची लांबी आहे, बेस मॉडेलची नाही. शिप केलेल्या 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 स्थानिक पातळीवर देखील चालतात. हळू पिक अँड प्लेससाठी रिमोट पॉड टिकू शकते. कोणत्याही प्रतिक्रियाशील गोष्टीसाठी ते शक्य नाही: धोरण अशा प्रकारे संकोच करते जे प्रशिक्षण अपयशासारखे दिसते पण ते नसते. प्रति ॲक्शन स्टेप 20 ms वर ACT हे सर्वात घट्ट लूप सहन करणारे मॉडेल आहे, 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 आवृत्तीपेक्षा वेगळी 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 टियरवर देते. अनुमान (Inference) ही वेगळी गोष्ट आहे: मॉडेल सर्व्ह करण्यासाठी 16 GB पुरेसे आहे, त्यामुळे 4090 असे धोरण चालवू शकते जे ते प्रशिक्षित करू शकत नाही. जर तुम्हाला 24 GB वर प्रशिक्षित करता येणारे VLA हवे असेल, तर ते अंदाजे 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