efficientnetで推論させてみる(サーバ化)

colaboratoryで学習させて、その結果を使って手元で推論させるところまでは前回書いた

efficientnetで推論させてみる - MEMOcho-

今回は学習済みモデルをサーバの形にして使うようにしてみたのでメモ

flaskを使って超簡易サーバを立てて使うことにした。実装したserverとclientのコードの全体はこちら

https://github.com/y-kamiya/tpu/commit/7f33993e14423462e1b56900a23fd9e7a6e46a97

サーバ

サーバの処理で全体としてやっていることは以下の感じ

  • モデルの構築はサーバ起動時に実行
  • 画像データをbase64の形式でリクエストとして受け取る
  • 画像データを渡してforward計算

処理自体はこちらのメソッドを参考にして同様のことを行うようにしただけ

https://github.com/tensorflow/tpu/blob/7e0ad3aabe888ce25599c5d9cbd804e99714f060/models/official/efficientnet/utils.py#L314

ただし、上記の処理をそのまま使うとリクエストごとにモデルの構築やパラメータのロードなどを行う形になるためサーバで使うには都合が悪い。そのため以下のメソッドの画像データだけをplaceholderとして持っておく版を実装して使った。

クライアント

AutoML Visionでの学習も以前試したため、その際に使ったこちらのスクリプトを参考にして実装

python-docs-samples/automl_vision_edge_container_predict.py at master · GoogleCloudPlatform/python-docs-samples · GitHub

やることはこれだけ

ちなみにちゃんとやるのであればtensorflow servingを使うべき。その場合はbase64化されたimage dataを受け取ったところからmodelの処理に含める必要があるため、モデル側を少し書き換えた上でpbファイルとして保存する必要があるはず。今回はそこまでちゃんとしたものを作る必要なかったので簡単にサーバを立てるだけにしたものの、そちらもそんなに手間ではないのかもしれない。