AY-Robots testsida: tre sätt att komma igång utan att äga en robot, inklusive att hyra en GPU för policy-slutledning
GR00T N1.7FjärrslutledningMoln-GPULeRobotSO-100Latens

Kör GR00T-slutledning utan en lokal GPU

AY-Robots ResearchAugust 23, 202619 min läsning

Din robotmaskin har ingen GPU. Placera GR00T-policy-servern på en hyrd moln-GPU, strömma åtgärdschunkar till armen och ta reda på exakt vad nätverket kostar dig.

En Raspberry Pi räcker för att driva en över en seriell buss och hämta bilder från två USB-kameror. Det räcker inte för att köra en tre miljarder parameter : NVIDIAs README anger GR00T N1.7 inferens till en GPU med 16 GB eller mer VRAM. För att se vad din finjusterade checkpoint gör på armen utan att köpa ett kort, placera policyn på en hyrd moln-GPU, behåll robotloopen på maskinen med USB-portarna och skicka observationer och åtgärdsbitar över nätverket.

Det fungerar, det är inte gratis, och priset är inte jämnt fördelat över uppgifter. Nedan: NVIDIAs egen policy-server, lerobots asynkrona stack, aritmetiken som i förväg säger om din upplänk är tillräckligt snabb, och plattformsrutten. Allt kontrollerat mot Isaac-GR00T main branch (N1.7 GA) och lerobot 0.6.1 den 23 augusti 2026.

Vad du behöver veta

  • GR00T N1.7, GR00T N1.5 och Pi0.5 är modeller med ungefär 3 miljarder parametrar. Ingen av dem passar på en robotkontroller utan en diskret GPU.
  • Isaac-GR00T och lerobot levereras båda med en klient-server-uppdelning. Du skriver inte transporten.
  • Observationer dominerar nätverkskostnaden, inte åtgärder: två okomprimerade 640x480 RGB-bilder är 1 843 200 byte, cirka 14,7 Mbit per anrop, och ingen av stackarna komprimerar dem.
  • AY-Robots listar 20 till 485 ms per åtgärdssteg beroende på modell. Interna rundresor kommer utöver det.
  • Fjärrinferens passar för långsam plock-och-placering, inte snabb reaktiv rörelse. En längre exekveringshorisont köper tid och kostar observationsfräschhet.
  • Ingen av servrarna är säker på en publik IP som de levereras, och lerobots har en opatchad RCE. Tunnla den.

Varför policyn inte får plats på robotmaskinen

Två av de fem policyer AY-Robots kan träna körs på ett arbetsstationskort, tre gör det inte. Kolumnen för nedan är per åtgärdssteg, och det är det tal som konkurrerar med din nätverksrundtur.

PolicyParametrarInferens per åtgärdsstegGPU-nivå för träningMin. avsnittDatasetformat
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
AY-Robots policysida som jämför de fem träningsbara policyerna efter parametrar, GPU-nivå, inferenslatens och minsta antal avsnitt
Samma fem rader på /policies. Latenskolumnen avgör om en policy överlever ett nätverkshopp.

Se det som ett beslut, inte kuriosa. på 20 ms per steg körs på robotmaskinen och du behöver aldrig tänka på det igen. på 485 ms har förbrukat en tredjedels sekund innan ett paket lämnar din byggnad. och lägger till noggrannhetssidan.

ACT har ingen basmodell

GR00T N1.7, GR00T N1.5 och Pi0.5 utgår från en leverantörs-checkpoint (nvidia/GR00T-N1.7-3B, nvidia/GR00T-N1.5-3B, lerobot/pi05_base). ACT existerar inte förrän du tränar den för din egen uppgift, så det finns inget att tillhandahålla på distans förrän ett träningsjobb har körts. Se ACT på SO-100.

De två klient-server-stackarna som redan existerar

Isaac-GR00T levererar en ZeroMQ request-reply-server; lerobot levererar en gRPC-server byggd kring asynkron inferens. Båda accepterar en GR00T checkpoint. lerobots lista över stödda policyer i async_inference/constants.py är act, smolvla, diffusion, tdmpc, vqbet, pi0, pi05 och groot; dess robotlista är so100_follower, so101_follower, bi_so_follower och omx_follower.

Isaac-GR00T PolicyServerlerobot async inference
Startpunktgr00t/eval/run_gr00t_server.pypython -m lerobot.async_inference.policy_server
TransportZeroMQ REQ/REPgRPC, add_insecure_port / insecure_channel
Serialiseringmsgpack + msgpack_numpy, allow_pickle=False enforcedpickle.dumps / pickle.loads, marked # nosec
Standardport55558080
Standardbindning0.0.0.0, alla gränssnittlocalhost
Autentiseringapi_token stöds av klassen, skickas inte via CLIingen
Klienttimeout15000 ms (PolicyClient timeout_ms)2 s observation queue timeout
Exekveringsmodellsynkron: blockera, kör sedan chunkasynkron: kör medan nästa chunk beräknas

Serialiseringsraden är viktigare än den ser ut. GR00T:s MsgSerializer vägrar object-dtype ndarray-nyttolaster i båda riktningarna, eftersom msgpack_numpy annars skulle lämna över dem till pickle. lerobot använder pickle istället: policy_server.py anropar pickle.loads på förfrågningsdata, robot_client.py picklar observationen den skickar. Försvarbart på ett betrott LAN, oförsvarbart när porten är nåbar från internet.

Rutt A: NVIDIAs egen GR00T policy-server

Detta är sökvägen NVIDIA dokumenterar för SO-100 och SO-101 hårdvara, och den att använda om din checkpoint kom från examples/finetune.sh med --embodiment-tag NEW_EMBODIMENT. Stegen lägger till det som den ursprungliga README-filen utelämnar: att få porten till roboten utan att exponera den för alla andra.

  1. 1
    Installera GR00T på den hyrda GPU-boxen

    Submoduler krävs, och git-lfs måste finnas innan kloningen, annars kommer parquet-filerna i demo_data som pekare. flash-attn och TensorRT ingår i standardinstallationen. Fällan på en ny pod-avbildning: torchcodec 0.8.0 är den enda videobackend som stöds och laddar endast FFmpeg 4 till 7. Ubuntu 25.10 och 26.04 levereras med FFmpeg 8, så GR00T misslyckas med Could not load libtorchcodec. Installera en FFmpeg under version 8 och lägg dess bibliotek på 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
    Autentisera mot den gated backbone

    Varje GR00T N1.7 checkpoint, inklusive din egen finjustering, laddar den gated nvidia/Cosmos-Reason2-2B vid första användningen. Begär åtkomst på modellsidan och logga in på podden, annars misslyckas laddningen med en GatedRepoError.

    bash
    uv run huggingface-cli login
    # or:  export HF_TOKEN=<your_token>
  3. 3
    Starta policy-servern

    Peka --model-path mot din checkpoint-katalog; på den sökvägen ignorerar servern --modality-config-path, som endast läses på replay-sökvägen. Utelämna --model-path och skicka istället --dataset-path plus --execution-horizon för en ReplayPolicy som spelar upp inspelade åtgärder, det billigaste sättet att bevisa att kopplingen fungerar.

    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
    Tunna port 5555 till robotmaskinen

    Bind till loopback, som ovan, och överför porten via SSH eller ett WireGuard-liknande nät. Detta tillhandahåller den kryptering och autentisering som ZeroMQ-socketen inte gör, för ungefär en millisekund.

    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
    Kör robotklienten bredvid servona

    Klienten behöver sin egen uv-miljö: den vill ha lerobots robotdrivrutiner, inte träningsstacken. eval_so100.py importerar so100_follower, so101_follower och koch_follower, så skicka --robot.type som matchar din arm (den ursprungliga README använder so101_follower). Kameranycklar måste matcha träningen: adaptern läser exakt front och wrist, och att byta dem visar policyn fel vy.

    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"
Två standardinställningar som kan ställa till problem

run_gr00t_server.py använder som standard --host 0.0.0.0, vilket binder varje gränssnitt: på en pod med en publik IP-adress blir detta en öppen inferens-slutpunkt. Och klassen PolicyServer accepterar en api_token och validerar den per förfrågan, men run_gr00t_server.py skickar aldrig en sådan, så CLI-servern är oautentiserad oavsett vad du konfigurerar. Bind till 127.0.0.1 och tunnla. Ett ZMQError: Address already in use betyder att port 5555 är upptagen; skicka med --port.

Rutt B: lerobot asynkron inferens

lerobot löser ett annat problem. Istället för att blockera roboten medan modellen tänker, fortsätter klienten att stega igenom kön den redan har medan servern beräknar nästa del. Detta är åtgärdssegmentering vidareutvecklat, den asynkrona stacken som introducerades med SmolVLA. Det fungerar även med en GR00T-checkpoint.

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
Policy-server på GPU:n, robotklient på maskinen med USB-portarna

Servern startar tom: den vet inte vilken policy den ska tillhandahålla förrän klientens första handskakning berättar det, vilket är bekvämt på en hyrd pod. De två inställningarna som avgör om armen rör sig smidigt är actions_per_chunk och chunk_size_threshold (lerobot-dokumentationen kallar den andra g, efter SmolVLA-artikeln), och de dokumenterade värdena och de levererade värdena stämmer inte överens.

ParameterVärde i lerobot 0.6.1-kodVad den görAnmärkning
actions_per_chunkinget standardvärde, obligatorisktÅtgärder som returneras per anropDokumentationstabellen listar 50; dataclass-fältet har inget standardvärde, så CLI kräver ett värde
chunk_size_threshold0.5Köfyllnadsgrad vid eller under vilken klienten skickar en ny observationDokumentationstabellen säger 0.7; koden och dokumentationens eget exempel säger 0.5
fps30Klientens kontrollfrekvens, sätter environment_dt = 1/fpsSänk den om kön fortsätter att tömmas
inference_latency1/30 s (33.3 ms)Målad inferenslatens på servernEtt mål, inte en mätning
obs_queue_timeout2 sHur länge servern väntar på observationskönEn långsam upplänk syns här först
aggregate_fn_nameweighted_averageHur överlappande chunk-regioner blandas0.3 gammalt + 0.7 nytt; latest_only, average och conservative levereras också. Registret är AGGREGATE_FUNCTIONS i configs.py, inte robot_client.py som dokumentationen hävdar
Lerobot-policyservern har en opatchad RCE

CVE-2026-25874 är oautentiserad fjärrkörning av kod i lerobots asynkrona inferenspipeline: pickle.loads() på data som tas emot över en oautentiserad gRPC-kanal utan TLS, nåbar via SendPolicyInstructions, SendObservations och GetActions anrop. CWE-502, CVSS 3.1 baspoäng 9.8 från NVD, 4.0 baspoäng 9.3 från den tilldelande CNA. Posten listar LeRobot till och med 0.5.1 som påverkad och nämner både policyservern och robotklienten, så maskinen bredvid din arm är inom räckvidd. Uppgradering är inte lösningen: posten hänvisar till uppströmsärende 3047 och patchen, PR 3048, som byter ut pickle mot safetensors plus JSON, och den 23 augusti 2026 är båda fortfarande öppna. policy_server.py på main anropar fortfarande pickle.loads på förfrågningsdata medan serve() binder med add_insecure_port. Bind till loopback och vidarebefordra aldrig port 8080.

Aritmetiken som avgör om din länk är tillräckligt snabb

Folk hoppar över detta och lägger sedan en dag på . Det tar två minuter och är nästan alltid avgörande.

Den kommenterade observationsordlistan i NVIDIAs eval_so100.py anger vad som skickas över nätverket: två arrayer med formen (480, 640, 3) i uint8, sex led-flyttal, en språksträng. Det är 921 600 byte per bildruta, 1 843 200 byte för två kameror, cirka 14,7 Mbit, och ingen av stackarna JPEG-komprimerar det. Datablocket som kommer tillbaka är ett par dussin steg med 6 flyttal. Din uppladdning avgör allt, inte din nedladdning.

UppladdningsbandbreddTid för att skicka en observation (14,7 Mbit)Bedömning för en 30 FPS-arm
10 Mbit/s, typisk hemma-uppladdning~1.47 sOanvändbart. Armen stannar mellan varje datablock.
25 Mbit/s~0.59 sEndast långsam plock-och-placering, med en lång exekveringshorisont.
50 Mbit/s~0.29 sAnvändbart för avsiktliga uppgifter.
100 Mbit/s~0.15 sBra för plock-och-placering, märkbart vid snabba rörelser.
1 Gbit/s fiber eller datacenter~0.015 sModellen blir flaskhalsen istället.

Budgeten du måste hålla dig inom

GR00T SO-100-klienten är synkron: den anropar policy.get_action(obs), exekverar de första action_horizon steg av chunken med 30 FPS, och anropar sedan igen. Chunkstorlek och horisont är olika siffror: NVIDIAs distributionsguide rekommenderar en action chunk-storlek på 16, minst 32 i kombination med realtidschunking, medan eval_so100.py levererar en exekveringshorisont på 8. Åtta steg vid 30 FPS motsvarar 267 ms rörelse per anrop, och allt annat måste rymmas inom det.

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
Räkneexempel: 100 Mbit/s upplänk, 30 ms fördröjning tur och retur, GR00T N1.7

Att höja horisonten är en grov lösning och inte gratis: armen agerar utifrån en observation som nu är gammal. Den principiella lösningen är realtidschunking, som beräknar nästa chunk medan den nuvarande körs, fryser de åtgärder som garanterat kommer att exekveras och fyller i resten; RTC-rapporten rapporterar att det är robust mot inferensfördröjning utan omträning. Kontrollera först var det står. NVIDIA markerar RTC som experimentellt, en lågnivåmodell-primitiv som kan nås via action_head.get_action(..., options={"rtc_overlap_steps": ..., "rtc_frozen_steps": ...}), inte inkopplad i Gr00tPolicy eller server-klient-vägen, där options är oanvänd, utan tester och utan exempel. Över en policy-server får du asynkron exekvering, inte RTC.

Vad modellen kostar innan nätverket gör det

NVIDIA benchmarkar GR00T N1.7 från början till slut med 4 denoising-steg och en kamera. På en H100 80GB HBM3: 85.8 ms (11.7 Hz) i PyTorch eager, 48.6 ms (20.6 Hz) med torch.compile, 27.9 ms (35.9 Hz) med TensorRT full pipeline. En L40 i eager-läge tar 128.3 ms (7.8 Hz). NVIDIA kallar 10 Hz för det rekommenderade minimumet för typisk manipulation, och under 10 Hz lämpligt endast för långsamma, icke-reaktiva uppgifter. Dessa är omplaneringshastigheter: en 10 Hz policy kan fortfarande driva en 30 FPS arm genom action chunking. En andra kamera för dig åt fel håll.

Mät det innan du litar på det

Varje siffra ovan är en förutsägelse. Fyra kommandon förvandlar den till en mätning, värd att köra innan du lägger en pod-timme på en uppgift som aldrig skulle fungera.

  1. 1
    Få den råa tur och retur-tiden

    Mot podden, inte en CDN. Följ avvikelsen lika noga som medelvärdet: jitter får en arm att hacka, inte genomsnittlig latens.

    bash
    ping -c 50 <pod-host>
    # the mdev column is the number that predicts stutter
  2. 2
    Mät upplänken du har, inte den du betalar för

    Bostadsanslutningens uppladdningshastighet är vanligtvis en bråkdel av nedladdningshastigheten, och det är det numret i bandbreddstabellen ovan.

    bash
    # on the pod
    iperf3 -s
    
    # on the robot machine, -R omitted so this measures upload
    iperf3 -c <pod-host> -t 30
  3. 3
    Läs klientens egen latenslogg

    Lerobot-robotklienten loggar server-till-klient-latens och deserialiseringstid för varje chunk. På rutt B behöver du inga externa verktyg.

    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
    Se åtgärdskön tömmas

    Skicka med --debug_visualize_queue_size=True och klienten ritar upp köstorleken vid körning. Om den upprepade gånger når noll har du slut på budget: sänk fps, höj actions_per_chunk, eller höj chunk_size_threshold så att observationer skickas ut oftare.

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

Vad fjärrinferens faktiskt är bra för

Policy på en hyrd GPU, arm på ditt skrivbord
Fördelar
  • Du kan utvärdera en policy med 3 miljarder parametrar på verklig hårdvara utan att äga ett kort som kostar mer än armen.
  • GPU:n hyrs per timme, så en misslyckad checkpoint kostar ett par dollar.
  • Robotsidan förblir liten: lerobot-drivrutiner, två kameror, en seriell port, och du byter checkpoints utan att röra den.
Kompromisser
  • Okomprimerade observationer dominerar nätverkskostnaden, och uppladdningshastigheten i bostäder är den begränsande faktorn.
  • Jitter skadar mer än latens: en länk med ett genomsnitt på 40 ms med toppar på 300 ms hackar, medan en stabil länk på 120 ms inte gör det.
  • Snabba reaktiva uppgifter överlever inte rundresan vid någon horisont.
  • Båda servrarna levereras oautentiserade i CLI-form, så tunnelarbetet är ditt.
  • En tappad anslutning mitt i en datablock lämnar armen med en föråldrad åtgärka. Lägg till din egen watchdog på robotsidan.
UppgiftFungerar över det publika internet?Varför
Välj ett statiskt objekt, placera det i en lådaJaInget rör sig mellan observation och handling.
Stapla block i en avsiktlig taktJa, vid action_horizon 16 eller merFel ackumuleras tillräckligt långsamt för att åtgärdas i nästa datablock.
Öppna en låda, sätt in ett objektOftastKontaktrikt men långsamt. Se upp för ryckighet vid kontakt.
Följ ett rörligt objektNejPolicyn agerar på en observation som är 300 ms till 1 s gammal.
Fånga, balansera eller återhämta sig från ett slirNejKorrigeringsfönstret är kortare än en rundresa.
En 30 Hz synkron sluten slingaNejBudgeten är 33 ms från början till slut. Även ett LAN kämpar.

Om en fjärrkörning hackar vid samma punkt i varje episod, är nätverket förmodligen inte orsaken. En policy som tvekar vid samma ledvinkel varje gång är oftast ett dataproblem; se sidorna om fellägen, i synnerhet en policy som bara fungerar i en enda konfiguration och förlusten minskar men policyn gör ingenting.

Att göra det själv kontra att göra det på AY-Robots

  1. Hyr en GPU på en spotmarknad och vänta på tillräckligt VRAM till ett pris du gillar.
  2. Installera CUDA, uv, en ffmpeg torchcodec accepterar, och GR00T-stacken med submoduler.
  3. Begär åtkomst till den spärrade nvidia/Cosmos-Reason2-2B-ryggraden och placera en token på podden.
  4. Dra din checkpoint till podden.
  5. Starta servern på loopback, bygg sedan en SSH-tunnel från robotmaskinen.
  6. Installera en andra miljö på robotmaskinen för klienten och drivrutinerna.
  7. Matcha kameranycklar, lednamn och språkinstruktionen med vad checkpointen såg.
  8. Övervaka podden. En bortglömd A100 som körs över natten kostar mer än experimentet.
Den inaktiva podden är den verkliga kostnaden

GPU-räkningen slutar inte när roboten stannar. De flesta pengar som förloras på fjärrinferens går till en server som förblev igång efter att alla gått. Ställ in ett larm, eller automatisera nedmonteringen.

AY-Robots MCP-serversida som listar plattformsoperationer exponerade som verktyg för AI-agenter
MCP-sidan: provisionerings- och inferensoperationer exponerade som verktyg en agent kan anropa.

Vad en fjärrinferenssession kostar

Två siffror spelar roll: kortets timpris, och hur länge du låter det vara igång. Den första är publicerad; den andra överraskar folk.

KortRunpod community cloudRunpod secure cloudLämplig för
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/hSamma, lite snabbare
H100 PCIe 80 GB1.99 USD/h2.89 USD/hSnabbaste nivån; NVIDIAs 11.7 Hz eager-siffra gäller för ett H100 80GB HBM3
L40S 48 GB0.79 USD/h0.99 USD/hEndast inferens, över 16 GB-gränsen
RTX 4090 24 GB0.34 USD/h0.74 USD/hSmolVLA, ACT

Dessa priser lästes från Runpods prissida den 23 augusti 2026, och spotmarknaderna rör sig. AY-Robots anger istället en hel körning: 3 till 6 timmar till 1.20 till 2.00 USD per timme på A100- eller H100-nivån, cirka 4 till 12 USD för en GR00T- eller Pi0.5-körning; 2 till 5 timmar till 0.30 till 0.60 USD per timme på 24 GB-nivån, 1 till 3 USD för SmolVLA eller ACT. En inferenssession slår en träningskörning kostnadsmässigt endast om du stoppar den, vilket är vad den inaktiva vakthunden är till för. Se faktureringsdokumentationen och prissidan.

AY-Robots kostnadstabell som visar vilken GPU varje policy behöver, typisk körtid och pris, samt episoder innan en policy är användbar
Kostnadstabellen på /try: vilket kort varje modell behöver och vad en körning typiskt kostar.

Om du hellre inte vill ha nätverket i loopen

Fjärrinferens löser ett hårdvaruproblem och skapar ett latensproblem. Ibland är det bättre svaret en policy som passar den hårdvara du har.

  • ACT, ungefär 80 M parametrar och 20 ms per åtgärdssteg, minst 50 episoder, valfritt 24 GB-kort. I en repetitiv en-uppgiftskonfiguration överträffar den ofta en fjärrstyrd 3 B-modell, eftersom den aldrig väntar på ett paket.
  • SmolVLA, ungefär 450 M parametrar och 245 ms per åtgärdssteg, minst 30 episoder. Den behåller språkkonditioneringen som ACT saknar, och lerobot-dokumentationen anger den till cirka 2 GB vid inferenstid jämfört med ungefär 14 GB för PI0.
  • ACT vs GR00T N1.7 för den noggrannhetsmässiga halvan av avvägningen.

Det finns också en medelväg: träna i molnet, utvärdera lokalt. Finjustering behöver 80 GB-kortet och bryr sig inte om latens, så att träna GR00T N1.7 på en SO-100 på distans är okontroversiellt. Endast utvärderingsloopen har en realtidsbegränsning; träningsdokumentationen och modell- och armmatrisen täcker den halvan.

Ingen arm på skrivbordet än?

Styr en riktig SO-100 i webbläsaren utan registrering, jämför de fem träningsbara policyerna med deras verkliga latenssiffror, eller hyr en GPU och träna en. Tre sätt att komma igång, inget kräver hårdvara du inte äger.

Prova det utan hårdvara

Vanliga frågor

Kan jag köra GR00T N1.7 på en Raspberry Pi om GPU:n är fjärransluten?

Ja, det är vad klient-server-uppdelningen är till för. Pi:n kör lerobot-drivrutinerna, läser två kameror och en seriell buss, och skickar observationer till policy-servern; den laddar aldrig modellen. Begränsningen flyttas från VRAM till uppladdningsbandbredd: två okomprimerade 640x480 RGB-ramar är 1 843 200 byte per anrop, och ingen av stackarna komprimerar dem.

Hur mycket latens lägger nätverket faktiskt till?

Tur-och-retur-tid plus observationens överföringstid. Överföringstiden är 14.7 Mbit dividerat med din uppladdningsbandbredd: ungefär 147 ms på en 100 Mbit/s-länk, 1.47 s på en 10 Mbit/s-länk. Båda läggs ovanpå modellens egen inferenstid, som AY-Robots listar som 152 ms för GR00T N1.7 och 485 ms för Pi0.5. Mät med ping och iperf3 mot podden, inte en hastighetstestserver.

Är fjärrinferens tillräckligt bra för en verklig uppgift?

För långsam, avsiktlig plock-och-placering, ja. För något reaktivt, nej. NVIDIAs distributionsguide anger det synkrona enstegskravet till ungefär 33 ms från början till slut vid 30 FPS, och noterar att infångning, nätverk, inferens och efterbehandling rutinmässigt överskrider detta utan inblandning av internet.

Vilken port använder servrarna och är det säkert att öppna den?

Isaac-GR00T:s PolicyServer använder som standard port 5555 över ZeroMQ och binder 0.0.0.0 i sin CLI. lerobot:s använder som standard port 8080 över gRPC och binder localhost. Ingen av dem är säker att exponera: GR00T-klassen stöder en api_token men run_gr00t_server.py skickar aldrig en, och lerobot picklar data över en osäker gRPC-kanal, vilket är CVE-2026-25874. Bind till loopback och använd en SSH-tunnel.

Fixar en uppgradering av lerobot CVE-2026-25874?

Inte per den 23 augusti 2026. CVE-posten listar LeRobot upp till 0.5.1 som påverkad och PyPI levererar 0.6.1, men pull-begäran som skulle ta bort pickle från den asynkrona pipelinen är fortfarande öppen, och policy_server.py på main anropar fortfarande pickle.loads på begärandedata. Behandla nätverksisolering som åtgärd, inte en versionsuppgradering, och anta att klienten på robotsidan också omfattas.

Kan jag använda lerobot:s asynkrona klient med en GR00T-checkpoint?

Ja. lerobot 0.6.1 listar groot i SUPPORTED_POLICIES tillsammans med act, smolvla, diffusion, tdmpc, vqbet, pi0 och pi05, och både so100_follower och so101_follower finns i SUPPORTED_ROBOTS. Skicka --policy_type=groot och peka --pretrained_name_or_path mot din checkpoint. Du får asynkron exekvering, vilket GR00T SO-100-exemplet inte implementerar, på bekostnad av pickle-transporten.

Kortversionen

Fjärrinferens för en 3 B policy är ett löst ingenjörsproblem med ett olöst fysikproblem kopplat till sig. Ingenjörsarbetet består av två kommandon och en SSH-tunnel. Fysiken är att en 1.8 MB observation måste nå en GPU i ett annat land och komma tillbaka innan armen får slut på åtgärder. Gör beräkningarna innan du hyr något, välj en uppgift som tolererar en föråldrad observation, och höj exekveringshorisonten snarare än att hoppas att länken förbättras.

Om du inte har spelat in en datamängd än, spela in din första datamängd och SO-100 installationsguide kommer först, och LeRobot datamängdsformat förklarar vad inspelaren skriver. Bakgrunden finns i syn-språk-handlingsmodeller och arbetet med flödesmatchande policyer; arena-posten länkar varje benchmark-nummer till en källa.

Sources

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started