Tensorflow serving introduction
이 글은 기본적으로 Tensorflow에 대한 이해(Tensorflow Detection API를 통해 이미지 Inference를 해봤으며, 간단한 mnist tutorial정도는 이해할 수 있는 정도)가 있어야 진행이 가능하기때문에 인터넷상의 여러 자료들을 보며 같이 공부하거나 공부한 후에 보시면 좋을것 같습니다!
Tensorflow?
Tensorflow란 데이터의 흐름을 표현하기 위한 라이브러리 입니다. 일반적으로 딥러닝을 활용하기위해 많이 사용하게 됩니다. Python, C, Java script등 대부분의 언어를 지원하며 이와같은 특성 때문에 PC, 모바일 기기를 모두 지원하는 범용성이 높은 라이브러리 입니다. 또한 많은 Third parth에서 지원하고 있으며, Azure, GCP, AWS등 public cloud 등에서도 tensorflow는 무조건적으로 지원되는 라이브러리 입니다.
Tensorflow serving?
딥러닝 서비스를 고객에게 제공하기 위해 열심히 연구/개발을 통해 고객에서 서비스 할 수 있는 딥러닝 모델을 만들었습니다. 혹은 남이 만들어 놓은 모델을 실제 서비스에 사용하고 싶습니다. 이제 이걸 어떻게 사용자에게 제공할 수 있을까요? 기존에 Inference하던 장비에다 WAS를 달고, 딥러닝 모델을 올리고, 들어온 자료를 배치로 만들고, 스케쥴링하고, 결과를 정리해서 Client에 보내는 모든 작업을 직접 구현한다면.. 이것만으로도 서비스를 개발하기위한 작업량보다 많아지게 됩니다. 개발자는 서비스의 완성도에 집중할 수 없게 되고, 결국 사용자에게 제대로된 서비스를 제공할 수 없게 됩니다.
Tensorflow serving은 이러한 니즈에 맞추어 개발된 라이브러리 입니다. Tensorflow로 개발된 모델 혹은 Tensorflow로 변환이 가능한 모델에 대해 버전관리, batching, intput/output 관리등을 수행해주어 딥러닝모델을 이용한 서비스를 누구나 쉽게 개발 할 수 있습니다.
REST, gRPC형태의 API의 기본적인 기능을 모두 제공하고 있어 Client side에서 편하게 사용할 수 있습니다. REST, gRPC의 형태는 Client의 언어에 구애받지 않기때문에 어떤 플랫폼, 어떤 언어에서도 Server에 대한 호출이 가능합니다.
Google에서 개발/관리 되는 라이브러리이며 비슷한 것으로는 Nvidia에서 제공하는 TensorRT inference server가 있습니다. TensorRT inference server도 추후에 다루도록 하겠습니다.
Key Concepts
Servables
- Tensorflow Serving의 핵십 부분이며 클라이언트가 계산을 수행하는데 사용하는 기본 오브젝트 입니다. 단순하게 딥러닝 모델파일이라고 생각하셔도 되지만, Servable에는 추론및 추론결과, API, 비동기적인 여러 추론 연산들이 포함되어 있습니다. Tensorflow에서 session을 통해 모델을 실행하게 되는데요, 이부분과 이를 핸들링하는부분까지 포함한 부분이라고 생각하시면 됩니다.
Servable Versions
- 딥러닝 모델을 배포했는데 결과가 생각보다 좋지않다면 다운그레이드 해야합니다. 또한 딥러닝 모델의 업그레이드를 위해 모델을 바꾸는 등의 업그레이드를 해야 합니다. 실제 서비스에 영향을 주지 않으면서 이를 수행하기 위해서는 들어오는 작업들을 큐에 넣어놓은 후에 GPU에서 모델을 내리고, 다시 적재한 후에 큐에 쌓인 작업들을 적절히 처리하는 과정이 필요합니다. 매우 복잡하며 위험도가 높습니다.
- Tensorflow Serving은 여러개의 추론모델의 버전을 관리하고 실행할 수 있으며, 업그레이드/다운그레이드를 순식간에 끝내주며 실제 서비스에 거의 영향을 주지 않습니다.
Models
- 실제 서비스에는 여러 모델을 한번에 사용하는 경우가 많습니다. 원래대로 라면 GPU를 쪼개서 사용하기위해 메모리, throughput관리등을 하는 모듈을 개발해야 겠지만 Tensorflow Serving은 여러모델, 하나의 큰 모델을 여러개로 serving하는것 모두 가능합니다.
Loders
- servable은 스스로 life cycle을 관리하지 못하며 loder에 로드된 후에 사용이 가능합니다.
Managers
-
Managers는 servable의 모든 라이프사이클(loading, serving, unloading)을 관리합니다.
Servable Lifecycle
-source가 어떠한 version의 loader를 만든다.
-loader는 servable을 load하기 위한 여러 metadata를 가지고 있다.
-source는 Manager에게 Aspired version을 보내준다.
-Manager는 새로 들어온 버전을 보고 어떤 버전을 load/unload할지 선택한다.
-안전한 버전이라고 판단될경우 필요한 리소스를 loader에게 요청한다.
-client는 Manager에게 servable을 요청하고 Manager는 servable에 대한 handle을 제공한다.
여기까지가 Tensorflow Serving의 기본적인 구조입니다. 가벼운 마음으로 읽고 실제 실습으로 넘어가면 될것 같습니다.