Vihdoin kaikki työasemallasi ajetut testit todistaa, että siinä se on: Koneoppimismalli, joka ennustaa erinomaisen tarkasti tulevaisuutta, luokittelee tekstit/kuvat oikeisiin luokkiin, tai tekee jotain muuta mitä mallin tuleekin tehdä. Uutisen kuultuaan projektipäällikkösi kysyy välittömästi: “Miten supermalli saadaan muiden ohjelmien käyttöön?” Hmm… sitäpä et ollutkaan vielä ajatellut.

Tässä blogissa kuvataan miten koneoppimismalli julkaistaan muiden sovellusten käyttöön  kirjoittamalla pieni webbisovellus, joka julkaisee mallisi REST API-muodossa ulkomaailmalle. Kutsuva sovellus antaa parametreinään mallin syötteet, ja sovellus palauttaa mallin tuottaman tuloksen. Ei kovinkaan kummoista rakettitiedettä.

Julkaisuprosessi

Perinteinen koneoppimisen työnkulku lienee jo usemmille tuttu: Hanki sopivaa koulutusdataa. Alusta tehtävään sopiva malli, ja aja koulutus siivotulla datalla. Saatat jopa hieman viilaata mallin hyperparametreja. Kun olet tyytyväinen tulokseen, tallenna parhaan tuloksen antanut malli tiedostoon myöhempää käyttöä varten. Vanhoina hyvinä aikoina kellon lyödessä kaksitoista käynnistettiin eräajosovellus, joka kyseli mallilta joukon ennustuksia ja päivitti tulokset tietokantaan. Menetelmä sopii edelleen tiettyihin käyttötapauksiin, mutta mallin julkaisemisella tarkoitetaan nykyisin yleensä http-pohjaisen REST API:n tarjoamista useille eri asiakassovelluksille. Tätä varten tarvitset API-sovelluksen, joka käyttää tallentamaasi mallia ja tarjoaa julkisen rajapinnan asiakassovellusten käyttöön. Asiakassovellukset lähettävät datan pyyntöparametrissa, ja API antaa vastauksen. Anteeksi laiskuuteni, en jaksanut suomentaa kuvaa…

 

Process from a distance

Kuva: Julkaisuprosessi

Mallin julkaisu REST APIn avulla

REST API:a pidetään nykyisin oletusmenetelmänä, kun halutaan julkaista toiminnallisuutta toisten sovellusten käyttöön. Asiakassovellukset käyttävät http-kutsuja API-pyyntöjen tekemiseen. Vastaus (ja usein myös pyyntöparametrit) annetaan tekstimuotoisina json-objekteina. Asiakasohjelma (client) voi olla melkein mitä tahansa: Mobiilisovellus älylaitteessasi, javascript-pohjainen selainkäyttöliittymä, tietoa paikasta A paikkaan B siirtävä integraatiosovellus, tai jopa toinen API joka käyttää sinun palvelua rikastaakseen itse tarjoamaansa tietoa.

Mallin julkaisussa tarvitaan vain kolme asiaa: 1) Mallin koulutussovellus, joka tallentaa lopullisen mallin 2) yhteiseen tietovarastoon, josta 3) julkaisusovellus ensin lukee mallin ja sen jälkeen ryhtyy vastaamaan API-kutsuihin.

Python esimerkkisovellukset

 

Napin takaa löytyvä Git repo sisältää esimerkkisovellukset mallin kouluttamiseen (create_model.py PySampleModelCreator-hakemistossa) sekä yksinkertaisen python flask – sovelluksen mallin julkaisemista varten (runserver.py PyFlaskApp hakemistossa). Kumpikin näistä on täysin toimiva “luuranko”, jota voit hyödyntää tehdessäsi omaa toteutustasi. Harjoituksen lopputulema näyttää seuraavalta:

The apps & common file storage python flask exampleKuva: Sovellukset sekä yhteinen tiedostovarasto.

Esivaatimus: Esimerkkisovellukset käyttävät Azure Storagea yhteisenä tiedostovarastona. Tarvitset Azure-tilauksen jos käytät esimerkkikoodia sellaisenaan. (Saat ilmaisen Azure-tilauksen tarvittaessa tästä).

Yhteinen tiedostovarasto

Yhteinen tiedostovarasto on yksinkertaisesti paikka, mihin/mistä sekä koulutussovellus että julkaisusovellus voivat kirjoittaa ja lukea tiedostoja. Koulutussovellukset ovat perinteisesti tallentaneet valmiin mallinsa paikalliselle levylle (esim /tmp/), ja muut sovellukset ovat käyttäneet tiedostoa tarvittaessa tästä sijainnista. Tämän harjoituksen tarkoituksena on kuitenkin luoda erillisellä palvelimella (tai kontissa) ajettava API:n julkaisusovellus. Koska palvelimella (tai kontilla) ei ole pääsyä paikalliseen levyjärjestelmääsi, tarvitsemme paikan, josta molemmat sovellukset pääsevät käsiksi mallitiedostoihin.

Tässä harjoituksessa käytetään Azuren blob storagea mallien yhteisenä tiedostovarastona. Blob storage on halpa, hyvin suojattu sekä erinomaisen helppokäyttöinen paikka kaikenlaisten tiedostojen säilömiseen. Luo itsellesi aluksi oma storage account, sekä yksi blob container sen sisälle. Jos tämä ei ole tuttua ennestään, lue tästä ensin lyhyet perusteet, ja sen jälkeen luo itsellesi storage account ja private-tyyppinen blob container.

Esimerkkisovellusten ajamista varten joudut muuttamaan koodissa olevat storage accountin nimen (name), access keyn sekä blob containerin nimen. Alla olevasta Azure portaalin screenshotista vihje mistä löydät nämä omasta storage accountistasi.

Image: Storage accountin nimi, access keyn sijainti, sekä blob storage containerin luonti.

Mallin koulutussovellus

Nyt olemme data scientistin mukavuusaluella: Koulutussovelluksen vastuulla on datan lukeminen, mallin koulutus ja valmiin mallin tallennus tiedostoon. Julkaisua varten teemme sovelluksen loppuun yhden pienen lisäyksen: Valmis malli kopioidaan lopuksi yhteiseen tiedostovarastoon.

Esimerkkisovellus create_model.py luo aluksi yksinkertaisen mallin (numpy-taulukko), jonka se tallentaa paikalliseen tiedostoon. upload_model_to_blob() kopioi lopuksi paikallisen tiedoston yhteiseen tiedostovarastoon Azure blob storageen.

Jos haluat ajaa sovelluksen, muuta omat storage account – tietosi lähdekoodiin:

  • storagename = mystorageaccountname“. storage account name tähän. 
  • storagekey = “mystorageaccountkey”. Avaimen (pitkä merkkijono) löydät Access Keys – kohdasta.
  • storagecontainer = “mycontainername”. container name on itse blob containerille antamasi nimi.

APIn julkaiseminen Flask-sovelluksella

Tämän sovelluksen vastuulla on tarjota REST API muiden sovellusten käyttöön (runserver.py esimerkkirepossa). Sovellus:

  1. Kopioi mallitiedostot yhteisestä tiedostovarastosta paikalliselle levylle
  2. Lukee paikalliset mallitiedostot ja alustaa mallin käyttöä varten.
  3. Käynnistää flaskiin perustuvan http-serverin, joka vastaa käyttäjien pyyntöihin.

Flask on “python mikroframework”, joka tarjoaa helpohkon menetelmän http-serverin toteuttamiseen. Flask on minun valinta, voit toki käyttää mitä tahansa muutakin kirjastoa tämän toteuttamiseen.

Jos kutsut esimerkkisovelluksen juuriosoitetta “/”, saat vastauksena selaimeesi tervetuloa-sivun. Tämä ei ole pakollinen toiminto, mutta näppärä tapa todentaa että sovelluksesi on oikeasti käynnissä. Itse API kutsu tehdään osoitteeseen /api/v1/fake. Kutsu reitittyy funktioon fakeApi(), jonka vastuulla on:

  1. Sisääntulevien parametrien luku http-pyynnöstä
  2. Vastaanotettujen parametrien syöttäminen mallille
  3. Tulosten/ennusteen poimiminen mallin vastauksesta
  4. Kutsujalle palautettavan json-objektin muotoilu
  5. Palauta status 200 (ok) sekä json vastaus.

Voit käynnistää serverisovelluksen normaalisti komennolla “python3 runserver.py”. Komento käynnistää http-palvelimen paikallisen koneesi porttiin 5000, ja voit käyttää normaalia selainta toiminnan testaamiseen.

  • http://localhost:5000 — palauttaa tervetuloa-sivun.
  • http://localhost:5000/api/v1/fake?input=3 — APIn kutsuminen. Palauttaa json-objektin, jossa vastaus kyselyysi.

Siinäpä se oikeastaan oli. Olet nyt julkaissut mallisi python flask-sovelluksena. Kutsuit juuri onnistuneesti rajapintaa, joka palauttaa sinulle mallin antaman tuloksen.

Lopputulos

Homma hoidettu. Sinulla on nyt toimiva koulutussovellus, yhteinen tiedostovarasto malleille, sekä python flask-sovellus rajapinnan julkasua varten. Jos haluat päivittää malliasi, voit ajaa koulutussovelluksen milloin tahansa uudelleen. Päivitys yksinkertaisesti ylikirjoittaa vanhan mallin.

Voit myös luoda erillisen (virtuaalikone) palvelimen, ja laittaa julkaisusovelluksesi sinne ajettavaksi. Erillinen palvelin vastailisi tässä tapauksessa asiakasohjelmien http-pyyntöihin.

Mitä seuraavaksi?

Julkaisusovelluksen ajaminen erillisessä virtuaalikoneessa ei enää nykyisin ole kovin elegantti ratkaisu, vaikka näin asia ratkaistiinkin ennen pilvialustoja.

IRL, koneoppimisyhteisö ei toistaiseksi ole päässyt sopuun itsensä kanssa kuinka malleja tulisi julkaista. Tällä hetkellä näyttää siltä, että kontit olisivat todennäköinen voittava teknologia. Tässä artikkelissa esitetty menetelmä on erittäin yksinkertainen ja suoraviivainen, ja tukee täysin kontittamista. Tuotantoon julkaistu malli nyt on aina parempi kuin odottaa sitä, että muu maailma pääsee sopuun miten julkaisu (tai mallien hallinta) tulisi lopullisesti ratkaista.

Eli seuraavaksi: 1) Pakkaa API-sovelluksesi docker-konttiin (Dockerfile löytyy valmiina sovelluksen hakemistosta kokeilujasi varten). Tämän jälkeen 2) lataa valmis kontti container registryyn josta voit edelleen 3) julkaista sen mille tahansa konttien ajoalustalle jota olet tottunut käyttämään. Koneoppimismallien julkaisuun oma suosikkini on ehdottomasti Azuren Web App for Containers.

… mutta tämän kunnollinen läpikäynti on seuraavan artikkelin aihe.