13P by neo 2일전 | ★ favorite | 댓글 1개
  • 이 글은 순수 Python 코드사전 컴파일(AOT) 하여 크로스 플랫폼 실행 파일로 바꾸려는 시도와 설계를 사례 중심으로 설명함
  • 핵심 아이디어는 JIT을 새로 만들거나 C++로 다시 쓰지 않고, 심볼릭 트레이싱→IR→C++ 코드 생성→다중 타깃 컴파일 파이프라인으로 최적화 커널을 산출하는 방식
  • PEP 484 타입 주석으로 타입 전파를 시드하고, AI 코드 생성으로 수백 개의 C++ 오퍼레이터를 자동 구현해 Numpy·OpenCV·PyTorch 등 폭넓은 라이브러리 호출을 커버함
  • 동일한 Python 함수에 대해 다양한 구현 경로를 대량 생성·배포하고 실측 텔레메트리가장 빠른 변종을 고르는 경험적 성능 최적화 전략을 채택
  • 목표는 컨테이너에 의존하지 않는 작고 빠른 이식 가능한 바이너리를 제공해 서버·데스크톱·모바일·웹까지 어디서나 실행하는 배포 단위로 삼는 것

Foreword

  • Python의 단순성과 생산성은 장점이나, 고부하 워크로드에서 성능·이식성 한계가 존재함
  • 게스트 필자인 Yusuf Olokoba의 이 글은 원본 Python 유지 상태에서 빠르고 휴대 가능한 실행 파일을 만드는 컴파일러 설계를 소개하는 것
  • JIT 추가나 전면 C++ 리라이트 없이 파이프라인을 구성해 커널 최적화를 달성하려는 접근임

Introduction

  • 목표는 수정 없는 Python완전 AOT로 컴파일해 인터프리터 없이 동작하며 C/C++에 가깝게 빠르고 모든 플랫폼에서 실행되게 하는 것
  • 기존 시도들(Jython, RustPython, Numba, PyTorch, Mojo 등)과 달리 언어·런타임 치환이 아닌 코드 변환과 커널 생성을 택함
  • 이 컴파일된 Python 함수들은 이미 매달 수천 대 장치에서 사용 중

Containers Are the Wrong Way to Distribute AI

  • 실무 배포에서 컨테이너는 과도한 페이로드(인터프리터·패키지·OS 스냅샷)를 동반해 시작 지연·이식성 제약을 야기함
  • 대안은 모델만 담은 자급자족 실행 파일로, 더 작고 빠른 시작서버·데스크톱·모바일·웹 전반의 실행 가능성 제공
  • 요지는 배포 단위를 OS 스냅샷이 아닌 자체 실행 바이너리로 전환하는 전략임

Arm64, Apple, and Unity: How It All Began

  • Apple의 arm64 전환 당시 Unity가 IL2CPP로 CIL을 C++로 변환해 모든 타깃에 컴파일 가능하게 한 사례를 벤치마킹
  • 동일한 발상을 Python에 적용어디서나 돌 수 있는 코드 경로를 확보하려는 비전 설정

Sketching Out a Python Compiler

  • 상위 설계는 Python 입력 → 심볼릭 트레이스(IR) → C++ 생성 → 멀티 타깃 컴파일 단계로 구성
  • IR에서 바로 오브젝트 코드로 가지 않고 C++을 중간 산출물로 택한 이유는 CUDA·MLX·TensorRT·AMX 등 가속 경로를 최대한 활용하기 위함
  • 목표는 하드웨어별 최적 경로를 끼워 넣기 쉬운 확장성 있는 설계 확보

Building a Symbolic Tracer for Python

  • 초기 PyTorch FX 기반 트레이싱은 실행 필요성PyTorch 연산 한정성 때문에 한계가 있었음
  • 대신 AST 파싱 기반 심볼릭 트레이서를 구축해 제어 흐름·호출 해석을 IR로 변환함
  • 현재 트레이서는 정적 분석, 부분 평가, 샌드박스 기반 라이브 값 관찰 등 기능을 제공함

Lowering to C++ via Type Propagation

  • Python의 동적 타이핑을 C++의 정적 타이핑으로 다리를 놓기 위해 타입 전파를 사용함
  • 입력 인자 타입이 주어지면 중간 변수 타입연산자 정의에 따라 결정적으로 추론 가능함
  • 각 Python 연산을 대응하는 C++ 구현으로 매핑하며 함수 전반에 타입을 전파

Seeding the Type Propagation Process

  • 타입 전파의 시드로 PEP 484 타입 주석을 사용함
  • 이는 원본 코드 비수정 원칙과 상충하지만, 간결한 인터페이스·호환성을 위해 허용 가능한 타협으로 판단함
  • 또한 함수 시그니처의 타입 수 제한 등 제약을 둬 간단한 소비 인터페이스를 보장함

Building a Library of C++ Operators

  • 모든 함수를 C++로 직접 구현하지 않고, 추적 불가한 리프 연산수기/자동 구현이 필요함
  • 다수의 Python 코드는 소수의 기본 연산 조합으로 구성되므로, 커버해야 할 오퍼레이터 집합은 상대적으로 작음
  • LLM 기반 코드 생성제한·테스트·조건부 컴파일 인프라Numpy·OpenCV·PyTorch수백 개 함수 구현을 자동화함

Performance Optimization via Exhaustive Search

  • 성능 최적화는 항상 경험적이라는 교훈에 따라, 여러 구현 변종을 전부 산출실측 비교로 최적을 선택함
  • 예: Apple Silicon에서 리사이즈만 해도 Accelerate, vImage, Core Image, Metal여러 경로를 생성하고 동일 기능의 다중 바이너리를 배포함
  • 세밀한 텔레메트리경로별 지연을 수집해 통계 모델가장 빠른 변종을 예측·선택함
  • 효과는 사용자 입장에서 시간이 지날수록 자동으로 빨라지는 실행 경험 제공임

Designing a User Interface for the Compiler

  • 개발자 경험을 학습 곡선 제로에 가깝게 하기 위해 PEP 318 데코레이터 @compile 을 인터페이스로 채택함
  • CLI는 데코레이터를 엔트리포인트로 삼아 의존 코드 그래프를 탐색하고 컴파일함
  • 데코레이터 인자로 tag·description·sandbox·metadata를 받아 환경 재현·백엔드 지정(ONNXRuntime, TensorRT, CoreML, IREE, QNN 등) 을 지원함

Closing Thoughts

  • 예외·람다·재귀·클래스 등은 부분 지원/미지원으로, 특히 복합 타입·고차 타입에서 타입 전파 확장이 필요함
  • 디버깅 경험은 최적화 컴파일로 심볼 정보가 줄어 추적 난이도가 높아지는 과제임
  • C++20std::span, concepts, coroutines가 핵심 기반이며, C++23std::generator, <stdfloat>, <stacktrace>스트리밍·half/bfloat16·예외 추적에 기여 예정임
  • 최종 목표는 컨테이너 없이 작은·빠른·안전한 실행 파일임베딩/감지 등 AI 워크로드어디서나 실행 가능한 배포 단위를 확립하는 것

APE 같은건줄 알았는데 그건 아니네요.