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
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.
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.
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é
→ 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