在 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 服务:

  1. AI‑Platform Prediction – 不适用,因为模型是一个检查点,而不是纯 TensorFlow SavedModel。
  2. App Engine – 遇到了 TensorFlow 系统依赖错误;PyTorch 可以工作,但只能处理两个并发请求。
  3. Cloud Run – 使用 Docker 提供了配置性(内存、vCPU)和简单性的最佳平衡。
  4. Research – 确定了对自定义预处理和后处理钩子的需求,AI‑Platform 支持这一点,但最终方案并不需要。

最终无服务器架构

生产环境设置由四个组件组成:

  • main.py – 一个 Flask 应用,接收带有 review 和可选 api_keyGET 请求,加载情感分析流水线,并返回第一个结果。
  • 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.txtrust_model.ottf_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)并避免了因启动多个实例而增加的计费。


部署步骤

  1. Prerequisites – 创建一个 GCP 项目,启用计费,并安装 gcloud CLI。
  2. 构建容器:
    gcloud builds submit --tag gcr.io/PROJECT-ID/ai-customer-review
    
  3. 部署到 Cloud Run (托管平台):
    gcloud run deploy --image gcr.io/PROJECT-ID/ai-customer-review --platform managed
    
  4. 增加内存 – 部署后,在 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”版本模型以进一步降低内存占用。

Sources