在 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 选项探索
作者评估了四种 GCP 服务:
- AI‑Platform Prediction – 不适用,因为模型是一个检查点,而不是纯 TensorFlow SavedModel。
- App Engine – 遇到了 TensorFlow 系统依赖错误;PyTorch 可以工作,但只能处理两个并发请求。
- Cloud Run – 使用 Docker 提供了配置性(内存、vCPU)和简单性的最佳平衡。
- Research – 确定了对自定义预处理和后处理钩子的需求,AI‑Platform 支持这一点,但最终方案并不需要。
最终无服务器架构
生产环境设置由四个组件组成:
main.py– 一个 Flask 应用,接收带有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)并避免了因启动多个实例而增加的计费。
部署步骤
- Prerequisites – 创建一个 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 控制台中编辑修订版本,将内存从 256 MiB 提高到 4 GiB 以适应 PyTorch 模型。
性能特征
- Latency – 首次请求(冷启动)耗时 ~10 s;后续请求(包括模型加载和推理)可在 <5 s 内完成。
- Optimization tip – 在模块导入时加载一次流水线(使用全局变量)以消除每次请求的模型加载,从而减少延迟和内存抖动。
成本估算
使用 Google 的定价计算器,一个处理每月 ~1,000–2,000 次请求的 4 GiB Cloud Run 实例,每月每个 GB 存储的容器镜像成本约为 €0.10,外加微不足道的计算费用。
结论与未来工作
在 Cloud Run 上部署 Hugging Face 情感分析流水线为低流量 NLP 微服务提供了一个快速、且具有成本效益的解决方案。该方法避免了使用自定义 TensorFlow serving,利用 PyTorch 进行更快的模型加载,并展示了无服务器容器可以托管 transformer 模型并保持可接受的延迟。未来改进可以包括:
- 提供纯 TensorFlow SavedModel 以启用 AI‑Platform Prediction。
- 实现预热策略或后台工作进程以保持模型常驻。
- 探索使用更轻量级的“lite”版本模型以进一步降低内存占用。