予測に使用する SavedModel のエクスポート

トレーニング済みモデルを AI Platform Prediction にデプロイし、そのモデルを予測に使用するには、まず、モデルを TensorFlow SavedModel 形式にエクスポートする必要があります。

このページでは、SavedModel を作成する際に考慮すべき重要な事項について説明します。SavedModel にエクスポートする方法の詳細については、SavedModels に関する TensorFlow ガイドKeras モデルの保存に関する TensorFlow ガイドをご覧ください。SavedModel を AI Platform Prediction にデプロイして予測を行う方法の詳細については、モデルのデプロイガイドをご覧ください。予測プロセスに関する一般的な背景情報については、予測の概要ページをご覧ください。

カスタム予測ルーチン

SavedModel をデプロイする代わりに、カスタム予測ルーチンを作成してデプロイすることもできます。カスタム予測ルーチンは、SavedModel(または別の方法で保存されたトレーニング済みモデル)を他のトレーニング アーティファクトと Python コードと組み合わせて、AI Platform Prediction が予測リクエストを処理する方法をカスタマイズできます。このように柔軟であるため、たとえば、モデルによって予測が行われる前に予測入力を前処理できます。

詳細については、カスタム予測ルーチンに関するガイドをご覧ください。

トレーニング グラフとサービスグラフについて

モデルをトレーニングして SavedModel としてエクスポートした場合、予測を取得する準備を整えるための重要なステップがあります。

トレーニング グラフとサービスグラフにはいくつかの重要な違いがあります。トレーニング グラフには、表示に適していない次のような機能が含まれています。

  • ファイル リーダー
  • 入力キュー
  • ドロップアウト レイヤ
  • 損失関数
  • オプティマイザー

サービス予測のプロセスにはトレーニングのプロセスとは異なるニーズがあるため、サービス予測用には明示的に個別のグラフをエクスポートすることをおすすめします。

SavedModel について

SavedModel は TensorFlow が推奨するモデルの保存形式で、トレーニングされた TensorFlow モデルを AI Platform Prediction にデプロイするために必要な形式です。トレーニングされたモデルを SavedModel としてエクスポートすると、アセット、変数、メタデータを含むトレーニング グラフは、AI Platform Prediction が予測用に使用し復元できる形式で保存されます。

SavedModel をエクスポートすると、SavedModel ディレクトリには次の内容が含まれます。

  • SavedModel プロトコル バッファに保存されたトレーニング グラフ
  • アセットと呼ばれる外部ファイル
  • チェックポイント ファイルとして保存される変数

SavedModel を AI Platform Prediction にデプロイするときは、グラフとそのメタデータを含む SavedModel プロトコル バッファ ファイルだけでなく、SavedModel ディレクトリ全体を含める必要があります。このファイルの拡張子は通常 .pb または .pbtxt です。

SavedModel を使用すると、同じアセットと変数(またはチェックポイント)を共有する複数のバージョンのグラフを保存できます。たとえば、同じグラフの 2 つのバージョン(CPU で実行するバージョンと GPU で実行するバージョン)を開発できます。

詳しくは、SavedModel ディレクトリの構造をご覧ください。

さまざまな TensorFlow API からのエクスポート

TensorFlow トレーニング コードから SavedModel をエクスポートする方法はいくつかあります。次のリストでは、さまざまな TensorFlow API に対応するいくつかの方法を示しています。

AI Explanations との互換性

モデルで AI Explanations を使用する場合は、SavedModel の追加要件をご覧ください。

モデルサイズを確認して調整する

レガシー(MLS1)マシンタイプを使用するモデル バージョンにデプロイする場合は、SavedModel を 500 MB 以下にする必要があります。Compute Engine(N1)マシンタイプを使用する場合は、10 GB まで使用できます。詳しくは、オンライン予測のマシンタイプをご覧ください。

このサイズ制限には、SavedModel プロトコル バッファ ファイル自体(つまり、saved_model.pb または saved_model.pbtxt)だけでなく、SavedModel ディレクトリのすべてのアセットと変数が含まれます。

開発時にモデルサイズを確認するには、SavedModel をエクスポートしてディレクトリのファイルサイズを確認します。

SavedModel が 500 MB の上限を超えている場合:

これらの手順を実行すると、SavedModel を 500 MB の上限に収めることができ、予測のレイテンシを減らすことができます。メリットとしては、パフォーマンスが向上し、割り当ての増加をリクエストして待機する必要がないことが挙げられます。

それでも割り当ての増加が必要な場合は、割り当ての増加のリクエスト方法をご覧ください。

最適な予測グラフを作成する

トレーニングでは、サービス予測に使用されない複数のチェックポイントが生成されます。これらのアーティファクトがなく、デプロイするモデルのみを含むディレクトリをアップロードしてください。

たとえば、トレーニング プロセス中に TensorBoard の可視化に関する概要をエクスポートする場合、それらが SavedModel に含まれていないことを確認する必要があります。これらの TensorBoard の概要は、予測グラフには必要ありません。

精度を下げてファイルサイズを減らす

変数と入力データの精度を下げることは、予測精度と引き換えに、モデルサイズを大幅に縮小することです。高精度データは、低精度データに比べて格納する際の効率が低下します。低精度のデータはノイズ源となりますが、ニューラル ネットワークはこのノイズを「無視」し、かなり正確な予測を生成します。

これらの方法を使用すると、ユースケースの予測精度が大幅に低下する場合は、割り当ての増加のリクエストを試してみてください。

  • 重みのサイズを小さくすることによってファイルサイズを縮小します。重みは、デフォルトでは効率的に保存するのが難しい浮動小数点の数になります。これらの非効率的に格納された重みは、モデルの全体的なファイルサイズに最も大きく影響します。

  • 精度を大幅に犠牲にすることなく、モデルのサイズを最大 75% 削減するために、連続データを量子化します。

  • 精度の低い変数を使用します。たとえば、データ型(dtype)を int64 から int32 に変更します。

  • SavedModel ディレクトリの assets フォルダにある他の入力特徴のサイズを減らします。たとえば、テキストデータの語彙サイズを小さくします。

  • 詳細については、予測用の TensorFlow モデルの最適化手法を参照し、それらの手法を適用する例を学習してください。リンク先の手法は、TensorFlow 1 を使用している場合にのみ適用されます。

SavedModels とグラフを検査するツール

TensorFlow は、入力書式や SignatureDefs など、SavedModel の健全性チェックに使用できるコマンドライン インターフェースを提供します。詳しくは、SavedModel CLI をご覧ください。

デプロイするモデルを最適化するには、TensorFlow のグラフ変換ツールを使用できます。このツールの使用方法はモバイル デプロイのコンテキストで説明されていますが、モバイル以外のデプロイ用のモデルを最適化するためにも使用できます。

サービス入力関数を作成する

tf.keras.Model.save を使用して SavedModel をエクスポートする場合は、サービス入力関数を指定する必要はありません。

それ以外の場合は、SavedModel をエクスポートするときにサービス入力関数を定義します。これは、トレーニング プロセス全体に関連して、次の点で行うことができます。

  • トレーニング プロセスの終了時。
  • トレーニングが完了した後の別のプロセスとして。

次の例は、トレーニング済み Estimator でこれを行う方法を示しています。詳しくは、Estimator のサービス入力関数をご覧ください。

トレーニング中にサービスグラフを作成する

これは通常、トレーニング プロセスの最後に発生しますが、まだトレーニングとつながっています。

  1. サービス入力関数を定義します。関数内で、機能の最も外側のディメンションが None であることを確認します。これはバッチサイズに対応しており、tf.placeholder を使用して機能の辞書のアイテム値を定義するときに、以下のようになります。次のサンプルコードは国勢調査のサンプルに含まれています。

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. tf.estimator.Estimator.export_saved_model を使用して Estimator から SavedModel をエクスポートします。その際に、モデルへのパスを export_dir_base パラメータ、サービス入力関数の名前を serving_input_fn パラメータとして渡します。国勢調査の例で使用されている Estimator の種類は tf.estimator.DNNLinearCombinedClassifier です。

トレーニングとは別にサービスグラフを作成する

すでにモデルをトレーニングしている場合は、再トレーニングをせずに予測を得ることができます。このプロセスは、トレーニング中にサービスグラフを作成する場合と非常によく似ています。主な違いは、トレーニングが終わった後に実行する別個の Python スクリプトでサービスグラフを作成することです。基本的な考え方としては、トレーニングで使用したものと同じ model_dirEstimator を構築してから、前のセクションで説明したように tf.estimator.Estimator.export_saved_model を呼び出します。

  1. トレーニングで定義したのと同じように、Python スクリプトでサービス入力関数を定義します。

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Estimator を作成するときは、model_dir パラメータをトレーニングで使用したのと同じパラメータに設定してください。これにより、以前に保存したモデルのチェックポイントを Estimator で使用できるようになります。

  3. 最後に、Estimator を使用して tf.estimator.Estimator.export_saved_model を呼び出します。その際に、モデルへのパスを export_dir_base パラメータ、サービス入力関数の名前を serving_input_fn パラメータとして渡します。

TensorFlow のタグとシグネチャ

SavedModel を tf.keras または TensorFlow Estimator からエクスポートする場合、エクスポートされたグラフはデフォルトで予測を開始できる状態になっています。

それ以外の場合は、TensorFlow 予測グラフを作成する際に、グラフのタグとシグネチャを正しい値を指定する必要があります。TensorFlow がグラフのタグ値とシグネチャ値として指定する定数は、次の目的で使用されます。

  • 予測用に SavedModel のグラフを選択するため
  • 予測グラフ用に予測シグネチャを作成していることを示すため

シグネチャは、グラフの入力と出力を定義します。予測グラフのシグネチャを作成する際は、build_signature_def 内の method_name パラメータとして、有効なシグネチャ定数を指定する必要があります。予測には、通常 PREDICT_METHOD_NAME が最適です。

タグを使用して、予測の生成に使用する SavedModel のグラフを指定する必要があります。add_meta_graph_and_variables で、tag_constants.SERVINGtags リストに追加します。

タグとシグネチャに適正な定数を使用して予測グラフを作成する方法のをご覧ください。

次のステップ