LoginSignup
7
4

More than 3 years have passed since last update.

mecab辞書を使うNLPモデルをCloud Runでseverlessでサクサクと動かす!

Last updated at Posted at 2019-10-13

問題

  • NLP (自然言語処理)のモデルを作ってもらったが、mecab-ipadic-neologdというmecabの拡張辞書がスーパー重い (3 GB以上?)
  • しかし、サービスの特性上新しい用語を考慮した方が良いと判断し、mecab-ipadic-neologdは外せない
  • 人手足りないので、できればクラウド上 (現時点ではGCP) でserverlessで運用したい

アプローチ

  • 先人の知恵を借りてmecabのweb APIをまずforkする。 (matsulibさん、ありがとうございました!!)
  • 上の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 に準拠しなければならない。
    • ここに書いてある"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上でサービスを選択し、右のパネルで allUsersCloud Run Invoker として権限を与えること。
(or: deploy時に --allow-unauthenticated フラグをつける)

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4