https://play.google.com/store/apps/details?id=kr.clpeak&hl=en_US&gl=US
https://gigglehd.com/gg/mobile/10922227 이 글을 보다보니 적절한 벤치가 하나 있어서 소개해드립니다.
clpeak은 오픈소스 OpenCL GPU 벤치 입니다. OpenCL은 NVIDIA의 CUDA와 함께 시장을 양분하는 GPGPU라이브러리로, GPU를 사용한 연산(AI등)이나 수치 해석같은 부분은 모두 OpenCL(또는 CUDA)를 사용하고 있습니다.
GPU의 이론적 (float32 - single precision의 경우) FLOPS(float operation per sec)계산을 할 때, "GPU클럭 * ALU(연산유닛)수 * 2 " 를 하는데, 말 그대로 GPU내의 연산유닛 하나당 1 클럭에 1번의 덧셈과 곱셈을 진행할 수 있기 때문입니다.
clpeak은 이 정의 그대로 MAD (Multiply-ADd 또는 MAC, FMA >> Y = aX + b)연산을 통해서 GPU에서 GPGPU연산이 얼마나 이론치에 근접하는지 보여줍니다.
(https://github.com/krrishnarraj/clpeak/blob/0777205be1d5681d5a76d46ec94588544e8462a5/src/kernels/compute_sp_kernels.cl#L21)
물론 모든 벤치가 그렇듯 정확하지는 않은데...
Nvidia Tesla V100의 경우 이론치는 아래와 같지만
실 벤치로 측정되는 성능은 이론치를 약간 넘습니다.
개인 테스트 서버의 GTX1060도
이론치 보다
실측이 좀 더 잘 나오는 편 입니다. (이유는 불명....;;)
또한 안드로이드 버전도 지원하기에... 이를 통해 모바일 GPU와 PC/서버급 GPU의 실성능은 대충 비교해 볼 수 있는데...
아무래도 모바일 AP의 특성상 호스트(CPU) 메모리를 공유하는 환경이, 별도의 GDDR을 사용하는 일반 그래픽 카드 대비 대역폭에서 열세인 부분은 어쩔 수 없어보입니다. 이 부분이 이론치 대비 실측치가 떨어지는 가장 큰 원인이지만, 그래도 LPDDR4x니 LPDDR5같은 차세대 램을 먼저 적용하는 모바일 특성상 점점 그 갭을 매꿀 수 있겠지요.
제가 올해 모델 (E2100, SD888)을 측정해보지는 않았지만 1TFLOPS는 무난해 보이니 장족의 발전을 한 것이 아닌가 합니다. 1969년 (아폴로 11호 발사년도) 가장 빨랐던 슈퍼컴퓨터인 CDC6600이 3MFLOPS 성능이니....반 백년 기술발전의 결정체인 스마트폰은 그 당시 슈퍼컴 보다 최소 34만배 빠른 손에 들고 다닐 수 있는 컴퓨터가 되었습니다. ㄷㄷㄷ
p.s floatN 에서 N은 vector instruction이라서 AVX 같은 SIMD와 동일합니다.(한 번에 n개 입력을 처리) 아무래도 I/O상 이점이 있지만, 코드를 짜 보면 실활용에서 넓은 SIMD폭을 충분히 활용하기는 힘든 편이더군요.
p.s AI, 그 중 현재 DNN(Deep Neural Network)에서 가장 모바일에 많이 사용되는 CNN(Convolutional Neural Network)의 경우 Convolution연산이 MAD로 치환 가능하기에 코드를 잘 짜면 거의 이론상 최대 성능에 근접합니다.
p.s 현재 안드로이드의 경우 DNN모델을 적용하는 가장 쉬운 방법은 구글의 TensorFlow 모델을 TFLite형태로 변환해서 코드에 활용할 수 있습니다. 이 경우 런타임을 CPU/GPU선택 가능하며 GPU(또는 NPU)의 경우 구글이 제공하는 통일된 인터페이스인 NNAPI와 각각의 AP제조사(퀄컴 등)이 제공하는 커스텀 런타임이 있고, 대부분의 경우 커스텀 런타임쪽 성능이 더 높습니다. (스냅드래곤의 hexagon, Hisilicon의 DaVinci 등...)
p.s 여러 AP제조사에서 NPU(Neural Processing Unit)이라는 이름으로 DNN연산기를 제공하고 있습니다. 대부분 서드파티 개발자에게는 TFLite로 작성된 DNN모델을 AP제조사가 제공하는 라이브러리에 넣으면 자체 런타임에서 각 연산을 분석하여 NPU에서 동작 가능한것은 NPU에서, 그렇지 않은 연산(layer)은 GPU에서 동작하여 최종 결과물을 출력합니다. NPU의 경우 ASIC과 같이 사전에 gate로 정의된 연산만 가능하기에 거의 필연적이지요.
p.s NPU제조사들이 십수 TOPS라고 광고하는 NPU들이 FLOPS단위가 아닌것은 ASIC의 특성상 gate의 갯수가 실리콘 면적에 직결되고, 면적 == 단가인 상황에서 이미 float연산이 가능한 GPU가 있기에.... NPU에서는 float32가 아닌 int8 또는 bfloat16같은 상대적으로 낮은 정밀도의 연산만을 지원합니다. 그렇기에 FLOPS라고 광고하지 않고 TOPS라고 하는것....
p.s 그렇기에 필연적으로 float32로 학습된 모델을 더 낮은 정밀도로 바꾸어주는 'Quantization'이 강제됩니다. 이 분야도 꽤나 핫했는데.... 학습 후 Quantization은 모델에 따라서 편차가 커서 현재는 학습 시점에 혼합 정밀도를 사용해서 학습하는 방법에 대한 논문이 나오고 있습니다. (모바일용이 아닌 대책없이 커지는 모델의 크기를 VRAM이 감당할 수 없어서의 차선책에 가깝습니다.)
p.s 앞선 모든 방법은 AI모델을 활용하는 방법 (forward 방향)에 대한 설명입니다. 제가 아는 선에서는 현재 모바일에서 GPU나 NPU를 활용하여 서비스 타임에 추가적인 학습을 진행하는 방법은 사용하지 않습니다. 이는 당연하다면 당연한 것이, 학습 == backward (backpropagation) 시에는 역방향의 그레디언트 (편미분값)을 활용하여 학습을 진행하게 되는데.... forward시 몇 배에 달하는 연산량과 backward시 NPU를 활용할 수 없기 때문입니다. (NPU는 낮은정밀도 + forward만 지원)
디멘시티나 엑시노스 NPU는 정수연산에 거의 몰빵한 반면
A칩 NPU는 정수연산은 안되고 F16, F32연산에 몰빵한 것 같더군요 ㅎㅎ