반응형

딥러닝/머신러닝 관련 cpu , gpu 관련 정리된 좋은 글이 있어서 정보 저장 차원에서 퍼옵니다.

(출처 :  https://velog.io/@euisuk-chung/CPU%EC%99%80-GPU )

 

CPU와 GPU

우리가 통상적으로 딥러닝과 머신러닝을 할때 코드로 아래와 같이 쉽게 CPU를 사용할지 GPU를 사용할지 정해주곤 합니다.

import torch

# CUDA 사용여부
USE_CUDA = torch.cuda.is_available()
print(USE_CUDA)

# device 선언
device = torch.device('cuda:0' if USE_CUDA else 'cpu')

하지만, 막상 "CPU는 직렬연산이고, GPU는 병렬연산이니까 딥러닝은 GPU야!"라는 단순한 기본 지식말고는 아무것도 모르고 있다는 것을 자각하여 오늘은 "과연 CPU와 GPU는 어떠한 차이가 있을까?" 라는 주제로 포스팅을 해볼 예정입니다.

CPU와 GPU 그래서 그게 뭔데?

CPU와 GPU는 둘 다 데이터를 읽어들여 연산처리를 통해 답을 도출하는 기능을 수행하나, 이름과 구조에서 알수 있듯이 중앙 처리 장치(CPU)와 그래픽 처리 장치(GPU)는 역할이 매우 다릅니다.

  • 중앙 처리 장치(CPU, Central Processing Unit)
  • 그래픽 처리 장치(GPU, Grapical Processing Unit)

CPU·GPU와 같은 프로세서 내부는 크게 연산을 담당하는 산출연산처리장치(ALU, Arithmetic Logic Unit)와 명령어를 해석·실행하는 컨트롤유닛(CU, Control Unit), 각종 데이터를 담아두는 캐시(Cache)로 나뉘게 됩니다. 각각 하나씩 살펴보도록 하겠습니다.

CPU란,

CPU는 입출력장치, 기억장치, 연산장치를 비롯한 컴퓨터 리소스를 이용하는 최상위 계층 장치로써, 컴퓨터의 두뇌를 담당합니다. CPU는 컴퓨터 및 운영 체제에 필요한 명령과 처리를 실행하므로 모든 현대 컴퓨팅 시스템에 필수적인 요소입니다.

CPU는 명령어가 입력된 순서대로 데이터를 처리하는 순차적인(Sequential) 처리 방식에 특화된 구조를 가지고 있습니다. 이는 한 번에 한 가지의 명령어만 처리한다는 것을 의미하며, 그렇기에 연산을 담당하는 ALU의 개수가 많을 필요가 없게 됩니다. 예를 들어 CPU 제품들 중 Octa-core CPU의 경우에는 코어 당 1개씩, 총 8개의 ALU가 탑재되어 있는 제품입니다.

CPU 내부의 절반 이상은 캐시 메모리로 채워져 있습니다. 캐시 메모리는 CPU와 램(RAM)과의 속도차이로 발행하는 병목현상을 막기 위한 장치로써, CPU가 처리할 데이터를 미리 RAM에서 불러와 CPU 내부 캐시 메모리에 임시로 저장해 처리 속도를 높일 수 있게 됩니다. CPU가 단일 명령어를 빠르게 처리할 수 있는 비결도 바로 이 캐시 메모리 때문이라고 할 수 있습니다.

GPU란,

여기서 잠깐! 그렇다면 "딥러닝을 학습할때 GPU를 쓰면 무조건 성능이 좋다그러던데 그럼 GPU가 CPU보다 빠르고, 좋은거 아닌가?" 라는 의문점을 품는 이들이 있을 것입니다.

일반적으로 범용 컴퓨팅 측면에서 CPU는 GPU보다 훨씬 더 성능이 좋다고 할 수 있습니다. CPU는 GPU에서 발견되는 것보다 더 높은 클럭 속도(aka 주파수)를 가진 더 적은 수의 프로세서 코어 로 설계되어 일련의 작업을 매우 빠르게 완료 할 수 있기 때문입니다.

하지만, 딥러닝 학습 측면에서는 GPU가 CPU보다 좋다고 할 수 있습니다.(무조건은 X) GPU에 대해 알아볼까요? GPU는 CPU에 비해 훨씬 더 많은 수의 코어를 가지고 있으며 애초에 설계도 다른 목적으로 만들어졌습니다. 최초의 GPU는 이름에서 알수 있다시피 그래픽 처리 장치로써, 그래픽 렌더링의 성능을 가속화하도록 설계되었습니다.

CPU와 GPU의 발전을 간단하게 소개를 안 할 수가 없을 것 같은데요. 아주 좋은 설명이 있어서 링크 걸어두겠습니다. (링크 : 그래픽 카드 이야기) 본 영상을 요약하자면, 기존의 CPU는 컴퓨터가 하는 모든 일을 조종/통제해왔습니다. 그러나 점점 기술이 발전하면서 GUI(Graphical User Interface) 등의 다양한 로드가 추가 되었고, 이는 CPU의 성능 저하로 이어져 CPU가 제때 제때 중요한 연산을 못하게 되었습니다. 그러자 이제 개발자들은 간단한 연산들(ex. 그래픽 작업)은 다른 Processing Unit에게 맡기고 기존의 중요한 일을 CPU에게 맡기도록 하자는 아이디어가 나왔고 그것이 바로 GPU의 탄생이 되게 됩니다.

이렇게 CPU의 부담스러운 계산을 GPU가 오프로드해줌으로써 처리 능력을 확보 할 수 있도록함으로써 계속해 발전되어 왔습니다. CPU는 GPU를 포함한 시스템의 나머지 부분에 지침을 제공하는 작업의 두뇌로, GPU는 병렬 처리 아키텍처로 인해 CPU보다 이미지 렌더링에 최적화되어 발전되어 왔습니다. 요약하자면, CPU는 어려운 문제를 푸는데 특화된 소수 정예 싱글코어, 그리고 GPU는 쉬운 문제를 동시에 푸는 데 특화된 인해전술 멀티코어라고 보면 될거 같습니다.

기존의 CPU가 순차적인 처리 방식에 특화되어 있었다면, GPU는 병렬적인(Parallel) 처리 방식에 특화되어 있으며 이로 인해 반복적이고 비슷한 대량의 연산을 수행하는 데에 있어서 속도가 빠릅니다. GPU는 더 작고 보다 전문화된 여러개의 코어로 구성된 프로세서입니다. 여러 개의 코어가 함께 작동하므로, 여러 코어로 나누어 처리할 수 있는 작업의 경우 GPU가 엄청난 성능 이점을 제공합니다. 기존의 CPU가 6-8개의 코어로 구성되어 있다면, GPU는 어떤 GPU인가에 따라 많이 상이하지만 적게는 수백개에서 많게는 수천개의 코어로 구성되어 있습니다.

Source : https://kr.nvidia.com/object/what-is-gpu-computing-kr.html

우리가 딥러닝을 생각해보면 대부분이 벡터나 행렬 연산으로 이루어져있다고 해도 과언이 아닌데요. 이러한 잘 나누어지는 계산, 즉 병렬성이 극대화된 계산은 GPU가 이미 해오던 연산으로, GPU를 딥러닝 연산에 사용하게 됨으써 CPU보다 더 빠르고 최적화된 연산을 수행하게 됬다고 보시면 될 것 같습니다.

실험해봅시다!

다음은 속도 비교를 위해 간단하게 코드로 연산 및 처리 속도를 비교해 본 것인요.

단순한 상수 연산을 수행할 때 각각 CPU는 5.84ms, GPU는 42.8ms가 나온 것을 통해 우리는 CPU가 하나의 연산을 수행함에 있어서 더 우수한 것을 볼 수 있습니다. 반면에 10000 by 10000 행렬연산을 수행하는 데 있어서는 CPU는 13.7s, GPU는 785ms인 것을 통해 GPU가 병렬 연산을 하는데 있어서 더 빠른 것을 직접적으로 확인해 볼 수 있습니다.

이상으로 오늘 포스팅 마치도록 하겠습니다 ^~^

긴 글 읽어주셔서 감사합니다!

반응형

+ Recent posts