PyTorch 2.14의 @dynamic_spec으로 동적 shape를 compile·export에 한 번에 붙입니다 | DAKER 커뮤니티
한 줄 요약
PyTorch 2.14는 @dynamic_spec·ShapesSpec으로 가변 차원을 함수·모듈에 한 번 선언하면 torch.compile, torch.export, make_fx가 같은 스펙을 읽습니다. 호출마다 다른 방식으로 동적 shape를 넘기던 조건을 줄일 수 있습니다.
공식 2.14 릴리스 블로그의 Compilation and Export 절을 기준으로 정리합니다. API는 실험적이며 블로그에도 「API Unstable」로 표시되어 있습니다.
이전 재현 조건(왜 헷갈렸는지)
torch.export는 보통 호출부의dynamic_shapes딕셔너리를 썼습니다.torch.compile은 거친dynamic=플래그에 가깝게 동작했습니다.make_fx는 전역 트레이싱 모드에 의존하는 경우가 많았습니다.
같은 모델인데 진입점마다 선언 위치가 달라, 배치 크기만 바뀐 실험에서 재컴파일·가드 실패가 섞이기 쉬웠습니다.
2.14에서 바뀐 점
torch.fx.experimental.dynamic_spec아래ShapesSpec으로 차원 이름·범위·파생 차원·가정을 선언합니다. 예:ShapeVar("batch", min=2, max=128),batch % 2 == 0.@dynamic_spec을 함수나 모듈forward에 붙이면 호출부에 스펙을 다시 넘기지 않아도 됩니다.- 선언된 차원은 unbacked symbol로 취급되어, 트레이스 때 본 배치 크기로 조용히 특수화되지 않습니다.
성능·해결 시 주의
- shape에 의존하는 분기는 가드 재컴파일이 아니라 data-dependent 오류로 드러날 수 있습니다. 분기 조건을 텐서 shape에 두지 않았는지 먼저 확인하십시오.
make_fx는 블로그 기준tracing_mode="fake"에서만 지원이 제한적입니다.- 데코레이터와 호출부
dynamic_shapes=를 같이 쓰거나, 스펙과prefer_deferred_runtime_asserts_over_guards=True를 섞으면 오류가 납니다.