TensorFlow 비전 모델을 Hugging Face에서 TF Serving으로 배포하기

Hugging Face는 TensorFlow Serving(TF Serving)을 사용하여 Transformers 라이브러리의 TensorFlow 기반 비전 모델을 배포하는 워크플로우를 자세히 설명하고 있습니다. 이 접근 방식은 개발자가 Vision Transformer(ViT), Masked Autoencoders, RegNet, ConvNeXt와 같은 최신 모델을 서버 측 배치 및 모델 워밍업을 지원하는 고성능 REST 또는 gRPC 엔드포인트로 노출할 수 있게 합니다.

TF Serving을 위한 모델 저장

TF Serving으로 모델을 배포하려면 모델이 SavedModel 형식이어야 합니다. Hugging Face Transformers 라이브러리의 TensorFlow 모델에는 가중치를 h5와 SavedModel 형식 모두로 직렬화할 수 있는 save_pretrained() 메서드가 포함되어 있습니다.

Vision Transformer(ViT) 모델의 경우, TFViTForImageClassification.from_pretrained() 로 모델을 로드하고 save_pretrained(saved_model=True) 를 호출하는 과정을 거칩니다. 기본적으로 이는 TF Serving에서 요구하는 버전이 지정된 디렉터리 구조(예: {model_dir}/saved_model/{version})를 생성합니다.

전처리 및 후처리를 위한 모델 서전리 구현

표준 머신러닝 모델은 특정 전처리와 후처리가 필요합니다. 학습-서빙 간의 불일치를 줄이고 개발자의 인지 부하를 낮추기 위해 이러한 작업을 "model surgery"를 통해 모델의 계산 그래프에 직접 삽입할 수 있습니다.

전처리 파이프라인

ViT 모델의 경우, 필수 전처리 단계는 다음과 같습니다:

  • Scaling: 이미지 픽셀 값을 [0, 1] 범위로 변환합니다.
  • Normalization: 모델 고유의 평균과 표준편차를 사용하여 픽셀 값을 [-1, 1] 범위로 스케일링합니다.
  • Resizing: 이미지를 224x224 공간 해상도로 조정합니다.
  • Transposition: 채널 차원을 앞쪽으로 이동시켜 Hugging Face 모델에서 사용하는 채널-우선 형식에 맞춥니다.

요청 페이로드를 최적화하고 크기 증가를 방지하기 위해, 가이드는 입력으로 base64 인코딩된 문자열을 받아들이고 이를 tf.io.decode_base64tf.io.decode_jpeg를 사용해 그래프 내에서 디코딩 및 처리할 것을 권장합니다.

후처리 및 내보내기

후처리는 원시 모델 로짓을 사람이 읽을 수 있는 라벨로 변환합니다. 모델의 call() 메서드에서 구체적인 함수를 도출함으로써, 개발자는 모델을 serving_fn으로 래핑할 수 있습니다:

  1. 전처리 파이프라인을 실행합니다.
  2. 모델 추론을 수행합니다.
  3. 로짓에 softmax 함수를 적용하여 신뢰도 점수를 계산합니다.
  4. 결과 인덱스를 모델의 id2label 설정을 사용해 문자열 라벨에 매핑합니다.

이 래핑된 함수는 tf.saved_model.save() 를 사용해 serving_default 시그니처로 내보내며, 모델 입력 요구사항을 4D 텐서에서 문자열로, 출력은 라벨과 신뢰도 점수를 포함하는 딕셔너리로 변경합니다.

TensorFlow Serving을 이용한 배포

모델을 내보낸 후에는 tensorflow_model_server 명령을 사용해 배포할 수 있습니다. 주요 구성 파라미터는 다음과 같습니다:

  • rest_api_port: REST 엔드포인트의 포트(기본값은 보통 8501).
  • model_name: API 호출 시 사용되는 식별자.
  • model_base_path: TF Serving이 최신 모델 버전을 로드하는 디렉터리.

TF Serving은 배포된 모델을 조회하는 두 가지 주요 방법을 제공합니다:

REST 엔드포인트

REST API는 온라인 예측 시나리오에 적합합니다. 요청은 instances 리스트에 base64 인코딩된 이미지를 포함한 JSON 페이로드로 전송됩니다. 엔드포인트 형식은 http://localhost:8501/v1/models/{model_name}:predict 입니다.

gRPC 엔드포인트

낮은 지연 시간과 높은 확장성, 분산 시스템을 위해서는 gRPC가 선호되는 배포 방식입니다. 이를 위해 grpc.insecure_channel 로 통신 채널을 열고 PredictionServiceStub 을 사용해 PredictRequest 페이로드를 전송합니다. gRPC는 신뢰도 점수와 예측 라벨을 포함하는 구조화된 출력을 반환합니다.

Sources