TL;DR
nvmath-python v1.0은 CUDA‑X 수학 라이브러리를 Python 친화적 API로 제공해 NumPy/CuPy/PyTorch 워크플로를 크게 변경하지 않고도 CPU·GPU·다중 노드에서 고성능 연산을 실행할 수 있다. 범용 API는 이식성과 단순성을 보장하고 advanced 하위모듈의 특화 API는 cuBLASLt 기반의 커널 융합과 상세 설정으로 병목 연산을 가속한다. 클래스 기반 상태형 API는 플래닝과 autotune을 분리해 반복 실행에서 준비 비용을 상환하며, 특정 문제와 하드웨어에서는 autotune으로 큰 속도 향상(예: RTX A6000 256%)이 관찰되었다. numba-cuda 연동과 FFT epilog/prolog 같은 JIT 콜백은 사용자 정의 연산을 파이프라인에 직접 결합해 중간 메모리 이동을 줄이는 실무적 경로를 제공한다.
빠른 이해
새로운 점
도메인 특화 언어로 사용자 정의 희소 포맷을 정의하는 Universal Sparse Tensor(UST)과 Python JIT 콜백을 FFT·GEMM 파이프라인에 삽입하는 연동 방식이 주요 차별점이다.
핵심 메커니즘
nvmath-python은 Python 레이어에서 입력 텐서의 메모리 공간을 판별해 적절한 CUDA‑X 또는 CPU 백엔드를 선택하고, 범용 API와 하드웨어 특화 API를 병행 제공해 작업 특성에 맞게 호출 경로를 바꾼다. 성능 크리티컬 경로에서는 cuBLASLt 기반의 JIT 커널 융합과 클래스 기반 상태형 API의 플래닝·오토튜닝 단계를 통해 준비 비용을 초기 한 번만 지불하고 반복 실행에서 이득을 회수한다. 또한 numba-cuda 등과의 통합으로 사용자 JIT 코드를 epilog/prolog 또는 device API로 결합해 중간 메모리 이동을 줄이고 낮은 산술 집약도 연산의 처리량을 확보하는 것이 핵심 메커니즘이다.
핵심 수치
- Autotuning speedup (RTX A6000): 256%- Figure 3에서 특정 문제 크기와 구성에 대해 보고된 최대 속도 향상 수치
섹션별 상세
nvmath-python v1.0 개요
- nvmath-python v1.0은 CUDA‑X 수학 라이브러리를 Pythonic API로 노출해 CPU, GPU, 다중노드에서 실행할 수 있다. — 블로그 서두와 설치/메모리·실행 공간 예제 코드(NumPy·CuPy 예)와 로그 출력 예시
설치와 환경 선택
import numpy as np
import nvmath
m, n, k = 10, 40, 100
a = np.random.randn(m, k)
b = np.random.randn(k, n)
c = nvmath.linalg.advanced.matmul(a, b)NumPy 배열을 입력으로 받아 nvmath-python의 고성능 행렬곱 API를 호출하면 결과가 다시 NumPy 배열로 반환되는 사용 경로를 보여준다. 이 예시는 기존 NumPy 기반 워크플로우를 크게 바꾸지 않고 CUDA‑X 루틴을 사용하게 해 주는 호환성 방식을 드러낸다. 입력 메모리 공간에 따라 실행 공간이 자동 선택되며, 로그를 통해 연산이 어디에서 실행되었는지 추적할 수 있다.
범용 API와 특화 API의 설계 철학
성능 기법: 커널 융합과 합성 연산
import cupy as cp
import nvmath
m, n, k = 10_000_000, 40, 10
a = cp.random.randn(m, k, dtype=cp.float32)
b = cp.random.randn(k, n, dtype=cp.float32)
c = cp.random.randn(m, n, dtype=cp.float32)
alpha, beta = 1.5, 0.5
d1 = alpha * cp.matmul(a, b) + beta * c # Multiple kernels
d2 = nvmath.linalg.advanced.matmul(a, b, c=c, alpha=alpha, beta=beta) # Single kerneltall‑and‑skinny 행렬의 합성 연산에서 여러 커널을 연쇄 호출하면 데이터 이동과 호출 오버헤드가 커진다. 두 줄짜리 비교 코드는 CuPy 방식(다중 커널)과 nvmath-python의 advanced 합성 matmul(단일 커널)을 직접 대비해 커널 융합의 효과를 드러낸다. Figure 1과 일치하는 실험으로 합성 연산에서의 성능 우위를 정량적으로 확보할 수 있다.
- 합성 연산을 단일 fused 커널로 처리하면 tall‑and‑skinny GEMM 같은 낮은 산술 집약도 작업에서 성능 이득이 발생한다. — Figure 1의 tall‑and‑skinny GEMM 실험과 advanced.matmul의 비교 코드
플래닝·오토튜닝과 상태형 API
import nvmath
from nvmath.linalg.advanced import MatmulEpilog
import cupy as cp
feed_count = 10
batch_size = 1024
m, n, k = 1024, 1024, 1024
a = cp.random.rand(batch_size, m, k, dtype=cp.float32)
b = cp.random.rand(batch_size, k, n, dtype=cp.float32)
bias = cp.random.rand(batch_size, m, 1, dtype=cp.float32)
with nvmath.linalg.advanced.Matmul(a, b) as mm:
mm.plan(epilog=MatmulEpilog(MatmulEpilog.RELU_BIAS), epilog_inputs={"bias": bias})
mm.autotune(iterations=5)
for i in range(feed_count):
d = mm.execute()
mm.reset_operands_unchecked(a=d)클래스 기반의 상태형 API는 플래닝(plan), 자동튜닝(autotune), 실행(execute)을 분리해 반복 실행에서 준비 비용을 분산시킨다. 이 코드는 배치 수만큼 반복적으로 동일 연산을 실행하는 워크로드에서 상태형 API가 어떻게 준비 비용을 상환하는지를 보여 준다. Figure 2의 비용 추세와 대응하며, autotune 결과는 직렬화해 다른 세션에서 재사용할 수 있다.
- 상태형 API와 autotune을 사용하면 반복 실행에서 플래닝·튜닝 비용을 상환해 총 실행 비용을 줄일 수 있다. — Figure 2의 비용 추세와 상태형 Matmul 예제 코드(plan/autotune/execute)
- 어떤 문제에서는 autotuning이 큰 성능 향상을 보였고, 예로 RTX A6000에서 특정 문제에 대해 256% 속도 향상이 관찰되었다. — Figure 3의 벤치마크 결과와 하드웨어별 비교 설명
사용자 정의 커널과 JIT 콜백 통합
from PIL import Image
import nvmath
import cupy as cp
img = cp.asarray(Image.open("your_lovely_dog.jpg").convert("L")) / 255.0
sigma_value = 20.0
# frequency-domain Gaussian H(fx,fy) = exp(-2*pi^2*sigma^2*(fx^2+fy^2))
def gaussian_filter(shape, sigma):
fy = cp.fft.fftfreq(shape[0])[:, None]
fx = cp.fft.rfftfreq(shape[1])[None, :]
return cp.exp(-2.0 * cp.pi * cp.pi * sigma * sigma * (fx * fx + fy * fy))
# epilog_impl compiled and used as FFT epilog
h_filter = gaussian_filter(img.shape, sigma_value)
img_fft = nvmath.fft.rfft(img, epilog={"ltoir": epilog, "data": h_filter.data.ptr})
filtered_img = nvmath.fft.irfft(img_fft)사용자 정의 JIT epilog를 FFT 파이프라인에 삽입해 주파수 도메인 필터를 바로 적용하는 예시이다. 주파수 필터를 별도의 커널로 분리하지 않고 FFT의 epilog로 컴파일된 코드를 결합하면 중간 메모리 전송을 줄이고 처리량을 개선할 수 있다. Figure 4의 원본과 필터링 결과 비교는 이 방식의 시각적 효과를 확인시키는 근거가 된다.
from numba import cuda
from nvmath.device import random
import cupy as cp
# Pre-compile the RNGs into IR to use alongside other device code
compiled_rng = random.Compile(cc=None)
# RNG initialization kernel
@cuda.jit(link=compiled_rng.files, extensions=compiled_rng.extension)
def init_rng(states, seed):
idx = cuda.grid(1)
random.init(seed, idx, 0, states[idx])
# Path generation kernel uses compiled RNG inside device codenvmath-python의 device API를 numba-cuda 커널에서 호출하도록 사전 컴파일된 RNG를 링크하는 워크플로우 예시이다. Monte Carlo 경로 생성처럼 낮은 산술 집약도를 갖는 루프 연산은 호스트 API 호출만으로는 비효율이므로 device API와 커널을 결합해 연산을 GPU 내부에서 융합해야 처리량을 확보한다. 이 예시는 generate_gbm_paths에서 RNG를 직접 소비해 성능 병목을 해소하는 방법을 보여 준다.
도입 경로와 추가 자료
용어 해설
- 커널 융합(Kernel fusion)
- — 여러 연산을 단일 GPU 커널로 합쳐 메모리 전송을 줄이고 산술 집약도를 높이는 최적화 기법이다. nvmath-python은 cuBLASLt의 JIT fusion을 활용해 연쇄된 연산을 하나의 실행 경로로 합쳐 성능을 높인다. 저연산 집약 작업에서 합성 연산을 단일 커널로 처리하면 호출 오버헤드와 중간 결과 메모리 이동을 크게 줄일 수 있다.
- 자동 튜닝(Autotuning)
- — 여러 후보 커널을 실행해 성능을 측정하고 최적의 구현을 선택하는 준비 과정이다. nvmath-python은 특정 문제 크기와 레이아웃에 대해 autotune을 수행해 최적의 커널을 고른 뒤 그 계획을 재사용한다. 이 과정은 초기 비용이 크지만 반복 실행에서 이 비용을 상쇄해 총 처리량을 개선한다.
- 상태형 API(플래닝/실행 분리)(Stateful API)
- — 계획(plan), 튜닝(autotune), 실행(execute)을 명확히 분리해 플래닝 비용을 여러 실행에 상환(amorize)하는 인터페이스이다. nvmath-python의 클래스 기반 API는 이 흐름을 구현해 반복적 워크로드에서 준비 비용을 절감한다. 튜닝 결과는 직렬화해 다른 세션이나 동형 시스템에 배포할 수 있다.
- GEMM(General Matrix Multiply)(GEMM)
- — 행렬 곱셈의 일반화로 고성능 수치연산의 핵심 빌딩블록이다. nvmath-python은 dense/structured 입력을 모두 처리하는 범용 API와 GPU에 특화된 고성능 합성 API를 통해 GEMM 병목을 해소한다. tall‑and‑skinny 같은 낮은 산술 집약도 케이스에서는 합성 및 fused 구현이 중요하다.
- FFT(고속 푸리에 변환)(FFT)
- — 시간·공간 신호를 주파수 도메인으로 변환하는 핵심 알고리즘이다. nvmath-python은 cuFFT 계열과 연동해 입력 텐서의 메모리 공간을 판단해 CPU/GPU에서 적절히 실행하고, 사용자 정의 JIT epilog/prolog 콜백을 주파수 처리에 삽입할 수 있다. 이미지 필터 같은 파이프라인에서 사용자 콜백으로 필터링을 바로 적용해 중간 메모리 이동을 줄인다.
기술
- NumPy
- CuPy
- PyTorch
- cuBLASLt
- cuFFT
- cuBLASMp
- numba-cuda
- NVPL
- Intel MKL
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.