본문 바로가기

dev_AI_framework

graph_executor 와 compiler 의 관계

📦compiler
 ┣ 📂ir
 ┃ ┣ 📂__pycache__
 ┃ ┃ ┗ 📜nodes.cpython-312.pyc
 ┃ ┗ 📜nodes.py
 ┣ 📂kernels
 ┃ ┣ 📂__pycache__
 ┃ ┃ ┣ 📜registry.cpython-312.pyc
 ┃ ┃ ┗ 📜selector.cpython-312.pyc
 ┃ ┣ 📜registry.py
 ┃ ┗ 📜selector.py
 ┣ 📂passes
 ┃ ┣ 📂__pycache__
 ┃ ┃ ┣ 📜canonicalize.cpython-312.pyc
 ┃ ┃ ┣ 📜fuse_elementwise.cpython-312.pyc
 ┃ ┃ ┗ 📜pass_manager.cpython-312.pyc
 ┃ ┣ 📜canonicalize.py
 ┃ ┣ 📜fuse_elementwise.py
 ┃ ┗ 📜pass_manager.py
 ┣ 📂runtime
 ┃ ┣ 📂__pycache__
 ┃ ┃ ┗ 📜executor.cpython-312.pyc
 ┃ ┗ 📜executor.py
 ┣ 📂__pycache__
 ┃ ┗ 📜__init__.cpython-312.pyc
 ┗ 📜__init__.py
📦graph_executor_v2
 ┣ 📂in
 ┣ 📂include
 ┃ ┗ 📜ge_v2_api.h
 ┣ 📂src
 ┃ ┣ 📜bindings_min_api.cpp
 ┃ ┣ 📜launch_table.cpp
 ┃ ┗ 📜my_kernels.cu
 ┣ 📂__pycache__
 ┃ ┗ 📜__init__.cpython-312.pyc
 ┣ 📜CMakeLists.txt
 ┣ 📜graph_executor_v2.cp312-win_amd64.pyd
 ┣ 📜pyproject.toml
 ┣ 📜README.md
 ┣ 📜smoke_test_v2.py
 ┗ 📜__init__.py

 

Graph_executor = 네이티브 실행기 (런타임 + 커널)

CUDA/C++ 로 작성된 커널 (src/my_kernels.cu) 과 런처 (src/launch_table.cpp), 그리고 이를 파이썬에서 호출하기 위한 바인딩 (src/bindings_min_api.cpp) 이 들어있는 파이썬 확장 모듈 프로젝트

build/ 는 CMake 가 생성한 빌드 산출물 폴더, 

 

compiler = 그래프 컴파일러(프론트엔드 + 최적화 패스)

파이썬 코드로 된 IR 표현 (ir/nodes.py), 커널 선택 로직 (kernels/selector.py, kernels/registry.py), 최적화 패스(passes/*.py), 그리고 파이썬 레벨의 실행기 (runtime/executor.py) 가 들어있음

이 컴파일러가 연산 그래프를 정리/퓨전하고, 어떤 네이티브 커널을 호출할지 결정한 뒤, 최종 실행 단계에서 graph_executor 모듈을 호출한다.

 

두 폴더의 관계 (데이터 호출 흐름)

  1. 모델/그래프 구성 : compiler.ir.nodes 로 연산 그래프를 만든다.
  2. 패스 적용(컴파일 단계) : compiler.passes.pass_manager 가 canonicalize, fuse_elementwise 등 최적화/변환을 수행한다. -> 커널 호출 단위가 정리된다.
  3. 커널 선택(타게팅) compiler.kernels.selector 가 레지스트리 정보를 바탕으로 어떤 op 가 graph_executor 의 어떤 커널/런치  엔트리로 매핑되는지 결정
  4. 실행 준비 (런타임 컨트랙트 충족) compiler.runtime.executor 가 텐서 포인터, 스트라이드, shape, grid/block 등 런처가  필요로 하는 인자 형식으로 패킹한다. 
  5. 네이티브 호출 : 파이썬에서 import graph_executor_v2 로 로딩된 pyd 에 바인딩된 함수를 호출, 내부에서 launch_table.cpp 가 op_id->실제 CUDA 커널 엔트리를 찾아 실행
  6. CUDA 커널이 결과를 쓰고,  파이썬 실행기가 다음 노드로 이어간다. 

 

즉, compiler 는 무엇을/어떻게 실행할지를 결정하는 쪽,  graph_executor 는 정해진 걸 진짜로 GPU에서 돌리는 쪽

 

폴더별 핵심 파일 역할(간단 안내)

  • graph_executor_v2/src/bindings_min_api.cpp
    pybind11 등으로 파이썬에 노출되는 함수 정의. 파이썬↔C++ ABI 경계.
  • graph_executor_v2/src/launch_table.cpp
    op/커널 ID→함수 포인터(또는 functor) 테이블. 런처가 여길 통해 커널 호출.
  • graph_executor_v2/src/my_kernels.cu
    실제 CUDA 커널들.
  • graph_executor_v2/include/ge_v2_api.h
    C++ 공개 헤더. 인자 구조체, enum, 함수 시그니처 등 런타임 컨트랙트의 기준.
  • graph_executor_v2/build/…
    CMake 탐침/컴파일 산출물(예: CMakeCUDACompilerId.*, *.obj, *.fatbin, rules.ninja, .ninja_log 등).
    → **VCS(깃)**에는 보통 제외합니다.
  • graph_executor_v2/graph_executor_v2.cp312-win_amd64.pyd
    파이썬에서 import graph_executor_v2로 로딩되는 네이티브 확장 모듈.
  • compiler/ir/nodes.py
    연산 그래프의 노드/엣지/속성 정의.
  • compiler/passes/*.py
    그래프 변환/최적화 규칙들(정규화, 엘리먼트와이즈 퓨전 등).
  • compiler/kernels/registry.py, selector.py
    op→백엔드 커널 매핑 정보/정책.
  • compiler/runtime/executor.py
    그래프 실행기(토폴로지 순서 실행, 메모리 준비, 네이티브 모듈 호출).

 

import 및 의존 방향

  • compiler ➜ (런타임 시) import graph_executor_v2
    (반대 방향 의존성은 없음: 네이티브 모듈은 컴파일러를 모르고, 계약(API)만 노출)
  • graph_executor_v2는 독립적으로 빌드/배포 가능한 모듈이며, 파이썬에서 바로 불러 쓸 수 있음.
    compiler는 그 모듈이 제공하는 API 시그니처에 맞춰 파라미터를 준비해서 호출.