Serving의 종류는 크게 2가지 방식을 많이 활용
실시간 응답이 중요하지 않고 대량의 데이터를 처리하거나 정기적인 일정으로 수행하고 싶을 때 사용하는 방식이다.
실시간 응답이 중요하고 개별 요청에 맞춤 처리 및 동적인 데이터에 대응할 상황일 때 사용하는 방식이다.
소프트웨어 개발 분야에도 패턴이 존재 => 디자인 패턴
소프트웨어의 구조, 구성 요소의 관계, 시스템의 전반적인 행동 방식
Batch Serving
Online Serving
가장 간단하고 최대한 적은 비용으로 운영 환경에 배포하고 싶은 상황일 때 사용
job management server
작업을 실행하는 서버(Apache Airflow 등을 주로 사용)
특정 시간에 주기적으로 Batch Job을 실행시키는 주체
장단점
기존에 사용하던 코드를 재사용 가능하고 API 서버를 개발하지 않아도 되는 단순하다.
별도의 스케줄러(예 : Apache Airflow) 필요하다는 단점이 있다.
[참고사이트] https://mercari.github.io/ml-system-design-pattern/

Batch 패턴으로 서빙하면, 결과 반영에 시간 텀이 존재
모델이 항상 Load 된 상태에서 예측을 해주는 API 서버를 만들고,
추천 결과가 필요한 경우 서비스 서버에서 이 예측 서버에 직접 요청하는 패턴

Synchronous 패턴
앞에서 설명한 Web Single 패턴을 동기적(Synchronous)으로 서빙
기본적으로 대부분의 REST API 서버는 동기적으로 서빙
클라이언트는 API 서버로 요청을 한 뒤 이 요청이 끝날 때까지 기다려야 한다.
그래서 요청이 몰리면 병목현상이 될 수 있다.

Asynchronous 패턴
하나의 작업을 시작하고, 결과를 기다리는 동안 다른 작업을 할 수 있음
작업이 완료되면 시스템에서 결과를 알려줌
예측을 기다릴 필요가 없다.
Queue
클라이언트와 예측 서버 사이에 메시지 시스템(Queue)을 추가
대표적인 메시지 프레임워크 : Apache Kafka
지하철 물품 보관소와 유사한 역할

이렇게 짜면 좋지 않다는 패턴들의 예시이다.
Online Bigsize 패턴
실시간 대응이 필요한 온라인 서비스에 예측에 오래 걸리는 모델을 사용하는 경우
예) 서버가 실행되는데 몇 분씩 소요되고, 요청에 대해 응답이 몇 초씩 걸릴 경우
문제
일반적으로 Bigsize 모델은 배포할 때 서버 실행과 서빙이 느림
속도와 비용 Tradeoff를 조절해 모델 경량화하는 작업이 필요
대안
실시간이 아닌 배치로 변경하는 것도 가능한지 검토
중간에 캐시 서버를 추가하고, 전처리를 분리하는 것도 Bigsize를 탈피하는 방법
All-in-one 패턴
하나의 서버에 여러 예측 모델을 띄우는 경우
라이브러리 선택 제한이 존재함