# 들어가며
Matrix Tiling등의 기법을 사용한 GPU Performance Optimization을 중점적으로 알아본다. 컴퓨터 구조 관련한 배경지식이 있으면 이해하기 편하므로 글을 읽다가 이해가 되지 않는다면 관련 블로그 포스트나 유튜브를 찾아보는 것이 좋다. 이전 글은 다음 링크의 블로그 포스트를 참고하면 된다.
# Introduction to GPU Computing
GPU 컴퓨팅의 전체적인 Overview를 다시한번 짚어보도록 하자. 자세한 내용은 이전 글들을 참고하는 것도 좋다.
회로 시스템에 들어가는 디바이스는 기본적으로 트랜지스터이다. 이러한 트랜지스터는 논리 게이트에 따라서 논리 연산을 수행하고 이러한 것들이 모이고 모여서 칩이라는 부품이 된다.
반도체 공정이라는 말을 들어봤을 것이다. 요즘은 14nm, 10nm로 점점 줄어들다가 3nm까지 정밀한 공정으로 고도화 되었다. 나노미터 숫자는 채널의 길이 혹은 회로의 선폭을 의미하고, 이 숫자가 작아질수록 트랜지스터의 크기가 작아지며 동일한 면적에 더 많은 트랜지스터를 배치할 수 있다. 이런 반도체와 관련하여 굉장히 유명한 법칙이 있는데, 이는 무어의 법칙이다. 클럭 속도 증가가 매년 지수적으로 우상향 한다는 이론인데, 요즘은 잘 지켜지지 않고 있긴 하다.
따라서 요즘 트렌드는 단일 CPU 코어 성능을 높이기보다는 칩 전체의 성능을 향상시키는데 초점을 맞춘다. 더이상 클럭 주파수만 높이지 않고, 더 깊은 파이프라인도 사용하지 않는다. 이미 성능 향상을 위해 엄청나게 정교한 Microarchitecture로서 CPU가 완성되고 있기 때문이다. 이러한 기술들의 궁극적인 목표는 단일 스레드 성능(지연시간)을 개선하는 것이다.
GPU라는 친구는 조금 다르다. 분기 예측을 하지 않으며 Prefetcher도 달려있지 않고, Dependency에 상관없이 순차적으로 실행하며 작고 덜 똑똑한 캐시가 달려있다. 이러한 구조는 궁극적으로 처리량과 에너지 효율성을 극대화하도록 설계되어있다. 지연 시간의 개선에는 중점을 두지 않는다. 따라서 연산이 밀집되어있고, TDP(Thermal Design Power, 반도체 장치가 최대 부하 상태에서 발산하는 열의 양)가 높을수록 Throughput이 무지막지하게 높아진다. 처리량의 괴물이 되는 것이다.
아래는 GPU Architecture를 쉽기 도식화 한 것이다. GPU Architecture에 대한 자세한 내용은 이전 글을 참고하면 된다.
이런 GPU 구조에도 단점이 존재한다. 그 중 하나가, GPU는 CPU 없이 단독으로 존재할 수 없으며, PCI 등으로 연결되어 있어야만 한다. Host(CPU) 중심의 아키텍쳐인 것이다. 하지만 이런 단점들도 학계와 산업계에서 극복하고자 하는 노력이 매우 활발하게 이루어지고있다.
# Matrix Multiplication with Tiling
GPU를 최적화 하는 방법들은 너무나도 많이 존재한다. Tiling도 GPU를 최적화 하는 방법 중에 하나이다. 타일링은 크기가 매우 큰 행렬곱을 수행 할 때의 최적화 기법이다. Matrix Tiling을 하면 많은 이점이 존재한다.
- 메모리 접근 효율을 향상시킨다. 메모리 단위를 쪼개서 더 작은 범위의 메모리로 접근하기 때문에 캐시 히트율이 높아진다는 장점이 있다. 또한, 데이터가 row 방향으로 가로로 저장된다면, 하나의 column을 모두 다 가져와야 하는 행렬곱을 할 때 메모리에 접근하여 데이터를 하나 사용하고 버리는 짓을 반복할 수도 있다. 이를 방지하는 것이 Matrix Tiling이다.
- 행렬의 사이즈가 캐시보다 클때 이를 극복할 수 있다.
- Tiling으로 나누어진 각 블록을 독립적으로 연산을 수행하여 병렬 처리 할 수 있게 된다.
Host(CPU)와 GPU 사이에 일어나는 상호 작용은 다음 표와 같다.
## Matrix Tiling Detail
연산 과정을 조금 더 알아 보도록 하자. Matrix Multiplication의 기본 원리만 알고 있다면 어렵지 않다. A와 B 행렬의 행렬곱을 수행해서 C 행렬을 만들고자 한다. 이때, 같은 크기의 작은 사각형으로 행렬을 쪼갰다. 행렬 곱을 생각하면, 빨간색 두 줄이 만드는 가중합의 결과는 C의 일부분에 불과하다. 이를 Partial Sum이라고 한다.
- Partial sum of 𝐶𝑖,𝑗 = ∑!𝐴𝑖,0:𝑇 *𝐵[0:𝑇,𝑗]
- Partial sum of 𝐶𝑖,𝑗+1 = ∑!𝐴𝑖,0:𝑇 *𝐵[0:𝑇,𝑗+1]
- Partial sum of 𝐶𝑖,𝑗+2 = ∑!𝐴𝑖,0:𝑇 *𝐵[0:𝑇,𝑗+2]
A, B 행렬의 타일이 만드는 결과값 C의 부분합은 다음과 같이 생겨먹었을 것이다.
저 타일들을 이동시키면서 최종적인 C의 결과 타일을 얻을 수 있다.
이해가 잘 되지 않는다면 아래 그림을 참고 해보자. 원래는 다 한번에 계산할 것을 그냥 T만큼으로 쪼개서 몇번에 걸쳐서 계산하고 나중에 한번에 더한 것 뿐이다. 이것 만으로도 이점이 있다는 것이 신기하다!
# Tensor Core
어떤 하드웨어를 어떻게 사용해서 구현 했는지는 자세히 배우지 않는다. Tensor Core가 어떤 것이고, 그것이 어느정도의 성능을 가지는지 알아보도록 한다.
Tensor Core는 NVIDIA에서 개발한 행렬 연산에 최적화 된 GPU 코어이다. 파이프라인의 1 Cycle당 64개의 곱연산과 합을 할수있다.
4x4 텐서를 기준으로 A행렬과 B행렬을 행렬곱하고 C행렬을 더하는데 필요한 연산 횟수가 4 x 4 x 4 = 64번이기 때문이다. 이때, Tensor Core에서 하는 연산의 데이터는 FP16(16Byte 양자화 값)인데, 기존의 경험들에서 FP32는 FP16보다 두배나 크고 정밀하지만 성능 차이가 아예 없는 수준이라는 답을 얻었기 때문이다.
이 과정을 FMA(4x4 Fused Multiply Add)라고 표현하기도 한다. 위의 그림에서 D행렬을 얻기 위한 연산 과정을 아래 그림을 도식화 해서. 나타내었다. FP16 행렬 두개가 입력되어 곱셈을 수행하고 FP32 행렬이 결과값에 더해진다. 이 과정에서 FP32 행렬로 바뀌게 된다. 입력과 출력의 Precision(정밀도)가 다르기 때문에 Mixed Precision 연산이라고도 한다.
NVIDIA가 Tensor Core로 한 사이클에 가능하게 한 연산 성능은 다음과 같다.
- V100에서 하나의 SM에는 8개의 Tensor Core가 들어간다.
- 1개의 Tensor Core는 1사이클에 64번의 FPA 연산이 가능하다. 8x64 = 512
- 하나의 SM에 64개의 CUDA Core가 들어가는데, 1개의 CUDA Core는 1사이클에 2개의 FP16연산이 가능하므로 128
- Tensor Core는 하나의 SM을 기준으로 CUDA Core보다 약 4배 더 높은 연산 성능을 보인다
그렇다면 4x4 FPA 연산은 Tiling을 통해서 Matrix Multiplication을 가속할 수 있다. 다음과 같은 행렬 연산이 있다고 가정 해보도록 하자. A(m x k), B(k x n)의 행렬곱의 결과인 C(m x n)이 나온다. 이때, m = 32, k = 16, n = 8이다.
한 사이클에 4x4 크기의 타일 연산을 끝내버린다.
이렇게 4 사이클만에 C의 첫번째 4x4 부분합이 완성되었다. 전체 출력 C를 완성하는데에는 32/4 = 8, 8/4 = 2, 그리고 하나의 타일을 위한 4사이클을 모두 곱한 8 * 2 * 4 = 64 사이클밖에 걸리지 않는 것이다.
아래 그림은 NVIDIA에서 제공하는 VOLTA Tensor Core와 PASCAL Core의 비교 그림이다. 그냥 신기하다 정도로만 보도록 하자.
국민대학교 권은지 교수님의 인공지능 하드웨어 강의를 수강하며 정리한 내용입니다.
Slides Provided
임베디드 시스템 프로그래밍 - Eunhyeok Park
딥러닝 최적화 - Eunhyeok Park
References
'AI > AI Hardware' 카테고리의 다른 글
[인공지능 하드웨어] 7 - Winograd Convolution (5) | 2024.10.15 |
---|---|
[인공지능 하드웨어] 6 - Deep Learning Optimization(Convolution Lowering, Systolic Array) (6) | 2024.10.11 |
[인공지능 하드웨어] 4 - GPU Architecture(2) (3) | 2024.10.07 |
[인공지능 하드웨어] 3 - GPU Architecture(1) (7) | 2024.10.04 |
[인공지능 하드웨어] 2 - DNN Computation (3) | 2024.09.23 |