Serverivälise masinõppe mikroteenuse juurutamine AWS Lambda, AWS API Gateway ja scikit-learning abil

Selles õpetuses juurutame masinõppega mikroteenuse, kasutades AWS Lambda, AWS API Gateway ja scikit-learning. Kaasatud koodide hoidla leiate aadressilt https://github.com/patrick-michelberger/serverless-machine-learning.

Enne alustamist veenduge, et kasutate Python 2.7 või Python 3.6 ja kas teil on kehtiv AWS-konto ning AWS-i mandaadifail on õigesti installitud.

1. samm: koolitage põhimudelit

Esiteks koolitame iirise andmestikul 3-klassilise gradiendiga võimendatud otsustuspuu logistilise regressioonimudeli, kasutades juhendina scikit-Learn õpetust. Valige mudel kui mudel.pkl.

Pole tähtis, kui hea see mudel selle häkkimise jaoks sobib, selleks on vaja lihtsalt ennustada. Siin on minu täielik mudelikoolitus ja sarjastamise skript.

sklearni impordi andmekogumitest
saidist sklearn.ensemble importige GradientBoostingClassifier
saidilt sklearn.externals imporditakse joblib
# andmete importimine
iiris = datasets.load_iris ()
X = iris.data [:,: 2] # võtame ainult kaks esimest funktsiooni.
Y = iris.target
# init mudel
clf = GradientBoostingClassifier (n_estimators = 100, learning_rate = 1,0, max_depth = 2, random_state = 0)
# sobiv mudel
clf.fit (X, Y)
# salvesta mudel
joblib.dump (clf, 'model.pkl')

2. samm: laadige oma mudel üles AWS S3

Esmalt peame oma mudeli üles laadima S3 ämbrisse.

aws s3 cp model.pkl s3: // yourbucketname

3. samm: kolbiliidese API loomine

Loome projektikataloogi

mkdir serverless-machine-learning
cd serverless-masinõpe

Pakime kogu oma koodi ja sõltuvused virtuaalsesse keskkonda.

pip install virtualenv
virtualenv oma_virtuaalne_keskkonna_nimi
hankige oma_virtuaalne_keskkonna_nimi / prügikast / aktiveerige

Nüüd oleme valmis oma API-d üles ehitama. Looge kataloogi api koos failiga app.py ja kirjutage see sinna:

kolbist importkolb, taotlus, json
import boto3
import hapukurk
BUCKET_NAME = 'serveriteta masinõpe'
MODEL_FILE_NAME = 'model.pkl'
rakendus = kolb (__ nimi__)
S3 = boto3.client ('s3', piirkonna_nimi = 'eu-keskne-1')
@ app.route ('/', meetodid = ['POST'])
def indeks ():
    # Sõeluge mudeli sisestamise päringu sisu
    body_dict = request.get_json (vaikne = tõene)
    data = body_dict ['andmed']
    
    # Laadige mudel
    mudel = laadimismudel (MODEL_FILE_NAME)
# Tee ennustus
    ennustus = mudel.ennusta (andmed) .tolist ()
# Vastake ennustustulemusega
    tulemus = {'ennustus': ennustus}
   
    naase json.dumps (tulemus)
kui __name__ == '__main__':
    # kuulake kõiki IP-sid
    app.run (host = '0.0.0.0')

Kood on põhimõtteliselt iseenesestmõistetav. Teeme Flaski objekti, kasutame oma marsruutide määratlemiseks dekoraatori funktsioone 'marsruut' ja kutsume käitamisfunktsiooni, kui me seda kohapeal kasutame (mida saate kinnitada, helistades python api / app.py ja külastades brauseris localhost: 5000). )

Mudeli laadimiseks S3-st kasutame järgmist abistaja funktsiooni:

def load_model (võti):
    # Laadige mudel S3-ämbrist
    response = S3.get_object (kopp = BUCKET_NAME, võti = võti)
# Laadige hapukurgi mudel
    model_str = vastus ['keha']. loe ()
    mudel = hapukurk.koormus (mudel_str)
    
    tagastamise mudel

Märkus. Githubi hoidlas olev kood kasutab mudeli faili vahemällu salvestamiseks pärast S3-vormingust kustutamist märkusega, mis välistab vajaduse S3-i andmeedastuse täiendava edastamise järele ja viib ennustamiseni oluliselt kiiremini.

4. samm: konfigureerige AWS Lambda & API Gateway

Nii AWS Lambda kui ka API Gateway loomiseks ja konfigureerimiseks kasutame raamistikku nimega Zappa. Mõelge sellele kui teie Pythoni rakenduste serverivabale veebimajutusele.

See tähendab lõpmatut suurust, null seisakuid, null hooldust - ja vaid väikese osaga teie praeguse juurutamise kuludest!

Alustame siis: kõigepealt installime vajalikud paketid oma virtuaalsesse keskkonda.

pip install zappa sklearn tuhkjas skipy

Järgmisena lähtestame Zappa.

zappa init

Zappa on automaatselt loonud konfiguratsioonifaili zappa_settings.json:

{“Dev”:
    {“App_function”: “api.app.app”,
      “Aws_region”: “eu-central-1”,
      „Profiili_nimi”: „vaikimisi”,
      “Projekti_nimi”: “serverivaba masinõpe”,
      “Käitusaeg”: “python3.6”,
      “Slim_handler”: tõsi,
      "s3_bucket": "zappa-10z1mxwy2"
    }
}

Sellega määratletakse keskkond nimega dev (hiljem võite soovi korral lisada ka lavastus- ja tootmiskeskkonnad), määratleme selle S3-ämbri nime, mida me kasutusele võtame, ja osutab Zappa WSGI-ühilduvale funktsiooni, sel juhul meie rakenduse Flask objekti.

Seadistades konfiguratsiooniparameetri slim_handler väärtuseks true, lubab Zappa laadida koodi Amazon S3-st juhul, kui meie keskkond ületab maksimaalse 50 MB.

5. samm: API testimine lokaalselt

API-d saab kohapeal testida nagu tavalist Flaski rakendust

Esiteks käivitage Flaski rakendus nagu tavaliselt:

$ python api / app.py

Teiseks tehke test API kõne

$ http POST localhost: 5000 
# payload.json
{
  "andmed": [[6.2, 3.4], [6.2, 1]]
}

Vastus peaks olema

{"ennustus": [2, 1]}

6. samm: juurutamine AWS Lambdasse

Nüüd oleme valmis AWS-i kasutusele võtma. See on nii lihtne kui:

$ zappa juurutab dev

Ja meie serverita masinõppe mikroteenus on elus!

$ http POST https://ic06qkgrbc.execute-api.eu-central-1.amazonaws.com/dev 

Palju õnne, olete serveriteta masinõppega mikroteenuse juurutamiseks kõik vajalikud sammud lõpetanud. Loodetavasti teile projekt meeldis.

Githubi hoidla: https://github.com/patrick-michelberger/serverless-machine-learning

Kui teil on probleeme rakenduse töölerakendamisega, võtke mulle julgelt vastu.