GPU 커널 개발 환경 설정에 대한 실용적인 노트: CUDA 13의 GPU 지원 중단, 비동기 타이밍 함정, 프로파일러 카운터 권한 [P]
요약
본 기사는 GPU 커널 엔지니어링을 위한 실용적인 환경 설정 가이드를 제공합니다. CUDA 버전별 지원 중단 아키텍처를 확인하고, 컴퓨팅 능력을 점검하는 것이 중요합니다. 또한, 비동기적 특성상 정확한 성능 측정을 위해 동기화 및 이벤트를 사용해야 하며, 프로파일러 카운터 권한 문제 해결 방법도 안내합니다.
핵심 포인트
- GPU 환경 설정 시 단순히 유무가 아닌 컴퓨팅 능력(compute capability) 확인이 필수입니다.
- CUDA 버전별 지원 중단 아키텍처를 숙지하고 적절한 툴킷을 사용해야 합니다.
- 비동기 실행 특성상 정확한 성능 측정을 위해 동기화 및 CUDA 이벤트를 활용해야 합니다.
- 프로파일러 카운터 접근 권한 문제 발생 시, 관리자 권한(sudo)으로 도구를 실행해야 할 수 있습니다.
저는 GPU 커널 엔지니어링(저의 채널에서 진행하는 시리즈입니다. 로드맵은 이전에 여기에 올렸습니다: https://www.reddit.com/r/MachineLearning/comments/1xa4h2g/open_gpu_kernel_engineering_series_naive_gemm_to/)에 대한 무료 시리즈를 진행하고 있습니다. 세션 1은 설정(setup) 세션입니다. 이를 준비하는 과정에서 시간이 많이 들었고, 한 곳에서 보기 어려운 몇 가지 사항들을 모았기 때문에 여기에 직접 공유합니다. 비디오와 코드는 마지막에 링크되어 있습니다. 단순히 'NVIDIA GPU가 있는지'를 확인하는 것이 아니라 compute capability (컴퓨팅 능력)을 확인해야 합니다.
nvidia-smi --query-gpu=name,compute_cap --format=csv
7.5는 Turing이고, 8.0/8.6은 Ampere이며, 8.9는 Ada이고, 9.0은 Hopper입니다. 이 수치가 무엇을 할 수 있는지 결정합니다:
- CUDA 13은 Maxwell, Pascal, Volta를 지원 중단했습니다. 해당 카드의 경우 CUDA 12 툴킷(toolkit)을 설치해야 합니다.
- GTX 16 시리즈는 Turing이지만 텐서 코어(tensor core)가 없습니다.
- 텐서 코어 작업을 위해서는 RTX 20 시리즈 이상 또는 T4가 필요합니다. Ampere 전용 명령어는 Ampere 이상이 필요합니다.
- FP8은 Ada 또는 Hopper가 필요합니다. Hopper 전용 기능(TMA, WGMMA)은 H100이 필요한데, 이는 대부분의 사람이 임대해야 할 것입니다.
드라이버(Driver), 툴킷(toolkit), PyTorch의 런타임(runtime)은 세 가지 다른 것들입니다. nvidia-smi 헤더에 표시된 CUDA 버전은 드라이버가 지원하는 가장 최신 버전이지, 실제로 설치된 버전이 아닙니다. pip으로 설치한 PyTorch는 자체적인 CUDA 런타임을 번들로 포함하므로, torch.cuda.is_available()이 True를 반환한다고 해서 nvcc가 존재하는지 여부는 알 수 없습니다.
WSL 2에서는 디스트로(distro) 내부에 리눅스 드라이버를 설치하지 마십시오. Windows 드라이버가 사용되기 때문에 WSL-Ubuntu 툴킷 전용 설치 프로그램(toolkit-only installer)을 사용하십시오.
GPU 실행은 비동기적(asynchronous)이므로, 단순한 타이밍 측정은 작업 자체의 시간이 아니라 큐잉(queueing) 시간을 주로 측정합니다. 워밍업(Warm up), 동기화(synchronize), CUDA 이벤트를 사용하고 여러 번 평균을 내야 합니다:
def bench(fn, iters=20):
for _ in range(3): fn()
torch.cuda.synchronize()
s, e = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)
s.record()
for _ in range(iters):
fn()
e.record()
torch.cuda.synchronize()
return s.elapsed_time(e) / iters # ms
행렬 곱셈(matmul)의 경우, 처리량(throughput)은 약 2MN*K FLOPs를 시간으로 나눈 값입니다.
숫자 옆에 dtype을 기록하세요. FP32와 BF16의 기준선(baseline) 차이가 크기 때문입니다.
프로파일러 카운터: ERR_NVGPUCTRPERM 기본적으로 비관리자 사용자(non-admin users)는 GPU 성능 카운터를 읽을 수 없으므로, Nsight Compute가 이 오류와 함께 실패합니다. 해결 방법은 다음과 같습니다. ncu를 sudo로 실행하세요 (sudo는 보통 PATH를 초기화하므로 전체 경로를 사용해야 합니다). 또는 관리자에게 모든 사용자에게 카운터 접근 권한을 활성화하도록 요청해야 합니다. Windows/WSL에서는 Windows 측에서 이 기능이 활성화됩니다. 만약 GPU를 임대(rent)한다면, 관리형 컨테이너 플랫폼은 카운터 접근을 차단할 수 있으므로 제공업체에 확정하기 전에 반드시 테스트해 보세요.
무엇보다 먼저 스모크 테스트(Smoke test)를 진행하세요. 모든 CUDA 호출에 오류 검사(error check)가 포함된 작은 추가 커널을 nvcc -arch=native로 빌드한 다음, nsys와 ncu를 한 번 실행합니다. 이것이 작동한다면 드라이버, 툴킷, GPU 및 두 프로파일러 모두 정상이라는 의미입니다.
해당 세션에서는 필수 전제 조건(포인터, 평탄 행렬 인덱싱(flat matrix indexing), matmul 및 그 FLOP 카운트, PyTorch 기본 지식)을 다루고 GPU를 얻는 여러 방법을 비교합니다. 소요 시간은 약 40분에서 45분입니다. 비디오:
코드: https://github.com/prasoonmhwr/gpu_kernel_engineering (폴더: session-01-prerequisites-setup) 주의사항: 명령어는 Ubuntu용으로 작성되었으며, 모든 배포판(distro)에서 테스트하지는 않았습니다.매일 이 작업을 하는 사람들을 위한 질문:
- 가장 많은 시간을 소모하게 만든 설정 함정은 무엇이었나요? 제가 놓친 부분이 있을 것이라 확신합니다 (Secure Boot 및 드라이버 로딩, 컨테이너 툴킷, 불일치한 호스트 컴파일러 등).
- 위에 언급된 내용 중 귀하의 환경에 잘못되었거나 구식이 된 부분이 있습니까?
제출자: /u/Winter_Mistake_3185 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/MachineLearning (hot)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기