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', 'core': 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–review와 선택적api_key가 포함된GET요청을 수신하고, 감성 파이프라인을 로드하여 첫 번째 결과를 반환하는 Flask 앱입니다.Dockerfile– Python 3.7 이미지를 빌드하고, 종속성을 설치하고, 코드를 복사하고, 5000번 포트를 노출하며, 메모리 사용량을 제한하기 위해 단일 워커와 스레드를 사용하여 Gunicorn으로 앱을 실행합니다.requirements.txt– Flask 1.1.2, torch 1.7.1, transformers ~4.2.0, gunicorn ≥20.0.0를 고정합니다.- Model directory – 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의 가격 계산기를 사용하면, 월 약 1,000~2,000개의 요청을 처리하는 4 GiB Cloud Run 인스턴스의 비용은 월 저장된 컨테이너 이미지 GB당 약 €0.10이며, 컴퓨팅 비용은 미미합니다. Docker 이미지 크기는 약 1 GB(≈700 MB PyTorch + 250 MB 모델)입니다.
결론 및 향후 과제
Cloud Run에 Hugging Face 감성 분석 파이프라인을 배포하는 것은 저용량 NLP 마이크로서비스를 위한 빠르고 비용 효율적인 솔루션을 제공합니다. 이 접근 방식은 사용자 정의 TensorFlow 서빙의 필요성을 피하고, 더 빠른 모델 로딩을 위해 PyTorch를 활용하며, 서버리스 컨테이너가 수용 가능한 지연 시간으로 트랜스포머 모델을 호스팅할 수 있음을 보여줍니다. 향후 개선 사항으로는 다음과 같은 것들이 있을 수 있습니다:
- AI-Platform Prediction을 활성화하기 위해 순수 TensorFlow SavedModel 제공.
- 모델을 상주시키기 위한 웜업(warm-up) 전략 또는 백그라운드 워커 구현.
- 훨씬 더 낮은 메모리 사용량을 위한 모델의 경량화된 "lite" 버전 탐색.