
دليل مجرّب للضبط الدقيق لـ NVIDIA GR00T N1.7 على مجموعة بيانات LeRobot من SO-100: الأعلام الحقيقية، modality.json، متطلبات الإصدار 2.1، تكلفة التشغيل، والمزالق.
تشحن NVIDIA مثالاً للضبط الدقيق للذراع الذي تمتلكه على الأرجح. داخل مستودع Isaac-GR00T يوجد مجلد يسمى demo_data/cube_to_bowl_5: خمس حلقات، 4,148 إطارًا بمعدل 30 إطارًا في الثانية، مكتوبة بالفعل بصيغة 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. تم التحقق من كل ما يلي مقابل الفرع الرئيسي لـ Isaac-GR00T اعتبارًا من 20 أغسطس 2026 (خط إصدار n1.7) و lerobot 0.6.1، المنشور على PyPI في 3 أغسطس 2026. يتطور المصدر بسرعة، وحيثما تم تغيير اسم علامة، تشير هذه المقالة إلى ذلك.
ما تحتاج معرفته قبل البدء
- •يتطلب الضبط الدقيق لـ GR00T N1.7 ذاكرة VRAM بسعة 40 جيجابايت أو أكثر. توصي NVIDIA بعقد H100 أو L40. لن تقوم بطاقة RTX 4090 بسعة 24 جيجابايت بهذه المهمة، على الرغم من أنها ستدرب SmolVLA و ACT.
- •يجب أن تكون مجموعة البيانات LeRobot v2 (v2.0 أو v2.1) بالإضافة إلى ملف meta/modality.json خاص بـ GR00T. لا يتم تحميل مجموعة بيانات LeRobot v3.0 ويجب تحويلها إلى إصدار أقدم.
- •نقطة الدخول هي gr00t/experiment/launch_finetune.py، وهي واجهة سطر أوامر tyro. لا تحتوي على علامة --seed، لذا فإن عمليات التشغيل ليست قابلة للتكرار بت-بايت.
- •بالنسبة لذراع مخصص، علامة التجسيد هي NEW_EMBODIMENT، وهذه العلامة تجعل --modality-config-path إلزاميًا.
- •تتنبأ وصفة SO-100 المشحونة بمفاصل الذراع كفروقات RELATIVE والقابض كهدف ABSOLUTE. عكس هذا الاقتران هو فشل صامت، وليس خطأ.
- •على AY-Robots، نفس المهمة هي نموذج: 20000 خطوة، دفعة 32، معدل تعلم 1e-4، حوالي 4 إلى 12 دولار أمريكي على فئة A100 80 جيجابايت أو H100.
ما هو GR00T N1.7 في الواقع
GR00T N1.7 هو نموذج الرؤية واللغة والحركة بتصميم النظام المزدوج الموضح في ورقة GR00T N1 الأصلية: وحدة رؤية ولغة تقرأ الكاميرات والتعليمات، ومحول انتشار يحول ذلك إلى جزء من أوامر المحرك المستمرة. استبدل N1.7 النصف الأول. تم التخلص من بنية Eagle الأساسية من N1.6، واستبدلت بـ nvidia/Cosmos-Reason2-2B على بنية Qwen3-VL، وتم تدريب النموذج مسبقًا على ما يقرب من 20,000 ساعة من مقاطع الفيديو البشرية ذات المنظور الذاتي بالإضافة إلى بيانات الروبوت. يذكر تقرير NVIDIA الخاص أن الرقم هو 20,854 ساعة ويفيد بأن الانتقال من 1k إلى 20k ساعة يضاعف متوسط إنجاز المهام بأكثر من الضعف.
تغير النصف الثاني أيضًا، بطرق تهم تشغيلك. انخفض رأس الحركة من 32 طبقة انتشار إلى 16، ونمت كتلة الحركة من 16 خطوة إلى 40، وارتفع الحد الأقصى لعرض الحالة والحركة من 29 إلى 132. تأتي هذه الأرقام الثلاثة من سجل التغييرات في ملف README للمستودع؛ لا يزال منشور إطلاق NVIDIA الخاص يصف النظام 1 بأنه DiT ذو 32 طبقة، لذا حيثما يختلف الاثنان، ثق بالمستودع الذي أنت على وشك استنساخه. يتم التعبير عن الإجراءات افتراضيًا في مساحة المؤثر النهائي نسبية، فروق من الوضع الحالي بدلاً من الأهداف المطلقة، وهذا ما يسمح بانتقال الأولويات التلاعبية المستفادة من الفيديو البشري إلى التحكم في الروبوت على الإطلاق. الرأس نفسه هو مطابقة التدفق محول انتشار، من نفس عائلة Pi0.5 ولكن ببنية أساسية مختلفة أمامه. إذا كنت لا تزال تستخدم الجيل السابق، فإن مقارنة N1.7 بـ N1.5 يوضح ما إذا كانت الترقية تبرر إعادة بناء مسار عملك.
| الخاصية | القيمة | المصدر |
|---|---|---|
| المعلمات | 3,000,000,000 | بطاقة نموذج Hugging Face |
| البنية الأساسية للرؤية واللغة | nvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Face | repo README |
| رأس الحركة | محول انتشار مطابقة التدفق، 16 طبقة (N1.6 كان يحتوي على 32) | repo README |
| أفق الحركة المتوقعة | 40 خطوة لنقطة التحقق الأساسية (N1.6 كان يحتوي على 16) | getting_started/policy.md and repo README |
| الحد الأقصى لعرض الحالة والحركة | 132 (N1.6 كان يحتوي على 29) | repo README |
| ترخيص الكود | Apache 2.0 | Isaac-GR00T repository |
| ترخيص الأوزان | NVIDIA Open Model License Agreement | بطاقة النموذج |
| الكمون، H100 80 جيجابايت، PyTorch eager، 4 خطوات إزالة الضوضاء، كاميرا واحدة | 85.8 ms end to end, 11.7 Hz | جدول توقيت بطاقة النموذج |
| نفس الجهاز، مسار TensorRT الكامل | 27.9 ms end to end, 35.9 Hz | جدول توقيت بطاقة النموذج |
| الكمون الذي تستشهد به AY-Robots لنموذج GR00T N1.7 المقدم | 152 ms per action step | كتالوج سياسات AY-Robots |
تفسر هذه الصفوف الثلاثة الأخيرة معظم خيبة الأمل التي يبلغ عنها الناس. الرقم الرئيسي 27.9 مللي ثانية هو محرك TensorRT على H100 بكاميرا واحدة وأربع خطوات لإزالة الضوضاء. PyTorch العادي على نفس البطاقة هو 85.8 مللي ثانية، وتشير بطاقة النموذج إلى أن الفارق هو 3.08x. لا يتضمن أي من الرقمين طبقة خدمة أو كاميرا ثانية أو قفزة شبكة. الرقم 152 مللي ثانية لكل خطوة حركة الذي تستشهد به AY-Robots لنموذج GR00T N1.7 المقدم هو الرقم مع الخدمة في الحلقة، وتضاف إلى ذلك رحلة ذهاب وعودة عبر الإنترنت العام. المزيد عن هذا في النهاية. بالنسبة للأرقام بجانب النماذج الأخرى، مقارنة GR00T N1.7 بـ Pi0.5 و مقارنة GR00T N1.7 بـ SmolVLA تعرضها جنبًا إلى جنب.

ما يحتاجه التشغيل قبل أن تكتب أي شيء
| المتطلب | الضبط الدقيق | الاستدلال |
|---|---|---|
| ذاكرة الفيديو (VRAM)، إرشادات NVIDIA | 40 جيجابايت أو أكثر، يوصى بـ H100 أو L40 | 16 جيجابايت أو أكثر، تعمل RTX 4090 |
| Python و CUDA على dGPU | 3.12 و CUDA 12.8 | 3.12 و CUDA 12.8 |
| الواجهة الخلفية للفيديو | torchcodec 0.8.0، FFmpeg 4 إلى 7 فقط | نفسه |
| تنسيق مجموعة البيانات | LeRobot v2 بالإضافة إلى meta/modality.json | غير قابل للتطبيق |
| الوصول إلى Hugging Face | معتمد لـ nvidia/Cosmos-Reason2-2B | نفسه |
| أدوات أخرى | git-lfs و uv | uv |
| فئة وحدة معالجة الرسوميات (GPU) من AY-Robots لمدرب groot1.7 | A100 80 جيجابايت أو H100 80 جيجابايت | وحدة (pod) يتم توفيرها تلقائيًا |
تقوم كل نقطة تحقق لـ 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 يكتب ملفات parquet وتدفقات الكاميرا. إذا كانت المعايرة غير دقيقة، فإن قيم المفاصل في مجموعة بياناتك تصف روبوتًا مختلفًا قليلاً عن الروبوت الذي سينفذ السياسة لاحقًا، ولا يمكن لأي قدر من التدريب إصلاح ذلك.
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 هي تسجيل 50 حلقة على الأقل، حوالي 10 لكل موقع كائن، مع إبقاء الكاميرات ثابتة، والحفاظ على سلوك الإمساك متسقًا. أضف التنوع لاحقًا، وليس في البداية. القاعدة الأساسية التي تستحق التذكر: إذا لم تتمكن من أداء المهمة بنفسك من صور الكاميرا وحدها، فإن السياسة لا يمكنها ذلك أيضًا. لإعداد الذراع المحدد، بدء استخدام SO-100 و صفحة LeRobot الخاصة بـ SO-100 تغطي المنافذ والمعايرة ومؤشرات الكاميرا. على 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، وتأخذ النسخة المحولة المسار الأصلي. (يسمي docstring الخاص بالسكريبت هذا المجلد _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.
الخطوة 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 ولا يوجد شيء في ملف 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 المستخدمة في المستودع |
|---|---|---|
| عمود Parquet | 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: تكوين البيانات، الذراع النسبي والقابض المطلق
ملف تهيئة النمط (modality config) هو ملف بايثون وليس JSON، لأنه يحدد أيضًا كيفية تمثيل كل مجموعة إجراءات. هذا هو الجزء من سير عمل N1.7 الذي لم يكن موجودًا بنفس الشكل في N1.5، وهو الجزء الذي يستحق القراءة مرتين. تتنبأ تهيئة SO-100 المرفقة بمفاصل الذراع الخمسة على أنها نسبي دلتا من الحالة الحالية، والقابض (gripper) على أنه مطلق موضع مستهدف، لأن إشارة الفتح أو الإغلاق الثنائية تعمل بشكل أفضل كهدف منها كدلتا.
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. لا يزال مسار conda القديم بالإضافة إلى pip install -e . لا يزال موجودًا في قسم مطوي من ملف README، لكنه يحذر من أن تبعيات وحدة معالجة الرسوميات (GPU) بما في ذلك flash-attn و TensorRT قد تحتاج إلى تثبيت يدوي. استخدم uv ما لم يكن لديك سبب محدد لعدم القيام بذلك. فيما يتعلق بـ flash-attn، هناك تفصيل واحد يجنب الالتباس: سترى Installing flash-attn مطبوعًا في كل مرة تقوم فيها بتشغيل uv run. إنه لا يقوم بإعادة البناء. يقوم uv بإعادة التحقق من عجلة مثبتة بواسطة URL ومخزنة مؤقتًا بالفعل، ويستغرق ذلك ثانيتين أو ثلاث ثوانٍ.
- 1تثبيت git-lfs، ثم استنساخ مع الوحدات الفرعية
git-lfs مطلوب، وليس اختياريًا. بدونه، تأتي ملفات parquet في demo_data/ ككعب مؤشر، ويفشل تشغيل العرض التوضيحي على مجموعة بيانات تبدو موجودة في قائمة الملفات.
bashsudo apt install git-lfs && git lfs install git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T - 2تثبيت uv ومزامنة البيئة
يسحب التثبيت الافتراضي تبعيات وحدة معالجة الرسوميات (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')" - 3المصادقة مع Hugging Face
قم بذلك قبل إطلاق التدريب الأول، وليس بعد فشله بثماني دقائق.
bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 4فحص السلامة على بيانات العرض التوضيحي SO-100 المرفقة
قبل لمس تسجيلك الخاص، قم بتشغيل 2000 خطوة على demo_data/cube_to_bowl_5. إنها خمس حلقات، تنتهي بسرعة، وتثبت البيئة بدلاً من بياناتك. إذا فشل هذا التشغيل، فلن يساعد أي شيء تفعله لمجموعة بياناتك.
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 | 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 | لا توجد علامة بذرة (seed) في واجهة سطر الأوامر هذه. |
ذلك الصف الأخير ليس خطأ مطبعيًا. launch_finetune.py هو واجهة سطر أوامر (CLI) من tyro تم إنشاؤها من فئة بيانات (dataclass)، وتلك الفئة لا تحتوي على حقل للبذرة (seed). يذكر ملف README بشكل منفصل تباينًا يتراوح بين 5 إلى 6 بالمائة بين عمليات التشغيل بسبب زيادة الصور غير الحتمية. لن تنتج عمليتا تشغيل بنفس العلامات نقاط فحص متطابقة، وهو أمر مهم جدًا عندما تحاول تحديد ما إذا كان تغيير المعاملات الفائقة (hyperparameter) قد ساعد أم أنك كنت محظوظًا. للمقارنة، يستخدم مدرب lerobot الافتراضي البذرة 1000، وتمرر وصفة LeRobot GR00T البذرة --seed=42 بشكل صريح.
تُجرى عمليات الضبط الدقيق (fine-tuning) باستخدام eval_strategy="no"، لذلك لا يوجد منحنى فقدان للتحقق على الإطلاق. تحصل على فقدان التدريب ولا شيء آخر. يخبرك دليل التجسيد الجديد بتشغيله باستخدام --eval-strategy steps --eval-steps 500، ولكن هذه العلامة غير موجودة في launch_finetune.py: يتم إنشاء واجهة سطر الأوامر (CLI) بواسطة tyro من فئة البيانات FinetuneConfig، و eval_strategy و eval_steps و eval_batch_size هي حقول في TrainingConfig بدلاً من ذلك. قيمها الافتراضية هناك هي "no" و 500 و 2. للوصول إليها، استخدم نقطة الدخول الأكمل gr00t/experiment/launch_train.py، حيث تكون العلامة المتداخلة هي --training.eval-strategy. في كلتا الحالتين، فإن انخفاض فقدان التدريب بمفرده يخبرك بالقليل جدًا عن التعميم، وهو بالضبط الوضع الموصوف في ينخفض الفقدان لكن السياسة لا تفعل شيئًا.
تكلفة تشغيل 20000 خطوة
يتطلب GR00T N1.7 بطاقة بسعة 80 جيجابايت، لذا فإن سؤال التكلفة له إجابة محددة. على AY-Robots، يعمل مدرب groot1.7 على فئة A100 80 GB أو H100 80 GB، حيث تستغرق عملية التشغيل من 3 إلى 6 ساعات بتكلفة تتراوح بين 1.20 إلى 2.00 دولار أمريكي في الساعة في السوق الفورية. هذا يعادل تقريبًا من 4 إلى 12 دولارًا أمريكيًا لمهمة الـ 20000 خطوة الافتراضية. نفس المهمة على SmolVLA أو ACT تعمل على بطاقة بسعة 24 جيجابايت بتكلفة تتراوح بين 0.30 إلى 0.60 دولار أمريكي في الساعة ومن 1 إلى 3 دولارات أمريكية لكل عملية تشغيل. هذا هو المقايضة الحقيقية: يكلف GR00T حوالي أربعة أضعاف لكل محاولة، ولا يمكنك تشغيله على بطاقة 4090 الموجودة تحت مكتبك.
| النموذج | فئة وحدة معالجة الرسوميات | مدة التشغيل النموذجية | التكلفة النموذجية | الحد الأدنى للحلقات |
|---|---|---|---|---|
| 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 أكثر تطلبًا: حوالي 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 خطوة.
| نقطة التحقق | متوسط MSE على المسار 0 | متوسط MAE على المسار 0 |
|---|---|---|
| 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 وأن نطاقات الإجراءات معقولة فيزيائيًا. |
| جيد على المسار 0، ضعيف على الحلقات المحتجزة | ندرة البيانات، وليس خطأ. خمس حلقات تجريبية لا يمكن تعميمها. |
المسار الآخر: lerobot-train بدلاً من Isaac-GR00T
يقدم الإصدار الحالي من LeRobot، 0.6.1 على PyPI منذ 3 أغسطس 2026، طريقة ثانية ومختلفة تمامًا لضبط نفس الأوزان الأساسية. يعرض LeRobot GR00T N1.7 كنوع سياسة ويدربه من خلال نقطة الدخول الخاصة به lerobot-train. هناك أمران مهمان هنا. واجهة سطر الأوامر (CLI) الخاصة بـ LeRobot هي مجموعة من نصوص وحدة التحكم، لذا فإن أي شيء تقرأه يقول python lerobot/scripts/train.py قديم ولن يعمل. وقد أزال LeRobot دعم GR00T N1.5 بالكامل، رافضًا نقاط التحقق والتكوينات الخاصة بـ N1.5 مع ملاحظة ترحيل، لذا إذا كنت بحاجة إلى N1.5 من خلال LeRobot، فيجب عليك تثبيت 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 بالإضافة إلى إعداد بيانات بايثون | لا يوجد modality.json؛ يتم تحديد السلوك بواسطة علامات --policy.* في سطر الأوامر | |
| لا توجد علامة بذرة على الإطلاق | --seed، الافتراضي في LeRobot هو 1000 | |
| ActionConfig لكل مفتاح في إعداد البيانات | --policy.use_relative_actions بالإضافة إلى --policy.relative_exclude_joints | |
| اتجاه MSE للحلقة المفتوحة SO-100 على البيانات التجريبية | مجموعات LIBERO، متوسط 96.5 بالمائة عبر أربع مجموعات | |
| run_gr00t_server.py بالإضافة إلى eval_so100.py عبر ZMQ | lerobot-rollout، مع تقسيم في الوقت الفعلي (يجب أن يبقى queue_threshold عند 5 أو أقل) |
- كل علامة مرئية وقابلة للتغيير. يمكنك إلغاء تجميد المشفر البصري، أو نقل state_dropout_prob، أو تقصير أفق الإجراء.
- مخططات الحلقة المفتوحة هي ملفات محلية. مقارنة checkpoint-5000 بـ checkpoint-20000 هو أمر shell.
- أنت لا تعتمد على بقاء أي منصة متصلة بالإنترنت، ونقطة التحقق موجودة على قرصك بتنسيق قياسي.
- أمثلة المعيار في المستودع لـ LIBERO وSimplerEnv وDROID تمنحك تشغيلات جيدة معروفة لإعادة إنتاجها قبل أن تثق ببياناتك الخاصة.
- البيئة هي الجزء الأكبر من العمل. إصدار FFmpeg، وCUDA_HOME، وgit-lfs، والعمود الفقري المقيد، وtorchcodec: لا شيء من هذه يمثل مشاكل في النموذج وكل واحد منها يوقف التشغيل.
- يتطلب التحويل من v3.0 إلى v2.1 بيئة افتراضية منفصلة بخطوة تثبيت خاصة بها، ويعيد كتابة دليل مجموعة البيانات الخاص بك في مكانه.
- يبدأ تأجير وحدة معالجة الرسوميات في الفوترة عند بدء التصحيح، وليس عند بدء التدريب، ولا شيء يوقف المثيل عند انتهاء التشغيل.
- عدم وجود بذرة يعني عدم قابلية الاستنساخ بت-بايت، بالإضافة إلى تباين من 5 إلى 6 بالمائة بين التشغيل والآخر من التكبير وحده.
طريقتان للحصول على نفس نقطة التحقق
تستأجر وحدة معالجة الرسوميات (GPU) وتتحكم في كل خطوة. واقعيًا، يستغرق هذا الأمر فترة بعد الظهر في المرة الأولى وعشرين دقيقة في كل مرة بعد ذلك.
- سجل الحلقات باستخدام lerobot-record على SO-100. ستحصل على مجموعة بيانات LeRobot v3.0.
- حولها إلى v2.1 باستخدام scripts/lerobot_conversion/convert_v3_to_v2.py في بيئة افتراضية خاصة بها.
- اكتب 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.
نفس المهمة كنموذج. تختار النموذج ومجموعة البيانات، ويستأجر الواجهة الخلفية وحدة معالجة رسوميات (GPU) من السوق الفوري حسب ذاكرة الفيديو المطلوبة، ويشغل المدرب، ويكتب نقاط الحفظ إلى تخزين الكائنات. دليل GR00T N1.7 على SO-100 هو هذا المزيج بالضبط؛ مصفوفة التدريب تحتوي على كل نموذج آخر وزوج ذراع، بما في ذلك GR00T N1.7 على SO-101.
| ما يرسله مدرب groot1.7 | القيمة |
|---|---|
| حجم الدفعة | 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، أو من جهازك الخاص، أو من جلسة سجلتها باستخدام عميل سطح المكتب. الاستدلال هو خطوة منفصلة: توفر المنصة حاوية (pod) تخدم السياسة، ويتحدث عميل الروبوت المحلي الخاص بك إلى نقطة النهاية هذه. تحمل الحاويات مراقبًا للخمول وتدمر نفسها بعد فترة خمول، لذا فإن علامة تبويب متصفح منسية لا تسبب فواتير طوال الليل. إذا كنت تفضل عدم النقر، فإن نفس العمليات موجودة على واجهة سطر الأوامر (CLI) و خادم MCP.
GR00T N1.7 و Pi0.5 متاحان على السحابة فقط هنا؛ فقط SmolVLA و ACT يعملان محليًا أيضًا. متطلب v2.1 لا يختفي أيضًا، لأن مجموعة بيانات v3.0 لا تزال بحاجة إلى التحويل قبل أن يقبلها محمل GR00T. ولا يوجد شيء يكتب دلالات modality.json الخاصة بك نيابة عنك: إذا كانت مفاتيح الكاميرا أو مفتاح اللغة خاطئة، فستكون خاطئة على كلا المسارين. راجع وثائق التدريب لمعرفة ما تفعله الواجهة الخلفية وما لا تفعله نيابة عنك.

إعادة نقطة الحفظ إلى الذراع
يستخدم Isaac-GR00T تقسيم خادم-عميل عبر ZMQ. تعمل السياسة على وحدة معالجة الرسوميات (GPU)، ويرسل عميل خفيف على جهاز الروبوت الملاحظات ويتلقى أجزاء الإجراءات. مثال SO-100 كامل بما يكفي للنسخ: ابدأ run_gr00t_server.py بنقطة الحفظ الخاصة بك و --embodiment-tag NEW_EMBODIMENT، ثم شغل eval_so100.py على جانب الروبوت باستخدام المنفذ التسلسلي، ومعرف الروبوت، ومؤشرات الكاميرا، وتعليمات اللغة. يجب أن تتطابق أسماء الكاميرا في هذا الأمر مع الأسماء الودية من modality.json الخاص بك، وليس أرقام أجهزة نظام التشغيل.
# 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 على محركات سيرفو Feetech STS3215 على سكة 7.4 V. تغذيتها بـ 12 V تدمرها، وهذا خطأ سهل إذا كنت تمتلك أيضًا LeKiwi، الذي تعمل قاعدته بـ 12 V بينما لا تعمل ذراعه. تحقق من مصدر الطاقة قبل التشغيل الأول، وليس بعد الدخان. راجع صفحة أجهزة SO-100 و SO-100 مقابل LeKiwi. إذا تم تشغيل الذراع ولكن لا شيء يتحرك، فإن السيرفو لا يستجيب هو المكان المناسب للبدء.
الآن الجزء الصادق حول مكان تشغيل السياسة، لأن التدريب والخدمة لهما قصص أجهزة مختلفة. يتطلب الضبط الدقيق 40 جيجابايت أو أكثر. الاستدلال لا يتطلب ذلك: يضع ملف README المتطلبات عند 16 جيجابايت أو أكثر ويذكر 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 بزيادة تباين الألوان (colour jitter augmentation) بالإضافة إلى 20 إلى 50 حلقة عبر إضاءات مختلفة. المزيد هنا.
- المقبض لا يغلق بشكل صحيح أبدًا. تحقق من أن حركة المقبض هي ABSOLUTE ومفاصل الذراع هي RELATIVE، بهذا الترتيب في action_configs. المقبض لا يغلق يسرد الأسباب الأخرى.
- كاميرا تتوقف عن العمل بصمت أثناء التسجيل. لا تزال الحلقة تُحفظ ومفتاح الفيديو لا يزال موجودًا، وهذا هو سبب صعوبة هذه المشكلة. الكاميرا غير مكتشفة تغطي ذلك.
الفهرس الكامل لأنماط الفشل موجود في . إذا كنت تختار بين النماذج بدلاً من تصحيح أخطاء نموذج واحد، فإن و تحتوي على أرقام معيارية مع مصادر مرفقة، و هي المقارنة التي يحتاجها معظم الناس بالفعل، لأنها الخيار بين نموذج يمكنك تدريبه على البطاقة الموجودة تحت مكتبك وآخر يتعين عليك استئجار عقدة 80 جيجابايت لضبطه بدقة. للحصول على خلفية حول سبب سلوك هذه النماذج بهذه الطريقة، فإن و تستحق القراءة أولاً. وإذا لم تكن تمتلك ذراعًا بعد، فإن تبث SO-100 مادية بدون تسجيل.
كم عدد الحلقات التي أحتاجها قبل أن يصبح الضبط الدقيق لـ GR00T N1.7 ذا قيمة؟▾
تحدد AY-Robots حدًا أدنى قدره 50 حلقة لمدرب groot1.7. الأسئلة الشائعة الخاصة بـ NVIDIA أكثر تطلبًا: حوالي 100 مسار لالتقاط ووضع بسيط في موقع ثابت، و500 أو أكثر للمشاهد المعقدة أو متعددة الخطوات، و100 إلى 500 للتلاعب الدقيق. أقل من 50 حلقة، من الأفضل دائمًا تسجيل المزيد من البيانات بدلاً من ضبط المعلمات الفائقة. إذا استقرت نسبة النجاح بعد ذلك، توصي NVIDIA بـ HG-DAgger: قم بتشغيل السياسة، وتدخل عند فشلها، وأضف هذه التصحيحات إلى مجموعة البيانات.
لماذا تفشل مجموعة البيانات الخاصة بي في التحميل، وكيف أعرف أي إصدار هي؟▾
افتح meta/info.json واقرأ codebase_version. إصدار CODEBASE_VERSION الحالي لـ LeRobot على main هو v3.0، لذا فإن أي شيء تم تسجيله باستخدام سلسلة أدوات حديثة هو v3.0، ويتوقع محمل GR00T الإصدار v2. قم بالتحويل باستخدام scripts/lerobot_conversion/convert_v3_to_v2.py من مستودع Isaac-GR00T، والذي يكتب codebase_version: v2.1 في مجموعة البيانات المحولة. يعمل السكريبت في بيئة افتراضية خاصة به لأنه يحتاج إلى إصدار مختلف من lerobot عن الذي يحدده GR00T.
هل يمكنني ضبط GR00T N1.7 بدقة على RTX 4090؟▾
لا. توصي NVIDIA بـ 40 جيجابايت أو أكثر من ذاكرة الفيديو (VRAM) للضبط الدقيق وتسمي عقد H100 أو L40؛ تعمل البطاقات الأخرى ولكنها تستغرق وقتًا أطول بكثير. تحتوي 4090 على 24 جيجابايت. تقدم AY-Robots GR00T N1.7 فقط على مستوى A100 80 جيجابايت و H100 80 جيجابايت لنفس السبب. الاستدلال قصة مختلفة: 16 جيجابايت كافية لخدمة النموذج، لذا يمكن لـ 4090 تشغيل سياسة لا يمكنها تدريبها. إذا كنت تريد VLA يمكنك تدريبها على 24 جيجابايت، فهذا هو SmolVLA بحوالي 450 مليون معلمة أو ACT بحوالي 80 مليون.
لماذا تعطي عمليتان تشغيل بنفس العلامات نقاط فحص مختلفة؟▾
لأن launch_finetune.py لا يحتوي على بذرة (seed). إنه واجهة سطر أوامر (CLI) من نوع tyro تم إنشاؤها من فئة بيانات لا تحتوي على حقل بذرة، لذلك لا يوجد ما يثبت مولد الأرقام العشوائية (RNG). يشير المستودع بشكل منفصل إلى تباين بنسبة 5 إلى 6 بالمائة بين عمليات التشغيل ناتج عن زيادة الصور غير الحتمية. إذا كانت قابلية التكرار مهمة، استخدم مسار LeRobot بدلاً من ذلك: lerobot-train يأخذ --seed ووصفة GR00T المنشورة تمرر --seed=42.
هل يجب أن أستخدم Isaac-GR00T أم lerobot-train؟▾
استخدم Isaac-GR00T إذا كنت تريد التنفيذ المرجعي، أو التحكم لكل مفتاح في تمثيل الإجراء، أو تصدير TensorRT، أو أمثلة المعايير لإعادة إنتاجها قبل الثقة ببياناتك الخاصة. استخدم lerobot-train إذا كانت مجموعة بياناتك بالفعل LeRobot v3.0 وتفضل عدم تحويلها، أو إذا كنت تريد بذرة (seed)، أو إذا كانت بقية حزمتك هي LeRobot بالفعل. كلاهما يضبط بدقة نفس أوزان nvidia/GR00T-N1.7-3B. لاحظ أن LeRobot أسقط دعم GR00T N1.5 بالكامل: يتم رفض نقاط فحص N1.5 مع ملاحظة ترحيل، وعليك تثبيت lerobot==0.5.1 للاستمرار في استخدامها.
هل أحتاج حقًا إلى كاميرا معصم بالإضافة إلى كاميرا أمامية؟▾
يستخدم تكوين SO-100 المشحون كليهما، ويقوم modality.json بتعيين الأمامية والمعصم كمفاتيح فيديو منفصلة. يمكنك التدريب بكاميرا واحدة، ويتم قياس جدول زمن الاستجابة لبطاقة النموذج بكاميرا واحدة، ولكن عرض المعصم هو ما يمنح السياسة معلومات قابلة للاستخدام حول المقبض لحظة الاتصال. إذا أغلق المقبض في الوقت الخطأ في عمليات التشغيل الخاصة بك، فإن كاميرا المعصم المفقودة أو الموجهة بشكل سيء هي أحد أول الأشياء التي يجب التحقق منها.
اضبط GR00T N1.7 بدقة على SO-100 الخاص بك دون بناء البيئة أولاً
اختر النموذج ومجموعة البيانات والمعلمات الفائقة في نموذج. يقوم الواجهة الخلفية باستئجار A100 80 GB أو H100 في السوق الفورية، ويشغل المدرب بدفعة 32، ومعدل تعلم 1e-4 و20000 خطوة، ويكتب نقاط الفحص إلى تخزين الكائنات. حوالي 4 إلى 12 دولارًا أمريكيًا لكل تشغيل.
افتح دليل تدريب GR00T N1.7Sources
- 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