본문 바로가기

dev_AI_framework

(237)
"CUDA" + "C++" + "pybind11" 모듈의 빌드 방법 및 과정, 체크리스트 확인 0) 큰그림: 파일 → 컴파일 → 링크 → .pyd → wheel → 설치소스: *.cpp, *.cu (+ 헤더들)컴파일C++ 소스(.cpp) → MSVC(cl.exe) 가 .obj 생성CUDA 소스(.cu) → NVCC가 호스트컴파일러(MSVC)를 호출해서 .obj 생성.cu가 여러 개면 Device Linking(Relocatable Device Code) 단계가 들어감링크: 모든 .obj + 외부 라이브러리(cudart, cublas 등) → 하나의 DLL 생성파이썬 확장 모듈이면 윈도우 확장자 = .pyd (사실상 DLL)패키징: .pyd를 wheel 안에 넣어 .whl 생성설치/import: pip install .whl → site-packages에 복사 → import 모듈명 동작포인트: 모..
AI 컴파일러의 구현 - graph_executor_v2 를 통해 진행 현황 요약컴파일러 분리 구조 마련dev/backend/compiler/ 추가: ir/, passes/, kernels/, runtime/ 스켈레톤 구성.IR → Pass(canonicalize, fuse_elementwise) → 커널 선택(selector) → 실행(ExecutorV2) 파이프라인 연결.네이티브 바인딩 v2 신설 & 빌드 성공dev/backend/graph_executor_v2/에 bindings_min_api.cpp, launch_table.cpp, my_kernels.cu(더미).CMake + scikit-build-core로 wheel 생성/설치 성공.install(TARGETS …) 추가로 wheel에 .pyd 포함 확인.graph_executor_v2.cp312-win_a..
operator mapping 전략 짜기 - string or int ?? 메모리 효율, 빠른 비교를 위해 int 위주 매핑 전략 사용하기 계산 그래프에서 연산자(operator)를 사전 정의할 때"matmul", "add", "relu" 같은 문자열(str) 로 두는 방식0, 1, 2, … 같은 정수(int) 로 두고 매핑 테이블에서 찾아 쓰는 방식두 가지 다 자주 쓰이는 패턴인데, 실제로는 성능, 유지보수성, 확장성 면에서 차이가 있어요. 🔎 1. 문자열(str) 방식op = "matmul"if op == "matmul": ...장점가독성: 코드만 봐도 어떤 연산자인지 직관적으로 알 수 있음.디버깅 편리: 로그 찍거나 출력했을 때 바로 의미를 파악 가능.확장성: 새로운 연산자 추가 시 그냥 "softmax" 같은 문자열만 정의하면 됨.단점성능 손해: 문자열 비교/해시는 정수 비교보다 느림 (특히 그래프 크기가 크고 수천~수만 노드..
폴더 및 파일 구조 변경 - Python 내 통제 방법으로 변경 예정 개발/유지/확장 면에서 Python 통제형이 훨씬 유리합니다. 런치 오버헤드는 CUDA Graphs나 지속(persistent) 커널로 대부분 상쇄할 수 있습니다. 왜 Python 통제가 유리한가 (실전 관점)Pass/퓨전 반복 속도MatMul+Bias+Act, Conv+BN+Act 같은 패턴-리라이트를 Python에서 20~50줄로 시도/롤백/AB테스트 가능.C++/CUDA로 하면 컴파일·디버그 사이클이 길고 실험 비용 큼.커널 선택(Selector)·오토튠Shape/레이아웃/정밀도에 따라 후보 커널 점수화 → Python에서 마이크로 벤치 후 캐시(JSON/SQLite).장비 바뀌어도 학습된 선택을 재사용.멀티 백엔드CPU/ROCm/NPU를 붙일 때 IR/Pass/Selector는 그대로 쓰고, la..
AI 컴파일러의 정의와 Frame_work 내 사용 방법 고민 AI 컴파일러란?AI 모델을 효율적으로 실행하기 위해 중간 표현(Intermediate Representation, IR)으로 변환하고, 하드웨어별 최적화된 실행 코드로 컴파일하는 시스템을 의미전통적인 컴파일러가 “C/C++ 같은 소스 코드를 기계어로 변환”한다면, AI 컴파일러는 “딥러닝 모델 그래프를 GPU, TPU, CPU 같은 다양한 하드웨어에서 최적 성능을 내도록 변환”하는 역할 1. 일반적인 정의입력: 딥러닝 프레임워크(Pytorch, TensorFlow 등)에서 정의된 연산 그래프(예: matmul, conv, relu …).중간 표현(IR): 하드웨어 독립적인 중간 언어로 모델을 추상화 (ex: XLA HLO, MLIR, TVM IR).출력: 특정 하드웨어용 최적화된 코드 (CUDA ker..
cuda 내 연산 수행을 어떻게 하는게 이득일지 - 나눠서, 한 번에 1) 커널을 나눌 때(멀티 커널) 생기는 것들장점라이브러리 최적화 극대화: cuBLAS/cuBLASLt, cuDNN이 텐서코어, 스케줄링, 타일링을 최적화. 거대한 GEMM은 이게 최고.구현 단순/유연: 그래프가 바뀌어도 재컴파일·특수화 부담 적음.병렬성/오버랩: 독립 서브그래프는 여러 스트림에 분산해 오버랩 가능.단점런치 오버헤드 누적: 작은 커널이 줄줄이면 수 µs 단위 오버헤드가 많이 쌓임(특히 Windows/WDDM).글로벌 메모리 왕복: 중간 텐서를 매번 global mem -> kernel -> global mem로 쓰고 읽음. 메모리 대역폭이 병목이면 치명적.캐시/L2 재사용 기회 상실: 바로 다음 연산이 같은 데이터를 써도, 커널이 달라지면 레지스터/SMEM에 남아 있던 게 사라짐.2) 단..
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..