Tensorflow 2.0でモデルを作成し、Tensorflow Serving(Python/C++)で動作させる

モデルの学習:
省略。tf.kerasを用いてモデルを構築する。tf.saved_model.save automatically determines a signature for the tf.keras.Model object. In the case of low-level API, see https://www.tensorflow.org/beta/guide/saved_model#exporting_custom_models .

 

SavedModelの作成:
tf.saved_model.save(model, export_dir, signature)
export_dirは、SavedModelを保存するディレクトリ。以降、saved_model/1として話を進める。
saved_model_cli show --dir saved_model/1 --tag_set serve --signature_def serving_default
などなどで、中身を確認できる。実際に値を流してテストもできる。詳しくは、
https://www.tensorflow.org/beta/guide/saved_model#details_of_the_savedmodel_command_line_interface
https://www.tensorflow.org/beta/guide/saved_model#saved_model_cli

 

TensorFlow Serving with Docker:
TF servingを起動。Dockerを使う場合は、例えば、
docker run -t --rm -p 8501:8501 --name blabla \
-v "/path/to/saved_model/1:/models/saved_model/1" \
-e MODEL_NAME=saved_model \
tensorflow/serving &
Python baseでclientを作成する場合は、以下のようになる (私のモデルの入力は、BTC Tensor)。
x = np.zeros((1, 10, 80), dtype=np.float32)
data = json.dumps({"signature_name": "serving_default",
"instances": x.tolist()})
headers = {"content-type": "application/json"}
json_response = requests.post('http://localhost:8501/v1/models/saved_model:predict',
data=data, headers=headers)
predictions = numpy.array(json.loads(json_response.text)["predictions"])

詳細は、
https://www.tensorflow.org/tfx/serving/docker
https://www.tensorflow.org/beta/guide/saved_model

 

C++:
他言語でも同様のrequestを書けばok。詳細は
https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/api_rest.md
私がC++で実装した場合には、libcurlやnlohmann/jsonを用いた。


まとめ
- tf.kerasを使うとハッピーになれる。
- dockerは初めて使ったので、別の記事にまとめしたい。
- front-endもback-endも浦島太郎状態なので、勉強したい。
- curlpp (C++ wrapper around libcURL) について調べる。