dev_AI_framework
Graph Executor v2 (GE2) 개발 진행 기록
명징직조지훈
2025. 9. 4. 11:27
1. 목표
- IR → Pass → 커널 선택 → f16 Lt 커널 호출 까지 파이프라인 연결
- Bias + Activation을 cuBLASLt Epilogue로 흡수 (가능 시 Fuse)
- Python 레벨의 ExecutorV2 클래스와 C++/CUDA 네이티브 모듈을 통합한 End-to-End 실행기 완성
2. 작업 과정 요약
(1) 기본 구조 준비
- compiler/runtime/executor.py에 ExecutorV2 클래스 구현
- IR Graph → PassManager (canonicalize, fuse_elementwise) 적용
- _prepare_buffers()에서 입력/출력 텐서 포인터와 GEMM 파라미터 블록 준비
- native.launch_kernel() 호출 구조 확립
- Torch, CuPy 텐서에서 .data_ptr()/.data.ptr로 device pointer 추출 지원
(2) 네이티브 API 정의
- include/ge_v2_api.h:
- launch_kernel(kernel_name, buffers, descs, stream) ABI 정의
- Host 파라미터 블록(GemmBiasActParams) 전달 규약 확립
- ge_v2_kernel_table_raw() / ge_v2_capability_table_raw() 제공
(3) 커널 구현
- f32 smoke kernel (gemm_bias_act_f32_kernel)
- f16 + cuBLASLt 경로
- 처음엔 Bias/Activation 후처리 커널 별도 실행
- 이후 Epilogue (BIAS, RELU_BIAS) 시도
- 실패 시 폴백(fallback): GEMM only → 후처리 커널 (add_bias_fp16, relu_only_fp16, add_bias_relu_fp16)
- 안정적으로 모든 조합 (has_bias, act) = (0,0),(0,1),(1,0),(1,1) 지원
(4) Pybind11 바인딩
- bindings_min_api.cpp
- query_capability, launch_kernel, query_kernels 노출
- GE2_API_VERSION = 1 상수 제공
- launch_table.cpp
- "gemm_bias_act_tc_f16", "gemm_bias_act_f32" 등록
- Capability 점수 테이블 관리
(5) 빌드 환경
- CMake
- pybind11, CUDAToolkit, cublasLt 링크
- CUDA_ARCHITECTURES = 86 (Ampere)
- install 시 include, .pyd, header 복사
- Windows 빌드 성공, .pyd 산출 확인
3. 성과
- ✅ IR 기반 Executor → Native Kernel 연동 완성
- ✅ Bias+Act Epilogue Fuse 시도 및 안정적 폴백 처리
- ✅ f16/f32 전 경로 정확도 OK (에러 ~0.001 수준, 정상 범위)
- ✅ Python 테스트 스위트 통과 (Smoke + E2E)
4. 다음 진행 사항
(A) 성능/최적화
- 알고리즘 캐싱: (M,N,K,epilogue,ws_limit) 키로 Heuristic 결과 캐시 → 반복 호출시 재탐색 방지
- Workspace 관리: cudaMalloc/free 대신 풀(pool) 또는 stream별 캐시 활용
- 환경 토글: GE2_FORCE_NO_EPILOGUE=1 → 항상 후처리 커널로 실행 (디버깅/재현성 확보)
(B) 기능 확장
- Beta 지원: 기존 결과(C) + αAB + βC 형태 지원 (Residual Add 시 유용)
- 추가 Activation: GELU, SiLU 등 Epilogue/후처리 확장
- INT8/FP8 지원: dtype 확장 (cublasLt가 제공하는 경우)
(C) 개발자 경험
- 로깅: NVTX 범위 삽입 → Nsight Systems/Compute에서 Epilogue 성공 vs 폴백 구분
- 테스트 확장:
- edge case (M=1, N=1, odd shapes, non-multiple-of-8 K)
- 대형 행렬 (4096+) 성능 벤치마크
- 정확도 기준 강화: f16은 abs+rel 혼합 오차 기준 적용
(D) 구조 확장
- CUTLASS backend 옵션화: Epilogue 커스터마이징이 더 복잡해질 때 (Residual+Clamp+Quant 등) CUTLASS Epilogue Visitor로 전환 가능성 검토
- ExecutorV2 개선: dtype 매핑 자동화 (np.float16 → 'f16') → 테스트 코드 단순화
'dev_AI_framework' Related Articles