PyTorch 2.14에서 MPS index_add·conv3d가 네이티브 Metal로 옮겨가는 이유 | DAKER 커뮤니티
Mac에서 PyTorch를 돌릴 때 체감 성능은 큰 구조 변화보다도, 자주 호출되는 연산의 기동 지연에서 갈리는 경우가 많습니다. 이번 변화는 바로 그 지점을 겨냥합니다.
PyTorch 2.14에서는 MPS의 index_add, index_select, conv3d, argmin/argmax 등이 Apple MPSGraph 경로를 떠나 손으로 짠 Metal 커널로 옮겨갑니다. 연산마다 붙던 컴파일 비용을 덜고, 스레드와 메모리 접근을 직접 조율해 커널 기동 지연을 줄이는 것이 목표입니다.
PyTorch 2.14에서 MPS의 index_add, index_select, conv3d, argmin/argmax 등이 MPSGraph 대신 네이티브 Metal 경로로 이동합니다.
무엇이 달라지는가
핵심은 실행 경로의 변화입니다. 기존에는 Apple MPSGraph를 거치던 일부 연산이 이제 네이티브 Metal 커널로 처리됩니다. 이 변화는 특히 인덱싱, 3D 합성곱, 축소 연산이 많은 워크로드에서 의미가 있습니다.
MPSGraph는 편리한 경로이지만, 연산마다 컴파일 비용이 붙을 수 있습니다. 반면 네이티브 Metal 커널은 해당 비용을 줄이고, 실행 시 필요한 스레드 배치와 메모리 접근을 더 직접적으로 다룰 수 있습니다. 이번 변경의 목적도 여기에 있습니다.
지금 확인해 볼 만한 이유
같은 배치를 PyTorch 2.13과 2.14로 나눠 돌려 보면 차이를 비교하기 좋습니다. 특히 인덱싱·3D 합성곱·축소가 많은 스텝에서는 스텝 시간과 GPU 점유만 봐도 변화가 드러날 수 있습니다.
오늘 확인할 포인트는 Graph에서 Metal로 옮겨간 뒤 커널 기동이 얼마나 가벼워졌는가입니다.
참가자 노트에는 PyTorch 버전, 연산 목록, 스텝 시간 한 줄 정도만 남겨도 비교에 충분합니다.
재현해 볼 실험 조건
비교는 단순할수록 좋습니다. 작은 텐서로 index_add, index_select, conv3d 루프를 만들고 MPS에서 워밍업한 뒤 기준 시간을 적으면 됩니다. 이후 같은 스크립트를 PyTorch 2.14 또는 동일 패치가 포함된 빌드로 다시 실행해 스텝 시간과 예약 메모리를 비교하면 됩니다.
변화가 뚜렷하지 않다면 연산 혼합 비율만 바꿔 한 번 더 측정하는 것이 좋습니다. 다만 할당자 버킷 실험과 한 번에 섞지 않는 편이 낫습니다.
이전에 다룬 MPS 할당 버킷이나 시퀀스 길이 1 디코드와는 다른 축의 변화이기도 합니다. 이번에는 Graph→Metal 이전 효과만 분리해서 보는 것이 핵심입니다.
실무에서 볼 포인트
Apple Silicon에서 인덱싱·축소·3D 합성이 많은 워크로드라면, 우선 버전만 올려 비교해 보는 것이 좋습니다. 이때 할당자나 디코드 경로 실험과 변수를 섞지 말고, Metal 이전 효과만 따로 보는 편이 결과를 해석하기 쉽습니다.
또한 API가 아직 불안정할 수 있으므로 재현 노트에는 정확한 빌드 번호를 남겨 두는 것이 좋습니다.
관련 DAKER 학습
참고 자료
https://daker.ai/public/learning/tracks/pytorch-practice-advanced-track
https://daker.ai/community
Mac에서 MPS를 쓰고 있다면, 2.13과 2.14 사이에서 어떤 연산에서 가장 먼저 차이를 느끼셨는지 궁금합니다.