2. Tesla ( 2008년 NVIDIA에서 출시된 GPU Architecture )
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의 개수가 차이가 남
SP (Stream Processor) 는 core 역할을 하기 때문에
CPU의 core격인 ALU와 같이 논리, 수학 연산(with
MAD(Multiply-add-Divide))을 수행함
SFU (Special Function Unit) 는 초월함수, 픽셀
attribute interpolation등의 연산에 사용되고 4개의
부동 소수점 곱셈기도 포함하고 있다.
https://89douner.tistory.com/159?category=913897
3. 초월함수는 일반적 다항식의 근으로 정의할 수 없는 함수 부동소수점 연산
고정 소수점 방식을 알아보자
CPU가 32bit 명령어 체계를 사용한다면 아래와 같이 부호
(+.-)와 정수부, 소수부로 나눌 수 있다. 문제는 정수,
소수부를 표현할 수 있는 경우가 제한적이다.
https://89douner.tistory.com/159?category=913897
4. 부동 소수점 방식은 유효숫자를 나타내는 가수와 소수점의 위치를 풀이하는 지수로 나누어 표현하는 방식이다.
부동소수점에서는 지수부(Exponent)는 기준값(Bias)를 중심으로 +,-값을 표현한다.
13.5를 32bit 부동소수점 (float : 32bit )로 표현
https://89douner.tistory.com/159?category=913897
5. FLOPS (FLoat point Operations Per Second)
FLOPS는 컴퓨터의 성능을 표현하는 데 굉장히
중요한 지표로 사용됨
말그대로 초당 부동소수점을 계산하는 능력을 의미
딥러닝에서는 대부분 계산들이 부동소수점 (실수형태
: float 자료형)으로 계산이 되는 것을 알 수 있다.
그렇기 때문에 FLOPS라는 지표가 딥러닝과 같이
소수점을 기반으로 한 과학연산에서 시간을 측정하는
중요한 지표가 될 수 있다.
만약 FLOPS 성능이 좋은 GPU를 사용한다고 하면
다른 FLOPS가 낮은 GPU보다 모델을 학습시키거나
inference하는 것이 더 빠름
VGG19를 돌리기 위해선 적어도 40G-Ops이상을
지원하는 GPU를 구매해야 함
1,000,000,000 FLOPS = 1 GFLOPS (giga FLOPS)
1000 GFLOPS = 1 TFLOPS (Tera FLOPS)
https://89douner.tistory.com/159?category=913897
6. SM (Streaming Multi-processor)
만약 8개의 SP와 2개의 SFU가 모두 사용될 경우 SM에서는
1 clock cycle당 최대 16(=8+4*2)회의 부동소수점 곱셈을
수행할 수 있음
Shared Memory는 SM내에서 실행되는 thread 사이의
data교환을 가능하게 해주는 곳이다.
Tesla에서 Shared Memory는 16KB용량을 갖는다.
SIMT (Single Instruction Multiple Threading)
(GP)GPU로 넘어오면서 CUDA를 지원하자 SIMT방식을
고안함
CPU에서는 주로 SIMD (Single Instruction Multiple Data)
라는 용어를 사용.
CPU의 성능을 최대로 활용하기 위해서 하나의 명령어로
여러개의 데이터를 처리하도록 하는 동작을 의미
CUDA가 등장하면서 하나의 명령어로 여러개의 Thread를
동작시키는 일이 필요해졌기 때문에 SIMT방식을 고안함
https://89douner.tistory.com/159?category=913897
7. Fermi ( 2010년에 출시된 NVIDIA GPU 아키텍처)
Tesla에서 각 SM마다 제공되던 16KB shared
memory는 64KB로 용량이 늘었다.
SM외부의 texture unit의 도움을 받아 실행되던
load/store 명령도 SM내에 Load/Store(LD&ST)
유닛이 추가됨으로써 SM 자체적으로 실행이
가능해짐
SM에 포함되어 있는 SP는 Tesla에 비해 4배가
늘어난 32개로 구성됨
Tesla의 SP는 32-bit 부동소수점을 지원
Fermi에서는 32-bit 부동소수점을 지원하는
CUDA core 2개를 동시에 사용할 수 있어 64bit
부동소수점 연산을 할 수 있게 됨
https://89douner.tistory.com/159?category=913897
8. Kepler ( 2012 )
Fermi 구조에서는 CUDA core, LD&ST unit, SFU 등의 실행
유닛들이 다른 유닛들에 비해 두 배 빠른 속도로 동작했다면 Kepler
구조에서는 전체 유닛이 동일한 속도로 동작하도록 변경
( Performance/Watt 문제로 이런식의 구조를 고안했다고 함 )
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 부동소수점 연산이 동시에 실행될 수 있다고 함
https://89douner.tistory.com/159?category=913897
9. 늘어난 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:과학연산) 향상을 고려한
변화라고 볼 수 있다.
https://89douner.tistory.com/159?category=913897
10. MaxWell ( 2014 )
Kepler에서 Maxwell로 아키텍처가 변하는 과정에서 미세공정이
28nm에 머물로 있었기 때문에 획기적인 변화를 꾀하지 못할거라
생각한 NVIDIA는 모바일 버전의 GPU 구조를 춣시하고자 하면서
이전 Kepler 구조를 최적화함
https://89douner.tistory.com/159?category=913897
11. Pascal ( 2016 )
Pascal이라는 인공지능에 특화된 GPU 아키텍처 소개함
Pascal 부터는 HPC(High Performance Computing)분야 (GP104 GPU)와 그래픽 분야 (GP100 GPU) 두 가지 버전으로
나눠서 제품 출시함
https://89douner.tistory.com/159?category=913897
12. HPC 또는 딥러닝 분야에서는 64bit, 16bit 부동소수점연산
(FP64/FP16)을 지원하면서 하나의 thread가 많은 register를
사용하도록 했고, 그래픽 분야에서는 32bit(FP32)를 주로
사용하고 프로그램이 간단해 register개수를 굳이 늘리지
않도록 했다.
딥러닝 기반의 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부분의 차이를
확인해야 함.
https://89douner.tistory.com/159?category=913897
13. Votal ( 2018 ) V100
Volta 아키텍처를 채택한 GV100은 TSMC의 12nm 공정으로
구현
기존에 사용된 CUDA core는 FP32코어로 이름이 바뀜
이전에 GPU가 “64FP -> 16FP”로 변환된 걸 봤듯이,
Votal에서는 8bit 단위의 INT(정수연산) 코어가 추가되었다.
이렇게 하여 inferencing을 가속화함
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를
고안
https://89douner.tistory.com/159?category=913897
14. V100 GPU
V100 GPU에는 SM당 8개의 Tensor core가 장착되어
있으므로, 하나의 SM에서는 64*8*2 = 1024 번의
“곱셈+덧셈" floating point 연산이 한 사이클에 수행됩니다.
V100에는 80개의 SM이 장착되어 있으므로 80*1024번의
연산이 한 사이클에 수행됨
이전 파스칼 아키텍처기반의 P100보다
mixed-precision개념을 도입한 volta 아키텍처 기반의 V100
모델의 9~10배의 성능을 냄
cuDNN은 출시되는 최신 GPU모델에 맞게 업데이트 되는
경우가 있는데, 최신 GPU인 volta와 당시 최신 소프트웨어
플랫폼인 cuDNN이 결합되면 훨씬 더 좋은 성능을 냄
https://89douner.tistory.com/159?category=913897
15. Turing ( 2018.02 )
Turing기반 RTX Geforce20시리즈가 출시됨
Volta의 큰 골격은 유지하면서 규모를 절감한 마이너
파생상품으로 간주됨
눈에 띄는 부분은 RT core를 지원하는 것과 4bit정수
(INT) 연산도 가능
https://89douner.tistory.com/159?category=913897
16. RT core는 Ray Tracing을 위한 기술임
RT core는 Ray Tracing을 위한 기술임 HPC(High Performance Computing)을 위해 점점 발전해 나가고 있지만 그래픽
부분도 포기할 수 없기 때문에 RT(Ray Tracing)기술을 접목시킴
1) Ray Tracing ( RT ; 광원추적 )
RT란 그래픽으로 구성된 3D 공간에서 어떤 물체에 빛이 반사되거나, 어떤 물체에 의해 그림자가 생기거나, 빛의 굴절을
일으키는 모든 작용들을 고려햐여 화면에 표현해주는 기술임
RT core를 통해 실시간 ( Real-Time ) 으로 이러한 기능들을 가능하게 해준 것이 가장 큰 특징임
https://89douner.tistory.com/159?category=913897
17. Ampere ( 2020.03 ) A100
2020.03월 Votal 아키텍처의 후속작으로 Ampere라는 NVIDIA GPU 아키텍처가 소개됨.
Ampere 아키텍처는 작정하고 딥러닝을 위해 만든 GPU라고 봄
Ampere 아키텍처는 TSMC의 7nm 미세공정 적용
https://89douner.tistory.com/159?category=913897
18. 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) 도 가능하게 해 줌
https://89douner.tistory.com/159?category=913897
20. Sparse connection
Sparse connection은 쉽게 말해 딥러닝에서 쓰이는
parameter 중에 불필요한 부분을 0으로 만들어 계산을 좀 더
빠르게 하거나, 차원 수를 줄여주어 overfiting을 피해주는
기법으로 사용됨
Ampere(A100) 아키텍처에서는 이러한 sparse model에
support해주는 기법을 제공해 줌
A100(Ampere)의 tensor 코어는 sparse model에 대해 최대
2배 높은 성능을 제공해 줌, inference 시간도 줄여줄 뿐만
아니라 학습성능 도 개선하는데 사용할 수 있음
Multi-Instance with Kubernetes
Ampere 아키텍처는 최대 7개의 sub-group gpu로 partitioning
예를들어, 40GB VRAM을 갖고 있는 ampere GPU는 각각 20GB VRAM을 갖는 2개의 sub-ampere GPU로 나눌 수 있음
최대 5GB의 sub-ampere gpu 7개를 생성할 수 있음, 이렇게 나눈 GPU들을 나중에 다시 merge할 수 있다.
사용사례를 보면, 낮에는 낮은 처리량 추론을 위해 7개의 sub-GPU를 사용하고, 밤에 퇴근할 때는 딥러닝 모델 학습을 위해
1개의 본래의 GPU인스턴스로 만들어 사용
각각의 sub-group을 형성하는 gpu들은 서로 독립적이기 때문에 서로 다른 프로그램을 실행시켜도 CUDA가 각각
인스턴스에 맞춰 실행
이러한 MIG ( Muiti-Instance GPU )기술은 컨테이너 또는 쿠버네티스와 같이 DevOps유저들에게 특히 유용함
https://89douner.tistory.com/159?category=913897