현재 구조는 Layer 가 IR 을 발생시키는 함수로 설계
1. emit 의 정체
class Linear(Layer):
...
def emit(self, b, x: int) -> int:
...
- 어떤 클래스의 인스턴스도 아님
- IR 노드도 아님
- runtime 에서 호출되는 것도 아님
Graph/IR 을 만들 때 한 번 호출되는 빌드 타임 함수
2. 실제 호출 흐름
y = m.add(Linear(128, 256, name="fc1"), x)
->
layer = Linear(...)
layer._prefix = "fc1" # 이름 스코프 설정
y_vid = layer.emit(builder, x_vid)
- linear - layer 객체
- emit - 그 객체의 메서드 호출
- b.emit("gemm", ...)
- b.emit("bias_add", ...)
- IR op 들이 builder 내부 리스트에 append 됨
IR 은 emit 실행의 side effect 로 만들어진다.
3. emit 객체처럼 보인 이유
b.emit(
"gemm",
inputs=[x, W],
outputs=[y],
...
)
- linear.emit - Layer 메서드
- b.emit - Builder 의 메서드
- gemm - IR op kind
- IR Op - b.emit 호출 결과로 생성되는 데이터 구조
4. 실제 IR Op 가 언제 생성
b.emit(
"gemm",
inputs=[x, W],
outputs=[y],
...
)
위 코드가 실행될 때
op = Op(
kind="gemm",
inputs=[x, W],
outputs=[y],
attrs={...},
constraints={...},
hints={...},
)
self.ops.append(op)
빌더 내부에서의 사건
- Model 이 생성될 때 Builder 가 하나 만들어지고
- op / value 목록은 Builder 가 들고 있고
- Model 은 사용자 API + 전역 설정 + Builder 를 감싸는 껍데기
누가 무엇을 담당하는지
Builder ( 실제 IR 본체 )
- values : vid - Value
- ops : Op
- input_vids, output_vids, param_vids 같은 목록 / 인덱스
- emit, value, param 같은 IR append 함수
Builder = IR 컨테이너 + IR 생성 도구
Model (frontend)
- dtype, device 같은 전역 default
- m.input, m.add, m.output 같은 사용자 facing API
- 내부적으로 self.b 를 만들어 위임
Model = 사용자 DSL + 설정 + Builder wrapper
Model은 “사용자 인터페이스”, Builder는 “IR”
'AI Compiler framework' 카테고리의 다른 글
| compiler 의 분리와 optimize_ir 의 과정 추가 - 일단 훅만 구성 (0) | 2026.01.31 |
|---|---|
| CudaExecutor.run - IR 을 실제 텐서 계산으로 바꾸는 과정 (0) | 2026.01.31 |
| aicf_v2 현재 구조 정리 (0) | 2026.01.30 |
| StageC 현재 방식 확인 (0) | 2026.01.27 |
| 객체가 아닌 상태로서의 kernel 해석 - op attribute 구조를 끝까지 들고 가자 (0) | 2026.01.26 |