연구실의 지원을 받아 ARC Lab 분들과 참여한 2025 겨울 가속기학교..
수업 교재가 워낙 자세하기에 배운 내용들은 따로 정리를 안 할 예정이고, 프로젝트 관련해서는 기록용으로 작성해두려고 한다.
Target 모델
input sentence가 주어졌을 때 Conv - MoE - FC layer를 거쳐 긍정인지 부정인지 판단하는 간단한 딥러닝 모델을 가속화하는 프로젝트였다. 전부 cpu 버전으로 작성되어 있었다.
최적화 과정
1. GPU 포팅하기
- Conv1D, Linear, ReLU, GetMax, SoftMax 등의 layer를 전부 GPU로 포팅했다
- 각 tensor에서 host memory는 pinned memory로 설정하여 DMA direct 전송이 가능하도록 하였고, gpu memory를 미리 allocate 해두었다
- SoftMax 같은 연산 자체는 cpu가 gpu보다 빨랐지만, host device 간 데이터 전송이 비싸므로 gpu에서 처리시켰다
2. batching 하기
- gpu의 병렬 연산 능력을 최대한 활용하기 위해 여러 sentence를 batch로 처리한다
- latent의 dim이 하나 증가한다, 그 결과 FC layer들도 GEMV(matrix-vector) 연산이 아닌 GEMM 연산이 된다
3. im2col 적용하기
- Conv1D는 kernel을 옮겨가며 element-wise product를 하는데, input image를 matrix로 바꾸면 matmul 형태로 계산 가능하다
- 이로써 linear와 conv1D 둘 다 matmul 문제로 변하였다~~
왜 이렇게 matmul을 사용하려고 했냐?
- arithmetic intensity 차이 (동일한 데이터 재사용 가능, 병렬성 활용 가능)
- 이미 많이 최적화 시도가 이루어짐
4. matmul 최적화하기
- 두 가지 종류의 matmul을 구현하였음
1) matmul using shared mem + tiling
https://siboehm.com/articles/22/CUDA-MMM
How to Optimize a CUDA Matmul Kernel for cuBLAS-like Performance: a Worklog
In this post, I’ll iteratively optimize an implementation of matrix multiplication written in CUDA.My goal is not to build a cuBLAS replacement, but to deepl...
siboehm.com
- 수업시간에 배운 기법, thread block 단위로 shared mem을 공유하는 것을 활용해 A/B element를 재사용
- bank conflict를 줄이기 위해 padding 삽입
- FC last layer에서는 512x2 matrix가 포함되어 2) 번 방식을 사용할 수 없었다 (misalignment)
- MoE layer에서 2) 번 방식을 적용하니 결과 오차가 심해져 사용할 수 없었다
2) sgemm
https://github.com/Liu-xiandong/How_to_optimize_in_GPU
GitHub - Liu-xiandong/How_to_optimize_in_GPU: This is a series of GPU optimization topics. Here we will introduce how to optimi
This is a series of GPU optimization topics. Here we will introduce how to optimize the CUDA kernel in detail. I will introduce several basic kernel optimizations, including: elementwise, reduce,...
github.com
- thread block을 warp tile로 쪼개고, 동일 warp 내의 thread가 처리할 block으로 더 쪼개 사용
- global mem -> shared mem 으로 prefetching, double buffering을 통해 sm으로의 로드와 계산을 동시에 진행
- register file을 활용하고, float4 단위로 read/load 한다
- 우리 프로젝트에 포팅하기 위해 A & C를 column-major로 처리하고, bias를 더하도록 코드를 수정하였다
5. kernel fusion
- 우리 입맛대로 kernel fusion을 진행했다
- sgemm layer에 넣기 전에 transpose가 필요한 경우가 있어 삽입하기도 했다.
6. 기타 최적화 기법들
- kernel 최적화: global mem에서는 memory coalescing이 중요, shared mem에서는 bank conflict가 중요
- stream 활용, Conv1D / MoE layer에서 여러 개의 stream에서 병렬로 진행되도록 함
- parameter tuning => threads per thread block, block size, batch size 등등
더 해볼만한 시도들
- MoE Linear layer를 sgemm으로 바꿨을 때 validation false 나는 이유 (오차?)
- im2col + Conv1D fusion (idx로 바로 접근 가능)
- concat과 MoE Linear fusion
(심화반 내용)
- Tensor core 적용, Multi-GPU
CPU 코드에서는 0.7 정도 나오던 throughput이 최종적으로 3500 정도까지 올랐다
기본반에서 1등도 했다 ~~ (기본반 기준 1000 정도까진 올려야 순위권에 드는 듯합니다)
아이패드도 달달하네요..
총평
수업자료도 자세하고 조교님들도 친절했었다
무엇보다 4일동안 이렇게 내리 집중해본 적이 진짜 오랜만인 거 같다
최적화... 재밌었지만 CTF랑 비슷하게 피말리게 하는 무언가가 있는 거 같아 ptsd 올 뻔...
이번 방학도 꽤 알차게 마무리해서 뿌듯하다
'etc' 카테고리의 다른 글
카메라 캘리브레이션 (Camera Calibration) (0) | 2024.08.29 |
---|---|
ffmpeg 이용해 여러 동영상을 동시에 재생 (격자) (0) | 2024.08.29 |
pre-commit 이란? (0) | 2024.08.29 |
git commit 관련 조작하기 (feat. lazygit) (0) | 2024.08.29 |
github에는 못올리는 큰 파일 dvc로 관리하기 (0) | 2024.08.29 |