La página de prueba de AY-Robots: tres formas de empezar sin poseer un robot, incluyendo el alquiler de una GPU para la inferencia de políticas
GR00T N1.7Inferencia RemotaGPU en la NubeLeRobotSO-100Latencia

Ejecutar inferencia GR00T sin una GPU local

AY-Robots ResearchAugust 23, 202619 min de lectura

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íticaParámetrosInferencia por paso de acciónNivel de GPU para entrenamientoEpisodios mínimosFormato del conjunto de datos
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 página de políticas de AY-Robots comparando las cinco políticas entrenables por parámetros, nivel de GPU, latencia de inferencia y episodios mínimos
Las mismas cinco filas en /policies. La columna de latencia decide si una política sobrevive a un salto de red.

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.

ACT no tiene modelo base

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 PolicyServerlerobot async inference
Punto de entradagr00t/eval/run_gr00t_server.pypython -m lerobot.async_inference.policy_server
TransporteZeroMQ REQ/REPgRPC, add_insecure_port / insecure_channel
Serializaciónmsgpack + msgpack_numpy, allow_pickle=False enforcedpickle.dumps / pickle.loads, marked # nosec
Puerto predeterminado55558080
Enlace predeterminado0.0.0.0, todas las interfaceslocalhost
Autenticaciónapi_token soportado por la clase, no pasado por la CLIninguno
Tiempo de espera del cliente15000 ms (PolicyClient timeout_ms)2 s de tiempo de espera de la cola de observación
Modelo de ejecuciónsíncrono: bloquea, luego ejecuta el fragmentoasí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.

  1. 1
    Instalar 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_data llegarán como punteros. flash-attn y TensorRT vienen con la instalación predeterminada. La trampa en una imagen de pod nueva: torchcodec 0.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 con Could not load libtorchcodec. Instale un FFmpeg inferior a 8 y coloque sus bibliotecas en 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
    Autenticarse contra el backbone restringido

    Cada punto de control de GR00T N1.7, incluyendo su propio ajuste fino, carga el modelo restringido nvidia/Cosmos-Reason2-2B en el primer uso. Solicite acceso en la página del modelo e inicie sesión en el pod, o la carga fallará con un GatedRepoError.

    bash
    uv run huggingface-cli login
    # or:  export HF_TOKEN=<your_token>
  3. 3
    Iniciar el servidor de políticas

    Apunte --model-path a 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-path y pase --dataset-path más --execution-horizon en su lugar para una ReplayPolicy que reproduce acciones grabadas, la forma más económica de probar que el cableado funciona.

    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
    Tunelizar 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
  5. 5
    Ejecutar 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.py importa so100_follower, so101_follower y koch_follower, así que pase el --robot.type que coincida con su brazo (el README original usa so101_follower). Las claves de la cámara deben coincidir con el entrenamiento: el adaptador lee exactamente front y wrist, e intercambiarlas muestra a la política la vista incorrecta.

    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"
Dos valores predeterminados que te pueden complicar

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.

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
Servidor de políticas en la GPU, cliente del robot en la máquina con los puertos USB

El 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ámetroValor en el código de lerobot 0.6.1Qué haceNota
actions_per_chunksin valor predeterminado, requeridoAcciones devueltas por llamadaLa 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_threshold0.5Relación de llenado de la cola en o por debajo de la cual el cliente envía una nueva observaciónLa tabla de la documentación dice 0.7; el código y el propio ejemplo de la documentación dicen 0.5
fps30Tasa de control del cliente, establece environment_dt = 1/fpsRedúcelo si la cola sigue vaciándose
inference_latency1/30 s (33.3 ms)Latencia de inferencia objetivo en el servidorUn objetivo, no una medición
obs_queue_timeout2 sCuánto tiempo espera el servidor en la cola de observacionesUn enlace ascendente lento se manifiesta aquí primero
aggregate_fn_nameweighted_averageCómo se mezclan las regiones de fragmentos superpuestas0.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
El servidor de políticas de lerobot tiene una RCE sin parchear

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 subidaTiempo 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 sInutilizable. El brazo se detiene entre cada fragmento.
25 Mbit/s~0.59 sSolo pick-and-place lento, con un horizonte de ejecución largo.
50 Mbit/s~0.29 sViable para tareas deliberadas.
100 Mbit/s~0.15 sBien para pick-and-place, visible en movimientos rápidos.
Fibra de 1 Gbit/s o centro de datos~0.015 sEl 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.

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
Ejemplo práctico: enlace ascendente de 100 Mbit/s, tiempo de ida y vuelta de 30 ms, GR00T N1.7

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

Lo que cuesta el modelo antes que la red

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.

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

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

    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
    Observa cómo se vacía la cola de acciones

    Pasa --debug_visualize_queue_size=True y 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.

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

¿Para qué sirve realmente la inferencia remota?

Política en una GPU alquilada, brazo en tu escritorio
Ventajas
  • 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.
Inconvenientes
  • 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 contenedorNada se mueve entre la observación y la acción.
Apila bloques a un ritmo deliberadoSí, con action_horizon 16 o másLos errores se acumulan lo suficientemente lento como para corregirlos en el siguiente fragmento.
Abre un cajón, inserta un objetoNormalmenteRico en contacto pero lento. Observa las paradas y arranques al hacer contacto.
Sigue un objeto en movimientoNoLa 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ónNoLa ventana de corrección es más corta que un viaje de ida y vuelta.
Un bucle cerrado síncrono de 30 HzNoEl 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

  1. Alquila una GPU en un mercado spot y espera a tener suficiente VRAM a un precio que te guste.
  2. Instala CUDA, uv, un torchcodec de ffmpeg compatible y la pila GR00T con submódulos.
  3. Solicita acceso al backbone restringido `nvidia/Cosmos-Reason2-2B` y coloca un token en el pod.
  4. Copia tu checkpoint al pod.
  5. Inicia el servidor en loopback, luego crea un túnel SSH desde la máquina del robot.
  6. Instala un segundo entorno en la máquina del robot para el cliente y los controladores.
  7. Ajusta las claves de la cámara, los nombres de las articulaciones y la instrucción de lenguaje a lo que el checkpoint vio.
  8. Vigila el pod. Una A100 olvidada funcionando toda la noche cuesta más que el experimento.
El pod inactivo es el verdadero costo

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.

La página del servidor MCP de AY-Robots que lista las operaciones de la plataforma expuestas como herramientas para agentes de IA
La página MCP: operaciones de aprovisionamiento e inferencia expuestas como herramientas que un agente puede invocar.

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.

TarjetaNube comunitaria de RunpodNube segura de RunpodAdecuado para
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/hLo mismo, un poco más rápido
H100 PCIe 80 GB1.99 USD/h2.89 USD/hNivel más rápido; la cifra de 11.7 Hz de NVIDIA es para una H100 80GB HBM3
L40S 48 GB0.79 USD/h0.99 USD/hSolo inferencia, por encima del límite de 16 GB
RTX 4090 24 GB0.34 USD/h0.74 USD/hSmolVLA, 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 .

La tabla de costos de AY-Robots que muestra qué GPU necesita cada política, el tiempo de ejecución y el precio típicos, y los episodios antes de que una política sea útil
La tabla de costos en /try: qué tarjeta necesita cada modelo y cuánto cuesta típicamente una ejecución.

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 hardware

Preguntas 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

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started