후로링의 프로그래밍 이야기

Tensorflow serving introduction 본문

Tensorflow

Tensorflow serving introduction

후로린 2018.06.07 11:16

  • Tensorflow Serving  

  • Introduction  

  • 동일한 서버 아키텍처를 유지하며 새로운 알고리즘을 쉽게 배포할 수 있도록 만들어졌다. 

  • 다른 모델과 데이터에 대해 쉽게 확장이 가능하도록 만들어졌다. 

  • Key Concepts 

 

-Servables  

  • serving의 핵심 부분이며 클라이언트가 계산을 수행하는데 사용하는 기본 오브젝트 

  • 추론결과,  API,  비동기적인 여러 추론연산의 실행등이 포함된다. 

  • tensorflow에서의 session을 포함하는 개념 

Servable Versions  

  • Tensorflow Serving은 여러개의 추론모델 버전을 관리하고 실행할 수 있다.  

  • 쉬운 버전관리와 업그레이드/다운그레이드를 통해 유연하게 서비스 하는것이 가능하다. 

-Serbable Streams  

  • Servable version의 sequence이다 

-Models  

  • 여러개의 복잡한 모델을 한번에 serving하는 것, 큰 하나의 모델을 여러개로 나누어 serving하는것 모두 가능하다.  

-Loders  

  • servable은 스스로 life cycle을 관리하지 못하며 loder에 의해 관리된다. servable을 load/unload하며 데이터를 어떻게 사용해야 할지 결정한다.  

-Sources  

  • RPC와 같은 메커니즘에 접근하며 loders를 가져와 서비스를 제공하는 플러그인모듈 

-Aspired Versions  

  • 위의 architecture로 구성된 서비스 가능한 버전을 말한다.  

  • 소스가 Manager에게 새 버전을 제공하면 이전버전의 servable stream을 대체한다.(고급자습서 참조) 

-Managers  

  • Managers는 servable의 모든 라이프사이클을 관리한다.  

  • Loading/serving/unloading servables 

-Life of servable 

 

-source가 어떠한 version의 loader를 만든다.  


-loader는 servable을 load하기 위한 여러 metadata를 가지고 있다.  


-source는 Manager에게 Aspired version을 보내준다.  


-Manager는 새로 들어온 버전을 보고 어떤 버전을 load/unload할지 선택한다.  


-안전한 버전이라고 판단될경우 필요한 리소스를 loader에게 요청한다.  


-client는 Manager에게 servable을 요청하고 Manager는 servable에 대한 handle을 제공한다.  

 

-Tutorial은 있으나 api에 대한 document가 없음 

 

  • Make inference model (custom model)                        

                        Saved_model -> Tensolflow_model_server -> Client 

 

-Model export(2 method) 

 

serving이 가능한 형태로 export  

 

  • -Signature_def 정의 후 Protocol Buffer 형태로 저장 


  • -SIgnature_def : Tensorflow Serving에서 제공하는 고급 추론 API를 사용하기위해  inputsoutputsmothod_name을 Protocol Buffer내에 정의한다.   


  • -Protocol Buffer : graph_def와 weights가 들어있는 직렬화 된 바이너리 형태의 인스턴스 

-일반적인 tensorflow model export 이후 Model surgery 

 

  • -Weight가 들어있는 'check point'와 그래프의 정의가 들어있는 'protocol buffer textexport 


  • -Weight + GraphDef = Protocol buffer 형태로 freeze 


  • -Frozen model을 불러와 입력과 출력에 serving이 가능한 형태의 input과 output을 연결하여 Protocol buffer 파일 생성 

-Tensorflow model server 

 

-위에서 생성한 Saved_model을 이용해 추론서버를 실행한다.  

     

-Bazel build(for better performance)  


-Pip package를 통해 설치하는 방법과 Bazel을 이용한 빌드 두가지 방법 


-파이썬 코드로 실행하지 않고 bin파일을 이용해 실행하는 만큼 빠르다  


-GRPC 

 

 

  • -https://grpc.io/docs/guides/index.html 


  • -google이 사용하고 배포하는 라이브러리. 구글이 1초에 날리는 RPC call -> 10,000,000,000번  


  • -RPC(Remote Procedure Call) 

    • HTTP 기반으로, 원격지에 위치한 프로그램을 로컬에 있는 프로그램처럼 사용 가능하게 만들어준다.  

    • 네트워크에 대한 상세 내용을 알 필요 없이 함수호출로 간단히 사용 할 수 있음  

    • 기존의 RESTful API와 반대되는 개념으로, 비교적 개발하기 어렵고 구현체를 이해하기 쉽지않다. 


  • -protocol buffer를 사용하기 떄문에 매우 빠르고 throughput이 높다( binary protocol, HTTP/2) 

  • 영상 알고리즘적인 최적화 외에도 gRPC서버에서 최적화 할 수 있는 몇가지 방법이 있음(응답대신 성공여부만 관리하는 방법 등) https://grpc.io/docs/tutorials/basic/python.html 


  • -Stub : RPC서버와 클라이언트의 중계자. 원격 연결, 데이터 형식을 맞춰준다.  


-Batching 

  • -https://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching 


  • -Client의 요청을 일괄처리하고 일괄예약하는 라이브러리를 제공 


  • -Batching parameters 

     

    • -max_batch_size : 한 request를 요청할 때 허용 가능한 최대 이미지 개수 

    • -batch_timeout_micros : batch를 처리하기 전 최대로 기다리는 시간 

    • -num_batch_threads : batches의 동시 처리 개수 

    • -max_enqueued_batches : queue에 들어갈 수 있는 최대 batch의 개수 

  • -Performance tuning  

    • -모델과 데이터, 서비스 환경의 사양에 맞는 파라미터 최적화가 필요(많은 실험이 필요하다) 



- Client 

 

-Data transfer 

  • Client에서 jpg를 보내면 네트워크의 input에서 decoding 및 resizing 수행 

  • Tensor proto 형태로 만들어 signature_def에서 설정해 둔 input에 입력한다. 

-RPC callback 

  • Model server의 정보, 데이터를 담은 request를 stub에 전달한다. 

-Return inference result 

 

  • Tensorflow model silm  

-https://github.com/tensorflow/models/tree/master/research/slim 


-Tensorflow Slim  

  • Tensorflow를 더 쉽고 빠르게 사용할 수 있도록 제공하는 라이브러리 

  • 같은 모델일경우 작성해야 하는 코드가 최대 10배이상 줄어든다 

  • Slim을 활용한 다양한 모델의 코드와 학습된 weight를 제공한다.  

-Trained weight for imageNet dataset 



-Weights가 담긴 pb파일을 제공하지 않고 그래프 정보만 담긴 pb파일 check point파일 제공하기 때문에 graph freeze 및 inputoutput layer mapping이 필요하다.  


-Classification 모델만 제공하기 때문에 mapping할 output부분의 수정이 필요하다(boxesnum_detections등 불필요) 

-Fine-tuning을 간단히 수행할 수 있도록 라이브러리를 제공한다. 

 


  • Tensorflow detection model zoo 

 

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md 

COCO dataset 으로 training한 weights를 제공한다.  



-Frozen graph를 제공하기 때문에 따로 graph_def와 weight를 결합할 필요 없이 decoding input layer와 output layer만 mapping 해주면 된다. 


-Region proposal 부분때문에 fine tuning을 위해서는 그래프를 분리해야 할 것 같다. 

 

-SSD_MobileNet 예제 수행 결과 

 

-CPU에서 수행시 장당 60~70ms(uint8 자료형 사용) 


-Tensorflow를 GPU버전으로 빌드시 장당 30~40ms 


-제대로 된 GPU를 활용해 batching을 한다면 수행 가능한 batch마다 매우 빠른 속도로 수행이 가능할 것으로 보임