- Microsoft Surface Pro 11th Edition의 Qualcomm Arm 기반 SoC에서 NPU 벤치마크를 실행한 결과, Windows AI PC가 내세우는 가속 성능보다 훨씬 낮은 처리량이 측정됨
- 테스트는 Onnx Runtime과 Qualcomm QNN 실행 공급자를 사용해 transformer 계열 모델의 비용 큰 레이어와 비슷한 대형 MatMul 연산을 실행하는 방식으로 구성됨
- 예시 결과에서 CPU는 821 Gigaops/s, NPU는 float 입출력 양자화 구성에서 225 Gigaops/s, 8-bit 입출력까지 적용한 구성에서 573 Gigaops/s를 기록함
- NPU의 573 Gigaops/s는 Microsoft Surface Pro 11th Edition 마케팅 자료의 45 Teraops/s 대비 1.3% 수준이며, 같은 모델을 Nvidia Geforce RTX 4080 Laptop GPU에서 실행하면 3.2ms, 2,160 Gigaops/s가 나옴
- 현재 결과는 2024년 10월 2일 기준이며, 소프트웨어·프레임워크·드라이버 수준 개선으로 지연 시간이 낮아질 가능성을 기대하지만 현 벤치마크에서는 CPU가 NPU보다 빠름
Surface의 Qualcomm NPU 벤치마크 목적
- Microsoft는 Qualcomm Arm 기반 SoC를 탑재한 Surface 태블릿을 Windows AI PC로 판매하며, 머신러닝 모델을 더 빠르고 효율적으로 실행할 수 있다고 홍보함
- Useful Sensors는 Qualcomm 하드웨어와 NPU를 긍정적으로 보고, 자사 서드파티 앱을 이 플랫폼으로 포팅하는 데 시간과 자원을 투입함
- 외부 개발자가 빠른 결과를 얻는 방법을 보여주는 코드 예제나 벤치마크가 많지 않아, 실제로 관찰한 성능을 작은 독립 프로젝트로 공개함
- 측정 성능은 기대보다 크게 낮았고, Android 같은 다른 플랫폼에서는 같은 하드웨어가 효과적으로 동작한 경험이 있어 향후 애플리케이션·프레임워크·드라이버 변경을 통한 개선 가능성을 열어둠
실행 환경과 설치 제약
- 테스트에는 Windows에서 Python 스크립트를 사용함
- 2024년 10월 2일 기준 Microsoft Store의 Python은 Arm 아키텍처를 지원하지 않아 Qualcomm NPU 접근에 필요한 패키지 실행에 적합하지 않음
- 결과에는 Python 3.11.9 Arm64 설치 파일이 사용됨
- Windows on Arm용 사전 빌드 Onnx 패키지가 아직 없어 CMake와 Visual Studio 컴파일러가 필요함
- CMake는
winget install cmake로 설치함 - Visual Studio는 Visual Studio Community Edition을 사용하며, 설치 시
Desktop C++ Development워크로드를 선택함
- CMake는
- Python 패키지는 저장소 폴더에서
py -m pip install -r requirements.txt로 설치함- Onnx 브랜치는 공식
py런처 컴파일 수정이 Onnx 1.16에 백포트된 버전임 - Qualcomm Onnx Runtime은 최신 Onnx에서
Unsupported model IR version오류가 나기 때문에 이 조합을 사용함 - Qualcomm Onnx Runtime 패키지는 nightly 빌드가 사용됨
- Onnx 브랜치는 공식
벤치마크 실행과 출력 해석
- 벤치마크는
py benchmark_matmul.py로 실행함 - Onnx Runtime은 초기 실행 중 로그를 많이 출력함
- 예시로
Snapdragon(R) X 12-core X1E80100 @ 3.40 GHz칩 모델을 알 수 없다는cpuinfo메시지가 나옴 - 그래프 마무리 단계와 완료 단계 로그도 출력됨
- 예시로
- 실제 벤치마크 결과는 마지막에 표시됨
NPU quantized compute, float I/O accuracy difference is 0.0100NPU quantized compute and I/O accuracy difference is 0.0060CPU took 8.42ms, 821,141,860,688 ops per secondNPU (quantized compute, float I/O) took 30.63ms, 225,667,671,183 ops per secondNPU (quantized compute and I/O) took 12.05ms, 573,475,650,364 ops per second
- 첫 두 줄은 CPU와 NPU의 수치 결과가 서로 맞는지 확인하는 정확도 차이를 보여줌
- 마지막 세 줄은 모델을 처음부터 끝까지 실행하는 벽시계 시간과, 그 지연 시간에서 계산한 초당 연산량을 보여줌
측정 대상 모델과 양자화 방식
- 벤치마크는 OpenAI Whisper 같은 transformer 모델에서 시간이 많이 걸리는 레이어와 유사한 6개의 큰 행렬 곱셈을 재현하도록 설계됨
- 입력 모양은
(6, 1500, 256) X (6, 256, 1500)임 - 결과 모양은
(6, 1500, 1500)임 - 모델은 입력 2개와 출력 1개를 가진 단일
MatMul노드로 구성됨
- 입력 모양은
- 모델은 Onnx 모델 프레임워크로 즉석 생성한 뒤 Onnx Runtime에 전달함
- 기준 모델은 순수 float 버전이며 CPU에서만 실행됨
- NPU는 효과적으로 실행하려면 주로 양자화 모델이 필요하며, float16은 제한적으로 지원함
- 첫 번째 NPU 접근은 공식 ORT
quantize_static()메서드를 사용함- 편의를 위해 입력과 출력 텐서는 32-bit float로 남김
- 그래프 시작과 끝에서 런타임 변환을 수행하고, 나머지 계산은 8-bit로 실행함
- 이 구성에서는 NPU의 변환 연산이 매우 느렸고,
npu_quant_profile.csv에서 변환이 전체 시간의 75% 이상을 차지함 - 두 번째 접근은 8-bit 입력과 출력을 가진 동등한 모델 그래프를 프로그램으로 구성함
- 이
quantized compute and I/O방식은 float I/O 버전보다 보통 약 3배 빠름 - 프로파일링에서는 대부분의 시간이 기대대로 행렬 곱셈에 쓰임
- 이
성능 측정에서 고려한 변수
- Compute bound 여부를 고려해 행렬 모양을 더 정사각형에 가깝게 잡음
- 현대 transformer 모델은 오래된 convolution 모델과 달리 큰 행렬 곱셈에 기반함
- 레이어가 행렬-벡터 곱에 가까워지면 가중치 재사용이 줄고 DRAM 값 가져오기가 병목이 될 수 있음
- tiny Whisper 원래 행렬의
k차원은 64였지만, 이 벤치마크에서는 SIMD 최적화 여지를 넓히기 위해 256으로 올림
- 전원 설정은 성능을 높이는 쪽으로 맞춤
- Windows 에너지 설정은 모두
Best Performance로 두려 했음 - 태블릿을 전원에 연결한 상태에서 벤치마크를 실행함
- Qualcomm Onnx Runtime의
htp_performance_mode세션 옵션은 실험에서 전체 지연 시간이 가장 낮았던sustained_high_performance로 설정함
- Windows 에너지 설정은 모두
- 모델 구조는 해석이 쉽도록 단일 행렬 곱셈으로 제한함
- 여러 레이어, convolution, 정적 가중치도 가능했지만 LLM과 현대 모델에서 널리 쓰이는 transformer 구조를 반영하기 위해 동적 입력을 가진 단일 MatMul을 선택함
- 구성 오류 가능성도 남아 있음
- unsigned 8-bit 양자화와 그래프 내
qdq요소를 사용함 - 문서의 모범 사례를 따르려 했지만, 드라이버나 가속기 구현의 빠른 경로를 벗어났을 가능성이 있음
- unsigned 8-bit 양자화와 그래프 내
- Windows에서 AI 가속에 접근하는 API 선택지도 검토됨
- DirectML은 GPU 접근만 지원하는 것으로 보임
- OpenVino는 해당 Arm 하드웨어에서 실행되지 않는 것으로 보임
- Qualcomm QNN SDK를 직접 사용해도 비슷한 성능 결과를 봄
- TensorFlow Lite는 Windows for Arm을 지원하지 않음
- 이 조사와 실험에서는 Onnx가 Microsoft와 Qualcomm 양쪽에서 지원되며 NPU 가속 성능을 얻는 데 가장 적합한 프레임워크로 보임
결과 해석
- 결과는 2024년 10월 2일 기준이며, Microsoft Surface Pro 11th Edition에서 측정됨
- SoC는
Snapdragon(R) X 12-core X1E80100 @ 3.40 GHz임
- SoC는
- float 변환을 제외해도 NPU 결과가 CPU보다 느림
- 가속기 관점에서는 이상적이지 않음
- 다만 에너지 효율이나 지속 성능에서 이점이 있을 가능성은 배제하지 않음
- 측정된 최고 NPU 성능인 573 billion ops/s는 Microsoft Surface Pro 11th Edition 마케팅 자료의 45 trillion ops/s 대비 1.3%임
- 같은 모델을 Nvidia Geforce RTX 4080 Laptop GPU에서 실행하면 3.2ms가 걸림
- 이는 2,160 billion ops/s에 해당함
- Surface의 NPU 측정치보다 거의 4배 높은 처리량임