PyTorch 2.12의 CUDA 선형대수와 에이전트 워크로드 최적화
PyTorch 2.12의 CUDA linalg.eigh 가속, 동적 형상 컴파일, DeviceMesh와 하드웨어 지원 변화를 실무 관점에서 정리한다.
2026-08-14 · 최초 발행 2026-05-19
행렬 분해가 병목일 때 달라지는 실행 경로
PyTorch 2.12에는 수치 선형대수 연산의 GPU 가속과 새로운 하드웨어 백엔드 지원, 에이전트 기반 데이터 과학 워크로드를 위한 실행 최적화가 함께 들어갔다. 이 가운데 CUDA linalg.eigh 개선은 큰 행렬의 고유값 분해를 반복하는 과학 컴퓨팅과 머신러닝 파이프라인에 직접 영향을 준다. PyTorch Korea 커뮤니티에서도 실제 적용과 마이그레이션을 둘러싼 논의가 이어지고 있다.
torch.linalg.eigh는 에르미트(Hermitian) 행렬이나 대칭 행렬에서 고유값과 고유벡터를 구하는 연산이다. 주성분 분석(PCA), 스펙트럼 클러스터링, 그래프 신경망의 라플라시안 분해, 공분산 행렬 분석처럼 행렬 분해가 반복되는 작업에서는 이 연산이 병목이 되기 쉽다.
2.12 이전의 CUDA linalg.eigh는 cuSOLVER 라이브러리에 직접 의존했다. 배치 단위로 실행하면 커널 실행 오버헤드가 누적되는 구조였다. 2.12는 divide-and-conquer 알고리즘에 기반한 CUDA 커널을 추가하고, 행렬 크기에 따라 실행 경로를 나눈다.
벤치마크에서는 배치 크기 64, 행렬 크기 512×512 조건에서 기존보다 약 2.3배 높은 처리량이 확인됐다. 학습 루프 안에서 eigh를 계속 호출하는 워크로드일수록 이 차이가 누적된다.
bf16으로 넓어진 선형대수 연산
torch.linalg의 bf16 지원 범위도 확장됐다. fp32와 fp64만 완전히 지원하던 기존 경로에서 벗어나, bf16 행렬을 대상으로 Cholesky 분해와 LU 분해, 고유값 계산을 수행할 수 있다. 수치 안정성을 확보하기 위해 내부에서는 fp32로 업캐스트해 연산한 뒤 결과를 bf16으로 다운캐스트한다.
import torch
# 2.12 신규: bf16 배치 고유값 분해
A = torch.randn(64, 512, 512, dtype=torch.bfloat16, device='cuda')
A = A @ A.transpose(-1, -2) # 대칭 행렬 생성
# 자동으로 최적 커널 경로 선택
eigenvalues, eigenvectors = torch.linalg.eigh(A)
# 결과: eigenvalues shape [64, 512], eigenvectors shape [64, 512, 512]
bf16 경로는 fp32와 비교해 GPU 메모리 사용량을 약 40% 줄이면서, fp16보다 안정적인 수치 정밀도를 제공한다.
배치 선형대수 연산에서는 버퍼를 반복해서 할당하는 비용도 무시하기 어렵다. 2.12는 torch.linalg.solve_triangular와 torch.linalg.lu_solve 등에서 out= 파라미터를 이용한 in-place 연산 지원을 넓혔다. 미리 확보한 버퍼를 재사용하면 반복 학습 과정에서 생기는 GPU 메모리 파편화를 크게 줄일 수 있다.
반복 실험을 견디는 컴파일 구조
에이전트 데이터 과학은 LLM 에이전트가 모델 설계와 학습, 평가를 자율적으로 반복하는 방식이다. 같은 모델이 여러 차례 다시 컴파일되는 워크플로우이기 때문에, 입력 형상이 조금만 달라져도 재컴파일이 발생하는 구조는 실행 비용을 키운다.
2.12의 TorchDynamo는 동적 형상(Dynamic Shape) 처리를 개선했다. 배치 크기나 시퀀스 길이가 바뀔 때 발생하던 재컴파일 빈도를 낮추는 데 초점이 맞춰져 있다.
import torch
@torch.compile(dynamic=True) # 2.12: 동적 형상 추적 개선
def train_step(model, batch, labels):
output = model(batch)
loss = torch.nn.functional.cross_entropy(output, labels)
loss.backward()
return loss
# 서로 다른 배치 크기에서 재컴파일 없이 실행 가능
for batch_size in [16, 32, 64, 128]:
batch = torch.randn(batch_size, 768, device='cuda')
labels = torch.randint(0, 10, (batch_size,), device='cuda')
loss = train_step(model, batch, labels)
커뮤니티 보고에 따르면 dynamic=True 모드의 재컴파일 횟수는 2.11보다 약 60% 감소했다.
하이퍼파라미터 최적화(HPO)에서는 다수의 소형 모델을 동시에 학습하는 패턴이 흔하다. 2.12에는 torch.multiprocessing과 NCCL 백엔드 사이의 통신 오버헤드를 낮추는 개선도 포함됐다.
워커마다 같은 모델 아키텍처를 사용하면서 하이퍼파라미터만 바꾼다면 TorchCompile 캐시를 공유할 수 있다. 첫 컴파일을 마친 뒤 후속 워커가 그 캐시를 재사용하는 방식이며, 2.12에서는 공유 범위가 프로세스 간(inter-process)으로 확장됐다.
DeviceMesh로 조합하는 GPU 병렬화
멀티 노드 학습에서는 torch.distributed의 DeviceMesh API가 안정화됐다. 텐서 병렬(Tensor Parallel), 파이프라인 병렬(Pipeline Parallel), 데이터 병렬(Data Parallel)을 함께 사용하는 3D 병렬 구성을 선언적으로 표현할 수 있다.
from torch.distributed.device_mesh import init_device_mesh
# 2.12 안정화: 8 GPU를 2x4 메시로 구성
mesh = init_device_mesh("cuda", (2, 4), mesh_dim_names=("dp", "tp"))
# dp 차원: 데이터 병렬 (2개 복제본)
# tp 차원: 텐서 병렬 (4-way 분산)
이 API는 GPU 배치를 코드에 직접 풀어 쓰는 대신, 병렬 차원의 의미와 토폴로지를 메시로 기술하게 한다. 에이전트가 실험 구성을 반복해서 바꾸는 환경에서도 병렬화 구조를 일관된 형태로 유지할 수 있다.
넓어진 하드웨어 백엔드
PyTorch 2.12는 AMD ROCm 6.2, Intel Gaudi 2/3, AWS Trainium2에 대한 공식 지원을 강화했다. ROCm 경로에서는 torch.compile의 Triton 백엔드 안정성이 이전 버전보다 크게 개선됐다. Zyphra가 AMD GPU로 LLM을 학습하는 흐름과 맞물리면서 ROCm 생태계에 대한 PyTorch의 투자도 빨라지고 있다.
Intel Gaudi에서는 torch.nn.functional 연산 지원 범위가 80% 이상으로 확대됐다. 어텐션 관련 커널에는 HPU(Habana Processing Unit) 최적화가 포함됐다.
전체 생태계 변화는 학습 최적화와 하드웨어 지원, MLOps 연동으로 이어진다.
마이그레이션 전에 확인할 호환성 변화
2.12에서는 torch.compile의 기본 백엔드가 inductor로 완전히 전환됐다. eager 모드도 계속 지원하며, torch.compile을 사용하지 않는 기존 코드는 영향을 받지 않는다.
기존 코드베이스에서 확인해야 할 변경사항은 다음과 같다.
torch.fx.symbolic_trace의 일부 내부 API가 deprecated됐으며,torch.export로의 마이그레이션이 권장된다.torch.onnx.export는dynamo=True를 기본값으로 사용한다.- Python 3.8 지원이 공식 종료돼 3.9 이상이 필요하다.
기존 2.x 코드베이스는 대부분 호환되지만, torch.fx 내부 API를 사용했거나 Python 버전 요구사항에 걸리는 환경이라면 업그레이드 전에 점검해야 한다.
자동화 실험과 MLOps 연결 지점
PyTorch Korea 커뮤니티에서는 torch.compile의 동적 형상 처리와 linalg 최적화가 주요 논의 대상이다. 기업의 동적 배치 서빙 인프라에 torch.compile(dynamic=True)를 적용한 사례도 공유되고 있다.
MLflow, Weights & Biases, Kubeflow 연동에서는 torch.distributed.checkpoint의 비동기 저장 개선이 눈에 띈다. 대형 모델 체크포인트를 학습을 멈추지 않고 백그라운드에 저장할 수 있어, 에이전트 기반 자동화 실험의 장애 복구 구성을 단순화한다.
PyTorch 2.12의 변화는 특정 연산 하나의 가속에 머물지 않는다. CUDA linalg.eigh의 행렬 분해 경로, TorchDynamo의 동적 형상 처리, DeviceMesh 기반 병렬화가 연결되면서 반복 실험을 수행하는 실행 인프라가 강화됐다. AMD, Intel, AWS 하드웨어 지원 확대는 NVIDIA GPU 의존도를 낮추려는 업계 흐름과도 맞닿아 있다.
Sources
- https://pytorch.org/blog — PyTorch 2.12 공식 릴리스 노트
- https://pytorch.kr — PyTorch Korea 커뮤니티 논의
- https://github.com/pytorch/pytorch/releases/tag/v2.12.0 — GitHub 릴리스
- https://pytorch.org/docs/2.12/linalg.html — torch.linalg 문서
- https://pytorch.org/docs/2.12/torch.compile.html — torch.compile 문서
- https://pytorch.org/tutorials/intermediate/ddp_tutorial.html — 분산 학습 튜토리얼