[PYTHON] Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt

Einführung

Ich wollte das maschinelle Lernmodell [^ 1] verwenden, das bei der Überprüfung der Genauigkeit mit Yellowbrick in Form eines prädiktiven API-Servers erstellt wurde, und habe es daher mit Docker erstellt. Lesen Sie hier [^ 2] für Flask und hier [^ 3] für Docker und zielen Sie auf die Antwort vom API-Server ab.

Umgebung

Die Umgebung ist wie folgt.

$sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G8037

Für die Installation von Docker habe ich auf [^ 4] verwiesen. Das Protokoll war ziemlich lang, daher habe ich einige davon weggelassen.

$docker version
Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.12.10
(Kürzung)
Server: Docker Engine - Community
 Engine:
  Version:          19.03.4
  API version:      1.40 (minimum version 1.12)
(Kürzung)

Bauen

Erstellen eines Docker-Images

Erstellen Sie zunächst ein Docker-Image aus der Docker-Datei. Erstellen Sie im Editor eine Datei mit den folgenden Inhalten.

FROM ubuntu:latest

RUN apt-get update
RUN apt-get install python3 python3-pip -y

RUN pip3 install flask
RUN pip3 install scikit-learn
RUN pip3 install numpy
RUN pip3 install scipy
RUN pip3 install lightgbm
RUN pip3 install joblib
RUN pip3 install pandas

Erstellen Sie ein Bild mit dem Docker-Befehl.

docker build . -t myflask/mlapi:1.0

Nach einer Weile wird die folgende Meldung angezeigt und der Bau ist abgeschlossen.

Successfully built 4a82ed953436
Successfully tagged myflask/mlapi:1.0

Bestätigen Sie, dass das Docker-Image mit dem Befehl Docker-Images erstellt wurde.

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myflask/mlapi       1.0                 4a82ed953436        7 minutes ago       782MB
ubuntu              latest              775349758637        2 days ago          64.2MB

Versuchen Sie, das Docker-Image einzugeben, und prüfen Sie, ob die Bibliothek importiert werden kann. Bestätigt, dass sowohl python3 als auch lightgbm Bibliotheken verwendet werden können.

root@117483d4b9ed:/# python3
Python 3.6.8 (default, Oct  7 2019, 12:59:55) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import lightgbm
>>> exit()

Programmerstellung für API-Server

Beenden Sie das Docker-Image und erstellen Sie ein Programm für den API-Server in der lokalen Umgebung. Als ich das Modell für maschinelles Lernen erstellt habe, habe ich das Modell mit joblib [^ 1] gespeichert, also habe ich auch joblib verwendet, um das Modell zu laden. Ich beziehe mich hier auf den Artikel [^ 2], aber da die Menge der Datenelemente unterschiedlich ist, habe ich den empfangenden Teil entworfen. Einmal wird der Inhalt von "Features" an den DataFrame von Pandas übergeben, um ihn vorherzusagen.


from joblib import load
import flask
import numpy as np
import pandas as pd
import lightgbm as lgb

# initialize our Flask application and pre-trained model
app = flask.Flask(__name__)
model = None

def load_model():
    global model
    model = load("./lightgbm.joblib")

@app.route("/predict", methods=["POST"])
def predict():
    response = {
        "success": False,
        "Content-Type": "application/json"
    }

    if flask.request.method == "POST":
        if flask.request.get_json().get("feature"):

            # read feature from json and convert to dataframe
            features = flask.request.get_json().get("feature")
            df_X = pd.DataFrame.from_dict(features)

            # predict
            response["prediction"] = model.predict(df_X).tolist()

            # indicate that the request was a success
            response["success"] = True
    # return the data dictionary as a JSON response
    return flask.jsonify(response)

if __name__ == "__main__":
    load_model()
    print("Server is running ...")
    app.run(host='0.0.0.0', port=5000)

API-Server starten

Erstellen Sie ein Verzeichnis in der lokalen Umgebung, um das obige Programm und das Modell für maschinelles Lernen zu speichern.

mkdir vol
mv lightgbm.joblib ./vol/
mv api.py ./vol/

Hängen Sie das oben mit dem Docker-Befehl erstellte vol-Verzeichnis in das Docker-Image ein und starten Sie es.

$docker run -it --rm -p 5000:5000 -v $(pwd)/vol:/home myflask/mlapi:1.0 /bin/bash

Wenn Sie api.py unter home ausführen, wird der API-Server gestartet.

root@5d1e3cf74246:/# cd home/
root@5d1e3cf74246:/home# python3 api.py 
Server is running ...
 * Serving Flask app "api" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Bestätigung der Antwort

Da der Server auf die IP-Adresse 0.0.0.0 und den obigen Port 5000 eingestellt ist, übergeben wir die Daten, die mit dem Befehl curl vorhergesagt werden sollen. Da die Trainingsdaten das load_bikeshare von Yellowbrick verwenden, werden die Elemente ausgerichtet und in Features gepackt und an den Server übergeben. Ich habe eine Liste von Datenelementen erstellt, damit sie unverändert in Pandas DataFrame konvertiert werden können.

$curl http://0.0.0.0:5000/predict -X POST -H 'Content-Type:application/json' -d '{"feature":{"season":[1], "year":[0], "month":[1], "hour":[0], "holiday":[0], "weekday":[6], "workingday":[0], "weather":[1], "temp":[0.24], "feelslike":[0.3], "humidity":[0.8], "windspeed":[0.0]}}'

Als ich den obigen Befehl eingab, kam die Antwort wie folgt zurück. Yay.

{"Content-Type":"application/json","prediction":[34.67747315059312],"success":true}

schließlich

Auch wenn Sie mit der REST-API oder dem Server nicht vertraut sind, können Sie diese problemlos mit Docker oder Flask erstellen. Das nächste Mal möchte ich so etwas wie eine Vorhersage von einer Webseite werfen und den zurückgegebenen Wert anzeigen.

Recommended Posts

Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
Ich habe versucht, die Vorhersage-API des maschinellen Lernmodells von WordPress aus aufzurufen
REST-API eines mit Python erstellten Modells mit Watson Machine Learning (CP4D-Edition)
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Ein Beispiel für einen Mechanismus, der eine Vorhersage von HTTP aus dem Ergebnis des maschinellen Lernens zurückgibt
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Ich bin ein Amateur am 14. Tag von Python, aber ich möchte maschinelles Lernen mit Scicit-Learn ausprobieren
Prognostizieren Sie das Geschlecht von Twitter-Nutzern durch maschinelles Lernen
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Aufzeichnung der ersten Herausforderung des maschinellen Lernens mit Keras
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
Ich habe einen IFTTT-Knopf gemacht, der den Eingang 2-Sesam mit 1 Knopf (über AWS Lambda) entsperrt.
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Verfahren zum Generieren und Speichern eines Lernmodells durch maschinelles Lernen, Erstellen eines API-Servers und Kommunizieren mit JSON über einen Browser
Ich habe ein Anomalieerkennungsmodell erstellt, das unter iOS funktioniert
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe einen Original-Programmführer mit der NHK-Programmführer-API erstellt.
Aufbau einer Auto-Sklearn-Umgebung, die maschinelles Lernen halbautomatisiert (Mac & Docker)
Ich habe versucht, ein Schätzmodell für Artikeltitel zu erstellen, die wahrscheinlich mit Qiita in Einklang stehen
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Erstellen Sie mit turicreate eine API, die Daten aus einem Modell zurückgibt
[Maschinelles Lernen] Überprüfen Sie die Leistung des Klassifikators anhand handgeschriebener Zeichendaten
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Management von Modellen für maschinelles Lernen, um Streitigkeiten mit der Unternehmensseite zu vermeiden
Erstellen Sie mit GCP + Docker + Jupyter Lab eine beliebige Umgebung für maschinelles Lernen
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe maschinelles Lernen mit liblinear versucht
Validieren Sie das Trainingsmodell mit Pylearn2
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Ich habe ein npm-Paket erstellt, um die ID der IC-Karte mit Raspberry Pi und PaSoRi zu erhalten
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ruft den Rückgabewert eines externen Shell-Skripts (ls) mit python3 ab
Ich habe den APL-Teil mit der Alexa-Fertigkeit "Industry Term Conversion" erstellt.
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Bestimmen Sie die Authentizität von veröffentlichten Artikeln durch maschinelles Lernen (Google Prediction API).
Greifen Sie mit Requests auf die Docker Remote API zu
Ich habe den Inhalt des Docker-Volumes überprüft
Ich habe mit Raspberry Pi ein System erstellt, das regelmäßig den Unbehaglichkeitsindex des Raums misst und eine LINE-Benachrichtigung sendet, wenn es sich um einen gefährlichen Wert handelt
Ich habe Sie dazu gebracht, das Ende der IP-Adresse mit L Chika auszudrücken
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Erstellen Sie mithilfe der COTOHA-API eine App, die gut mit Berichten von Personen funktioniert
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Rückblick auf den Wettbewerb für maschinelles Lernen, an dem ich zum ersten Mal gearbeitet habe
Die Geschichte der Lernmethode, mit der LinuC Level 1 nur mit ping -t erworben wurde