web-dev-qa-db-ja.com

Google Cloud MLを介したKerasモデルのデプロイ

APIを呼び出して予測できるように、Google Cloud MLを使用してKerasモデルをホストしようと思っています。私は物事のケラス側からいくつかの問題に遭遇しています。

これまでのところ、TensorFlowを使用してモデルを構築し、CloudMLにデプロイすることができました。これが機能するためには、基本的なTFコードにいくつかの変更を加える必要がありました。変更はここに文書化されています: https://cloud.google.com/ml/docs/how-tos/preparing-models#code_changes

Kerasを使用して同様のモデルをトレーニングすることもできました。モデルをTFで取得するのと同じexportおよびexport.meta形式で保存することもできます。

from keras import backend as K

saver = tf.train.Saver()
session = K.get_session()
saver.save(session, 'export')

欠けているのは、Kerasで作成したグラフに入力と出力のプレースホルダーを追加する方法ですか?

11
Matthew Jackson

Google Cloud ML Engineでモデルをトレーニングした後(チェックアウト この素晴らしいチュートリアル )、グラフの入力と出力に次の名前を付けました

signature = predict_signature_def(inputs={'NAME_YOUR_INPUT': new_Model.input},
                                  outputs={'NAME_YOUR_OUTPUT': new_Model.output})

トレーニング済みのケラスモデル「model.h5」の完全なエクスポート例を以下に示します。

import keras.backend as K
import tensorflow as tf
from keras.models import load_model, Sequential
from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants
from tensorflow.python.saved_model.signature_def_utils_impl import predict_signature_def

# reset session
K.clear_session()
sess = tf.Session()
K.set_session(sess)

# disable loading of learning nodes
K.set_learning_phase(0)

# load model
model = load_model('model.h5')
config = model.get_config()
weights = model.get_weights()
new_Model = Sequential.from_config(config)
new_Model.set_weights(weights)

# export saved model
export_path = 'YOUR_EXPORT_PATH' + '/export'
builder = saved_model_builder.SavedModelBuilder(export_path)

signature = predict_signature_def(inputs={'NAME_YOUR_INPUT': new_Model.input},
                                  outputs={'NAME_YOUR_OUTPUT': new_Model.output})

with K.get_session() as sess:
    builder.add_meta_graph_and_variables(sess=sess,
                                         tags=[tag_constants.SERVING],
                                         signature_def_map={
                                             signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
    builder.save()

また、私の 完全な実装 も確認できます。

編集:そして私の答えがあなたの問題を解決した場合、ここに私に上向きを残してください:)

14
Lausbert

Google Cloudでkerasを使用するには、setup.pyスクリプトを使用してそれをインストールし、gcloudコマンドを実行するのと同じ場所のフォルダーに配置する必要があることがわかりました。

├── setup.py
└── trainer
    ├── __init__.py
    ├── cloudml-gpu.yaml
    ├── example5-keras.py

そして、setup.pyに次のようなコンテンツを配置します。

from setuptools import setup, find_packages

setup(name='example5',
  version='0.1',
  packages=find_packages(),
  description='example to run keras on gcloud ml-engine',
  author='Fuyang Liu',
  author_email='[email protected]',
  license='MIT',
  install_requires=[
      'keras',
      'h5py'
  ],
  Zip_safe=False)

次に、次のようなgcloudで実行中のジョブを開始できます。

export BUCKET_NAME=tf-learn-simple-sentiment
export JOB_NAME="example_5_train_$(date +%Y%m%d_%H%M%S)"
export JOB_DIR=gs://$BUCKET_NAME/$JOB_NAME
export REGION=europe-west1

gcloud ml-engine jobs submit training $JOB_NAME \
  --job-dir gs://$BUCKET_NAME/$JOB_NAME \
  --runtime-version 1.0 \
  --module-name trainer.example5-keras \
  --package-path ./trainer \
  --region $REGION \
  --config=trainer/cloudml-gpu.yaml \
  -- \
  --train-file gs://tf-learn-simple-sentiment/sentiment_set.pickle

GPUを使用するには、モジュールにcloudml-gpu.yamlなどのファイルを次の内容で追加します。

trainingInput:
  scaleTier: CUSTOM
  # standard_gpu provides 1 GPU. Change to complex_model_m_gpu for 4 
GPUs
  masterType: standard_gpu
  runtimeVersion: "1.0"
3
Fuyang Liu

ケラスについてはあまり知りません。私は何人かの専門家に相談しました、そして、以下はうまくいくはずです:

from keras import backend as k

# Build the model first
model = ...    

# Declare the inputs and outputs for CloudML
inputs = dict(Zip((layer.name for layer in model.input_layers),
                  (t.name for t in model.inputs)))
tf.add_to_collection('inputs', json.dumps(inputs))

outputs = dict(Zip((layer.name for layer in model.output_layers),
                   (t.name for t in model.outputs)))
tf.add_to_collection('outputs', json.dumps(outputs))

# Fit/train the model
model.fit(...)

# Export the model
saver = tf.train.Saver()
session = K.get_session()
saver.save(session, 'export')

いくつかの重要なポイント:

  • モデルを作成した後、K.get_session()やfitなどを呼び出す前に、tf.add_to_collectionを呼び出す必要があります。
  • 予測リクエストを送信するときに参照する必要があるため、グラフに追加するときに、入力レイヤーと出力レイヤーの名前を必ず設定してください。
1
rhaertel80

ここに役立つかもしれない別の答えがあります。すでにkerasモデルがあると仮定すると、スクリプトの最後にこれを追加して、モデルのML Engine互換バージョン(プロトコルバッファー)を取得できるはずです。これを機能させるには、saved_model.pbファイルと変数を含む兄弟ディレクトリをML Engineにアップロードする必要があることに注意してください。 .pbファイルの名前はsaved_model.pbまたはsaved_model.pbtxtでなければならないことにも注意してください。

モデルが名前modelであると仮定します

from tensorflow import saved_model

model_builder = saved_model.builder.SavedModelBuilder("exported_model")                                                     
inputs = {                                                                          
    'input': saved_model.utils.build_tensor_info(model.input)                    
}                                                                                   
outputs = {                                                                         
    'earnings': saved_model.utils.build_tensor_info(model.output)                
}                                                                                                                                                
signature_def = saved_model.signature_def_utils.build_signature_def(             
    inputs=inputs,                                                                  
    outputs=outputs,                                                                
    method_name=saved_model.signature_constants.PREDICT_METHOD_NAME              
)                                                                            
model_builder.add_meta_graph_and_variables(                                         
    K.get_session(),                                                                
    tags=[saved_model.tag_constants.SERVING],                                    
    signature_def_map={saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_def
    })                                                                                                                                                                       
model_builder.save()   

モデルはディレクトリ/exported_modelにエクスポートされます。

0
Harry Moreno