딥러닝은 어렵습니다.
모델을 잘 쓸 수 있도록 서빙(Model serving)하는 것도 어렵습니다.
그럼에도 불구하고, 리턴제로(Return Zero Inc)에서는 딥러닝과 모델을 잘 서빙하는 두 마리 토끼를 동시에 잡으려고 노력하고 있습니다. 특히 저희가 연구하는 음성인식 기술분야는 다양한 모델들의 결과를 함께 사용하여 만들어지는 경우가 많습니다. 또한 뉴럴넷 기반의 모델뿐만 아니라 전통적인 머신러닝 모델도 함께 쓰이는 경우도 많습니다.
그래서 다양한 사람들이 서로 다른 사람이 만든 모델을 사용해야 할 일이 많은데, 이때 가볍고 사용하기 쉬운 인터페이스를 제공하는 것은 어려운 일이었습니다. 적당한 수준의 모델 서빙(Model Serving) 서버를 직접 만드는 것도 방법이겠지만, 시장에는 이미 다양한 솔루션들이 있었습니다.(저도 야크털깎기[Yak Shaving]을 참 좋아해서 직접 만들고 싶었지만 😹, 바퀴를 또 만들 필요는 없겠죠?)
예를 들면, Tensorflow Serving, BentoML, MLFlow, FastAI와 같은 것들을 활용하는 것이죠.
이렇게 다양한 솔루션을 검토해보다가 저희 팀은 NVIDIA에서 만든 Triton Inference Server라는 솔루션에 정착하였습니다.
Triton Inference Server
를 모르시는 분에게 아주 가볍게 설명하자면, GPU를 잘 가속하여 최적화된 모델을 서빙하기 위해 NVIDIA가 직접 만든 추론용 서버이고, 많은 경우 이 서버에 모델을 올려서 사용하는 것이 GPU를 효율적으로 사용하는데 도움이 됩니다.
but, tritonclient..
그럼 그냥 쓰면 되지, 왜 무슨 라이브러리(wrapper)를 만들었나. 하시는 분이 있을 텐데요..
여기에는 나름의 이유가 있습니다.
공식 홈페이지의 예제 사이트를 한번 들어가 봅시다.
단순한 예제 하나 돌려보고 싶어도 너무 많은 옵션과 다양한 설정값(configuration)이 존재해서 처음 접하는 사람들에게 혼란스러움을 주고 있습니다.
가장 대표 예제인 `image_client.py` 를 한번 보신다면, 너무 다양한 설정들로 인해 아주 간단히 구현해서 결과를 볼 수 있음에도 2022년 10월 기준 480라인의 코드로 이루어져 있습니다. 사실 이 예제도 제가 직접 triton server쪽에 PR을 날려서 많이 줄인 겁니다.
tritony!
그래서 리턴제로에서는 처음 triton inference server
를 접하는 접하는 팀원들의 학습허들을 가능한 낮추기 위해서 이 toolkit의 client를 더 쉽게 사용할 수 있도록 감싼 라이브러리(wrapper)를 작년부터 만들어서 써왔는데, 이번 기회에 최소한의 기능을 오픈소스로 만들어서 공개하고자 합니다.
위의 480줄의 코드를 처음 라이브러리를 접하는 사람들에게 단 69줄로 보기 좋게 핵심 기능만 표시해두었고, GitHub Actions
의 pytest 예제를 통해 원클릭으로 예제를 바로 실행시켜볼 수 있는 라이브러리를 제공합니다.
tritony 의 장점 요약을 해보자면 다음과 같습니다
- 🎉 짧아지는 코드
- 👀 http/grpc 통신 깔끔한 예제와 사용 예
- 🙏 커다란 numpy array를 알잘딱(알아서 잘 딱) tritonserver에 효율적으로 나누어 전송하는 기능
원래 내부의 다른 코드와 섞여있던 의존성을 제거하고 triton inference server
를 처음 접하는 분들도 위의 기능을 바로 써볼 수 있도록 오픈소스로 만들어봤습니다
pypi와 GitHub(https://github.com/rtzr/tritony)에서 바로 확인해보실 수 있고, 아래 커맨드로 간단히 설치가능합니다.
pip install tritony
Triton inference server
를 잘 쓰면 연구하면서 중간중간 평가(evaluation)하는 속도를 드라마틱하게 빠르게 만들 수 있습니다. 중간 결과물들을 자동적으로 GPU architecture 에 딱 맞게 변환한다면, 더 큰 batch_size를 추론할때도 유용합니다.
내부적으로는 단순히 tensorflow model
을 가볍게 서빙할때와 최적화해둔 모델을 API화 시켰을때의 추론 속도가 몇십배씩 차이나는 경우도 꽤 있었습니다.
이런 Triton inference server
를 쓰는 분들이 많이 늘어났으면 하는 바램으로, 이 라이브러리를 공개합니다.
Contribution…
이미 리턴제로의 실서비스에서도 이미 사용 중이지만, 딱 저희 서비스와 연구에서 쓰는 기능들 위주로 라이브러리를 만들다 보니 다른 사용 예를 커버하지 못할 수 있습니다. GitHub에 오셔서 좋은 기능 있으면 PR 만들어주시면 좋겠습니다. 공식 tritonclient에도 1년동안 큰 업데이트가 없다가 지난 9월초에 asyncio + tritonclient 가 새롭게 추가되었습니다. 이러한 부분은 충분히 검증되어 있지 않기때문에 라이브러리에는 아직 반영하지 못했습니다. 이렇게 빠져있는 부분들을 차근차근 적용해볼 예정입니다. (내부적으로 요청하는 부분은 원래 asyncio기반으로 구현되어있습니다.)