Monday, March 27, 2017

GPU 컴퓨팅이란?

GPU의 등장

GPU는 Graphic Processing Unit의 두문자집합이다.
'GPU'는 1999년 Nvidia가 GeForce 256을 발표하면서 처음 사용하였고, 지금은 일반명사가 되었다.

KL NVIDIA Geforce 256.jpg
By Konstantin Lanzet - received per EMail Camera: Canon EOS 400D, CC BY-SA 3.0, Link

GPU의 등장은 그 동안 단순한 화면출력 장치가 연산장치로 변화한다는 것을 의미했다. GPU의 등장으로 적은 컴퓨팅 자원으로 폴리곤(Polygon)을 화면 속에서 자연스럽게 구현(TCL; Transform, Clipping, and Lighting)할 수 있게 되었고, 프레임워크와 라이브러리를 통하여 사실적인 움직임을 보다 쉽게 만들 수 있게 되었다.

이렇게 새로운 시장을 연 Nvidia는 2007년 GPU를 일반연산에 참여시킬 수 있는 Tesla 제품군을 발표하며 새로운 코프로세서(co-processor)의 시대를 선언했다. 코프로세서로서의 GPU를 GPGPU, General Purpose Graphic Processing Unit이라고 한다. 즉, 그래픽 출력을 담보하지 않는 일반목적 연산장치이다.

GPU 컴퓨팅이란 바로, GPGPU를 연산에 참여시키는 것을 의미한다.

GPU가 연산하는 방식

GPU는 작고 단순한 연산 코어를 CPU와는 비교할 수 없을 정도로 많이 가지고 있다. 현재의 CPU가 서른개 미만의 코어를 가지고 있다면, 최신 GPU는 3천개 이상의 코어를 가지고 있다. 물론, GPU의 코어는 CPU의 코어와 비견될 만한 능력을 가지고 있는 것은 아니다. 하지만, 단순한 연산을 이 GPU에게 맡긴다면 그 효율은 엄청나다.

GPU의 효율을 말할 때, 항상 언급되는 것이 '병렬연산'이다. 많은 코어를 한 번에 많은 일을 시켜야 그 효율을 극대화 할 수 있다는 말도 된다. CPU는 그에 비해 '직렬연산'에 가깝다고 할 수 있다. 구조의 차이이지 능력의 차이는 아니다. 그렇다면 '병렬연산'과 '직렬연산'을 어떻게 비교할 수 있을까?

다음의 숫자들의 합을 구한다고 가정하자.
CPU는 첫번째 수부터 마지막 수까지 순차적으로 합하여 결과를 출력한다.
GPU는 일정한 묶음으로 처리할 수 있다. 연산단계가 엄청나게 짧아 결과출력까지의 시간을 획기적으로 단축시킬 수 있다. 혹은 동일 성격의 문제를 동시에 여러개 처리할 수 있다.

그림: 직렬연산과 병렬연산, 출처: 직접작성

GPU 컴퓨팅과 ML/DL

GPU는 이렇게 병렬연산에서 특별한 능력을 발휘한다. 이런 병렬연산이 특히 요구되는 분야가 machine learning/deep learning(ML/DL) 분야이다. 인공지능은 아직 찾아오지 않았고, 어쩌면 우리가 죽는 날까지 찾아오지 못 할지도 모른다. 1950년대부터 우리는 AI에 대한 부푼 꿈을 키워 왔지만 번번히 좌절했다. 하지만, 기계가 학습하여 보다 좋은 결론으로 빠르게 이르게 하는 것은 지금도 가능하다. 그것이 ML/DL이다. 그리고 GPU를 중심으로 눈부시게 발전하는 하드웨어 기술이 그것을 뒷받힘하고 있다.

ML/DL은 많은 데이터를 그리고 유사한 유형의 데이터를 반복적으로 분석하는 작업의 연속이다. 단순하게만 본다면 그렇다. 이러한 패턴은 병렬연산에 가깝다. 그래서 Ml/DL에서 하드웨어 기술로 GPU가 자주 언급되는 것이다.

IBM은 S822LC라는 서버 시스템에 GPGPU를 탑재하여 시장에 선보였다. 첫번째 제품이 코드네임, 'Firestone'이었고, 두번째 제품이 작년 겨울이 시작할 무렵 출시된 'Minsky'이다. 그렇다, 2016년 초에 작고하신 Marvin Lee Minsky 박사님을 기리는 의미로 지었다. Firestone이 여타 서버 시스템처럼 PCIe 버스에 K80을 장착한 것과는 다르게, Minsky는 Nvidia와의 협업을 통하여 기존의 PCIe를 대체하는 NVLink라는 새로운 전용 버스를 설계에 반영하여 P100을 장착했다.

GPU 컴퓨팅의 더 큰 가능성, NVLink

NVLink는 lane 당 20GB/s 대역폭을 가지고 있다. PCIe 3.0은 lane 당 1GB/s이다. NVLink는 GPU 당 4개의 lane을 가질 수 있고, PCIe 3.0의 최대 lane 수는 16개이다. NVLink는 GPU와 CPU 그리고 GPU와 GPU가 직접 연결(peer-to-peer)되지만, PCIe 3.0은 그렇지 못 하다. 이런 특성은 실제 운영환경에서 5배에서 12배의 데이터 이동 속도의 차이를 관찰할 수 있다. NVLink는 GPU의 가능성을 또 한 번 넓혔다.

---
이 글은  developer.ibm.com/kr 에 crossposting 됩니다.
관련 글: https://developer.ibm.com/kr/author/jhin/
같은 글: https://developer.ibm.com/kr/systems/gpu/2017/03/27/what-is-gpu-computing/