Flask/Kerasで機械学習アプリケーションを作る – 後編(App Engine + GCS)

GCP
スポンサーリンク
スポンサーリンク

概要

前編で作ったアプリケーションをGCP上で動かします。Flaskを使って実装しており、アーキテクチャと処理は以下の図のようにしています。App EngineとCloud Storageを用いています。GCP上でモデルの学習させたいとか、モデルの呼び出しをAPIとして切り離したい場合は、Cloud ML Engineを使う方がいいと思います。

(1) 画像をアップロード
(2) 画像をCloud Storageバケットに保存
(3) アッップロードされた画像と予め保存しておいた機械学習モデルを読み込み
(4) 判定し、結果を返す

GCPについては、過去にもいくつか記事を書いていますので、よければご覧ください。

動作環境

App Engineは、スタンダード環境(Python 3.7)を使います。

App Engine スタンダード環境  |  App Engine ドキュメント  |  Google Cloud

Cloud Storageについては、簡単のために公開バケットを使います。サービスアカウントとこ、IAMは今回は考えません。また、予め学習させたCNNのモデル(.h5)を、このバケットにアップロードしておきます。

データの一般公開  |  Cloud Storage  |  Google Cloud

実装内容

App Engineにデプロイするコードは、以下のような構成です。

これらを、gcloud app deploy app.yaml --project [project-id]でデプロイできます。HTMLCSSファイルは前編から変わっていません。その他、追加変更したところを見ていきます。



requirements.txt

アプリケーションをビルドするのに必要なパッケージは以下の通りです。一応新しい仮想環境で開発しましたが、精査していないので無駄なものも入れてしまっていたらごめんなさい。

app.yaml

APP Engineを利用するための設定ファイルです。ランタイムや、利用するインスタンスクラス、インスタンスのスケーリングなどを設定しています。App Enginet特有のものは、実質これだけです。

main.py

前編ではpredict.pyとしていたファイルです。相変わらず、メインとなる処理を書いています。

ここでは、main.pyで主に変更した点について書いていきます。

まず、アップロードされた画像やCNNのモデルを保存するためにストレージが必要です。前編ではローカルPC上での動作だったので、ローカルストレージに保存できていました。一方、App EngineはPaaSですから、データを保存したいときは基本的に以下のようなGCPのストレージサービスを使います。今回はもっとも扱いやすそうなGoogle Cloud Storage(オブジェクトストレージサービス、AWSのS3)を用いました。

データとファイルの保存について  |  Python 3 の App Engine スタンダード環境  |  Google Cloud

Cloud Storageの操作は、google-cloud-storageというライブラリが用意されています。

google-cloud-storage
Google Cloud Storage API client library

Cloud Storageバケットと、予め保存しておくCNNのモデル名を以下の変数に設定します。アップロードされてきた画像も、このバケットに保存します。

そして、pedict()の真ん中あたりで、以下の処理をしています。

  • 画像をCloud Storageへアップロード
  • アップロードした画像の公開URLを取得
  • 公開URLから画像を読み込み、予測結果を返す

画像アップロードと予測の関数を分けた方がいいと思いますが、今回はやっていません。また公開URLも、DBで管理するなどすれば、使い道が広がりそうです。

動作例

App Engineにデプロイ後は、GCPのプロジェクトIDに応じてエンドポイントが割り当てられます。そこにアクセスすれば、以下と同様に動作します。

参考にしたサイト

有益な情報ありがとうございます。というか、ほとんど内容かぶっててごめんなさい🙇‍



さいごに

App Engine久々に使ったけど、やっぱり便利でした。今回のコードも、GitHubにあげました。

nishipy/obama-smalling-flask-gcp
Contribute to nishipy/obama-smalling-flask-gcp development by creating an account on GitHub.

以上.

コメント