
Μια δοκιμασμένη αναλυτική περιγραφή για τη λεπτομερή ρύθμιση του 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 Face | repo 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.0 | Isaac-GR00T repository |
| Άδεια βαρών | NVIDIA Open Model License Agreement | model card |
| Καθυστέρηση, H100 80 GB, PyTorch eager, 4 βήματα αποθορυβοποίησης, 1 κάμερα | 85.8 ms end to end, 11.7 Hz | model card timing table |
| Ίδιο υλικό, πλήρης αγωγός TensorRT | 27.9 ms end to end, 35.9 Hz | model card timing table |
| Καθυστέρηση που αναφέρει η AY-Robots για το εξυπηρετούμενο GR00T N1.7 της | 152 ms per action step | AY-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 τα παραθέτουν δίπλα-δίπλα.

Τι χρειάζεται η εκτέλεση πριν πληκτρολογήσετε οτιδήποτε
| Απαίτηση | Βελτιστοποίηση (Fine-tuning) | Συμπερασματολογία (Inference) |
|---|---|---|
| VRAM, οδηγίες NVIDIA | 40 GB ή περισσότερο, συνιστάται H100 ή L40 | 16 GB ή περισσότερο, λειτουργεί μια RTX 4090 |
| Python και CUDA σε dGPU | 3.12 και CUDA 12.8 | 3.12 και CUDA 12.8 |
| Video backend | 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 GB ή H100 80 GB | το 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
Αυτό είναι το πιο συνηθισμένο εμπόδιο. Η τρέχουσα 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 καταχώριση γλωσσαρίου εξηγεί τι περιέχει στην πραγματικότητα.
# 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 υπάρχει ήδη τοπικά, το 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.
Βήμα 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 στο config δεδομένων | 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: η διαμόρφωση δεδομένων, σχετικός βραχίονας και απόλυτη λαβίδα
Η διαμόρφωση της τροπικότητας είναι ένα αρχείο Python και όχι JSON, επειδή αποφασίζει επίσης πώς αναπαρίσταται κάθε ομάδα δράσης. Αυτό είναι το μέρος της ροής εργασίας N1.7 που δεν υπήρχε στην ίδια μορφή στο N1.5, και το μέρος που αξίζει να διαβάσετε δύο φορές. Η διαμόρφωση SO-100 που παρέχεται προβλέπει τις πέντε αρθρώσεις του βραχίονα ως ΣΧΕΤΙΚΑ δέλτα από την τρέχουσα κατάσταση και τη λαβίδα ως ΑΠΟΛΥΤΗ θέση στόχο, επειδή ένα δυαδικό σήμα ανοιχτό-ή-κλειστό συμπεριφέρεται καλύτερα ως στόχος παρά ως δέλτα.
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 στην ίδια διαδικασία Python τερματίζεται με 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-pinned wheel που είναι ήδη στην κρυφή μνήμη, και αυτό διαρκεί δύο ή τρία δευτερόλεπτα.
- 1Εγκαταστήστε το git-lfs, μετά κλωνοποιήστε με υπομονάδες
Το git-lfs είναι απαραίτητο, όχι προαιρετικό. Χωρίς αυτό, τα αρχεία parquet στο demo_data/ κατεβαίνουν ως δείκτες-placeholders, και η εκτέλεση του demo αποτυγχάνει σε ένα σύνολο δεδομένων που φαίνεται να υπάρχει στην καταχώριση αρχείων.
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, το οποίο μοιάζει με κατεστραμμένη εγκατάσταση παρά με σύγκρουση έκδοσης. Εγκαταστήστε ένα παλαιότερο 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).
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 | Συνολικό batch σε όλες τις GPUs πριν τη συσσώρευση κλίσης (gradient accumulation). Τα παρεχόμενα παραδείγματα χρησιμοποιούν 32. |
| --learning-rate | 1e-4 | Η ίδια τιμή που στέλνει η AY-Robots για τον εκπαιδευτή groot1.7 της. |
| --max-steps | 10000 | Συνολικά βήματα βελτιστοποιητή. Ο wrapper examples/finetune.sh έχει επίσης προεπιλογή 10000. |
| --gradient-accumulation-steps | 1 | Πολλαπλασιάζει το πραγματικό batch. Τιμές πάνω από 1 εκδίδουν μια προειδοποίηση που σας ενημερώνει για το συσσωρευμένο μέγεθος. |
| --save-steps and --save-total-limit | 1000 and 5 | Συχνότητα σημείων ελέγχου (checkpoint), και πόσα διατηρούνται. Τα παλαιότερα διαγράφονται. |
| --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 | Απορρίπτει τυχαία την ιδιοδεκτική κατάσταση (proprioceptive state) κατά την εκπαίδευση. Μειώστε το αν η εργασία σας βασίζεται στην κατάσταση. |
| --tune-llm and --tune-visual | False and False | Ο κορμός (backbone) παραμένει παγωμένος από προεπιλογή. |
| --tune-projector and --tune-diffusion-model | True and True | Ο προβολέας (projector) και η κεφαλή δράσης διάχυσης (diffusion action head) είναι αυτά που εκπαιδεύονται στην πραγματικότητα. |
| --use-percentiles | True | Κανονικοποίηση με q01 και q99 αντί για τις ακατέργαστες ελάχιστες και μέγιστες τιμές. |
| --dataloader-num-workers | 2 | Ο φορτωτής (loader) είναι σχεδιασμένος να βασίζεται σε CPU. Τα παραδείγματα το αυξάνουν σε 4. |
| --seed | δεν υπάρχει | Δεν υπάρχει παράμετρος seed σε αυτό το CLI. |
Αυτή η τελευταία σειρά δεν είναι τυπογραφικό λάθος. launch_finetune.py είναι ένα CLI tyro που δημιουργείται από μια κλάση δεδομένων (dataclass), και αυτή η κλάση δεδομένων δεν έχει πεδίο seed. Το README σημειώνει ξεχωριστά διακύμανση 5 έως 6 τοις εκατό μεταξύ των εκτελέσεων που προκαλείται από μη-ντετερμινιστική αύξηση εικόνας. Δύο εκτελέσεις με πανομοιότυπες σημαίες δεν θα παράγουν πανομοιότυπα σημεία ελέγχου (checkpoints), κάτι που έχει μεγάλη σημασία όταν προσπαθείτε να αποφασίσετε αν μια αλλαγή υπερπαραμέτρου βοήθησε ή αν ήσασταν τυχεροί. Για σύγκριση, ο δικός του εκπαιδευτής του lerobot έχει ως προεπιλογή το seed 1000, και η συνταγή LeRobot GR00T περνάει --seed=42 ρητά.
Η λεπτομερής ρύθμιση (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.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 και τους 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.
pip install "lerobot[groot]" "lerobot[training]"
hf auth login
lerobot-train \
--dataset.repo_id=$HF_USER/$DATASET_NAME \
--dataset.image_transforms.enable=true \
--policy.type=groot \
--policy.device=cuda \
--policy.base_model_path=nvidia/GR00T-N1.7-3B \
--policy.embodiment_tag=new_embodiment \
--policy.chunk_size=16 \
--policy.n_action_steps=16 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]' \
--policy.use_bf16=true \
--seed=42 \
--batch_size=64 \
--steps=20000 \
--save_freq=5000 \
--output_dir=$OUTPUT_DIR| Πτυχή | Isaac-GR00T launch_finetune.py | lerobot-train --policy.type=groot |
|---|---|---|
| Έκδοση συνόλου δεδομένων | Μόνο LeRobot v2, απαιτείται μετατροπή | Εγγενές σύνολο δεδομένων LeRobot, χωρίς υποβάθμιση |
| Αντιστοίχιση τρόπου λειτουργίας | meta/modality.json συν μια διαμόρφωση δεδομένων Python | χωρίς modality.json· η συμπεριφορά ορίζεται από τις σημαίες --policy.* στη γραμμή εντολών |
| Σπόρος | καθόλου σημαία σπόρου | --seed, προεπιλογή LeRobot 1000 |
| Σχετικές ενέργειες | ActionConfig ανά κλειδί στη διαμόρφωση δεδομένων | --policy.use_relative_actions συν --policy.relative_exclude_joints |
| Δημοσιευμένα αποτελέσματα αναφοράς | Τάση 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 είναι μια εντολή κελύφους.
- Δεν εξαρτάστε από καμία πλατφόρμα που παραμένει συνδεδεμένη, και το σημείο ελέγχου βρίσκεται στον δίσκο σας σε τυπική μορφή.
- Τα παραδείγματα αναφοράς του αποθετηρίου για LIBERO, SimplerEnv και DROID σας δίνουν γνωστές-καλές εκτελέσεις για αναπαραγωγή πριν εμπιστευτείτε τα δικά σας δεδομένα.
- Το περιβάλλον είναι το μεγαλύτερο μέρος της δουλειάς. Έκδοση FFmpeg, CUDA_HOME, git-lfs, το gated backbone, torchcodec: κανένα από αυτά δεν είναι προβλήματα μοντέλου και το καθένα από αυτά σταματά την εκτέλεση.
- Η μετατροπή από v3.0 σε v2.1 απαιτεί ένα ξεχωριστό virtualenv με το δικό του βήμα εγκατάστασης, και ξαναγράφει τον κατάλογο του συνόλου δεδομένων σας επί τόπου.
- Η ενοικίαση GPU αρχίζει να χρεώνεται όταν ξεκινάτε τον εντοπισμό σφαλμάτων, όχι όταν ξεκινά η εκπαίδευση, και τίποτα δεν σταματά την παρουσία όταν τελειώσει η εκτέλεση.
- Χωρίς σπόρο σημαίνει μη αναπαραγωγιμότητα bit-προς-bit, επιπλέον της διακύμανσης 5 έως 6 τοις εκατό από εκτέλεση σε εκτέλεση μόνο από την αύξηση δεδομένων.
Δύο τρόποι για να αποκτήσετε το ίδιο σημείο ελέγχου
Ενοικιάζετε την GPU και έχετε τον έλεγχο κάθε βήματος. Ρεαλιστικά, αυτό απαιτεί ένα απόγευμα την πρώτη φορά και είκοσι λεπτά κάθε φορά μετά.
- Καταγράψτε επεισόδια με το lerobot-record στο SO-100. Θα λάβετε ένα σύνολο δεδομένων LeRobot v3.0.
- Μετατρέψτε το σε v2.1 με το scripts/lerobot_conversion/convert_v3_to_v2.py στο δικό του virtualenv.
- Γράψτε το meta/modality.json και μια διαμόρφωση Python modality, καταχωρημένη υπό το EmbodimentTag.NEW_EMBODIMENT.
- Ενοικιάστε μια κάρτα 80 GB, κλωνοποιήστε με submodules, συγχρονίστε με uv, πιστοποιηθείτε στο Hugging Face.
- Εκτελέστε το launch_finetune.py, μετά το open_loop_eval.py σε πολλά σημεία ελέγχου, και συγκρίνετε την τάση MSE πριν αγγίξετε το υλικό.
- Αποσύρετε το σημείο ελέγχου από το μηχάνημα πριν καταστρέψετε την παρουσία, και μετά δημιουργήστε τη διαδρομή εξυπηρέτησης στον βραχίονα.
Αντιγράψτε το σημείο ελέγχου από την ενοικιαζόμενη παρουσία πριν την τερματίσετε. Το --save-total-limit 5 σημαίνει επίσης ότι τα παλαιότερα σημεία ελέγχου διαγράφονται καθώς προχωρά η εκπαίδευση, οπότε το σημείο ελέγχου που θέλατε στο βήμα 5000 μπορεί να μην υπάρχει πλέον στο βήμα 20000.
Η ίδια εργασία ως φόρμα. Επιλέγετε το μοντέλο και το σύνολο δεδομένων, το backend ενοικιάζει μια GPU στην αγορά spot με βάση την απαιτούμενη VRAM, εκτελεί τον εκπαιδευτή και γράφει σημεία ελέγχου σε αποθήκευση αντικειμένων. Ο οδηγός GR00T N1.7 στο SO-100 είναι αυτός ο ακριβής συνδυασμός· ο πίνακας εκπαίδευσης περιέχει κάθε άλλο ζεύγος μοντέλου και βραχίονα, συμπεριλαμβανομένου του GR00T N1.7 στο SO-101.
| Τι στέλνει ο εκπαιδευτής groot1.7 | Value |
|---|---|
| Μέγεθος παρτίδας | 32 |
| Ρυθμός εκμάθησης | 1e-4 |
| Μέγιστα βήματα | 20000 |
| Συσσώρευση κλίσης | 1, and it does take effect for this trainer |
| Επιπλέον ρύθμιση που εκτίθεται στη φόρμα | saveSteps |
| Βασικό σημείο ελέγχου | nvidia/GR00T-N1.7-3B |
| Αποδεκτή μορφή συνόλου δεδομένων | LeRobot v2.0 or v2.1 |
Το σύνολο δεδομένων μπορεί να προέρχεται από ένα αναγνωριστικό αποθετηρίου Hugging Face, από το δικό σας μηχάνημα, ή από μια συνεδρία που καταγράψατε με τον πελάτη επιφάνειας εργασίας. Η εξαγωγή συμπερασμάτων είναι ένα ξεχωριστό βήμα: η πλατφόρμα παρέχει ένα pod που εξυπηρετεί την πολιτική, και ο τοπικός σας πελάτης ρομπότ επικοινωνεί με αυτό το τελικό σημείο. Τα pods φέρουν έναν αδρανή φύλακα (watchdog) και καταστρέφονται μετά από μια περίοδο αδράνειας, οπότε μια ξεχασμένη καρτέλα του προγράμματος περιήγησης δεν θα χρεωθεί όλη τη νύχτα. Αν προτιμάτε να μην κάνετε κλικ, οι ίδιες λειτουργίες υπάρχουν στο CLI και στον διακομιστή MCP.
Τα GR00T N1.7 και Pi0.5 είναι μόνο για το cloud εδώ· μόνο τα SmolVLA και ACT τρέχουν επίσης τοπικά. Η απαίτηση v2.1 δεν εξαφανίζεται ούτε αυτή, επειδή ένα σύνολο δεδομένων v3.0 πρέπει ακόμα να μετατραπεί πριν το GR00T loader το δεχτεί. Και τίποτα δεν γράφει τη σημασιολογία του modality.json για εσάς: αν τα κλειδιά της κάμεράς σας ή το κλειδί γλώσσας είναι λάθος, είναι λάθος και στις δύο διαδρομές. Δείτε τα έγγραφα εκπαίδευσης για το τι κάνει και τι δεν κάνει το backend για λογαριασμό σας.

Επαναφορά του σημείου ελέγχου στον βραχίονα
Το Isaac-GR00T χρησιμοποιεί διαχωρισμό server-client μέσω 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 χρησιμοποιεί 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.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