얼마 전 열렸던 DEVIEW 2020의 세션 중 하나인 ‘밑바닥부터 만드는 인공지능 서빙 플랫폼’ 발표를 듣고 그 내용을 요약합니다. 플랫폼 개발의 이유를 명확하게 설명하고 이로부터 이어지는 시스템의 설계 내용이 논리적으로 잘 맞아떨어져서 즐겁게 들을 수 있었던 발표였습니다. 마이크로서비스들의 배포와 서빙을 위한 플랫폼과 머신러닝 배포 및 서빙 플랫폼 사이에 기능적, 기술적으로는 연관관계가 많이 있는 반면에, 둘 사이에 사용자, 환경, 작업 흐름의 차이 때문에 현실적으로는 머신러닝에 국한된 프로덕트가 필요하다는 생각을 가지게 되었습니다.
- 시작
- 2019년 초 weight 파일 + 인퍼런스 코드 + flask 서버로 서빙 시작
- 지금은 각 모듈을 공통화
- 모델 공통화 동기
- 모델 수 증가 -> 서빙을 위한 엔지니어링 코스트 증가
- 지속적인 모델 학습과 배포: A/B 테스트, 로그를 저장하고 이를 통한 학습
- 사내시스템 연동: 유지보수가 잘 안되는 코드
- 협업 가능한 환경 구축: 엔지니어가 모델러로부터 받은 인퍼런스 코드를 재작성하는 엔지니어링 코스트. 모델러와 엔지니어의 관심사에 따라 분리.
- 공통화 요소
- 게이트웨이
- 인증, 레이트리미트, 로깅, 트래픽 관리, 비동기 처리
- 인퍼런스를 위한 공통 라이브러리 (SDK)
- 모델러 등의 협업 인터페이스 정의
- http, grpc 라이브러리 제공
- 모델 디스커버리, 로깅, 헬스체크 고려 (?)
- 이종의 환경을 디플로이하기 위한 시스템
- 이종의 환경을 디플로이하기 위한 단일한 인터페이스
- 게이트웨이
- MDS: 공통 모델 패키징
- 요구사항
- ML 프레임워크 – 텐서플로, PyTorch -> 베이스 이미지 제공
- REST API -> Decorator/Flask
- CPU/GPU 환경 -> GPU 환경을 위한 operator, 배치 처리 기능 추가
- 종속성/배포 문제로 인해 Docker -> 모든 배포에 Docker 사용
- 모델 서빙 클래스: 전처리, 인퍼런스, 후처리 코드를 decorator로 지정
- 모델 서빙 클래스 + 모델 파일로 이루어진 모델 패키지를 생성
- mds는 모델 패키지의 서빙 클래스를 flask와 연동하여 서빙
- 배치 인퍼런스: 여러 리퀘스트를 한꺼번에 처리
- 멀티 모델 파이프라인
- 요구사항
- DPLO: 공통 모델 배포
- 요구사항
- CPU/GPU 클러스터 -> 사내 주요 클러스터 오퍼레이터 구현
- 배포 단계 제어 및 이력 관리 -> 선언적 배포 구성 파일
- 라우팅 자동화 -> 엔드포인트 자동 등록
- 모델 패키지를 S3에 업로드하고 DPLO에 배포 요청
- DPLO는 패키지를 다운로드 받아서 이미지를 빌드하고 Docker Registry에 업로드
- 요청 받은 클러스터로 배포
- k8s 오퍼레이터 (NCC 클러스터 – 네이버 사내 컨테이너 클러스터), C3DL 오퍼레이터 (C3DL 클러스터 – 네이버 사내 딥러닝 플랫폼)
- 클러스터의 엔드포인트 정보를 얻어 AIGW의 라우팅 정보를 업데이트
- 기술
- golang으로 작성
- gRPC API 및 gRPC gateway로 REST API 노출
- 배포 요청은 protobuf로 정의
- 선언 파일을 통한 배포
- Git을 통한 배포 제어 및 관리
- 배포 상태와 배포 선언 파일 사이의 변경 관리
- 동적 엔드포인트 디스커버리
- 새로운 인스턴스 배포/기존 인스턴스 재시작에 따른 엔드포인트 정보 업데이트
- MDS는 Route provider (Consul)에 라우트 정보를 등록, AIGW는 Route provider로부터 엔드포인트 업데이트
- 요구사항
- AIGW: 공통 모델 라우팅
- nginx, istio 대신 직접 개발
- 라우팅 scheme: project/model/version
- project: 서비스, model: ML 기능, version: 버전
- 버전 사이에서는 weighted round robin, 하나의 버전 내에서는 round robin
- 요청 미러링 기능
- 서비스 중인 모델의 요청을 복제해서 신규 모델에 요청 실행 가능
- 가중치 기반 라우팅
- 카나리 배포, A/B 테스트를 위한 버전간 가중치 라우팅
- 로그 유통
- 기본적인 메트릭 전송
- anomaly detection
- 사내 로그 저장/분석 플랫폼 활용
- 로그 시각화
- 미러링된 요청 구분 가능
- 모델 서빙 모니터링
- 모델 서버의 작동 여부
- 쓰루풋, 응답 코드, latency, connection 수 등의 메트릭 모니터링