본문 바로가기

dev_AI_framework

(231)
on-the-fly 전치 + 타일렁 누적 VS cuBLAS 의 비교 언제 차이가 거의 없다?범용 GEMM(큰 M/N/K, 연속 메모리, FP16/BF16/TF32/FP32)cuBLAS는 이미공유 메모리 타일링, 레지스터 마이크로타일, coalesced 로드,(Ampere+) Tensor Core 경로,내부 패킹/스케줄링을 최적화해서 **루프라인(roofline)**에 가깝게 나옵니다.→ 같은 아이디어로 직접 커널을 짜도 비슷한 수준을 만드는 건 가능하지만, 꾸준히 앞서기는 매우 어렵습니다.단발성 곱(가중치 재사용 X)B를 물리 전치/패킹하지 않고, on-the-fly 전치로 처리하는 전략은 cuBLAS 커널과 철학이 동일.→ 큰 격차가 나기 어려움. 언제 차이가 “크게” 벌어질 수 있나?형상·데이터형·레이아웃이 특수아주 작은 매트릭스(작은 M/N, 작은 배치): 커널 런..
현재 GEMM 구현 내용 #pragma once#include #include #include "../ge/cuda_check.cuh"// Row-major 매핑 래퍼들// 단일 배치 GEMM (TF32)inline void gemm_rm_tf32( cublasHandle_t h, bool transA, bool transB, int M, int N, int K, const float* A, int lda, const float* B, int ldb, float* C, int ldc, float alpha=1.f, float beta=0.f){ cublasOperation_t opA = transA ? CUBLAS_OP_T : CUBLAS_OP_N; cublasOperation_t..
행렬 곱 용어, 차원 표기 정의 - GEMM, (B, T, C, H, Dh) ... 1. GEMM (General Matrix-Matrix Multiplication)alpha - 새 계산 값의 크기 조절스칼라 계수, 결과 스케일링에 사용beta - 기존 C 값의 보존량스칼라 계수, 기존의 C 행렬에 곱해진 후 더해짐beta = 0 - C 의 기존 값은 무시되고 덮어쓰기beat = 1 - C 의 기존 값과 새 결과를 합산 2. gemm_rm_tf 의 네이밍 해석 - row-major 포맷 행렬들 사이에서 TF32 정밀도로 수행하는 GEMM백엔드/프레임워크 내부 규현 규현 규약rm -> row-major (행 우선 저장)CPU 의 일반적인 배열 포맷cm -> column-majortf -> tensorFloat-32(TF32)연산 정밀도 Transformer 에서 자주 나오는 차원 표기기..
Attention/Transformer Layer 를 구현하려면 - 기저 연산들의 구현 필요 기저 연산(primitive ops)”들을 먼저 제대로 만들고, 그걸 Attention/Transformer 레이어가 조합해서 그래프(IR)로 컴파일 → CUDA 실행 플랜으로 내리면 된다. 1) 최소 기저 연산(커널/연산자) 체크리스트Attention/Transformer에 필요한 “필수”와 “있으면 좋은” 항목을 분리했어요.필수 (Forward/Backward 지원)GEMM / Batched GEMM: Q= XWq, K= XWk, V= XWv, O = (softmax(QK^T/√Dh)V)Wofp16/bf16 입력 + fp32 누적(Tensor Core) 권장, cublasLt 사용 시 bias+activation 일부 fuse 가능Softmax(마스킹 포함): additive mask(0 또는 -in..
attention, transformer layer 구현하기 - Attention, transformer 란? 1. 수학적/연산적 장점병렬화 가능 - RNN 은 순서대로 토큰을 처리해야 해서 GPU 병렬화가 안 됨, Attention 은 QK^T 연산으로 한 번에 시퀀스 전체 계산동적 수용 범위 Dynamic receptive field - CNN 은 커널 크기 제한, RNN 은 가까운 시점 위주, Attention 은 softmax 로 모든 위치끼리 직접 연결 - 문맥 길이가 길어져도 멀리 있는 토큰을 참조 가능정보 흐름의 단축 경로 - RNN 의 경우 1 - 100 토근의 연결에서 99번 state 를 거쳐야 하지만, Attention 은 한 번의 QK^T 로 직접 연결, gradient vanishing/exploding 문제 완화 2. 표현력 Expressivity가중치 기반 관계 학습 - Attentio..
CuPy 백엔드 방식과 직접 cuBLAS 래퍼 방식의 사용 1) 성능·수학 모드CuPy: 기본적으로 cuBLAS/ cuSOLVER를 호출합니다. Ampere+에서는 TF32가 기본 허용된 환경이면 matmul에서 텐서코어를 씁니다. 필요하면 cupy.cuda.cublas로 math mode / allow_tf32를 바꿀 수 있고, dtype을 float16/bfloat16/float32로 바꿔도 상층이 알아서 cuBLASEx 경로를 밟아요. 즉, “웬만하면 이미 최적 경로”.직접 래퍼: 네 코드는 CUBLAS_COMPUTE_32F_FAST_TF32를 명시하고 있어 TF32 사용이 확실합니다. 또한 StridedBatchedGemmEx를 직접 태우므로, CuPy의 브로드캐스팅+배치보다 정확히 원하는 배치 레이아웃/stride로 돌려 오버헤드를 줄일 수 있어요. 특..
BACKEND 부분 수정하기... 연산 방식의 수정 목표CPU↔GPU 토글이 가능한 Backend 층을 추가.새 ML 추정기(Linear/Ridge/Lasso/Logistic 등)는 Backend API만 호출하도록 변경.기존 DL 레이어/커널은 그대로 재사용(CUDABackend 안에서 호출). 변경/추가 개요 (요약 표)추가backend/base.py새로 생성공통 인터페이스(추상): gemm/gemv/sigmoid/softmax/sum/axpy/dot + (옵션) cholesky_solve, conjugate_gradient, prox_soft_threshold추가backend/cpu.py새로 생성NumPy/Scipy로 CPUBackend 구현추가backend/cuda.py새로 생성네 CUDA 커널/cuBLAS/cuSOLVER를 감싸는 CUDABack..
GPU 백엔드와 GEMM/GEMV 에 대해... 백엔드 연산을 구현하면서 기초 지식을 다시 다지기 백엔드란?아이디어: “수학 연산을 어디서 돌릴지”를 추상화한 층.CPU 백엔드 → numpy/Eigen 같은 걸로 계산GPU 백엔드 → CUDA 커널 + cuBLAS/cuSOLVER로 계산코드에서 토글xp = cupy if use_gpu else numpy # 공통 연산자(dot, exp, sum...)를 xp로 호출흐름(GPU일 때):호스트(Python/CPU)에서 **장치 메모리(GPU)**에 배열을 올림(H2D 복사)연산 요청 → 커널/라이브러리 호출(cuBLAS, cuSOLVER…)필요하면 결과를 CPU로 내림(D2H 복사)→ 왕복을 줄이고 GPU에 “상주”시키는 게 핵심 BLAS가 뭐고, GEMM/GEMV는 뭔데?BLAS는 “표준 선형대수 연산..