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

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

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

カスタム予測ルーチン

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

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

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

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

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

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

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

SavedModel について

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

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

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

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

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

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

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

AI プラットフォームでデプロイするには、SavedModel が 250 MB 以下の必要があります。これには、SavedModel プロトコル バッファ ファイル自体(つまり、saved_model.pb または saved_model.pbtxt)だけでなく、SavedModel ディレクトリのすべてのアセットと変数が含まれます。

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

SavedModel が 250 MB の制限を超えている場合:

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

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

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

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

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

Estimator をトレーニングおよび予測に使用している場合は、export_savedmodel 関数を使用して SavedModel を取得できます。それ以外の場合は、SavedModelBuilder を使用してモデルをエクスポートできます。SavedModelBuilder で正しいタグとシグネチャを使用してモデルをエクスポートする方法については、MNIST の例をご覧ください。

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

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

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

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

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

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

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

  • 詳細については、予測用の TensorFlow モデルの最適化手法を参照し、それらの手法を適用する例を学習してください。

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

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

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

詳しくは、グラフ変換ツールの使用をご覧ください。

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

サービスグラフをエクスポートする場合、重要なステップは、サービス入力関数を定義することです。これは、トレーニング プロセス全体に関連して、次の点で実行できます。

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

詳しくは、サービス入力関数をご覧ください。

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

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

  1. サービス入力関数を定義します。次のサンプルコードは国勢調査のサンプルに含まれています。

    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. export_savedmodel を使用して Estimator から SavedModel をエクスポートします。その際に、モデルへのパスを export_dir_base パラメータ、サービス入力関数の名前を serving_input_fn パラメータとして渡します。国勢調査の例では、使用される Estimator のタイプは tf.contrib.learn.DNNLinearCombinedClassifier です。

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

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

  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 を使用して export_savedmodel を呼び出します。その際に、モデルへのパスを 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 リストに追加します。

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

TensorFlow 用 AI Platform