[PYTHON] J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique

introduction

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.

environnement

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)

Construire

Créer une image Docker

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

Création de programme pour serveur API

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)

Démarrage du serveur API

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)

Confirmation de réponse

É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}

à la fin

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

J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
J'ai essayé d'appeler l'API de prédiction du modèle d'apprentissage automatique de WordPress
API REST du modèle réalisé avec Python avec Watson Machine Learning (édition CP4D)
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
Mise en place d'un modèle de prédiction des taux de change (taux dollar-yen) par machine learning
Je suis un amateur le 14e jour de python, mais je veux essayer l'apprentissage automatique avec scicit-learn
Prédire le sexe des utilisateurs de Twitter grâce à l'apprentissage automatique
Résumé du flux de base de l'apprentissage automatique avec Python
Bilan du premier défi du machine learning avec Keras
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)
J'ai fait un bouton IFTTT qui déverrouille l'entrée 2 lock sésame avec 1 bouton (via AWS Lambda)
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
J'ai fait une fonction pour vérifier le modèle de DCGAN
Procédure de génération et d'enregistrement d'un modèle d'apprentissage par machine learning, en faisant un serveur API et en communiquant avec JSON depuis un navigateur
J'ai créé un modèle de détection d'anomalies qui fonctionne sur iOS
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai créé un guide de programme original en utilisant l'API de guide de programme NHK.
Créer un environnement d'auto-apprentissage qui semi-automatise l'apprentissage automatique (Mac et Docker)
J'ai essayé de construire un modèle d'estimation des titres d'articles susceptibles de faire le buzz avec Qiita
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
Créer une API qui renvoie les données d'un modèle à l'aide de turicreate
[Apprentissage automatique] Vérifiez les performances du classificateur à l'aide de données de caractères manuscrites
J'ai fait un bot mou qui m'informe de la température
Gestion des modèles d'apprentissage automatique pour éviter de se quereller avec le côté commercial
Créez un environnement d'apprentissage automatique arbitraire avec GCP + Docker + Jupyter Lab
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai essayé l'apprentissage automatique avec liblinear
Validez le modèle d'entraînement avec Pylearn2
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
J'ai fait un package npm pour obtenir l'ID de la carte IC avec Raspberry Pi et PaSoRi
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
Obtenez la valeur de retour d'un script shell externe (ls) avec python3
J'ai créé la partie APL avec la compétence Alexa "Conversion des termes de l'industrie"
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Déterminez l'authenticité des articles publiés par machine learning (API Google Prediction).
Accéder à l'API Docker Remote avec des requêtes
J'ai vérifié le contenu du volume du docker
J'ai créé un système avec Raspberry Pi qui mesure périodiquement l'indice d'inconfort de la pièce et envoie une notification LINE s'il s'agit d'une valeur dangereuse
Je t'ai fait exprimer la fin de l'adresse IP avec L Chika
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
Créez une application qui fonctionne bien avec les rapports des utilisateurs à l'aide de l'API COTOHA
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
Retour sur le concours d'apprentissage automatique sur lequel j'ai travaillé pour la première fois
L'histoire de la méthode d'apprentissage qui a acquis LinuC Niveau 1 avec seulement ping -t