GPU 를 컴퓨팅 용도로 사용하면서 얻는 이점은 뭐가 있을까요?
CPU 는 일반적으로 순차적인 작업(Sequential task)에 강점이 있다고 이야기 합니다. 즉, 순차적으로 진행되는 작업들을 가장 빠르게 처리할 수 있는 장비입니다. GPU 는 순차적인 작업보다는 병렬적인 작업(Parralell task) 에 특화되어있다고 볼 수 있습니다.
GPU는 CPU 와 비교해봤을 때 개별 코어의 성능은 CPU 보다 떨어집니다. 다만 “코어 숫자” 를 비교해본다면 100배 이상 차이가 납니다. AMD Rome CPU 가 가지고 있는 최대 코어수는 64개죠. 그렇지만 NVIDIA A100 에서 가지고 있는 코어는 6912개 입니다. 물론 코어라고 다 같은 코어는 아닙니다. ㅎㅎ
다르게 말하면, CPU 는 Low latency, GPU 는 High Throughput 에 목적이 있다고 볼 수 있습니다.
따라서, 단순한 연산의 병렬처리가 많은 그래픽이나 머신 러닝 작업에는 CPU 보다는 GPU 가 더 적합하다고 이야기 하는 것입니다. 물론 제가 이러한 데이터 처리방법에 대해서는 까막눈이나 다름없기 때문에 깊게 파고들지는 못합니다.
좀 오래되긴 했지만, 아래 영상이 CPU/GPU 가 일하는 방식을 이래하기 위한 좋은 교재가 아닐까 싶은데요
How CPU / GPU Works
보시면, CPU 는 순차적으로 한개씩 페인트볼을 쏴가면서 그림을 완성하지만, GPU 는 1,100개의 엄청난 수의 페인트볼을 한방에 쏴서 그림을 완성합니다. 다만 개별 페인트볼을 움직이거나 할 수 없죠. CPU Core 가 훨씬 고차원의 연산을 수행하지만, 숫자가 적고, GPU 는 단순 연산을 수행하지만, 물량전으로 쓸어버린다고 볼 수 있습니다. (그림 완성 속도가 훨씬 빠름)
이렇게 할 수 있는 이유는 위 영상의 예를 보면, 페인트볼을 순차적으로 쏠 필요가 없기 때문입니다. 위 영상의 캔버스의 하나의 점을 하나의 픽셀이라고 가정해보면 이해하실 수 있을겁니다. 한화면을 표현하기 위해서 픽셀을 순서대로 출력할 필요가 없습니다. 그냥 뿌려줘야할 곳에 동시에 뿌려주면 끝인것이죠. 따라서 다량의 독립적인 한번에 처리할 때 (수많은 코어를 사용해서), GPU 가 CPU 보다 유리하다고 볼 수 있습니다.
다만 순차적인 연산을 해야할 경우에는 GPU 가 가지고 있는 수많은 코어들을 동시에 사용할수가 없습니다. 앞의 연산이 끝나야 뒤의 연산을 할 수 있기 때문입니다. 그래서 GPU 코어는 순차적인 연산에는 효율적이지 못합니다. (물량에서 오는 유리함을 살릴 수 없기 때문입니다.)
요약하면 다음과 같다고 볼 수 있겠네요.
- CPU Core 는 모든일을 다 할 수 있는 Generalist
- GPU Core 는 상대적으로 단순한 일을 빠르게 처리할 수 있는 Specialist
GPU Core – CUDA / Tensor
근데 이게 GPU 잖아요? 원래 그래픽 처리를 하는 용도입니다. 그래서 데이터연산 용도로 쓸려면 데이터의 형태를 그래픽이 처리되는 형태로 바꾸어줘야 합니다. 즉 행렬 연산이 필요하게 됩니다. 이때 이렇게 바꿔주는 역할을 하는것이 CUDA 입니다.
그리고 이러한 연산을 수행할 수 있는 GPU Core 를 NVIDIA 에서는 CUDA Core 라고 부릅니다.
다음은 CUDA 에서 처리를 하는 방식에 대한 그림입니다.
보시면, 메모리에서 GPU 메모리로 데이터를 복사하고, CPU 가 GPU 에게 데이터처리 수행을 지시합니다. 그리고 이러한 처리가 각각의 GPU Core 에서 병렬로 처리됩니다. 그리고 결과값을 다시 GPU 메모리에서 메인메모리로 다시 보내게 됩니다.
추가로 NVIDIA GPU 의 경우 3가지 종류의 코어가 존재합니다. 바로 CUDA / Tensor / Ray-Tracing 코어 입니다. 레이 트레이싱 코어는 일단 여기서는 생략하겠습니다. 왜냐면 레이 트레이싱 코어는 A100 등에는 없기 때문입니다. (RTX 라인의 그래픽카드에 탑채되어있습니다.)
- CUDA (Compute Unified Device Architecture) Core – General Purpose 병렬 연산용 프로세서.
- Tensor (텐서의 경우 다차원 배열의 데이터를 저장할 수 있는 일종의 컨테이너? 라고 보면 된다고 합니다.) Core – Deep learning 과 AI Workload 에 특화된 프로세서.
Tensor 코어는 한마디로 요약하면 행렬 연산에 특화된 코어 입니다. 이러한 행렬 연산을 한번의 사이클을 통해 끝낼 수 있다는게 특징입니다.
예를 들면, CUDA 의 경우 1GPU Clock 에 FP32 부동소수점 연산을 수행할 수 있다라고 했을때, Tensor 의 경우 1GPU Clock 에 다음과 같은 연산을 수행할 수 있습니다.
저도 상세하게는 모릅니다만 (제가 이런 수학쪽은 잼병이라), 암튼 훨씬 복잡한 연산을 수행하는데 특화되어있는 코어라고 보면 될것 같네요.
그럼 얼핏보면 Tensor 만 있으면 되는거 아닌가? 싶긴 합니다만, 나름의 장단점이 있다고 합니다. 정확한 계산값을 얻기에는 CUDA core 가 적합하고, 빠른 연산속도를 필요로 할때는 Tensor Core 가 좋지만, 계산 정확도는 떨어진다고 합니다. Tensor 가 Throughput 은 더 높은 코어라고 볼 수 있겠지요. (참고로 FP 의 숫자가 낮을수록 정확도는 떨어지고 속도는 빨라진다고 하네요)
단순요약하면
- CUDA 는 느리지만 정밀한 단순 연산에 쓰이는 코어
- Tensor 는 빠르지만 정확도가 (상대적으로) 떨어지는 다차원 배열 연산에 특화된 코어
GPU 가 AI/ML workload 에 특화되었다고 하죠, 위와 같은 내용을 이해하고 보시면 왜 그런지 그나마 이해하실 수 있을 겁니다.
AI/ML workload 는 방대한 양의 데이터를 습득하고 처리할 수 있는 컴퓨팅 파워가 필요하기 때문에 이걸 적은 숫자의 CPU core 로 순차적으로 처리하기에는 너무 오래 걸리는 것입니다.