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で作成したグラフに入力と出力のプレースホルダーを追加する方法ですか?
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()
また、私の 完全な実装 も確認できます。
編集:そして私の答えがあなたの問題を解決した場合、ここに私に上向きを残してください:)
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"
ケラスについてはあまり知りません。私は何人かの専門家に相談しました、そして、以下はうまくいくはずです:
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')
いくつかの重要なポイント:
ここに役立つかもしれない別の答えがあります。すでに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
にエクスポートされます。