PyTorch 2.14에서 @dynamic_spec으로 가변 차원을 compile·export에 함께 선언하는 방법 | DAKER 커뮤니티

배치 크기나 시퀀스 길이가 바뀌는 모델을 다룰 때는, 같은 모델인데도 torch.compile과 torch.export에 서로 다른 동적 형상 설정을 따로 적게 되는 경우가 많습니다. 이 과정이 반복되면 선언이 조금씩 어긋나고, 실험 재현성도 함께 흔들리기 쉽습니다.
PyTorch 2.14의 @dynamic_spec과 ShapesSpec은 이런 불일치를 줄이는 데 초점을 둡니다. 가변으로 둘 차원을 함수나 모듈 옆에 한 번 선언해 두면, torch.compile과 torch.export가 같은 규칙을 읽습니다.
가변 배치·시퀀스 차원을 모델 옆에 한 번 선언해 두면 compile과 export가 같은 규칙을 따릅니다.
왜 호출부가 아니라 스펙에 모아 두는가
배치 크기가 바뀔 때마다 export용 dict와 compile용 플래그를 따로 맞추다 보면, 같은 모델을 두고도 선언이 흩어지기 쉽습니다. 이때 가변으로 둘 차원을 먼저 고르고, 그 이름을 스펙 한곳에만 적어 두면 호출부에서 다시 설명하지 않아도 됩니다.
원문에서 강조한 핵심은, 어느 축이 변하는지를 모델 옆에 남겨 두는지가 재현성을 가른다는 점입니다. 참가자나 협업자 입장에서도 형상 규칙을 코드 가까이에서 확인할 수 있다는 장점이 있습니다.
재현해 볼 실험 조건
비교 실험은 세 단계로 정리할 수 있습니다.
- 배치 차원에 최소·최대와 짝수 같은 가정을 둔
ShapesSpec을 만듭니다. - 같은 스펙을
@dynamic_spec으로 forward에 붙인 버전과, 호출부dynamic_shapes만 쓰는 버전을 준비합니다. - 둘 다 compile과 export로 넘긴 뒤, 배치를 바꿔 재컴파일·가드 차이를 비교합니다.
스펙으로 선언한 차원은 unbacked 심볼로 잡혀, 우연히 본 배치에 조용히 특화되지 않습니다. 대신 형상에 의존하는 분기는 데이터 의존 오류로 드러납니다.
스펙으로 선언한 차원은 우연히 본 배치에 조용히 특화되지 않고, 형상 의존 분기는 데이터 의존 오류로 드러납니다.
실무에서 바로 볼 포인트
실험이나 학습 노트를 정리할 때는 몇 가지 조건을 함께 묶어 두는 것이 좋습니다.
- 스펙과 호출부
dynamic_shapes를 동시에 넘기면 오류가 납니다. 한쪽만 고르면 됩니다. make_fx는tracing_mode가 fake일 때 지원 범위가 좁습니다. 실험 조건을 먼저 고정해 두는 편이 좋습니다.- 학습 노트에는 PyTorch 버전, 스펙에 넣은 차원 이름, min/max를 같이 적어두면 됩니다.
관련 DAKER 학습
참고 자료
https://daker.ai/public/learning/tracks/pytorch-practice-advanced-track
https://daker.ai/public/learning/materials/pytorch-advanced-2-embedding-self-attention-mini-i
여러분은 가변 차원 선언을 호출부에 두는 편인지, 모델 옆 스펙으로 모아 두는 편인지 궁금합니다.