[살아 움직이는 머신러닝 파이프라인 설계] 9. 텐서플로 서비스를 사용한 고급 모델 배포
인공지능/Tensorflow Extended

[살아 움직이는 머신러닝 파이프라인 설계] 9. 텐서플로 서비스를 사용한 고급 모델 배포

텐서플로 서비스를 사용한 고급 모델 배포

텐서플로 서빙은 새로운 모델이 로컬에 저장되면 이를 인식해 최신 모델을 배포한다. 하지만 모델을 로컬로 전달하려면 데이터 과학팀과 데브옵스팀간의 협력이 필요하다. 특히 텐서플로 서빙을 도커와 같은 컨테이너 환경에서 운영하고 있다면 최신 모델을 포함한 새로운 배포 컨테이너 이미지를 만들거나 컨테이너가 운영중일 때 새로운 모델 파일을 마운트 해야 한다.
텐서플로 서빙은 로컬 뿐만 아니라 클라우드 버킷에 저장된 모델도 불러와 서빙할 수 있다. 만약 데이터 과학팀이 새로 학습하고 검증한 모델을 클라우드에 저장하면 텐서플로 서빙은 클라우드 버킷에서 새로 저장된 모델을 인식하고 배포 모델을 변경한다. 이러한 방식을 이용하면 데이터 과학팀과 데브옵스팀 간의 업무를 분리할 수 있다.

모델 경량화

양자화

양자화(Quantization)란 모델의 가중치를 float를 int로 바꾸는 경량화 기술을 말한다. 보통 모델의 가중치의 데이터형은 float32나 float64를 사용한다. 이를 int8, bfloat16으로 변경해 모델을 저장하고 추론할 때 필요한 메모리 공간을 줄인다.
모델을 양자화 하면 다음과 같은 장점을 얻을 수 있다.

  • 디스크에 저장하거나 메모리에 로드할 때 필요한 메모리 공간이 더 작다
  • 데이터 크기가 줄어들어 연산량을 줄일 수 있다
  • 16비트나 8비브 임베디드 환경에서도 모델 추론을 수행할 수 있다

하지만 모델 양자화로 인해 모델의 정확도가 떨어져 학습 때보다 과소적합이 될 수 있기 때문에 양자화 후에도 모델 검증을 거쳐야 한다.

출처: https://developer.nvidia.com/blog/achieving-fp32-accuracy-for-int8-inference-using-quantization-aware-training-with-tensorrt/


학습된 모델을 양자화하기 위해 TensorRT나 TFLite를 이용할 수 있다.
TensorRT는 엔비디아에서 제공하는 라이브러리로 엔비디아 그래픽카드를 활용해 모델을 int8이나 float16 데이터형으로 양자화 및 최적화를 수행한다. 다만 TensorRT를 사용하기 위해서는 엔비디아 그래픽카드를 반드시 필요하다.
TensorFlow Lite (TFLite)는 텐서플로우에 최적화된 경량화 라이브러리로, 엔비디아 그래픽카드가 없어도 IoT나 모바일 환경을 대상으로 모델 경량화 할 수 있다. 다만 모델을 텐서플로우로 작성되야 하며 일부 텐서 연산은 지원하지 않는 경우도 있다.

가지치기

모델 가지치기(Pruning)이란 추론에 불필요한 가중치를 제거해 모델의 총 용량을 줄이는 경량화 기술이다. 보통은 학습 단계에서 필요없는 가중치를 0으로 만드는 방식을 취한다. 만약 가중치가 희소 표현으로 변하면 더 작은 크기로 압축할 수 있다.

출처: https://blogik.netlify.app/BoostCamp/U_stage/45_pruning/

증류

모델 증류(Distillation)란 학습한 모델보다 더 작은 모델을 만들어 같이 학습시키는 경량화 기술이다. 기존 모델보다 가중치가 더 적은 모델을 만들어 같이 학습시킨다. 이때 큰 모델은 작은 모델의 가중치 업데이트에 영향을 준다. 이러한 방식으로 작은 모델이 큰 모델의 성능을 따라가도록 학습시킨다. 그래서 큰 모델을 교사 모델, 작은 모델을 학생 모델이라 부르기도 한다.

출처: https://towardsdatascience.com/knowledge-distillation-simplified-dd4973dbc764

텐서플로우 서빙 모니터링 하기

텐서플로우 서빙은 프로메테우스(Prometheus)라는 모니터링 시스템을 통해 모델 서버가 원활히 운영되는지 확인할 수 있다. 텐서플로우 서빙은 프로메테우스에게 세션 실행 횟수나 그래프 실행 시간, 로드 지연 시간과 같은 지표들을 전달하는 기능을 지원한다. 다만 프로메테우스가 REST 엔드포인트만 지원하기 때문에 모델 서버가 gRPC 엔드포인트만 제공하는 경우 프로메테우스에게 전달하는 요청은 REST 방식으로 전달되도록 설정해야 한다.

프로메테우스를 통해 모델 서버의 시간당 요청 횟수를 그래프화 한 모습,  출처: https://itnext.io/monitor-deployed-tensorflow-models-with-prometheus-and-grafana-28d6135a2666

쿠버네티스에서 텐서플로 서빙 실행하기

모델 서버를 직접 실행하고 관리한다면 많은 수의 예측 요청이 들어올 때 빠르게 대응하기가 어렵다. 그래서 웹 서버의 경우에는 Docker Swarm이나 Kubernetes같은 컨테이너 오케스트레이션을 이용한다. 텐서플로우 서빙 또한 도커 컨테이너를 통해 실행할 수 있고 Kubernetes에 올려 더 쉽게 서비스를 확장할 수 있다. 또한 TFX을 Kubeflow에서 실행한다면 Kubernetes에서 머신러닝 파이프라인 전체를 실행할 수 있어 머신러닝 프로젝트 전체에 대한 확장성을 쉽게 관리할 수 있다.