계산 그래프에서 연산자(operator)를 사전 정의할 때
- "matmul", "add", "relu" 같은 문자열(str) 로 두는 방식
- 0, 1, 2, … 같은 정수(int) 로 두고 매핑 테이블에서 찾아 쓰는 방식
두 가지 다 자주 쓰이는 패턴인데, 실제로는 성능, 유지보수성, 확장성 면에서 차이가 있어요.
🔎 1. 문자열(str) 방식
op = "matmul"
if op == "matmul":
...
장점
- 가독성: 코드만 봐도 어떤 연산자인지 직관적으로 알 수 있음.
- 디버깅 편리: 로그 찍거나 출력했을 때 바로 의미를 파악 가능.
- 확장성: 새로운 연산자 추가 시 그냥 "softmax" 같은 문자열만 정의하면 됨.
단점
- 성능 손해: 문자열 비교/해시는 정수 비교보다 느림 (특히 그래프 크기가 크고 수천~수만 노드 이상이면 미세한 overhead 발생).
- 메모리: 문자열 저장 시 int 보다 크기 큼.
- 오타 문제: "reluu" 같은 오타가 런타임까지 발견 안 될 수 있음.
🔎 2. 정수(int) + 매핑 방식
OP_MATMUL = 0
OP_ADD = 1
OP_RELU = 2
op_names = {0: "matmul", 1: "add", 2: "relu"}
장점
- 빠른 비교: int 는 CPU 레벨에서 즉시 비교 가능 → 대규모 그래프 순회 시 성능 이점 있음.
- 메모리 효율: int 는 4~8바이트면 충분.
- 타입 안정성: 사전에 정의된 enum/constant 를 쓰면 오타 방지됨.
단점
- 가독성 저하: 디버깅 시 0, 1, 2만 보면 의미 알기 어려움 → 별도 매핑 필요.
- 확장성 제약: 새로운 연산자 추가 시 enum/constant 정의를 반드시 바꿔야 함.
🔎 3. 중간 타협 (실제 프레임워크들)
대부분은 int 기반 enum + 문자열 매핑을 같이 둬요.
from enum import IntEnum
class OpType(IntEnum):
MATMUL = 0
ADD = 1
RELU = 2
op_names = {
OpType.MATMUL: "matmul",
OpType.ADD: "add",
OpType.RELU: "relu",
}
- 내부 실행기(Executor, CUDA 커널 호출)는 int (빠름, 효율적)
- 로그/디버깅/에러메시지는 str 매핑해서 보여줌
TensorFlow / PyTorch / ONNX 등도 전부 이런 구조를 씀.
'dev_AI_framework' 카테고리의 다른 글
| "CUDA" + "C++" + "pybind11" 모듈의 빌드 방법 및 과정, 체크리스트 확인 (0) | 2025.09.01 |
|---|---|
| AI 컴파일러의 구현 - graph_executor_v2 를 통해 (0) | 2025.09.01 |
| 폴더 및 파일 구조 변경 - Python 내 통제 방법으로 변경 예정 (2) | 2025.09.01 |
| AI 컴파일러의 정의와 Frame_work 내 사용 방법 고민 (1) | 2025.09.01 |
| cuda 내 연산 수행을 어떻게 하는게 이득일지 - 나눠서, 한 번에 (1) | 2025.09.01 |