PyTorch 2.x를 대표하는 기능
torch.compile(model)은 모델을 최적화된 융합 커널로 JIT 컴파일하는 한 줄짜리 변환이야. CUDA에서는 보통 1.5~3배 빨라지고 Transformer 계열 모델은 더 큰 이득을 보기도 해. 컴파일하지 않은 영역에서는 즉시 실행 모드의 디버깅 편의성을 그대로 유지한다는 점이 특히 좋아.
내부에서 일어나는 일
- TorchDynamo가 순전파의 Python 바이트코드를 가로채 연산을 FX 그래프로 포착해.
- AOTAutograd가 역전파 연산까지 포함하도록 그래프를 다시 써.
- TorchInductor가 그래프를 최적화된 Triton/CUDA 커널로 낮추고, CPU에서는 C++ 코드로 변환해.
첫 호출에서는 그래프를 만들고 컴파일해. 데이터에 따라 달라지는 제어 흐름이나 순전파 안의 사용자 정의 Python 객체처럼 Dynamo가 포착하지 못하는 코드가 나오면 그 구간만 즉시 실행으로 돌아가. 이를 '그래프 브레이크'라고 해. 컴파일 전체가 실패하는 건 아니지만 해당 구간의 속도 이득은 줄어들어.
세 가지 모드
- 기본값: 컴파일 시간과 실행 속도 사이의 균형이 좋아.
mode="reduce-overhead": 커널 실행 사이의 Python 추가 비용을 최소화해. 작은 모델이나 작은 배치에 잘 맞아.mode="max-autotune": 가장 빠른 실행을 찾으려고 여러 커널 변형을 철저히 시험해. 컴파일에는 몇 분이 걸릴 수도 있지만 실행 속도는 가장 빠를 수 있어.
그래프 브레이크를 만드는 것
if x.sum() > 0처럼 텐서 값에 따라 달라지는 제어 흐름. Python 정수나 설정값에 따른 분기는 보통 괜찮아.- 순전파 안에서 호출하는 일부 OpenCV나 PIL 연산처럼 추적할 수 없는 라이브러리 호출.
- Python 속성을 통해 텐서 값을 변경하는 코드.
- 일부 사용자 정의 autograd 함수. PyTorch 2.x에서 계속 개선되고 있어.