PyTorch 2.14에서 torch.compile로 복소 텐서 경로를 시험해 볼 때 볼 점 | DAKER 커뮤니티
복소 텐서를 쓰는 신호 처리나 복소 신경망 작업은 그동안 eager 실행에 머무는 경우가 많았습니다. PyTorch 2.14에서는 torch.compile이 복소 텐서 프로그램을 실험적으로 받을 수 있게 되면서, 이런 경로도 컴파일 실행에 올려 볼 여지가 생겼습니다.
다만 지금 단계에서 중요한 것은 전부 되는지 단정하는 일이 아니라, 어떤 복소 연산까지 실제로 통과하는지 차분히 확인하는 일입니다. 지원되는 복소 연산은 실수 연산으로 분해되어 컴파일러 백엔드가 최적화할 수 있지만, 아직 모든 복소 연산이 지원되지는 않습니다.
PyTorch 2.14에서 torch.compile이 복소 텐서 프로그램을 실험적으로 받습니다.
복소 텐서가 컴파일 경로에 들어간다는 의미
이번 변화의 핵심은 복소 연산이 그대로 닫힌 세계로 처리된다는 뜻보다는, 지원되는 연산이 실수 연산으로 분해되어 컴파일러 백엔드가 다룰 수 있게 된다는 점에 있습니다. 그래서 복소 FFT, 필터, 복소 가중치 층처럼 복소 경로가 있는 워크로드도 일부는 컴파일 실행으로 옮겨 볼 수 있습니다.
반대로 말하면, 복소 워크로드 전체를 한 번에 감싸기보다 작은 부분 그래프부터 확인하는 접근이 더 현실적입니다. eager에서만 돌리던 코드를 바로 전부 컴파일하기보다, 지원이 기대되는 연산만 남긴 함수부터 시험해 보는 것이 좋습니다.
재현할 때는 작은 그래프부터 보는 것이 좋습니다
실험은 단순할수록 결과를 해석하기 쉽습니다. 작은 복소 텐서 입력을 두고, 기본 산술과 간단한 변환만 포함한 함수를 먼저 만든 뒤 같은 함수를 eager와 torch.compile로 각각 실행해 보면 됩니다. 이때 출력의 dtype과 shape가 맞는지 함께 확인하는 것이 좋습니다.
지원되지 않는 연산이 있으면, 어디에서 막혔는지 한 줄로 기록해 두는 편이 재현에 도움이 됩니다. 그 연산을 빼거나 eager로 남긴 뒤 다시 컴파일해 보면, 어느 지점까지는 통과하는지 경계를 더 분명하게 볼 수 있습니다.
전부 된다보다 어느 연산까지 통과하는지가 재현에 도움이 됩니다.
이번 확인 범위와 구분해서 볼 점
이 글에서 보는 축은 복소 텐서가 컴파일 경로에 들어가는지 여부입니다. 동적 shape 선언(@dynamic_spec)이나 AOTInductor 상수 공유와는 다른 주제이므로, 한 번에 여러 변수를 섞지 않는 편이 좋습니다.
실험이 끝나면 버전, 사용한 복소 연산 목록, 성공과 실패 여부를 함께 남겨 두면 이후 비교가 쉬워집니다. 실수 전용 모델 컴파일 실험과 섞기보다, 이번에는 복소 경로만 따로 확인하는 편이 결과를 읽기 좋게 만듭니다.
실무에서 바로 볼 포인트
복소 워크로드는 작은 부분 그래프부터 컴파일하고, 미지원 연산은 분리해서 보는 것이 좋습니다. 또 학습 노트에는 통과한 연산과 막힌 연산을 구분해 남기면 다음 실험에서 같은 시행착오를 줄일 수 있습니다.
관련 DAKER 학습
참고 자료
https://daker.ai/public/learning/tracks/pytorch-practice-advanced-track
https://daker.ai/community
복소 텐서 경로를 torch.compile로 시험해 보셨다면, 어느 연산까지 통과했는지 함께 나눠 주셔도 좋겠습니다.