問題
- NLP (自然言語処理)のモデルを作ってもらったが、
mecab-ipadic-neologd
という[mecabの拡張辞書] (https://github.com/neologd/mecab-ipadic-neologd)がスーパー重い (3 GB以上?) - しかし、サービスの特性上新しい用語を考慮した方が良いと判断し、
mecab-ipadic-neologd
は外せない - 人手足りないので、できればクラウド上 (現時点ではGCP) でserverlessで運用したい
アプローチ
- 先人の知恵を借りてmecabのweb APIをまずforkする。
(matsulib
さん、ありがとうございました!!)- [Github] (https://github.com/matsulib/mecab-service)
- [Qiita記事] (https://qiita.com/matsulib/items/5249b5f3e832f0311806)
- 上の
mecab-ipadic-neologd
辞書APIをGCPのCloud Run (serverless container deploymentできちゃうもの。GCPで現在ベータ版。AWSでいうとFargate)にデプロイしておく。- PORT番号は必ず変更するように!
- 残りのモデルの部分は、辞書部分から切り離して、Dockerfileを書いてコンテナにした上で、Cloud Runにデプロイ
- ついでに
requirements.txt
を綺麗にしておく (コンテナのイメージサイズを小さくしたいので、
- ついでに
Cloud Run
ちょうど今年 (2019年)のGoogle Cloud Next 19 Tokyoで取り上げられ始めた印象。
ポート番号さえ変更しておけば、簡単にデプロイできた。
もととなっているのは Knative というGoogle+Pivotalなど各社がやっているOSS. Kubernetesをベースとしたサーバプラットホーム。Auto-scalingしてくれるので、リクエストがないときは料金が発生しないし、リクエスト数に合わせてコンテナ数を調整してくれる。
東京リージョンでも使えます!
詳しくはCloud OnAir Cloud Run Deep Dive (日本語、公式) で
利用フロー
Dockerfileを含めたrepositoryを更新 -> (optionとしてCloud Buildで自動ビルド) -> Google Container Registryにimageをpush -> Google Cloud Runでデプロイされる
注意点
- ContainerはGoogle Cloudの [Container Runtime Contract] (https://cloud.google.com/run/docs/reference/container-contract) に準拠しなければならない。
- ここに書いてある"Listening for requests on PORT"は設定しておかないとcontainerがスタートしない。
- 具体的に何をやったかというと、server.pyを以下のように変えただけ。
# BEFORE
app.run(host='0.0.0.0', port=5000, debug=True)
# AFTER
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8080)), debug=True)
- Google Container Registryは無料枠ないかも?しかし料金体系はCloud Storageと一緒で非常に安価
Sample code
gcloud
上で Docker
を認証しておく。
gcloud auth configure-docker
先ほど説明したように mecab-service/flask-mecab/server.py
にPORT関数を入れておく。
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8080)), debug=True)
次にlocalでbuildして走らせてみる。
cd flask-mecab && docker build -t mecab-service:test .
docker run -p 5000:8080 -it mecab-service:test
ここで、curl
で適宜リクエスト投げて、ちゃんとレスポンスが返ってきたらOK.
良さそうだったら、GCRにpushしちゃう。
(ここは、必要があればCloud Buildで自動ビルトしても良い)
docker build -t gcr.io/$PROJECT_ID/$IMAGE_NAME .
docker push gcr.io/$PROJECT_ID/$IMAGE_NAME
Cloud Runにデプロイする。
gcloud beta run deploy --image $IMAGE_ID --region $REGION --platform managed
サービス名とか聞かれるかもしれないけど、こだわりなければそのままにしておく。
これでデプロイが成功したら、URL (https) が出力されます。
*注意:デフォルトでは非公開です。
公開APIにしたければ、Cloud Runのconsole上でサービスを選択し、右のパネルで allUsers
を Cloud Run Invoker
として権限を与えること。
(or: deploy時に --allow-unauthenticated
フラグをつける)