모델을 서빙하기에 앞서 무료로 쓸 수 있는 클라우드 서비스 중에 딥러닝 모델을 서빙할 만한 곳을 찾고 있었다.

딥러닝 모델이니 당연히 GPU 자원을 쓸 수 있는 곳이어야 한다고 생각했는데, 잘 생각해보니 그럴 필요가 없었다.

왜냐하면 딥러닝 모델에서 GPU를 사용하는 이유는 분산처리인데 내가 만들 서비스는 이미지 하나를 입력으로 받으므로 굳이 GPU를 사용할 필요가 없었던 것이다.

 

Deep Learning Inference & Serving Architecture 를 위한 실험 및 고찰 1 - GPU vs CPU 이라는 글에서 이미 어느 정도 정답을 유추할 수 있었다.

그러나 해당 글이 2017년도에 작성된 글이고, 그래도 얼마나 차이가 있을까 궁금하여 일단 실험을 진행해보았다.

실험 사양의 CPU는 AMD Ryzen 7 3700X 8core, GPU는 RTX 3070 8GB이다.

실험은 Jupyter notebook에서 %time, %timeit Magic Command를 이용하여 진행하였다.

 

실험 결과를 정리해서 나타내면 다음과 같다.

  CPU GPU
첫 Inference 343ms 6.7s
첫 Inference 이후 327 ms ± 3.2 ms 24.8 ms ± 644 µs

실험 결과는 GPU를 이용했을 때가 당연히 빨랐다. 다만, GPU는 첫 Inference에서 CUDA 라이브러리를 불러오는데 시간이 걸려서 약 6.7초 정도가 걸렸다.

CPU를 이용한 Inference도 트래픽이 많지 않다면 충분히 사용 가능하다고 생각했다. 물론 초당 수백, 수천장의 이미지가 들어온다면 문제가 발생하겠지만 지금은 서빙하는 것이 목적이기 때문에 크게 상관 없을 것 같다.

 

결과만 보면 위 글에서 도출한 결론과는 상반대는 결론이 나왔다. 이 부분은 아무래도 그 동안 CPU 성능의 발전에 비해 GPU 성능의 비약적인 발전때문이 아닌가 싶다. 4년 전에는 서버용 CPU와 K80의 부동소수점 연산 속도(FLOPS)가 비슷했을지 모르지만, 당장 수치적인 부분만 놓고 봐도 K80의 FP32(float) TFLOPS는 4.113 * 2인 8.226 TFLOPS이고, RTX 3070의 FP32(float) TFlops는 20.31 TFLOPS로 2.5배 정도 차이가 난다. 실제로 결과도 K80 Single Inference에서 50ms 정도인 것과 RTX 3070의 Inference Time을 비교해보면 2배 이상 차이가 난다. 또한, 3700X CPU의 FLOPS는 1,689.6 GFLOPS로 약 1.7TFLOP로 볼 수 있으니 RTX 3070의 Inference Time과 TFLOPS를 비교하면 얼추 일치한다고 볼 수 있다. 즉, 4년 전에 사용한 Azure VM의 CPU TFLOPS는 약 8~9 정도로 K80와 비슷한 성능이었기 때문에 이번에 진행한 실험과는 다른 결과가 나타났다고 생각할 수 있다.

 

항상 딥러닝 모델을 서빙하려면 좋은 컴퓨팅 자원이 있어야 한다고 생각했다. 물론 회사에서 서비스할 때에는 그렇겠지만, 개인이 테스트나 프로젝트를 목적으로 한다면 굳이 GPU를 사용하지 않고 CPU만으로도 충분한 Inference가 가능하다고 생각한다.

+ Recent posts