GN⁺: AI PC의 AI 성능 부족: CPU가 NPU를 능가
(github.com/usefulsensors)Qualcomm NPU 벤치마킹
소개
- Microsoft는 Qualcomm Arm 기반 SoC에서 실행되는 Windows를 탑재한 Surface 태블릿을 제공함.
- 이 태블릿은 AI PC로 홍보되며, 다른 시스템보다 더 빠르고 효율적으로 머신러닝 모델을 실행할 수 있음.
- Qualcomm의 하드웨어, 특히 NPU에 관심이 많아 이 플랫폼에 제3자 앱을 포팅하는 데 많은 시간과 자원을 투자함.
- 그러나 외부 개발자가 빠른 결과를 얻기 위한 코드 예제나 벤치마크가 거의 없어, 성능을 보여주기 위한 독립 프로젝트를 구성함.
- 기대했던 것보다 성능이 낮아, 지연 시간을 줄이기 위한 아이디어를 얻기 위해 벤치마크를 공개함.
설치
Python
- 테스트 스크립트를 실행하기 위해 Python 사용.
- Microsoft Store의 Python은 Arm 아키텍처를 지원하지 않으므로 공식 Python.org 설치 프로그램 사용 권장.
- 보고된 결과는 Python 3.11.9 버전 사용.
Cmake
- Onnx를 컴파일하기 위해 cmake 빌드 도구 필요.
- Powershell에서
winget install cmake
명령어 실행.
Visual Studio
- 컴파일러를 위해 Visual Studio 필요.
- Visual Studio Community Edition 다운로드 및 설치 시
Desktop C++ Development
워크로드 선택.
Pip 패키지
- 필요한 Python 패키지는
py -m pip install -r requirements.txt
명령어로 설치 가능. - Qualcomm Onnx Runtime과 호환되는 Onnx 버전 1.16을 사용.
벤치마크
실행
- 벤치마크 실행:
py benchmark_matmul.py
출력 이해하기
- Onnx 런타임은 초기 로그 스팸을 생성함.
- 벤치마크 결과는 CPU와 NPU의 수치 결과가 일치함을 확인.
- CPU는 821 Gigaops, 첫 번째 NPU 접근 방식은 225 Gigaops, 두 번째는 573 Gigaops 성능을 보임.
벤치마크 측정
- 벤치마크는 OpenAI의 Whisper와 같은 변환기 모델의 가장 시간 소모적인 레이어와 유사한 6개의 큰 행렬 곱셈을 실행.
- NPU는 주로 양자화된 모델을 효과적으로 실행하며, 8비트 입력 및 출력을 사용한 모델이 더 빠름.
혼란을 일으킬 수 있는 요소
계산 제한
- 현대 변환기 모델은 큰 행렬 곱셈을 기반으로 하며, 메모리 제한이 될 수 있음.
- 입력 행렬을 더 정사각형으로 만들어 타일링과 재사용이 가능하도록 함.
전원 설정
- Windows의 에너지 사용 설정을 "최고 성능"으로 설정하고, 태블릿을 전원에 연결하여 벤치마크 실행.
모델 토폴로지
- 현대 AI 모델을 반영하는 그래프를 생성하되, 해석하기 쉽게 단순화.
구성 오류
- 모델 빌드 및 실행 방식이 드라이버나 가속기 구현의 빠른 경로에서 벗어날 수 있음.
Onnx 프레임워크
- Windows에서 AI 가속에 접근하는 여러 방법이 있으며, Onnx가 가장 적합한 프레임워크로 보임.
결과 해석
- Snapdragon X 12-core X1E80100에서 실행 시 NPU 결과는 CPU보다 느림.
- 마케팅 자료에서 약속한 45조 ops/s의 1.3%에 불과한 성능을 보임.
- Nvidia Geforce RTX 4080 Laptop GPU에서는 3.2ms에 실행되어 2,160 Gigaops 성능을 보임.
GN⁺의 정리
- Qualcomm NPU의 성능이 기대에 미치지 못하며, CPU보다 느린 결과를 보임.
- NPU의 성능을 최적화하기 위한 소프트웨어 변경 가능성에 대한 기대가 있음.
- Onnx 프레임워크가 Qualcomm NPU에서 가속 성능을 얻기 위한 최적의 선택으로 보임.
- Nvidia GPU와 비교했을 때, Qualcomm NPU의 성능이 크게 떨어짐.
Hacker News 의견
-
CPU와 GPU의 성능 차이가 작음. onnxruntime의 문제일 가능성 있음. NPU는 속도보다는 저전력 소비에 중점이 있음
- NPU는 AI 연산을 CPU에서 분리하여 SoC의 일부로 사용됨
- CPU, NPU, GPU의 전력 소비를 무한 루프에서 측정하면 NPU가 가장 낮을 것으로 예상됨
- NPU가 많은 실리콘 면적을 차지하므로 제대로 사용되지 않으면 아쉬움
-
Apple Neural Engine은 CPU나 GPU보다 훨씬 빠름
- 모델 아키텍처, 변환, 튜닝에 따라 성능이 달라짐
- XCode는 모델의 실행 시간을 측정하는 도구를 제공함
- ML 프레임워크/런타임은 모든 연산자를 구현하지 않을 수 있음
-
NPU는 작은 모델을 저전력으로 실행하는 것이 목적임
- NPU는 최적화된 모델을 위한 것으로, 작은 작업을 수행함
- Windows에서는 전체 화면 OCR 등을 실행할 수 있음
-
NPU에 모델을 배포하려면 프로파일 기반 최적화가 필요함
- CPU에서 잘 작동하는 모델도 NPU에서는 실망스러운 결과를 낼 수 있음
-
GitHub의 설명이 블로그보다 더 유익함
- int8 matmul 실행 시 onnx 성능은 약 0.6TF임
-
Qualcomm은 NPU에 직접 접근을 허용하지 않음
- 변환 도구가 최적화를 놓칠 수 있음
- NPU는 작은 ML 모델과 빠른 함수 근사에 적합함
-
Qualcomm SNPE SDK 사용 가능성 있음
- Hexagon SDK가 제대로 작동하는지 궁금함
-
이 글은 특정 NPU, 특정 벤치마크, 특정 라이브러리와 프레임워크에 관한 것임
- 따라서 일반적인 결론을 내리기 어려움