Deployment

Machine Learning Deployment från grunden

Det pratas mer och mer om deployment av modeller i ML(Machine Learning)-världen och på senaste åren har en uppsjö nya teknologier utvecklats. API economy eller microservices, allt handlar om att få ut ML till verksamheten – och verkligheten!

Machine Learning Bodybuilding
Data Scientists, eller ML-ingenjörer som fler och fler vill kalla sig, har bl.a. som specialkunskap att bygga och träna maskininlärningsmodeller. Man tar en generell modell, en algoritm, och anpassar den till historisk data. Därmed hoppas man att den kan ge insikter om framtida data. Men när en modell tränats är det en bit kvar till att modellen kan användas av verksamheten. Hjärnan, som är modellen, kan inte leva själv utan en kropp behöver byggas – body building!

Ifall en modell ska användas för att prediktera löpande behöver den exponeras så att de som ska använda den kan nå den, när de vill eller när deras system behöver nå den. Att exponera en modell via ett REST-ful API blir mer och mer bransch-standard som de flesta system kan kommunicera med.

Att deploya en modell
Det finns många produkter som man kan använda för att träna och ”deploya” modeller som API:er, bl.a. Azure ML Studio, SPSS, Alteryx etc. Men som med mycket annat är det svårt att få en förståelse för vad som händer om man inte byggt det själv från scratch en gång – och det blir vanligare och vanligare att data scientists vill kunna styra exakt hur modellen ska användas. För att få flexibilitet behöver man koda det själv, och det finns bra ramverk för att göra det.

Kom igång med Flask
Flask (http://flask.pocoo.org/) är ett ramverk för web-appar, som skrivs i Python. Med Flask kan man själv skapa web-applikationer och API:er. För att komma igång behöver man installera det till sin Python-miljö genom ”pip install Flask”.

Första web-appen

Nu ska vi skapa en första web-app. På din laptop, spara skriptet nedan som exempelvis ”webapp.py”. Genom att köra skriptet (python3 webapp.py).

Deokoynent

Konfigurerar vi web-appen och startar en webserver på datorn. Den lyssnar på anrop utifrån, och skickar tillbaka det vi definierat att den ska. I detta fall skickar den endast tillbaka en sträng ”Hej hej!”. Inte speciellt intelligent, men ett embryo att jobba vidare med!

Web-app version 2 – parameterstyrt svar
Nu vill vi kunna säga åt vår webservice vad vi vill ha tillbaka. Vi vill att den ska ge oss information vi inte hade från första början baserat på en parameter vi definierar. Låt säg att vi har en lista över favoritfärger olika personer har, och om vi anger ett namn vill vi ha den personens favoritfärg tillbaka.  Genom att utvidga koden till…

Deployment

…definierar vi 3 personers favoritfärger. Om vi nu startar webservern (genom att köra koden) och via vår browser skriver in http://localhost:8000/api/v1.0/color/Pehr får vi tillbaka detta:

Deployment

Det funkar! 

Steg 3 – gör publik
Hittills har vår webbservice bara varit tillgänglig för oss själva – ingen annan har haft möjlighet att använda den. För att den ska gå att göra tillgänglig så behöver vi göra lite ändringar i app.run()

Deployment

Om vi kör vårt skript nu så öppnar webservern upp för förfrågningar utifrån. Så länge servern är igång kan vem som helst med adressen använda tjänsten. Istället för ’localhost’ eller 127.0.0.1 så anges datorns publika IP-adress. Toppen!

Innan vi skickar ut denna till alla som kan ha nytta av den är det en god idé att lägga till säkerhet, så inte vem som helst kan komma åt datan. Detta tänkte jag inte gå igenom i den här guiden, men den nyfikne kan läsa mer här: https://realpython.com/token-based-authentication-with-flask/

Steg 4 – Deploya en modell
Låt oss nu utvidga den här tjänsten till att ha en ML-modell som körs i webbservicen. I detta exemplet har vi lite (fingerat) data i en csv-fil från en HR-avdelning, som samlat in data från sina anställda. Specifikt finns 3 kolumner i datan:

  • Age: personens ålder
  • HourlyRate: Personens timlön
  • JobSatisfaction: Hur nöjd personen är med sin arbetssituation på en skapa 1-5. 1 är dåligt, 5 är bra.

Vi antar nu att HR-avdelningen vill att vi ska kunna prediktera nöjdheten och tillgängliggöra det som en tjänst. I koden läser vi in csv-filen, och tränar en logistisk regressionsmodell från paketet scikit-learn. Vi behöver också paketen numpy och pandas för datahantering.

Deployment

När vi nu kör skriptet tränas modellen, och tjänsten exponeras publikt. Om vi till exempel har en person som är 33 år gammal, och tjänar 300 kr i timmen kan vi prediktera dennes nöjdhet genom

http://<<IP-adress>>:5000/api/v1.0/satisfaction/age=33&hourly_rate=300

Deployment

Denna person kan utifrån vår modell antas vara ganska missnöjd med sin jobbsituation! Självklart beror troligen jobbnöjdhet på fler parametrar än ålder och lön, så den här modellen behöver utvidgas innan vi har en klar tjänst att leverera till verksamheten.

Sen är det inte optimalt att träna modellen i samma skript som man sätter igång webservern, i många fall tar träningen lång tid och det skulle vara opraktiskt. Sen behövs modellen kontrolleras och testas innan den släpps ut till verkligheten.

Nästa steg
För att garantera att tjänsten klarar alla anrop, och att den alltid är uppe är det inte gångbart att ha den uppe på sin egen dator. En virtuell maskin i molnet, eller en server någonstans är en god idé att ha tjänsten uppe på. Dock måste man se till att

  • Modellen uppför sig på samma sätt på servern
  • Autentiseringen mot tjänsten sköts
  • Om tjänsten går ner eller möter större laster ska omstart/uppskalning skötas automatiskt

Det finns en uppsjö olika tekniker för detta, men i den här guiden går vi inte in på dem. För den intresserade är Docker containers och Kubernetes-kluster en kombination som ofta används när webb-tjänster skrivna i exempelvis python ska tillgängliggöras. Självklart har alla molnplattformar moduler för att tillgängliggöra sådana här tjänster.

Sammanfattning

I den här guiden har vi ur ett pragmatiskt perspektiv gått igenom:

  • Hur du får en enkel webbserver att hosta en webbapplikation (webservice) i python via Flask
  • Konfigurera den så att den är publik
  • Deploya en enkel ML-modell som en webbservice

Har du fler frågor eller funderingar, tveka inte att maila eller slå en signal!

/Gustav Eklund, gustav.eklund@advectas.se 0709 53 42 37

GustavEklund

Gustav Eklund
gustav.eklund@advectas.se
Mitt namn är Gustav Eklund, Data Scientist på Advectas. Jag är utbildad civilingenjör med tonvikt inom strukturmekanik och statistik, samt civilekonom från SU och har tidigare jobbat på IBM med bland annat Watson-plattformen. Sedan 2016 har jag varit delaktig i projekt främst mot detaljhandel och industri och är sedan 2018 kompetensområdesansvarig för området Data Science. På fritiden är jag ofta i löparspåret, på rullskidor eller seglar, men det händer även att jag spelar gitarr eller sköter om min surdeg. Född och uppvuxen i Stockholm och för närvarande bosatt i Bromma.

Alla inlägg av Gustav Eklund

Ta del av resultatet från Den svenska Business Intelligence- & Data Science-studien 2019

Ladda ner studien