
Entraînez un Action Chunking Transformer à partir de zéro sur un SO-100 avec lerobot : la configuration act, chunk_size et n_action_steps, le programme d'entraînement de 100000 étapes, 20 ms d'inférence.
ACT fait figure d'exception parmi les politiques SO-100. GR00T N1.7 et N1.5 partent de nvidia/GR00T-N1.7-3B et nvidia/GR00T-N1.5-3B, Pi0.5 de lerobot/pi05_base. ACT part de zéro : il n'y a pas de point de contrôle de base, car ce n'est pas un modèle de fondation. C'est un transformeur d'environ 80 millions de paramètres que vous entraînez à partir de zéro sur une seule tâche, sur votre bras, sous votre éclairage.
C'est aussi pourquoi il exécute une étape de contrôle en 20 ms là où un VLA de 3 milliards de paramètres nécessite 152 à 485 ms, et coûte 1 à 3 USD par exécution au lieu de 4 à 12. Ce guide décrit la voie manuelle avec lerobot sur un SO-100 : l'enregistrement, la configuration act, ce que chunk_size et n_action_steps contrôlent, le programme de 100000 étapes, le déploiement. Ensuite, le même travail sur AY-Robots, y compris là où la plateforme n'aide pas.
Ce qu'il faut savoir
- •ACT s'entraîne à partir de zéro : pas de modèle de base, pas de pré-entraînement, pas d'entrée linguistique. Un point de contrôle, une tâche.
- •L'article : environ 80 M de paramètres, environ 5 heures sur une RTX 2080 Ti de 11 Go, inférence en 0,01 s.
- •Paramètres par défaut de lerobot : chunk_size 100, n_action_steps 100, batch 8, lr 1e-5, 100000 steps, seed 1000.
- •Sur AY-Robots : 20 ms par étape, le plus rapide des cinq. 50 épisodes minimum, LeRobot v3.0, une carte de 24 Go, 1 à 3 USD par exécution.
- •Il gagne sur une tâche qu'il a vue, et perd dès que vous voulez un conditionnement linguistique.
Vérifié le 23 août 2026 par rapport à lerobot 0.6.x: pyproject.toml sur main indique version = "0.6.2", le plus récent tag v0.6.1, 3 août 2026. Un tutoriel commençant par python lerobot/scripts/train.py est antérieur aux points d'entrée de la console lerobot-train, lerobot-record et lerobot-rollout.
Ce qu'est réellement ACT
Action Chunking with Transformers est issu de l'article ALOHA, Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware, par Zhao, Kumar, Levine et Finn, arXiv, 23 avril 2023. Le dispositif enregistre à 50 Hz avec quatre webcams diffusant en 480x640 à 30 fps : deux sur les pinces, une en haut, une à l'avant. L'abstract revendique six compétences avec 80 à 90 pour cent de succès, parmi lesquelles l'ouverture d'un gobelet à condiments translucide et l'insertion d'une batterie, à partir de 10 minutes de démonstrations.
Le corps de l'article est plus utile lors de la planification d'une session d'enregistrement : 50 démonstrations par tâche, sauf pour Thread Velcro à 100, ce qui représente 10 à 20 minutes de données et 30 à 60 minutes de temps réel une fois les réinitialisations comptées. Le succès n'est pas uniforme non plus : Thread Velcro se termine à 20 pour cent, Put On Shoe à 92, Cup Open 84, Prep Tape 64.
| Hyperparamètre | Article ALOHA, Tableau III | lerobot sur main |
|---|---|---|
| taux d'apprentissage | 1e-5 | optimizer_lr = 1e-5 |
| taille du lot | 8 | batch_size = 8, in TrainPipelineConfig not ACTConfig |
| couches encodeur / décodeur | 4 / 7 | n_encoder_layers = 4 / n_decoder_layers = 1 |
| taille de chunk k | 100 | chunk_size = 100 |
| dimension latente de z | absent ; la Fig. 11 montre une projection de 32 à 512 | latent_dim = 32 |
| agrégation temporelle | absent ; --temporal_agg dans le code de référence | temporal_ensemble_coeff = None |
L'article mentionne 7 couches de décodeur, lerobot en livre 1, délibérément. Le commentaire dans configuration_act.py indique que l'implémentation originale contient un bug signifiant que seule la première couche est utilisée, citant l'issue 25 dans tonyzhaozh/act : la tête d'action lit hs[0], donc les sept couches s'exécutent mais seule la première sortie atteint la prédiction. Cette issue est ouverte et sans réponse depuis le 23 avril 2024. lerobot correspond au comportement qui a produit les résultats publiés, et non au nombre imprimé. Augmentez --policy.n_decoder_layers et vous entraînerez un modèle que l'article n'a jamais évalué.
Le découpage d'actions est le concept central
Le clonage comportemental ordinaire mappe une observation à une action, et les erreurs s'accumulent : une déviation met le bras hors distribution, produisant une action pire, et trente étapes plus tard, la pince n'est nulle part près de l'objet. Découpage d'actions prédit k actions à la fois et les exécute, réduisant l'horizon effectif d'un facteur k. Cela gère également un inconvénient spécifique aux données humaines : les téléopérateurs font des pauses, et une politique markovienne à une seule étape ne peut pas modéliser une pause qui dépend de ce qui a précédé.
L'article ablate k plutôt que de l'affirmer. Avec l'ensemble temporel désactivé, en moyenne sur quatre configurations, le succès passe de 1 pour cent à k = 1 à 44 pour cent à k = 100, puis diminue à 200 et 400 à mesure que la politique approche du contrôle en boucle ouverte. Cette courbe explique pourquoi la valeur par défaut est 100.
- chunk_size : nombre d'actions futures que le décodeur prédit par passe avant. Par défaut 100.
- n_action_steps : nombre d'actions que vous exécutez avant de réinterroger. Par défaut 100, donc lerobot exécute l'intégralité du chunk en boucle ouverte.
- lerobot valide
n_action_steps <= chunk_sizeet lève uneValueErrorsi l'ordre est inversé.
Ce qui importe opérationnellement est le chunk_size divisé par la fréquence d'images. Aux 30 ips utilisés par les exemples SO-100 de lerobot, un chunk de 100 actions représente environ 3,3 secondes à partir d'une observation. Si la tâche nécessite une correction dans cette fenêtre, diminuez n_action_steps, pas chunk_size : vous conservez la prédiction longue et ré-observez plus souvent.
# predict 100 actions, re-query after 25 of them (about 0.8 s at 30 fps)
lerobot-train \
--dataset.repo_id=${HF_USER}/so100_cube \
--policy.type=act \
--policy.chunk_size=100 \
--policy.n_action_steps=25 \
--policy.device=cudaDéfinissez --policy.temporal_ensemble_coeff et lerobot exigera n_action_steps = 1, levant une NotImplementedError sinon. L'ensemblage interroge la politique à chaque pas de temps et fusionne les prédictions qui se chevauchent pour ce pas de temps avec des poids w_i = exp(-m * i), le plus ancien obtenant w_0. L'article l'estime à 3,3 % pour ACT : réel mais modeste, et cela multiplie le nombre d'inférences par la longueur du chunk. Abordable à 20 ms par étape, pas à 485 ms. Voir la latence d'inférence.
Quand ACT surpasse un modèle de fondation
Les cinq politiques entraînables côte à côte, avec les chiffres qu'AY-Robots mesure et utilise pour dimensionner le GPU qu'il loue.
| Politique | Famille | Paramètres | Par étape | Niveau GPU | Épisodes min. | Jeu de données |
|---|---|---|---|---|---|---|
| ACT | Transformateur de découpage, à partir de zéro | ~80 M | 20 ms | RTX 4090 / 24 GB | 50 | LeRobot v3.0 |
| SmolVLA | VLA compact | ~450 M | 245 ms | RTX 4090 / 24 GB | 30 | LeRobot v3.0 |
| GR00T N1.7 | Fondation VLA, tête de diffusion | ~3 B (~40 M entraînés) | 152 ms | A100 / H100 80 GB | 50 | LeRobot v2.0 or v2.1 |
| GR00T N1.5 | Fondation VLA, prédécesseur | ~3 B | 165 ms | A100 / H100 80 GB | 50 | LeRobot v2.0 or v2.1 |
| Pi0.5 | VLA par appariement de flux, voir appariement de flux | ~3 B, PaliGemma backbone | 485 ms | A100 / H100 80 GB | 50 | LeRobot v3.0 |

- 20 ms par étape d'action, le plus rapide des cinq, sur une carte de 24 Go et non une A100.
- 1 à 3 USD par exécution contre 4 à 12 pour la classe 3 B.
- Précis sur les tâches à fort contact qu'il a vues : 88 et 96 pour cent sur Slide Ziploc et Slot Battery, où les méthodes antérieures n'ont jamais dépassé la première étape.
- Pas de conditionnement linguistique : la chaîne de tâche est ignorée, donc un point de contrôle correspond à une tâche.
- Pas de priors sémantiques : tout ce qu'il sait provient de vos 50 épisodes.
- Généralisation étroite : déplacez une caméra et vous devez réentraîner.
- Il échoue silencieusement : la perte diminue, le bras ne fait rien, les journaux ne disent rien.
- L'avantage de la vitesse n'est utile que si l'inférence est située à côté des servomoteurs.
Choisissez ACT lorsque la tâche et la scène sont fixes et que le mouvement doit être rapide et précis. Choisissez un lorsqu'un point de contrôle doit couvrir plusieurs instructions. Deux pages comparent directement la décision : et . Pour les benchmarks publiés, lie chaque chiffre à sa source.
Ce dont vous avez besoin avant de commencer
Un bras suiveur, un bras leader pour la , au moins une caméra, un GPU de 24 Go. ACT ne lit que les images et les positions des articulations. Deux caméras constituent le point idéal : une vue frontale fixe pour savoir où se trouvent les objets, une caméra de poignet pour ce que l' est sur le point de toucher, comme sur ALOHA.
| Bras | Servos | Tension | Coût des pièces | Statut |
|---|---|---|---|---|
| SO-100 | Feetech STS3215 | 7.4 V | ~110 to 150 EUR | Support complet, bras de référence |
| SO-101 | Feetech STS3215 | 7.4 V | ~130 to 170 EUR | Support complet |
| Koch v1.1 | Dynamixel XL330 / XL430 | 5 V and 12 V rails | ~250 to 350 EUR | Compatible |
| LeKiwi | Feetech STS3215 (arm) | 7.4 V arm, 12 V base | ~400 to 500 EUR | Compatible |
Les SO-100 et SO-101 utilisent des servos Feetech STS3215 sur un rail 7.4 V. Les alimenter en 12 V les détruit, assez discrètement pour que les gens blâment d'abord le logiciel, et une alimentation Koch 12 V s'adapte physiquement à une carte SO-100. Vérifiez l'étiquette. Symptômes : servo ne répond pas, le bras tressaute puis s'affaisse. Voir aussi SO-100 vs SO-101.
Du bras nu au jeu de données enregistré
Le flux ci-dessous est lerobot 0.6.x. Passez cette étape si vous avez un bras calibré et un jeu de données. Sinon, le guide de démarrage du SO-100 couvre l'assemblage, le tutoriel d'enregistrement couvre la capture et la documentation des jeux de données le format.
- 1Installer lerobot avec les bons extras
L'enregistrement nécessite
core_scripts, l'entraînementtraining, les servomoteurs Feetechfeetech. Python 3.12+.bashconda create -y -n lerobot python=3.12 conda activate lerobot conda install ffmpeg -c conda-forge pip install 'lerobot[core_scripts,training,feetech]' lerobot-info - 2Trouver le port USB de chaque bras
Exécutez-le avec les deux bras branchés, en débranchant l'un d'eux lorsque vous y êtes invité. Sous Linux, vous devrez peut-être ouvrir les permissions du nœud.
bashlerobot-find-port # on Linux, if the port exists but is unreadable: sudo chmod 666 /dev/ttyACM0 - 3Définir les identifiants des moteurs et le débit en bauds
Sur le SO-100, cela se fait avant l'assemblage : contrairement au SO-101, les connecteurs sont inaccessibles une fois construit. Le script parcourt le bus un moteur à la fois à partir de la pince, écrivant les identifiants dans l'EEPROM.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 4Calibrer les deux bras
Réglez chaque articulation au milieu de sa plage, appuyez sur Entrée, puis balayez chacune sur toute sa plage. La calibration permet à une politique entraînée sur un bras de fonctionner sur un autre. Réutilisez le même
id.bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_leader - 5Téléopérer une fois avec les caméras allumées
La règle empirique de lerobot : vous devriez être capable d'effectuer la tâche en regardant uniquement les images de la caméra. Si vous ne le pouvez pas, ACT non plus. Cela permet de détecter plus de mauvais jeux de données que le débogage ultérieur.
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower \ --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_leader \ --display_data=true - 6Enregistrer 50 épisodes
50 est le minimum d'AY-Robots et ce qu'ALOHA utilisait par tâche. lerobot conseille 10 par emplacement d'objet, caméras fixes, préhension cohérente.
ntermine un épisode,rréenregistre,qarrête et encode.bashHF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}') lerobot-record \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower \ --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_leader \ --dataset.repo_id=${HF_USER}/so100_cube \ --dataset.num_episodes=50 \ --dataset.single_task="Grab the black cube and put it in the bin" \ --display_data=true

ACT n'a pas de connaissances préalables sur lesquelles s'appuyer, donc chaque incohérence devient permanente. Les trois plus coûteuses : une caméra légèrement déplacée entre l'épisode 20 et 21, une lumière qui a changé parce que vous avez enregistré la moitié de l'ensemble l'après-midi, une préhension effectuée de deux manières différentes. Chacune donne une courbe de perte d'apparence parfaite et un bras qui va au mauvais endroit. Voir la perte diminue, la politique ne fait rien, la politique ne fonctionne que dans une seule configuration et collecter des données d'entraînement de haute qualité.
Avant l'entraînement, rejouez au moins cinq épisodes. Le format de jeu de données LeRobot stocke les flux de caméra, les états des articulations et les actions par épisode, et la relecture renvoie ces actions au bras. Si la relecture n'effectue pas la tâche, les données ne la contiennent pas et l'entraînement ne l'inventera pas.
lerobot-replay \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower \
--dataset.repo_id=${HF_USER}/so100_cube \
--dataset.episode=0Entraînement de la politique ACT
Ceci est la commande complète. Tout ce qui est spécifique à ACT est déjà une valeur par défaut, c'est pourquoi la page ACT de lerobot recommande de commencer avec celles-ci.
lerobot-train \
--dataset.repo_id=${HF_USER}/so100_cube \
--policy.type=act \
--output_dir=outputs/train/act_so100_cube \
--job_name=act_so100_cube \
--policy.device=cuda \
--wandb.enable=true \
--policy.repo_id=${HF_USER}/act_so100_cube--policy.type=act charge ACTConfig, qui s'adapte au nombre de moteurs et de caméras enregistrés par votre jeu de données, de sorte que vous n'avez jamais à déclarer la forme de l'observation. --wandb.enable=true est facultatif et en vaut la peine : la courbe de perte est le seul signal peu coûteux dans une exécution de 100000 étapes. Le calendrier provient de la configuration d'entraînement de lerobot, et non d'ACTConfig : 100000 étapes, lot de 8, graine 1000, un point de contrôle toutes les 20000 étapes, journalisation toutes les 200.
Une exécution complète laisse cinq répertoires de points de contrôle, de 020000 à 100000, plus un lien symbolique last. Gardez-les tous : la meilleure politique n'est souvent pas la dernière.
| Paramètre | Valeur par défaut lerobot | Formulaire ACT AY-Robots | Commentaire |
|---|---|---|---|
| taille de lot | 8 | 8 | Diminuez-la en premier si vous atteignez les limites de VRAM. |
| taux d'apprentissage | 1e-5 | 1e-5 | Identique à celui du papier ALOHA. |
| nombre maximal d'étapes | 100000 | 100000 | Environ là où un ensemble de 50 épisodes cesse de s'améliorer. |
| accumulation de gradient | 1 | 1, ne s'applique pas | Modifiez plutôt la taille du lot. |
| graine | 1000 | exposée | Le point d'entrée tyro de GR00T n'a pas de graine ; les exécutions ACT sont les reproductibles. |
| taille de chunk / nombre d'étapes d'action | 100 / 100 | 100 / 100, modifiable | Horizon de prédiction et d'exécution. Diminuez le second, pas le premier. |
| fréquence des points de contrôle | 20000 | non exposée | saveSteps est un paramètre GR00T ici. |
ACT avec une taille de lot de 8 et deux caméras 640x480 tient confortablement sur 24 Go. Il cesse de tenir lorsque les gens augmentent la taille du lot pour la vitesse, ou lui fournissent les images 1920x1080 qu'un exemple d'enregistrement lerobot montre. Deux backbones ResNet-18 à 1080p ont un profil de mémoire très différent. Diminuez --batch_size à 4 avant de louer une carte plus grande. Voir mémoire insuffisante lors de l'entraînement.
Durée : environ 5 heures sur une RTX 2080 Ti de 11 Go dans l'article, quelques heures pour 100k étapes selon la page ACT de lerobot, 2 à 5 heures sur le niveau 24 Go d'AY-Robots. Ne l'interrompez pas prématurément. Le README du dépôt de référence indique qu'une politique saccadée ou en pause nécessite généralement plus d'entraînement, car le succès et la fluidité continuent de s'améliorer après que la perte se stabilise : pour les données réelles, il faut au moins 5000 époques, soit 3 à 4 fois la durée après le plateau.
lerobot-train \
--config_path=outputs/train/act_so100_cube/checkpoints/last/pretrained_model/train_config.json \
--resume=trueExécution de la politique entraînée sur le bras
Le déploiement utilise lerobot-rollout. Les clés de caméra doivent correspondre à celles enregistrées : une politique entraînée sur front et wrist n'acceptera pas cam0 et cam1, et rename_map n'est d'aucune aide, car il nécessite un point de contrôle pré-entraîné. La chaîne de tâche peut être omise ; l'exemple de lerobot la marque comme facultative pour ACT.
lerobot-rollout \
--strategy.type=base \
--policy.path=${HF_USER}/act_so100_cube \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
--display_data=true \
--duration=60L'évaluation s'effectuait auparavant via lerobot-record --policy.path=.... Dans la version 0.6.x, il s'agit de lerobot-rollout avec un sélecteur --strategy.type : base, sentry (enregistrement avec téléchargement automatique), highlight (tampon circulaire sauvegardé par frappe), dagger (humain dans la boucle) et episodic. Au 23 août 2026, la page de documentation ACT indique toujours "using the lerobot-record command" juste au-dessus d'un bloc qui exécute lerobot-rollout. Suivez la commande, pas la phrase.
Pour épingler un point de contrôle plutôt que le modèle final, ajoutez --policy.pretrained_revision. Cela nécessite que l'exécution ait commencé avec --save_checkpoint_to_hub=true, désactivé par défaut : sans cela, lerobot pousse le modèle final et rien d'autre. Avec cela, chaque point de contrôle est étiqueté avec son étape complétée par des zéros, donc --policy.pretrained_revision=060000 récupère celui de l'étape 60000. Le comparer à 100000 sur le bras réel est l'expérience la moins chère disponible.
Deux chemins vers le même point de contrôle
Tout ce qui précède est la voie manuelle et cela fonctionne. La voie de la plateforme échange le contrôle contre l'absence de GPU ou d'environnement Python.
- Installez lerobot 0.6.x avec
core_scripts,training,feetech, ffmpeg. - Trouvez les ports, définissez les identifiants des moteurs, calibrez les deux bras, enregistrez 50 épisodes.
- Rejouez quelques épisodes pour confirmer que les données contiennent la tâche.
- Louez ou possédez un GPU de 24 Go, faites correspondre CUDA et PyTorch, exécutez
lerobot-train --policy.type=act. - Attendez quelques heures, puis exécutez
lerobot-rolloutsur la machine au niveau du bras.
# the two commands that matter, end to end
lerobot-record --robot.type=so100_follower --robot.port=/dev/ttyACM0 \
--teleop.type=so100_leader --teleop.port=/dev/ttyACM1 \
--dataset.repo_id=${HF_USER}/so100_cube --dataset.num_episodes=50 \
--dataset.single_task="Grab the black cube"
lerobot-train --dataset.repo_id=${HF_USER}/so100_cube --policy.type=act \
--output_dir=outputs/train/act_so100_cube --policy.device=cudaContrôle total : modifiez configuration_act.py, ajoutez une caméra, forkez l'entraîneur. Pour la recherche plutôt que pour la livraison d'une tâche, une plateforme est une distraction.
- Enregistrez avec le client de bureau, ou apportez un identifiant de dépôt Hugging Face ou un jeu de données local.
- Ouvrez le guide ACT sur SO-100 et choisissez le modèle et le jeu de données. Les valeurs par défaut sont celles de lerobot ; chunkSize, nActionSteps, seed et logFreq sont modifiables.
- Le backend loue un GPU dimensionné par la VRAM et écrit les points de contrôle dans le stockage d'objets.
/api/inference/podsert ensuite la politique au client robot local. Un chien de garde inactif détruit le pod, de sorte que rien n'est facturé silencieusement.- Les mêmes opérations existent dans l'interface de ligne de commande, le serveur MCP et la documentation de formation.
Elle ne corrige pas vos données : un jeu de données avec une caméra déplacée s'entraîne tout aussi mal ici, et le formulaire ne peut pas le détecter. Elle ne résout pas non plus le problème de latence. La boucle de contrôle est de 20 à 485 ms par étape d'action, avec des allers-retours sur l'internet public en plus, et ACT est le plus pénalisé car son étape est la plus courte : 60 ms représente un ralentissement de 12 pour cent sur les 485 ms de Pi0.5, mais quatre fois l'étape sur les 20 ms d'ACT. L'inférence à distance convient aux opérations lentes de prise et de placement, pas aux mouvements réactifs rapides.

Ce qui ne va pas réellement
Presque aucune des difficultés ne réside dans la commande d'entraînement. Elles se trouvent dans les éléments qui l'entourent, classés par la fréquence à laquelle ils posent problème la première fois.
| Symptôme | Cause habituelle | Page |
|---|---|---|
| lerobot-find-port ne montre rien | Pilote, câble ou permissions de nœud | bras non détecté |
| Caméra manquante au moment de l'enregistrement | Index modifié au redémarrage, ou deux caméras sur un seul contrôleur USB | caméra non détectée |
| L'entraînement rejette le jeu de données | ACT veut v3.0, GR00T a besoin de v2.1 | jeu de données rejeté comme v3 |
| CUDA manque de mémoire | Taille de lot augmentée, ou images 1080p au lieu de 480p | manque de mémoire à l'entraînement |
| La perte semble bonne, le bras ne fait rien | Les données ne contiennent pas la tâche, ou une caméra a bougé | la perte diminue, la politique ne fait rien |
| Mouvement saccadé ou pause en milieu d'épisode | Sous-entraîné, un blocage à la limite d'un segment, ou un appel d'inférence expiré | la politique se fige en plein mouvement |
Deux lignes méritent d'être soulignées. ACT s'entraîne sur LeRobot v3.0 tandis que le chargeur de GR00T plante avec et nécessite v2.1, donc un jeu de données qui entraîne ACT peut faire échouer une exécution de GR00T. Et la dernière ligne propose deux solutions : les auteurs d'ACT répondent aux mouvements saccadés par plus d'entraînement, tandis qu'avec n_action_steps à 100, un véritable blocage se produit à la limite d'un segment, une pause visible toutes les 3.3 seconds à 30 fps. Deux autres choses à savoir : une seule articulation morte est généralement un ID de servo qui n'a jamais été écrit, et une pince qui s'approche mais ne se ferme jamais signifie une plage de pince trop faible dans les démonstrations. Index complet : les pages des modes de défaillance.
Ce que coûte une exécution
| Niveau | Modèles | Durée d'exécution | Prix par heure | Coût par exécution |
|---|---|---|---|---|
| RTX 4090 / 24 GB | ACT, SmolVLA | 2 à 5 heures | 0.30 to 0.60 USD | environ 1 à 3 USD |
| A100 80 GB / H100 | GR00T N1.7, GR00T N1.5, Pi0.5 | 3 à 6 heures | 1.20 to 2.00 USD | environ 4 à 12 USD |
C'est l'argument pour commencer avec ACT même si vous souhaitez un VLA plus tard. Une exécution ACT échouée coûte le prix d'un café et vous indique en quelques heures si votre ensemble de données contient la tâche. Une exécution GR00T échouée coûte quatre fois plus cher pour la même leçon. Passer à GR00T N1.7 ou SmolVLA par la suite est un changement de forme, pas une reconstruction. Contexte : modèles vision-langage-action, le guide complet du SO-100, entraîner votre première politique et apprentissage par imitation. Pas de bras ? La page en direct diffuse un vrai SO-100 à piloter sans inscription.
Entraîner ACT sur votre SO-100
Le guide pour cette combinaison exacte : les valeurs par défaut, le niveau de GPU et le coût d'une exécution. Choisissez l'ensemble de données, le backend loue la carte et écrit les points de contrôle.
Ouvrir le guide d'entraînementExiste-t-il un modèle ACT pré-entraîné que je peux affiner à la place ?▾
Non. ACT n'a pas de modèle de base ; il n'existe qu'après que vous l'ayez entraîné. Ce n'est pas une lacune dans les outils, c'est ce qu'est ACT : l'article entraîne une politique à partir de zéro pour chaque tâche. Pour un point de contrôle fournisseur, utilisez GR00T N1.7 ou Pi0.5.
De combien d'épisodes ai-je réellement besoin ?▾
50 : ce qu'ALOHA a enregistré par tâche (100 pour Thread Velcro, la plus difficile) et le minimum d'AY-Robots. lerobot conseille environ 10 par emplacement d'objet, caméras fixes, prise cohérente. Cinquante épisodes propres valent mieux que cent où la caméra a bougé.
Dois-je modifier chunk_size de 100 ?▾
Généralement non. L'ablation passe de 1 percent à k = 1 à 44 percent à k = 100 et diminue ensuite, donc 100 se situe près du sommet. Si le bras s'engage trop longtemps, réduisez plutôt n_action_steps : à 30 fps, 25 requêtes toutes les 0.8 seconds.
Combien de temps dure une exécution d'entraînement, et puis-je l'arrêter plus tôt ?▾
Deux à cinq heures sur une carte de 24 GB pour 100000 steps. Les points de contrôle sont enregistrés toutes les 20000 steps et --resume=true reprend une exécution, donc l'arrêt anticipé est sûr. Mais pas au premier palier : la fluidité s'améliore après que la perte se stabilise.
La perte a diminué et le bras échoue toujours. Que faire maintenant ?▾
Presque toujours l'ensemble de données. Rejouez les épisodes enregistrés au niveau du bras : si la relecture n'effectue pas la tâche, les données ne la contiennent pas. Vérifiez ensuite si quelque chose a bougé, en particulier une caméra. ACT n'a pas de priors, donc un petit mouvement à l'épisode 21 est permanent.
Sources
- Zhao, Kumar, Levine, Finn: Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ACT), arXiv 2304.13705
- ALOHA / ACT project page
- tonyzhaozh/act, the reference implementation and its training-length advice
- tonyzhaozh/act issue 25: the action head reads only the first decoder layer
- huggingface/lerobot
- lerobot ACTConfig: chunk_size, n_action_steps, n_decoder_layers and the rest of the defaults
- lerobot TrainPipelineConfig: steps, batch_size, seed, save_freq, log_freq, save_checkpoint_to_hub
- lerobot train_utils: zero-padded checkpoint dirs, the last symlink and checkpoint push tagging
- lerobot v0.6.1 release, 3 August 2026
- LeRobot docs: ACT
- LeRobot docs: imitation learning on real robots (record, replay, train, rollout)
- LeRobot docs: SO-100 setup, motor ids and calibration
- LeRobot docs: installation and the optional extras
- Hugging Face blog: LeRobot Community Datasets, the ImageNet of Robotics, When and How?
- TheRobotStudio/SO-ARM100: Standard Open Arm 100
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started