Η σελίδα οδηγού της AY-Robots για την εκπαίδευση του GR00T N1.7 σε έναν βραχίονα SO-100, που δείχνει το απαιτούμενο επίπεδο GPU, τη μορφή συνόλου δεδομένων και τις προεπιλογές εκπαιδευτή
GR00T N1.7SO-100Λεπτομερής ρύθμισηLeRobotVLA

Πώς να εκπαιδεύσετε το GR00T N1.7 στο δικό σας σύνολο δεδομένων SO-100

AY-Robots ResearchAugust 23, 202628 min ανάγνωσης

Μια δοκιμασμένη αναλυτική περιγραφή για τη λεπτομερή ρύθμιση του NVIDIA GR00T N1.7 σε ένα σύνολο δεδομένων LeRobot SO-100: πραγματικές σημαίες, modality.json, την απαίτηση v2.1, τι κοστίζει μια εκτέλεση, και τις παγίδες.

Η NVIDIA παρέχει ένα παράδειγμα fine-tuning για ακριβώς τον βραχίονα που πιθανώς διαθέτετε. Μέσα στο αποθετήριο Isaac-GR00T υπάρχει ένας φάκελος που ονομάζεται demo_data/cube_to_bowl_5: πέντε επεισόδια, 4.148 καρέ στα 30 fps, ήδη γραμμένα ως LeRobot v2.1, με μια αντίστοιχη διαμόρφωση τρόπου λειτουργίας (modality config) κάτω από 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, η διαμόρφωση δεδομένων Python, meta/relative_stats.json, και η δική του συμβολοσειρά έκδοσης του συνόλου δεδομένων. Αυτός ο οδηγός περιγράφει τη χειροκίνητη διαδρομή από την αρχή μέχρι το τέλος με τις πραγματικές εντολές, και στη συνέχεια δείχνει την ίδια εργασία ως φόρμα στο AY-Robots. Όλα τα παρακάτω ελέγχθηκαν έναντι του κύριου κλάδου του Isaac-GR00T από τις 20 Αυγούστου 2026 (η γραμμή έκδοσης n1.7) και του lerobot 0.6.1, που δημοσιεύτηκε στο PyPI στις 3 Αυγούστου 2026. Το upstream κινείται γρήγορα, και όπου ένα flag μετονομάστηκε, αυτό το άρθρο το αναφέρει.

Τι πρέπει να γνωρίζετε πριν ξεκινήσετε

  • Το fine-tuning του GR00T N1.7 απαιτεί 40 GB ή περισσότερο VRAM. Η NVIDIA συνιστά κόμβους H100 ή L40. Μια RTX 4090 με 24 GB δεν θα κάνει αυτή τη δουλειά, αν και θα εκπαιδεύσει τα SmolVLA και ACT.
  • Το σύνολο δεδομένων πρέπει να είναι LeRobot v2 (v2.0 ή v2.1) συν ένα GR00T-specific meta/modality.json. Ένα σύνολο δεδομένων LeRobot v3.0 δεν φορτώνεται και πρέπει να μετατραπεί σε παλαιότερη έκδοση.
  • Το σημείο εισόδου είναι το gr00t/experiment/launch_finetune.py, ένα tyro CLI. Δεν έχει σημαία --seed, οπότε οι εκτελέσεις δεν είναι αναπαραγώγιμες bit-for-bit.
  • Για έναν προσαρμοσμένο βραχίονα, η ετικέτα ενσωμάτωσης είναι NEW_EMBODIMENT, και αυτή η ετικέτα καθιστά υποχρεωτική τη σημαία --modality-config-path.
  • Η παρεχόμενη συνταγή SO-100 προβλέπει τις αρθρώσεις του βραχίονα ως ΣΧΕΤΙΚΑ δέλτα και τον αρπάγη ως ΑΠΟΛΥΤΟ στόχο. Το να γίνει αυτή η αντιστοίχιση ανάποδα είναι μια σιωπηλή αποτυχία, όχι ένα σφάλμα.
  • Στο AY-Robots η ίδια εργασία είναι μια φόρμα: 20000 steps, batch 32, learning rate 1e-4, περίπου 4 έως 12 USD στην κατηγορία A100 80 GB ή H100.

Τι είναι στην πραγματικότητα το GR00T N1.7

Το GR00T N1.7 είναι ένα μοντέλο όρασης-γλώσσας-δράσης με τη διάταξη διπλού συστήματος που περιγράφεται στην αρχική δημοσίευση GR00T N1: μια μονάδα όρασης-γλώσσας που διαβάζει τις κάμερες και την εντολή, και ένας μετασχηματιστής διάχυσης που μετατρέπει αυτό σε ένα κομμάτι συνεχών εντολών κινητήρα. Το N1.7 αντικατέστησε το πρώτο μισό. Το backbone Eagle από το N1.6 έχει φύγει, αντικαταστάθηκε από nvidia/Cosmos-Reason2-2B σε αρχιτεκτονική Qwen3-VL, και το μοντέλο προεκπαιδεύτηκε σε περίπου 20.000 ώρες εγωκεντρικού ανθρώπινου βίντεο επιπλέον των δεδομένων ρομπότ. Η δική της αναφορά της NVIDIA αναφέρει τον αριθμό σε 20.854 ώρες και αναφέρει ότι η μετάβαση από 1k σε 20k ώρες υπερδιπλασιάζει τη μέση ολοκλήρωση εργασιών.

Το δεύτερο μισό άλλαξε επίσης, με τρόπους που έχουν σημασία για την εκτέλεσή σας. Η κεφαλή δράσης μειώθηκε από 32 στρώματα διάχυσης σε 16, το προβλεπόμενο κομμάτι δράσης αυξήθηκε από 16 βήματα σε 40, και το μέγιστο πλάτος κατάστασης και δράσης πήγε από 29 σε 132. Αυτοί οι τρεις αριθμοί προέρχονται από το changelog στο README του αποθετηρίου. Η δική της δημοσίευση εκκίνησης της NVIDIA εξακολουθεί να περιγράφει το Σύστημα 1 ως ένα DiT 32 στρωμάτων, οπότε όπου οι δύο διαφωνούν, εμπιστευτείτε το αποθετήριο που πρόκειται να κλωνοποιήσετε. Οι ενέργειες εκφράζονται από προεπιλογή σε έναν σχετικό χώρο τελικού ενεργοποιητή, διαφορές από την τρέχουσα πόζα αντί για απόλυτους στόχους, κάτι που επιτρέπει τη μεταφορά των προηγούμενων γνώσεων χειρισμού που αποκτήθηκαν από ανθρώπινο βίντεο στον έλεγχο ρομπότ. Η ίδια η κεφαλή είναι ένας μετασχηματιστής διάχυσης αντιστοίχισης ροής, της ίδιας οικογένειας με το Pi0.5 αλλά με διαφορετικό backbone μπροστά του. Εάν εξακολουθείτε να χρησιμοποιείτε την προηγούμενη γενιά, το N1.7 έναντι N1.5 καλύπτει το αν η αναβάθμιση δικαιολογεί την επανεκτέλεση της διαδικασίας σας.

ΙδιότηταΤιμήΠροέλευση
Παράμετροι3,000,000,000Κάρτα μοντέλου Hugging Face
Backbone όρασης-γλώσσαςnvidia/Cosmos-Reason2-2B (Qwen3-VL), gated on Hugging Facerepo README
Κεφαλή δράσηςΜετασχηματιστής διάχυσης αντιστοίχισης ροής, 16 στρώματα (το N1.6 είχε 32)repo README
Προβλεπόμενος ορίζοντας δράσης40 steps for the base checkpoint (το 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 Agreementmodel card
Καθυστέρηση, H100 80 GB, PyTorch eager, 4 βήματα αποθορυβοποίησης, 1 κάμερα85.8 ms end to end, 11.7 Hzmodel card timing table
Ίδιο υλικό, πλήρης αγωγός TensorRT27.9 ms end to end, 35.9 Hzmodel card timing table
Καθυστέρηση που αναφέρει η AY-Robots για το εξυπηρετούμενο GR00T N1.7 της152 ms per action stepAY-Robots policy catalog

Αυτές οι τρεις τελευταίες σειρές εξηγούν το μεγαλύτερο μέρος της απογοήτευσης που αναφέρουν οι άνθρωποι. Ο πρωτοσέλιδος αριθμός των 27.9 ms είναι ένας κινητήρας TensorRT σε H100 με μία κάμερα και τέσσερα βήματα αποθορυβοποίησης. Το απλό PyTorch στην ίδια κάρτα είναι 85.8 ms, και η κάρτα μοντέλου τοποθετεί το κενό στο 3.08x. Κανένας αριθμός δεν περιλαμβάνει ένα serving layer, μια δεύτερη κάμερα ή ένα network hop. Τα 152 ms ανά βήμα δράσης που αναφέρει η AY-Robots για το εξυπηρετούμενο GR00T N1.7 της είναι ο αριθμός με το serving στον βρόχο, και ένα ταξίδι μετ' επιστροφής στο δημόσιο διαδίκτυο βρίσκεται πάνω από αυτό. Περισσότερα για αυτό στο τέλος. Για τους αριθμούς δίπλα σε άλλα μοντέλα, το GR00T N1.7 έναντι του Pi0.5 και το GR00T N1.7 έναντι του SmolVLA τα παραθέτουν δίπλα-δίπλα.

Η σελίδα μοντέλου της AY-Robots για το GR00T N1.7 που δείχνει τον αριθμό παραμέτρων, το επίπεδο GPU, την καθυστέρηση συμπερασμάτων και τα δηλωμένα πλεονεκτήματα και όρια του μοντέλου
Η σελίδα /policies/groot-n1-7 φέρει την ίδια λωρίδα προδιαγραφών που διαφορετικά θα συναρμολογούσατε χειροκίνητα από την κάρτα μοντέλου και το README του αποθετηρίου.

Τι χρειάζεται η εκτέλεση πριν πληκτρολογήσετε οτιδήποτε

ΑπαίτησηΒελτιστοποίηση (Fine-tuning)Συμπερασματολογία (Inference)
VRAM, οδηγίες NVIDIA40 GB ή περισσότερο, συνιστάται H100 ή L4016 GB ή περισσότερο, λειτουργεί μια RTX 4090
Python και CUDA σε dGPU3.12 και CUDA 12.83.12 και CUDA 12.8
Video backendtorchcodec 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 GB ή H100 80 GBτο pod παρέχεται αυτόματα
Το περιορισμένο backbone θα σας σταματήσει στην πρώτη εκτέλεση

Κάθε σημείο ελέγχου 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

Αυτό είναι το πιο συνηθισμένο εμπόδιο. Η τρέχουσα CODEBASE_VERSION του LeRobot στο main είναι v3.0, οπότε οτιδήποτε καταγράφετε σήμερα με μια τρέχουσα εργαλειοθήκη βγαίνει ως v3.0. Ο φορτωτής του GR00T αναμένει v2. Το αποθετήριο είναι σαφές ως προς τον λόγο: πολλά upstream σύνολα δεδομένων όπως τα DROID, LIBERO και Bridge δημοσιεύονται σε v2, και η εγγενής υποστήριξη και για τα δύο έχει προγραμματιστεί αλλά δεν έχει κυκλοφορήσει. Έτσι, η μετατροπή είναι δική σας ευθύνη, και εκτελείται στο δικό της virtualenv για έναν συγκεκριμένο λόγο: scripts/lerobot_conversion φέρει το δικό του pyproject που απαιτεί Python 3.10 ή 3.11 και δεσμεύει το lerobot σε ένα git commit, ενώ το ίδιο το 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 υπάρχει ήδη τοπικά, το script δημιουργεί τη διάταξη v2.1 δίπλα του και στη συνέχεια ανταλλάσσει: το αρχικό μετακινείται σε έναν αδελφό φάκελο με την έκδοση προσαρτημένη, <name>_v3.0, και το μετατρεπόμενο αντίγραφο παίρνει την αρχική διαδρομή. (Το docstring του script ονομάζει αυτόν τον φάκελο _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. Οι δείκτες είναι μηδενικής βάσης και ακολουθούν την κοπή (slicing) της Python, οπότε το 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 στο config δεδομένων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: η διαμόρφωση δεδομένων, σχετικός βραχίονας και απόλυτη λαβίδα

Η διαμόρφωση της τροπικότητας είναι ένα αρχείο Python και όχι JSON, επειδή αποφασίζει επίσης πώς αναπαρίσταται κάθε ομάδα δράσης. Αυτό είναι το μέρος της ροής εργασίας N1.7 που δεν υπήρχε στην ίδια μορφή στο N1.5, και το μέρος που αξίζει να διαβάσετε δύο φορές. Η διαμόρφωση SO-100 που παρέχεται προβλέπει τις πέντε αρθρώσεις του βραχίονα ως ΣΧΕΤΙΚΑ δέλτα από την τρέχουσα κατάσταση και τη λαβίδα ως ΑΠΟΛΥΤΗ θέση στόχο, επειδή ένα δυαδικό σήμα ανοιχτό-ή-κλειστό συμπεριφέρεται καλύτερα ως στόχος παρά ως δέλτα.

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 στην ίδια διαδικασία Python τερματίζεται με 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-pinned wheel που είναι ήδη στην κρυφή μνήμη, και αυτό διαρκεί δύο ή τρία δευτερόλεπτα.

  1. 1
    Εγκαταστήστε το git-lfs, μετά κλωνοποιήστε με υπομονάδες

    Το git-lfs είναι απαραίτητο, όχι προαιρετικό. Χωρίς αυτό, τα αρχεία parquet στο demo_data/ κατεβαίνουν ως δείκτες-placeholders, και η εκτέλεση του demo αποτυγχάνει σε ένα σύνολο δεδομένων που φαίνεται να υπάρχει στην καταχώριση αρχείων.

    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, το οποίο μοιάζει με κατεστραμμένη εγκατάσταση παρά με σύγκρουση έκδοσης. Εγκαταστήστε ένα παλαιότερο runtime, για παράδειγμα 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: η εντολή fine-tune και οι πραγματικές προεπιλογές των παραμέτρων της

Αντικαταστήστε το demo σύνολο δεδομένων με το δικό σας και προσθέστε τις ρυθμίσεις που πραγματικά θέλετε. Παρακάτω είναι η πλήρης μορφή που χρησιμοποιεί το αποθετήριο στο δικό του εκπαιδευτικό υλικό για νέα ενσωμάτωση (new-embodiment), συμπεριλαμβανομένων των παραμέτρων επέκτασης (augmentation) και σημείων ελέγχου (checkpointing) που παραλείπει το σύντομο παράδειγμα του README. Αυτό είναι με τη στενή έννοια: ο γλωσσικός κορμός (language backbone) και ο οπτικός κωδικοποιητής (visual encoder) παραμένουν παγωμένοι, και αυτό που εκπαιδεύεται είναι ο προβολέας (projector) και η κεφαλή δράσης διάχυσης (diffusion action head).

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Συνολικό batch σε όλες τις GPUs πριν τη συσσώρευση κλίσης (gradient accumulation). Τα παρεχόμενα παραδείγματα χρησιμοποιούν 32.
--learning-rate1e-4Η ίδια τιμή που στέλνει η AY-Robots για τον εκπαιδευτή groot1.7 της.
--max-steps10000Συνολικά βήματα βελτιστοποιητή. Ο wrapper examples/finetune.sh έχει επίσης προεπιλογή 10000.
--gradient-accumulation-steps1Πολλαπλασιάζει το πραγματικό batch. Τιμές πάνω από 1 εκδίδουν μια προειδοποίηση που σας ενημερώνει για το συσσωρευμένο μέγεθος.
--save-steps and --save-total-limit1000 and 5Συχνότητα σημείων ελέγχου (checkpoint), και πόσα διατηρούνται. Τα παλαιότερα διαγράφονται.
--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Απορρίπτει τυχαία την ιδιοδεκτική κατάσταση (proprioceptive state) κατά την εκπαίδευση. Μειώστε το αν η εργασία σας βασίζεται στην κατάσταση.
--tune-llm and --tune-visualFalse and FalseΟ κορμός (backbone) παραμένει παγωμένος από προεπιλογή.
--tune-projector and --tune-diffusion-modelTrue and TrueΟ προβολέας (projector) και η κεφαλή δράσης διάχυσης (diffusion action head) είναι αυτά που εκπαιδεύονται στην πραγματικότητα.
--use-percentilesTrueΚανονικοποίηση με q01 και q99 αντί για τις ακατέργαστες ελάχιστες και μέγιστες τιμές.
--dataloader-num-workers2Ο φορτωτής (loader) είναι σχεδιασμένος να βασίζεται σε CPU. Τα παραδείγματα το αυξάνουν σε 4.
--seedδεν υπάρχειΔεν υπάρχει παράμετρος seed σε αυτό το CLI.

Αυτή η τελευταία σειρά δεν είναι τυπογραφικό λάθος. launch_finetune.py είναι ένα CLI tyro που δημιουργείται από μια κλάση δεδομένων (dataclass), και αυτή η κλάση δεδομένων δεν έχει πεδίο seed. Το README σημειώνει ξεχωριστά διακύμανση 5 έως 6 τοις εκατό μεταξύ των εκτελέσεων που προκαλείται από μη-ντετερμινιστική αύξηση εικόνας. Δύο εκτελέσεις με πανομοιότυπες σημαίες δεν θα παράγουν πανομοιότυπα σημεία ελέγχου (checkpoints), κάτι που έχει μεγάλη σημασία όταν προσπαθείτε να αποφασίσετε αν μια αλλαγή υπερπαραμέτρου βοήθησε ή αν ήσασταν τυχεροί. Για σύγκριση, ο δικός του εκπαιδευτής του lerobot έχει ως προεπιλογή το seed 1000, και η συνταγή LeRobot GR00T περνάει --seed=42 ρητά.

Η επικύρωση είναι απενεργοποιημένη από προεπιλογή, και η τεκμηριωμένη σημαία δεν υπάρχει σε αυτό το CLI

Η λεπτομερής ρύθμιση (fine-tuning) εκτελείται με eval_strategy="no", οπότε δεν υπάρχει καθόλου καμπύλη απώλειας επικύρωσης. Παίρνετε μόνο την απώλεια εκπαίδευσης και τίποτα άλλο. Ο οδηγός νέας ενσωμάτωσης (new-embodiment) σας λέει να την ενεργοποιήσετε με --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 GB, οπότε το ερώτημα του κόστους έχει μια στενή απάντηση. Στο AY-Robots ο εκπαιδευτής groot1.7 τρέχει στην κατηγορία A100 80 GB ή H100 80 GB, όπου μια εκτέλεση διαρκεί 3 έως 6 ώρες με 1.20 έως 2.00 USD ανά ώρα στην αγορά spot. Αυτό είναι περίπου 4 έως 12 USD για την προεπιλεγμένη εργασία 20000 βημάτων. Η ίδια εργασία στο 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 είναι πιο απαιτητικές: περίπου 100 τροχιές για μια απλή επιλογή και τοποθέτηση σε σταθερή θέση, 500 ή περισσότερες για σύνθετες ή πολλαπλών βημάτων σκηνές, και 100 έως 500 για λεπτή χειραγώγηση. Αν βρίσκεστε στα 20 επεισόδια, αφιερώστε το απόγευμα στην καταγραφή αντί για το βράδυ στον συντονισμό. Ο οδηγός συλλογής δεδομένων καλύπτει τι διαχωρίζει ένα χρήσιμο επεισόδιο από ένα χαμένο, καταγράψτε το πρώτο σας σύνολο δεδομένων είναι η σύντομη έκδοση, και συλλογή δεδομένων SO-100 είναι η ειδική για τον βραχίονα.

Ο οδηγός εκπαίδευσης της AY-Robots για το GR00T N1.7 στο SO-100, που δείχνει τη λωρίδα προδιαγραφών με την κατηγορία GPU, την απαιτούμενη μορφή συνόλου δεδομένων και τις προεπιλογές του εκπαιδευτή
Ο οδηγός /train/groot-n1-7-on-so-100 παρουσιάζει τα δεδομένα που διαφορετικά θα ανακατασκευάζατε χειροκίνητα: κατηγορία GPU, μορφή συνόλου δεδομένων και τις ακριβείς προεπιλογές που στέλνει ο εκπαιδευτής.

Βήμα 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 και τους workers του dataloader.
Η καμπύλη πρόβλεψης είναι επίπεδη ή σταθερήΤα κλειδιά του 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 είναι ένα σύνολο από scripts κονσόλας, οπότε οτιδήποτε διαβάσετε που λέει 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 συν μια διαμόρφωση δεδομένων Pythonχωρίς 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 είναι μια εντολή κελύφους.
  • Δεν εξαρτάστε από καμία πλατφόρμα που παραμένει συνδεδεμένη, και το σημείο ελέγχου βρίσκεται στον δίσκο σας σε τυπική μορφή.
  • Τα παραδείγματα αναφοράς του αποθετηρίου για LIBERO, SimplerEnv και DROID σας δίνουν γνωστές-καλές εκτελέσεις για αναπαραγωγή πριν εμπιστευτείτε τα δικά σας δεδομένα.
Αντισταθμίσεις
  • Το περιβάλλον είναι το μεγαλύτερο μέρος της δουλειάς. Έκδοση FFmpeg, CUDA_HOME, git-lfs, το gated backbone, torchcodec: κανένα από αυτά δεν είναι προβλήματα μοντέλου και το καθένα από αυτά σταματά την εκτέλεση.
  • Η μετατροπή από v3.0 σε v2.1 απαιτεί ένα ξεχωριστό virtualenv με το δικό του βήμα εγκατάστασης, και ξαναγράφει τον κατάλογο του συνόλου δεδομένων σας επί τόπου.
  • Η ενοικίαση GPU αρχίζει να χρεώνεται όταν ξεκινάτε τον εντοπισμό σφαλμάτων, όχι όταν ξεκινά η εκπαίδευση, και τίποτα δεν σταματά την παρουσία όταν τελειώσει η εκτέλεση.
  • Χωρίς σπόρο σημαίνει μη αναπαραγωγιμότητα bit-προς-bit, επιπλέον της διακύμανσης 5 έως 6 τοις εκατό από εκτέλεση σε εκτέλεση μόνο από την αύξηση δεδομένων.

Δύο τρόποι για να αποκτήσετε το ίδιο σημείο ελέγχου

Ενοικιάζετε την GPU και έχετε τον έλεγχο κάθε βήματος. Ρεαλιστικά, αυτό απαιτεί ένα απόγευμα την πρώτη φορά και είκοσι λεπτά κάθε φορά μετά.

  1. Καταγράψτε επεισόδια με το lerobot-record στο SO-100. Θα λάβετε ένα σύνολο δεδομένων LeRobot v3.0.
  2. Μετατρέψτε το σε v2.1 με το scripts/lerobot_conversion/convert_v3_to_v2.py στο δικό του virtualenv.
  3. Γράψτε το meta/modality.json και μια διαμόρφωση Python modality, καταχωρημένη υπό το EmbodimentTag.NEW_EMBODIMENT.
  4. Ενοικιάστε μια κάρτα 80 GB, κλωνοποιήστε με submodules, συγχρονίστε με 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 χρησιμοποιεί διαχωρισμό server-client μέσω 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 της πολιτικής, και αυτός ο αριθμός είναι το μήκος των action delta_indices στη διαμόρφωση της λειτουργίας σας, όχι του βασικού μοντέλου. Η διαμόρφωση SO-100 που παρέχεται προβλέπει 16, οπότε το 16 είναι το ανώτατο όριό σας. Το βασικό checkpoint nvidia/GR00T-N1.7-3B είναι διαμορφωμένο για 40, και το policy.md αναφέρει σαφώς ότι τα finetuned checkpoints ενδέχεται να διαφέρουν. Αν το υπερβείτε, θα λάβετε ένα ValueError που θα αναφέρει και τους δύο αριθμούς. Το 8 είναι η τιμή που προτείνουν τα έγγραφα για ανάπτυξη σε πραγματικό χρόνο. Το παλιό όνομα της σημαίας --action-horizon εξακολουθεί να λειτουργεί αλλά εμφανίζει προειδοποίηση.
7.4 V, όχι 12 V

Ενώ επανασυνδέετε τον βραχίονα: το SO-100 χρησιμοποιεί servos Feetech STS3215 σε γραμμή 7.4 V. Η τροφοδοσία τους με 12 V τα καταστρέφει, και είναι ένα εύκολο λάθος αν έχετε επίσης ένα LeKiwi, του οποίου η βάση λειτουργεί στα 12 V ενώ ο βραχίονας του όχι. Ελέγξτε την τροφοδοσία πριν από την πρώτη ενεργοποίηση, όχι μετά τον καπνό. Δείτε τη σελίδα υλικού του SO-100 και το SO-100 έναντι του LeKiwi. Αν ο βραχίονας ενεργοποιείται αλλά τίποτα δεν κινείται, το servo δεν ανταποκρίνεται είναι το σημείο εκκίνησης.

Τώρα το ειλικρινές μέρος σχετικά με το πού εκτελείται η πολιτική, επειδή η εκπαίδευση και η εξυπηρέτηση έχουν διαφορετικές ιστορίες υλικού. Η λεπτομερής ρύθμιση απαιτεί 40 GB ή περισσότερο. Η εξαγωγή συμπερασμάτων όχι: το README την τοποθετεί στα 16 GB ή περισσότερο και αναφέρει ρητά την RTX 4090, οπότε μια κάρτα που ήδη έχετε μπορεί να εξυπηρετήσει ένα checkpoint που δεν θα μπορούσε ποτέ να έχει παράγει. Αυτό που αποφασίζει αν η πολιτική είναι ανταποκρινόμενη δεν είναι η VRAM, είναι το πού βρίσκεται ο διακομιστής. Στα AY-Robots, το GR00T N1.7 είναι μόνο στο cloud, οπότε ο βρόχος ελέγχου πληρώνει ένα ταξίδι μετ' επιστροφής μέσω του δημόσιου διαδικτύου επιπλέον των 152 ms ανά βήμα ενέργειας, και μόνο SmolVLA και ACT εκτελούνται επίσης τοπικά. Για αργή επιλογή και τοποθέτηση, ένα απομακρυσμένο pod είναι βιώσιμο. Για οτιδήποτε αντιδραστικό δεν είναι: η πολιτική γίνεται διστακτική με τρόπο που μοιάζει ακριβώς με αποτυχία εκπαίδευσης και δεν είναι. Το ACT στα 20 ms ανά βήμα ενέργειας είναι το μοντέλο που ανέχεται τον πιο σφιχτό βρόχο, το SmolVLA βρίσκεται στα 245 ms, και καμία ποσότητα ρύθμιση καθυστέρησης δεν μπορεί να ανακτήσει ένα ταξίδι μετ' επιστροφής που έχει ήδη δαπανηθεί. Εκτελέστε την πρώτη σας πολιτική περιγράφει την πλευρά εξυπηρέτησης από άκρο σε άκρο.

Τι πάει πραγματικά στραβά

  • GatedRepoError στην πρώτη εκτέλεση. Δεν σας έχει παραχωρηθεί πρόσβαση στο nvidia/Cosmos-Reason2-2B, ή δεν πραγματοποιήσατε έλεγχο ταυτότητας. Αυτό συμβαίνει αφού έχει ήδη ξεκινήσει το ρολόι της GPU.
  • Το σύνολο δεδομένων απορρίφθηκε κατά τη φόρτωση. Σχεδόν πάντα ένα σύνολο δεδομένων v3.0. Μετατρέψτε το σε παλαιότερη έκδοση. Δείτε απόρριψη συνόλου δεδομένων ως v3.
  • IndexError σχετικά με μη αντιστοιχισμένες boolean διαστάσεις. Αλλάξατε τα delta_indices και δεν αναδημιουργήσατε τα στατιστικά.
  • Έλλειψη μνήμης στο batch 32. Μειώστε το --global-batch-size και αυξήστε το --gradient-accumulation-steps, ή μειώστε το --num-shards-per-epoch, το οποίο η διαμόρφωση προτείνει ρητά όταν η VRAM είναι περιορισμένη. Δείτε έλλειψη μνήμης κατά την εκπαίδευση.
  • Η απώλεια μειώνεται, η πολιτική δεν κάνει τίποτα. Δεν υπάρχει διαχωρισμός επικύρωσης από προεπιλογή, οπότε μια καθαρή καμπύλη εκπαίδευσης αποδεικνύει πολύ λίγα. Αυτή η σελίδα καλύπτει τη διάγνωση.
  • Λειτουργεί στη ρύθμισή σας και πουθενά αλλού. Αναμενόμενο με ένα μικρό σύνολο δεδομένων που κινηματογραφήθηκε υπό μία συνθήκη φωτισμού. Η NVIDIA συνιστά αύξηση χρωματικού jitter συν 20 έως 50 επεισόδια σε διαφορετικούς φωτισμούς. Περισσότερα εδώ.
  • Η λαβίδα δεν κλείνει ποτέ σωστά. Ελέγξτε ότι η ενέργεια της λαβίδας είναι ABSOLUTE και οι αρθρώσεις του βραχίονα RELATIVE, με αυτή τη σειρά στα action_configs. Η λαβίδα δεν κλείνει παραθέτει τις άλλες αιτίες.
  • Μια κάμερα απενεργοποιείται σιωπηλά κατά τη διάρκεια της εγγραφής. Το επεισόδιο εξακολουθεί να αποθηκεύεται και το κλειδί βίντεο εξακολουθεί να υπάρχει, γι' αυτό και αυτό είναι άσχημο. Η κάμερα δεν ανιχνεύεται το καλύπτει.

Ο πλήρης κατάλογος των τρόπων αποτυχίας βρίσκεται στις . Εάν επιλέγετε μεταξύ μοντέλων αντί να διορθώνετε ένα, η και η έχουν αριθμούς αναφοράς με συνημμένες πηγές, και η είναι η σύγκριση που χρειάζονται οι περισσότεροι άνθρωποι, επειδή είναι η επιλογή μεταξύ ενός μοντέλου που μπορείτε να εκπαιδεύσετε στην κάρτα κάτω από το γραφείο σας και ενός που πρέπει να νοικιάσετε έναν κόμβο 80 GB για να το ρυθμίσετε. Για να κατανοήσετε γιατί αυτά τα μοντέλα συμπεριφέρονται με τον τρόπο που συμπεριφέρονται, η και ο αξίζει να διαβαστούν πρώτα. Και αν δεν έχετε ακόμα ένα ρομποτικό βραχίονα, ο μεταδίδει ένα φυσικό 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 στο μετατρεπόμενο σύνολο δεδομένων. Το script εκτελείται στο δικό του virtualenv επειδή χρειάζεται μια διαφορετική έκδοση lerobot από αυτή που χρησιμοποιεί το GR00T.

Μπορώ να ρυθμίσω λεπτομερώς το GR00T N1.7 σε μια RTX 4090;

Όχι. Η NVIDIA συνιστά 40 GB ή περισσότερο VRAM για λεπτομερή ρύθμιση και αναφέρει κόμβους H100 ή L40. Άλλες κάρτες λειτουργούν αλλά χρειάζονται πολύ περισσότερο χρόνο. Μια 4090 έχει 24 GB. Η AY-Robots προσφέρει το GR00T N1.7 μόνο στην κατηγορία A100 80 GB και H100 80 GB για τον ίδιο λόγο. Η εξαγωγή συμπερασμάτων είναι διαφορετική ιστορία: 16 GB είναι αρκετά για να εξυπηρετήσουν το μοντέλο, οπότε μια 4090 μπορεί να εκτελέσει μια πολιτική που δεν μπορεί να εκπαιδεύσει. Αν θέλετε ένα VLA που μπορείτε να εκπαιδεύσετε σε 24 GB, αυτό είναι το SmolVLA με περίπου 450 εκατομμύρια παραμέτρους ή το ACT με περίπου 80 εκατομμύρια.

Γιατί δύο εκτελέσεις με πανομοιότυπες σημαίες δίνουν διαφορετικά σημεία ελέγχου;

Επειδή το launch_finetune.py δεν έχει seed. Είναι ένα CLI tyro που δημιουργείται από μια dataclass που δεν περιέχει πεδίο seed, οπότε τίποτα δεν σταθεροποιεί τον 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 σας χωρίς να δημιουργήσετε πρώτα το περιβάλλον

Επιλέξτε μοντέλο, σύνολο δεδομένων και υπερπαραμέτρους σε μια φόρμα. Το backend νοικιάζει μια A100 80 GB ή H100 στην αγορά spot, εκτελεί τον εκπαιδευτή με batch 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