[Triton] TRITON_INTERPRET 모드에서 언어 패치 자동 정리
PR 링크: triton-lang/triton#8735 상태: Merged | 변경: +72 / -50
들어가며
Triton의 인터프리터 모드(TRITON_INTERPRET=1)는 GPU 없이 커널을 CPU에서 실행한다. 이를 위해 triton.language의 여러 함수를 인터프리터 버전으로 **패치(monkey-patch)**하는데, 기존에는 패치 후 원래 상태로 복원하지 않아 이후의 정상 실행에 영향을 줄 수 있었다.
핵심 코드 분석
Before
def _patch_attr(obj, name, member, builder):
semantic = TritonSemantic(builder)
new_member = lambda *args, **kwargs: member(*args, _semantic=semantic, **kwargs)
setattr(obj, name, new_member)
setattr로 덮어쓰기만 하고 원본은 저장하지 않았다.
After
class _LangPatchScope:
def __init__(self):
self._changes: list[tuple[object, str, object]] = []
def set_attr(self, obj, name, value):
original = getattr(obj, name, None)
self._changes.append((obj, name, original))
setattr(obj, name, value)
def restore(self):
while self._changes:
obj, name, original = self._changes.pop()
setattr(obj, name, original)
_LangPatchScope가 모든 변경을 기록하고, restore()로 원래 값을 복원한다.
호출부
def _patch_lang(fn):
scope = _LangPatchScope()
# ... scope.set_attr(lang, "reduce", _new_reduce) 등 ...
return scope
# 사용
patch_scope = _patch_lang(self.fn)
try:
# 커널 실행
finally:
patch_scope.restore()
try-finally로 예외 발생 시에도 반드시 복원된다.
왜 이게 좋은가
- 부작용 제거: 인터프리터 실행 후에도
triton.language가 원래 상태로 복원됨 - 테스트 격리: 같은 프로세스에서 인터프리터와 GPU 실행을 번갈아 할 수 있음
- 예외 안전성:
try-finally패턴으로 어떤 상황에서도 정리가 보장됨
정리
Monkey-patching은 강력하지만 위험한 기법이다. 패치한 것은 반드시 되돌려야 하며, 이를 scope 기반으로 관리하는 것은 Python에서 흔히 사용되는 안전한 패턴이다. Context manager와 유사한 이 접근법은 리소스 정리가 필요한 모든 상황에 적용할 수 있다.
참고 자료
이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석 내용은 실제 PR diff를 기반으로 합니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [pydantic-ai] FastMCPToolset Temporal 통합 — MCP 툴셋 공통 추상화
- 현재글 : [Triton] TRITON_INTERPRET 모드에서 언어 패치 자동 정리
- 다음글 [triton] AMD: LLVM 백엔드에 커스텀 스케줄러 옵션 추가로 메모리 바운드 커널 최적화
댓글