En SO-100 billig robotarm på ett skrivbord, inställd för teleoperation och policyträning
DAggerSO-100ImitationsinlärningVLATeleoperation

Att köra en DAgger-loop på en SO-100 med en VLA-policy

AY-Robots ResearchAugust 27, 202615 min läsning

En steg-för-steg-beskrivning av en human-gated DAgger-runda på en SO-100-arm: kör policyn och spela in den, ta över när det går fel, registrera körningen som en korrektion, komponera en blandad datamängd och fortsätt träningen från en checkpoint. Innehåller tangentbords- och reglagevägen för takeover för personer utan en leader-arm, och de fyra misstagen som gör en runda värdelös.

Din policy körs. Den sträcker sig efter kuben, stänger grepparen en centimeter för tidigt och fortsätter som om den hade den. Ingenting felrapporteras, och ingen mängd stirrande på träningsförlusten förklarar det. Fixningen är inte ytterligare 20 000 gradientsteg på samma demonstrationer. Det är att sätta tillbaka din hand på armen exakt där det går fel, spela in vad du gjorde istället och träna nästa checkpoint på de gamla data plus den korrigeringen. Det är en DAgger-runda, och så körs den på en SO-100 med en vision-language-action policy.

Teorin finns någon annanstans: varför datamängdaggregering fungerar överhuvudtaget och vad human gating ändrar om det. Det här är drifthandboken, och den förutsätter en tränad checkpoint, en fungerande kamerauppsättning och en arm som rör sig. De sex stegen nedan är loopen som implementerad på DAgger-sidan på denna plattform, men sekvensen är densamma från dina egna skript.

En runda kortfattat

  • Kör den tränade policyn och spela in den, med körningens uppgiftstext snarare än en generisk teleoperationsetikett.
  • Ta över i det ögonblick beteendet blir fel: en spegelöverlämnande med en leader-arm, omedelbar och manuell över tangentbord eller reglage utan en sådan.
  • Sortera varje körning: registrera den som en korrektion, behåll den som en utvärderingsepisod eller kassera den.
  • Komponera blandningen för hand - ursprungliga demonstrationer plus korrigeringar, episoder valda per källa. Träna aldrig bara på korrigeringar.
  • Fortsätt träningen från den sista checkpointen, och notera vilken checkpoint som producerade vilken blandning.
  • Siffran som säger om rundan var värd något är interventionsfrekvensen, inte träningsförlusten.

Varför andra rundan inte bara är mer data

Beteendekloningen tränar på de tillstånd som en människa besökte. Vid testtillfället besöker policyn de tillstånd som den orsakar, och små handlingsfel förvärras till tillstånd som ingen demonstration täckte. Ross, Gordon och Bagnell formaliserade det misslyckandet för AISTATS 2011 och svarade det med en iterativ algoritm som tränar en stationär deterministisk policy och, under deras reduktion, måste prestera väl under den tillståndsfördelning den framkallar: kör den aktuella policyn, låt experten märka de tillstånd den faktiskt nådde, lägg till dem i datamängden, träna om, upprepa. Kelly et al. gjorde frågan praktisk med HG-DAgger, där människan beslutar när hon ska ta kontroll istället för att märka tillstånd utan att hålla i kontrollerna; de rapporterar förbättrad prestanda jämfört med både DAgger och beteendekloningen på en simulerad och en verklig autonom körningsuppgift. Human gating är vad som gör loopen tål på en skrivbordsarm - du rör bara dina händer när något går fel.

Två konsekvenser spelar större roll i praktiken än teorin gör. Korrigeringar är inte vanliga demonstrationer: de koncentreras vid flaskhalsregionerna som Mandlekar et al. beskriver, där en liten avvikelse faller policyn in i tillstånd som demonstrationerna aldrig täckte. Och en datamängd gjord bara av dessa svåra delar är en dåligt formad datamängd - Belkhale, Cui och Sadigh hävdar från datasidan att tillståndsvariation inte alltid är fördelaktig, och att handlingsdivergering och övergångsdivergering tillsammans avgör datamängdkvalitet. Den blandade datamängden är inte en kompromiss, det är själva poängen.

Frys dessa innan runda ett

En DAgger-runda jämför en policy mot sig själv över tid. Vad som helst du ändrar mellan rundor som inte är datamängden gör denna jämförelse meningslös.

  • Kamerapositioner och monteringar, handledskamera inkluderad. Lossa ett spännband och du har ändrat observationsfördelningen, inte policyn.
  • Exponering och vitbalans, om din fångsthöghöger låter dig fästa dem. Auto-exponering som driver mellan rundor är en långsam, osynlig domänförskjutning.
  • Armkalibrering och servoserienollpositioner. Om du måste omkalibrerit, behandla allt som spelades in före det som en separat datamängd.
  • Uppgiftstexten. Varje VLA här villkor på det; omformulering av det mitt i loopen är en annan uppgift.
  • Belysning, bordyta, objektuppsättning. Ett nytt objekt är ett nytt experiment, inte nästa runda.
  • Inspelningsbildhastigheten. Att jämföra interventionsfrekvenser över två samplingsraster producerar skillnader som kommer från rastret.
Handledskameran är inte valfri möblemang

Hsu et al. jämförde en handcentrerad vy mot den vanliga tredjeparts-vyn och fann att eye-in-hand-perspektivet konsekvent förbättrade träningseffektiviteten och generaliseringen utanför distributionen, trots att det såg mindre av scenen. På en femledskärm är grippertiming vanligtvis vad dina korrigeringar fixar, och grippertiming är vad handledsvyn bär.

Rundan, från början till slut

  1. 1
    Kör interferens och spela in den

    Starta körningen mot den checkpoint du vill förbättra, starta sedan inspelningen i inferences rot. Inspelad på det sättet ärver den körningens egen uppgiftstext, vilket är vad policyn tränade på, snarare än standard teleoperationsetiketten. Utan inspelningen kan du titta på misslyckandet men inte träna på det.

    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
    Ta över när det går fel

    Tryck Ta över och välj indataläge: leader-arm, tangentbord eller reglage. Köraren pausar, du korrigerar, du överlämnar. Bildrutor som spelades in medan du körde flaggas automatiskt som interventioner.

    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
    Sortera episoderna

    Bestäm per episod: registrera som korrektion, behåll som utvärdering, eller kassera. En körning som policyn slutförde utan hjälp är utvärderingsdata.

  4. 4
    Synkronisera korrektionsdatamängden

    Korrigeringar samlas in en lokal datamängd per policy och går till molnlagring genom automatisk synkronisering. Ingenting blandas in som du inte satte dit.

  5. 5
    Komponera den blandade datamängden

    Kombinera den ursprungliga datamängden med korrektionsdatamängden, välj episoder uttryckligen per källa. Resultatet är en vanlig datamängd från den punkten framåt.

    bash
    POST /training/datasets/compose
      sources  = [ original_dataset, korrekturen_<policy> ]
      episodes = explicit selection per source
  6. 6
    Fortsätt träningen från checkpointen

    Träna blandningen från den tidigare checkpointen snarare än basmodellen. Notera vilken checkpoint och vilken blandning; utan det paret är rundan inte återproducerbar.

    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

Steg 2 i detalj: de två sätten att ta över

Med en leader-arm

I leader-follower läge är övertagandet en överlämnande mellan två armar som inte är i samma position. Att trycka Ta över pausar köraren och driver ledarens på följarens nuvarande position, så ingenting hoppar när vridmomentet överförs. Om den justeringskörningen tar tid, justerar du ledarens för hand och släpper bara när de två är inom fem grader. Från då teleoperar du normalt och åtgärdskolumnen registrerar vad du beordrade.

Var ärlig om denna väg: justeringskörningen och vridmomentöverlämnandet är den minst testade delen av loopen på verklig maskinvara. Testa överlämnandet på en långsam, ofarlig position innan du förlitar dig på det i en körning du bryr dig om. En leader-arm producerar de jämnaste korrigeringarna av de tre lägena, och har också det mesta som kan gå fel mekaniskt.

Utan en leader-arm: tangentbord och reglage

De flesta människor som läser detta äger en arm. Det räcker. Välj tangentbords- eller reglageindatning i det ögonblick du trycker Ta över, och övertagandet är omedelbar och manuell - det finns ingen andra arm att justera, så det finns ingen justeringssteg. Följaren håller sin position och väntar på inmatning.

IndatalägeHur armen rör sigPer-anropsgräns tillämpad av servernLåst när
Leader-armSpegeln driver följaren från ledarens ledvinklarInget knuffsteg eller ställ samtal i detta läge; spegeln skriver följarmål kontinuerligtAldrig låst, och standardinställningen om inget indataläge ges - men det behöver en andra arm; utan ett leader-id vägrade övertagandet
TangentbordRelativt knuffsteg per tangenttryckning, skickat till takeover-knuffslutpunktenHårt spännband vid 2 grader per led, 4 grader för grepparenAvvisad med 409 om övertagandet startades i ledarläge
ReglageAbsolut målposition, skickad till takeover-ställningslutpunktenHögst 6 grader resa mot målet per anrop; gränssnittet fortsätter att skicka ungefär tio gånger per sekundAvvisad med 409 om övertagandet startades i ledarläge

Tygelmässan tillämpas server-sida, inte i gränssnittet, eftersom en felstavad delta på en busservomotor-arm är en kollision. Tangentbordskorrigeringar kommer stegvis och något grova; reglagekorrigeringar är slätare, eftersom servern går mot målet medan gränssnittet fortsätter strömma. Hur som helst mottar åtgärdskolumnen den fullständiga beordrade positionsvektorn och interventionsmarkeringen är identisk med ledarvägen, så tangentbordskorrigeringar hamnar i samma datamängd utan en formatskillnad.

text
Q / A   joint 1      R / F   joint 4
W / S   joint 2      T / G   joint 5
E / D   joint 3      Z / X   gripper
Samma nyckellayout som överallt i stacken, så muskelminne från inspelning överfördes.
Träningsguide som visar de ordnade stegen i en GR00T fine-tuning-körning på en SO-100 datamängd
Träningssidan av en runda är samma guidad sekvens som en första körning; endast checkpointfältet skiljer sig.

När man ska trycka knappen

Tidigare snarare än senare. En korrektion som börjar efter det att grepparen stängts på ingenting lär återställning från ett misslyckande policyn inte borde ha angett, och återställningsdata är långt värd mindre än undvikningsdata. Avbryt i det första ögonblicket du är säker på att banan är fel, korrigera genom den svåra delen, överlämna så fort tillståndet är ett som policyn hanterade tidigare. ThriftyDAgger automatiserar det beslutet genom att grindar interventioner på nyhet och uppskattat risker under en fast människobudget, men på en enskild arm med en människa redan som tittar, är människogrinningen billigare och bättre kalibrerad än allt du kommer att justera.

Möjligt med stacken med öppen källkod och ett par skript. Vad det kostar är bokföring, och bokföring är där DAgger-rundor dör.

  1. Skriv bildrutor från ditt eget inferences-skript till en LeRobot datamängd, med uppgiftssträngen policyn tränade på.
  2. Pausera policyloopen, byt kommandokälla och flagga varje bildram du kör som en intervention. Utan flaggan liknar korrigeringar vanliga demonstrationer.
  3. Bestäm medvetet vad som händer med övergångsramarna mellan policyn som släpper kontrollen och din första inmatning.
  4. Håll korrigeringar i sin egen datamängd per policy, och spåra episodindekser för hand så att blandningen kan rekonstrueras.
  5. Peka finjusteringsingstgångspunkten mot den tidigare checkpointen, och kontrollera i loggen att den laddade dessa vikter.

Steg 3 i detalj: triage avgör kvaliteten

Efter körningen har du en inspelning med några bildrutor märkta som interventioner. Tre destinationer finns, och den felaktiga tyst förgiftar nästa runda.

  • Registrera som korrektion när interventionen var en verklig fix: policyn var på väg någonstans fel och din inmatning visade det rätta från ett tillstånd policyn själv producerade.
  • Behåll som utvärdering för rena autonoma körningar och för körningar du tog över av försiktighet. Utvärderingsepisoder är hur du mäter nästa checkpoint, och de får aldrig tränas på.
  • Kassera körningar förstörda av något icke relaterat - en tappningarambildruta, en stucken servo, ett objekt du knockade över. En rörig korrektion är värre än ingen korrektion.
Frysbildrutor hör till i rå inspelningen, inte i träningsdata

Mellan policyn som släpper kontrollen och din första inmatning, håller armen stilla medan inspelaren fortsätter skriva - en körning av identiska positioner parad med något olika bilder. Här dessa överkörningsbildrutor stannar i den rå inspelningen och ut ur korrektionsdatamängden. Om du bygger loopen själv, skär dem medvetet: en policy tränad på dem lär sig att pausa där den borde agera.

Steg 5 i detalj: komponera blandningen

Komposition tar den ursprungliga datamängden plus korrektionsdatamängden och producerar en ny, vanlig LeRobot datamängd som tränar som någon annan. Den viktiga egenskapen är att episodvalet är uttryckligt per källa - ingenting blandas in automatiskt. Det låter mindre viktigt tills första gången en policy beter sig konstigt och du måste rekonstruera vad den tränade på.

Den öppna frågan är förhållandet, och ingen har ett nummer som överför. Vad litteraturen är överens om är att korrigeringar bör räkna för mer än deras ramandel. Mandlekar et al. tränar iterativt på data sitt interventionssystem samlar in, så policyn lär sig att korsa flaskhalsarna, och rapporterar att agenter tränade på det sättet överträffar agenter tränade på ett motsvarande antal prover från icke-interventionella demonstranter. Sirius går längre och viktar om träningsprover genom approximerad människotillit, rapporterar en 8 procents vinst i simulering och 27 procent på verklig maskinvara i policy-framgångsfrekvens mot metoderna den jämför med, vid två gånger konvergenshastigheten. Ingen av träningsinläggen här exponerar ett viktknappar för urval, så det grova substitut är att behålla varje korrektionsepisod medan undersampling av de ursprungliga demonstrationerna - och att skriva ner vad du gjorde.

Dataset inspelningsvy som visar episoder av en SO-100 datamängd med kameraströmmningar
Korrektionsepisoder är vanliga episoder med en per-ram interventionsflagga, så de komponerar med den ursprungliga datamängden utan omvandling.

Steg 6 i detalj: vad fortsätta från en checkpoint verkligen betyder

Träna blandningen från basmodellen fungerar men kaster bort den tidigare rundan och kostar en full körning. Fortsätta från den tidigare checkpoint är snabbare och vanligtvis bättre. Det är också mer begränsat än frasen föreslår.

Vikt-initialisering är inte en optimeringsresumé

En vikter-bara checkpoint innehåller parametrarna och ingenting annat. Att ladda den ger nästa körning en bättre utgångspunkt än basmodellen, men optimizermoment, inlärningskursposition och dataordning börjar alla från noll. Förvänta en förlusspik i början av den fortsatta körningen, läs det inte som ett misslyckande, och anropa inte rundan en résumé. Det är en varm start.

PolicyStorlekGPU-nivåInterferens per handlingstegDataformatEpisoder innan det är värt att försöka
GR00T N1.7ungefär 3 B, ungefär 40 M tränade under finjusteringA100 80 GB eller H100 80 GBungefär 152 msLeRobot v2.0 eller v2.150
GR00T N1.5ungefär 3 BA100 80 GB eller H100 80 GBungefär 165 msLeRobot v2.0 eller v2.150
Pi0.5ungefär 3 B på en PaliGemma-ryggA100 80 GB eller H100 80 GBungefär 485 msLeRobot v3.050
SmolVLAungefär 450 MRTX 4090 eller valfri 24 GB-kortungefär 245 msLeRobot v3.030
ACTungefär 80 M, tränad från börjanRTX 4090 eller valfri 24 GB-kortungefär 20 msLeRobot v3.050

Latensen förstärks inuti en DAgger-loop på ett sätt som den inte gör under en demo: vid ungefär 485 ms per handlingsteg tar du över för att armen tvekade, inte för att det var fel, och tvekande-korrigeringar är inte användbara träningsdata. Om du upprepar data snarare än jagar en slutgiltigt framgångsfrekvens, upprepa med en snabb modell. Shukor et al. beskriver SmolVLA som utformad för att träna på en enskild GPU och distribuera på konsument-GPU eller CPU, med en asynkron interferensstacka som frikopplar handlingsförutsägelse från genomförande för att möjliggöra högre kontrollfrekvenser - egenskapen som håller en övertagningsloop responsiv.

Dataformaten är inte utbytbara heller. GR00T tar LeRobot v2.0 eller v2.1, och Isaac-GR00T-förvaringsplatsen beskriver sin indata som en smak av LeRobot v2-format med en tillagd modalitets-beskrivningsfil; de nyare tränarna här förväntar v3.0. En blandning sammansatt i fel version misslyckas vid lastid snarare än att producera en dålig policy - det bättre misslyckande, fortfarande en spilld köplats. dataset dokumentation listar vilket format varje tränare tar.

Loopen, med bokföringen redan gjord

Överta med en leader-arm, tangentbord eller reglage; per-ram interventionsmärkning; arkivering av körningar som korrigeringar eller utvärderingar; komponera en blandad datamängd med ett uttryckligt episodval per källa; och fortsätt träning från en checkpoint istället för basmodellen. Vad som förblir ditt beslut är vilken körning som räknas som en korrektion, vad som går in i blandningen och när interventionsfrekvensen har slutat att falla.

Se hur DAgger-loopen är kabellagd

Fyra sätt att slösa en runda

1. Träna bara på korrigeringarna

Det vanligaste misslyckandet och den mest frestande genvägen. En korrektion-bara datamängd är nästan helt den svåra mitten av uppgiften, med närma och reträtt saknas; policyn blir bättre på den hårda delen och glömmer hur man anländer dit. Aggregering är inte en implementeringsdetalj i metoden, det är mekanismen: de gamla data är vad som håller resten av beteendet på plats medan korrigeringarna flyttar en del av det.

2. Flytta en kamera mellan rundor

En kamera som skiftar två centimeter mellan rundor producerar en policy värre än den du började med, och en diagnos som kostar en dag. Varje VLA här villkor på bilder; ledtillståndet enbart disambiguerar inte var objektet är. Fotografera inställningen före första rundan och kontrollera det fotografiet före varje senare.

3. Låta överlämnandeartefakter in i träning

Täckt ovan, och på listan för att det är osynligt. Symptomet är en policy som stannar i en bråkdel av en sekund exakt där tidigare rundas operatör tog över. Det ser ut som tveksamhet; det är imitation.

4. Kallar en varm start en résumé

Om du tror optimizerstat överfördes, läser den första förlusspiken som en bugg och du går jagt på korrupt data. Om du vet optimizern startade frisk, är spiken förväntad och du tittar på vad som kommer efter det. Samma siffror, motsatta slutsatser.

Mäta rundan

Måttet för en human-gated loop är interventionsfrekvensen: bildrutor spelades in medan du var i kontroll, dividerat med totala bildrutor av körningen. Det är i övertagandestatusen, och det är det enda numret som svarar på frågan rundan ställde. Träningsförlusten faller oavsett om policyn förbättrades; framgångsfrekvensen är binär och bullrig vid de provstorlekar ett skrivbord arm producerar. Interventionsfrekvensen är kontinuerlig, mätt på de tillstånd policyn själv orsakade, och den sjunker när policyn behöver dig mindre.

Jämför det bara över körningar spelade in under identiska förhållanden. Fullständiga argumenten, och hur man bygger en utvärderingssätt som överlever mer än två rundor, finns i artikeln om att mäta en DAgger-loop. Runda ett är realistiskt ett genomförande test: du kontrollerar att övertagandet fungerar på din maskinvara, att korrigeringar landar med sina flaggor, och att den fortsatta körningen laddade checkpointen du namngivna. Rundor två och tre är där hastigheten bör börja röra sig. Om den inte har rört sig i runda fyra är problemet uppströms i DAgger.

Skriv ner per rundaVarför det spelar senare
Checkpoint som kördesUtan det kan du inte attribuera en förbättring till en blandning
Indataläge som användes för övertagandetTangentbordskorrigeringar är grövre än ledarkorrigeringar, och det syns i data
Antal körningar och hur varje var sorteradOm rundan hade tillräckligt med korrigeringar för att spela roll
Interventionsfrekvens per körning, och medelvärdetFramstegsåtgärden i loopen
Exakt episodval per källaDet enda sättet att återge eller ångra en runda
Varm start eller ny träningFörklarar förlustkurvan du kommer att titta på om en vecka

Om du inte har en checkpoint än

Loopen har ingen ingångspunkt utan en sådan. Spela in en första datamängd, träna en första policy, kör den - inspelning, träning och kör policyn täcker det vägen. Inspelningsklienten är på nedladdningssidan, GPU-nivåer och timpriser på prissidan, och vad en använd episod ser ut i SO-100 datainsamlingsguide. Få demonstrationerna rätt före korrigeringarna: DAgger är en reparationsmekanisk, och det fungerar mycket bättre på något som redan var nästan rätt.

Kan jag köra en DAgger-loop utan en leader-arm?

Ja. Välj tangentbords- eller reglageindatning när du trycker Ta över: övertagandet är omedelbar och manuell, utan andra arm att justera. Tangentbord skickar relativa knuffsteg som servern håller hårt vid 2 grader per led och 4 för grepparen; reglage skickar ett absolut mål och servern rör högst 6 grader mot det per anrop, medan gränssnittet fortsätter strömma. Åtgärdkolumn och interventionsmärkning är densamma som i ledarläge, så korrigeringarna är omöjliga att skilja i datamängden.

Hur många korrigeringar behöver en runda?

Det finns inget försvarbart universellt antal, och ramantal spelar större roll än episodantal. Arbetsregeln är att korrigeringarna inte får gå förlorad i blandningen: med 200 ursprungliga episoder och tre korrektionsepisoder kommer ingenting att röra sig. Syfta på korrigeringar som täcker det misslyckat beteende från flera startningskonfigurationer snarare än tre upprepningar av samma räddning.

Varför är det en så dålig idé att träna bara på korrigeringar?

För att korrigeringar är nästan helt den svåra mitten av uppgiften. Närma, justering och reträtt saknas, så policyn förlorar det som den redan gjorde väl medan den förbättras i den delen du fixade. Att hålla de gamla data och lägga till det är själva mekanismen, inte en valfri extra.

Fortsätter från en checkpoint återuppta den tidigare träningskörningen?

Nej. En vikter-bara checkpoint återställer parametrar och ingenting annat: optimizermoment, inlärningskursposition och dataordning börjar friska. Det är en varm start, och en initial förlusspik är förväntad snarare än ett symptom. Skriv ner vilken av de två du faktiskt gjorde, så du läser kurvan rätt en vecka senare.

Vad om interventionsfrekvensen inte faller?

Sluta lägga till rundor. En platt hastighet betyder att korrigeringarna inte undervisar vad du tror. De vanliga orsakerna är uppströms: en kamera rördes, korrigeringarna börjar för sent för att vara undvikningsdata, överlämnadebildrutor är i träningssatsen, eller uppgiften är underbestämd från observationerna policyn faktiskt får.

Ingenting av detta är ett löst problem och ingenting av det är ett klick. Interaktiv imitationsinlärning är ett aktivt forskningsområde helt för att dess frågor - när man ska ingripa, hur man väger det människan gjorde, hur mycket gamla data man ska behålla - har ingen lösta svar; enkäten av Celemin et al. kartlägger vad som fortfarande är öppet. Vad loopen har är mätbar konvergens när den körs försiktigt, på maskinvara som kostar några hundra euro. Frys inställningen, ingrip tidigt, sortera ärligt, komponera medvetet och registrera interventionsfrekvensen varje gång.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started