Project/Libtorch

LibTorch를 사용하는 이유

ys_cs17 2021. 1. 20. 13:28
반응형

1. 인공 지능의 플랫폼 적용 추세

custom model, transfer learning 된 model 등 다양한 deep learning model을 직접 서비스하는 platform들은 아직까지 상용화되지 않고 있습니다. 우리 주변에서 볼 수 있는 인공지능 프로그램은 대부분 GPU 서버를 사용하거나 GPU가 있는 로컬 환경에서 서비스되고 있습니다.

예를 들어 요즘 쉽게 볼 수 있는 코로나 관련 열 감지 프로그램 또한 대부분 gpu가 있는 컴퓨터, 서버를 사용하여 python 코드로 서비스되고 있습니다.

<출처 동아사이언스>

하지만 산업 환경에서 쓰이는 인공 지능 로봇이나 모든 사람들이 이용하는 양산화 서비스 제품을 출시하려면 어떻게 배포해야 할까요? 모든 서비스 제품에 GPU를 탑지 하거나 GPU 서버를 구축하는 방법은 메모리, latency, 비용, 개발 시간 관점 등에서 매우 큰 비용이 소비됩니다. 아직까지는 hardware 기술이 software 기술보다는 매우 뒤처지고 있습니다. 기술력은 되지만 막상 적용하려는 hardware가 별로 없으니 현재 인공 지능이 서비스되고 있는 분야는 생각보다 넓지 않습니다.

그래도 “pytorch, tensorflow 등 deep learning framework를 사용하면서 하드웨어 성능을 기다리면 되지 않을까?”라는 생각이 들 수도 있습니다. 나쁘지 않은 생각이지만 회사 관점에서는 무엇보다 release date가 중요하고, 추후 하드웨어와 소프트웨어의 호환성 문제 또한 고려해야 합니다.

현재 인공지능은 다양한 framework와 tools를 사용합니다. 만들어진 프로그램은 주로 서버를 통해 서비스를 진행합니다.

 

대표적인 방법은 크게 2가지입니다.

첫번째는 http 서버를 통해 다양한 platform에 분산시킵니다. 하지만 이는 80%의 application에서만 작동한다고 합니다.

두 번째는 REST API를 통한 서버 통신입니다. server에 설치된 딥러닝 프로그램을 구동하고, 여기서 나온 output을 외부 software로 건네줍니다. 하지만 REST API 특성상 딥러닝과 같이 한 가지 역할만 (input -> output만 도출하는 역할) 하는 프로그램에서 REST API는 적합하지 않습니다.

 

 

인공지능 platform을 service 하려면 3가지 요구사항을 반드시 충족시켜야 합니다.

1. 안정한 코드 및 framework, tool를 사용해야 합니다.

- 시스템 유지 보수와 안정화에는 상당한 시간이 많이 걸리고 이에 따라 소비되는 비용이 커집니다.

- 하지만 현재까지 나온 인공지능 관련 framework와 tool들은 꾸준히 버그 리포트가 나오고 있습니다.

 

2. 높은 성능

- 수많은 input을 handler 역할을 할 수 있는 서버가 필요하고 또한  적은 서버를 가지고 좋은 성능을 유지해야 합니다.

 

3. Low latency

- input으로부터 output 간 걸리는 시간을 최소화해야 합니다. 전체적인 서비스는 딥러닝뿐만 아니라 다양한 외부 프로그램에 적용시켜야 하기 때문입니다.

 

2. pure python의 한계점

python으로 작성된 딥러닝 prototype은 크게 3가지 part로 구성됩니다.

 

1. Data extraction

- 외부 소스로부터 데이터를 획득

2. preprocessing

- 데이터가 model에 들어가기 전 cpu를 사용하여 preprocess 과정을 거칩니다.

3. interface

- 실질적인 딥러닝 부분입니다.

 

구체적으로 설명을 하자면 데이터 추출은 주로 I/O와 네트워크 바운딩을 사용하고 preprocess는 cpu, 인터페이스는 gpu를 사용합니다. 이런 식으로 다양한 파트로 나누어지기 때문에 threading 모델을 적용시키는 방법이 적합합니다. 하지만 python을 사용한 threading model은 GIL(global interpreter lock)으로 인해 제한되고, interpreter 언어 특성상 처리량과 latency 또한 현저히 제한됩니다.

 

조금 더 디테일하게 접근을 하면

데이터 추출 부분은 대부분 network와 I/O를 통해 읽는데 이는 python 뿐만 아니라 다른 platform에서도 동일하게 적용됩니다.

Preprocess는 opencv, numpy, torch에서 제공하는 reshape, horizon과 같은 매머드의 조합을 통해 적용됩니다. 이 방법들은 생각보다는 빠르지만 라이브러리에 대한 memory 할당, 복사, operation 등을 제어할 수 있으면 훨씬 더 빨라질 수 있습니다.

interface 관점에서는 libtorch가 pytorch 보다 장점이 있다고 볼 수는 없지만 적어도 단점이 존재하지는 않는다고 합니다.

 

따라서 libtorch를 사용하는 가장 큰 이유는 python의 약점을 c++ 이 보완할 수 있기 때문입니다.

c++은 python보다 thread 처리에 적합하며 preprocess 과정에서도 메모리 처리가 더 수월합니다. 또한 python 코드와 interface 부분도 차이가 없으며 가장 중요한 건 디바이스와 호완 시 잘되기 때문입니다.

 

Reference

https://g-airborne.com/bringing-your-deep-learning-model-to-production-with-libtorch-part-1-why-libtorch/

반응형