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.
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)
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()
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)
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)
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}
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.