صفحة دليل AY-Robots لتدريب GR00T N1.7 على ذراع SO-100، تُظهر فئة وحدة معالجة الرسوميات المطلوبة، وتنسيق مجموعة البيانات، والإعدادات الافتراضية للمدرب
GR00T N1.7SO-100الضبط الدقيقLeRobotVLA

كيفية تدريب GR00T N1.7 على مجموعة بيانات SO-100 الخاصة بك

AY-Robots ResearchAugust 23, 202628 دقيقة قراءة

دليل مجرّب للضبط الدقيق لـ 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 Facerepo 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.0Isaac-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 تعرضها جنبًا إلى جنب.

صفحة نموذج AY-Robots لـ GR00T N1.7 التي تعرض عدد المعلمات، وفئة وحدة معالجة الرسوميات (GPU)، وزمن استجابة الاستدلال، ونقاط قوة النموذج وحدوده المعلنة.
تحمل صفحة /policies/groot-n1-7 نفس شريط المواصفات الذي قد تقوم بتجميعه يدويًا من بطاقة النموذج وملف README للمستودع.

ما يحتاجه التشغيل قبل أن تكتب أي شيء

المتطلبالضبط الدقيقالاستدلال
ذاكرة الفيديو (VRAM)، إرشادات NVIDIA40 جيجابايت أو أكثر، يوصى بـ H100 أو L4016 جيجابايت أو أكثر، تعمل RTX 4090
Python و CUDA على dGPU3.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
فئة وحدة معالجة الرسوميات (GPU) من AY-Robots لمدرب groot1.7A100 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 وتدفقات الكاميرا. إذا كانت المعايرة غير دقيقة، فإن قيم المفاصل في مجموعة بياناتك تصف روبوتًا مختلفًا قليلاً عن الروبوت الذي سينفذ السياسة لاحقًا، ولا يمكن لأي قدر من التدريب إصلاح ذلك.

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-record على LeRobot حالي. يبلغ طول الحلقة الافتراضي 60 ثانية ووقت إعادة الضبط 60 ثانية. تم تسجيل so100_follower و so101_follower كلاهما مقابل نفس فئة تكوين LeRobot، ولهذا السبب يستخدم مثال Isaac-GR00T SO100 أسماء so101؛ كلاهما يعمل على SO-100. أسماء الكاميرات التي تختارها هنا (front, wrist) هي الأسماء التي يجب أن تظهر مرة أخرى في modality.json.

نصيحة 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 يشرح ما هو موجود بالفعل بداخلها.

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، وتأخذ النسخة المحولة المسار الأصلي. (يسمي 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./, وملف إضافي واحد لا يمتلكه 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 ولا يوجد شيء في ملف parquet يوضح أي فهرس هو أي. 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. الفهارس تبدأ من الصفر وتتبع تقطيع بايثون، لذا single_arm هو [0:5] و gripper هو [5:6].

انسخه إلى مجموعة البيانات المحولة الخاصة بك في meta/modality.json وأعد تسمية مفاتيح الفيديو لتتوافق مع الأسماء الفعلية لكاميراتك. إذا قمت بالتسجيل باستخدام كاميرا علوية واحدة تسمى top، فإن original_key هو observation.images.top والاسم الودي هو ما سيشير إليه تكوين بياناتك. يجب أن يتفق الاثنان، ولا يتحقق أي منهما من الآخر نيابة عنك. التعليق التوضيحي للغة أسوأ، لأن نفس المفتاح يجب أن يظهر في ثلاثة أماكن.

الطبقةالملفصيغة SO-100 المستخدمة في المستودع
عمود Parquetdata/chunk-*/episode_*.parquetannotation.human.task_description
مفتاح modality.jsonmeta/modality.json, under "annotation", without the annotation. prefixhuman.task_description
مفاتيح modality_keys في تكوين البياناتyour so100_config.pyannotation.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) على أنه مطلق موضع مستهدف، لأن إشارة الفتح أو الإغلاق الثنائية تعمل بشكل أفضل كهدف منها كدلتا.

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 بالإضافة إلى دوران سداسي الأبعاد.

هناك تفصيلان هنا سيكلفانك يومًا كاملاً إذا لم تكن تعرفهما. أولاً، 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 مطلوب، وليس اختياريًا. بدونه، تأتي ملفات parquet في demo_data/ ككعب مؤشر، ويفشل تشغيل العرض التوضيحي على مجموعة بيانات تبدو موجودة في قائمة الملفات.

    bash
    sudo apt install git-lfs && git lfs install
    git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
  2. 2
    تثبيت uv ومزامنة البيئة

    يسحب التثبيت الافتراضي تبعيات وحدة معالجة الرسوميات (GPU) بما في ذلك flash-attn و TensorRT. على صورة A100 أو H100 جديدة، هذه هي أطول خطوة منفردة، لذا قم بها قبل أن تبدأ في الانتباه إلى أي شيء آخر.

    bash
    curl -LsSf https://astral.sh/uv/install.sh | sh
    sudo apt-get update && sudo apt-get install -y ffmpeg
    uv sync --python 3.12
    uv run python -c "import gr00t; print('GR00T installed successfully')"
  3. 3
    المصادقة مع Hugging Face

    قم بذلك قبل إطلاق التدريب الأول، وليس بعد فشله بثماني دقائق.

    bash
    uv run huggingface-cli login   # or: export HF_TOKEN=<your_token>
  4. 4
    فحص السلامة على بيانات العرض التوضيحي SO-100 المرفقة

    قبل لمس تسجيلك الخاص، قم بتشغيل 2000 خطوة على demo_data/cube_to_bowl_5. إنها خمس حلقات، تنتهي بسرعة، وتثبت البيئة بدلاً من بياناتك. إذا فشل هذا التشغيل، فلن يساعد أي شيء تفعله لمجموعة بياناتك.

    bash
    CUDA_VISIBLE_DEVICES=0 uv run python \
        gr00t/experiment/launch_finetune.py \
        --base-model-path nvidia/GR00T-N1.7-3B \
        --dataset-path demo_data/cube_to_bowl_5 \
        --embodiment-tag NEW_EMBODIMENT \
        --modality-config-path examples/SO100/so100_config.py \
        --num-gpus 1 \
        --output-dir /tmp/test_finetune \
        --max-steps 2000 \
        --global-batch-size 32 \
        --dataloader-num-workers 4
فخّان بيئيان يبدوان كأخطاء في النموذج

FFmpeg 8. يدعم torchcodec 0.8.0 إصدارات FFmpeg من 4 إلى 7 فقط، وتأتي Ubuntu 25.10 والإصدارات الأحدث مع الإصدار 8. الخطأ هو Could not load libtorchcodec، والذي يبدو وكأنه تثبيت معطل بدلاً من تعارض في الإصدار. قم بتثبيت وقت تشغيل أقدم، على سبيل المثال conda install -c conda-forge 'ffmpeg<8'، وضع مكتباته على LD_LIBRARY_PATH. CUDA_HOME غير مضبوط. يفشل الضبط الدقيق تمامًا. قم بتشغيل bash scripts/deployment/dgpu/install_deps.sh مرة واحدة، أو فقط export CUDA_HOME=/usr/local/cuda.

الخطوة 5: أمر الضبط الدقيق وما هي القيم الافتراضية لعلاماته حقًا

استبدل مجموعة البيانات التجريبية بمجموعتك وأضف الإعدادات التي تريدها بالفعل. أدناه هو الشكل الكامل الذي يستخدمه المستودع في برنامجه التعليمي الخاص بالتجسيد الجديد، بما في ذلك علامات التعزيز وحفظ نقاط التفتيش التي يغفلها مثال README القصير. هذا هو بالمعنى الضيق: يظل العمود الفقري للغة والمشفر البصري مجمدين، وما يتم تدريبه هو جهاز العرض ورأس عمل الانتشار.

bash
export NUM_GPUS=1
CUDA_VISIBLE_DEVICES=0 uv run python \
    gr00t/experiment/launch_finetune.py \
    --base-model-path nvidia/GR00T-N1.7-3B \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --modality-config-path examples/SO100/so100_config.py \
    --num-gpus $NUM_GPUS \
    --output-dir /tmp/so100 \
    --save-total-limit 5 \
    --save-steps 2000 \
    --max-steps 20000 \
    --use-wandb \
    --global-batch-size 32 \
    --color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \
    --dataloader-num-workers 4
وحدة معالجة رسوميات واحدة. لثماني بطاقات، استبدل المشغل بـ uv run torchrun --nproc_per_node=8 --master_port=29500 واضبط --num-gpus 8. استخدم uv run torchrun، وليس torchrun المجرد، وإلا ستحصل على بيئة خاطئة.
العلامةالقيمة الافتراضية في FinetuneConfigماذا تفعل
--global-batch-size64إجمالي الدفعة عبر جميع وحدات معالجة الرسوميات قبل تجميع التدرج. الأمثلة المرفقة تستخدم 32.
--learning-rate1e-4نفس القيمة التي يرسلها AY-Robots لمدرب groot1.7 الخاص به.
--max-steps10000إجمالي خطوات المحسّن. غلاف examples/finetune.sh يضبط افتراضيًا على 10000 أيضًا.
--gradient-accumulation-steps1يضاعف الدفعة الفعالة. القيم التي تزيد عن 1 تصدر تحذيرًا يخبرك بالحجم المتراكم.
--save-steps and --save-total-limit1000 and 5تكرار نقاط التفتيش، وعدد ما يتم الاحتفاظ به. يتم حذف الأقدم.
--weight-decay and --warmup-ratio1e-5 and 0.05تم تعيينها صراحة بواسطة examples/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لا توجد علامة بذرة (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.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 أكثر تطلبًا: حوالي 100 مسار لالتقاط ووضع بسيط في موقع ثابت، و500 أو أكثر للمشاهد المعقدة أو متعددة الخطوات، و100 إلى 500 للتلاعب الدقيق. إذا كنت عند 20 حلقة، فاقضِ فترة ما بعد الظهر في التسجيل بدلاً من المساء في الضبط. الـ دليل جمع البيانات يغطي ما يميز الحلقة المفيدة عن الضائعة، سجل مجموعة بياناتك الأولى هي النسخة المختصرة، و جمع بيانات SO-100 هي النسخة الخاصة بالذراع.

الخطوة 6: التقييم ذو الحلقة المفتوحة قبل لمس الذراع

لا تضع نقطة تحقق جديدة على ذراع مادية لمعرفة ما إذا كان التدريب قد نجح. قم بتشغيل التقييم ذي الحلقة المفتوحة أولاً. يقوم بإعادة تشغيل حلقة مسجلة، ويطلب من النموذج الإجراءات في كل خطوة، ويرسم التنبؤ مقابل الحقيقة الأساسية مع MSE و MAE. لا يكلف شيئًا ويلتقط أخطاء التعيين من الخطوتين 2 و 3.

bash
uv run python gr00t/eval/open_loop_eval.py \
    --dataset-path ./my_dataset_lerobot \
    --embodiment-tag NEW_EMBODIMENT \
    --model-path /tmp/so100/checkpoint-20000 \
    --traj-ids 0 \
    --execution-horizon 16 \
    --steps 400 \
    --modality-keys single_arm gripper
تظهر الرسوم البيانية في /tmp/open_loop_eval/traj_<id>.jpeg ما لم تمرر --save-plot-path. الإعدادات الافتراضية: --execution-horizon 16, --steps 200, --denoising-steps 4, --traj-ids 0.

يتعمد المستودع عدم نشر MSE مستهدف للبيانات المخصصة، وهذا هو القرار الصحيح: يعتمد الرقم على وحدات الإجراءات الخاصة بك، ومهمتك، وحجم مجموعة البيانات الخاصة بك، لذا فإن عتبة منسوخة من ذراع شخص آخر لا تعني شيئًا. ما هو ذو معنى هو الاتجاه. إليك التشغيل المرجعي الذي يوثقه المستودع على H100 واحد مع مجموعة بيانات العرض التوضيحي المكونة من خمس حلقات و 2000 خطوة.

نقطة التحققمتوسط MSE على المسار 0متوسط MAE على المسار 0
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 وأن نطاقات الإجراءات معقولة فيزيائيًا.
جيد على المسار 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.

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
وصفة GR00T N1.7 الأصلية في LeRobot. لاحظ relative_exclude_joints: يتم استبعاد القابض من الإجراءات النسبية، وهو نفس القرار الذي يتخذه so100_config.py مع ActionRepresentation.ABSOLUTE.
الجانبIsaac-GR00T launch_finetune.pylerobot-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 عبر ZMQlerobot-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) وتتحكم في كل خطوة. واقعيًا، يستغرق هذا الأمر فترة بعد الظهر في المرة الأولى وعشرين دقيقة في كل مرة بعد ذلك.

  1. سجل الحلقات باستخدام lerobot-record على SO-100. ستحصل على مجموعة بيانات LeRobot v3.0.
  2. حولها إلى v2.1 باستخدام scripts/lerobot_conversion/convert_v3_to_v2.py في بيئة افتراضية خاصة بها.
  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 بخمسة نماذج سياسة كصفوف وأربعة أذرع روبوت كأعمدة، وكل خلية تربط بدليل تدريب محدد
مصفوفة /train: خمسة نماذج مقابل أربعة أذرع. صف 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 الخاص بك، وليس أرقام أجهزة نظام التشغيل.

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 على محركات سيرفو 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.7

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started