안녕하세요~
이번글에서는 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://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.nvidia.com/ko-kr/technologies/multi-instance-gpu/
https://www.nvidia.com/ko-kr/data-center/nvidia-ampere-gpu-architecture/
[사진 래퍼런스]
사진1
사진2,13,14,15
사진3
사진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
사진8
https://towardsdatascience.com/neural-network-architectures-156e5bad51ba
사진9
사진10
사진11
사진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
사진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/
'컴퓨터 하드웨어 > GPU(Graphics Processing Unit)' 카테고리의 다른 글
6.딥러닝을 위해 제공되는 NVIDIA 솔루션(서비스) (Feat.클라우드) (0) | 2020.07.10 |
---|---|
5.NVIDIA GPU 브랜드 (Geforce, Quadro, Ti) (0) | 2020.07.09 |
3.GPGPU와 CUDA (feat.cuDNN) (0) | 2020.07.01 |
2.내장그래픽과 외장그래픽 그리고 GPU 병목현상(feat. Multi-GPU) (4) | 2020.07.01 |
1.GPU의 역사 (0) | 2020.06.28 |