본문 바로가기

dev_AI_framework

Graph Executor v2 (GE2) 개발 진행 기록

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') → 테스트 코드 단순화