La page d'essai d'AY-Robots : trois façons de commencer sans posséder de robot, y compris la location d'un GPU pour l'inférence de politiques
GR00T N1.7Inférence à distanceGPU CloudLeRobotSO-100Latence

Exécuter l'inférence GR00T sans GPU local

AY-Robots ResearchAugust 23, 202619 min de lecture

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.

PolitiqueParamètresInférence par étape d'actionNiveau de GPU pour l'entraînementÉpisodes min.Format du jeu de données
GR00T N1.7~3 B, ~40 M trained during fine-tuning152 msA100 80 GB or H100 80 GB50LeRobot v2.0 or v2.1
GR00T N1.5~3 B165 msA100 80 GB or H100 80 GB50LeRobot v2.0 or v2.1
Pi0.5~3 B, PaliGemma backbone485 msA100 80 GB or H100 80 GB50LeRobot v3.0
SmolVLA~450 M245 msRTX 4090 or any 24 GB card30LeRobot v3.0
ACT~80 M20 msRTX 4090 or any 24 GB card50LeRobot v3.0
La page des politiques d'AY-Robots comparant les cinq politiques entraînables par paramètres, niveau de GPU, latence d'inférence et épisodes minimums
Les cinq mêmes lignes sur /policies. La colonne de latence détermine si une politique survit à un saut réseau.

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.

ACT n'a pas de modèle de base

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 PolicyServerlerobot async inference
Point d'entréegr00t/eval/run_gr00t_server.pypython -m lerobot.async_inference.policy_server
TransportZeroMQ REQ/REPgRPC, add_insecure_port / insecure_channel
Sérialisationmsgpack + msgpack_numpy, allow_pickle=False enforcedpickle.dumps / pickle.loads, marked # nosec
Port par défaut55558080
Liaison par défaut0.0.0.0, toutes les interfaceslocalhost
Authentificationapi_token pris en charge par la classe, non transmis par la CLIaucune
Délai d'attente client15000 ms (PolicyClient timeout_ms)Délai d'attente de 2 s pour la file d'attente d'observation
Modèle d'exécutionsynchrone : bloquer, puis exécuter le morceauasynchrone : 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.

  1. 1
    Installer 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_data arrivent comme des pointeurs. flash-attn et TensorRT sont inclus dans l'installation par défaut. Le piège sur une nouvelle image de pod : torchcodec 0.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 avec Could not load libtorchcodec. Installez un FFmpeg inférieur à 8 et placez ses bibliothèques sur LD_LIBRARY_PATH.

    bash
    sudo 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')"
  2. 2
    S'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-2B lors 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 une GatedRepoError.

    bash
    uv run huggingface-cli login
    # ou:  export HF_TOKEN=<your_token>
  3. 3
    Démarrer le serveur de politique

    Pointez --model-path vers 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-path et passez plutôt --dataset-path plus --execution-horizon pour une ReplayPolicy qui rejoue les actions enregistrées, le moyen le moins cher de prouver que le câblage fonctionne.

    bash
    uv 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
  4. 4
    Tunneliser 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
  5. 5
    Exé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.py importe so100_follower, so101_follower et koch_follower, alors passez le --robot.type correspondant à votre bras (le README en amont utilise so101_follower). Les clés de caméra doivent correspondre à l'entraînement : l'adaptateur lit exactement front et wrist, et les échanger montre à la politique la mauvaise vue.

    bash
    cd 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"
Deux valeurs par défaut qui vous poseront problème

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.

bash
# 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=True
Serveur de politique sur le GPU, client robot sur la machine avec les ports USB

Le 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ètreValeur dans le code lerobot 0.6.1Ce qu'il faitRemarque
actions_per_chunkpas de valeur par défaut, requisActions renvoyées par appelLa table des docs liste 50 ; le champ dataclass n'a pas de valeur par défaut, donc la CLI exige une valeur
chunk_size_threshold0.5Ratio de remplissage de la file d'attente à ou en dessous duquel le client envoie une nouvelle observationLa table des docs indique 0.7 ; le code et l'exemple des docs eux-mêmes indiquent 0.5
fps30Taux de contrôle client, définit environment_dt = 1/fpsDiminuez-le si la file d'attente continue de se vider
inference_latency1/30 s (33.3 ms)Latence d'inférence cible sur le serveurUne cible, pas une mesure
obs_queue_timeout2 sTemps d'attente du serveur sur la file d'attente d'observationsUne liaison montante lente se manifeste ici en premier
aggregate_fn_nameweighted_averageComment les régions de chunks qui se chevauchent sont mélangées0.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
Le serveur de politiques lerobot a une RCE non patchée

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'envoiTemps pour envoyer une observation (14,7 Mbit)Verdict pour un bras à 30 FPS
10 Mbit/s, envoi domestique typique~1.47 sInutilisable. Le bras s'arrête entre chaque bloc.
25 Mbit/s~0.59 sPick-and-place lent uniquement, avec un horizon d'exécution long.
50 Mbit/s~0.29 sUtilisable pour des tâches délibérées.
100 Mbit/s~0.15 sConvient pour le pick-and-place, visible sur les mouvements rapides.
Fibre 1 Gbit/s ou centre de données~0.015 sLe 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.

text
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 stale
Exemple détaillé : liaison montante de 100 Mbit/s, temps d'aller-retour de 30 ms, GR00T N1.7

Augmenter 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.

Ce que coûte le modèle avant le réseau

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é.

  1. 1
    Obtenez 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.

    bash
    ping -c 50 <pod-host>
    # the mdev column is the number that predicts stutter
  2. 2
    Mesurez 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
  3. 3
    Lisez 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.

    text
    Received action chunk for step #240 | Latest action: #232 |
      Incoming actions: 240:289 |
      Network latency (server->client): 187.44ms |
      Deserialization time: 3.10ms
  4. 4
    Surveillez la vidange de la file d'attente d'actions

    Passez --debug_visualize_queue_size=True et 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.

    bash
    python -m lerobot.async_inference.robot_client \
        ... \
        --debug_visualize_queue_size=True

À quoi sert réellement l'inférence à distance

Politique sur un GPU loué, bras sur votre bureau
Avantages
  • 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.
Compromis
  • 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âcheFonctionne sur l'internet public ?Pourquoi
Prendre un objet statique, le placer dans un bacOuiRien ne bouge entre l'observation et l'action.
Empiler des blocs à un rythme délibéréOui, avec un action_horizon de 16 ou plusLes erreurs s'accumulent assez lentement pour être corrigées sur le chunk suivant.
Ouvrir un tiroir, insérer un objetHabituellementRiche en contacts mais lent. Attention aux arrêts et démarrages au contact.
Suivre un objet en mouvementNonLa politique agit sur une observation vieille de 300 ms à 1 s.
Attraper, équilibrer ou récupérer après un glissementNonLa fenêtre de correction est plus courte qu'un aller-retour.
Une boucle fermée synchrone à 30 HzNonLe 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

  1. Louez un GPU sur un marché spot et attendez d'avoir suffisamment de VRAM à un prix qui vous convient.
  2. Installez CUDA, uv, un torchcodec ffmpeg compatible, et la pile GR00T avec ses sous-modules.
  3. Demandez l'accès au backbone sécurisé `nvidia/Cosmos-Reason2-2B` et placez un jeton sur le pod.
  4. Téléchargez votre point de contrôle sur le pod.
  5. Démarrez le serveur en boucle locale, puis créez un tunnel SSH depuis la machine robot.
  6. Installez un second environnement sur la machine robot pour le client et les pilotes.
  7. 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.
  8. Surveillez le pod. Un A100 oublié fonctionnant toute la nuit coûte plus cher que l'expérience.
Le pod inactif est le vrai coût

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.

La page du serveur MCP d'AY-Robots listant les opérations de la plateforme exposées comme des outils pour les agents IA
La page MCP : opérations de provisionnement et d'inférence exposées comme des outils qu'un agent peut appeler.

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.

CarteCloud communautaire RunpodCloud sécurisé RunpodAdapté pour
A100 PCIe 80 GB1.19 USD/h1.39 USD/hGR00T N1.7, GR00T N1.5, Pi0.5
A100 SXM 80 GB1.39 USD/h1.59 USD/hIdentique, un peu plus rapide
H100 PCIe 80 GB1.99 USD/h2.89 USD/hNiveau le plus rapide ; le chiffre de 11,7 Hz de NVIDIA est pour un H100 80GB HBM3
L40S 48 GB0.79 USD/h0.99 USD/hInférence uniquement, au-dessus du seuil de 16 Go
RTX 4090 24 GB0.34 USD/h0.74 USD/hSmolVLA, 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.

Le tableau des coûts AY-Robots indiquant le GPU requis par chaque politique, la durée et le prix typiques d'une exécution, et le nombre d'épisodes avant qu'une politique ne soit utile
Le tableau des coûts sur /try : quelle carte chaque modèle nécessite et ce qu'une exécution coûte typiquement.

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ériel

Questions 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

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started