SIG TFX-Addonsコミュニティに参加して、TFXをさらに改善するのを手伝ってください!

TensorFlowモデルの提供

このチュートリアルでは、TensorFlow Servingコンポーネントを使用して、トレーニング済みのTensorFlowモデルをエクスポートし、標準のtensorflow_model_serverを使用してサービスを提供する方法を示します。 TensorFlow Servingに既に精通していて、サーバー内部がどのように機能するかについて詳しく知りたい場合は、 TensorFlowServingの高度なチュートリアルを参照してください

このチュートリアルでは、手書きの数字を分類する単純なSoftmax回帰モデルを使用します。これは、FashionMNISTデータセットを使用した画像分類に関するTensorFlowチュートリアルで紹介したものと非常によく似ています。

このチュートリアルのコードは、次の2つの部分で構成されています。

  • モデルをトレーニングおよびエクスポートするPythonファイルmnist_saved_model.py

  • Aptを使用してインストールするか、C ++ファイル( main.cc )からコンパイルできるModelServerバイナリ。 TensorFlow Serving ModelServerは、エクスポートされた新しいモデルを検出し、それらを提供するためにgRPCサービスを実行します。

始める前に、まずDockerをインストールします。

TensorFlowモデルのトレーニングとエクスポート

トレーニング段階のために、TensorFlowグラフはTensorFlowセッションで起動されるsessとして入力テンソル(画像)と、 xとして出力テンソル(ソフトマックススコア) y

次に、TensorFlowのSavedModelBuilderモジュールを使用してモデルをエクスポートします。 SavedModelBuilderは、トレーニングされたモデルの「スナップショット」を信頼できるストレージに保存して、後で推論のためにロードできるようにします。

SavedModelフォーマットの詳細については、のマニュアルを参照してくださいSavedModel README.mdを

mnist_saved_model.pyから、モデルをディスクに保存する一般的なプロセスを説明する短いコードスニペットを次に示します。

export_path_base = sys.argv[-1]
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
    sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.compat.v1.saved_model.signature_constants
            .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.compat.v1.tables_initializer(),
    strip_default_attrs=True)
builder.save()

SavedModelBuilder.__init__は、次の引数を取ります。

  • export_pathは、エクスポートディレクトリのパスです。

SavedModelBuilderは、ディレクトリが存在しない場合はディレクトリを作成します。この例では、コマンドライン引数とFLAGS.model_versionを連結して、エクスポートディレクトリを取得します。 FLAGS.model_versionは、モデルのバージョンを指定します。同じモデルの新しいバージョンをエクスポートする場合は、より大きな整数値を指定する必要があります。各バージョンは、指定されたパスの下の異なるサブディレクトリにエクスポートされます。

次の引数を指定してSavedModelBuilder.add_meta_graph_and_variables()を使用すると、 SavedModelBuilder.add_meta_graph_and_variables()と変数をビルダーに追加できます。

  • sessエクスポートする訓練されたモデルを保持しているTensorFlowセッションです。

  • tagsは、メタグラフを保存するためのタグのセットです。我々はサービンググラフを使用するので、この場合には、我々が使用serve事前定義されたSavedModelタグ定数からタグ。詳細については、 tag_constants.pyおよび関連するTensorFlowAPIドキュメントを参照してください。

  • signature_def_map tensorflowへの署名のためにユーザーが提供するキーのマップを指定します:: SignatureDefは、メタグラフに追加します。シグニチャは、エクスポートされるモデルのタイプと、推論を実行するときにバインドする入力/出力テンソルを指定します。

    特別な署名キーserving_defaultは、デフォルトのサービング署名を指定します。デフォルトのサービングシグニチャ定義キーは、シグニチャに関連する他の定数とともに、SavedModelシグニチャ定数の一部として定義されています。詳細については、 signature_constants.pyおよび 関連するTensorFlowAPIドキュメントを参照してください。

    さらに、署名定義を簡単に作成できるように、SavedModelAPIは 署名定義ユーティリティを提供します。具体的には、元のmnist_saved_model.pyファイルでsignature_def_utils.build_signature_def()を使用してpredict_signatureclassification_signatureを作成します。

    predict_signature定義方法の例として、utilは次の引数を取ります。

    • inputs={'images': tensor_info_x}は、入力テンソル情報を指定します。

    • outputs={'scores': tensor_info_y}は、スコアテンソル情報を指定します。

    • method_nameは、推論に使用されるメソッドです。予測リクエストの場合は、 tensorflow/serving/predictに設定する必要があります。その他のメソッド名については、 signature_constants.pyおよび 関連するTensorFlowAPIドキュメントを参照してください。

tensor_info_xtensor_info_yは、 ここで定義されているtensorflow::TensorInfoプロトコルバッファの構造を持っていることに注意してください。テンソル情報を簡単に作成するために、TensorFlow SavedModel APIは、関連するTensorFlowAPIドキュメントとともにutils.pyも提供します

また、 imagesscoresはテンソルエイリアス名であることに注意してください。これらは任意の一意の文字列にすることができ、後で予測要求を送信するときにテンソルバインディングで参照するテンソルxおよびy論理名になります。

たとえば、 x 「long_tensor_name_foo」という名前のテンソルを参照し、 y 「generated_tensor_name_bar」という名前のテンソルを参照する場合、 builderはテンソルの論理名を実名へのマッピング( 'images'-> 'long_tensor_name_foo')および( 'scores '->' generate_tensor_name_bar ')。これにより、ユーザーは推論を実行するときに論理名でこれらのテンソルを参照できます。

実行してみましょう!

まず、まだ行っていない場合は、このリポジトリをローカルマシンに複製します。

git clone https://github.com/tensorflow/serving.git
cd serving

エクスポートディレクトリがすでに存在する場合は、クリアします。

rm -rf /tmp/mnist

それでは、モデルをトレーニングしましょう。

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

これにより、次のような出力が得られます。

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

それでは、エクスポートディレクトリを見てみましょう。

$ ls /tmp/mnist
1

上記のように、モデルの各バージョンをエクスポートするためのサブディレクトリが作成されます。 FLAGS.model_versionのデフォルト値は1であるため、対応するサブディレクトリ1が作成されます。

$ ls /tmp/mnist/1
saved_model.pb variables

各バージョンのサブディレクトリには、次のファイルが含まれています。

  • saved_model.pbは、シリアル化されたtensorflow :: SavedModelです。これには、モデルの1つ以上のグラフ定義と、署名などのモデルのメタデータが含まれます。

  • variablesは、グラフのシリアル化された変数を保持するファイルです。

これで、TensorFlowモデルがエクスポートされ、ロードする準備が整いました。

エクスポートされたモデルを標準のTensorFlowModelServerでロードします

Dockerサービングイメージを使用して、サービング用のモデルを簡単にロードします。

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

サーバーをテストする

提供されているmnist_clientユーティリティを使用してサーバーをテストできます。クライアントはMNISTテストデータをダウンロードし、それらをリクエストとしてサーバーに送信し、推論エラー率を計算します。

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

これは次のようなものを出力するはずです

    ...
    Inference error rate: 11.13%

トレーニングされたSoftmaxモデルでは約90%の精度が期待され、最初の1000個のテスト画像で11%の推論エラー率が得られます。これにより、サーバーがトレーニング済みモデルを正常にロードして実行したことが確認されます。