LeRobot documentation

Inferência Remota

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Inferência Remota

Políticas grandes exigem uma GPU, e com um rollout síncrono o robô para de se mover toda vez que a política calcula seu próximo conjunto de ações. A inferência remota divide a tarefa em duas: um servidor de política executa o checkpoint em uma GPU, e o computador do robô mantém o controle das câmeras, motores, teleoperação e gravação. O robô continua executando as ações que já possui enquanto o servidor calcula as próximas, de modo que o movimento não mais pausa para a inferência.

Use-o quando:

  • o computador conectado ao robô não possui GPU, ou possui uma GPU pequena demais para a política: um notebook ou computador de placa única ao lado do braço e uma estação de trabalho com GPU do outro lado do laboratório;
  • a inferência consome uma fração perceptível de cada bloco de ações e você deseja movimento contínuo;
  • você deseja decidir com que frequência o robô replaneja sem tocar no checkpoint.

O único compromisso que você ajusta é frescor versus continuidade. Pedir um novo plano mais cedo permite que o robô reaja ao que ele vê; seguir mais do plano atual preserva o progresso da tarefa.

Como funciona

O computador do robô mantém um buffer de ações futuras. Quando o buffer fica baixo, ele envia uma nova observação, continua se movendo a partir do buffer enquanto o servidor calcula e insere o novo trecho na parte do plano que ainda não foi executada.

Três configurações do cliente definem esse comportamento. refill_seconds determina com antecedência solicitar o próximo plano, chunk_merge determina como o novo plano é integrado ao antigo, e o blending suaviza a transição entre eles. O servidor precisa apenas do checkpoint e de uma descrição do robô para o qual foi treinado. As seções abaixo partem de uma configuração funcional e, em seguida, constroem a intuição para cada configuração.

RTC local (--inference.type=rtc) é a outra opção assíncrona: a inferência é executada em uma thread em segundo plano do processo de rollout, na mesma máquina, sem um servidor. A inferência remota no mesmo host ainda usa dois processos e --inference.type=remote, e oferece alinhamento e blending para políticas sem RTC. Veja como o RTC se relaciona com a inferência remota.

Políticas e robôs suportados

Um checkpoint pode ser servido quando seus processadores salvos preveem um chunk de ações a partir de uma única observação atual; o ACT precisa do ensembling temporal desabilitado. Checkpoints de ACT, SmolVLA, XVLA, EVO1 e LaWAM já foram executados em robôs reais por meio deste caminho. Vários outros policies são suportados no nível do contrato, mas não foram validados em hardware, e policies dependentes de histórico precisam de integração adicional. A tabela de suporte de policies lista o status e as restrições de cada policy.

O driver do robô deve declarar suporte à manutenção de posição, pois o cliente atualiza o último alvo aplicado enquanto aguarda as ações. SO, OMX, Koch, HopeJr, Rebot e os seguidores YAM o declaram; OpenArm, Reachy2 e os wrappers bimanuais dependem de sua configuração; o Unitree G1 o declara apenas com o controlador SONIC, cujo alvo retido é o último token de movimento; as bases móveis não declaram. Consulte a tabela de hardware. Contratos de robô ou de política não suportados são rejeitados na admissão, antes de qualquer movimento.

Comece com um rollout funcional

Mantenha um comando lerobot-rollout síncrono bem-sucedido como referência e preserve suas configurações de robô, câmeras, tarefa, FPS, teleoperador e interpolação. O checkpoint e o dispositivo do modelo são movidos para o servidor; o cliente remoto não carrega os pesos.

Os exemplos abaixo descrevem um SO-101 genérico com seis atuadores e uma câmera frontal. Adapte o checkpoint, as visões da câmera, a ordem dos componentes e as unidades de forma consistente.

1. Instale nos dois computadores

Ambos os lados precisam do extra remote. Mantenha os extras de hardware no cliente e o extra da política selecionada no servidor:

uv sync --locked --extra remote --extra core_scripts --extra feetech
# Add the policy extra on the server when required, for example --extra pi.

O intervalo de versões do Zenoh suportado é >=1.9.0,<1.11.0; uv sync --locked instala a versão do lockfile, atualmente 1.10.1.

2. Configure e inicie o servidor

Copie a configuração genérica e, em seguida, edite-a:

cp examples/remote_inference/server.yaml server.yaml

Defina model.repo_or_path e model.device. Para um checkpoint do Hub, fixe model.revision no commit que você pretende validar. Alinhe features, action_feature, semantics, robot_type e execution.action_fps ao seu ambiente de trabalho; veja os exemplos de esquema e renomeação de câmeras abaixo.

uv run --no-sync lerobot-policy-server --config_path=server.yaml

O servidor carrega o checkpoint, valida suas declarações, executa o warmup e, em seguida, registra Policy server ready: deployment=<name> instance=<id>; awaiting one client. Cada campo YAML aceita uma substituição aninhada via CLI:

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --model.device=cuda \
  --execution.idle_timeout_s=10

3. Inicie o cliente do robô

Em outro terminal, adapte os argumentos de hardware para a mesma configuração:

uv run --no-sync lerobot-rollout \
  --inference.type=remote \
  --inference.endpoint=tcp/127.0.0.1:7447 \
  --inference.deployment=manipulation \
  --inference.mode=chunk \
  --inference.chunk_merge=aligned \
  --inference.semantics=so101-degrees-gripper-percent-v1 \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.use_degrees=true \
  --robot.cameras='{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}' \
  --fps=30 \
  --task="pick up the cube" \
  --interactive=true

Após a admissão, digite /start. /stop encerra a execução; consulte o que o robô faz enquanto espera ou para. Mantenha as opções de teleoperação e gravação do seu rollout de trabalho. Não passe --policy.path, substituições locais de modelo-dispositivo ou flags de compilação para o cliente remoto.

deployment seleciona o servidor e semantics nomeia as unidades de ação validadas e a ordem; ambos devem corresponder à configuração do servidor. O exemplo usa graus das articulações do corpo e uma faixa calibrada de pinça de 0 a 100.

Use a trusted LAN instead of localhost

Vincule o servidor à sua interface de LAN, substituindo o endereço de exemplo pelo IP real:

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --zenoh.listen_endpoints='[tcp/172.18.133.214:7447]'

No cliente, use o mesmo endereço: --inference.endpoint=tcp/172.18.133.214:7447. Ambos os hosts devem ser capazes de acessar esse endpoint.

Vincular uma interface específica limita a exposição, mas não autentica os pares. Use conexões de roteador autenticadas fora de uma rede de laboratório confiável.

Escolha como continuar o movimento

Quando um novo chunk chega, a observação a partir da qual ele foi calculado já está um pouco desatualizada, e o robô já se moveu. O modo de mesclagem decide o que fazer a respeito disso: reproduzir o novo chunk após o antigo, descartar os passos que o robô já percorreu, ou suavizar a junção.

EscolhaConfigurações do clientePonto de partida útil
Adicionarmode=chunk, chunk_merge=appendPreserve o slice de execução aceito completo; útil como linha de base, mas o próximo chunk pode começar a partir de uma observação mais antiga.
Alinhamentomode=chunk, chunk_merge=aligned (o padrão auto)Remova as etapas de entrada já passadas e substitua apenas as futuras, reduzindo os impactos retroativos entre blocos independentes.
Alinhamento + mesclagemAlinhamento mais blend_steps > 0 e componentes explícitosSobreposição suave dos alvos antigos/novos após a cadência e o progresso da tarefa estarem funcionando.
RTCmode=rtc_guided ou rtc_trainedUse quando o checkpoint suporta RTC: a própria inferência é condicionada à trajetória restante.

As configurações desta tabela usam o prefixo --inference.. Chunks simples têm alinhamento como padrão, com blending desativado. Um alvo que já está sendo interpolado é confirmado e não pode ser substituído.

Alignment descarta os passos recebidos que já foram confirmados. Blending calcula a média dos alvos futuros sobrepostos. Interpolation adiciona comandos motores intermediários entre os pontos finais. RTC altera a forma como a previsão é gerada. Nenhum deles garante movimento suave ou uma pegada bem-sucedida.

Add a short blend to the example

O blending é configurado inteiramente no cliente; o servidor não requer configurações de blending nem reinicialização. Selecione as coordenadas contínuas dos braços a partir dos nomes de ações do deployment:

--inference.chunk_merge=aligned \
--inference.blend_steps=5 \
--inference.blend_weight=0.5 \
--inference.blend_components='[shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos]'

Estas são configurações de comparação, não uma recomendação ajustada. Exclua o garra e outros controles discretos ou sensíveis a contato, a menos que validados. Componentes não selecionados usam o alvo de entrada.

O blending calcula q_t + b_w * (i_t - q_t): q_t é o alvo enfileirado, i_t é o alvo recebido para o mesmo slot futuro e b_w é a fração recebida (blend_weight). Um peso de 1 resulta em substituição. A sobreposição real limita a janela de blending; dez passos configurados não podem criar dez passos sobrepostos. Substituições repetidas podem fazer o blending de um alvo não confirmado mais de uma vez, retendo a influência mais antiga e sua idade original. O blending nunca atualiza dados expirados.

Serve guided RTC on a compatible checkpoint

Mantenha o esquema validado e configure o servidor:

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --execution.supported_modes='[rtc_guided]' \
  --execution.rtc.enabled=true \
  --execution.rtc.mode=guided \
  --execution.rtc.execution_horizon=15

No conjunto de clientes, defina --inference.mode=rtc_guided. O RTC usa seu próprio tratamento de continuação, não alinhamento ou mesclagem de blocos simples. Remeda o tempo de resposta, pois a orientação adiciona trabalho. O horizonte de 15 passos é um exemplo, não um valor ajustado.

O RTC treinado requer um checkpoint treinado para condicionamento de prefixo de ação e configurações de atraso/horizonte compatíveis; consulte configuração do RTC. A solicitação de um modo não suportado falha antes do movimento.

Parâmetros que importam

As opções de cliente abaixo usam o prefixo --inference., a menos que indicado o contrário. Os valores padrão são valores iniciais, não garantias para um robô específico.

ParâmetroPadrão / unidadeEfeito e compensação
refill_seconds0.5 segundos de reprodução restanteValores mais altos geralmente solicitam com mais antecedência; valores mais baixos permitem que mais do plano seja executado. Um limite de latência medido pode sobrescrevê-lo.
blend_steps0 etapas de políticaZero desativa a mistura. Janelas maiores misturam mais alvos futuros sobrepostos.
blend_weight0.5 fração de entradaLower retém mais do alvo antigo: potencialmente mudanças mais suaves, mas correção mais lenta.
blend_components[]Subconjunto explícito das coordenadas permitidas pelo servidor; obrigatório quando o blending está habilitado.
max_observation_age_s5.0 segundosIdade máxima da fonte original por meio da execução, incluindo contribuintes de mesclagem mais antigos. Deve cobrir inferência e reprodução.
action_starvation_grace_s1.0 segundosEspera limitada após o fim da reprodução; 0 falha imediatamente. Não substitui outros prazos.
--fpsCorresponda o action_fps do servidorFrequência de ação da política. Para N ações, a reprodução nominal é de N / fps segundos.
--interpolation_multiplier1Mais comandos motores intermediários; não estende a reprodução nem adiciona decisões de política.

O refill efetivo é max(refill_seconds, recent maximum turnaround + 1 / fps). O turnaround inclui codificação, rede, fila, inferência e decodificação. A primeira solicitação aceita fornece uma estimativa inicial; as estimativas posteriores usam até 100 amostras em estado estacionário.

Refill, portanto, não é um período de solicitação fixo nem um número garantido de ações executadas. Inspecione o refill configurado e efetivo nos logs. Um limiar que cubra todo o horizonte de execução causa substituições muito frequentes.

Operation deadlines and server ownership

Todos os valores estão em segundos.

Parâmetro do clientePadrãoLimites
handshake_timeout_s10Descoberta/admissão; orçamento base para trocas de controle
startup_timeout_s10Nova ação de inicialização após o reconhecimento de reset/invalidação
action_timeout_s5Uma solicitação de ação pendente
language_timeout_s60Uma solicitação de texto

O servidor também possui execution.action_deadline_s=5 e language.deadline_s=60. Os limites do cliente e do servidor se aplicam simultaneamente; alterar um deles não afrouxa o outro. As trocas de controle de reset/invalidação também permitem o orçamento de trabalho do servidor anunciado, pois precisam aguardar atrás de uma chamada de modelo em execução.

O servidor execution.idle_timeout_s=10 controla a limpeza após ausência observada do cliente, não a tolerância para falta de ação. A limpeza espera atrás do trabalho do modelo em execução; uma chamada travada não pode ser assumida. Um cliente pausado e conectado mantém sua sessão.

O que o robô faz enquanto espera ou para

Durante uma espera suportada, o cliente atualiza o último alvo efetivamente aplicado pelo driver, incluindo interpolação, clipping e o garra. Antes do primeiro comando, uma pose medida o inicializa. Isso interrompe o avanço da trajetória; o robô ainda pode se estabilizar em direção a esse alvo. Isso não desliga o torque nem garante imobilidade. O RTC local usa a mesma espera limitada em robôs suportados e falha imediatamente em outros casos.

SituaçãoComportamento esperado
Inferência inicialAguarde localmente até que ações utilizáveis cheguem, dentro do prazo de inicialização.
Ações esgotadasFinalize a interpolação comprometida e, em seguida, retenha o alvo até o limite da tolerância à inanição. Retome apenas a partir de uma nova observação e previsão.
/vqa ou consulta de autosteeringPausar antes da geração de texto; retomar com novas ações em seguida, se a execução permanecer ativa. Os limites de idioma se aplicam.
Alteração de instrução durante a inferênciaDescarte a previsão antiga, pause e obtenha novas ações para a nova instrução. As alterações entre as solicitações podem preservar o movimento aceito.
Gravação salva ou operador em pausaRetenha o alvo ou transfira o controle para a teleoperação. O trabalho de gravação bloqueante retoma com inferência nova quando apropriado.
Prazo, ação obsoleta, resposta malformada ou expiração da tolerância de inaniçãoFalha no terminal: revogar a moção de política e seguir o desligamento configurado.
/stop ou Ctrl+C normalEncerrar a ação da política e respeitar o comportamento de retorno/desconexão configurado.

A recuperação de inanição descarta uma previsão antiga em andamento e obtém uma previsão nova a partir de uma captura realizada após o início da espera. Resultados antigos não podem reiniciar o movimento. Pacotes e resultados inutilizáveis não renovam a tolerância. Esperas frequentes indicam cobertura insuficiente de reprodução ou latência.

A perda do servidor ou da conexão não é recuperada automaticamente. Ações em buffer válidas podem ser esgotadas, seguidas de espera até que o prazo de tolerância ou outro prazo limite expire. Uma vez que a presença do servidor seja observada como perdida, aquela sessão não pode ser retomada quando a conectividade retornar; reinicie o rollout para uma nova sessão. Durante o trabalho com texto, a perda do servidor observada falha a consulta.

Com a aquisição de observações e o controle dos atuadores funcionando corretamente, o encerramento do terminal respeita --return_to_initial_position=true (o padrão) e, em seguida, desconecta. O retorno lê uma observação completa, portanto, uma falha persistente na câmera pode impedi-lo. Uma ação falha ou a aplicação de um bloqueio suprimem movimentos adicionais. Definir a opção como false ignora o retorno, mas não a desconexão. A desconexão pode liberar o torque de acordo com a configuração do robô. Falhas no terminal encerram com um status não nulo após a limpeza; um processo encerrado à força não pode garantir a limpeza.

Ajuste uma tarefa funcional

Comece perto da referência síncrona: execute uma parte substancial de cada previsão, mas solicite com antecedência suficiente para ocultar a latência de inferência. Em seguida, avalie se um replanejamento mais frequente ajuda.

  1. Use alinhamento sem blending primeiro. Mantenha FPS, interpolação e configuração fixos. Inspecione o horizonte de execução, o tempo total de processamento e as solicitações lentas.
  2. Escolha a cobertura de reposição com margem. Deixe reprodução suficiente para outra solicitação e variação de latência, sem substituir continuamente o plano.
  3. Adicione um blend curto nessa cadência. Compare a conclusão da tarefa, a pegada/soltura e os choques separadamente. Uma média suave de planos incompatíveis pode perder o objeto.
  4. Solicite antecipadamente apenas por benefício. Aumentar a reposição pode melhorar a responsividade, mas interromper o progresso útil. Retorne ao ritmo estável se o desempenho da tarefa piorar.
  5. Altere uma configuração por vez. Aumentar timeouts ou grace não fornece as ações ausentes. Reduzir refill não é uma cura universal para o esgotamento.

Para um horizonte de execução de 0.8 s e alinhamento bem-sucedido constante, o espaçamento entre solicitações é aproximadamente 0.8 - effective_refill:

Reabastecimento eficazEspaçamento aproximadoO que observar
0.2 s0.6 sMais acompanhamento, menos proteção contra solicitações lentas
0.4 s0.4 sSubstituição mais precoce, mais oportunidades de correção
0.6 s0.2 sAlterações frequentes; verifique o progresso da tarefa

Isso exclui os efeitos de inicialização, retenção, saturação e tique de controle. Uma solicitação que começa com 0.2 s restantes e leva 0.1 s deixa apenas 0.1 s para a mistura, três passos a 30 Hz. Portanto, uma cadência quase síncrona pode exigir apenas uma mistura curta.

Para alinhamento e RTC, verifique o tempo de reprodução utilizável após o corte, e não o comprimento nominal do chunk. Se a inferência leva 1 segundo de uma previsão de 1,67 segundos, restam apenas cerca de 0,67 segundos. Uma solicitação de mais 1 segundo não cabe; nenhum valor de refill resolve isso. Reduza o tempo de resposta, use um horizonte suportado mais longo ou valide uma frequência de ação diferente.

A idade da fonte inclui a execução. Para append, permita aproximadamente execution horizon + effective refill mais uma margem de captura/inferência. Um bloco de 100 passos a 30 Hz já abrange 3,33 segundos. O alinhamento geralmente reduz a idade, mas o blending repetido pode reter contribuidores mais antigos.

Leia os logs e diagnostique uma execução

Os logs de INFO exibem as configurações de admissão e efetivas, os resultados das solicitações de texto, as transições de espera/desligamento e um resumo de atividade a cada cinco segundos. Leia o tempo de resposta e a reprodução enfileirada juntos. Para detalhes, use o servidor com --log_level=DEBUG e o cliente com --inference.log_level=DEBUG. Sessões interativas silenciam os logs do cliente abaixo de ERROR; use uma execução não interativa ao coletar logs de tempo em tempo real.

Ao salvar os logs, use 2>&1 | tee -i server.log (ou client.log). O -i mantém o tee ativo quando o Ctrl+C atinge todo o pipeline, de modo que ele também capture as mensagens de encerramento gracioso.

ObservaçãoPróxima verificação útil
Append causa picos reversosCompare o alinhamento na mesma configuração; o próximo bloco completo pode começar a partir de uma observação mais antiga.
O alinhamento é suave, mas o sucesso da tarefa diminuiReduza o reabastecimento dentro da margem de latência para diminuir a frequência de substituição. Ajuste a cadência antes da mistura.
A mistura parece indecisaReduza sua janela ou aumente o peso de entrada; compare sem mesclagem no ritmo de trabalho.
Espera repetida / esgotamento de açõesVerifique o tempo de resposta lento, solicitações perdidas/paradas e a reprodução após o corte. Aumente a folga apenas se o horizonte permitir.
Alterações de reabastecimento não fazem nadaO piso de latência medido pode predominar; inspecione o refill efetivo.
Falha de fonte obsoletaInspecione a idade, o horizonte e a mistura da fonte mais antiga. Novas respostas não atualizam os contribuidores antigos.
BUSY após a reinicialização de um clienteAguarde a limpeza de clientes ausentes e o trabalho em execução. Reconexões rejeitadas não renovam a tolerância de propriedade.
Incompatibilidade de contratoCompare schemas, modos e metadados de software de inicialização; reinicie ou atualize o processo incompatível.

DEBUG inclui a reprodução de cada solicitação no momento do envio, a idade da observação e o progresso do cursor, além das etapas aparadas/usáveis e a sobreposição por resultado. Esses dados descrevem o progresso comandado, não a execução física medida.

Configuração e rede

Mantenha um único YAML de deployment para checkpoint, esquema do robô e configurações do servidor; use sobrescritas aninhadas da CLI para experimentos. Dê nomes de deployment diferentes para experimentos independentes. Ambos os processos registram suas versões de pacote e de protocolo; a admissão verifica o protocolo e os contratos de execução/dados, sem exigir versões de pacote idênticas.

Schema, camera names and checkpoint requirements

O server.yaml mantido inclui todos os campos obrigatórios. features e action_feature declaram forma, dtype e semântica; os vetores de estado/ação também declaram a ordem dos componentes. As imagens usam uint8 RGB, altura × largura × 3. Por exemplo:

features:
  - name: observation.state
    shape: [6]
    dtype: float32
    names:
      [
        shoulder_pan.pos,
        shoulder_lift.pos,
        elbow_flex.pos,
        wrist_flex.pos,
        wrist_roll.pos,
        gripper.pos,
      ]
    semantics: so101-degrees-gripper-percent-v1
  - name: observation.images.front
    shape: [480, 640, 3]
    dtype: uint8
    kind: rgb
    semantics: rgb-front-table-v1

Use os nomes voltados para o checkpoint. Para mapear uma câmera de robô chamada scene para a visão front do checkpoint, defina --rename_map='{"observation.images.scene":"observation.images.front"}' no cliente. A renomeação não pode alterar a visão, a resolução ou a calibração. Câmeras adicionais podem permanecer disponíveis para gravação sem serem enviadas ao servidor.

As políticas suportadas utilizam processadores salvos e a predição direta de chunks a partir de uma observação atual. Políticas dependentes de histórico, saídas de controladores latentes e preparações disponíveis apenas por meio de select_action() exigem integração adicional. O sucesso da inferência síncrona ou do warmup, por si só, não comprova a qualidade da tarefa remota nem o suporte a linguagem/RTC.

Para um checkpoint somente de chunk suportado, o servidor --execution.n_action_steps=30 encurta sua fatia de execução sem editar o checkpoint. Ele não pode exceder o horizonte de previsão e é rejeitado para implantações RTC. O parâmetro opcional do cliente --inference.expected_artifact=... fixa o conteúdo do modelo/processor e as configurações efetivas de inferência; apenas um nome de implantação não é uma identidade de checkpoint.

Independent deployments, bandwidth and connection loss

Pareie o servidor --deployment=arm-a com o cliente --inference.deployment=arm-a. Os nomes devem ser segmentos únicos alfanuméricos/sublinhado/ponto/hífen. Cada processo de servidor ainda atende a um cliente ativo. Se várias instâncias anunciarem o mesmo nome, selecione --inference.instance=... ou use nomes distintos; a descoberta não escolhe arbitrariamente.

O tráfego é delimitado sob lerobot/inference/v1/deployments/{deployment}, em seguida, por instância de servidor e sessão. Query/reply lida com descoberta, admissão e controle; pub/sub transporta dados de inferência; liveliness rastreia presença. Endpoints explícitos desabilitam a descoberta por multicast/gossip. Identidades de sequência/geração e temporização local do cliente governam o movimento; relógios de host sincronizados não são necessários.

O RGB bruto é sem perdas e é o padrão. Tente --inference.encoding=jpeg --inference.jpeg_quality=90 para reduzir a largura de banda das imagens e, em seguida, compare o tempo de resposta e a qualidade da tarefa. A qualidade varia de 1 a 100; tensores arbitrários nunca são codificados em JPEG.

Liveliness pode detectar uma conexão quebrada apenas após o expirar do lease de transporte. Um arquivo Zenoh JSON5 fornecido por meio do parâmetro --inference.zenoh_config_path do cliente ou do parâmetro --zenoh.config_file do servidor pode ajustar transport/link/tx/lease. Isso não altera os prazos de ação, a tolerância à inanição ou a limpeza de propriedade de clientes ausentes. A congestão de observação descarta dados em vez de bloquear o despacho do motor.

A presence restored do servidor cancela a limpeza de propriedade; ela não pode reativar um cliente que já apresentou falha. Uma falha no reset de política torna o deployment indisponível, mesmo que seu processo permaneça ativo; resolva a falha e reinicie-o.

Private connections through an authenticated router

Um roteador oferece um ponto de encontro acessível para processos de robô e GPU, incluindo múltiplos experimentos separados. Ele adiciona latência e um ponto de falha; não fornece travessia automática de firewall, agendamento de modelos ou recuperação de movimento. TCP puro e IDs de sessão não autenticam os pares.

Use as configurações do Zenoh mantidas: router.json5, server.json5 e robot.json5. Elas utilizam TLS, verificação mútua de certificados, descoberta desabilitada e ACLs baseadas em papéis. Provisione uma CA privada e certificados separados para router/server/robot nos caminhos configurados. Cada processo precisa apenas da sua própria chave privada e do certificado da CA; mantenha a chave da CA em outro local. Para uma implantação em LAN, substitua localhost consistentemente pelo nome do host do router e emita um certificado que cubra esse nome.

zenohd --config examples/remote_inference/zenoh/router.json5

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --zenoh.mode=client \
  --zenoh.listen_endpoints='[]' \
  --zenoh.connect_endpoints='[tls/localhost:7447]' \
  --zenoh.config_file=examples/remote_inference/zenoh/server.json5

Adicione ao comando de rollout normal:

--inference.endpoint=tls/localhost:7447 \
--inference.zenoh_mode=client \
--inference.zenoh_config_path=examples/remote_inference/zenoh/robot.json5

Altere os caminhos de implantação da ACL junto com o nome da implantação. Todos os participantes usam o modo cliente sem links diretos entre pares. O exemplo separa os papéis de robô e servidor, mas compartilhar certificados de papel compartilha as permissões; use identidades autorizadas separadas para diferentes grupos de confiança. As ACLs do roteador não podem defender um processo de robô comprometido nem governar seu tráfego local interno. Consulte a documentação de TLS e ACL do Zenoh.

O binário zenohd e o binding em Python devem ser versões compatíveis. Para verificar um roteador instalado em relação ao binding instalado, incluindo a aplicação de TLS e ACL:

LEROBOT_ZENOHD=/absolute/path/to/zenohd \
  uv run --no-sync pytest tests/remote_inference/test_zenoh.py -q -rs

As verificações também exigem openssl; pré-requisitos indisponíveis são reportados como pulos. Operar um robô através de um roteador, um GPU hospedado privado ou um Hugging Face Space ainda não foi validado. Meça o tempo total de resposta e o comportamento de interrupção antes de operar um robô através de uma nova topologia; um transporte funcional por si só não estabelece um orçamento de movimento utilizável.

Idioma e gravação

Use /vqa, /subtask e /autosteer por meio de interactive rollout. Ative language.enabled=true no servidor apenas em um checkpoint que implemente geração de texto; o autosteering exige, adicionalmente, um checkpoint treinado para geração de subtasks com prompting compatível de goal/subtask. O servidor expõe esses comandos quando o checkpoint declara a capacidade; se as respostas e subtasks são úteis depende do checkpoint.

O trabalho de texto pausa o movimento e descarta a continuação em buffer. O VQA mantém sua instrução e retoma com uma nova previsão, de modo que o robô pode perder o progresso da tarefa ao replanejar, mesmo após uma resposta bem-sucedida. Manter o movimento em buffer em execução durante uma consulta VQA informativa está planejado; veja trabalhos futuros.

A gravação usa o formato local padrão de dataset. Os rótulos de tarefa seguem a ação despachada. Os diagnósticos permanecem nos logs da aplicação; eles não são gravados no dataset nem enviados. Com um dataset, use --dataset.single_task para a instrução inicial; caso contrário, use --task. Prefira um para evitar configurações conflitantes.

Use-o a partir do Python

Os motores e a configuração compartilhados estão em lerobot.inference; o cliente remoto, o motor e o servidor estão em lerobot.remote_inference. Um loop de controle fora do lerobot-rollout conecta e aceita um cliente, o envolve em um motor, publica as capturas e despacha cada tick do motor através de dispatch_tick, que aplica o mesmo contrato de permissão, retenção e confirmação que a CLI:

import time

import numpy as np

from lerobot.inference import RemoteInferenceConfig, dispatch_tick
from lerobot.remote_inference import RemoteClient, RemoteInferenceEngine
from lerobot.utils.action_interpolator import ActionInterpolator

config = RemoteInferenceConfig(
    endpoint="tcp/127.0.0.1:7447",
    deployment="manipulation",
    semantics="so101-degrees-gripper-percent-v1",
)
client = RemoteClient.connect(config)
caps = client.capabilities
client.admit(
    features=caps.features,
    action_feature=caps.action_feature,
    semantics=config.semantics,
    action_interval=caps.action_interval,
    mode=config.mode,
)
engine = RemoteInferenceEngine(client, config, task="pick up the cube")
interpolator = ActionInterpolator(multiplier=1)

engine.start()
engine.resume()
try:
    while running():
        captured = time.monotonic()
        engine.submit_observation(
            {"observation.state": state_vector(), "observation.images.front": front_rgb()},
            capture_time=captured,
        )
        # send() receives a torch tensor in the deployment's action order; hold() refreshes
        # the last applied target. Returns None when the tick was held or starved.
        dispatch_tick(engine, interpolator, send=robot_send, hold=robot_hold)
finally:
    engine.stop()  # revokes motion and closes the client

As observações são indexadas pelos nomes de recursos voltados para o checkpoint e devem corresponder ao esquema do servidor: vetores float32 na ordem dos componentes declarada, imagens RGB uint8 do tamanho declarado. tests/remote_inference/test_library_client.py executa esse caminho contra um servidor loopback e é a referência para a sequência de chamadas. lerobot-rollout adiciona conversão do driver, verificações de posição fixa, comandos interativos e gravação por cima disso; lerobot-policy-server é o ponto de entrada de serviço e é configurado apenas por meio de suas substituições YAML e CLI.

Migrating from lerobot[async]

O extra lerobot[async] descontinuado e os comandos lerobot.async_inference foram substituídos por lerobot[remote], lerobot-policy-server e lerobot-rollout --inference.type=remote. Os antigos limites de chunk-size e pesos de agregação não são intercambiáveis com refill, alignment e blending; reajuste a partir dos parâmetros acima.

A localização de importação antiga lerobot.rollout.inference foi removida em favor de lerobot.inference e lerobot.remote_inference. Não há opção hold_mode: a execução remota requer a declaração de manutenção de posição do driver, que o rollout verifica automaticamente.

Para o Unitree G1 com SONIC, siga a receita remota do G1 em vez de adaptar os comandos antigos; os controladores de locomoção do G1 continuam sem suporte.

Para a arquitetura, os contratos de execução e as extensões planejadas, consulte a referência de design de engenharia.

Update on GitHub