Research/Machine Learning

serving, pytorch.

shhyun 2020. 4. 23. 20:00

꽤나 오랜만에 글을 쓰는 것 같은데, 참 오랫동안 ML 관련된 일을 하고 있다. 개인적으로는 backend, bigdata 관련 개발자이기도 하고, ML 을 오랫동안 하고 있다는 것 때문에 최근에 많이 요구하는 일들 중 하나가 serving 이다.  

serving 이 뭔데? 라고 물으신다면, scikit-learn/tensorflow/pytorch/mxnet 등등.. 다양한 ML 로 만들어진 Model을 서비스로 제공하는 방법을 말한다.

사실 scikit-learn 같은 경우엔 별 문제가 없다. scikit-learn 은 좀 헤비하다고 해도, 가벼운 수준이라 flask 같은 걸로 api 만들고, call 하면 그만이고, GPU 자원을 사용하는 것들도 없거나, 적어서 flask 만을 사용해도 별 무리가 없다. Tensorflow 도 마찬가지로 tf-serving 같은 것을 제공하기 때문에, model 에 대한 개발을 하고 있는 사람들이라면 큰 부담없이(?) serving 을 진행할 수 있다. 

근데, 참 곤란한게 pytorch 다. 아무래도 그간 research 에 대한 지원에 집중하였기 때문에, production level 로 넘어가는 데 있어서 tf-serving 같은 기능들이 없고, flask 로 만드는 model deployment 정도 샘플이 전부였는데, 이걸로 서비스 한다고하면, 솔직히 웃음밖에 안나온다.

왜냐면, CPU 만 사용하여 inference 를 한다면 그나마 별 문제는 없는데, 보통 속도 문제로 GPU를 필히 사용한다. 이 경우, 뒷단에서의 I/O 를 처리하는 것과 그 데이터가 도착하고나서 GPU 자원을 Sharing 하는 부분/Batching 처리/Queueing 등을 구현하기가 생각보다 까다롭다. 게다가 python 에서는 무조건 발목잡는 GIL 이 있기 때문에, 이걸 피하려고 하는 다양한 방법들을 생각해야 하는 것도 영 거지같다. 그리고 GPU 메모리 관리 측면에서 flask 같은 곳에서 여러개의 input 이 동시에 들어갈 때, pytorch가 동적으로 input 을 여러 개를 잡으려고 하면, 그만큼 GPU 메모리를 더 잡으려고 하다가 exception 이 발생하거나 그런 부분들이 영 핸들링하기가 어렵다.

그래서 다양한 방법들을 고민 했었는데, 비동기식 io/aiohttp 를 활용한 컨셉으로 고민한 [1]과 같은 훌륭한! 코드도 공유되어 있는 그런 자료도 있고, 이는 실제로 꽤 훌륭하게 동작한다. 물론 Batching 관련해서 문제가 있긴 하지만, 그런건 개인이 알아서 처리하는게 맞다고 본다. 어쨌든 대부분 Pytorch 가 이제 Research 측면에서 워낙에 대세가 되어 가고 있으니 많은 연구/개발이 진행되고 있긴 하지만, 결국엔 Pytorch 는 강력한 경쟁자(?)인 tensorflow 가 제공하는 tf-serving 의 편의성, 안정성 등이 그립다보니, pytorch 를 production level 에서 쓰는게 맞나 라는 고민이 계속 드는게 사실이다. 

하지만 역시 pytorch 도 마찬가지로 torchserve 를 들고 나왔다. 

https://pytorch.org/serve/

 

TorchServe — PyTorch/Serve master documentation

Shortcuts

pytorch.org

근데 한번 전체적으로 코드를 훑어봤는데, 아직은 많은 부분이 부족해 보인다. 왜냐하면 backend pipeline 만 flask 에서 java based 로 변경된 듯한 느낌이고, 본인들의 가속엔진인 torchscript 는 아직 미활용 상태라고 보는게 맞는 것 같다. tf-serving 에서 제공하는 여러 기능 중, model archive 라던가 이런것의 기초적인 상태를 제공하고 있는 것 같고, 어떤 방향으로 발전시킬 지는 모르겠지만, tf-serving 의 기능을 최대한 다 흡수했으면 좋겠고, 그보다 더 발전된 방향을 보여줬으면 좋겠다. 지금 코드 내부의 내용들이 S3 등 cloud 에 꽤 친숙한 사용을 위한 기능들 위주로 먼저 깊이있게 개발이 스타트 되는 것처럼 보이는데, 개인적으로는 On-premise 타겟으로 먼저 좀 챙겨주는게 좋지 않나 싶다. GPU Instance 솔직히 너무 비싸서... 

컨트리뷰터를 하나씩 살펴보니 이해가 간다. AWS 쪽에서 만든 Multi-model-server 를 이쪽으로 가져오고 있는 것 같고, 대부분이 AWS 관련자들인 것 같으니 이럴 수 밖에.. ㅎㅎ 방향은 잘 모르겠지만, 어쨌든 또 하나의 좋은 툴이 개발되고 있는 건 바람직한 일인 것 같다.

 

[1] https://medium.com/@ngoodger_7766/fast-gpu-based-pytorch-model-serving-in-100-lines-of-python-ed0fabd8cffb

P.S. 개인적으론 참 즐거운 시대가 왔다. ML 관련된 study 를 십여년간 해오고 있는데, 최근에는 EA 관련된 기술들도 인정받고 있다는 것이 감격스럽기도 하고, 한편으로는 두렵기도 하다. Resource 독점의 시대가 오고 있다는 생각도 들어서...