PyTorch 2.12 소개
PyTorch팀이 새로운 릴리즈인 PyTorch 2.12 를 공식 발표했습니다. 이번 릴리즈는 PyTorch 2.11 이후 누적된 457명의 기여자가 보낸 2,926개의 커밋이 반영된 결과물로, PyTorch가 연구 중심 프레임워크에서 하드웨어에 구애받지 않는(hardware-agnostic) 대규모 학습 및 추론용 통합 플랫폼으로 진화하는 흐름을 이어갑니다.
2.x 시리즈를 따라 PyTorch는 백엔드를 가로지르는 성능 프리미티브를 다듬어 왔습니다. PyTorch 2.10에서는 백엔드 간 성능 프리미티브와 TorchScript의 공식 폐기(deprecation)가 정리되었고, PyTorch 2.11에서는 분산 학습을 위한 미분 가능 collective(differentiable collectives), 차세대 GPU에서의 FlashAttention-4, 더 넓어진 export 커버리지가 추가되었습니다. PyTorch 2.12는 이 방향성을 그대로 이어받아, 디바이스에 종속되지 않는 그래프 캡처 API(torch.accelerator.Graph), 최대 100배 빨라진 배치 고유값 분해, 그리고 Microscaling(MX) 양자화 포맷의 torch.export 지원을 핵심 축으로 내세웠습니다.
요약하면, 이번 릴리즈는 "더 빠르게, 더 다양한 하드웨어에서, 더 적극적인 양자화 모델까지" 라는 표어로 정리됩니다. 아래에서는 성능, 컴파일/내보내기(export), 분산 학습, 그리고 CUDA · ROCm · MPS · XPU 등 플랫폼별 변화와 주요 폐기/호환성 변화를 차례로 살펴봅니다.
2.12의 핵심 변경사항 요약
linalg.eigh최대 100배 가속: CUDA에서 배치 고유값 분해가 cuSolver의syevj_batched경로로 전환되며 CuPy와의 성능 격차를 해소했습니다.torch.accelerator.Graph신규 API: CUDA, XPU 및 out-of-tree 백엔드에 걸쳐 그래프 캡처와 재생을 단일 인터페이스로 통합했습니다.- MX 양자화 포맷의
torch.export지원:float8_e8m0fnudtype 직렬화가 가능해져 MXFP4/MXFP6/MXFP8 모델을 그대로 export할 수 있습니다. - Adagrad
fused=True: Adam, AdamW, SGD에 이어 Adagrad도 단일 CUDA 커널로 옵티마이저 스텝을 수행합니다. torch.cond× CUDA Graphs: 데이터 의존적 분기를 CPU 동기화 없이 GPU 안에서 캡처/재생할 수 있게 되었습니다.- ROCm 대거 강화: Expandable segments, rocSHMEM 대칭 메모리 collective, FlexAttention 파이프라이닝이 새로 추가되었습니다.
성능 개선
CUDA linalg.eigh 배치 고유값 분해 최대 100배 가속
CUDA에서 torch.linalg.eigh의 백엔드 선택 로직이 새롭게 정비되었습니다. 기존의 MAGMA 백엔드는 폐기 처리되고 cuSolver로 전환되었으며, dispatch 휴리스틱이 cuSolver의 syevj_batched 커널을 무조건적으로 사용하도록 개선되었습니다. 배치된 대칭/Hermitian 고유값 문제에 대해 이전 릴리즈 대비 최대 100배의 속도 향상이 보고되었고, 그동안 CuPy 대비 뒤처져 있던 성능 격차가 해소되었습니다.
이 변화 덕분에 이전에는 행렬마다 개별 dispatch가 발생하여 수 분이 걸리던 워크로드가 수 초 만에 완료됩니다. 작거나 중간 규모의 행렬 다수를 한 번의 GPU 연산으로 처리하는 syevj_batched 커널 특성상, 배치된 행렬의 고유값 분해에 의존하는 과학 계산이나 머신러닝 워크로드(공분산 분석, 양자 화학, SO(3) Equivariant Network 등)에서 특히 큰 효과를 볼 수 있습니다.
Fused Adagrad 옵티마이저
torch.optim.Adagrad가 fused=True 옵션을 지원합니다. 옵티마이저 스텝 전체를 별도의 커널들로 분리해 실행하던 기존 방식 대신, 단일 CUDA 커널 안에서 처리하여 커널 런치 오버헤드와 메모리 트래픽을 줄입니다. 이로써 Adagrad는 Adam, AdamW, SGD에 이어 fused 변형을 제공하는 옵티마이저 대열에 합류했습니다.
컴파일과 export, 그리고 하드웨어 친화적 확장
torch.accelerator.Graph: 디바이스 독립적 그래프 캡처 API
가장 눈에 띄는 신규 API는 torch.accelerator.Graph입니다. 기존에는 torch.cuda.CUDAGraph, torch.xpu.XPUGraph처럼 백엔드별로 분기된 API를 사용해야 했지만, 이제는 디바이스에 구애받지 않는 단일 추상화로 그래프 캡처와 재생을 다룰 수 있습니다. 각 백엔드는 가벼운 GraphImplInterface를 통해 자체 구현을 등록할 수 있어 백엔드의 자율성을 유지하면서도 사용자 측 API는 일관되게 가져갑니다.
또한 c10::Stream과 torch.Stream에 is_capturing() 메서드가 노출되어, 디바이스별 is_current_stream_capturing 함수를 백엔드 중립적인 대체 API로 대체했습니다. Stream 컨텍스트 매니저의 재진입(reentrance) 버그도 함께 수정되었습니다. 초기 구현은 Intel XPU 백엔드를 정식 지원하며, PrivateUse1 디바이스를 통해 out-of-tree 백엔드도 동일한 인터페이스로 확장할 수 있습니다.
torch.export의 Microscaling(MX) 양자화 포맷 지원
torch.export는 PyTorch 모델을 배포 환경으로 내보내는 표준 경로로 자리잡고 있습니다. 하지만 그동안 Microscaling(MX) 양자화 포맷을 사용하는 모델은 export가 불가능했습니다. MX 포맷(MXFP4, MXFP6, MXFP8)이 블록 단위 지수(scale exponent)로 사용하는 float8_e8m0fnu dtype을 torch.export.save가 직렬화하지 못했기 때문입니다.
PyTorch 2.12에서는 torch.export.save와 torch.export.load가 해당 dtype을 정확히 직렬화/역직렬화하도록 개선되어, 공격적인 양자화를 적용한 LLM 등을 export부터 배포까지 한 흐름으로 끌고 갈 수 있게 되었습니다. 비용에 민감한 클라우드 추론이나 엣지 환경에서 Microscaling 양자화를 활용해야 하는 팀에 특히 유의미한 변화입니다.
torch.cond 제어 흐름의 CUDA Graphs 캡처
torch.cond로 작성한 데이터 의존적 분기 로직이 이제 CUDA Graphs의 일부로 캡처되고 재생됩니다. 이전에는 분기 평가가 CPU에서 이루어졌기 때문에 CUDA Graph 트리(fallback)에 의존해야 했지만, CUDA 12.4에서 도입된 conditional IF 노드를 활용하여 torch.cond의 두 분기를 단일 그래프 캡처 안에서 GPU만으로 평가합니다.
현재는 eager 및 cudagraphs 백엔드에서 동작하며, Inductor 백엔드 지원은 후속 릴리즈에서 추가될 예정입니다.
XPU에서의 FMA 기반 addcdiv 로워링
Inductor가 addcdiv 연산을 fused multiply-add(FMA) 명령으로 로워링하도록 바뀌었습니다. addcdiv는 result = input + value * (tensor1 / tensor2) 형태의 fused 연산으로, Adam/AdamW/RMSprop 같은 옵티마이저 업데이트의 핵심에 위치합니다. 이전에는 곱셈과 나눗셈을 별도 명령으로 로워링해 eager 모드와 미세한 부동소수점 차이가 누적되었지만, 이제 NVIDIA·Intel GPU 모두에서 eager CUDA 실행과 비트 단위로 동일한 결과를 보장하면서 Triton 커널 fusion 이점도 그대로 가져갈 수 있습니다.
분산 학습(Distributed Training)
Custom op에서 ProcessGroup 직접 사용
이전에는 커스텀 operator에 ProcessGroup을 전달하려면 문자열 그룹명으로 변환해 글로벌 레지스트리에서 조회해야 했습니다. 2.12부터는 all_reduce, reduce_scatter 등 c10d functional collective op들이 ProcessGroup 객체를 인자로 직접 받습니다. 문자열과 객체 두 가지 형태를 모두 허용하므로 기존 코드와의 호환성도 유지됩니다.
멀티 GPU/멀티 노드 프로파일링 강화
PyTorch Profiler의 Events API가 flow ID, flow type, activity type, 미완료 이벤트, Python 함수 이벤트를 노출하여, Chrome trace JSON 출력과 동등한 수준의 프로그램 가능한 후처리 분석이 가능해졌습니다. 또한 NCCL collective trace를 새로운 seq_num 필드로 rank 간 교차 참조할 수 있어, 동일한 프로세스 그룹에서 같은 collective에 참여하는 모든 rank가 동일한 시퀀스 번호를 공유합니다. 분산 학습 디버깅 도구로서 의미 있는 진전입니다.
FlightRecorder의 ncclx + gloo 백엔드 지원
FlightRecorder의 trace 분석기가 기존 nccl/xccl 외에 ncclx와 gloo 백엔드까지 지원합니다. 또한 torchcomms의 all_gather_single, reduce_scatter_v, barrier 등의 operation도 인식하며, 여러 프로세스 그룹이 동시에 FlightRecorder 싱글톤에 접근할 때 발생하던 무한 루프 race condition도 함께 수정되었습니다.
플랫폼별 업데이트
CUDA
CUDA Graph 커널 어노테이션: torch.cuda.graph가 enable_annotations kwarg를 새로 받습니다. 캡처된 CUDA 그래프 안의 개별 커널에 collective op 이름, 프로세스 그룹, 메시지 크기 같은 메타데이터를 주입하고, 동봉된 후처리 스크립트(python -m torch.cuda._annotate_cuda_graph_trace)로 trace에 병합합니다. Perfetto나 Chrome 프로파일러에서 재생된 그래프의 각 커널이 무엇을 수행하는지 훨씬 명확하게 확인할 수 있습니다.
CUDA Green Context workqueue 한도: CUDA Green Contexts에 workqueue 한도를 지정할 수 있어, 동일한 green context 내 동시 작업 제출 개수를 제약함으로써 동시 워크로드 간의 GPU 자원 분할을 더 예측 가능하게 만들 수 있습니다(실험적 기능).
ROCm
AMD ROCm 사용자에게는 이번 릴리즈가 특히 풍성합니다.
- Expandable segments: ROCm 7.02 이상에서 PyTorch caching allocator가 가상 메모리 API를 활용해 동적으로 할당 영역을 확장할 수 있게 되어, 기존 CUDA의 메모리 단편화 완화 기능을 ROCm에서도 사용할 수 있습니다.
- rocSHMEM 지원: NVSHMEM 기반의 GPU 내장 통신 프리미티브(
torch.ops.symm_mem.*)가 rocSHMEM으로 포팅되어, point-to-point, broadcast, all-to-all 및 MoE 모델용 2D AllToAllv 연산을 AMD GPU에서도 사용할 수 있습니다. - hipSPARSELt와 FP8 semi-structured sparsity: ROCm 7.12 이상에서 hipSPARSELt가 기본 활성화되어, 2:4 semi-structured sparsity 지원이 AMD GPU로 확장되었습니다. MI350X(gfx950)에서는 FP8(
float8_e4m3fn) 입력에 대해 FP32 출력으로 가속하는 경로도 추가되어, 기존 CUDA 전용이던torch._cslt_sparse_mm가속 경로를 AMD에서도 사용할 수 있습니다. - Inductor FlexAttention 파이프라이닝: FlexAttention이 ROCm Triton 백엔드에서 2단계 파이프라이닝(
num_stages=2)을 사용하도록 변경되어, MI350X에서 causal · alibi · sliding window 등 다양한 attention 패턴에 대해 5~26%의 성능 향상이 보고되었습니다.
Apple MPS
Metal-4 사전 컴파일 셰이더: Apple Silicon용 바이너리 wheel이 macOS 26 기반의 metal-4 표준으로 사전 컴파일(AOT)된 Metal 셰이더를 포함합니다. 첫 실행 시 발생하던 런타임 셰이더 컴파일 오버헤드가 사라져 MPS 워크로드의 시작 지연이 크게 줄어듭니다. 동반 API(torch._C._mps_loadMetalllib)도 추가되어 사전 컴파일된 .metallib blob을 직접 로딩할 수 있는데, 이는 Triton의 Apple MPS 백엔드의 compile-time metallib 워크플로우를 뒷받침합니다.
MPS 통합 메모리(Unified Memory): 이제 모든 MPS 텐서가 통합 메모리에 할당됩니다. 명시적 복사 없이 CPU가 MPS 텐서 데이터에 접근할 수 있어 메모리 관리가 단순해졌지만, 디바이스 전용 메모리 배치에 의존하던 코드는 성능 특성이 달라질 수 있습니다.
또한 MPS에서 linalg_qr, cholesky_solve, index_reduce, mvlgamma, nonzero_static, torch.distributions.Gamma(forward/backward) 등이 새롭게 지원되어 Apple Silicon에서의 PyTorch 활용 범위가 한 단계 더 넓어졌습니다.
XPU
Intel XPU 백엔드는 torch.accelerator.Graph의 1차 지원 대상으로서 가장 풍부한 기능을 제공합니다. torch.xpu의 디바이스 속성에 memory_clock_rate와 memory_bus_width가 추가되어 메모리 대역폭 기반 성능 튜닝이 더 쉬워졌습니다.
폐기(Deprecations) 및 호환성 변경 사항
torchcomms 도입과 ProcessGroup 변경 예고 (2.13+)
PyTorch Distributed 팀은 torchcomms를 PyTorch Distributed에 직접 통합하는 작업을 진행 중이며, 2.13 이후 릴리즈에서는 torchcomms를 기본값으로 사용할 예정입니다. 이번 2.12에서는 backend wrapper 리팩토링과 FlightRecorder 통합 같은 기반 작업이 포함되었습니다. 주요 변경 예고:
- Eager 초기화: 모든 ProcessGroup/communicator는
dist.init_process_group단계에서 즉시 초기화되어야 하며, 단일 백엔드 디바이스만 지원합니다. - P2P 작업: 각 ProcessGroup/communicator가 내부 communicator와 1:1로 매칭되며, 같은 group/stream에서 발행된 P2P 작업의 동시 실행이 보장되지 않습니다. 동시 P2P가 필요하면 batch API 또는 별도의 group/communicator를 사용해야 합니다.
- torchcomms 의존성: torchcomms가 PyTorch Distributed의 필수 패키지가 되며, 기존
c10d::Backends는 폐기됩니다.
지금 미리 활용해 보려면 다음과 같이 사용할 수 있습니다:
pip install torchcomms
export TORCH_DISTRIBUTED_USE_TORCHCOMMS=1
TorchScript 공식 폐기 유지
TorchScript는 2.10에서 폐기 처리되었으며, 2.12에서도 동일하게 유지됩니다. jit.trace/jit.script는 torch.export로, 임베디드 런타임은 ExecuTorch로 마이그레이션해야 합니다.
CUDA 12.8 wheel 폐기
2.12부터 CUDA 12.8 바이너리 wheel은 더 이상 표준 배포 매트릭스에서 발행되지 않습니다. 기본 wheel은 여전히 CUDA 13.0(pip install torch)이며, 실험적 빌드로 CUDA 13.2 가 새로 추가되었습니다. Pascal/Volta 등 구형 아키텍처 사용자는 CUDA 12.6 wheel을, Blackwell 같은 신형 GPU 사용자는 CUDA 13.0 이상 wheel을 사용해야 하며 후자는 NVIDIA 드라이버 업그레이드(Linux 580.65.06 / Windows 580.88)가 필요합니다.
# 기본 (CUDA 13.0)
pip install torch
# 명시적으로 CUDA 13.0
pip install torch --index-url https://download.pytorch.org/whl/cu130
# 구형 드라이버용 fallback
pip install torch --index-url https://download.pytorch.org/whl/cu126
기타 주요 호환성 변경
torch.distributed.nn.functional:torch.compile내부에서 호출 시 이제RuntimeError가 발생합니다.torch.distributed._functional_collectivesAPI로 마이그레이션해야 합니다.torchrun기본 포트 변경: 단일 노드 학습에서--master-port나--standalone을 지정하지 않으면 OS가 할당한 free port를 사용합니다. 기존의 29500 포트 충돌로 인한 "Address already in use" 오류가 해소됩니다.- CUDA 빌드 최소 버전 상향: 소스 빌드 최소 요구 사항이 CUDA 12.6으로 올라갔으며, CMake는 C++20 이상을 강제합니다.
- Inductor
max_autotune레이아웃 동결: 2.11에서 도입된 deferred layout freezing이 기본값에서 제외되고, opt-in(TORCHINDUCTOR_MAX_AUTOTUNE_DEFER_LAYOUT_FREEZING=1)으로 전환되었습니다. torch.compile(fullgraph=True)경고 추가: 컴파일된 코드가 실제로 실행되지 않는 경우(예: 사용자 정의TorchDispatchMode활성화) 2.12에서는 경고가 출력되며, 2.13에서는 에러로 격상됩니다.- FSDP2 hooks의 fullgraph 컴파일 불가: FSDP2 hook을 graph break 없이 컴파일하는 경로가 더 이상 지원되지 않습니다.
fullgraph=False로 변경하거나, FSDP 적용 전에 컴파일하도록 코드를 조정해야 합니다.
라이브 Q&A 안내
PyTorch 팀은 2026년 5월 20일(수) 오전 10시(PST)에 PyTorch 2.12 라이브 Q&A 세션을 진행합니다. Joe Spisak, Andrey Talman, Alban Desmaison이 패널로, Chris Gottbrath가 모더레이터로 참여합니다. 사전 등록은 아래 공식 페이지에서 가능합니다:
마치며
PyTorch 2.12는 화려한 하나의 기능을 내세우기보다, 백엔드 간 격차를 좁히고(torch.accelerator.Graph, FMA addcdiv), 양산형 모델 배포 경로를 정비하고(MX 양자화 export, torch.cond × CUDA Graphs), 분산 환경의 디버깅 가능성을 끌어올린(seq_num, FlightRecorder, ProcessGroup custom op) 누적형 릴리즈에 가깝습니다. ROCm 사용자는 expandable segments와 rocSHMEM, FlexAttention 파이프라이닝까지 한 번에 받게 되어 NVIDIA 진영과의 간극이 한 단계 더 좁혀졌고, MPS 사용자는 Metal-4 사전 컴파일 셰이더와 통합 메모리 정리로 시작 지연과 코드 단순성 모두에서 이득을 봅니다.
2.13 이후를 내다보면, torchcomms 기본 도입과 그에 따른 ProcessGroup 동작 변경이 가장 큰 화두입니다. 분산 학습 코드를 운영 중인 팀이라면 2.12 동안 미리 TORCH_DISTRIBUTED_USE_TORCHCOMMS=1로 검증을 시작해 두는 것이 권장됩니다.
PyTorch 2.12 Release Blog
PyTorch 2.12.0 Release Notes
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()
