Je voulais utiliser le modèle de machine learning [^ 1] créé en vérifiant la précision avec Yellowbrick sous la forme d'un serveur API prédictif, je l'ai donc créé avec Docker. Reportez-vous ici [^ 2] pour Flask et ici [^ 3] pour Docker, et visez la réponse du serveur API.
L'environnement est le suivant.
$sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G8037
Pour l'installation de Docker, je me suis référé à [^ 4]. Le journal était assez long, alors j'en ai omis une partie.
$docker version
Client: Docker Engine - Community
Version: 19.03.4
API version: 1.40
Go version: go1.12.10
(réduction)
Server: Docker Engine - Community
Engine:
Version: 19.03.4
API version: 1.40 (minimum version 1.12)
(réduction)
Tout d'abord, créez une image Docker à partir du Dockerfile. Créez un fichier avec le contenu suivant dans l'éditeur.
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
Créez une image avec la commande docker.
docker build . -t myflask/mlapi:1.0
Après un certain temps, le message suivant s'affiche et la construction est terminée.
Successfully built 4a82ed953436
Successfully tagged myflask/mlapi:1.0
Confirmez que l'image docker a été créée avec la commande `` images docker ''.
$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
Essayez d'entrer l'image du menu fixe et voyez si la bibliothèque peut être importée.
Confirmé que les bibliothèques python3 '' et
lightgbm '' peuvent être utilisées.
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()
Quittez l'image docker et créez un programme pour le serveur API dans l'environnement local.
Lorsque j'ai créé le modèle d'apprentissage automatique, j'ai enregistré le modèle avec joblib
[^ 1], donc j'utilise également joblib
pour charger le modèle.
Je me réfère à l'article ici [^ 2], mais comme la quantité d'éléments de données est différente, j'ai conçu la partie réceptrice.
Une fois, le contenu des `` fonctionnalités '' est passé au DataFrame des pandas pour prédire.
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)
Créez un répertoire dans l'environnement local pour stocker le programme ci-dessus et le modèle d'apprentissage automatique.
mkdir vol
mv lightgbm.joblib ./vol/
mv api.py ./vol/
Montez le répertoire vol créé ci-dessus avec la commande docker sur l'image docker et démarrez-le.
$docker run -it --rm -p 5000:5000 -v $(pwd)/vol:/home myflask/mlapi:1.0 /bin/bash
Lorsque vous exécutez api.py sous home, le serveur API démarre.
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)
Étant donné que le serveur est défini sur l'adresse IP 0.0.0.0 et le port 5000 ci-dessus, transmettons les données à prédire avec la commande curl
ici.
Étant donné que les données d'entraînement utilisent le load_bikeshare de Yellowbrick, les éléments sont alignés et emballés dans des fonctionnalités et transmis au serveur. J'ai fait une liste d'éléments de données afin qu'ils puissent être convertis en pandas DataFrame tels quels.
$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]}}'
Lorsque j'ai tapé la commande ci-dessus, la réponse est revenue comme ci-dessous. Yay.
{"Content-Type":"application/json","prediction":[34.67747315059312],"success":true}
Même si vous n'êtes pas familiarisé avec l'API ou le serveur REST, vous pouvez facilement le créer à l'aide de Docker ou Flask. La prochaine fois, j'aimerais faire quelque chose comme lancer une prédiction à partir d'une page Web et afficher la valeur renvoyée.
Recommended Posts