lördag 5 augusti 2023

Skapa en AI-modell som styr en bil i AWS DeepRacer

AWS DeepRacer

AWS DeepRacer är tjänst i Amazons moln. Med hjälp av den tjänsten kan du träna upp en maskininlärningsmodell med förstärkningsinlärning så den kan köra en bil i skala 1:18 på en virtuell eller riktig bana. Modellen kan du sedan anmäla till olika tävlingar.


Som IT-konsult på Knowit hakade jag på möjligheten att prova på DeepRacer när Knowit skapade sin egen interna tävling där deltagarna fick generöst med fria modellträningstimmar. I det här inlägget tänkte jag visa lite hur tjänsten ser ut när man skapar sin modell. I ett eventuellt framtida inlägg är min plan att visa hur det ser ut när modellen tränas.

Skapa en modell

När man loggat in i Amazons molntjänst så listas de senaste tjänsterna man använt. För att komma in på AWS DeepRacer så klickar man på den länken.



Väl inne i tjänsten så får man upp menyn i bilden nedan. För att skapa en modell så går man till "Your models".


Här listas de modeller man skapat tidigare. Eftersom jag provat mig fram en hel del så har jag en del modeller liggande redan. På mitt konto finns dock en begränsning på max sex stycken samtidiga modeller, så jag tar bort en först för att visa hur man skapar en ny med knappen "Create model".



Modellen skapas med en wizard i fem steg. Före alla steg får man lite info om träningen.


Steg 1: Val av modellnamn och bana

I första steget får du namnge modellen och om du vill även ange en beskrivning av den.


Det finns 61 banor att välja mellan att träna modellen på.



Våra tävlingar skulle till att börja med köras på tävlingsbanan från 2018, det vill säga "re:Invent 2018".



Steg 2: Val av tävlingstyp och träningsalgoritm

Det finns tre olika tävlingstyper att välja mellan, just nu var det "Time trial" som gällde.


Vid val av träningsalgoritm blir det helt plötsligt rätt hög nivå... PPO eller SAC, det sa mig ingenting. Nån av guiderna jag tittade på har jag för mig föreslog att börja med PPO, ser att alla mina modeller använder den.


Vågar man sig på att fälla ut "Hyperparameters" så blir det riktigt läskigt, men som tur var så var rådet att låta dessa vara tills man blivit varm i kläderna.


Steg 3: Definiera vad bilen kan göra, d v s dess Action space

Först får man lite info igen.


Sen ska man välja mellan "Continuous" eller "Discrete" action space.


Väljer man "Continuous" så kan man i nästa steg ange max styrvinklar och min/max hastighet.




De val man gjort visas också visuellt. Man kan även klicka direkt på en av pilarna och dra den hur man vill ha det.


Eftersom tävlingen handlar om att ta sig fortast runt banan så har jag tänkt att det är bra att utöka action space med högre hastigheter, så när jag använt "continuous" så har jag ökat max hastighet från ett till fyra.


Om man istället väljer "Discrete" så ska man i nästa steg explicit ange ALLA möjliga utfall som modellen kan ha som utdata. Nedan är förinställda värden.



Jag har testat att använda båda sorterna, men det var ett tag sen jag skapade mina modeller och minns inte om någon av dem fungerade bättre. Jag fick aldrig till läsningen av loggfilerna som skapas vid utvärderingen av modellen, men om man får det så verkar logganalysverktygen mer anpassade till  (eller kanske t o m kräva) "discrete"-varianten.


Steg 4: Välja fordon

Jag har två likvärdiga virtuella bilar, den färgglada har jag för mig att jag fick som pris för att jag ställt upp med en modell i en tävling. Det finns varianter av bilarna, iallafall av de fysiska, som har dubbla framåtriktade kameror och LIDAR.


Steg 5: Belöningsfunktionen

Det är nu man får börja koda! Här ska du, i Python, ange den belöningsfunktion som modellen ska tränas med. Modellen får in bilens tillstånd, den tar ett beslut om vad bilen ska göra härnäst och din belöningsfunktion berättar för träningsalgoritmen hur bra beslutet var utifrån bilens nya tillstånd.

Nedanstående funktion är förifylld, den kan returnera fyra olika värden beroende på hur långt från mitten bilen är placerad, ju längre bort från mitten desto lägre värde. Det vill säga, den belönar modellen när den lyckas följa mittlinjen.


Men eftersom tävlingen handlar om att köra fortast så behöver man även belöna hastigheten på nåt sätt och då behöver man mer data att titta på. Data om bilens tillstånd och även lite info om banan kommer in till belöningsmodellen som en dictionary i parametern "params". Den innehåller nedanstående värden (illustrationer och förtydliganden finns här):
  • "all_wheels_on_track"
    Boolean
    flag to indicate if the agent is on the track

  • "x"
    float
    agent's x-coordinate in meters

  • "y"
    float
    agent's y-coordinate in meters

  • "closest_objects"
    [int, int]
    zero-based indices of the two closest objects to the agent's current position of (x, y).

  • "closest_waypoints"
    [int, int]
    indices of the two nearest waypoints.

  • "distance_from_center"
    float
    distance in meters from the track center

  • "is_crashed"
    Boolean
    Boolean flag to indicate whether the agent has crashed.

  • "is_left_of_center"
    Boolean
    Flag to indicate if the agent is on the left side to the track center or not.

  • "is_offtrack"
    Boolean
    Boolean flag to indicate whether the agent has gone off track.

  • "is_reversed"
    Boolean
    flag to indicate if the agent is driving clockwise (True) or counter clockwise (False).

  • "heading"
    float
    agent's yaw in degrees

  • "objects_distance"
    [float, ]
    list of the objects' distances in meters between 0 and track_length in relation to the starting line.

  • "objects_heading"
    [float, ]
    list of the objects' headings in degrees between -180 and 180.

  • "objects_left_of_center"
    [Boolean, ]
    list of Boolean flags indicating whether elements' objects are left of the center (True) or not (False).

  • "objects_location"
    [(float, float),]
    list of object locations [(x,y), ...].

  • "objects_speed"
    [float, ]
    list of the objects' speeds in meters per second.

  • "progress"
    float
    percentage of track completed

  • "speed"
    float
    agent's speed in meters per second (m/s)

  • "steering_angle"
    float
    agent's steering angle in degrees

  • "steps"
    int
    number steps completed

  • "track_length"
    float
    track length in meters.

  • "track_width"
    float
    width of the track

  • "waypoints"
    [(float, float), ]
    list of (x,y) as milestones along the track center

Här har jag sparat de belöningsmodeller jag har försökt med. I slutet försökte jag kombinera att bilen skulle ha en bra riktning mot nästa "waypoint" i banan, att den skulle ligga centrerad på banan samt ha en hög hastighet.

När man är klar med belöningsmodellen så ska man välja hur länge modellen ska tränas. Jag tyckte det verkade som att en timme var absolut minimum för att få fram en modell som klarade sig hyfsat bra.



De vill gärna att man anmäler sin modell till en tävling när den är klar. Det körs ständigt kvalificeringstävlingar där resultatet avgörs i slutet av månaden.


Sen är det bara att klicka på "Create model" så sätts träningen av modellen igång och man får rulla tummarna eller hitta på något annat under den tid man ställt in i steget innan att träningen får ta.



Avslutning

Sådär, nu har du fått en bild av hur man skapar en modell i AWS DeepRacer. Som jag skrev i början av inlägget så ska jag försöka knåpa ihop ett till inlägg där det syns hur träningen och utvärderingen av modellen ser ut.

Inga kommentarer:

Skicka en kommentar