Google Cloud Run に Hugging Face Transformers の感情分析パイプラインをデプロイする
TL;DR
Hugging Face コミュニティの投稿では、distilbert-base-uncased-finetuned-sst-2-english 感情分析パイプラインを Google Cloud Run にデプロイする手順が詳しく説明されています。軽量な Docker イメージを構築し、サービスを構成することで、月間 2,000 リクエスト未満の低コストで、5 秒未満のリクエストレイテンシを実現する方法を示しています。
マイクロサービスの目的
著者は、Discord の顧客レビューを「ポジティブ」または「ネガティブ」に分類するサーバーレスのエンドポイントを必要としていました。ユースケースとしては月間数千リクエスト程度であったため、高いスループットや超低レイテンシは主要な懸念事項ではありませんでした。
Transformers ライブラリ
Hugging Face の transformers ライブラリは、モデルのチェックポイントとトークナイザーを同時にロードする pipeline 抽象化を提供します。最小限の例は、感情ラベルを取得する方法を示しています。
from transformers import pipeline
classifier = pipeline('sentiment-analysis')
print(classifier('We are very happy to include pipeline into the transformers repository.'))
# [{'label': 'POSITIVE', 'score': 0.9978193640708923}]
著者は当初、.h5 チェックポイントを Keras SavedModel と混同していましたが、それが pipeline API を介してロードされる必要がある重みファイルであることを発見しました。
Google Cloud のオプションの検討
著者は 4 つの GCP サービスを評価しました。
- AI-Platform Prediction – モデルが純粋な TensorFlow SavedModel ではなくチェックポイントであるため、不適切です。
- App Engine – TensorFlow のシステム依存関係のエラーが発生しました。PyTorch は動作しましたが、同時に 2 つのリクエストのみ処理できました。
- Cloud Run – Docker を使用することで、構成の柔軟性(メモリ、vCPU)とシンプルさのバランスが最も優れていました。
- Research – カスタムの事前・事後処理フックの必要性を特定しましたが、これは AI-Platform でサポートされていますが、最終的なソリューションには必要ありませんでした。
最終的なサーバーレス構成
本番環境のセットアップは、4 つのアーティファクトで構成されています。
main.py–reviewとオプションのapi_keyを含むGETリクエストを受け取り、感情分析パイプラインをロードし、最初の結果を返します。Dockerfile– Python 3.7 イメージを構築し、依存関係をインストールし、コードをコピーし、ポート 5000 を公開し、メモリ使用量を制限するために単一のワーカーとスレッドで Gunicorn を実行します。requirements.txt– Flask 1.1.2, torch 1.7.1, transformers ~4.2.0, および gunicorn ≥20.0.0 を固定します。- モデルディレクトリ – DistilBERT SST-2 モデル用の
pytorch_model.bin,config.json, およびvocab.txtが含まれています。rust_model.otとtf_model.h5ファイルは不要です。
main.py (抜粋)
import os
from flask import Flask, jsonify, request
from transformers import pipeline
app = Flask(__name__)
model_path = "./model"
@app.route('/')
def classify_review():
review = request.args.get('review')
api_key = request.args.get('api_key')
if review is None or api_key != "MyCustomerApiKey":
return jsonify(code=403, message="bad request")
classify = pipeline("sentiment-analysis", model=model_path, tokenizer=model_path)
return classify(review)[0]
if __name__ == '__main__':
app.run(debug=False, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Dockerfile (抜粋)
FROM python:3.7
ENV PYTHONUNBUFFERED True
COPY requirements.txt /
RUN pip install -r requirements.txt
COPY . /app
EXPOSE 5000
ENV PORT 5000
WORKDIR /app
CMD exec gunicorn --bind :$PORT main:app --workers 1 --threads 1 --timeout 0
単一ワーカー、単一スレッドの構成により、メモリ使用量(≈4 GB)を低く抑え、課金が増える複数のインスタンスの起動を避けることができます。
デプロイ手順
- 前提条件 – GCP プロジェクトを作成し、課金を有効にし、
gcloudCLI をインストールします。 - コンテナを構築する:
gcloud builds submit --tag gcr.io/PROJECT-ID/ai-customer-review - Cloud Run にデプロイする (マネージド プラットフォーム):
gcloud run deploy --image gcr.io/PROJECT-ID/ai-customer-review --platform managed - メモリを増やす – デプロイ後、Cloud Run コンソールでリビジョンを編集し、PyTorch モデルを収容するためにメモリを 256 MiB から 4 GiB に引き上げます。
パフォーマンス特性
- レイテンシ – 初回リクエスト(コールドスタート)は約 10 秒かかります。その後のリクエストは、モデルのロードと推論を工程に含めて 5 秒未満で完了します。
- 最適化のヒント – リクエストごとにモデルをロードするのではなく、モジュール・インポート時に一度だけパイプラインをロードする(グローバル変数として)ことで、レイテンシとメモリの変動を抑えることができます。
コスト見積もり
Google の料金計算ツールを使用すると、4 GiB の Cloud Run インスタンスが月間約 1,000–2,000 リクエストを処理する場合、保存されたコンテナイメージの容量 1 GB ごとの月額約 €0.10 に、わずかな計算リソース料金が加わります。Docker イメージのサイズは約 1 GB (≈700 MB PyTorch + 250 MB モデル) です。
結論と今後の課題
Cloud Run に Hugging Face の感情分析パイプラインをデプロイすることは、低ボリュームの NLP マイクロサービス向けに、迅速かつ費用対効果の高いソリューションを提供します。このアプローチは、カスタム TensorFlow Serving の必要性を回避し、PyTorch を使用してモデルのロードを高速化し、サーバーレスコンテナが許容可能なレイテンシで Transformer モデルをホストできることを示しています。今後の改善策としては、以下が挙げられます。
- AI-Platform Prediction を有効にするために、純粋な TensorFlow SavedModel を提供すること。
- モデルをメモリに常駐させるために、ウォームアップ戦略またはバックグラウンドワーカーを実装すること。
- さらに低いメモリ使用量を実現するために、モデルの軽量な「lite」バージョンを探索すること。