본문 바로가기

dev_AI_framework

AI Compiler, Graph Executor 로드

1) Executor 연동(e2e 실행) - 완료

  • 목표: IR → Pass → 커널 선택 → f16 Lt 커널 호출까지 파이프라인 연결
  • 수정 파일
    • compiler/runtime/executor.py
      • _prepare_buffers()에서 GEMM op의 MNK/act/bias 유무를 Params로 생성하여 bufs 마지막에 추가 (이미 골격 있음)
      • CuPy/Torch 텐서에서 device_ptr 추출 경로 점검
  • 검증
    • 간단 IR로 GEMM_BIAS_ACT 1개짜리 그래프 만들어 ExecutorV2(dry_run=False) 호출 → f16 커널이 선택되고 값이 맞는지 비교

2025.09.03 - [dev_AI_framework] - 📄 문서: e2e f16 GEMM + Bias + ReLU 테스트 동작 과정


2) 벤치마크/프로파일링(성능 베이스라인 만들기)

  • 목표: f32 스텁 vs f16 Lt 성능/정확도 베이스라인 확보
  • 추가 파일
    • bench/bench_gemm.py (신규)
      • 다양한 (M,N,K) 입력에 대해 시간/오차 수집, 반복 warmup 포함
  • 도구
    • CUDA 이벤트로 시간 측정(+ CuPy의 cp.cuda.Event)
    • Nsight Systems/Compute는 선택
  • 검증
    • 오차 분포(평균/최대)와 처리량(GFLOPS) 출력

3) Autotune(알고리즘/워크스페이스 탐색 캐시)

  • 목표: cuBLASLt의 heuristic을 (WS 크기, Algo ID)로 탐색 후 (M,N,K) 버킷별 캐시
  • 수정 파일
    • src/my_kernels.cu
      • ge2_launch_gemm_bias_act_tc_f16 안에서 (M,N,K,arch) 키로 std::unordered_map 캐시 보유
    • 필요 시 작은 WS 풀(cudaMalloc/Free 오버헤드 줄이기)
  • 검증
    • 동일 크기 반복 호출 시 첫 호출 대비 재호출 시간이 줄어드는지

4) Bias+Act 완전 Fuse(선택 성능 최적화)

  • 목표: 후처리를 cuBLASLt로 흡수
  • 접근 옵션
    1. 전치 트릭: Dᵀ = Bᵀ @ Aᵀ 형태로 계산해 bias(N) 를 “행-bias”로 맞춘 뒤 필요 시 레이아웃 복구
    2. CUTLASS: Column-bias + 활성화 Epilogue Visitor로 한 번에 해결
  • 수정 파일
    • (옵션1) 전치 트릭: src/my_kernels.cu (A/B/D 레이아웃/ld, TRANS 설정, 임시 버퍼 관리)
    • (옵션2) CUTLASS 도입: CMakeLists.txt(서브모듈/FetchContent), src/my_kernels_cutlass.cu(신규), src/launch_table.cpp 등록
  • 검증
    • 현재 후처리 대비 성능 이득 확인, 오차 동일성 확인

5) 기능 커버리지 확장

  • GELU:
    • Params.act에 2 매핑 → 후처리 커널에서 t * 0.5f * (1.f + erf(t/√2)) 적용
    • 수정: src/my_kernels.cu (add_bias_relu_fp16 → add_bias_act_fp16) 이름/로직 확장
  • Batched GEMM:
    • Params에 batch와 strideA/B/D 추가 (또는 descs에서 stride 사용)
    • cuBLASLt의 batched matmul 사용
  • Strided/Non-contiguous:
    • executor.py에서 descs에 stride 채워 넣고, 네이티브에서 ld/stride 반영

6) 안정성/에러 핸들링 강화를 위한 ABI 보강

  • 목표: 에러 원인 가시화 + 호환성 체크
  • 수정 파일
    • include/ge_v2_api.h
      • GE2_API_VERSION를 2로 올리고, 에러코드 enum 문서화
    • src/bindings_min_api.cpp
      • 예외 메시지에 CUDA/cuBLASLt status 문자열 포함
    • compiler/runtime/executor.py
      • GE2_API_VERSION 읽어 경고/에러 출력
  • 검증
    • 의도적으로 잘못된 파라미터 전달 시 명확한 메시지 표출

7) 선택 로직 강화(selector)

  • 목표: f16 Lt가 맞지 않을 때 f32로 자동 폴백, 또는 특정 범위에서 f32가 더 빠르면 f32 선택
  • 수정 파일
    • compiler/kernels/selector.py
      • _score_by_rules()에 (M,N,K) 임계값, dtype 가중치, 장치 capability 반영
    • src/launch_table.cpp
      • capability 점수 미세 조정
  • 검증
    • 작은 K, 매우 비정형 크기 등에서 f32가 선택되는지

8) 테스트/CI

  • 목표: 회귀 방지
  • 추가 파일
    • tests/test_gemm_bias_act.py (pytest)
      • 무작위 (M,N,K) 여러 케이스, (has_bias, act) 조합, dtype 조합
  • CI 스텝
    • 빌드 → 스모크(py) → 선택 일부 사이즈의 정밀/성능 체크(간단)

9) 문서/샘플

  • 목표: 사용성을 높이고 유지보수 맥락 제공
  • 추가/수정
    • docs/feature_fp16_lt.md: 내부 구조/제약/튜닝 포인트 정리
    • examples/01_gemm_fp16.ipynb: 간단 사용 예제 (CuPy/Torch)