Serving template pattern
Usecase
- 공통 인터페이스로 동일한 입력과 출력을 사용하는 수많은 예측 서비스를 개발 및 배포해야 하는 경우.
- 서빙 구성요소 중 예측 모델을 제외하고 모듈화할 수 있는 경우.
Architecture
Serving template pattern은 예측 서비스의 코드나 인프라 구성, 배포 방식을 모듈화하고 재사용 가능한 템플릿으로 준비하는 패턴입니다. 예측 서비스의 방식을 모듈화 하면 개발 효율성 및 배포, 여러 서빙 간에 지식 공유 등의 이점을 얻을 수 있습니다. 여러 머신러닝 예측 모델이 실행되는 시스템을 개발할 때, 서빙 모델이 각각 다른 아키텍처를 가지면 팀의 생산성이 저하될 수 있습니다. 모든 모델들이 각각의 인터페이스, 라이브러리, OS, 칩셋을 사용하는 경우 이 문제가 발생할 수 있지만 공통화할 수 있는 경우(예를 들어 파이썬 3.x, 우분투 18점대, x84_64 CPU, Nginx 프록시, Rest 서버, scikit-learn, Keras 등) 이런 요소를 재사용 가능한 템플릿으로 만드는 것은 좋은 방법입니다. 추가로, 전처리와 예측을 호출하기 위한 인터페이스를 공통으로 만들면 모델 파일을 예측 서버로 변경하는 것만으로 예측 서버가 되는 이상적인 템플릿을 만들 수 있습니다.
이 패턴을 사용하면 공통 구성 요소를 모듈화하고 재사용할 수 있습니다. JSON 또는 YAML 파일에서 모델별 파라미터를 변경해 모델을 배포하는 것이 이상적인 템플릿입니다. 이렇게 표준화할 수 없는 경우에도 모델별 전처리 및 예측 외의 코드를 모듈화해 코드 양을 줄일 수 있습니다. 또한 모니터링, 경고, 로깅, 권한 부여, 인증 및 보안을 포함한 인프라 계층을 표준화할 수 있습니다. 회사 전체의 공통 템플릿을 제공하는 것은 어려울 수 있지만, 단계별 표준화를 고려할 수 있습니다. 예를 들어, 팀을 위한 전사적 비머신러닝 미들웨어 및 프로젝트 내 모델을 제외한 기타 구성 요소에 대한 인프라를 표준화할 수 있습니다.
프러덕션 서빙용 템플릿 버전 업데이트 정책을 고려해야 합니다. 이전 버전과 호환성을 갖춘 템플릿을 개발해야 합니다. 서비스 수준에 따라 서빙을 업데이트할 수 있습니다. 배치가 실행되지 않는 시간대에 배치 서버를 업데이트할 수 있습니다. Online AB test pattern을 사용해 REST 서버와 같은 온라인 서비스를 업데이트할 수 있습니다. 이전 버전과 호환성을 유지할 수 없는 경우 프러덕션으로 출시하기 전에 전체 통합 테스트를 실행해야 할 수 있습니다.
아래에는 인프라 계층에서 머신러닝 모델에 이르기까지 단계별 템플릿 레벨이 나열되어 있습니다.
- 인프라 : 특정 칩셋이나 런타임이 필요한 경우 머신러닝 모델과 상관없이 표준화할 수 있습니다.
- OS
- 네트워크
- 인증 및 권한 부여
- 보안
- 로깅
- 모니터링 및 경고
- 비머신러닝 미들웨어나 라이브러리 : 머신러닝 모델을 고려해 표준화할 수 있습니다.
- 웹 서버 및 작업 관리 서버
- 로깅 라이브러리
- REST 서버 라이브러리와 GRPC를 사용한 프로토콜 버퍼
- 머신러닝 라이브러리와 언어 : 심사숙고가 필요합니다.
- 언어 버전
- 라이브러리 버전
- 인터페이스
- 입력과 출력
Diagram
Pros
- 효율성을 개선할 수 있습니다.
- 공통 정책으로 관리합니다.
Cons
- 템플릿을 업데이트하려면 심사숙고와 이전 버전과의 호환성이 필요합니다.
Needs consideration
- 이전 버전과 호환성 및 업데이트 정책
- 통합 테스트
Sample
https://github.com/shibuiwilliam/ml-system-in-actions/tree/main/chapter4_serving_patterns/template_pattern