Slide 1

Slide 1 text

Tensorflow Serving Software Engineer ynqa

Slide 2

Slide 2 text

About Me SysML Team @Mercari GitHub: @ynqa Twitter: @yn_9a Go/Python/Kubernetes/TF Serving 最近はkubeflow/TF Servingにコントリビュート したりしなかったり → TF Servingの話をします

Slide 3

Slide 3 text

Tensorflow Serving

Slide 4

Slide 4 text

Tensorflow Serving - 主にTensorflowのモデルにおける推論部分を APIとして提供するためのインターフェース - gRPC/REST - 他にも: Seldon, PredictionIO, MLFlow etc… - C++実装, ビルドツールはbazelを利用 - Versioning - Load/Unload

Slide 5

Slide 5 text

Tensorflow Serving - Versioning - Version numberにおいて最新版を常に loadするような実装 - E.g. ディレクトリ `/model_name/10` 以下のモデルがServingされている状態で、 `model/9` がuploadされた場合、そのモデルは loadされない - 最新のモデルが削除された場合は、 1つ前のモデルにrollbackされる - Load/Upload - すべてのモデル/バージョンをServingするわけにもいかないので、新しいモデルを load する前に古いモデルの unloadを行う

Slide 6

Slide 6 text

Tensorflow Serving - Versioning Policy - ...とはいえ、特定のモデルを指定したい場合もある - Configで設定可能: Latest, All, Specific - https://github.com/tensorflow/serving/blob/1.9.0/tensorflow_serving/sources/ storage_path/file_system_storage_path_source.proto#L8-L37 - Pluggable - VersioningやLoaderはカスタマイズ可能 - 既存のコンポーネントを利用した上で独自の Serviceを定義することも可能 - more details… - https://www.tensorflow.org/serving/architecture_overview

Slide 7

Slide 7 text

Tensorflow Serving: gRPC Services

Slide 8

Slide 8 text

Tensorflow Serving: gRPC Services - Inferences - Classify, Regress, Predict - 各メソッド名に対応するグラフの計算結果を返す - MultiInference - 1つのリクエストから複数の指定されたメソッド名( Regress/Classify)に対応するグ ラフの計算結果を返す

Slide 9

Slide 9 text

Tensorflow Serving: gRPC Services - Others - GetModelMetadata - 現在はモデルのsignaturedefのみを取得する - GetModelStatus - モデルのステートを取得する - Start, Loading, Available, Unloading, End - https://github.com/tensorflow/serving/blob/1.9.0/tensorflow_serving/apis/get _model_status.proto#L26-L54 - HandleReloadConfigRequest - configのリロードを行うための受け口

Slide 10

Slide 10 text

Tensorflow Serving: gRPC Services - REST - 1.8〜 - http周りはlibeventのevhttp、Json parserはrapidjsonを利用して実装 Regress/ClassifyのRequest Endpoints PredictのRequest

Slide 11

Slide 11 text

Tensorflow Serving: Inference

Slide 12

Slide 12 text

Tensorflow Serving: Inference - gRPC Services about inference: - Predict - Signatureにおけるoutputsの計算結果を返す - Regress - Signatureにおけるメソッド名が tensorflow/serving/regressのoutputsの計算結果 を返す - Classify - 同様にtensorflow/serving/classifyのoutputsの結果を返す - 他の2つと異なる点はscore/classの2つの結果が存在する - score: 予測値、class: 所属するクラス

Slide 13

Slide 13 text

Tensorflow Serving: Inference - Diff of input format: - Predict - repeatedで各型における入力がそれぞれ定義されているので listライクに入力す ることが可能 - https://github.com/tensorflow/tensorflow/blob/v1.9.0/tensorflow/core/frame work/tensor.proto - Regress/Classify - TensorflowのExampleの形式 - Input > ExampleList > [Example...] > Features > [Feature...] > value - https://github.com/tensorflow/tensorflow/blob/v1.9.0/tensorflow/core/examp le/example.proto

Slide 14

Slide 14 text

Tensorflow Serving: SavedModel

Slide 15

Slide 15 text

Tensorflow Serving: Signature - Signature/SignatureDef - モデルに対する入出力、およびメソッド名が記述されたもの - Signatureの内容が知りたい: - SavedModelを.txt形式で保存する(as_text=True) - saved_model_cliのshowを利用する - scanでMetaGraphも閲覧可能 - Servingのためのデバッグにも有効

Slide 16

Slide 16 text

Tensorflow Serving: SavedModel - Servingするモデルの準備 - Tensorflowの学習済みモデルを SavedModelとしてエクスポートすることで Servableなオ ブジェクトの生成を行う - SavedModel - モデルのメタ情報を含んだモデルフォーマット、 signatureも含まれます - Format: protobuf | txt - https://divis.io/2018/01/enterprise-tensorflow-2-saving-a-trained-model/ - SavedModelをエクスポートする選択肢 : - tf.saved_model.builder.SavedModelBuilder - tf.estimator.Estimator.export_savedmodel

Slide 17

Slide 17 text

Tensorflow Serving: Example

Slide 18

Slide 18 text

Example: 入力を2倍して出力するグラフとその signature ※ SavedModelに変換する部分は省略

Slide 19

Slide 19 text

Tensorflow Serving: Example 1. tensorflow/serving/classifyのメソッド名を持つsignatureが存在しない - Classifyのリクエスト時にAbortionErrorが発生することがわかる - 以下は double_xに対するClassify(Regressも同様)の呼び出し時のエラー

Slide 20

Slide 20 text

Tensorflow Serving: Example 2. double_x_regressのinputsのdtypeがDT_FLOATになっている - Regress/Classifyにおけるリクエストは、 TFのExampleのbinary serializedされたprotobuf (String)を与えられるように記述しなければならない - つまりInputのdtypeはDT_Stringになるはず

Slide 21

Slide 21 text

Tensorflow Serving: Example ※ Regress/ClassifyのためのInputの作り方 - 以下のような記述に変え、 serialized_tf_exampleがinputsになるようにSavedModelを構築す る必要がある - https://github.com/tensorflow/serving/blob/1.9.0/tensorflow_serving/example/mnist_save d_model.py

Slide 22

Slide 22 text

まとめ

Slide 23

Slide 23 text

まとめ - SavedModelを生成しServingされたからといっても、必ずしもあらゆるリクエストを受けられると は限らない - モデルのSingature/入出力におけるデータの Shape等の確認 - tensorflow-serving-api - Python2系のみpip install ...で利用可能 - 基本的にはsourceからprotocでコード生成する方がよさそう - SavedModelの作成に関してはEstimatorで作成したほうが楽 - 試す場合は公式のdockerイメージを利用しましょう - https://github.com/tensorflow/serving/tree/master/tensorflow_serving/tools/docke r

Slide 24

Slide 24 text

以上です