영상요약
머신러닝 모델을 실제 서비스에 적용하는 서빙 방식은 크게 온디맨드 서빙과 스트림 서빙으로 구분됩니다. 온디맨드 서빙은 마이크로서비스 아키텍처 환경에서 필요한 시점에 쿼리를 던져 예측 결과를 받는 방식인 반면, 스트림 서빙은 입력되는 데이터를 연속적으로 처리하여 실시간으로 예측 결과를 내보냅니다. 실무에서는 실시간 데이터 흐름을 다루기 위해 스트림 투 스트림 엔진을 활용하며, 이는 데이터의 입력부터 예측, 결과 전송까지의 전 과정을 끊김 없이 수행하는 데 최적화되어 있습니다.
플랫폼을 활용한 스트림 서빙 워크플로에서는 HTTP 서버 리더가 특정 포트를 통해 외부 데이터를 수신하는 것으로 시작됩니다. 수신된 온도 스트림 데이터는 전처리 과정을 거쳐 예측 오퍼레이터로 전달되며, 여기서 학습된 머신러닝 모델이 실시간 예측을 수행합니다. 최종 결과는 Kafka 토픽으로 전송되어 다른 시스템에서 활용될 수 있게 구성됩니다. 이러한 구조는 Zookeeper나 Bootstrap 서버 설정과 연동되어 분산 환경에서도 안정적인 데이터 처리를 가능하게 합니다.
정확한 예측을 위해서는 정교한 데이터 전처리가 필수적입니다. 입력된 온도 데이터는 먼저 특정 범위로 변환되는 Min-Max 스케일링을 거치며, 이 과정에서 현실적으로 불가능한 이상치 데이터는 제거됩니다. 또한 Transpose 오퍼레이터를 통해 과거의 데이터들을 모아 가로 형태로 재구성함으로써 모델이 분석하기 적합한 형태로 가공합니다. 예측이 완료된 이후에는 다시 원래의 수치 범주로 역변환하는 과정을 거쳐 사용자가 직관적으로 이해할 수 있는 최종 예측값을 산출하게 됩니다.
딥러닝 모델의 저장 방식인 Checkpoint는 본래 학습 중 오류가 발생했을 때 마지막 지점부터 재개하기 위한 용도로 사용됩니다. 하지만 실제 서빙 환경에서는 변수 값이 고정된 추론 전용 모델이 필요하므로, 그래프 정보와 배열 값을 결합하여 상수화하는 과정이 수반됩니다. TensorFlow Serving에서 공식적으로 권장하는 SavedModel 형식은 그래프 정보와 변수 데이터를 포함하며, 학습용 메타 그래프를 제외한 핵심 추론 로직만을 남겨 효율적인 서비스 배포를 지원합니다.
TensorFlow Serving은 유니버설 포맷을 사용하여 다양한 환경에서 모델을 효율적으로 구동할 수 있도록 설계되었습니다.
SavedModel의 핵심 요소는 입력과 출력의 규격을 정의하는 시그니처입니다. 어떤 형태의 데이터를 받아들여 무엇을 내보낼지를 명확히 명시해야 모델 서버가 이를 정확히 인식하고 처리할 수 있습니다. TensorFlow 코드를 작성할 때 추론에 필요한 함수만을 모듈화하고 시그니처를 등록하면, 복잡한 트레이닝 그래프를 제거한 경량화된 모델을 생성할 수 있습니다. 이는 모델의 용량을 줄일 뿐만 아니라 서빙 시 발생할 수 있는 리소스 낭비를 최소화하는 데 기여합니다.
모델 서버는 저장소에 새롭게 올라오는 모델을 실시간으로 감시하며 버전 관리 정책에 따라 서비스를 갱신합니다. 가용성을 중시하는 정책에서는 서비스 중단 없이 신구 모델을 교체하는 방식을 취하며, 리소스가 제한적인 경우에는 기존 모델을 내린 후 신규 모델을 올리는 방식을 선택합니다. 또한 GPU 메모리 점유 방식을 설정하거나 특정 포트를 지정하여 모델을 로딩하는 등, 운영 환경의 특성에 맞춰 유동적으로 리소스를 관리할 수 있는 다양한 옵션이 제공됩니다.
기존에 잘 학습된 Pre-trained 모델을 활용하는 전이 학습은 개발 시간을 획기적으로 단축하는 방법입니다. Checkpoint나 Protocol Buffer 파일로부터 모델을 불러와 구조를 수정하고 자신만의 시그니처를 결합하면 새로운 SavedModel을 생성할 수 있습니다. 생성된 모델의 입력 형태나 Rank 등의 시그니처 정보는 CLI 도구를 통해 검증할 수 있으며, 이를 통해 예측 형식의 정확성을 확인합니다. 이러한 체계적인 검증 과정은 복잡한 시퀀스 데이터나 이미지 데이터를 다루는 모델의 신뢰성을 높여줍니다.