본문 바로가기

AI Compiler framework

emit - Layer 가 반드시 구현해야 하는 메서드 인터페이스

현재 구조는 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”