
Tu máquina robótica no tiene GPU. Coloca el servidor de políticas GR00T en una GPU en la nube alquilada, transmite fragmentos de acciones al brazo y descubre exactamente lo que te cuesta la red.
Una Raspberry Pi es suficiente para controlar un a través de un bus serie y extraer fotogramas de dos cámaras USB. No es suficiente para ejecutar un de tres mil millones de parámetros: el README de NVIDIA sitúa la inferencia de GR00T N1.7 en una GPU con 16 GB o más de VRAM. Para ver lo que hace su punto de control ajustado en el brazo sin comprar una tarjeta, coloque la política en una GPU en la nube alquilada, mantenga el bucle del robot en la máquina con los puertos USB y envíe las observaciones y los fragmentos de acción a través de la red.
Funciona, no es gratis y el precio no se distribuye uniformemente entre las tareas. A continuación: el propio servidor de políticas de NVIDIA, la pila asíncrona de lerobot, la aritmética que indica de antemano si su enlace ascendente es lo suficientemente rápido y la ruta de la plataforma. Todo ello comprobado con la rama principal de Isaac-GR00T (N1.7 GA) y lerobot 0.6.1 el 23 de agosto de 2026.
Lo que necesita saber
- •GR00T N1.7, GR00T N1.5 y Pi0.5 son modelos de aproximadamente 3 mil millones de parámetros. Ninguno cabe en un controlador de robot sin una GPU discreta.
- •Isaac-GR00T y lerobot distribuyen una división cliente-servidor. Usted no escribe el transporte.
- •Las observaciones dominan el coste de la transmisión, no las acciones: dos fotogramas RGB sin comprimir de 640x480 son 1.843.200 bytes, aproximadamente 14.7 Mbit por llamada, y ninguna de las pilas los comprime.
- •AY-Robots lista de 20 a 485 ms por paso de acción según el modelo. Los viajes de ida y vuelta por internet se suman a eso.
- •La inferencia remota es adecuada para tareas lentas de "pick-and-place", no para movimientos reactivos rápidos. Un horizonte de ejecución más largo gana tiempo y cuesta frescura en las observaciones.
- •Ningún servidor es seguro en una IP pública tal como se distribuye, y el de lerobot contiene un RCE sin parchear. Cree un túnel.
Por qué la política no cabrá en la máquina del robot
Dos de las cinco políticas que AY-Robots puede entrenar se ejecutan en una tarjeta de estación de trabajo, tres no. La columna siguiente es por paso de acción, y ese es el número que compite con el tiempo de ida y vuelta de su red.
| Política | Parámetros | Inferencia por paso de acción | Nivel de GPU para entrenamiento | Episodios mínimos | Formato del conjunto de datos |
|---|---|---|---|---|---|
| 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 |

Léalo como una decisión, no como una trivialidad. a 20 ms por paso se ejecuta en la máquina del robot y nunca más tendrá que preocuparse por ello. a 485 ms ha consumido un tercio de segundo antes de que un paquete salga de su edificio. La y añaden el lado de la precisión.
GR00T N1.7, GR00T N1.5 y Pi0.5 parten de un checkpoint de proveedor (nvidia/GR00T-N1.7-3B, nvidia/GR00T-N1.5-3B, lerobot/pi05_base). ACT no existe hasta que lo entrenas en tu propia tarea, por lo que no hay nada que servir de forma remota hasta que se haya ejecutado un trabajo de entrenamiento. Consulta ACT on SO-100.
Las dos pilas cliente-servidor que ya existen
Isaac-GR00T incluye un servidor ZeroMQ de solicitud-respuesta; lerobot incluye un servidor gRPC construido alrededor de inferencia asíncrona. Ambos aceptan un GR00T checkpoint. La lista de políticas soportadas por lerobot en async_inference/constants.py es act, smolvla, diffusion, tdmpc, vqbet, pi0, pi05 y groot; su lista de robots es so100_follower, so101_follower, bi_so_follower y omx_follower.
| Isaac-GR00T PolicyServer | lerobot async inference | |
|---|---|---|
| Punto de entrada | gr00t/eval/run_gr00t_server.py | python -m lerobot.async_inference.policy_server |
| Transporte | ZeroMQ REQ/REP | gRPC, add_insecure_port / insecure_channel |
| Serialización | msgpack + msgpack_numpy, allow_pickle=False enforced | pickle.dumps / pickle.loads, marked # nosec |
| Puerto predeterminado | 5555 | 8080 |
| Enlace predeterminado | 0.0.0.0, todas las interfaces | localhost |
| Autenticación | api_token soportado por la clase, no pasado por la CLI | ninguno |
| Tiempo de espera del cliente | 15000 ms (PolicyClient timeout_ms) | 2 s de tiempo de espera de la cola de observación |
| Modelo de ejecución | síncrono: bloquea, luego ejecuta el fragmento | asíncrono: ejecuta mientras se calcula el siguiente fragmento |
La fila de serialización importa más de lo que parece. El MsgSerializer de GR00T rechaza cargas útiles de ndarray de tipo de objeto en ambas direcciones, porque msgpack_numpy de lo contrario las entregaría a pickle. lerobot usa pickle en su lugar: policy_server.py llama a pickle.loads en los datos de la solicitud, robot_client.py serializa la observación que envía. Defendible en una LAN de confianza, indefendible una vez que el puerto es accesible desde internet.
Ruta A: Servidor de políticas GR00T propio de NVIDIA
Esta es la ruta que NVIDIA documenta para el hardware SO-100 y SO-101, y la que debe usar si su punto de control salió de examples/finetune.sh con --embodiment-tag NEW_EMBODIMENT. Los pasos añaden lo que el README original omite: llevar el puerto al robot sin exponerlo a todos los demás.
- 1Instalar GR00T en la caja GPU alquilada
Los submódulos son obligatorios, y git-lfs debe existir antes de la clonación o los archivos parquet en
demo_datallegarán como punteros. flash-attn y TensorRT vienen con la instalación predeterminada. La trampa en una imagen de pod nueva:torchcodec0.8.0 es el único backend de video compatible y solo carga FFmpeg 4 a 7. Ubuntu 25.10 y 26.04 incluyen FFmpeg 8, por lo que GR00T falla conCould not load libtorchcodec. Instale un FFmpeg inferior a 8 y coloque sus bibliotecas enLD_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')" - 2Autenticarse contra el backbone restringido
Cada punto de control de GR00T N1.7, incluyendo su propio ajuste fino, carga el modelo restringido
nvidia/Cosmos-Reason2-2Ben el primer uso. Solicite acceso en la página del modelo e inicie sesión en el pod, o la carga fallará con unGatedRepoError.bashuv run huggingface-cli login # or: export HF_TOKEN=<your_token> - 3Iniciar el servidor de políticas
Apunte
--model-patha su directorio de punto de control; en esa ruta el servidor ignora--modality-config-path, que solo se lee en la ruta de reproducción. Omita--model-pathy pase--dataset-pathmás--execution-horizonen su lugar para una ReplayPolicy que reproduce acciones grabadas, la forma más económica de probar que el cableado funciona.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 - 4Tunelizar el puerto 5555 a la máquina del robot
Enlace a loopback, como se indicó anteriormente, y transporte el puerto a través de SSH o una malla tipo WireGuard. Eso proporciona el cifrado y la autenticación que el socket ZeroMQ no ofrece, por aproximadamente un milisegundo.
bash# on the robot machine ssh -N -L 5555:127.0.0.1:5555 root@<pod-host> -p <pod-ssh-port> # sanity check that something answers nc -vz 127.0.0.1 5555 - 5Ejecutar el cliente del robot junto a los servos
El cliente necesita su propio entorno uv: quiere los controladores de robot de lerobot, no la pila de entrenamiento.
eval_so100.pyimporta so100_follower, so101_follower y koch_follower, así que pase el--robot.typeque coincida con su brazo (el README original usa so101_follower). Las claves de la cámara deben coincidir con el entrenamiento: el adaptador lee exactamentefrontywrist, e intercambiarlas muestra a la política la vista incorrecta.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 por defecto usa --host 0.0.0.0, enlazando todas las interfaces: en un pod con una IP pública, esto es un endpoint de inferencia abierto. Y la clase PolicyServer acepta un api_token y lo valida por solicitud, pero run_gr00t_server.py nunca pasa uno, por lo que el servidor CLI no está autenticado, independientemente de lo que configure. Enlace a 127.0.0.1 y cree un túnel. Un ZMQError: Address already in use significa que el puerto 5555 está ocupado; pase --port.
Ruta B: inferencia asíncrona con lerobot
lerobot resuelve un problema diferente. En lugar de bloquear el robot mientras el modelo piensa, el cliente sigue avanzando a través de la cola que ya tiene mientras el servidor calcula el siguiente fragmento. Esto es fragmentación de acciones, llevado más allá, la pila asíncrona introducida con SmolVLA. También funciona con un checkpoint de 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=TrueEl servidor arranca vacío: no sabe qué política sirve hasta que el primer handshake del cliente se lo indica, lo cual es conveniente en un pod alquilado. Los dos parámetros que deciden si el brazo se mueve suavemente son actions_per_chunk y chunk_size_threshold (la documentación de lerobot llama al segundo g, en referencia al artículo de SmolVLA), y los valores documentados y los valores implementados no coinciden.
| Parámetro | Valor en el código de lerobot 0.6.1 | Qué hace | Nota |
|---|---|---|---|
| actions_per_chunk | sin valor predeterminado, requerido | Acciones devueltas por llamada | La tabla de la documentación lista 50; el campo de la dataclass no tiene valor predeterminado, por lo que la CLI exige un valor |
| chunk_size_threshold | 0.5 | Relación de llenado de la cola en o por debajo de la cual el cliente envía una nueva observación | La tabla de la documentación dice 0.7; el código y el propio ejemplo de la documentación dicen 0.5 |
| fps | 30 | Tasa de control del cliente, establece environment_dt = 1/fps | Redúcelo si la cola sigue vaciándose |
| inference_latency | 1/30 s (33.3 ms) | Latencia de inferencia objetivo en el servidor | Un objetivo, no una medición |
| obs_queue_timeout | 2 s | Cuánto tiempo espera el servidor en la cola de observaciones | Un enlace ascendente lento se manifiesta aquí primero |
| aggregate_fn_name | weighted_average | Cómo se mezclan las regiones de fragmentos superpuestas | 0.3 antiguo + 0.7 nuevo; latest_only, average y conservative también se incluyen. El registro es AGGREGATE_FUNCTIONS en configs.py, no robot_client.py como afirma la documentación |
CVE-2026-25874 es una ejecución remota de código no autenticada en el pipeline de inferencia asíncrona de lerobot: pickle.loads() sobre datos recibidos a través de un canal gRPC no autenticado sin TLS, accesible a través de las llamadas SendPolicyInstructions, SendObservations y GetActions. CWE-502, puntuación base CVSS 3.1 de 9.8 de NVD, puntuación base 4.0 de 9.3 de la CNA asignadora. El registro lista a LeRobot hasta 0.5.1 como afectado y nombra tanto al servidor de políticas como al cliente robot, por lo que la máquina junto a tu brazo está dentro del alcance. La actualización no es la solución: el registro cita el problema upstream 3047 y el parche, PR 3048, que cambia pickle por safetensors más JSON, y el 23 de agosto de 2026 ambos siguen abiertos. policy_server.py en main todavía llama a pickle.loads en los datos de la solicitud mientras que serve() se enlaza con add_insecure_port. Enlaza a loopback y nunca reenvíes el puerto 8080.
La aritmética que decide si tu enlace es lo suficientemente rápido
La gente se salta esto y luego pasa un día con . Lleva dos minutos y casi siempre es decisivo.
El diccionario de observación comentado en el eval_so100.py de NVIDIA dice lo que se transmite: dos arrays de forma (480, 640, 3) en uint8, seis floats de articulación, una cadena de idioma. Eso son 921.600 bytes por fotograma, 1.843.200 bytes para dos cámaras, aproximadamente 14,7 Mbit, y ninguna pila lo comprime con JPEG. El fragmento que regresa son unas pocas docenas de pasos de 6 floats. Tu subida lo decide todo, no tu descarga.
| Ancho de banda de subida | Tiempo para enviar una observación (14,7 Mbit) | Veredicto para un brazo de 30 FPS |
|---|---|---|
| 10 Mbit/s, subida doméstica típica | ~1.47 s | Inutilizable. El brazo se detiene entre cada fragmento. |
| 25 Mbit/s | ~0.59 s | Solo pick-and-place lento, con un horizonte de ejecución largo. |
| 50 Mbit/s | ~0.29 s | Viable para tareas deliberadas. |
| 100 Mbit/s | ~0.15 s | Bien para pick-and-place, visible en movimientos rápidos. |
| Fibra de 1 Gbit/s o centro de datos | ~0.015 s | El modelo se convierte en el cuello de botella en su lugar. |
El presupuesto en el que debes encajar
El cliente GR00T SO-100 es síncrono: llama a policy.get_action(obs), ejecuta los primeros action_horizon pasos del fragmento a 30 FPS, luego vuelve a llamar. El tamaño del fragmento y el horizonte son números diferentes: la guía de despliegue de NVIDIA recomienda un tamaño de fragmento de acción de 16, al menos 32 cuando se combina con el chunking en tiempo real, mientras que eval_so100.py incluye un horizonte de ejecución de 8. Ocho pasos a 30 FPS son 267 ms de movimiento por llamada, y todo lo demás tiene que encajar dentro de eso.
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 staleAumentar el horizonte es la solución burda y no gratuita: el brazo actúa sobre una observación que ahora es antigua. La solución basada en principios es el chunking en tiempo real (RTC), que calcula el siguiente fragmento mientras se ejecuta el actual, congela las acciones garantizadas para su ejecución y rellena el resto; el artículo de RTC lo reporta como robusto al retraso de inferencia sin necesidad de reentrenamiento. Verifique primero dónde se encuentra eso. NVIDIA marca RTC como experimental, una primitiva de modelo de bajo nivel accesible a través de action_head.get_action(..., options={"rtc_overlap_steps": ..., "rtc_frozen_steps": ...}), no conectado a Gr00tPolicy ni a la ruta servidor-cliente, donde options no se utiliza, sin pruebas y sin ejemplo. Sobre un servidor de políticas se obtiene ejecución asíncrona, no RTC.
NVIDIA evalúa GR00T N1.7 de extremo a extremo en 4 pasos de denoising con una cámara. En una H100 80GB HBM3: 85.8 ms (11.7 Hz) en PyTorch eager, 48.6 ms (20.6 Hz) con torch.compile, 27.9 ms (35.9 Hz) con el pipeline completo de TensorRT. Una L40 en modo eager tarda 128.3 ms (7.8 Hz). NVIDIA considera 10 Hz el mínimo recomendado para manipulación típica, y por debajo de 10 Hz solo adecuado para tareas lentas y no reactivas. Esas son tasas de replanteamiento: una política de 10 Hz aún puede controlar un brazo de 30 FPS mediante el chunking de acciones. Una segunda cámara te lleva en la dirección equivocada.
Mídelo antes de confiar en él
Cada número anterior es una predicción. Cuatro comandos lo convierten en una medición, que vale la pena ejecutar antes de dedicar una hora de pod a una tarea que nunca iba a funcionar.
- 1Obtén el tiempo de ida y vuelta sin procesar
Contra el pod, no una CDN. Observa la desviación tan de cerca como la media: la fluctuación (jitter) hace que un brazo tartamudee, no la latencia promedio.
bashping -c 50 <pod-host> # the mdev column is the number that predicts stutter - 2Mide el uplink que tienes, no el que pagas
La subida residencial suele ser una fracción de la descarga, y es el número en la tabla de ancho de banda anterior.
bash# on the pod iperf3 -s # on the robot machine, -R omitted so this measures upload iperf3 -c <pod-host> -t 30 - 3Lee el registro de latencia del propio cliente
El cliente de robot lerobot registra la latencia de servidor a cliente y el tiempo de deserialización para cada fragmento. En la ruta B no necesitas herramientas externas.
textReceived action chunk for step #240 | Latest action: #232 | Incoming actions: 240:289 | Network latency (server->client): 187.44ms | Deserialization time: 3.10ms - 4Observa cómo se vacía la cola de acciones
Pasa
--debug_visualize_queue_size=Truey el cliente grafica el tamaño de la cola en tiempo de ejecución. Si repetidamente llega a cero, te has quedado sin presupuesto: baja los fps, aumenta actions_per_chunk, o aumenta chunk_size_threshold para que las observaciones se envíen con más frecuencia.bashpython -m lerobot.async_inference.robot_client \ ... \ --debug_visualize_queue_size=True
¿Para qué sirve realmente la inferencia remota?
- Puedes evaluar una política de 3 mil millones de parámetros en hardware real sin poseer una tarjeta que cueste más que el brazo.
- La GPU se alquila por hora, por lo que un punto de control fallido cuesta un par de dólares.
- El lado del robot se mantiene pequeño: controladores lerobot, dos cámaras, un puerto serie, y puedes intercambiar puntos de control sin tocarlo.
- Las observaciones sin comprimir dominan el costo de la transmisión, y la subida residencial es la restricción principal.
- La fluctuación (jitter) perjudica más que la latencia: un enlace con un promedio de 40 ms y picos de 300 ms tartamudea, mientras que un enlace estable de 120 ms no lo hace.
- Las tareas reactivas rápidas no sobreviven al viaje de ida y vuelta en ningún horizonte.
- Ambos servidores se envían sin autenticación en formato CLI, por lo que el trabajo de tunelización es tuyo.
- Una conexión caída a mitad de un fragmento deja el brazo ejecutando una acción obsoleta. Añade tu propio robot de vigilancia (watchdog) en el lado del robot.
| Tarea | ¿Funciona a través de internet público? | Por qué |
|---|---|---|
| Elige un objeto estático, colócalo en un contenedor | Sí | Nada se mueve entre la observación y la acción. |
| Apila bloques a un ritmo deliberado | Sí, con action_horizon 16 o más | Los errores se acumulan lo suficientemente lento como para corregirlos en el siguiente fragmento. |
| Abre un cajón, inserta un objeto | Normalmente | Rico en contacto pero lento. Observa las paradas y arranques al hacer contacto. |
| Sigue un objeto en movimiento | No | La política actúa sobre una observación de entre 300 ms y 1 s de antigüedad. |
| Atrapa, equilibra o recupera de un resbalón | No | La ventana de corrección es más corta que un viaje de ida y vuelta. |
| Un bucle cerrado síncrono de 30 Hz | No | El presupuesto es de 33 ms de extremo a extremo. Incluso una LAN tiene dificultades. |
Si una ejecución remota tartamudea en el mismo punto en cada episodio, la red probablemente no sea la causa. Una política que duda en el mismo ángulo de articulación cada vez suele ser un problema de datos; consulta las páginas de modos de fallo, en particular una política que solo funciona en una configuración y la pérdida disminuye pero la política no hace nada.
Hacerlo tú mismo vs hacerlo en AY-Robots
- Alquila una GPU en un mercado spot y espera a tener suficiente VRAM a un precio que te guste.
- Instala CUDA, uv, un torchcodec de ffmpeg compatible y la pila GR00T con submódulos.
- Solicita acceso al backbone restringido `nvidia/Cosmos-Reason2-2B` y coloca un token en el pod.
- Copia tu checkpoint al pod.
- Inicia el servidor en loopback, luego crea un túnel SSH desde la máquina del robot.
- Instala un segundo entorno en la máquina del robot para el cliente y los controladores.
- Ajusta las claves de la cámara, los nombres de las articulaciones y la instrucción de lenguaje a lo que el checkpoint vio.
- Vigila el pod. Una A100 olvidada funcionando toda la noche cuesta más que el experimento.
La factura de la GPU no se detiene cuando el robot se detiene. La mayor parte del dinero perdido en inferencia remota se destina a un servidor que permaneció activo después de que todos se marcharon. Configura una alarma o automatiza el desmantelamiento.
- Elige la política entrenada que deseas ejecutar.
- `/api/inference/pod` aprovisiona automáticamente un pod de GPU en la nube que sirve esa política.
- El cliente del robot local se comunica con ese endpoint. Los checkpoints base son propios de los proveedores: `nvidia/GR00T-N1.7-3B`, `nvidia/GR00T-N1.5-3B`, `lerobot/pi05_base`. ACT no tiene ninguno.
- Los pods llevan un watchdog de inactividad y se autodestruyen después de un período de inactividad, para que nada siga facturando en silencio.
- Las mismas operaciones están disponibles desde una terminal y para agentes de IA, por lo que el bucle puede ser programado.
El autoaprovisionamiento elimina el trabajo de configuración y la factura del pod olvidado, no la física. La inferencia aún tiene que estar junto a los servos para tareas rápidas: el bucle de control es de 20 a 485 ms por paso de acción dependiendo del modelo, y los viajes de ida y vuelta por internet público, además de eso, convierten una política funcional en una vacilante.
- Guía del cliente para el lado local de la conexión
- Ejecuta tu primera política para el tutorial
- CLI y servidor MCP para la versión programada
- Documentos de seguridad

Cuánto cuesta una sesión de inferencia remota
Dos números importan: la tarifa por hora de la tarjeta y cuánto tiempo la dejas funcionando. El primero se publica; el segundo sorprende a la gente.
| Tarjeta | Nube comunitaria de Runpod | Nube segura de Runpod | Adecuado para |
|---|---|---|---|
| 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 | Lo mismo, un poco más rápido |
| H100 PCIe 80 GB | 1.99 USD/h | 2.89 USD/h | Nivel más rápido; la cifra de 11.7 Hz de NVIDIA es para una H100 80GB HBM3 |
| L40S 48 GB | 0.79 USD/h | 0.99 USD/h | Solo inferencia, por encima del límite de 16 GB |
| RTX 4090 24 GB | 0.34 USD/h | 0.74 USD/h | SmolVLA, ACT |
Esas tarifas se leyeron de la página de precios de Runpod el 23 de agosto de 2026, y los mercados spot son volátiles. AY-Robots en su lugar cotiza una ejecución completa: de 3 a 6 horas a 1.20 a 2.00 USD por hora en el nivel A100 o H100, aproximadamente de 4 a 12 USD para una ejecución de GR00T o Pi0.5; de 2 a 5 horas a 0.30 a 0.60 USD por hora en el nivel de 24 GB, de 1 a 3 USD para SmolVLA o ACT. Una sesión de inferencia supera a una ejecución de entrenamiento en costo solo si la detienes, para lo cual sirve el 'idle watchdog'. Consulta los y la .

Si prefieres no tener la red en el bucle
La inferencia remota resuelve un problema de hardware y crea un problema de latencia. A veces, la mejor respuesta es una política que se adapte al hardware que tienes.
- ACT, aproximadamente 80 M parámetros y 20 ms por paso de acción, 50 episodios mínimo, cualquier tarjeta de 24 GB. En una configuración repetitiva de una sola tarea, a menudo supera a un modelo remoto de 3 B, porque nunca espera un paquete.
- SmolVLA, aproximadamente 450 M parámetros y 245 ms por paso de acción, 30 episodios mínimo. Mantiene el condicionamiento de lenguaje del que carece ACT, y la documentación de lerobot lo sitúa en aproximadamente 2 GB en tiempo de inferencia frente a aproximadamente 14 GB para PI0.
- ACT vs GR00T N1.7 para la mitad de precisión del compromiso.
También hay un camino intermedio: entrenar en la nube, evaluar localmente. Ajuste fino necesita la tarjeta de 80 GB y no le importa la latencia, por lo que entrenar GR00T N1.7 en un SO-100 de forma remota es indiscutible. Solo el bucle de evaluación tiene una restricción de tiempo real; la documentación de entrenamiento y la matriz de modelos y brazos cubren esa mitad.
¿Aún no tienes un brazo robótico en el escritorio?
Controla un SO-100 real en el navegador sin registrarte, compara las cinco políticas entrenables con sus números de latencia reales, o alquila una GPU y entrena una. Tres formas de empezar, ninguna requiere hardware que no poseas.
Pruébalo sin hardwarePreguntas frecuentes
¿Puedo ejecutar GR00T N1.7 en una Raspberry Pi si la GPU es remota?▾
Sí, para eso sirve la división cliente-servidor. La Pi ejecuta los controladores de lerobot, lee dos cámaras y un bus serie, y envía las observaciones al servidor de políticas; nunca carga el modelo. La limitación se traslada de la VRAM al ancho de banda de subida: dos fotogramas RGB sin comprimir de 640x480 son 1,843,200 bytes por llamada, y ninguna de las pilas los comprime.
¿Cuánta latencia añade realmente la red?▾
Tiempo de ida y vuelta más tiempo de transferencia de la observación. El tiempo de transferencia es de 14.7 Mbit dividido por tu ancho de banda de subida: aproximadamente 147 ms en un enlace de 100 Mbit/s, 1.47 s en un enlace de 10 Mbit/s. Ambos se suman al tiempo de inferencia propio del modelo, que AY-Robots lista como 152 ms para GR00T N1.7 y 485 ms para Pi0.5. Mide con ping e iperf3 contra el pod, no contra un servidor de prueba de velocidad.
¿Es la inferencia remota lo suficientemente buena para una tarea real?▾
Para tareas lentas y deliberadas de 'pick-and-place', sí. Para cualquier cosa reactiva, no. La guía de despliegue de NVIDIA establece el requisito de un solo paso síncrono en aproximadamente 33 ms de principio a fin a 30 FPS, y señala que la captura, la red, la inferencia y el post-procesamiento superan rutinariamente ese valor sin que haya internet de por medio.
¿Qué puerto usan los servidores y es seguro abrirlo?▾
El PolicyServer de Isaac-GR00T usa por defecto el puerto 5555 sobre ZeroMQ y enlaza 0.0.0.0 en su CLI. lerobot usa por defecto el puerto 8080 sobre gRPC y enlaza localhost. Ninguno es seguro de exponer: la clase GR00T soporta un api_token pero run_gr00t_server.py nunca lo pasa, y lerobot serializa datos con pickle sobre un canal gRPC inseguro, lo cual es CVE-2026-25874. Enlaza a loopback y usa un túnel SSH.
¿Actualizar lerobot soluciona CVE-2026-25874?▾
No a partir del 23 de agosto de 2026. El registro CVE lista a LeRobot hasta la versión 0.5.1 como afectado y PyPI distribuye la 0.6.1, pero la solicitud de extracción que eliminaría pickle de la tubería asíncrona sigue abierta, y policy_server.py en main todavía llama a pickle.loads en los datos de la solicitud. Trata el aislamiento de red como la mitigación, no una actualización de versión, y asume que el cliente del lado del robot también está dentro del alcance.
¿Puedo usar el cliente asíncrono de lerobot con un checkpoint de GR00T?▾
Sí. lerobot 0.6.1 lista groot en SUPPORTED_POLICIES junto con act, smolvla, diffusion, tdmpc, vqbet, pi0 y pi05, y tanto so100_follower como so101_follower están en SUPPORTED_ROBOTS. Pasa --policy_type=groot y apunta --pretrained_name_or_path a tu checkpoint. Obtienes ejecución asíncrona, que el ejemplo GR00T SO-100 no implementa, a costa del transporte pickle.
La versión corta
La inferencia remota para una política es un problema de ingeniería resuelto con un problema de física sin resolver adjunto. La ingeniería son dos comandos y un túnel SSH. La física es que una observación de 1.8 MB tiene que llegar a una GPU en otro país y regresar antes de que el brazo se quede sin acciones. Haz los cálculos antes de alquilar cualquier cosa, elige una tarea que tolere una observación obsoleta y eleva el horizonte de ejecución en lugar de esperar que el enlace mejore.
Si aún no has grabado un conjunto de datos, graba tu primer conjunto de datos y la guía de configuración del SO-100 son lo primero, y la entrada del formato de conjunto de datos LeRobot explica lo que escribe el grabador. El contexto se encuentra en los modelos de visión-lenguaje-acción y el trabajo sobre políticas de coincidencia de flujo; la entrada de la arena enlaza cada número de referencia a una fuente.
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
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