[PYTHON] Créer une API qui renvoie les données d'un modèle à l'aide de turicreate

Aperçu

Il existe une bibliothèque d'apprentissage automatique Apple appelée turicreate. (Ce sont des modèles d'apprentissage automatique, donc ça devrait aller)

Un mémo lorsque j'ai fait une configuration pour gérer un modèle utilisant ceci sur GCP Référence: https://cloud.google.com/blog/products/ai-machine-learning/how-to-serve-deep-learning-models-using-tensorflow-2-0-with-cloud-functions

Constitution

Untitled (1).png

L'utilisateur accède au GAE, puis Cloud Run télécharge le modèle à partir du stockage et fonctionne. Bien sûr, cela n'a pas de sens de le sortir du stockage à chaque fois, donc le modèle chargé est mis en cache en mémoire.

Problème + solution

Dans la configuration de référence, le modèle Tensorflow est chargé par Cloud Functions et renvoyé en tant qu'API, mais dans le cas de Turicreate, il échoue probablement à se créer lors de la tentative de résolution de la dépendance, ce qui entraîne une erreur. (Cela peut être la même chose même si vous le faites avec GAE, vous devrez peut-être modifier les paramètres de Cloud Build, mais je ne savais pas si cela avait été touché depuis GAE ou Cloud Functions)

Par conséquent, j'ai décidé d'utiliser Cloud Run, qui vous permet de créer, déployer et exécuter votre propre image d'exécution.

la mise en oeuvre

L'implémentation elle-même n'est rien, suivant presque la configuration de python + CloudRun

main.py


import turicreate
import os
from flask import Flask, request, jsonify
from google.cloud import storage
import zipfile

model = None

app = Flask(__name__)


def download_model(bucket_name, source_blob_name, dest_blob_name):
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(source_blob_name)

    blob.download_to_filename(dest_blob_name)
    with zipfile.ZipFile(dest_blob_name) as modelZip:
        modelZip.extractall('.')


@app.route('/')
def root():
    global model
    request_json = request.get_json()

    if request.args and 'userId' in request.args:
        userId = request.args.get('userId')
    else:
        return jsonify({'message': 'userId is not found'}), 400
    if 'limit' in request.args:
        limit = int(request.args.get('limit'))
    else:
        limit = 10

    if model is None:
        load_model()

    result = model.recommend(users=[userId], k=limit)

    random.shuffle(result)
    return jsonify({'result': result})

def load_model():
    global model

    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './credential.json'
    download_model("learning-data", "model.zip", "./model.zip")
    model = turicreate.load_model('./model')
    

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=int(
        os.environ.get('PORT', 8080)), debug=False)
FROM python:3.7

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . .

RUN pip install -r requirements.txt

CMD [ "python", "main.py" ]

requirements.txt


turicreate==6.1
flask==1.1.1
gunicorn==20.0.4
google-cloud-storage==1.26.0

GAE est OK tant que vous accédez au service terminé

Tâche

→ Je réfléchis à la façon de définir les données en mémoire sur clé: heure, valeur: modèle afin que les données du modèle soient d'abord lues de manière asynchrone à un moment séparé.

Cette zone peut être utile https://cloud.google.com/run/docs/tips?hl=ja

Recommended Posts

Créer une API qui renvoie les données d'un modèle à l'aide de turicreate
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créer une API CRUD à l'aide de l'API rapide
Créer une application à l'aide de l'API Spotify
Créer un bloc de données à partir d'Excel à l'aide de pandas
Utilisez Matplotlib pour créer plusieurs graphiques linéaires à partir d'un bloc de données à la fois
Créons une API REST en utilisant SpringBoot + MongoDB
Créer un arbre phylogénétique à partir de Biopyton en utilisant ClustalW2
Création d'une application interactive à l'aide d'un modèle de rubrique
Créer un analyseur de données binaires à l'aide de Kaitai Struct
Créer un nuage de mots à partir de programmes académiques
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
Créez une API REST à l'aide du modèle appris dans Lobe et TensorFlow Serving.
Créez une application qui fonctionne bien avec les rapports des utilisateurs à l'aide de l'API COTOHA
Développer une API Web qui renvoie les données stockées dans DB avec Django et SQLite
Créer un bot de collecte de données en Python à l'aide de Selenium
Construire un modèle seq2seq en utilisant la vue d'ensemble de l'API fonctionnelle de Keras
[Go] Créez un outil qui renvoie la valeur de course du Pokémon reçu de l'entrée standard
Un mémo qui détecte le visage de l'image acquise à partir de la caméra Web avec OpenCV de Django et le renvoie.
Créer un pseudo serveur d'API REST à l'aide de pages GitHub
Construire un modèle seq2seq à l'aide de l'inférence API fonctionnelle de Keras
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
Création d'une API qui renvoie des résultats d'inférence négatifs-positifs à l'aide de BERT dans le framework Django REST
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
Un mémo qui lit les données de dashDB avec Python et Spark
Créez instantanément un diagramme de données 2D à l'aide de matplotlib de python
Créer un bloc de données à partir des données textuelles de course de bateaux acquises
Construire un modèle seq2seq en utilisant la création et l'apprentissage du modèle d'API fonctionnelle de Keras
Créez un robot de réponse automatique en temps réel à l'aide de l'API Twitter Streaming
Créez une API Web capable de fournir des images avec Django
Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform
Programme Python qui agrège l'utilisation du temps à partir des données icalendar
Créez un modèle de suivi facile à utiliser avec Django en utilisant ManyToManyField via
Créer une API avec Django
Créer un fichier de données factice
Créez un modèle pour stocker les informations de l'API Google Livres pour une manipulation et des tests intuitifs
J'ai trouvé un moyen de créer un modèle 3D à partir de photos Partie 01 Créer un environnement
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
[numpy] Créer une matrice de fenêtre mobile à partir de données de séries chronologiques multidimensionnelles
[Python / Django] Créer une API Web qui répond au format JSON
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
[Ev3dev] Créez un programme qui capture LCD (écran) en utilisant python
Créez facilement un TalkBot en utilisant Discord.py et l'API Talk d'A3RT (pya3rt).
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Utilisez ScraperWiki pour obtenir régulièrement des données de votre site Web
Obtenir des données Salesforce à l'aide de l'API REST
Acquisition de données à l'aide de l'API googlemap de python
Créer une interface graphique python à l'aide de tkinter
Créez un Dataframe pandas à partir d'une chaîne.
Une fonction qui renvoie un nom aléatoire
Créer un dictionnaire imbriqué à l'aide de defaultdict
Obtenez des données Amazon à l'aide de Keep API # 1 Obtenez des données
Mémo d'acquisition de données à l'aide de l'API Backlog
Créez une API en utilisant hug avec mod_wsgi
[Bases de la science des données] Acquisition de données à partir de l'API
Créer un modèle d'apprentissage à l'aide de MNIST