LeRobot documentation

Inferência Remota

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
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