Google Cloud ML: HowTo: Cloud ML のための TensorFlow アプリケーション作法
Google Cloud ML では、クラウドで TensorFlow トレーナー・アプリケーションを実行することによってモデルをトレーニングします。実行させるためには、アプリケーションに2、3の変更を行ない、トレーニング・サービスが利用できる形式にする必要があります。
つまり Google Cloud ML でトレーニングして予測のためにホスティングするには、TenosrFlow のトレーナー・アプリケーションのコード変更が必要なわけです。
以下のドキュメントにこの必要なステップについて記述してありますので、要点をまとめてみました :
Preparing Your TensorFlow Application for Training in the Cloud
* 動作確認済みです。
* あくまでベータですので仕様が変更される可能性はありますのでご注意ください。
出力を定義する
トレーニングの間貴方は多分個々のインスタンスのために予測をエクスポートすることはしなかったでしょう、何故なら集約 (aggregates) は重要だからです。予測のためにモデルを配備する準備をする際には、一つあるいはそれ以上の出力テンソルを作成する必要があります。入力テンソルと同じ shape と共に、モデル・タイプのための適切なタイプの出力テンソルが通常は必要です。モデルの特定な要請に適合するよう異なる値を出力するために TenosrFlow グラフを構成することができます。
例えば、Google Cloud Machine Learning : 入門編 (3) – 予測 で使用されたサンプルではトレーニングの間にロジット層から raw スコアを生成するだけのモデルから始めます。 予測のためには、すべての可能性ある数字の確率分布に加えて、モデルが決定した、入力画像により尤もらしいと表される数字 (i.e. 0 から 9) を出力することを望みます。
このためには、TensorFlow グラフに以下の ops を追加しました :
prediction = tf.argmax(logits, 1) scores = tf.nn.softmax(logits)
入力を作成する
配備するモデルは、入力値を受け取るための適切な型の一つあるいはそれ以上の入力テンソルを含むべきです。これは推論グラフにおける TensorFlow プレースホルダー であるべきです。
可変なバッチ・サイズをサポートする
トレーニングのためにグラフをセットアップする共通の方法は固定されたバッチサイズを使用することです。これは予測可能なサイズの入力データのテンソルを渡すことを簡単にします。予測のためにモデルを使用する準備ができた時、様々な数のインスタンスとともに予測リクエストを発行するクライアントをサポートするために、可変サイズの入力バッチをサポートすることを望むかもしれません。
これは、Google Cloud Machine Learning : 入門編 (3) – 予測 で使用されているサンプルでデモされているように、予測グラフにおいて入力テンソルのバッチ次元を None に設定することで成されます :
keys_placeholder = tf.placeholder(tf.int64, shape=(None,)) images_placeholder = tf.placeholder(tf.float32, shape=(None, mnist.IMAGE_PIXELS)) labels_placeholder = tf.placeholder(tf.int32, shape=(None,))
インスタンス・キーを使用する
バッチ予測サービスは入力とは異なった順序で出力を書き出すかもしれませんので、入力インスタンスを出力予測とマッチできるように配備したモデルは一意のキーを使用してインスタンスを識別するべきです。
一つまたはそれ以上のキー (e.g. 単純な連続整数値) を予測時のインスタンスに追加できます。これを行なう一つの単純な方法は適切な型のプレースホルダーを追加して、入力データと同じ shape を使い、それをそのまま予測結果にスルーして渡すことです。
次はサンプルからの例です :
keys_placeholder = tf.placeholder(tf.int64, shape=(None,)) # To be able to extract the id, we need to add the identity function. keys = tf.identity(keys_placeholder)
注意 : キーは必ずしも入力を通して直接渡す必要はありません; 実行時に計算される推論グラフにおける内部的なテンソルかもしれません。
グラフに入力と出力コレクションを追加する
Cloud ML 予測サービスがトレーニングしたモデルを実行できるようにするには、TensorFlow グラフ・コレクション における 入力と出力テンソルをそれぞれ inputs と outputs という名前で指定しなければなりません。これを行なうには各コレクションの辞書を作成してその JSON serialized 表現を tf.add_to_collection でグラフに追加します。
内部的なテンソル名の代わりに、予測のための入力あるいは出力テンソルを表すためにエイリアスを使用できます。 これらのエイリアスは、バッチ予測のための入力/出力ファイルあるいはオンライン予測のためのリクエスト/レスポンスにおいてテンソルに名前をつけるために使用されます。
以下はサンプルからの例です :
inputs = {'key': keys_placeholder.name, 'image': images_placeholder.name} tf.add_to_collection('inputs', json.dumps(inputs)) outputs = {'key': keys.name, 'prediction': prediction.name, 'scores': scores.name} tf.add_to_collection('outputs', json.dumps(outputs))
これは Cloud ML 予測サービスが :
- 各予測入力に ‘key’ と ‘image’ を含むことを想定して
- ‘key’, ‘prediction’, そして ‘scores’ を返す
ことを保証してくれます。
最終的なモデルをエクスポート(保存)する
トレーニング・スクリプトがモデルのトレーニングを終えたら、TensorFlow : How To : 変数: 作成、初期化、保存そしてロード のための標準的な手続きを使ってグラフをエクスポートします。 特に実行中のセッションを復旧してそれを MetaGraph にエクスポートするためには tf.train.Saver() を使います。
貴方のグラフはモデルの効率性や精度を助ける幾つかの ops を多分含むでしょう、しかしそれらは予測では使用されません。例えば、貴方のトレーニング・モデルに過学習に対するガードとしてトレーニング・データの複数表現を育成することを押し進めるためにドロップアウトを使うことを選択するかもしれません。一般的には配備モデルにおいてはそのような ops を含めることを望まないでしょう。トレーニング仕様の ops の全てを省くために、最終的なエクスポートの前に TensorFlow グラフを再構築すべきです。
注意 : ドロップアウトのような幾つかのケースでは、TensorFlow はトレーニング中心の ops をトレーニングのためには有効にしてテストと予測のためには無効にするように configure することを可能にします。予測のための配備の前にそのような ops をモデルから完全に削除するか configuration の変更だけにするかは貴方次第です。
以下はサンプルから最終的なモデルをエクスポートする例です :
if not os.path.isdir(FLAGS.model_dir): os.makedirs(FLAGS.model_dir) saver.save(sess, os.path.join(FLAGS.model_dir, 'export')
エクスポート・ファイルを configure する
Cloud ML の予測サービスとの互換性のために、モデルは TensorFlow グラフ・ファイルと TensorFlow metagraph にエクスポートされなければなりません。これらのファイルはそれぞれ export と export.meta という名前でなければなりません。
TensorFlow アプリケーションへの変更
コマンドライン引数
Cloud ML は実行時、トレーナー・モジュールにコマンドライン引数を渡すことができます。アプリケーションにどのような引数が必要かを決めるのは貴方次第ですが、通常はこれらの引数を少なくともハイパーパラメータ値 (e.g. 隠れ層のサイズ) とチェックポイントを書き出す Google Storage パスを指定するために使うことを望むでしょう。
コードをパッケージ化する
貴方の既存の TensorFlow コードを Google Cloud Machine Learning と共に利用するためには、それを Python モジュールに含めなければなりません。多くの場合、それはサブディレクトリに __init__.py という名前の空ファイルと共に配置することを意味します。
もし貴方のトレーナーコードが依存としての追加の Python ライブラリを必要としないのであれば、gcloud beta ml jobs submit training はトレーニングコードを自動的にパッケージ化してトレーニングジョブのワーカーに配備します。
もしトレーナーコードが local.tar.gz あるいは .whl Python パッケージファイルとして利用可能な追加の Python ライブラリを必要とするならば、それらのパスを gcloud beta ml jobs submit training –packages フラグを使って指定可能です。
けれども、もしトレーナーコードが PyPi からの追加の Python パッケージを必要とするか、他のカスタムパッケージングを必要とするのであれば、カスタム setup.py ファイルを作成する必要があります。これについては次のセクションで記述されます。
パッケージをカスタマイズする
貴方のプロジェクトのためにカスタム・パッケージ仕様を作成するためには多くの方法があります。Setuptools を使った幾つかの簡単な説明をしておきます。
プロジェクトの root ディレクトリで setup.py という名前のスクリプトを作成します。このファイルに次のコードを入力します :
from setuptools import find_packages from setuptools import setup setup( name='your package name', version='your version number', packages=find_packages())
Setuptools のためにはより多くのオプションがあり、それらについては developer’s guide で見つかります。
トレーニング・ジョブを submit するために “gcloud beta ml jobs submit training” を実行する時、–package-path フラグを通常のようにトレーナー・モジュールを含むディレクトリに対してセットします; gcloud はデフォルトパッケージ仕様を使用する代わりに <–package-path>/../setup.py で指定されたようにトレーナー・コードをパッケージ化します。
以上