Hugging Face ViT를 Kubernetes에 TF Serving으로 배포하기
Hugging Face는 Docker와 Kubernetes, TensorFlow Serving을 사용하여 🤗 Transformers 라이브러리의 Vision Transformer (ViT) 모델 배포를 확장하는 워크플로우를 자세히 설명했습니다. 이 접근 방식은 개발자가 로컬 프로토타입에서 고 사용자 트래픽을 처리할 수 있는 프로덕션 환경으로 컨테이너화와 자동 오케스트레이션을 통해 이동할 수 있게 합니다.
Docker와 Kubernetes를 활용한 모델 배포 확장
실제 프로젝트에서 모델 배포를 확장하기 위해 Hugging Face는 두 단계 워크플로우를 권장합니다: 애플리케이션 로직을 컨테이너화하고 해당 컨테이너를 Kubernetes 클러스터에 배포하는 것입니다. SageMaker나 Vertex AI와 같은 관리형 서비스도 존재하지만, Docker와 Kubernetes를 사용하면 복잡한 인프라 관리를 추상화하면서 배포에 대한 보다 세밀한 제어가 가능합니다.
이 구현에서는 Google Kubernetes Engine (GKE)을 사용해 클러스터를 프로비저닝하고 관리하지만, 이 개념은 Amazon EKS와 같은 다른 플랫폼이나 Minikube와 같은 로컬 도구에도 적용할 수 있습니다.
Docker를 활용한 컨테이너화 과정
TensorFlow Serving은 모델이 SavedModel 형식이어야 하며 특정 디렉터리 구조 <MODEL_NAME>/<VERSION>/<SavedModel> 로 정리되어야 합니다. 이 구조를 통해 TensorFlow Serving은 모델의 여러 버전을 동시에 관리할 수 있습니다.
커스텀 이미지 빌드
프로덕션 준비 이미지 생성 과정은 다음과 같습니다:
- Directory Setup:
SavedModel을 구조화된 경로(예:models/hf-vit/1)에 배치합니다. - Base Image Integration: 공식
tensorflow/serving이미지를 실행하고models디렉터리를 실행 중인 컨테이너에 복사합니다. - Image Commitment:
docker commit을 사용해 새 이미지를 만들고MODEL_NAME환경 변수를 설정(예:hf-vit)하여 TensorFlow Serving에 배포할 모델을 지정합니다.
로컬 테스트 및 배포
클러스터에 배포하기 전에 이미지가 로컬에서 포트 8500(gRPC)과 8501(HTTP/REST)을 매핑하여 테스트됩니다. 검증이 완료되면 gcloud auth configure-docker와 docker push를 사용해 Google Container Registry (GCR)와 같은 레지스트리에 이미지를 푸시합니다.
Kubernetes 배포 및 오케스트레이션
Kubernetes 클러스터에 배포하려면 인프라를 프로비저닝하고 YAML 매니페스트를 통해 애플리케이션의 원하는 상태를 정의합니다.
인프라 프로비저닝
GKE를 사용해 특정 머신 타입(예: n1-standard-8)과 정해진 노드 수로 클러스터를 프로비저닝합니다. 인증 및 연결은 gcloud container clusters get-credentials 명령으로 처리됩니다.
Kubernetes 매니페스트
세 개의 주요 매니페스트 파일을 사용해 관심사를 분리합니다:
deployment.yaml: Docker 이미지 URI, 리소스 제한(예:cpu: 800m) 및 TensorFlow Serving 전용 인자를 정의합니다. 주요 튜닝 파라미터로는tensorflow_inter_op_parallelism(권장값: 2)과tensorflow_intra_op_parallelism(권장값: 물리적 CPU 코어 수)이 있습니다.service.yaml:LoadBalancer를 구성해 gRPC(포트 8500)와 REST(포트 8501) 엔드포인트를 외부에 노출합니다.hpa.yaml: Horizontal Pod Autoscaler(HPA)를 구현해targetCPUUtilizationPercentage(예: 80%)에 따라 복제본 수(예: 1~3)를 자동으로 조정합니다.
여러 매니페스트를 관리하기 위해 Hugging Face는 Kustomize 사용을 제안합니다. 이를 통해 kustomize build . | kubectl apply -f -와 같은 단일 명령으로 배포할 수 있습니다.
테스트 및 최적화
엔드포인트 검증
kubectl get svc를 통해 외부 IP를 가져온 후, base64‑인코딩된 이미지 바이트를 REST API에 전송해 엔드포인트를 테스트할 수 있습니다. 성공적인 요청은 예측 라벨과 신뢰도 점수를 반환합니다.
TensorFlow Serving 설정
성능을 추가로 최적화하기 위해 TensorFlow Serving은 여러 설정을 제공합니다:
enable_batching: 타이밍 윈도우 내에서 들어오는 요청을 수집해 배치 추론을 수행합니다. 이는 즉각적인 개별 예측이 필요 없는 애플리케이션에 매우 효율적입니다.enable_model_warmup: 더미 입력 데이터를 사용해 TensorFlow 구성 요소를 지연 초기화함으로써 실제 서비스 시 초기 지연을 없앱니다.
하드웨어 최적화
TensorFlow Serving은 AVX512와 같은 하드웨어 전용 명령어 집합을 사용해 가속화할 수 있습니다. 배포 하드웨어에 맞게 최적화된 TensorFlow Serving 이미지 빌드를 사용하면 딥러닝 모델 추론 속도를 크게 향상시킬 수 있습니다.