안녕하세요~

정말 오랜만에 글을 쓰네요 ㅎㅎ



제 블로그 조회기록을 보니

GPU관련 조회수가 많아지는 것 같더라구요!


그래서 이번 글에서 

지난 내용들을 영상으로 요약정리해봤어요~


CUDA study를 하면서 

제가 발표했던 영상이니 많이 봐주세요~! ㅎㅎ

(발표는 1:30초 부터에요!)




안녕하세요~


이번글에서는 NVIDIA가 자신들이 직접 외장그래픽카드를 단품으로 판매하는것이 아닌 사용자들이 클라우드 형태로 제공해주는 서비스(솔루션)에 대해서 알아 볼거에요!


(PPT로 정리해놓은게 있어서 대부분 PPT 스크린 샷으로 대체했습니다!)




<1.NVIDIA의 클라우드 사업: 데이터센터 확장>



1) 출현배경


첫 번째 이유: 기존의 서버를 다루는 방식은 장소 제한적이다.


회사들을 보통 '서버'를 구축해서 사용자들에게 서비스를 제공해요. 그래서 회사에서 엄청난 자금을 투자해 고급 서버를 구성하게 되는거죠.


그런데 보통 회사내에서는 보안문제로 자신들의 서버를 외부로 노출시키지 않게 하려고 방화벽을 둔다던지, 인트라넷을 구축해서 외부에서 접속하는걸 차단한다던지 여러 방식을 써서 외부와의 단절을 시도하려고 해요.


그런데, 잠시 업무차 외부에 나가있는동안 갑자기 서버에 문제가 생겨서 서버의 에러가 생길때 이를 고쳐야 하는 경우가 생기는데, 이때마다 회사로 다시가야할까요?


특히 코로나가 지속되는 상황에서 재택근무를 한다고 하면 어떻게 해야할까요? (물론 포트를 열어주고 하긴 하겠지만 그래도 좀...)


두 번째 이유: 성능 좋은 GPU 너무 비싸다.


최근에 나온 Ampere 아키텍처의 GPU 모델 중 하나인 A100 가격은 약 200k달러였어요. 이건.. 일반 사용자들이 감당할 수 없는 금액이며 심지어 회사에서도 투자하기가 힘든 금액이에요..


그런데 생각해보면 외장그래픽을 구매한다는건 24시간 365일 동안 계속 점유하고 쓰겠다는말과 같아요. 그런데 일반적으로 딥러닝 하시는 분들은 Test를 하거나, Training을 하거나 할때 사용하시죠?

(물론 서버로 딥러닝 관련 서비스를 제공하시는 분들은 24시간 사용하실 수 있겠지만 이 마저도 시간대에 따라서 사용자가 몰리는 시간대가 있고 몰리지 않는 시간대가 있을거에요)


그렇다면 우리가 외장그래픽을 잠시 빌려 사용한만큼만 돈을 내면 어떨까요?




2) NVIDIA 데이터센터에 투자하다.


2020년 5월 NVIDIA 회장은 GTC에서 데이터센터를 확장시킨다고 공식적으로 선언했습니다. 



<사진1>


데이터센터란 NVIDIA가 자신들의 외장그래픽을 클라우드 형태로 제공해주기위해 아키텍처 별로 따로 외장그래픽이 모인 하나의 거대한 센터를 지어 클라우드 형태로 외장그래픽을 제공해주면서 관련 데이터(작업)을 지원해주는 곳이라고 보시면되요.


<사진2. NVIDIA 데이터 센터>









NVIDIA가 제공해주는 데이터센터에 관해 자세히 보시려면 아래 순서대로 접근하시면 돼요!


https://www.nvidia.com/ko-kr/



그리고 아래 순서를 따라오시면

데이터센터에서 제공해주는 대표적인 외장그래픽 모델을 보실 수 있으실거에요.


A100은 Ampere 아키텍처 기반으로 만들어 졌고, T4는 Turing 아키텍처, V100은 Volta 아키텍처 기반으로 만들어진 모델이에요.


데이터센터에서는 일반 타이탄 시리즈나 Geforce 시리즈는 제공을 해주지 않아요!

(참고로 단일 A100을 이용하는 것보다 같은 금액으로 여러개의 타이탄 V 또는 Geforce 시리즈 그래픽카드를 여러개 사는것이 더 좋다는 의견도 있어요 ㅎㅎ)


데이터센터에서 제공해주는 제품들에 대한 성능 차이는 아래와 같아요. (아래 순서대로 성능이 좋아지는 거구나라고 생각하시면 될거에요!








<P100(파스칼 아키텍처 기반) VS CPU VS K80 (케플러 아키텍처 기반)>







<V100 VS P100>

<사진3>








<A100 VS V100 VS T4>








<T4>


T4는 사실 A100, V100 보다 속도면에서 떨어지지만

가성비면에서 주목할 만한 서비라고 생각해요.


그리고 그외에 컨테이너 기술이나 

다른 소프트에어 기술도 지원이 된다고 하니

이러한 부분을 주목하시는 분들은 T4 데이터 센터를 사용하시는걸 추천드려요!

(지금 언급한 기술들이 V100에 적용이 되는건진 잘모르겠는데,

A100에서는 제공이 되는거 같더라구요 ㅎㅎ)







3) GCP(Google Cloud Platform), AWS(Amazon Web Service), Azure(Microsoft)와의 협업


흔히 우리가 NVIDIA 데이터센터를 이용하기 위해서는 NVIDIA에 직접문의 하기 보다는 GCP, AWS, Azure라는 곳에서 클라우드 시스템(인스턴스)을 구축할 때 NVIDIA 데이터센터를 사용하게돼요.

(예를들어, GCP에서 클라우드 인스턴스를 구축하기 위해, CPU, SSD, GPU 등등 설정해야할 때, GPU 항목선택시 NVIDIA 데이터센터에서 제공해주는 클라우드용 외장그래픽(GPU)을 선택하게 됩니다. (추후에 클라우드 관련 카테고리를 개설하면 자세히 알려드릴게요!)




아래순서대로 따라오시면



아래와 같은 테이블을 보실 수 있으실거에요.







4) 클라우드 서비스와 관련된 최신기사(2020.07.10 기준)


2020.07.08일 Google Cloud가 "NVIDIA A100을 지원하는 A2 인스턴스를 제공할 예정"이라고 발표했어요.


관련기사 링크 -> https://cloud.google.com/blog/products/compute/announcing-google-cloud-a2-vm-family-based-on-nvidia-a100-gpu?fbclid=IwAR3GqK4Sr_ETrTJCgn-GlISW4yPC6bHOC2qKMM0W7gb8LazoXEsjM6h-B5A









만약 딥러닝, AI 관련해서 NVIDIA에서 제공하는 서비스에 대해 더 알고 싶으신 분들은 아래처럼 NVIDIA 사이트에 접속하신 후, 딥러닝&AI 섹션에 가서 살펴보시면 될 것 같아요.


예를들어, 업계별 섹션은 '자율주행 자동차', '로보틱스', '헬스케어&생명과학' 세부 섹션으로 나뉘어 있어요.









지금까지 딥러닝을 위해 제공되는 외장그래픽과 NVIDIA 제품군들에 대해서 알아보았어요.

다음글부터는 NVIDIA, GPU, 외장그래픽 관련해서 올라오는 최신 기사들을 간단하게 요약하는 글을 작성하도록 할거에요!






[사진 래퍼런스]

사진1

https://www.kipost.net/news/articleView.html?idxno=200720

사진2

https://www.techpowerup.com/239994/nvidia-forbids-geforce-driver-deployment-in-data-centers

사진3

https://www.microway.com/hpc-tech-tips/nvidia-turing-tesla-t4-hpc-performance-benchmarks/tesla_comparison_t4-p100-v100/

https://lambdalabs.com/blog/2080-ti-deep-learning-benchmarks/


안녕하세요~


이번글에서는 NVIDIA GPU 제품에 대해서 소개해드리려고해요~





<1. Geforce VS Quadro>


NVIDIA는 외장 그래픽 카드를 출시할 때, Geforce 계열과 Quadro 계열로 나눠서 상품을 출시해요.



<사진1>




<사진2>




1) Quadro 계열


그래픽 개발 및 작업용으로 만들어졌고, 세대에 따라 K(케플러), M(맥스웰), P(파스칼)로 나눈다고해요.

GPU 아키텍처에 따라 나누는듯 합니다.





2) Geforce 계열


Geforce 계열은 게이밍을 위해 만들어진 GPU라고 해요.

전체적인 성능에 따라 GT<GTS<GTX 순으로 정렬할 수 있고, 최근에는 GTX 버전만 출시 된다고 합니다.

GTX는 3D 게이밍을 위한 등급이라고 하지만, 최근에는 GPGPU 성능에 초점을 두기 시작하고 있는거 같더라구요.


<사진3>




아래 Geforce 계열 시리즈와 대응되는 GPU 아키텍처를 보여주고 있어요.


흔히, Tesla 아키텍처를 기반으로한 Geforce 2세대(200)부터 NVIDIA 외장그래픽 카드를 보편적으로 인식하기 시작했는데요. 200(2세대) -> 300(3세대) ->400(4세대) -> ..... ->900(9세대) -> 1000(10세대) -> 2000(20세대;RTX) -> 1600(16세대) 순으로 발전하고 있어요. (10세대 부터는 GTX 1050 모델을 기점으로 10씩 증가하네요)


<사진4>





<2. Ti란?>


Geforce 외장그래픽 모델을 보면 Ti라는 명칭이 있는데 이것이 의미하는 바가 뭘까요?


예를들어, Geforce N 버전에서 N+1버전으로 넘어갈 때는 보통 GPU 아키텍처가 변한다던가, 그외에 혁신적인 기능이 추가되어야 해요. 그런데, 이러한 혁신적인 변화가 주기적으로 일어나는게 아니기 때문에 회사 입장에서는 그래도 조금 개선된 모델을 빠르게 출시해야 시장을 유지할 수 있어요.


Geforce 2 or 4 버전부터 NVIDIA는 개선형 외장 그래픽 카드에 Titanium을 줄여 Ti라는 naminig을 덧 붙이면서 마케팅을 하기 시작합니다. 그래서 Geforce 1070 Ti라고 하면 1070보다는 좋은데 1080보다는 성능이 떨어지는 버전이라고 인식하시면 될 것 같아요.



<사진5>






<3. TITAN>


'사진4'를 보시면 중간중간에 TITAN이라는 모델이 눈에 들어오실거에요. 

TITAN이라는 네이밍을 붙이는 이유를 명확하게 규명한 곳을 찾지는 못했는데요.


대략적으로 보면 해당 세대에서 최강의 성능을 보여준다는 뜻으로 받아들이면 되지 않을까 싶어요. 일반적으로 게이밍같은 목적보다는 연구자들을 위해 제공되는 제품이라고해요 (슈퍼컴퓨터 용도로도 쓰인다고 하니..). 그래서 보통 Desktop 용 보다는 workstation 같은 곳에 사용된다고 합니다.


(그런데, TITAN 모델이 나오고 나면 또 금방 Desktop용 모델 중에 성능이 뛰어난것들이 금방금방 나오는거 같더라구요... TITAN 이름은 왜 붙이는건지... SLI도 지원이 안된다고 하는데...)









<4.외장 그래픽 카드 비교 사이트>


외장 그래픽 카드를 구매하실 때 보통 2,3 가지 중에 어떠한 제품을 살까 고민하시죠?

이럴때마다 전부 사이트를 들어가서 spec을 찾아보는것도 귀찮은 일이 될거에요...


그래서 손쉽게 그래픽 카드를 비교해주는 사이트를 소개해드리려고 해요 (링크)

https://www.videocardbenchmark.net/singleCompare.php


사용법은 아래 사진대로 따라하시면 돼요!









<5. CPU와 외장그래픽(or GPU) 병목현상 정도를 계산해주는 사이트>


Bottleneck calculator(링크)에 접속하시면 아래와 같은 그림이 생성되요.

https://pc-builds.com/calculator/


굉장히 낮은 성능의 CPU와 높은 성능의 GPU를 컴퓨터에 세팅한다고 하면 얼마나 큰 병목(bottleneck)이 생길까요?



대략 46%의 Bottleneck이 생긴다고 하네요.


  





친절하게 i7-8700k에 해당하는 CPU로 바꾸는게 좋겠다고 추천까지해주니 편하네요!








GPU에 맞는 RAM과 SSD까지 추천해줘요 ㅎㄷㄷㄷㄷ





지금까지 NVIDIA 외장그래픽 브랜드에 대해서 알아봤어요.

다음글에서는 NVIDIA에서 외장그래픽과 같이 단품으로 device를 제공해주는것이 아닌, 클라우드 형태로 제공하는 데이터센터에 대해 알아보도록 할게요!




[글 래퍼런스]

https://m.blog.naver.com/PostView.nhn?blogId=bsh9792&logNo=220935347993&proxyReferer=http:%2F%2Fwww.google.com%2F

https://m.blog.naver.com/PostView.nhn?blogId=zotackr&logNo=221238411335&proxyReferer=https:%2F%2Fwww.google.com%2F


[사진 래퍼런스]

사진1,2

https://m.blog.naver.com/PostView.nhn?blogId=bsh9792&logNo=220935347993&proxyReferer=http:%2F%2Fwww.google.com%2F

사진3

https://m.blog.naver.com/PostView.nhn?blogId=zotackr&logNo=221238411335&proxyReferer=https:%2F%2Fwww.google.com%2F

사진4

https://namu.wiki/w/NVIDIA/GPU?from=GeForce

사진5

http://blog.logicalincrements.com/2017/11/geforce-gtx-1070-ti-vs-1070-1080-rx-vega-56-vega-64/


안녕하세요~


이번글에서는 NVIDIA에서 출시했던 GPU 아키텍처들에 대해 알아볼거에요. 

가장 먼저 출시됐던 Tesla 아키텍처를 살펴보면서 기본적인 NVIDIA GPU 구조에 대해서 알아보고, 해당 GPU의 스펙을 이해하기 위한 몇몇 개념들도 알아보도록 하겠습니다!




<1.NVIDIA GPU 아키텍처 발전 순서>


NVIDIA가 발표한 GPU 아키텍처의 이름을 보면 아래와 같아요.

해당 아키텍처를 기반으로 여러 NVIDIA GPU 모델들을 만들고 있는데요.


<사진1>


지금부터 위의 모델들을 간단히 살펴보도록 할게요!

(좀 더 자세한 아키텍처 설명을 보고싶다면 -> 링크)




<2.Tesla>


2008년 NVIDIA에서 출시한 GPU 아키텍처에요.

Tesla GPU는 SM(Streaming Multiprocessor)의 집합으로 이루어져있습니다. Tesla에서 SM은 8개의 SP(Stream Processor)와 2개의 SFU(Special Function Unit), shared memory 등으로 이루어져있있어요.

SP (Core)를 보통 CUDA core라고 하는데, GPU의 각 세대마다 SM, SP의 개수가 차이가 납니다.


<사진2>



1)SP(Stream Processor)

SP는 core 역할을 하기 때문에 CPU의 core격인 ALU와 같이 논리,수학 연산(with MAD(Multiply-add-Divide))을 수행합니다.


2)SFU(Special Function Unit)

SFU는 초월함수, 픽셀 attribute interpolation 등의 연산에 사용되고 4개의 부동 소수점 곱셈기도 포함하고 있습니다.


2-1)초월함수

초월함수는 일반적으로 다항식의 근으로 정의할 수 없는 함수를 의미한다고 합니다 (정확한 의미는 모르셔도 될 것 같아요~)


<사진3>


그냥 보시기에 함수가 조금 특이하다고 보시면 될 것 같아요 (보통 함수라하면 고차함수 꼴이니까요 ㅎ).

과학계산을 하다보면 아래와 같은 초훨함수들을 빈번하게 계산하게 되는데 이런 부분들을 SFU가 담당해주는것 같아요.


<사진4.초월함수의 예>



2-2) 부동소수점 연산


부동소수점에 대해서 알아보기 전에 고정 소수점 방식을 알아보도록 할게요.

앞서 CPU편을 보시면 알겠지만 명령어를 처리하는 단위에 따라 32비트, 64비트로 나눌 수 있다고 했어요.


만약 32bit 명령어 체계를 사용한다면 아래와 같이 부호(+,-)와 정수부, 소수부로 나눌 수 있을거에요.

그런데 아래와 같은 문제점은 정수, 소수부를 표현할 수 있는 경우가 제한적이에요. 예를들어 정밀한 과학계산에서는 더 세밀한 단위를 표현하기 위해 굉장히 많은 소수부를 사용해야 할 텐데 이것이 16bit로 표현이 안된다면 문제가 생기겠죠? 

<사진5>




그래서 나타난 개념이 부동 소수점 방식이에요. 


<사진6>


유효숫자를 나타내는 가수와 소수점의 위치를 풀이하는 지수로 나누어 표현하는 방식이에요.


<사진7>


부동소수점에서는 지수부(Exponent)는 기준값(Bias)를 중심으로 +,- 값을 표현합니다 (이렇게 쓰도록 정의한것!).

일반적으로 기준값은 2^0을 의미하는데 float의 경우는 기준값이 127이 됩니다.

예를들어, float에서 2^1은 기준값(127)+1 = 128 이기 때문에 이진수로 표현하면(지수부:8bit) 

가 됩니다.






가수부는 1.xxx 형태로 정규화를 한뒤 가장 왼쪽에 있는 1을 제거하고 소수점 이하의 자리 값만 표현하게 됩니다. 아래 예를들어 볼게요.


13.5를 32bit 부동소수점 (float:32bit)으로 표현해본다고 할게요.





 

2-3)FLOPS(FLoat point Operations Per Second)


FLOPS는 컴퓨터의 성능을 표현하는데 굉장히 중요한 지표로 사용되요.

말그대로 초당 부동소수점을 계산하는 능력을 의미하는데요. 딥러닝을 사용해보신 분들은 아시겠지만 대부분 계산들이 부동소수점(실수형태: float 자료형)으로 계산이 되는걸 볼 수 있을거에요.


그렇기 때문에 FLOPS라는 지표가 딥러닝과 같이 소수점을 기반으로 한 과학연산에서 시간을 측정하는 중요한 지표가 될 수 있겠죠? 만약 FLOPS 성능이 좋은 GPU를 사용한다고 하면 다른 FLOPS가 낮은 GPU보다 모델을 학습시키거나 inference하는 것이 더 빠를거에요.



아래 사진에서는 딥러닝을 돌리기 위해 자신들이 최소한 어떠한 성능의 GPU를 사용해야하는지 간접적으로 알려주고 있어요. 예를들어 VGG19를 돌리기 위해선 적어도 40G-Ops 이상을 지원하는 GPU를 구매해야겠죠? (1080 Ti 급의 GPU가 보통 11.3 TFLOPS를 지원한다고 하네요.)


1,000,000,000 FLOPS = 1 GFLOPS(giga FLOPS)

1000 GFLOPS = 1 TFLOPS (Tera FLOPS)




<사진8>


 



3)SM(Streaming Multi-processor)

만약 8개의 SP와 2개의 SFU가 모두 사용될 경우 SM에서는 1 clock cycle 당 최대 16(=8+4X2)회의 부동소수점 곱셈을 수행할 수 있어요.



4)Shared memory

Shared memory는 SM내에서 실행되는 thread 사이의 data 교환을 가능하게 해주는곳이에요 (CPU편에서 thread와 process의 차이를 보셨죠?ㅎㅎ 안보셨다면 --> 링크)

Tesla에서 Shared memory는 16KB 용량을 갖습니다.




5)SIMT(Single  Instruction Multiple Threading)

(GP)GPU로 넘어오면서 CUDA를 지원하자 SIMT 방식을 고안합니다.


CPU에서는 주로 SIMD(Single Instrcution Multiple Data)라는 용어를 사용하는데요. CPU의 성능을 최대한 활용하기 위해서 하나의 명령어로 여러개의 데이터를 처리하도록 하는 동작을 의미합니다. 


CUDA가 등장하면서 하나의 명령어로 여러개의 Thread를 동작시키는 일이 필요해졌기 때문에 SIMT 방식을 고안하기 시작한거죠. 




<사진9>







<3.Fermi>


Fermi는 2010년에 출시된 NVIDIA GPU 아키텍처에요.


Tesla에서 각 SM마다 제공되던 16KB shared memory는 64KB로 용량이 늘었어요.

SM외부의 texture unit의 도움을 받아 실행되던 load/store 명령도 SM내에 Load/store (LD&ST) 유닛이 추가됨으로서 SM 자체적으로 실행이 가능해졌습니다.



<사진10>


SM에 포함되어 있는 SP는 Tesla에 비해 4배가 늘어난 32개로 구성되었어요 (이때부터 SP를 (CUDA) core라고 명명하게 됩니다). 하나의 SM에 포함된 32개의 CUDA core는 16개씩 2그룹으로 나뉠 수 있고, 각 그룹마다(16개의 core마다) 16개의 LD&ST unit이 1그룹, 4개의 SFU가 1그룹을 이룬답니다.


Tesla에서는 각 SP내부에 존재하던 register file이 Fermi에서는 하나의 큰 Register File로 통합이 됐어요. 이럴경우 register를 많이 쓰는 thread와 적게 쓰는 thread가 섞여 있을 때 Tesla의 경우보다 Fermi 구조의 Register File 형태가 더 효율적이라고 합니다.


Core가 늘어난 만큼 늘어난 core를 최대한 실행시키기 위한 명령어를 공급해주어야 하는데요. 이를 위해 Warp Scheduler의 개수를 2개로 늘렸어요. Warp scheduler는 서로 의존성이 없어 독립적으로 Dispatch unit을 통해 명령어를 보낼 수 있다고 합니다.


Tesla의 SP는 32-bit 부동소수점을 지원했는데요. Fermi에서는 32-bit 부동소수점을 지원하는 CUDA core 2개를 동시에 사용할 수 있어 64bit 부동소수점 연산을 할 수 있게 됩니다. 또한 Tesla에서는 MAD(Multiply-ADD)를 지원했는데 MAD 작동방식이 그래픽 분야에서는 문제가 없지만 General Purpose 같이 세밀한 연산을 할 경우에는 문제가 되기 때문에 FMA(Fused Multiply-ADD를 지원하면서 GPGPU 컴퓨팅에 대한 지원을 강화했어요.





<3.Kepler(2012)>



Fermi 구조에서는 CUDA core, LD&ST unit, SFU 등의 실행 유닛들이 다른 유닛들에 비해 두 배 빠른 속도로 동작했다면 Kepler 구조에서는 전체 유닛이 동일한 속도로 동작하도록 변경시켰어요 (Performance/Watt 문제로 이런식의 구조를 고안했다고 합니다).


<사진11>





Kepler부터 SM이라는 용어가 SMX로 이름이 바뀌었어요. 전체 속도와 동기화시키위해 CUDA core의 속도를 줄였기 때문에 이전 속도를 유지하기 위해 더 많은 CUDA core, LD&ST, SFU 등을 장착했어요. Kepler의 SMX는 192개의 CUDA core, 64개의 DP(64-bit Double Precision) 유닛, 32개의 LD&ST 유닛, 32개의 SFU로 구성됐습니다.


Kepler에서는 HPC(HIgh Performance Computing)을 고려해 64bit 부동소수점 연산을 위한 전용 DP 유닛이 제공되었기 때문에 32bit, 64bit 부동소수점 연산이 동시에 실행될 수 있다고 합니다.


<사진12>


늘어난 core의 수를 잘 다루기 위해 warp scheduler의 수도 4개로 늘어났고, Dispatch unit도 하나의 warp scheduler 당 1개에서 2개로 늘어났어요. 그래서 SMX는 동시에 최대 8개의 명령을 처리하는것이 가능해 졌답니다. 또한 Register file의 크기도 128KB로 4배가 늘어났고, L1 cache 크기도 128KB로 늘어났습니다.


하나의 thread가 사용할 수 있는 register 수가 Fermi의 63개에서 255개로 늘어났는데 이러한 점은 Dispatch Unit의 증가와 더불어 그래픽 연산보다는 HPC 응용분야의 성능 (ex:과학연산)향상을 고려한 변화라고 볼 수 있습니다. 







<4.MaxWell(2014)>


Kepler에서 Maxwell로 아키텍처가 변하는 과정에서 미세공정이 28nm에 머물러 있었기 때문에 획기적인 변화를 꾀하지 못할거라 생각한 NVIDIA는 모바일 버전의 GPU 구조를 출시하고자 하면서 이전 kepler 구조를 최적화하려고 했어요.


<사진13>




<5.Pascal(2016)>


2012년 AlexNet 등장으로 주목을 받기 시작한 딥러닝은 2014년 GoogLeNet, VGG의 등장으로 딥러닝 붐을 일으키기 시작했습니다 (관련논문 정리->링크).

2016년 GTC에서는 딥러닝과 AI에 대한 내용을 상당부분 다루면서 NVIDIA가 나아갈 방향에 대해서 설명하기도 했으며, 동시에 Pascal이라는 인공지능에 특화된 GPU 아키텍처를 소개하게 됩니다.


Pascal 부터는 HPC(High Performance Computing)분야 (GP104 GPU)와 그래픽 분야(GP100 GPU) 두 가지 버전으로 나눠서 제품을 출시하게 됩니다.


<사진14>



HPC 또는 딥러닝 분야에서는 64bit, 16bit 부동소수점연산(FP64/FP16)을 지원하면서 하나의 thread가 많은 register를 사용하도록 했고, 그래픽 분야에서는 32bit(FP32)를 주로 사용하고 프로그램이 간단해 register 개수를 굳이 늘리지 않도록 했습니다.


<사진15>



딥러닝 기반의 pascal 구조의 가장 큰 특징은 16bit 부동소수점(FP16) 연산을 지원한다는 점입니다. 실제 딥러닝을 하다보면 weight, bias, learning rate 등의 값 등을 이용할 텐데, 다른 과학분야보다는 초정밀한 값을 요구하는건 아니기 때문에 32bit 처리 방식보다는 16bit 처리 방식으로 변경하도록 했습니다. 16bit 부동소수점 처리방식으로 바꾸면 32bit 처리 방식에서 사용했던 것 보다 메모리 용량과 대역폭에 대한 부담이 줄어들게 됩니다.


또한 GP100 Pascal의 CUDA core는 FP16 연산을 처리할 때 한 싸이클에 두 명령어를 처리할 수 있기 때문에 FP16연산 성능은 FP32 연산 성능의 두배가 된다고해요. 

간혹가다 다른 두 GPU를 사용할때,  A라는 GPU보다 메모리가 더 작은 B라는 GPU에서는 딥러닝이 잘동작하는데, A GPU에서는 작동이 안된다고 하면 FP부분이 차이가 있는지 확인하셔야해요! 



<6.Votal(2018)>

Volta 아키텍처를 채택한 GV100은 TSMC의 12nm 공정으로 구현되었습니다.

기존에 사용된 CUDA core는 FP32 코어로 이름이 바뀌었습니다. 이전에 GPU가 "64FP -> 16FP"로 변환된 걸 봤듯이, Votal에서는 8bit 단위의 INT(정수연산) 코어가 추가되었습니다. 이렇게 하여 inferencing을 가속화시켰다고해요.

<사진16.GP(Pascal) VS GV(Volta)>


Volta에서 눈여겨 볼 부분은 INT32 연산과 tensor core를 제공하여 실제 학습 또는 inference 속도를 대폭 향상시켰다는 점이에요.

Deep learning에서는 대부분 계산이 "D=A*B+C" 단위로 이루어집니다 (A:입력값, B:가중치(weight), C:bias, D:출력 값). 빠른계산처리를 위해 A,B 부분은 FP16 단위(floating point 16bit, half precision)로 계산이되고, 더 정밀한 accuracy를 위해 C,D는 FP32(floating point 32bit, single-precision)으로 처리하는 mixed precision 연산을 수행하는 tensor core를 고안해냈어요.


<사진17>

V100 GPU에는 SM당 8개의 Tensor core가 장착되어 있으므로, 하나의 SM에서는 64x8x2=1024 번의 "곱셈+덧셈" floating point 연산이 한 사이클에 수행됩니다. V100에는 80개의 SM이 장착되어 있으므로 80*1024번의 연산이 한 사이클에 수행되는셈이죠.

<사진18>


이전 파스칼 아키텍처기반의 P100보다 mixed-precision 개념을 도입한 volta 아키텍처 기반의 V100 모델의 9~10배의 성능을 내게 됩니다.

<사진19>

<사진20.ResNet 학습 및 추론 성능차이>


cuDNN은 출시되는 최신 GPU 모델에 맞게 업데이트가 되는 경우가 있는데, 최신 GPU인 volta와 당시 최신 소프트웨어 플랫폼인 cuDNN이 결합되면 훨씬 더 좋은 성능을 낸답니다.

<사진21>





<7.Turing>

2018.02에 발표된 Volta는 PC급에 제공되기 힘든 가격을 갖고 있었으나, NVIDIA는그해(2018) 8월에 Turing이라는 새로운 아키텍처를 발표합니다. 당시에 출시한 제품들은 굉장한 고가였으나 한달뒤에 나온 Turing 기반 RTX Geforece 20시리즈가 출시되었어요 (현재 인공지능을 연구하는 개인이나 PC급으로 연구하는 연구실같은 경우는 RTX 20 시리즈를 사용하고 있답니다)


<사진22>



<사진23>


<사진24>


이전 글에서 설명드린 NVLINK도 지원하고 있는걸보니 multi-GPU를 쓰면 더 효과가 배가 될 것 같아요.

<사진25>


Volta의 큰 골격은 유지하면서 규모를 절감한 마이너 파생상품으로 간주되고 있는데요. 눈에 띄는 부분은 RT core를 지원하는것과 4bit 정수(INT) 연산도 가능하게 했습니다.


<사진26>


<사진27>



RT core는 Ray Tracing을 위한 기술이에요. HPC(High Performance Computing)을 위해 점점 발전해 나가고 있지만 그래픽 부분도 포기 할 수 없기 때문에 RT(Ray Tracing) 기술을 접목시켰다고해요.


1)Ray Tracing(RT; 광원추적)

RT란 그래픽으로 구성된 3D 공간에서 어떤 물체에 빛이 반사되거나, 어떤 물체에 의해 그림자가 생기거나, 빛의 굴절을 일으키는 모든 작용들을 고려하여 화면에 표현해주는 기술이에요. RT core를 통해 실시간(real-time)으로 이러한 기능들을 가능하게 해준것이 가장 큰 특징이라 할 수 있어요.






<8.Ampere>


2020.03월 Votal 아키텍처의 후속작으로 Ampere라는 NVIDIA GPU 아키텍처가 소개됐어요. 결론부터 말씀드리면 Ampere 아키텍처는 작정하고 딥러닝을 위해 만든 GPU라고 보시면 될 것 같아요.



<사진28>



먼저 Ampere 아키텍처는 TSMC의 7nm 미세공정으로 인해 Volta보다 훨씬 뛰어난 성능을 갖추게 되었어요.



1) 기본적인 Spec 차이 


우선 VRAM과 Memory Bandwidth, Memory Bus Width, Memory Clock이 ..... ㅎㄷㄷ


<A100: Ampere, V100:Volta, P100:Pascal>



딥러닝 연산도 몇배는 빨라지겠네요..




Ampere에서 주목할 부분은 딥러닝에 최적화된 새로운 정밀도인 TensorFloat-32(TF32) 가 도입됐다는거에요. Tensorflow 자료형을 보면 tf.float32을 볼 수 있는데, tensor 자료구조에서 float을 제공해주는것을 하드웨어적으로 support해줄 수 있는것 같아요. 그래서 정밀하게 계산을 할 수 있으면서도 속도는 빠르게 유지해주는듯 합니다.




TF32는 FP32와 같이 작동하면서 코드 변경없이 딥러닝 모델을 최대 20배까지 가속한다고 해요. (참고로 TF32 형태가 FP32보다 6배는 빠르다고 하네요)

또한 Mixed Precision이라는 연산기법을 지원하는 시도도 있는데, single-precision인 FP32와 half-single-precision인 FP16을 적절히 잘 섞어주면서 속도(speed)와 정확도(accuracy)를 모두 잡았다고 합니다. 


단적인 예로, FP16을 이용하기 때문에 딥러닝 모델에 대한 메모리 요구량도 줄어들어 더 큰 모델을 GPU에 로드할 수 있게 되었고, 더 큰 mini-batches (size)도 가능하게 해주었어요.


(홈페이지를 자세히 보니 Turing, Volta 아키텍처에서도 mixed precision 기법이 제공되나봐요. 그런데, Ampere에서는 FP32가 사용될 때, TF32와 같이 사용되는 반면에, Volta, Turing에서는 FP32만 사용되니 mixed precision 효과가 덜 한거 같아요)


<사진29>



위와 같은 Mixed Precision은 코드 몇줄만 추가해주면 사용가능하다고 하니 참고하세요!










2) Sparse connection


Sparse connection은 쉽게 말해 딥러닝에서 쓰이는 parameter 중에 불필요한 부분을 0으로 만들어 계산을 좀 더 빠르게 하거나, 차원수를 줄여주어 overfiting을 피해주는 기법으로 사용되곤 하는데요.


Ampere 아키텍처에서는 이러한 sparse model에 support해주는 기법을 제공해주나 봅니다. A100(Ampere)의 tensor 코어는 sparse model에 대해 최대 2배 높은 성능을 제공해주는데, inference 시간도 줄여줄 뿐만 아니라 학습성능도 개선하는데 사용할 수 있다고 합니다.


<사진30>







<사진31>




4)PCI 4.0 and NVLINK 3.0


Ampere 아키텍처는 특히 Multi-GPU를 사용할 경우 그 성능이 대폭 향상됩니다.



PCI 4.0으로 인해 CPU와 GPU, 그리고 GPU 간의 데이터 전송속도 및 양이 증가했는데요. 여기서 추가로 NVLink 3세대를 도입하면서 GPU간의 직접적인 대역폭을 2배인 600GB/s로 증가시켰어요. 이는 PCI 4.0의 10배에 달하는 속도입니다. 




5) Multi-Instance with Kubernetes


Ampere 아키텍처는 최대 7개의 sub-group gpu로 partitioning 할 수 있어요.


<사진32>



예를들어, 40GB VARM을 갖고 있는 ampere GPU는 각각 20GB VRAM을 갖는 2개의 sub-ampere GPU로 나눌 수 있어요. 최대 5GB의 sub-ampere gpu 7개를 생성할 수 있고, 이렇게 나눈 GPU들을 나중에 다시 merge(통합) 할 수 있어요.


사용사례를 보면, 낮에는 낮은 처리량 추론을 위해 7개의 sub-GPU를 사용하고, 밤에 퇴근할 때는 딥러닝 모델 학습을 위해 1개의 본래의 GPU 인스턴스로 만들어주어 사용해요.


<사진33>


각각의 sub-group을 형성하는 gpu들은 서로 독립적이기 때문에 서로다른 프로그램을 실행시켜도 CUDA가 각각 인스턴스에 맞추어 실행됩니다. 



<사진34>


이러한 MIG(Multi-Instance GPU) 기술은 컨테이너 또는 쿠버네티스와 같이 DevOps 유저들에게 특히 유용하다고 하는데, 조만간 Kubernetes를 공부할 예정이라 공부를 하고 나면 좀 더 명확하게 설명해보도록 할게요! ㅎㅎ





지금까지 NVIDIA에서 출시하는 GPU 아키텍처에 대해 간단히 알아보았어요.

다음글에서는 실제로 우리가 구매하는 NVIDIA 외장그래픽 카드(GPU) 모델들을 알아보도록 하겠습니다! ㅎㅎ




[글 래퍼런스]

http://donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%83%81%ED%8E%B8/

http://hwengineer.blogspot.com/2018/03/v100-tensor-core.html

https://greatzzo.tistory.com/m/56

http://haanjack.github.io/cuda/2016/03/27/cuda-prog-model.html

https://www.hardwaretimes.com/simd-vs-simt-vs-smt-whats-the-difference-between-parallel-processing-models/

https://www.nvidia.com/ko-kr/technologies/multi-instance-gpu/

https://www.nvidia.com/ko-kr/data-center/nvidia-ampere-gpu-architecture/


[사진 래퍼런스]

사진1

https://www.notebookcheck.net/Nvidia-will-end-critical-updates-for-Kepler-laptops-on-April-2020.413755.0.html

사진2,13,14,15

http://donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%83%81%ED%8E%B8/

사진3

https://m.blog.naver.com/PostView.nhn?blogId=alwaysneoi&logNo=100133312954&proxyReferer=https:%2F%2Fwww.google.com%2F

사진4

https://ko.wikipedia.org/wiki/%EC%B4%88%EC%9B%94%ED%95%A8%EC%88%98

사진5,6

http://tcpschool.com/cpp/cpp_datatype_floatingPointNumber

사진7

https://wttjj.tistory.com/293

사진8

https://towardsdatascience.com/neural-network-architectures-156e5bad51ba

사진9

https://m.blog.naver.com/PostView.nhn?blogId=shakey7&logNo=221312640455&proxyReferer=https:%2F%2Fwww.google.com%2F

사진10

https://www.semanticscholar.org/paper/NVIDIA-%E2%80%99-s-Fermi-%3A-The-First-Complete-GPU-Computing-Glaskowsky/620f84d78b228d4a3b03b7aee40c4d9e46287d36

사진11

https://www.geeks3d.com/20120517/nvidia-kepler-gk110-architecture-whitepaper-2880-cuda-cores-and-compute-capability-3-5/

사진12

https://www.researchgate.net/figure/NVIDIA-Kepler-architecture-7_fig2_270876234

사진16

https://www.slideshare.net/insideHPC/inside-the-volta-gpu-architecture-and-cuda-9

사진17,19

http://hwengineer.blogspot.com/2018/03/v100-tensor-core.html

사진18

https://www.nvidia.com/ko-kr/data-center/tensor-cores/

사진20

https://www.bodnara.co.kr/bbs/article.html?num=140148

사진21

https://news.developer.nvidia.com/cudnn-7-5-now-available/

사진22

https://www.reddit.com/r/nvidia/comments/973dqp/pascal_vs_turing/

사진23

http://drmola.com/reviews/298395

사진24

https://quasarzone.com/bbs/qc_qsz/views/180581

사진25

https://www.anandtech.com/show/13282/nvidia-turing-architecture-deep-dive/4

사진26

https://www.udna.kr/tesla

사진27

https://analyticsindiamag.com/tesla-t4-nvidia-gpu/

사진28

https://www.wepc.com/news/nvidia-ampere-gpu/

사진29

https://developer.nvidia.com/automatic-mixed-precision

사진30

https://www.nvidia.com/ko-kr/data-center/nvidia-ampere-gpu-architecture/

사진31

https://www.servethehome.com/nvidia-tesla-a100-ampere-resets-the-entire-ai-industry/

사진32

https://namu.wiki/w/NVIDIA/GPU?from=GeForce#s-3.15

사진33

https://www.nvidia.com/ko-kr/technologies/multi-instance-gpu/


안녕하세요~


이번글은 GPGPU라는 개념과 CUDA를 소개하면 GPU구조를 가볍게 살펴볼거에요.




<1.GPGPU>


CPU는 다양한 시스템 자원(ex; I/O device)를 제어해야하고 복잡한 명령들을 처리해야하기 때문에 연산을 위한 장치 이외에도 다른 구성요소들이 존재해요. 


하지만 GPU는 본래 그래픽처리를 위해 고안된 장치였기 때문에 단순한 연산들을 병렬로 고속처리가 가능했었죠. (CPU처럼 제어기능이 필요없기 때문에 복잡한 구조를 버리고 연산(ALU)에 특화시킨 장치로 활용되기 시작한거죠. 그렇기 때문에 GPU는 단독으로 시스템자원을 활용할 수 없어 CPU의 제어를 받아야해요.)


예를들어, 다차원 행렬과 같이 병렬적으로 연산처리가 가능한 과학계산에서도 유용하게 쓰일 수 있다는 사실을 발견했던거죠.


이렇게 단순히 그래픽처리만 하는 GPU와 달리 병렬로 연산기능까지 수행하게 되면서 GPU를 GPGPU(General Purpose GPU)라고 부르기 시작했답니다. "그래픽처리+과학연산" 개념을 묶어서 GPGPU라고 부르긴 하지만 다시 GPU라고 부르고 있어요.


<사진1.GPU 초록색 부분이 ALU를 의미하며 일반적으로 core라고 부른다>







<2.CUDA(Compute Unified Device Architecture)>


(GP)GPU의 등장으로 병렬계산을 뒷받침해줄 소프트웨어가 필요했어요.

과거 GPU를 그래픽용도로만 사용했을때는 OpenCL, DirectX라는 병렬 소프트웨어가 있었는데 이를 구사하기 위해서는 독특한 언어(HLSL, GLSL 등)을 배워야했으며 그래픽스 목적으로 만들었기 때문에 이래저래 공부할것도 많았죠.


(GP)GPU 개념이 등장하면서는 C/C++ 언어로 병렬계산에 필요한 기능들을 제공해주는 소프트웨어가 만들어졌어요. 대표적인 소프트웨어가 NVIDIA의 CUDA입니다. 그래서 딥러닝을 하시거나 머신러닝을 하시는 분들은 먼저 tensorflow, pytorch 등의 프레임워크를 설치하실 때 CUDA 먼저 설치해야 했던거에요!



CUDA가 진행되는 방식을 설명드려볼게요.


1)병렬처리할 데이터들을 main memory에서 GPU memory로 이동시킨다.

2)CPU는 GPU에게 GPU memory에 있는 데이터를 연산하라고 명령한다.

3)GPU는 CPU가 명령한 연산처리를 병렬로 수행한다.

4)GPU가 작업을 다 마치면 다시 GPU memory에 결과물을 저장하고, 다시 main memory로 해당 결과물을 업로드한다. 그리고 CPU가 main memory에 접근해 해당 결과물을 이용하여 작업을 마무리한다.


<사진2>




CUDA는 기본적으로 CPU와 GPU 코드를 조합해서 코딩합니다. CUDA는 NVCC(NVidia CUDA Compiler)라는 NVIDIA 독점 컴파일러를 통해 CPU에서 수행되는 코드(.c(C)/.Cpp(C++))와 GPU에서 수행되는 코드(.cu)가 분리되어 컴파일이 됩니다. 



<사진3>


그리고 Linker에 의해 하나의 실행파일(binary file)이되어 CPU에서는 Serial Code로, GPU에서는 Parallel code로 순차실행이 됩니다. (이런 과정 때문에 앞서 언급한 CPU, GPU간의 병목현상이 일어납니다.)



<사진4>



<사진5>






<3.cuDNN>


하드웨어 가속이란 컴퓨팅 일부 기능을 CPU에서 구동하는 소프트웨어 방식보다 더 빠르게 수행할 수 있는 하드웨어의 사용을 말합니다. 예를들면, GPU의 블리팅 가속 기능이 있죠. 블리팅 가속이 뭔지 몰라도 컴퓨팅의 일부 기능을 GPU에서 한다고 생각하시면 될 것 같아요. 보통 하드웨어 가속은 GPU를 활용하기 때문에 GPU 가속이라고 합니다.


GPU 가속장치는 그래픽 처리 장치, 부동 소수점 장치 등이 있고, 이들로 인해 빠른 연산을 가능하게 합니다 (부동 소수점 이야기는 다음 글에서 하도록 할게요~)


(GP)GPU는 복잡한 연산을 하기 위한 방향으로 발전되고 있어요. 그 대표적인 예가 딥러닝 연산이죠. 

딥러닝 연산을 고려하는 하드웨어가 발전하면 이를 뒷받침해주는 딥러닝 기반 소프트웨어도 발전해야겠죠? 그래서 나온 라이브러리(소프트웨어)가 cuDNN ((NVIDIA) CUDA Deep Neural Netowkr)이에요. (cuDNN 역시 NVIDIA에서 만들었답니다). 그렇기 때문에 딥러닝 관련 연산을 빠르게 해줄 수 있도록 도와주는 라이브러리로 구성되어 있답니다.


좀 더 정확히 NVIDIA가 정의한 cuDNN은 아래와 같아요.


"The NVIDIA CUDA Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks."


"cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers."


"cuDNN accelerates widely used deep learning frameworks, including Caffe2, Keras, MATLAB, MxNet, PyTorch, and Tensorflow."






<사진6>






지금까지 GPGPU, CUDA, cuDNN을 통해서 실제로 GPU가 과학연산에서 어떻게 실행되는지 알아봤어요.

다음 글에서는 본격적으로 NVIDIA GPU 모델 아키텍처에 대해 설명해보도록 할거에요. 


다른 GPU 모델도 있지만 최근에 보편적으로 사용하는 모델이 NVIDIA GPU 모델이기 때문에 NVIDIA GPU 모델을 살펴보도록 하겠습니다~





[글 래퍼런스]

http://haanjack.github.io/cuda/2016/02/26/gpgpu-cuda.html


[사진 래퍼런스]

사진1

https://namu.wiki/w/GPGPU

사진2

https://ko.wikipedia.org/wiki/CUDA

사진3

https://hw-lab.com/nvidia-announces-cudax86.html

사진4

https://www.slideshare.net/npinto/iap09-cudamit-6963-lecture-01-gpu-computing-using-cuda-david-luebke-nvidia-presentation

사진5

https://www.slideshare.net/maheshkha/cuda-tutorial

사진6

https://news.developer.nvidia.com/cudnn-7-5-now-available/

안녕하세요~


이번글에서는 내장그래픽과 외장그래픽에 대해서 알아보면서 그래픽카드의 내부구조 동작 방식에 대해 간단히 알아보도록 할거에요. 

그리고 딥러닝을 돌리시다보면 CUDA memory allocation error 라는 메시지 또는 GPU 메모리 관련 메시지가 발생하는데 이러한 이유에 대해서도 알아보도록 하겠습니다~







<1.딥러닝에서 GPU가 필요한 이유>


행렬과 같은 연산을 할때 CPU는 각각의 행렬 elements들을 순차적으로 계산하게 됩니다. 그런데, 행렬이 연산되는 방식을 보면 굳이 순차적으로 할 필요없이 각각의 elements들을 병렬적으로 계산할 수 있다는 사실을 알 수 있어요. 


단순히 3D 그래픽 처리를 위해 고안된 그래픽카드가 오늘날 tensor 계산을 기본으로 하는 딥러닝 연산에 최적으로 적용된셈이죠. (딥러닝 구조가 대부분 numpy 패키지로 구성되어 있다는 점 아시죠?ㅎㅎ)


<사진1>







<2.내장그래픽 VS 외장그래픽>


그래픽카드를 이야기할때 보통 내장그래픽과 외장그래픽으로 나누게 됩니다.


내장그래픽은 보통 CPU 내부에 있는 그래픽카드를 의미하고, 외장그래픽은 CPU 외부에 있는 그래픽카드인 셈이죠. (CPU 내부에 있나, 외부에 있나 그 차이에요!)


사실 내장그래픽만으로도 배틀그라운드 같은 게임도 충분히 돌아가지만 좀 더 생동감 넘치는 게임을 하기위해서는 더 높은 사양의 그래픽 카드를 필요로 해요. 그렇기 때문에 대부분 외장그래픽을 구매해서 모니터와 연결한답니다.


<사진2>



이는 게임뿐만아니라 앞에서 했듯이 딥러닝 또는 복잡한 과학계산을 할 때도 마찬가지로 그래픽카드가 이용됩니다. 그런데 왜 오늘날 딥러닝 모델을 학습시키기 위해서 내장 그래픽이 아닌 외장그래픽을 사용하게 되는걸까요? 







<3.내장그래픽>


CPU의 내장그래픽이 동작하려면 CPU와 마찬가지로 메모리에서 데이터를 읽어들여와야 합니다. 

CPU는 메인메모리 전부를 자신의 공간처럼쓰지만 내장그래픽은 함부로 그렇게할수가 없어요. 그렇기 때문에 내장그래픽이 메인메모리의 일부를 자신의 전용메모리로 사용할건지, 공유해서 사용할할건지 사전에 결정해야 한답니다.


"내PC->오른쪽 마우스 클릭 -> 속성" 으로 접속하시면 가끔 실제 메모리보다 적은 양의 메인메모리가 사용가능하다고 나오는데 이는 메인메모리의 일부(0.11=8.00-7.89)가 내장그래픽의 전용메모리로 잡혀있기 때문이에요. 


<사진3>




하지만 제 컴퓨터 같은경우는 전용메모리로 잡아둔게 없네요. 그렇다면 메인메모리의 일부를 공유하고 있다는 말인데, 어떻게 확인할 수 있을까요?




"작업 관리자 -> GPU(내장그래픽) -> 성능 탭"을 보시면 메인메모리의 절반인 2G를 공유메모리로 사용하고 있어요 ㅎㅎ




그런데 생각해보세요. 딥러닝 모델이 보통 많은 용량을 차지하는데 이 모델을 학습시킬때 메인메모리에 올리고 내장그래픽이 사용한다고 하면 CPU가 과부하 걸리지 않을까요? 

또한 내장그래픽카드의 연산능력은 당연히 CPU크기가 커지지 않는한 비약적으로 좋아지진 않을거에요. 


차라리 외부에 장치를 두어서 그래픽 또는 병렬계산을 해주는 장치를 따로 두는게 좋지 않을까요? 그 장치에는 더 큰 용량의 전용메모리를 주면 CPU가 부담을 덜 수 있지 않을까요? 


위와같은 질문을 통해 오늘날 GPU라고 인식하고 있는 외장그래픽이 등장하게됩니다!





<4.외장그래픽>


앞선 질문들에 대한 해답으로 외장그래픽이라는 개념이 등장하게 됩니다.


우리가 흔히 보는 GPU는 외장그래픽을 의미합니다.

외장그래픽이 하는일은 병렬계산과 같은 일을 CPU가 던져주면 해당 내용을 자신들의 전용메모리인 VRAM에 저장시킵니다. 그리고 GPU에서 VRAM에 접근해 작업을 처리하게 됩니다. 쉽게 말해 외장그래픽에서 CPU역할을 GPU가, RAM역할을 VRAM이 한다고 보시면 됩니다.  

<사진4>



외장그래픽카드도 공유메모리를 이용할 수 있지만 전용메모리(Directed GPU memory usage)크기가 내장그래픽보다 큰것을 볼 수 있죠?




외장그래픽에 자체메모리를 두는 또 다른 이유는 고속연산을 하기 위해서에요. 일반 메인메모리는 기본적으로 많은 양의 process를 올려서 CPU가 언제든지 접근할 수 있게 준비해주는게 필요하고, GPU는 특정 계산을 고속으로 처리해주어야 하기 때문에 메인메모리보다는 작지만 외장그래픽 내부에 자체 메모리를 두어 메모리 접근에 대한 물리적 거리를 단축시켜주게 됩니다.



이렇게 자체메모리를 두기 때문에 딥러닝 같은 모델을 GPU에 올려놓고 학습데이터들을 GPU에 batch size만큼 올려주게 됩니다. 그런데 GPU의 메모리가 적다면 무거운 딥러닝 모델도 올리지 못할거에요. 딥러닝 모델을 올린다고 하더라도 잔여 메모리양(= 기존 VRAM - 딥러닝 모델 용량)이 많지 않기 때문에 training dataset의 batch size를 크게 잡아서 학습을 진행시키면 "CUDA allocation error (GPU 메모리양이 부족하다는 뜻)" 메시지가 출력된답니다. (batch size가 딥러닝 일반화 성능에 크게 영향을 미친다는 논문도 발표된거 보면 GPU의 메모리가 얼마나 중요한지 아시겠죠?)




딥러닝을 위해서는 CPU보단 GPU가 더 중요한것 같은데, 그렇다면 아래와 같은 질문에 대해선 어떻게 생각하시나요?


"Q.CPU는 저사양으로 사용해서 돈을 절약하고, GPU만 고사양으로 사서 컴퓨터를 맞추면 되나요?"


결론부터 말씀드리면.....

 

"A.GPU 성능과 CPU의 성능차이가 많이 나면 서로간에 통신을 할때 병목현상이 생기기 때문에, 어느정도 서로 스펙을 맞춰줘야해요!"


그럼 이제부터 GPU와 CPU간의 병목현상이 왜 생기는지 알아보도록할게요!





<5.GPU와 CPU간 병목현상>


아래 그림처럼 GPU가 일을 하기 위해서는 CPU로부터 작업을 할당받아야해요.

외장그래픽(여기서부터는 GPU라고 할게요)에는 자신의 자체 메모리(ex:VRAM)이 있어요. GPU또한 CPU와 비슷한 역할을 하기 때문에 어떤 작업을 하기 위해서는 메모리에 접근해야해요. 그래서 CPU가 DMA를 통해 GPU가 작업할 일을 GPU의 메모리(VRAM; 아래그림에서는 Device memory)에 올려두게 됩니다.



<사진5>




1) 병목현상의 원인1 - CPU와 GPU간의 성능차이


앞서 GPU는 CPU에게서 작업을 할당받는다고 했죠? 

만약 작업이 마무리되면 어떻게 될까요?

물론 다시 CPU에게 자신의 작업이 완료됐다는 사실을 알리고 CPU는 이에 따른 작업을 수행하기 될거에요.



<사진6>



그런데 만약 CPU는 성능이 낮아 다른 업무들도 빠르게 처리하기 버거운데, 성능좋은 GPU는 자신의 작업을 빠르게 마무리하게 계속해서 CPU에게 주면 어떻게 될까요? 결국 CPU는 할일이 쌓여만 가는데 우선순위 때문에 GPU관련된 task를 수행하지 못하고 있을거에요. 


사람입장에서는 CPU가 GPU의 일을 빨리 처리해주지 못하다보니 "GPU의 성능이 좋지않군" 이렇게 판단하게되고 GPU는 굉장히 억울한 입장에 놓일거에요.


이렇게 CPU가 성능이 떨어져 GPU의 성능을 뒷받침 하지 못하는 경우를 CPU와 GPU간의 병목현상이라고 부른답니다.



Bottleneck calculator(링크)에 접속하시면 아래와 같은 그림이 생성되요.



굉장히 낮은 성능의 CPU와 높은 성능의 GPU를 컴퓨터에 세팅한다고 하면 얼마나 큰 병목(bottleneck)이 생길까요?



대략 46%의 Bottleneck이 생긴다고 하네요.


  





친절하게 i7-8700k에 해당하는 CPU로 바꾸는게 좋겠다고 추천까지해주니 편하네요!








2) 병목현상2 - PCI Bus (Peripheral Component Interconnect Bus) = PCIe(express), (feat.NVLink)


앞에서 언급한 CPU와 GPU간의 병목현상의 또 다른 원인이 되는것이 PCI Bus에요.


PCI Bus는 RAM과 VARM 사이의 데이터 전송 통로입니다. 


<사진7.위에서부터 4, 16, 1, 16 레인>




기본적으로 PCIe bus의 성능이 좋지 않으면 VRAM에 전달해주는 데이터속도가 빠르지 않을거에요.


<사진8>




<사진9>






<사진10. CPU 스펙의 한 부분을 차지하는 PCIe version>








만약 Multi-GPU(ex; GPU1, GPU2)를 사용할 경우 GPU1과 GPU2가 서로 통신하려면 어떻게 해야할까요? 그냥 서로 통신하면 될 것 같은데, PCIe로 구성된 구조에서는 GPU1에서 PCI bus를 거쳐 다시 GPU2로 전송되게 됩니다.


이렇게 되면 GPU1, GPU2가 서로 직접적으로 통신하는것 보다 더 많은 시간이 소요될 수 있어요 (PCIe를 한 번 거친다는건 물리적 거리가 소용된다는 말이니까요)







이러한 문제를 해결하기 위해 NVLink를 지원해주는 GPU가 등장했는데요. NVLink는 쉽게 말해 GPU간의 통신을 빠르게 해주기 위해 GPU들을 연결해주는 장치라고 생각하시면 될거에요.


<사진11>


PCIe 3.0 레인의 전송속도는 8GT/s 인 반면에, NVLink는 20Gbit/s (PCIe 3.0 대비 2.5배) 전송속도를 자랑하며, GPU1&GPU2 인접한 GPU간의 전송은 40Gbit/s 라고 합니다 (GT/s = Gbit/s 라고 간주하셔도 됩니다)



<사진12>



<사진13. PCIe VS NVLink 속도차이 with ResNet-50>





3) GPU 내부에서 발생하는 병목현상



GPU는 VRAM으로부터 데이터를 받아 연산을 수행하게 됩니다. 


많은 양의 데이터가 VRAM에서 GPU로 이동할때 시간이 좀 걸리겠죠? 

만약 GPU 할당받은 작업을 굉장히 빨리 끝낸다면 어떻게 될까요?


VRAM에서 GPU로 데이터를 이동시키고 있는 도중에 GPU가 이미 작업을 끝낸다고 하면 GPU 입장에서는 "나 일다 끝났는데 왜 빨리 다음일을 안주는거야.. 이러면 내가 놀게되잖아.."라고 하소연하며 VRAM이 작업물을 빨리 넘겨주지 않는다고 생각할거에요.




이러한 문제를 해결하기 위해서는 VARM에서 GPU 넘기는 대역폭이 커야해요. 대역폭이 크면 데이터를 빠르게 전송할 수 있게 되고, GPU가 작업을 마무리함과 동시에 새로운 데이터를 줄 수 있게 됩니다.







지금까지 내장그래픽과 외장그래픽의 차이에 대해서 알아보았어요.

또한 외장그래픽(GPU+VRAM+etc..) 성능을 극대화시키기 위해서는 어떤 요소들이 필요한지도 알아봤습니다.



다음 글에서는 간단하게 GPU의 구조에 대해 설명해보도록 할게요! 

GPU 구조를 아주 간단히 보여드리고 이를 뒷받침해주는 CUDA, cuDNN 이라는 병렬처리 플랫폼(or 소프트웨어)을 소개하도록 하겠습니다!~





 






[글 래퍼런스]

https://blog.inten.to/hardware-for-deep-learning-part-3-gpu-8906c1644664

책: 머신러닝과 블록체인을 떠받치는 GPU의 모든 기술



[사진 래퍼런스]

사진1,2

https://www.youtube.com/watch?v=tsB97IAejbk

사진3

https://m.blog.naver.com/PostView.nhn?blogId=ryujava&logNo=30168166523&proxyReferer=https:%2F%2Fwww.google.com%2F

사진4

http://www.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=2875791125&gclid=Cj0KCQjwiYL3BRDVARIsAF9E4Gd6siIhHGLIX6uQ_AgjVXK3XSvGI1T2f8VZ4NNaEfzJM7P7eztBvAIaAr53EALw_wcB&utm_term=&utm_campaign=%B1%B8%B1%DB%BC%EE%C7%CEPC+%C3%DF%B0%A1%C0%DB%BE%F7&utm_source=%B1%B8%B1%DB_PC_S_%BC%EE%C7%CE&utm_medium=%B0%CB%BB%F6

사진5

https://insujang.github.io/2017-04-27/gpu-architecture-overview/

사진6

https://www.slideshare.net/RenaldasZioma/trip-down-the-gpu-lane-with-machine-learning-83311744

사진7

https://m.blog.naver.com/PostView.nhn?blogId=rkalstn2&logNo=30180069244&proxyReferer=https:%2F%2Fwww.google.com%2F

사진8

https://blog.naver.com/alias_maya/20201203156

사진9

https://www.digitalcitizen.life/pci-express-pcie

사진10

https://www.anandtech.com/show/8426/the-intel-haswell-e-cpu-review-core-i7-5960x-i7-5930k-i7-5820k-tested

사진11

http://www.noteforum.co.kr/news/index.htm?nm=28621

사진12

http://playwares.com/sponsornews/57567833

사진13

https://www.pugetsystems.com/labs/hpc/TensorFlow-Performance-with-1-4-GPUs----RTX-Titan-2080Ti-2080-2070-GTX-1660Ti-1070-1080Ti-and-Titan-V-1386/



안녕하세요~


이번글에서는 GPU의 탄생배경에 대해서 설명해보려고 합니다!




<1.GUI의 등장>


우리가 현재 사용하고 있는 window 같은 경우에는 아이콘들이 있고 이를 통해 필요한 프로그램을 실행시키죠? 이렇게 Graphic으로 쉽게 사용자(User)가 컴퓨터를 사용할 수 있게 해주는 방식(Interface)을 GUI(Graphic User Interface)라고 해요. 그렇다면 과거에는 어떻게 컴퓨터를 이용했을까요?



<사진1>





초창기 컴퓨터는 단순히 MS-DOS 창을 이용했다고해요. 위에서는 프로그램을 실행하기 위해서 아이콘을 더블클릭하기만 하면 됐지만, 과거에는 컴퓨터 명령어를 입력해서 프로그램을 실행시켰다고합니다 (리눅스를 사용하시는 분들이면 이해하기가 더 쉬우실 거에요 ㅎ). 



<사진2>



그런데 컴퓨터 회사들은 더 많은 사람들에게 컴퓨터를 판매하기 위해 좀 더 이용하기 쉽게 컴퓨터를 발전시키는데 주력을 했습니다. 그래서 마우스나 GUI와 같은 기능들을 고안하기 시작했던거죠!


<사진3. 최초의 마우스>



초창기 컴퓨터에는 GPU가 없었기 때문에 GUI 환경을 구성하기 위해서는 CPU가 열심히 일해야했어요.

예를들어, 해상도가 320X200인 모니터에서 게임을 한다고 가정했을 때, 화면이 바뀔 때마다 64000(=320x200)개의 pixel 정보를 CPU가 처리해줘야 했습니다.



<사진4>



이렇게 작업양이 많아지다보니 CPU 속도도 줄어 들게 되어 많은 문제를 야기하게 되었죠 ㅜㅜ

이전에 작성한 CPU scheduling(링크)을 보면 CPU가 시간이 많이 걸릴거 같은 task들은 다른 입력장치에게 미루거나 중요하지 않은 task들은 우선순위(priority)를 뒤로 미루는 것을 볼 수 있었죠?


그래서 사람들은 모니터에 화면을 단순히 출력시키는 일을 굳이 CPU가 책임질 필요는 없다고 생각하게 됐어요. 모니터를 출력하는 방식을 가만히 생각해보면 pixel 하나하나를 순차적으로 출력 시키지 않아도 화면 전체를 동시에 뿌려주는게 가능하겠죠? 


예를들어, 하나의 바탕화면에서 pixel 순서를 거꾸로 보여주거나, 바탕화면을 구성하고 있는 pixel들의 순서를 랜덤하게 뿌려줘도 결국 화면에 나타나는 배경화면은 같을거에요. 즉, 화면을 출력하는데 첫 번째 pixel부터 마지막 pixel까지 순차적으로 뿌려줄 필요는 없다는 이야기가 되는데 이를 다른 말로 하면 화면을 출력해주는 task를 할 때는 병렬(parallel)로 수행해도 큰 문제가 안된다는 이야기에요!




<사진5>


아래 영상을 보시면 순차적으로 작동하는 CPU와 병렬적으로 사용하는 GPU에 대한 직관적인 이해를 얻을 수 있을거에요!










<2. 기존 GPU의 역할 - 게임시장>



역시 GPU를 이야기 할때 게임시장을 빼놓을 순 없겠죠? 

사실 GPU는 1970년에도 있었다고 해요. 그런데 GPU가 많은 사람들의 주목을 받기 시작한건 1993년 intel이 최초로 pentium(펜티엄)이라는 브랜드로 CPU를 출시하기 시작하면서 부터에요.




1995년 윈도우 95의 출시와 맞물려 컴퓨터가 대중화되기 시작했어요. 당연히 컴퓨터가 대중화되다 보니 많은 사람들이 게임도 즐겨하게 되었고 이는 GPU를 개발하려고 하는 회사들에게는 엄청난 기회였어요.




1993년 스탠포드 전기공학 석사인 대만인 청년이 NVIDIA를 설립했지만, GPU 시장을 주름잡았던 기업은 3dfx라는 곳이에요. 1996년 3dfx라는 미국의 그래픽 회사는 3D 기술에 모든 연구를 집중하였고 Voodoo라는 그래픽 카드를 출시게 됩니다.



<사진6. Voodoo>




1980~1990년대 굉장히 단순한 게임만으로 재미를 느꼈던 사람들은 Voodoo의 등장으로 인해 생겨난 최초의 3d shooting 게임을 체험하면서 신세계를 경험하게 됩니다. (저도 초등학교때 삼촌집에서 Quake만 8시간 했던 기억이 나네요 ㅎㅎㅎ) 


[1980-1990 게임]



 [1996 최초의 3D shooting 게임, Quake]




이후 바람의나라(1996), 리니지(1998), 스타크래프트(1998) 등의 게임들이 흥행하면서 GPU와 게임시장은 서로 상생하며 발전해나가기 시작했습니다.





3dfx는 자신들이 GPU 시장을 주도했기 때문에 자신들의 GPU를 표준안으로 제시하기 시작했어요. 그래서 다른 GPU 회사들이 3dfx가 만들어 놓은 GPU의 골격이되는 래퍼런스(표준) (GPU)카드를 만들고 다른 회사들이 이를 이용하여 조금씩 수정해 출시하도록 하는 비지니스 환경이 구축되었죠.


그런데 다른 회사에서 래퍼런스 카드를 이용하고 더 큰 이윤을 남기는것을 본 3dfx는 자신들이 모든것을 도맡아 하려고 했고, 큰 이윤을 남기기위해 독점을 하기 시작합니다. 그러자 Voodoo 그래픽 카드 값이 치솟았고 소비자들은 Voodoo를 더 이상 구매하지 않으므로써 3dfx의 몰락이 시작 됐습니다.


     

<사진7>





<3. NVIDIA의 등장>


2002년 3dfx가 사업전략 실패로 파산하게 되자, NVIDIA(1993년 설립)는 3dfx의 모든 기술력을 사들이게 시작합니다. 


NVIDIA는 1999년 최초의 NVIDIA Geforce GPU 모델인 Geforce 256을 출시했지만, 3dfx 3D 기술력과 NVIDIA 래퍼런스 카드를 융합한 Geforce 4 시리즈를 출시하면서 세계시장의 주목을 받기 시작합니다.



<사진8. NVIDIA Geforce 4 시리즈>



2004년 Dual core의 등장과 함께 GPU 기술도 향상되고 있었어요. 하지만 GPU의 기술 발전에 있어서 '전력량 소모'는 해결해야할 큰 이슈였죠.


(2005년 중반에는 GPU의 hardware 성능 향상 뿐만아니라 GPU를 최대한 잘 활용할 수 있도록 해주는 software에 기술 투자도 주목을 받기 시작합니다. 이때부터 DirectX, OpenCL, CUDA와 같은 software program이 등장하기 시작했습니다.)


한때 AMD에서 출시한 GPU 라데온이 전력량 소모가 적은 GPU를 출시하면서 NVIDIA의 시장점유율을 앞서긴 했지만 2006년 NVIDIA가 Geforce 8800 GTX를 출시하면서부터 NVIDIA의 독주가 시작됩니다. 




<사진9>




<사진10.NVIDIA GPU 출시 모델명>





(아래 영상을 참고하시면

더 쉽게 빠르게 GPU 역사가 이해가 되실거에요!)






지금까지 GPU 역사에 대해서 간략하게 알아보았어요!


그럼 다음 시간부터 본격적으로 NVIDIA에서 출시하는 GPU 제품에 대해서 알아보도록 할게요!







[글 래퍼런스]

https://www.youtube.com/watch?v=tsB97IAejbk&feature=youtu.be


[사진 래퍼런스]

사진1

https://www.tutorialspoint.com/windows10/windows10_gui_basics.htm

사진2

http://itchitchats.blogspot.com/2011/11/first-pc-ibm-compatible-computer.html

사진3

https://time.com/3831359/computer-mouse-history/

사진4,7

https://www.youtube.com/watch?v=tsB97IAejbk&feature=youtu.be

사진5

https://www.nvidia.com/ko-kr/high-performance-computing/

사진6

https://en.wikipedia.org/wiki/File:KL_Diamond_Monster3D_Voodoo_1.jpg

사진8

https://www.techpowerup.com/gpu-specs/geforce4-ti-4400.c180

사진9

https://wccftech.com/nvidia-amd-discrete-gpu-market-share-report-q3-2017/



+ Recent posts