Um braço robótico SO-100 de baixo custo sobre uma mesa, configurado para teleoperação e treinamento de política
DAggerSO-100Aprendizado por ImitaçãoVLATeleoperação

Executando um Loop de DAgger em um SO-100 com uma Política VLA

AY-Robots ResearchAugust 27, 202615 min de leitura

Um relato passo a passo de uma rodada de DAgger com controle humano em um braço SO-100: execute a política e grave-a, assuma o controle quando der errado, arquive a execução como uma correção, componha um conjunto de dados misto e continue o treinamento a partir de um ponto de controle. Inclui o caminho de takeover por teclado e sliders para pessoas sem um braço líder, e os quatro erros que tornam uma rodada inútil.

Sua política é executada. Ela alcança o cubo, fecha o grifo um centímetro muito cedo e continua como se o tivesse. Nada gera erro, e nenhuma quantidade de observação da perda de treinamento explica. A solução não é outros 20 000 passos de gradiente nas mesmas demonstrações. É colocar sua mão de volta no braço exatamente onde erra, gravar o que você fez em vez disso, e treinar o próximo ponto de controle nos dados antigos mais essa correção. Essa é uma rodada de DAgger, e é assim que uma é executada em um SO-100 com uma política de visão-linguagem-ação.

A teoria está em outro lugar: por que a agregação de conjunto de dados funciona e o que o controle humano muda. Este é o manual de operação, e assume um ponto de controle treinado, um conjunto de câmeras funcionando e um braço que se move. Os seis passos abaixo são o loop conforme implementado em a página DAgger desta plataforma, mas a sequência é a mesma a partir de seus próprios scripts.

Uma rodada em resumo

  • Execute a política treinada e grave-a, com o texto da tarefa da execução em vez de um rótulo de teleoperação genérico.
  • Assuma o controle no momento em que o comportamento erra: uma transferência de espelho com um braço líder, imediata e manual por teclado ou sliders sem um.
  • Analise cada execução: arquive-a como uma correção, mantenha-a como um episódio de avaliação ou descarte-a.
  • Componha a mistura manualmente - demonstrações originais mais correções, episódios escolhidos por fonte. Nunca treine apenas em correções.
  • Continue o treinamento a partir do último ponto de controle e anote qual ponto de controle produziu qual mistura.
  • O número que diz se a rodada valeu a pena é a taxa de intervenção, não a perda de treinamento.

Por que a segunda rodada não é apenas mais dados

O aprendizado por imitação treina nos estados que um humano visitou. No tempo de teste, a política visita os estados que causa, e pequenos erros de ação se acumulam em estados que nenhuma demonstração cobriu. Ross, Gordon e Bagnell formalizaram essa falha para AISTATS 2011 e responderam com um algoritmo iterativo que treina uma política determinística estacionária e, sob sua redução, deve executar bem sob a distribuição de estado que induz: execute a política atual, faça um especialista rotular os estados que realmente alcançou, adicione-os ao conjunto de dados, retreine, repita. Kelly et al. tornaram a consulta prática com HG-DAgger, onde o humano decide quando assumir o controle em vez de rotular estados sem manter os controles; eles relatam desempenho melhorado sobre DAgger e aprendizado por imitação em uma tarefa de direção autônoma simulada e real. O controle humano é o que torna o loop tolerável em um braço de mesa - você só move as mãos quando algo está errado.

Duas consequências importam mais na prática do que a teoria. Correções não são demonstrações ordinárias: concentram-se nas regiões de gargalo que Mandlekar et al. descrevem, onde um pequeno desvio coloca a política em estados que nenhuma demonstração cobriu. E um conjunto de dados feito apenas dessas partes difíceis é um conjunto de dados mal formado - Belkhale, Cui e Sadigh argumentam do lado dos dados que a diversidade de estado nem sempre é benéfica, e que divergência de ação e diversidade de transição juntas decidem a qualidade do conjunto de dados. O conjunto de dados misto não é um compromisso, é o ponto.

Congele estes antes da rodada um

Uma rodada de DAgger compara uma política contra si mesma ao longo do tempo. Qualquer coisa que você mude entre rodadas que não seja o conjunto de dados torna essa comparação sem sentido.

  • Posições e montes de câmera, incluindo câmera de pulso. Solte um clipe e você mudou a distribuição de observação, não a política.
  • Exposição e balanço de branco, se sua pilha de captura deixar você fixá-los. A exposição automática variando entre rodadas é uma mudança de domínio lenta e invisível.
  • Calibração do braço e posições zero do servo. Se você deve recalibrar, trate tudo gravado antes disso como um conjunto de dados separado.
  • O texto da tarefa. Cada VLA aqui se condiciona a isso; reformular no meio do loop é uma tarefa diferente.
  • Iluminação, superfície da mesa, conjunto de objetos. Um novo objeto é um novo experimento, não a próxima rodada.
  • A taxa de fotogramas de gravação. Comparar taxas de intervenção em duas grades de amostragem produz diferenças que vêm da grade.
A câmera de pulso não é mobiliário opcional

Hsu et al. compararam uma visão centrada na mão contra a visão usual em terceira pessoa e descobriram que a perspectiva do olho em mão melhorou consistentemente a eficiência de treinamento e generalização fora da distribuição, apesar de ver menos da cena. Em um braço de cinco articulações, o tempo do grifo é geralmente o que suas correções estão consertando, e o tempo do grifo é o que a visão do pulso carrega.

A rodada, de ponta a ponta

  1. 1
    Execute a inferência e grave-a

    Inicie a execução contra o ponto de controle que você deseja melhorar e inicie a gravação na raiz de inferência. Gravado dessa forma, herda o texto de tarefa próprio da execução, que é o que a política foi treinada, em vez do rótulo de teleoperação padrão. Sem a gravação você pode observar a falha, mas não treinar com ela.

    bash
    # two calls, not one: the run, then its recording
    POST /inference/start      # model_id, and hf_repo_id = the checkpoint to drive
    POST /recording/start      # root=inference
    # root=inference also makes the recording inherit the run's task text
  2. 2
    Assuma o controle quando der errado

    Pressione Assumir o controle e escolha o modo de entrada: braço líder, teclado ou sliders. O executor pausa, você corrige, você devolve. Os fotogramas gravados enquanto você estava dirigindo são marcados como intervenções automaticamente.

    bash
    POST /inference/takeover/start   # input = leader | keyboard | sliders
    POST /inference/takeover/nudge   # keyboard, relative delta per call
    POST /inference/takeover/set     # sliders, absolute target
    POST /inference/takeover/stop    # back to the policy
  3. 3
    Analise os episódios

    Decida por episódio: arquive como correção, mantenha como avaliação ou descarte. Uma execução que a política completou sem ajuda é dados de avaliação.

  4. 4
    Sincronize o conjunto de dados de correção

    As correções se acumulam em um conjunto de dados local por política e vão para armazenamento em nuvem através da sincronização automática. Nada é misturado naquilo que você não colocou.

  5. 5
    Componha o conjunto de dados misto

    Combine o conjunto de dados original com o conjunto de dados de correção, escolhendo episódios explicitamente por fonte. O resultado é um conjunto de dados comum desse ponto em diante.

    bash
    POST /training/datasets/compose
      sources  = [ original_dataset, korrekturen_<policy> ]
      episodes = explicit selection per source
  6. 6
    Continue o treinamento a partir do ponto de controle

    Treine a mistura a partir do ponto de controle anterior em vez do modelo base. Anote qual ponto de controle e qual mistura; sem esse par a rodada não é reproduzível.

    bash
    # field on the training job
    base_checkpoint = s3://ay-robots/checkpoints/<run>/<checkpoint>
    # the platform passes it to the training pod as BASE_CKPT_S3

Passo 2 em detalhe: os dois modos de assumir o controle

Com um braço líder

Em modo líder-seguidor a transferência é uma transferência entre dois braços que não estão na mesma postura. Pressionar Assumir o controle pausa o executor e coloca o líder na postura atual do seguidor, para que nada pule quando o torque é transferido. Se essa unidade de alinhamento expirar, você alinha o líder manualmente e só libera quando os dois estão a cinco graus de distância. De lá você teleópera normalmente e a coluna de ação registra o que você comandou.

Seja honesto sobre este caminho: a unidade de alinhamento e a transferência de torque são a parte menos testada do loop no hardware real. Teste a transferência em uma postura lenta e inofensiva antes de confiar nela em uma execução que você se importa. Um braço líder produz as correções mais suaves dos três modos, e também tem o máximo que pode dar errado mecanicamente.

Sem um braço líder: teclado e sliders

A maioria das pessoas lendo isto possui um braço. Isso é o suficiente. Escolha entrada por teclado ou slider no momento em que pressionar Assumir o controle, e a transferência é imediata e manual - não há segundo braço para alinhar, então não há etapa de alinhamento. O seguidor mantém sua postura e aguarda entrada.

Modo de entradaComo o braço se moveLimite por chamada executado pelo servidorBloqueado quando
Braço líderO espelho conduz o seguidor a partir dos ângulos articulares do líderSem chamadas de nudge ou set neste modo; o espelho escreve metas de seguidor continuamenteNunca bloqueado, e o padrão se nenhum modo de entrada for fornecido - mas precisa de um segundo braço; sem uma id de líder a transferência é recusada
TecladoNudge relativo por pressionamento de tecla, enviado para o ponto de extremidade de nudge de transferênciaLimite rígido de 2 graus por articulação, 4 graus para o grifoRejeitado com 409 se a transferência foi iniciada em modo de líder
SlidersPostura alvo absoluta, enviada para o ponto de extremidade de set de transferênciaNo máximo 6 graus de deslocamento em direção ao alvo por chamada; a interface continua enviando cerca de dez vezes por segundoRejeitado com 409 se a transferência foi iniciada em modo de líder

Os limites são executados no lado do servidor, não na interface, porque um delta digitado incorretamente em um braço com servo de barramento é uma colisão. As correções de teclado saem de forma escalonada e um pouco grosseiras; as correções do slider são mais suaves, porque o servidor caminha em direção ao alvo enquanto a interface continua transmitindo. De qualquer forma, a coluna de ação recebe o vetor de postura comandado completo e a marcação de intervenção é idêntica ao caminho do líder, para que as correções de teclado caiam no mesmo conjunto de dados sem uma diferença de formato.

text
Q / A   joint 1      R / F   joint 4
W / S   joint 2      T / G   joint 5
E / D   joint 3      Z / X   gripper
O mesmo layout de tecla que em todos os outros lugares da pilha, então a memória muscular da gravação se transfere.
Guia de treinamento mostrando os passos ordenados de uma execução de ajuste fino GR00T em um conjunto de dados SO-100
O lado de treinamento de uma rodada é a mesma sequência guiada que uma primeira execução; apenas o campo de ponto de controle difere.

Quando pressionar o botão

Mais cedo do que mais tarde. Uma correção que começa depois que o grifo se fechou em nada ensina recuperação de uma falha que a política não deveria ter entrado, e dados de recuperação valem muito menos que dados de prevenção. Interrompa no primeiro momento em que você está confiante de que a trajetória está errada, corrija através da parte difícil, devolva assim que o estado for um que a política tratou antes. ThriftyDAgger automatiza essa decisão portalizando intervenções em novidade e risco estimado sob um orçamento humano fixo, mas em um único braço com um humano já observando, o portão humano é mais barato e melhor calibrado do que qualquer coisa que você sintonizará.

Viável com a pilha de código aberto e alguns scripts. O que custa é a escrituração, e a escrituração é onde as rodadas de DAgger morrem.

  1. Escreva fotogramas do seu próprio script de inferência em um conjunto de dados LeRobot, com a string de tarefa na qual a política foi treinada.
  2. Pause o loop de política, mude a fonte de comando e sinalize cada fotograma que você dirige como uma intervenção. Sem a sinalização, as correções parecem demonstrações ordinárias.
  3. Decida deliberadamente o que acontece aos fotogramas de transição entre a política liberando o controle e sua primeira entrada.
  4. Mantenha as correções em seu próprio conjunto de dados por política e acompanhe os índices de episódio manualmente para que a mistura possa ser reconstruída.
  5. Aponte o ponto de entrada de ajuste fino para o ponto de controle anterior e verifique no log que ele carregou esses pesos.

Passo 3 em detalhe: a triagem decide a qualidade

Após a execução você tem uma gravação com alguns fotogramas marcados como intervenções. Três destinos existem, e o errado envenena silenciosamente a próxima rodada.

  • Arquive como correção quando a intervenção foi uma correção genuína: a política estava indo para algum lugar errado e sua entrada mostrou a coisa certa de um estado que a própria política produziu.
  • Mantenha como avaliação para execuções autônomas limpas e para execuções nas quais você assumiu o controle por precaução. Episódios de avaliação são como você mede o próximo ponto de controle, e eles nunca devem ser treinados.
  • Descarte execuções arruinadas por algo não relacionado - um fotograma de câmera caiu, um servo parou, um objeto que você derrubou. Uma correção bagunçada é pior do que nenhuma correção.
Fotogramas congelados pertencem à gravação bruta, não aos dados de treinamento

Entre a política liberando o controle e sua primeira entrada, o braço fica parado enquanto o gravador continua escrevendo - uma série de posturas idênticas emparelhadas com imagens ligeiramente diferentes. Aqui esses fotogramas de transferência ficam na gravação bruta e fora do conjunto de dados de correção. Se você construir o loop você mesmo, corte-os deliberadamente: uma política treinada neles aprende a fazer uma pausa onde deveria agir.

Passo 5 em detalhe: compondo a mistura

A composição leva o conjunto de dados original mais o conjunto de dados de correção e produz um novo e comum conjunto de dados LeRobot que treina como qualquer outro. A propriedade importante é que a seleção de episódio é explícita por fonte - nada é mesclado automaticamente. Parece menor até a primeira vez que uma política se comporta estranhamente e você tem que reconstruir no que foi treinada.

A questão aberta é a proporção, e ninguém tem um número que se transfere. O que a literatura concorda é que as correções devem contar por mais do que sua fração de fotograma. Mandlekar et al. retreinam iterativamente nos dados que seu sistema de intervenção coleta, para que a política aprenda a percorrer os gargalos, e relatam que agentes treinados dessa forma superam agentes treinados em um número equivalente de amostras de demonstradores não-intervencionistas. Sirius vai mais longe e repondera amostras de treinamento por confiança humana aproximada, relatando um ganho de 8% em simulação e 27% em hardware real na taxa de sucesso da política contra os métodos com os quais compara, em duas vezes a velocidade de convergência. Nenhum dos pontos de entrada de treinamento aqui expõe um botão de reponderação de amostra, então o substituto bruto é manter cada episódio de correção enquanto subamostragem das demonstrações originais - e escrever o que você fez.

Visualização de gravação de conjunto de dados mostrando episódios de um conjunto de dados SO-100 com fluxos de câmera
Episódios de correção são episódios ordinárias com uma sinalização de intervenção por fotograma, então eles se compõem com o conjunto de dados original sem conversão.

Passo 6 em detalhe: o que continuar a partir de um ponto de controle realmente significa

Treinar a mistura a partir do modelo base funciona, mas joga fora a rodada anterior e custa uma execução completa. Continuar a partir do ponto de controle anterior é mais rápido e geralmente melhor. É também mais limitado do que a frase sugere.

Inicialização de peso não é um retorno do otimizador

Um ponto de controle apenas de pesos contém os parâmetros e nada mais. Carregá-lo dá à próxima execução um ponto de partida melhor do que o modelo base, mas momentos do otimizador, posição do cronograma de taxa de aprendizado e ordem de dados começam do zero. Espere um pico de perda no início da execução continuada, não o leia como uma falha, e não chame a rodada de retomada. É um início quente.

PolíticaTamanhoNível de GPUInferência por etapa de açãoFormato de conjunto de dadosEpisódios antes de valer a pena tentar
GR00T N1.7cerca de 3 B, aproximadamente 40 M treinado durante o ajuste finoA100 80 GB ou H100 80 GBcerca de 152 msLeRobot v2.0 ou v2.150
GR00T N1.5cerca de 3 BA100 80 GB ou H100 80 GBcerca de 165 msLeRobot v2.0 ou v2.150
Pi0.5cerca de 3 B em um backbone PaliGemmaA100 80 GB ou H100 80 GBcerca de 485 msLeRobot v3.050
SmolVLAcerca de 450 MRTX 4090 ou qualquer placa de 24 GBcerca de 245 msLeRobot v3.030
ACTcerca de 80 M, treinado do zeroRTX 4090 ou qualquer placa de 24 GBcerca de 20 msLeRobot v3.050

A latência se acumula dentro de um loop de DAgger de uma forma que não o faz durante uma demonstração: em cerca de 485 ms por etapa de ação você assume o controle porque o braço hesitou, não porque estava errado, e dados de correção de hesitação não valem muito para treinamento. Se você está iterando em dados em vez de perseguir uma taxa de sucesso final, itere em um modelo rápido. Shukor et al. descrevem SmolVLA como projetada para treinar em uma única GPU e implantar em GPUs de consumidor ou CPUs, com uma pilha de inferência assíncrona que desacopla a previsão de ação da execução para permitir taxas de controle mais altas - a propriedade que mantém um loop de transferência responsivo.

Os formatos de conjunto de dados não são intercambiáveis. GR00T leva LeRobot v2.0 ou v2.1, e o repositório Isaac-GR00T descreve sua entrada como um sabor do formato LeRobot v2 com um arquivo de descrição de modalidade adicionado; os treinadores mais novos aqui esperam v3.0. Uma mistura composta na versão errada falha no tempo de carregamento em vez de produzir uma política ruim - o modo de falha melhor, ainda um slot de fila perdido. O documentação do conjunto de dados lista qual formato cada treinador leva.

O loop, com a escrituração já feita

Transferência com um braço líder, teclado ou sliders; marcação de intervenção por fotograma; arquivamento de execuções como correções ou avaliações; composição de um conjunto de dados misto com uma seleção de episódio explícita por fonte; e continuação do treinamento a partir de um ponto de controle em vez do modelo base. O que permanece sua decisão é qual execução conta como uma correção, o que vai para a mistura e quando a taxa de intervenção parou de cair.

Veja como o loop de DAgger é conectado

Quatro maneiras de desperdiçar uma rodada

1. Treinando apenas nas correções

A falha mais comum e o atalho mais tentador. Um conjunto de dados apenas de correção é quase inteiramente o meio difícil da tarefa, com abordagem e recuo ausentes; a política fica melhor na parte difícil e esquece como chegar lá. Agregação não é um detalhe de implementação do método, é o mecanismo: os dados antigos são o que mantém o resto do comportamento no lugar enquanto as correções movem uma parte.

2. Movendo uma câmera entre rodadas

Uma câmera que se desloca dois centímetros entre rodadas produz uma política pior do que aquela com a qual começou, e um diagnóstico que custa um dia. Cada VLA aqui se condiciona em imagens; apenas o estado articular não desambigua onde o objeto está. Fotografe a configuração antes da primeira rodada e verifique essa fotografia antes de cada uma posterior.

3. Deixando artefatos de transferência no treinamento

Coberto acima, e na lista porque é invisível. O sintoma é uma política que fica inativa por uma fração de segundo exatamente onde o operador da rodada anterior assumiu o controle. Parece hesitação; é imitação.

4. Chamando um início quente de retomada

Se você acredita que o estado do otimizador se transferiu, o pico de perda inicial se lê como um bug e você vai procurando por dados corrompidos. Se você sabe que o otimizador começou do zero, o pico é esperado e você olha para o que vem depois. Mesmos números, conclusões opostas.

Medindo a rodada

A métrica para um loop com controle humano é a taxa de intervenção: fotogramas gravados enquanto você estava no controle, dividido por fotogramas totais da execução. Está no status de transferência, e é o único número que responde a pergunta que a rodada fez. A perda de treinamento cai se a política melhorou ou não; a taxa de sucesso é binária e barulhenta nos tamanhos de amostra que um braço de mesa produz. A taxa de intervenção é contínua, medida nos estados que a própria política causou, e cai conforme a política precisa menos de você.

Compare-a apenas em execuções gravadas sob condições idênticas. O argumento completo, e como construir um conjunto de avaliação que sobrevive a mais de duas rodadas, está em o artigo sobre medir um loop de DAgger. A rodada um é realisticamente um teste de viabilidade: você está verificando que a transferência funciona em seu hardware, que as correções chegam com suas sinalizações e que a execução continuada carregou o ponto de controle que você nomeou. As rodadas dois e três são onde a taxa deveria começar a se mover. Se não se moveu na rodada quatro, o problema está a montante de DAgger.

Escreva por rodadaPor que importa depois
Ponto de controle que foi conduzidoSem ele você não pode atribuir uma melhoria a uma mistura
Modo de entrada usado para a transferênciaAs correções de teclado são mais grosseiras do que as correções de líder, e mostra nos dados
Número de execuções e como cada uma foi analisadaSe a rodada teve correções suficientes para importar
Taxa de intervenção por execução, e a médiaA métrica de progresso do loop
Seleção exata de episódio por fonteA única forma de reproduzir ou desfazer uma rodada
Início quente ou treinamento frescoExplica a curva de perda que você olhará em uma semana

Se você não tiver um ponto de controle ainda

O loop não tem ponto de entrada sem um. Grave um primeiro conjunto de dados, treine uma primeira política, execute-a - gravação, treinamento e executar a política cobrem esse caminho. O cliente de gravação está em a página de download, níveis de GPU e taxas horárias em a página de preços, e como um episódio utilizável se parece em guia de coleta de dados SO-100. Acerte as demonstrações antes das correções: DAgger é um mecanismo de reparo, e funciona muito melhor em algo que já estava quase certo.

Posso executar um loop de DAgger sem um braço líder?

Sim. Escolha entrada por teclado ou slider quando pressionar Assumir o controle: a transferência é imediata e manual, sem segundo braço para alinhar. O teclado envia nudges relativos que o servidor fixa rígido em 2 graus por articulação e 4 para o grifo; os sliders enviam um alvo absoluto e o servidor se move no máximo 6 graus em direção a ele por chamada, enquanto a interface continua transmitindo. A coluna de ação e a marcação de intervenção são as mesmas que no modo de líder, portanto as correções são indistinguíveis no conjunto de dados.

Quantas correções uma rodada precisa?

Não há número universal defensável, e a contagem de fotogramas importa mais do que a contagem de episódios. A regra de trabalho é que as correções não devem ser perdidas na mistura: com 200 episódios originais e três episódios de correção, nada se moverá. Procure por correções que cubram o comportamento de falha de várias configurações iniciais em vez de três repetições do mesmo resgate.

Por que treinar apenas em correções é uma ideia tão ruim?

Porque as correções são quase inteiramente o meio difícil da tarefa. Abordagem, alinhamento e recuo faltam, portanto a política perde o que já fazia bem enquanto melhora a parte que consertou. Manter os dados antigos e adicionar a eles é o mecanismo em si, não um extra opcional.

Continuar a partir de um ponto de controle retoma a execução de treinamento anterior?

Não. Um ponto de controle apenas de pesos restaura parâmetros e nada mais: momentos do otimizador, posição do cronograma de taxa de aprendizado e ordem de dados começam do novo. É um início quente, e um pico de perda inicial é esperado em vez de um sintoma. Escreva qual dos dois você realmente fez, para você ler a curva corretamente uma semana depois.

E se a taxa de intervenção não cair?

Pare de adicionar rodadas. Uma taxa plana significa que as correções não estão ensinando o que você pensa. As causas usuais estão a montante: uma câmera se moveu, as correções começam tarde demais para serem dados de prevenção, fotogramas de transferência estão no conjunto de treinamento, ou a tarefa é subdeterminada a partir das observações que a política realmente obtém.

Nada disso é um problema resolvido e nada disso é um clique. O aprendizado interativo por imitação é uma área de pesquisa ativa precisamente porque suas perguntas - quando intervir, como ponderar o que o humano fez, quanto dados antigos manter - não têm respostas liquidadas; a pesquisa de Celemin et al. mapeia o que ainda está aberto. O que o loop tem é convergência mensurável quando é executado cuidadosamente, em hardware que custa algumas centenas de euros. Congele a configuração, intervenha mais cedo, analise com honestidade, componha deliberadamente e registre a taxa de intervenção a cada vez.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started