3) 学習済みモデル部分のスケーラビリティ
学習済みモデルを本番で動かすにあたり、言語の違い以外で気になるのがそのスケーラビリティです。
選択肢4の方法では学習済みモデルを動かす部分が疎結合となっているため、負荷が当初の想定より大きくなってきた場合にも、少ない手間で学習済みモデル部分のみをスケールアウトさせることが期待できます。
TensorFlow Servingはサーバのクラスタ化に対応していますので、このような状況にも対応がしやすいでしょう。
自前でクラスタを管理したくない場合は、Google Cloud Platformのサービスのひとつ、Cloud Machine Learning Engineを利用する手もあります。TensorFlowから書き出したSavedModel形式の学習済みモデルをアップロードすることで、Googleのクラウド上で動作させることができます。
またTensorFlow以外のライブラリを使っている場合にも、学習済みモデル部分がサービスとして切り出されていれば、アプリケーション部分の変更なしで(あるいは最小限の変更で)スケールアウトに対応できることが期待できます。
おわりに
既存のアプリケーションにディープラーニングを利用した「AI機能」を取り込む、というようなケースでは以下のような要求が存在します。
- 学習済みモデルを利用する側のアプリケーションは、言語や環境を変更したくない
- ディープラーニングはディープラーニングがやりやすい言語環境で組みたい
- 本番利用のために必要な作業量はなるべくおさえたい
- 将来的なスケールアウトの余地を確保したい
- メモリや再起動のタイミング、動作させるマシンなど、アプリケーションとディープラーニングは分離して管理したい
これらの要求を満たす方式として、学習済みモデルを動かす部分をサービス化してアプリケーションと分離するというものがあります。
問題はどのようにサービス化するかということなのですが、TensorFlowを使っている場合にはTensorFlow Servingという製品が利用できるため、少ない作業量でサービス化が実現できるというメリットがあります。
次回は実際にTensorFlow Servingを利用して、連載第3回で作成した犬猫画像の分類モデルをJavaから利用できることを確認していきます。
※TensorFlow, the TensorFlow logo and any related marks are trademarks of Google Inc.
その他、本コンテンツ内で利用させて頂いた各プロダクト名やサービス名などは、各社もしくは各団体の商標または登録商標です。