본문 바로가기

dev_AI_framework

operator mapping 전략 짜기 - string or int ?? 메모리 효율, 빠른 비교를 위해 int 위주 매핑 전략 사용하기

계산 그래프에서 연산자(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 등도 전부 이런 구조를 씀.