ARM64(aarch64)에서 onnxruntime 추론 시 결과가 잘못 나올 때 시도 해볼 것
ARM64(aarch64) 환경에서 ONNX Runtime으로 모델을 추론할 때 amd64와 다른 결과가 나오거나, TTS 모델의 음원이 깨지는 문제가 발생할 수 있다. 이 글에서는 ORT_ENABLE_ALL 그래프 최적화 옵션으로 인해 발생했던 실제 문제와, aarch64 환경에서 ORT_ENABLE_BASIC으로 낮춰 해결한 경험을 정리한다.
개요
ONNX Runtime을 사용하면 같은 ONNX 모델을 다양한 플랫폼에서 실행할 수 있다. 일반적으로 동일한 모델과 동일한 입력이라면 amd64 환경과 ARM64(aarch64) 환경에서 거의 동일한 추론 결과가 나와야 한다.
하지만 실제로 ARM64 환경에서 ONNX Runtime으로 TTS 모델을 실행했을 때, amd64와 결과가 다르게 나오는 문제가 있었다.
증상은 단순한 미세 오차 수준이 아니라, 생성된 음원이 이상하게 들리는 형태였다. 같은 모델, 같은 입력, 같은 코드 흐름인데 ARM64에서만 TTS 결과가 깨지는 상황이었다.
문제 상황
문제가 발생한 환경은 다음과 같았다.
- Linux ARM64(aarch64)
- ONNX Runtime 사용
- TTS 모델 추론
- amd64에서는 정상 동작
- aarch64에서는 추론 결과가 달라짐
- 결과적으로 생성된 음원이 이상하게 들림
처음에는 모델 변환 문제, 입력 텐서 shape 문제, endian 문제, floating point 연산 차이 등을 의심했다.
하지만 원인은 ONNX Runtime의 그래프 최적화 옵션이었다.
원인: ORT_ENABLE_ALL 그래프 최적화
기존 코드는 SessionOptions에 대해 다음과 같이 그래프 최적화를 최대로 활성화하고 있었다.
ORT_ENABLE_ALL은 ONNX Runtime에서 가능한 그래프 최적화를 최대한 적용하는 옵션이다.
일반적인 경우에는 성능 향상에 도움이 된다. 하지만 특정 모델, 특정 연산, 특정 아키텍처 조합에서는 최적화 과정에서 결과가 달라질 수 있다.
이번 경우에는 ARM64(aarch64) 환경에서 TTS 모델을 실행할 때 ORT_ENABLE_ALL이 적용되면 추론 결과가 amd64와 다르게 나왔고, 최종 음원이 깨지는 문제가 발생했다.
해결 방법
ARM64(aarch64) Linux 환경에서는 그래프 최적화 레벨을 ORT_ENABLE_BASIC으로 낮추도록 처리했다.
이렇게 변경한 뒤 ARM64 환경에서도 TTS 모델의 추론 결과가 정상적으로 나왔다.
즉, amd64에서는 기존처럼 ORT_ENABLE_ALL을 사용하고, Linux aarch64 환경에서만 ORT_ENABLE_BASIC을 사용하도록 분기한 것이다.
ORT_ENABLE_BASIC을 사용한 이유
ONNX Runtime의 그래프 최적화 레벨은 대략 다음과 같이 나뉜다.
ORT_ENABLE_ALL은 가장 많은 최적화를 수행한다. 반면 ORT_ENABLE_BASIC은 비교적 안전한 기본 최적화만 수행한다.
이번 문제는 성능보다 결과의 정확성이 더 중요했다. 특히 TTS 모델은 작은 수치 차이가 최종 음질에 큰 영향을 줄 수 있다.
따라서 ARM64 환경에서는 무리하게 모든 최적화를 적용하기보다, 기본 최적화만 사용하는 방식이 더 안정적이었다.
확인할 점
ARM64에서 ONNX Runtime 추론 결과가 이상하다면 다음 항목을 먼저 확인해볼 수 있다.
- amd64와 aarch64에서 같은 모델 파일을 사용하는지
- 입력 텐서 값과 shape이 동일한지
- ONNX Runtime 버전이 동일한지
- Execution Provider가 동일한지
- 그래프 최적화 레벨을 낮췄을 때 결과가 정상화되는지
특히 amd64에서는 정상인데 aarch64에서만 결과가 이상하다면, ORT_ENABLE_ALL 대신 ORT_ENABLE_BASIC으로 낮춰 테스트해볼 만하다.
마무리
ONNX Runtime의 그래프 최적화는 대부분의 경우 성능 향상에 도움이 된다. 하지만 모든 환경에서 항상 동일한 결과를 보장한다고 가정하면 안 된다.
특히 ARM64(aarch64) 환경에서 TTS, 음성, 이미지 생성처럼 출력 품질에 민감한 모델을 실행한다면 그래프 최적화 레벨을 의심해볼 필요가 있다.
이번 경우에는 Linux aarch64 환경에서만 ORT_ENABLE_BASIC을 사용하도록 변경하여 문제를 해결했다.
ARM64에서 ONNX Runtime 추론 결과가 amd64와 다르게 나온다면, 가장 먼저 시도해볼 만한 방법이다.