
Votre machine robotique n'a pas de GPU. Placez le serveur de politiques GR00T sur un GPU cloud loué, diffusez des blocs d'actions vers le bras, et découvrez le coût exact du réseau.
Un Raspberry Pi est suffisant pour piloter un via un bus série et récupérer des images de deux caméras USB. Il n'est pas suffisant pour exécuter un de trois milliards de paramètres : le README de NVIDIA indique que l'inférence de GR00T N1.7 nécessite un GPU avec 16 Go ou plus de VRAM. Pour voir ce que votre checkpoint affiné fait sur le bras sans acheter de carte, placez la politique sur un GPU cloud loué, maintenez la boucle du robot sur la machine avec les ports USB, et envoyez les observations et les fragments d'action sur le réseau.
Cela fonctionne, ce n'est pas gratuit, et le coût n'est pas réparti uniformément entre les tâches. Ci-dessous : le serveur de politique de NVIDIA, la pile asynchrone de lerobot, l'arithmétique qui indique à l'avance si votre liaison montante est suffisamment rapide, et la route de la plateforme. Tout cela a été vérifié par rapport à la branche principale d'Isaac-GR00T (N1.7 GA) et à lerobot 0.6.1 le 23 août 2026.
Ce qu'il faut savoir
- •GR00T N1.7, GR00T N1.5 et Pi0.5 sont des modèles d'environ 3 milliards de paramètres. Aucun ne tient sur un contrôleur de robot sans un GPU discret.
- •Isaac-GR00T et lerobot proposent tous deux une architecture client-serveur. Vous n'écrivez pas le transport.
- •Les observations dominent le coût de transmission, pas les actions : deux images RGB 640x480 non compressées représentent 1 843 200 octets, soit environ 14,7 Mbit par appel, et aucune des piles ne les compresse.
- •AY-Robots indique 20 à 485 ms par étape d'action selon le modèle. Les allers-retours Internet s'ajoutent à cela.
- •L'inférence à distance convient aux tâches lentes de 'pick-and-place', pas aux mouvements réactifs rapides. Un horizon d'exécution plus long permet de gagner du temps et coûte en fraîcheur d'observation.
- •Aucun des serveurs n'est sûr sur une IP publique tel que livré, et celui de lerobot contient une RCE non patchée. Tunnelisez-le.
Pourquoi la politique ne tiendra pas sur la machine du robot
Deux des cinq politiques qu'AY-Robots peut entraîner s'exécutent sur une carte de station de travail, trois non. La colonne ci-dessous est par étape d'action, et c'est ce nombre qui est en concurrence avec votre temps d'aller-retour réseau.
| Politique | Paramètres | Inférence par étape d'action | Niveau de GPU pour l'entraînement | Épisodes min. | Format du jeu de données |
|---|---|---|---|---|---|
| GR00T N1.7 | ~3 B, ~40 M trained during fine-tuning | 152 ms | A100 80 GB or H100 80 GB | 50 | LeRobot v2.0 or v2.1 |
| GR00T N1.5 | ~3 B | 165 ms | A100 80 GB or H100 80 GB | 50 | LeRobot v2.0 or v2.1 |
| Pi0.5 | ~3 B, PaliGemma backbone | 485 ms | A100 80 GB or H100 80 GB | 50 | LeRobot v3.0 |
| SmolVLA | ~450 M | 245 ms | RTX 4090 or any 24 GB card | 30 | LeRobot v3.0 |
| ACT | ~80 M | 20 ms | RTX 4090 or any 24 GB card | 50 | LeRobot v3.0 |

Considérez cela comme une décision, pas comme une anecdote. à 20 ms par étape s'exécute sur la machine du robot et vous n'y pensez plus. à 485 ms a passé un tiers de seconde avant qu'un paquet ne quitte votre bâtiment. La et ajoutent le côté précision.
GR00T N1.7, GR00T N1.5 et Pi0.5 démarrent à partir d'un point de contrôle fournisseur (nvidia/GR00T-N1.7-3B, nvidia/GR00T-N1.5-3B, lerobot/pi05_base). ACT n'existe pas tant que vous ne l'avez pas entraîné sur votre propre tâche, il n'y a donc rien à servir à distance tant qu'un travail d'entraînement n'a pas été exécuté. Voir ACT on SO-100.
Les deux piles client-serveur qui existent déjà
Isaac-GR00T fournit un serveur ZeroMQ de type requête-réponse ; lerobot fournit un serveur gRPC construit autour de l'inférence asynchrone. Les deux acceptent un GR00T point de contrôle. La liste des politiques prises en charge par lerobot dans async_inference/constants.py est act, smolvla, diffusion, tdmpc, vqbet, pi0, pi05 et groot ; sa liste de robots est so100_follower, so101_follower, bi_so_follower et omx_follower.
| Isaac-GR00T PolicyServer | lerobot async inference | |
|---|---|---|
| Point d'entrée | gr00t/eval/run_gr00t_server.py | python -m lerobot.async_inference.policy_server |
| Transport | ZeroMQ REQ/REP | gRPC, add_insecure_port / insecure_channel |
| Sérialisation | msgpack + msgpack_numpy, allow_pickle=False enforced | pickle.dumps / pickle.loads, marked # nosec |
| Port par défaut | 5555 | 8080 |
| Liaison par défaut | 0.0.0.0, toutes les interfaces | localhost |
| Authentification | api_token pris en charge par la classe, non transmis par la CLI | aucune |
| Délai d'attente client | 15000 ms (PolicyClient timeout_ms) | Délai d'attente de 2 s pour la file d'attente d'observation |
| Modèle d'exécution | synchrone : bloquer, puis exécuter le morceau | asynchrone : exécuter pendant que le morceau suivant est calculé |
La ligne de sérialisation est plus importante qu'il n'y paraît. Le MsgSerializer de GR00T refuse les charges utiles ndarray de type objet dans les deux sens, car msgpack_numpy les transmettrait autrement à pickle. lerobot utilise plutôt pickle : policy_server.py appelle pickle.loads sur les données de requête, robot_client.py utilise pickle pour l'observation qu'il envoie. Défendable sur un LAN de confiance, indéfendable une fois que le port est accessible depuis Internet.
Route A : Serveur de politique GR00T propre à NVIDIA
C'est le chemin documenté par NVIDIA pour le matériel SO-100 et SO-101, et celui à utiliser si votre checkpoint provient de examples/finetune.sh avec --embodiment-tag NEW_EMBODIMENT. Les étapes ajoutent ce que le README en amont omet : acheminer le port vers le robot sans l'exposer à tout le monde.
- 1Installer GR00T sur la machine GPU louée
Les sous-modules sont requis, et git-lfs doit exister avant le clonage, sinon les fichiers parquet dans
demo_dataarrivent comme des pointeurs. flash-attn et TensorRT sont inclus dans l'installation par défaut. Le piège sur une nouvelle image de pod :torchcodec0.8.0 est le seul backend vidéo pris en charge et ne charge que FFmpeg 4 à 7. Ubuntu 25.10 et 26.04 livrent FFmpeg 8, donc GR00T échoue avecCould not load libtorchcodec. Installez un FFmpeg inférieur à 8 et placez ses bibliothèques surLD_LIBRARY_PATH.bashsudo apt install git-lfs && git lfs install curl -LsSf https://astral.sh/uv/install.sh | sh sudo apt-get update && sudo apt-get install -y ffmpeg git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T uv sync --python 3.12 uv run python -c "import gr00t; print('GR00T installed successfully')" - 2S'authentifier auprès du backbone restreint
Chaque checkpoint GR00T N1.7, y compris votre propre fine-tune, charge le modèle restreint
nvidia/Cosmos-Reason2-2Blors de la première utilisation. Demandez l'accès sur la page du modèle et connectez-vous sur le pod, sinon le chargement échouera avec uneGatedRepoError.bashuv run huggingface-cli login # ou: export HF_TOKEN=<your_token> - 3Démarrer le serveur de politique
Pointez
--model-pathvers votre répertoire de checkpoint ; sur ce chemin, le serveur ignore--modality-config-path, qui n'est lu que sur le chemin de relecture. Omettez--model-pathet passez plutôt--dataset-pathplus--execution-horizonpour une ReplayPolicy qui rejoue les actions enregistrées, le moyen le moins cher de prouver que le câblage fonctionne.bashuv run python gr00t/eval/run_gr00t_server.py \ --model-path /workspace/so100_finetune/checkpoint-10000 \ --embodiment-tag NEW_EMBODIMENT \ --device cuda:0 \ --host 127.0.0.1 --port 5555 - 4Tunneliser le port 5555 vers la machine robot
Lie au loopback, comme ci-dessus, et transportez le port via SSH ou un maillage de type WireGuard. Cela fournit le chiffrement et l'authentification que la socket ZeroMQ n'offre pas, pour environ une milliseconde.
bash# sur la machine robot ssh -N -L 5555:127.0.0.1:5555 root@<pod-host> -p <pod-ssh-port> # vérification que quelque chose répond nc -vz 127.0.0.1 5555 - 5Exécuter le client robot à côté des servomoteurs
Le client a besoin de son propre environnement uv : il veut les pilotes de robot de lerobot, pas la pile d'entraînement.
eval_so100.pyimporte so100_follower, so101_follower et koch_follower, alors passez le--robot.typecorrespondant à votre bras (le README en amont utilise so101_follower). Les clés de caméra doivent correspondre à l'entraînement : l'adaptateur lit exactementfrontetwrist, et les échanger montre à la politique la mauvaise vue.bashcd gr00t/eval/real_robot/SO100 uv sync uv pip install --no-deps -e ../../../../ uv run --no-sync python eval_so100.py \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --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=127.0.0.1 \ --policy_port=5555 \ --lang_instruction="pick up the red block and put it in the bin"
run_gr00t_server.py utilise par défaut --host 0.0.0.0, liant toutes les interfaces : sur un pod avec une IP publique, cela constitue un point d'accès d'inférence ouvert. Et la classe PolicyServer accepte un api_token et le valide par requête, mais run_gr00t_server.py n'en passe jamais, donc le serveur CLI n'est pas authentifié, quelle que soit votre configuration. Liez-vous à 127.0.0.1 et utilisez un tunnel. Une ZMQError: Address already in use signifie que le port 5555 est déjà utilisé ; passez --port.
Route B : inférence asynchrone lerobot
lerobot résout un problème différent. Au lieu de bloquer le robot pendant que le modèle réfléchit, le client continue de traiter la file d'attente qu'il possède déjà pendant que le serveur calcule le prochain morceau. C'est le découpage d'actions poussé plus loin, la pile asynchrone introduite avec SmolVLA. Cela fonctionne aussi avec un point de contrôle GR00T.
# GPU machine
pip install -e ".[async]"
python -m lerobot.async_inference.policy_server \
--host=127.0.0.1 \
--port=8080
# robot machine, after tunnelling 8080
python -m lerobot.async_inference.robot_client \
--server_address=127.0.0.1:8080 \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower_so100 \
--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}}" \
--task="pick up the red block and put it in the bin" \
--policy_type=groot \
--pretrained_name_or_path=<user>/my_groot_finetune \
--policy_device=cuda \
--actions_per_chunk=50 \
--chunk_size_threshold=0.5 \
--debug_visualize_queue_size=TrueLe serveur démarre vide : il ne sait pas quelle politique il sert avant que le premier handshake du client ne le lui indique, ce qui est pratique sur un pod loué. Les deux paramètres qui décident si le bras se déplace en douceur sont actions_per_chunk et chunk_size_threshold (la documentation lerobot appelle le second g, d'après l'article SmolVLA), et les valeurs documentées et les valeurs livrées ne concordent pas.
| Paramètre | Valeur dans le code lerobot 0.6.1 | Ce qu'il fait | Remarque |
|---|---|---|---|
| actions_per_chunk | pas de valeur par défaut, requis | Actions renvoyées par appel | La table des docs liste 50 ; le champ dataclass n'a pas de valeur par défaut, donc la CLI exige une valeur |
| chunk_size_threshold | 0.5 | Ratio de remplissage de la file d'attente à ou en dessous duquel le client envoie une nouvelle observation | La table des docs indique 0.7 ; le code et l'exemple des docs eux-mêmes indiquent 0.5 |
| fps | 30 | Taux de contrôle client, définit environment_dt = 1/fps | Diminuez-le si la file d'attente continue de se vider |
| inference_latency | 1/30 s (33.3 ms) | Latence d'inférence cible sur le serveur | Une cible, pas une mesure |
| obs_queue_timeout | 2 s | Temps d'attente du serveur sur la file d'attente d'observations | Une liaison montante lente se manifeste ici en premier |
| aggregate_fn_name | weighted_average | Comment les régions de chunks qui se chevauchent sont mélangées | 0.3 ancien + 0.7 nouveau ; latest_only, average et conservative sont également livrés. Le registre est AGGREGATE_FUNCTIONS dans configs.py, et non robot_client.py comme le prétend la documentation |
CVE-2026-25874 est une exécution de code à distance non authentifiée dans le pipeline d'inférence asynchrone de lerobot : pickle.loads() sur des données reçues via un canal gRPC non authentifié sans TLS, accessible via les appels SendPolicyInstructions, SendObservations et GetActions. CWE-502, score de base CVSS 3.1 de 9.8 de NVD, score de base 4.0 de 9.3 du CNA assigné. L'enregistrement liste LeRobot jusqu'à 0.5.1 comme affecté et nomme à la fois le serveur de politiques et le client robot, donc la machine à côté de votre bras est concernée. La mise à niveau n'est pas la solution : l'enregistrement cite le problème amont 3047 et le patch, PR 3048, qui remplace pickle par safetensors plus JSON, et le 23 août 2026, les deux sont toujours ouverts. policy_server.py sur main appelle toujours pickle.loads sur les données de requête tandis que serve() se lie avec add_insecure_port. Liez-vous à l'interface de bouclage et ne redirigez jamais le port 8080.
L'arithmétique qui détermine si votre liaison est suffisamment rapide
Les gens sautent cette étape et passent ensuite une journée sur . Cela prend deux minutes et c'est presque toujours décisif.
Le dictionnaire d'observation commenté dans le fichier eval_so100.py de NVIDIA indique ce qui transite sur le réseau : deux tableaux de forme (480, 640, 3) en uint8, six flottants d'articulation, une chaîne de caractères de langue. Cela représente 921 600 octets par image, 1 843 200 octets pour deux caméras, soit environ 14,7 Mbit, et aucune pile ne le compresse en JPEG. Le bloc de données renvoyé correspond à quelques dizaines d'étapes de 6 flottants. Votre débit d'envoi décide de tout, pas votre débit de téléchargement.
| Bande passante d'envoi | Temps pour envoyer une observation (14,7 Mbit) | Verdict pour un bras à 30 FPS |
|---|---|---|
| 10 Mbit/s, envoi domestique typique | ~1.47 s | Inutilisable. Le bras s'arrête entre chaque bloc. |
| 25 Mbit/s | ~0.59 s | Pick-and-place lent uniquement, avec un horizon d'exécution long. |
| 50 Mbit/s | ~0.29 s | Utilisable pour des tâches délibérées. |
| 100 Mbit/s | ~0.15 s | Convient pour le pick-and-place, visible sur les mouvements rapides. |
| Fibre 1 Gbit/s ou centre de données | ~0.015 s | Le modèle devient le goulot d'étranglement à la place. |
Le budget dans lequel vous devez vous inscrire
Le client GR00T SO-100 est synchrone : il appelle policy.get_action(obs), exécute les premières action_horizon étapes du chunk à 30 FPS, puis rappelle. La taille du chunk et l'horizon sont des nombres différents : le guide de déploiement de NVIDIA recommande une taille de chunk d'action de 16, au moins 32 lorsqu'elle est combinée avec le chunking en temps réel, tandis que eval_so100.py fournit un horizon d'exécution de 8. Huit étapes à 30 FPS représentent 267 ms de mouvement par appel, et tout le reste doit s'y intégrer.
observation upload 14.7 Mbit / 100 Mbit/s = 147 ms
network round trip = 30 ms
model inference (AY-Robots figure, N1.7) = 152 ms
action chunk return + deserialize = ~2 ms
-------
total per call 331 ms
budget at action_horizon = 8 -> 267 ms FAIL, arm pauses ~64 ms per chunk
budget at action_horizon = 16 -> 533 ms fits, with headroom
budget at action_horizon = 32 -> 1067 ms fits, observations now ~1 s staleAugmenter l'horizon est une solution grossière et non sans coût : le bras agit sur une observation qui est désormais ancienne. La solution de principe est le chunking en temps réel (RTC), qui calcule le chunk suivant pendant que le chunk actuel s'exécute, fige les actions garanties d'être exécutées et complète le reste ; l'article sur le RTC le décrit comme robuste aux délais d'inférence sans réentraînement. Vérifiez d'abord où en est cette fonctionnalité. NVIDIA marque le RTC comme expérimental, une primitive de modèle de bas niveau accessible via action_head.get_action(..., options={"rtc_overlap_steps": ..., "rtc_frozen_steps": ...}), non intégrée à Gr00tPolicy ou au chemin serveur-client, où options est inutilisé, sans tests ni exemple. Avec un serveur de politique, vous obtenez une exécution asynchrone, pas le RTC.
NVIDIA évalue le GR00T N1.7 de bout en bout à 4 étapes de débruitage avec une seule caméra. Sur un H100 80GB HBM3 : 85.8 ms (11.7 Hz) en PyTorch eager, 48.6 ms (20.6 Hz) avec torch.compile, 27.9 ms (35.9 Hz) avec le pipeline complet TensorRT. Un L40 en mode eager prend 128.3 ms (7.8 Hz). NVIDIA considère 10 Hz comme le minimum recommandé pour la manipulation typique, et en dessous de 10 Hz, cela ne convient qu'aux tâches lentes et non réactives. Ce sont des taux de replanification : une politique à 10 Hz peut toujours piloter un bras à 30 FPS grâce au chunking d'actions. Une deuxième caméra vous fait aller dans la mauvaise direction.
Mesurez-le avant de lui faire confiance
Chaque nombre ci-dessus est une prédiction. Quatre commandes le transforment en une mesure, qu'il est utile d'exécuter avant d'allouer une heure de pod à une tâche qui n'aurait jamais fonctionné.
- 1Obtenez le temps d'aller-retour brut
Contre le pod, pas un CDN. Surveillez l'écart aussi attentivement que la moyenne : la gigue fait bégayer un bras, pas la latence moyenne.
bashping -c 50 <pod-host> # the mdev column is the number that predicts stutter - 2Mesurez la liaison montante que vous avez, pas celle que vous payez
Le téléchargement résidentiel est généralement une fraction du téléchargement, et c'est le nombre dans le tableau de bande passante ci-dessus.
bash# on the pod iperf3 -s # on the robot machine, -R omitted so this measures upload iperf3 -c <pod-host> -t 30 - 3Lisez le journal de latence du client
Le client robot lerobot enregistre la latence serveur-client et le temps de désérialisation pour chaque bloc. Sur la route B, vous n'avez pas besoin d'outils externes.
textReceived action chunk for step #240 | Latest action: #232 | Incoming actions: 240:289 | Network latency (server->client): 187.44ms | Deserialization time: 3.10ms - 4Surveillez la vidange de la file d'attente d'actions
Passez
--debug_visualize_queue_size=Trueet le client trace la taille de la file d'attente à l'exécution. S'il atteint zéro à plusieurs reprises, vous êtes hors budget : réduisez les ips, augmentez actions_per_chunk, ou augmentez chunk_size_threshold afin que les observations soient envoyées plus souvent.bashpython -m lerobot.async_inference.robot_client \ ... \ --debug_visualize_queue_size=True
À quoi sert réellement l'inférence à distance
- Vous pouvez évaluer une politique de 3 milliards de paramètres sur du matériel réel sans posséder une carte qui coûte plus cher que le bras.
- Le GPU est loué à l'heure, donc un checkpoint échoué coûte quelques dollars.
- Le côté robot reste compact : pilotes lerobot, deux caméras, un port série, et vous échangez les checkpoints sans y toucher.
- Les observations non compressées dominent le coût de la bande passante, et le débit montant résidentiel est la contrainte principale.
- La gigue nuit plus que la latence : une liaison avec une moyenne de 40 ms et des pics à 300 ms provoque des saccades là où une liaison stable de 120 ms n'en provoque pas.
- Les tâches réactives rapides ne survivent pas à l'aller-retour, quel que soit l'horizon.
- Les deux serveurs sont livrés non authentifiés sous forme CLI, le travail de tunneling vous incombe donc.
- Une connexion interrompue en milieu de chunk laisse le bras avec une action obsolète. Ajoutez votre propre chien de garde côté robot.
| Tâche | Fonctionne sur l'internet public ? | Pourquoi |
|---|---|---|
| Prendre un objet statique, le placer dans un bac | Oui | Rien ne bouge entre l'observation et l'action. |
| Empiler des blocs à un rythme délibéré | Oui, avec un action_horizon de 16 ou plus | Les erreurs s'accumulent assez lentement pour être corrigées sur le chunk suivant. |
| Ouvrir un tiroir, insérer un objet | Habituellement | Riche en contacts mais lent. Attention aux arrêts et démarrages au contact. |
| Suivre un objet en mouvement | Non | La politique agit sur une observation vieille de 300 ms à 1 s. |
| Attraper, équilibrer ou récupérer après un glissement | Non | La fenêtre de correction est plus courte qu'un aller-retour. |
| Une boucle fermée synchrone à 30 Hz | Non | Le budget est de 33 ms de bout en bout. Même un réseau local a du mal. |
Si une exécution à distance saccade au même point dans chaque épisode, le réseau n'est probablement pas la cause. Une politique qui hésite au même angle articulaire à chaque fois est généralement un problème de données ; voir les pages sur les modes de défaillance, en particulier une politique qui ne fonctionne que dans une seule configuration et la perte diminue mais la politique ne fait rien.
Le faire soi-même ou le faire sur AY-Robots
- Louez un GPU sur un marché spot et attendez d'avoir suffisamment de VRAM à un prix qui vous convient.
- Installez CUDA, uv, un torchcodec ffmpeg compatible, et la pile GR00T avec ses sous-modules.
- Demandez l'accès au backbone sécurisé `nvidia/Cosmos-Reason2-2B` et placez un jeton sur le pod.
- Téléchargez votre point de contrôle sur le pod.
- Démarrez le serveur en boucle locale, puis créez un tunnel SSH depuis la machine robot.
- Installez un second environnement sur la machine robot pour le client et les pilotes.
- Faites correspondre les clés de caméra, les noms d'articulations et l'instruction linguistique à ce que le point de contrôle a vu.
- Surveillez le pod. Un A100 oublié fonctionnant toute la nuit coûte plus cher que l'expérience.
La facture du GPU ne s'arrête pas lorsque le robot s'arrête. La plupart de l'argent perdu en inférence à distance est dû à un serveur qui est resté actif après que tout le monde soit parti. Réglez une alarme ou automatisez l'arrêt.
- Choisissez la politique entraînée que vous souhaitez exécuter.
- `/api/inference/pod` provisionne automatiquement un pod GPU cloud qui sert cette politique.
- Le client robot local communique avec ce point de terminaison. Les points de contrôle de base sont ceux des fournisseurs : `nvidia/GR00T-N1.7-3B`, `nvidia/GR00T-N1.5-3B`, `lerobot/pi05_base`. ACT n'en a pas.
- Les pods sont équipés d'un chien de garde d'inactivité et se détruisent après une période d'inactivité, de sorte que rien ne continue à être facturé silencieusement.
- Les mêmes opérations sont disponibles depuis un terminal et pour les agents IA, de sorte que la boucle peut être scriptée.
L'auto-provisionnement supprime le travail de configuration et la facture des pods oubliés, mais pas la physique. L'inférence doit toujours être à proximité des servomoteurs pour les tâches rapides : la boucle de contrôle est de 20 à 485 ms par étape d'action selon le modèle, et les allers-retours sur l'internet public en plus transforment une politique fonctionnelle en une politique hésitante.
- Guide du client pour le côté local de la connexion
- Exécutez votre première politique pour le tutoriel pas à pas
- CLI et serveur MCP pour la version scriptée
- Documentation de sécurité

Ce que coûte une session d'inférence à distance
Deux chiffres comptent : le tarif horaire de la carte et la durée pendant laquelle vous la laissez fonctionner. Le premier est publié ; le second surprend les gens.
| Carte | Cloud communautaire Runpod | Cloud sécurisé Runpod | Adapté pour |
|---|---|---|---|
| A100 PCIe 80 GB | 1.19 USD/h | 1.39 USD/h | GR00T N1.7, GR00T N1.5, Pi0.5 |
| A100 SXM 80 GB | 1.39 USD/h | 1.59 USD/h | Identique, un peu plus rapide |
| H100 PCIe 80 GB | 1.99 USD/h | 2.89 USD/h | Niveau le plus rapide ; le chiffre de 11,7 Hz de NVIDIA est pour un H100 80GB HBM3 |
| L40S 48 GB | 0.79 USD/h | 0.99 USD/h | Inférence uniquement, au-dessus du seuil de 16 Go |
| RTX 4090 24 GB | 0.34 USD/h | 0.74 USD/h | SmolVLA, ACT |
Ces tarifs ont été relevés sur la page de tarification de Runpod le 23 août 2026, et les marchés spot sont fluctuants. AY-Robots propose plutôt une exécution complète : 3 à 6 heures à 1.20 à 2.00 USD par heure sur le niveau A100 ou H100, environ 4 à 12 USD pour une exécution GR00T ou Pi0.5 ; 2 à 5 heures à 0.30 à 0.60 USD par heure sur le niveau 24 Go, 1 à 3 USD pour SmolVLA ou ACT. Une session d'inférence n'est plus avantageuse qu'une exécution d'entraînement en termes de coût que si vous l'arrêtez, ce à quoi sert le chien de garde d'inactivité. Consultez les documents de facturation et la page de tarification.

Si vous préférez ne pas avoir le réseau dans la boucle
L'inférence à distance résout un problème matériel et en crée un de latence. Parfois, la meilleure réponse est une politique qui correspond au matériel dont vous disposez.
- ACT, environ 80 M paramètres et 20 ms par étape d'action, 50 épisodes minimum, toute carte de 24 Go. Dans une configuration répétitive à tâche unique, il surpasse fréquemment un modèle distant de 3 B, car il n'attend jamais de paquet.
- SmolVLA, environ 450 M paramètres et 245 ms par étape d'action, 30 épisodes minimum. Il conserve le conditionnement linguistique qui manque à ACT, et la documentation de lerobot l'estime à environ 2 Go au moment de l'inférence contre environ 14 Go pour PI0.
- ACT vs GR00T N1.7 pour la moitié précision du compromis.
Il existe également une voie médiane : entraîner dans le cloud, évaluer localement. Réglage fin nécessite la carte de 80 Go et ne se soucie pas de la latence, donc l'entraînement de GR00T N1.7 sur un SO-100 à distance est incontestable. Seule la boucle d'évaluation a une contrainte en temps réel ; les documents de formation et la matrice modèle-et-bras couvrent cette moitié.
Pas encore de bras sur le bureau ?
Pilotez un vrai SO-100 dans le navigateur sans inscription, comparez les cinq politiques entraînables avec leurs chiffres de latence réels, ou louez un GPU et entraînez-en une. Trois façons de commencer, aucune ne nécessitant de matériel que vous ne possédez pas.
Essayez-le sans matérielQuestions fréquemment posées
Puis-je exécuter GR00T N1.7 sur un Raspberry Pi si le GPU est distant ?▾
Oui, c'est à cela que sert la séparation client-serveur. Le Pi exécute les pilotes lerobot, lit deux caméras et un bus série, et envoie les observations au serveur de politique ; il ne charge jamais le modèle. La contrainte passe de la VRAM à la bande passante d'upload : deux images RGB 640x480 non compressées représentent 1 843 200 octets par appel, et aucune des piles ne les compresse.
Quelle latence le réseau ajoute-t-il réellement ?▾
Temps d'aller-retour plus temps de transfert des observations. Le temps de transfert est de 14,7 Mbit divisé par votre bande passante d'upload : environ 147 ms sur une liaison de 100 Mbit/s, 1,47 s sur une liaison de 10 Mbit/s. Ces temps s'ajoutent au temps d'inférence propre du modèle, qu'AY-Robots indique comme 152 ms pour GR00T N1.7 et 485 ms pour Pi0.5. Mesurez avec ping et iperf3 contre le pod, pas un serveur de test de vitesse.
L'inférence à distance est-elle suffisante pour une tâche réelle ?▾
Pour des tâches lentes et délibérées de pick-and-place, oui. Pour tout ce qui est réactif, non. Le guide de déploiement de NVIDIA estime l'exigence d'une étape unique synchrone à environ 33 ms de bout en bout à 30 FPS, et note que la capture, le réseau, l'inférence et le post-traitement dépassent régulièrement ce seuil sans qu'Internet ne soit impliqué.
Quel port les serveurs utilisent-ils et est-il sûr de l'ouvrir ?▾
Le PolicyServer d'Isaac-GR00T utilise par défaut le port 5555 via ZeroMQ et se lie à 0.0.0.0 dans son CLI. lerobot utilise par défaut le port 8080 via gRPC et se lie à localhost. Aucun n'est sûr à exposer : la classe GR00T prend en charge un api_token mais run_gr00t_server.py n'en passe jamais, et lerobot sérialise les données via un canal gRPC non sécurisé, ce qui est CVE-2026-25874. Liez-vous à l'interface de bouclage et utilisez un tunnel SSH.
La mise à niveau de lerobot corrige-t-elle CVE-2026-25874 ?▾
Non, pas au 23 août 2026. L'enregistrement CVE liste LeRobot jusqu'à la version 0.5.1 comme affecté et PyPI livre la version 0.6.1, mais la pull request qui supprimerait pickle du pipeline asynchrone est toujours ouverte, et policy_server.py sur main appelle toujours pickle.loads sur les données de requête. Traitez l'isolation réseau comme la mesure d'atténuation, et non une mise à jour de version, et supposez que le client côté robot est également concerné.
Puis-je utiliser le client asynchrone de lerobot avec un checkpoint GR00T ?▾
Oui. lerobot 0.6.1 liste groot dans SUPPORTED_POLICIES aux côtés de act, smolvla, diffusion, tdmpc, vqbet, pi0 et pi05, et so100_follower et so101_follower sont tous deux dans SUPPORTED_ROBOTS. Passez --policy_type=groot et pointez --pretrained_name_or_path vers votre checkpoint. Vous obtenez une exécution asynchrone, que l'exemple GR00T SO-100 n'implémente pas, au prix du transport pickle.
En bref
L'inférence à distance pour un modèle de 3 B politique est un problème d'ingénierie résolu auquel s'ajoute un problème de physique non résolu. L'ingénierie se résume à deux commandes et un tunnel SSH. La physique veut qu'une observation de 1,8 Mo doive atteindre un GPU dans un autre pays et revenir avant que le bras ne manque d'actions. Faites le calcul avant de louer quoi que ce soit, choisissez une tâche qui tolère une observation périmée, et augmentez l'horizon d'exécution plutôt que d'espérer que la liaison s'améliore.
Si vous n'avez pas encore enregistré de jeu de données, enregistrez votre premier jeu de données et le guide de configuration du SO-100 viennent en premier, et l'entrée sur le format de jeu de données LeRobot explique ce que l'enregistreur écrit. Le contexte se trouve dans les modèles vision-langage-action et les travaux sur les politiques de correspondance de flux; l'entrée de l' arène lie chaque chiffre de benchmark à une source.
Sources
- NVIDIA Isaac-GR00T : Dépôt N1.7 et README (seuil d'inférence de 16 Go, installation, backbone Cosmos-Reason2-2B contrôlé, contrainte FFmpeg)
- run_gr00t_server.py : Le CLI du serveur de politiques GR00T, les valeurs par défaut de ServerConfig (host 0.0.0.0, port 5555) et le chemin de ReplayPolicy
- server_client.py : PolicyServer et PolicyClient, la limite allow_pickle=False de MsgSerializer, api_token, timeout_ms
- eval_so100.py : Le client de politique SO-100, les valeurs par défaut de EvalConfig et la boucle de contrôle synchrone
- Exemple Isaac-GR00T SO100/SO101 : Commandes de conversion de jeu de données, de finetuning et d'évaluation en boucle fermée
- Guide de déploiement en monde réel Isaac-GR00T : Le budget synchrone de 33 ms, stop-and-go, taille du chunk d'action, statut RTC
- Recommandation matérielle Isaac-GR00T : Fréquence d'inférence par GPU et le minimum de 10 Hz
- Guide de déploiement et d'inférence Isaac-GR00T : Résultats de benchmark de latence par composant
- LeRobot : Tutoriel d'inférence asynchrone (PolicyServer, RobotClient, le tableau de paramètres documenté)
- lerobot async_inference/configs.py : Valeurs par défaut de PolicyServerConfig et RobotClientConfig, registre AGGREGATE_FUNCTIONS
- lerobot async_inference/policy_server.py : pickle.loads sur les données de requête, add_insecure_port, les noms d'appel gRPC
- lerobot robot_client.py : Transport gRPC, sérialisation pickle, journalisation de la latence
- CVE-2026-25874 : Exécution de code à distance via gRPC par désérialisation non sécurisée de LeRobot, affecté jusqu'à la version 0.5.1
- Black, Galliker et Levine, Exécution en temps réel des politiques de flux de découpage d'actions (découpage en temps réel)
- Tarification GPU Runpod : Tarifs horaires cloud communautaire et sécurisé pour A100, H100, L40S et RTX 4090
Sources
- NVIDIA Isaac-GR00T: N1.7 repository and README (16 GB inference floor, install, gated Cosmos-Reason2-2B backbone, FFmpeg constraint)
- run_gr00t_server.py: the GR00T policy server CLI, ServerConfig defaults (host 0.0.0.0, port 5555) and the ReplayPolicy path
- server_client.py: PolicyServer and PolicyClient, MsgSerializer's allow_pickle=False boundary, api_token, timeout_ms
- eval_so100.py: the SO-100 policy client, EvalConfig defaults and the synchronous control loop
- Isaac-GR00T SO100/SO101 example: dataset conversion, finetune and closed-loop eval commands
- Isaac-GR00T Real-World Deployment Guide: the 33 ms synchronous budget, stop-and-go, action chunk size, RTC status
- Isaac-GR00T Hardware Recommendation: inference frequency per GPU and the 10 Hz minimum
- Isaac-GR00T Deployment and Inference Guide: per-component latency benchmark results
- LeRobot: Asynchronous Inference tutorial (PolicyServer, RobotClient, the documented parameter table)
- lerobot async_inference/configs.py: PolicyServerConfig and RobotClientConfig defaults, AGGREGATE_FUNCTIONS registry
- lerobot async_inference/policy_server.py: pickle.loads on request data, add_insecure_port, the gRPC call names
- lerobot robot_client.py: gRPC transport, pickle serialization, latency logging
- CVE-2026-25874: LeRobot unsafe deserialization remote code execution via gRPC, affected through 0.5.1
- Black, Galliker and Levine, Real-Time Execution of Action Chunking Flow Policies (real-time chunking)
- Runpod GPU pricing: community and secure cloud hourly rates for A100, H100, L40S and RTX 4090
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started