개발/유지/확장 면에서 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는 그대로 쓰고, launch_*만 새 바인딩으로 연결.
- 디버깅·관측성
- IR dump, pass-by-pass diff, 메모리 플래너 시각화 등 “보이는 개발”이 가능.
📦dev
┣ 📂.pytest_cache
┃ ┣ 📂v
┃ ┃ ┗ 📂cache
┃ ┃ ┃ ┣ 📜lastfailed
┃ ┃ ┃ ┣ 📜nodeids
┃ ┃ ┃ ┗ 📜stepwise
┃ ┣ 📜.gitignore
┃ ┣ 📜CACHEDIR.TAG
┃ ┗ 📜README.md
┣ 📂backend
┃ ┣ 📂graph_executor
┃ ┃ ┣ 📂activation
┃ ┃ ┃ ┣ 📜activation_ops.cu
┃ ┃ ┃ ┣ 📜activation_ops.cuh
┃ ┃ ┃ ┗ 📜readme.md
┃ ┃ ┣ 📂bias
┃ ┃ ┃ ┣ 📜add_bias_rowwise.cu
┃ ┃ ┃ ┣ 📜add_bias_rowwise.cuh
┃ ┃ ┃ ┗ 📜readme.md
┃ ┃ ┣ 📂bindings
┃ ┃ ┣ 📂build
┃ ┃ ┃ ┣ 📂lib.win-amd64-cpython-312
┃ ┃ ┃ ┃ ┣ 📜graph_executor.cp312-win_amd64.exp
┃ ┃ ┃ ┃ ┣ 📜graph_executor.cp312-win_amd64.lib
┃ ┃ ┃ ┃ ┗ 📜graph_executor.cp312-win_amd64.pyd
┃ ┃ ┃ ┗ 📂temp.win-amd64-cpython-312
┃ ┃ ┃ ┃ ┗ 📂Release
┃ ┃ ┃ ┃ ┃ ┗ 📜build.ninja
┃ ┃ ┣ 📂cnn
┃ ┃ ┃ ┣ 📜cnn_kernels.cu
┃ ┃ ┃ ┣ 📜cnn_kernels.cuh
┃ ┃ ┃ ┗ 📜readme.md
┃ ┃ ┣ 📂executor
┃ ┃ ┃ ┣ 📜run_graph.cu
┃ ┃ ┃ ┣ 📜run_graph.cuh
┃ ┃ ┃ ┣ 📜run_graph_backward.cu
┃ ┃ ┃ ┣ 📜run_graph_backward.cuh
┃ ┃ ┃ ┣ 📜run_graph_utils.cuh
┃ ┃ ┃ ┣ 📜run_graph_with_loss.cu
┃ ┃ ┃ ┗ 📜run_graph_with_loss.cuh
┃ ┃ ┣ 📂ge
┃ ┃ ┃ ┣ 📜act_map.cuh
┃ ┃ ┃ ┣ 📜alloc_utils.cuh
┃ ┃ ┃ ┣ 📜cublas_utils.cuh
┃ ┃ ┃ ┣ 📜cuda_check.cuh
┃ ┃ ┃ ┣ 📜fill.cuh
┃ ┃ ┃ ┣ 📜gemm_rm.cuh
┃ ┃ ┃ ┣ 📜logging_config.h
┃ ┃ ┃ ┣ 📜pack_utils.cu
┃ ┃ ┃ ┗ 📜pack_utils.cuh
┃ ┃ ┣ 📂kernels
┃ ┃ ┃ ┣ 📂activation
┃ ┃ ┃ ┣ 📂add
┃ ┃ ┃ ┣ 📂backward
┃ ┃ ┃ ┣ 📂graph
┃ ┃ ┃ ┣ 📂matmul
┃ ┃ ┃ ┗ 📂reduce
┃ ┃ ┣ 📂loss
┃ ┃ ┃ ┣ 📜loss_kernels.cu
┃ ┃ ┃ ┗ 📜loss_kernels.cuh
┃ ┃ ┣ 📂optimizer
┃ ┃ ┃ ┣ 📜optimizer_config.cuh
┃ ┃ ┃ ┣ 📜optimizer_kernels.cu
┃ ┃ ┃ ┣ 📜optimizer_kernels.cuh
┃ ┃ ┃ ┣ 📜optimizer_types.cuh
┃ ┃ ┃ ┗ 📜readme.md
┃ ┃ ┣ 📂pooling
┃ ┃ ┃ ┣ 📜pooling_kernels.cu
┃ ┃ ┃ ┣ 📜pooling_kernels.cuh
┃ ┃ ┃ ┣ 📜pooling_ops.cu
┃ ┃ ┃ ┗ 📜pooling_ops.cuh
┃ ┃ ┣ 📂quant
┃ ┃ ┃ ┣ 📜epilogue_kernels.cuh
┃ ┃ ┃ ┣ 📜int8_gemm_dp4a.cuh
┃ ┃ ┃ ┣ 📜observers.cuh
┃ ┃ ┃ ┣ 📜quant_kernels.cuh
┃ ┃ ┃ ┣ 📜quant_passes.cu
┃ ┃ ┃ ┣ 📜quant_types.cu
┃ ┃ ┃ ┗ 📜quant_types.cuh
┃ ┃ ┣ 📂reduce
┃ ┃ ┃ ┣ 📜reduce_ops.cuh
┃ ┃ ┃ ┗ 📜reduce_stride.cuh
┃ ┃ ┣ 📂rnn
┃ ┃ ┃ ┣ 📜rnn_kernels.cu
┃ ┃ ┃ ┗ 📜rnn_kernels.cuh
┃ ┃ ┣ 📂softmax
┃ ┃ ┃ ┣ 📜softmax_kernels.cu
┃ ┃ ┃ ┗ 📜softmax_kernels.cuh
┃ ┃ ┣ 📂test
┃ ┃ ┃ ┣ 📜backward_test.py
┃ ┃ ┃ ┣ 📜graph_executor.cp312-win_amd64.pyd
┃ ┃ ┃ ┣ 📜run_graph_test.py
┃ ┃ ┃ ┣ 📜test_cnn.py
┃ ┃ ┃ ┣ 📜test_cnn_model_fit.py
┃ ┃ ┃ ┣ 📜test_optimizer_update.py
┃ ┃ ┃ ┣ 📜test_run_graph_with_loss.py
┃ ┃ ┃ ┗ 📜test_run_graph_with_loss_batch.py
┃ ┃ ┣ 📜bindings.cpp
┃ ┃ ┣ 📜op_structs.cuh
┃ ┃ ┣ 📜setup.py
┃ ┃ ┗ 📜setup2.py
┃ ┣ 📂__pycache__
┃ ┃ ┣ 📜base.cpython-312.pyc
┃ ┃ ┣ 📜cpu.cpython-312.pyc
┃ ┃ ┣ 📜cuda.cpython-312.pyc
┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┣ 📜base.py
┃ ┣ 📜cpu.py
┃ ┣ 📜cuda.py
┃ ┗ 📜__init__.py
┣ 📂backpropagation
┣ 📂layers
┃ ┣ 📂tests
┃ ┃ ┣ 📂__pycache__
┃ ┃ ┃ ┣ 📜dense_mat_test.cpython-312.pyc
┃ ┃ ┃ ┣ 📜dense_test.cpython-312-pytest-8.3.5.pyc
┃ ┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┃ ┣ 📜activation_check.py
┃ ┃ ┣ 📜cce_test.py
┃ ┃ ┣ 📜cnn_pooling_test.py
┃ ┃ ┣ 📜cnn_test.py
┃ ┃ ┣ 📜pytorch_xor.py
┃ ┃ ┣ 📜regression_test.py
┃ ┃ ┣ 📜regression_test_v2.py
┃ ┃ ┣ 📜rnn_test.py
┃ ┃ ┣ 📜sequential_model_test.py
┃ ┃ ┣ 📜test_optimizer.py
┃ ┃ ┣ 📜test_realdata_binary.py
┃ ┃ ┣ 📜wdbc.data
┃ ┃ ┣ 📜xor_test.py
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📂__pycache__
┃ ┃ ┣ 📜activations.cpython-312.pyc
┃ ┃ ┣ 📜activation_layer.cpython-312.pyc
┃ ┃ ┣ 📜activation_mat.cpython-312.pyc
┃ ┃ ┣ 📜BatchNormalization.cpython-312.pyc
┃ ┃ ┣ 📜Conv2D.cpython-312.pyc
┃ ┃ ┣ 📜dense.cpython-312.pyc
┃ ┃ ┣ 📜dense2.cpython-312.pyc
┃ ┃ ┣ 📜dense_cuda.cpython-312.pyc
┃ ┃ ┣ 📜dense_mat.cpython-312.pyc
┃ ┃ ┣ 📜Dropout.cpython-312.pyc
┃ ┃ ┣ 📜flatten.cpython-312.pyc
┃ ┃ ┣ 📜layer.cpython-311.pyc
┃ ┃ ┣ 📜layer.cpython-312.pyc
┃ ┃ ┣ 📜pooling.cpython-312.pyc
┃ ┃ ┣ 📜Pooling2D.cpython-312.pyc
┃ ┃ ┣ 📜Rnn.cpython-312.pyc
┃ ┃ ┗ 📜shape_def.cpython-312.pyc
┃ ┣ 📜activation_layer.py
┃ ┣ 📜BatchNormalization.py
┃ ┣ 📜Conv2D.py
┃ ┣ 📜dense.py
┃ ┣ 📜Dropout.py
┃ ┣ 📜flatten.py
┃ ┣ 📜layer.py
┃ ┣ 📜Pooling2D.py
┃ ┣ 📜Rnn.py
┃ ┗ 📜shape_def.py
┣ 📂ml
┃ ┣ 📂metrics
┃ ┃ ┣ 📂__pycache__
┃ ┃ ┃ ┣ 📜metrics.cpython-312.pyc
┃ ┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┃ ┣ 📜metrics.py
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📂model_selection
┃ ┃ ┣ 📂__pycache__
┃ ┃ ┃ ┣ 📜search.cpython-312.pyc
┃ ┃ ┃ ┣ 📜split.cpython-312.pyc
┃ ┃ ┃ ┣ 📜validation.cpython-312.pyc
┃ ┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┃ ┣ 📜search.py
┃ ┃ ┣ 📜split.py
┃ ┃ ┣ 📜validation.py
┃ ┃ ┗ 📜__init__.py
┃ ┗ 📂preprocessing
┃ ┃ ┣ 📂__pycache__
┃ ┃ ┃ ┣ 📜pipeline.cpython-312.pyc
┃ ┃ ┃ ┣ 📜preprocessing.cpython-312.pyc
┃ ┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┃ ┣ 📜pipeline.py
┃ ┃ ┣ 📜preprocessing.py
┃ ┃ ┗ 📜__init__.py
┣ 📂models
┃ ┣ 📂__pycache__
┃ ┃ ┣ 📜model.cpython-311.pyc
┃ ┃ ┣ 📜model.cpython-312.pyc
┃ ┃ ┣ 📜OPL.cpython-312.pyc
┃ ┃ ┣ 📜sequential.cpython-312.pyc
┃ ┃ ┣ 📜sequential_mat.cpython-312.pyc
┃ ┃ ┣ 📜__init__.cpython-311.pyc
┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┣ 📜model.py
┃ ┣ 📜OPL.py
┃ ┣ 📜sequential.py
┃ ┗ 📜__init__.py
┣ 📂tests
┃ ┣ 📂__pycache__
┃ ┃ ┣ 📜conftest.cpython-312-pytest-8.3.5.pyc
┃ ┃ ┣ 📜test_setup.cpython-312-pytest-8.3.5.pyc
┃ ┃ ┣ 📜test_setup.cpython-312.pyc
┃ ┃ ┗ 📜__init__.cpython-312.pyc
┃ ┣ 📜conftest.py
┃ ┣ 📜test_backend.py
┃ ┣ 📜test_backend_gpu.py
┃ ┣ 📜test_preprocessing.py
┃ ┣ 📜test_setup.py
┃ ┣ 📜__init__.py
┃ ┗ 📜진단코드.py
┣ 📂utils
┃ ┣ 📂__pycache__
┃ ┃ ┣ 📜activations.cpython-312.pyc
┃ ┃ ┗ 📜load_cuda.cpython-312.pyc
┃ ┗ 📜load_cuda.py
┣ 📂__pycache__
┃ ┣ 📜__init__.cpython-311.pyc
┃ ┗ 📜__init__.cpython-312.pyc
┣ 📜main.py
┣ 📜pytest.ini
┣ 📜runtest.py
┗ 📜__init__.py
폴더 및 파일 구조의 변경 계획, CUDA 소스 / pybind 바인딩 / 컴파일러 3층으로 쪼개서, IR -> 패스 -> 커널 선택 -> 런타임을 Python 에서 통제하고, CUDA 는 실행 엔진으로 쓰도록 변경
[Python 모델/그래프]
↓ (IR로 변환, 패스 적용)
[컴파일러층 python/ ...]
└─ selector가 커널이름 결정
↓ (이름 + 버퍼 포인터 전달)
[pybind 바인딩 bindings.cpp]
↓
[CUDA 구현 kernels/cuda/... .cu]
새 폴더 구조 계획
dev/
┣ backend/
┃ ┣ graph_executor/ # 기존 CUDA 실행기 (현행 그대로 유지)
┃ ┣ compiler/ # 새 Python 기반 AI 컴파일러
┃ ┃ ┣ ir/ # 중간 표현
┃ ┃ ┣ passes/ # 최적화 패스
┃ ┃ ┣ kernels/ # 레지스트리, 셀렉터
┃ ┃ ┣ runtime/ # 실행기 (ExecutorV2)
┃ ┃ ┗ __init__.py
┃ ┗ __init__.py
2. 동작 관계
- graph_executor/ = 백엔드 엔진 (CUDA + pybind .pyd)
- compiler/ = 프론트/컴파일러층 (IR·Pass·커널선택·런타임 플래너)
- compiler/runtime/executor.py에서 최종적으로 import graph_executor 해서 커널 launch 호출.
'dev_AI_framework' 카테고리의 다른 글
| AI 컴파일러의 구현 - graph_executor_v2 를 통해 (0) | 2025.09.01 |
|---|---|
| operator mapping 전략 짜기 - string or int ?? 메모리 효율, 빠른 비교를 위해 int 위주 매핑 전략 사용하기 (0) | 2025.09.01 |
| AI 컴파일러의 정의와 Frame_work 내 사용 방법 고민 (1) | 2025.09.01 |
| cuda 내 연산 수행을 어떻게 하는게 이득일지 - 나눠서, 한 번에 (1) | 2025.09.01 |
| on-the-fly 전치 + 타일렁 누적 VS cuBLAS 의 비교 (0) | 2025.08.31 |