Benchmark NPU của Qualcomm
Giới thiệu
- Microsoft cung cấp các máy tính bảng Surface chạy Windows trên SoC nền tảng Arm của Qualcomm.
- Những máy tính bảng này được quảng bá là AI PC, có thể chạy các mô hình machine learning nhanh hơn và hiệu quả hơn các hệ thống khác.
- Do rất quan tâm đến phần cứng của Qualcomm, đặc biệt là NPU, tác giả đã đầu tư nhiều thời gian và tài nguyên để port ứng dụng bên thứ ba lên nền tảng này.
- Tuy nhiên, gần như không có ví dụ mã hay benchmark nào để các nhà phát triển bên ngoài nhanh chóng đạt được kết quả, nên tác giả đã dựng một dự án độc lập để thể hiện hiệu năng.
- Hiệu năng thấp hơn kỳ vọng, nên tác giả công bố benchmark để tìm ý tưởng giảm độ trễ.
Cài đặt
Python
- Sử dụng Python để chạy script kiểm thử.
- Python trên Microsoft Store không hỗ trợ kiến trúc Arm, nên khuyến nghị dùng trình cài đặt chính thức từ Python.org.
- Các kết quả được báo cáo sử dụng Python phiên bản 3.11.9.
Cmake
- Cần công cụ build cmake để biên dịch Onnx.
- Chạy lệnh
winget install cmake trong Powershell.
Visual Studio
- Cần Visual Studio cho trình biên dịch.
- Khi tải và cài đặt Visual Studio Community Edition, hãy chọn workload
Desktop C++ Development.
Gói Pip
- Có thể cài các gói Python cần thiết bằng lệnh
py -m pip install -r requirements.txt.
- Sử dụng Onnx phiên bản 1.16 tương thích với Qualcomm Onnx Runtime.
Benchmark
Cách chạy
- Chạy benchmark:
py benchmark_matmul.py
Hiểu đầu ra
- Onnx runtime tạo ra một loạt log khởi tạo.
- Kết quả benchmark xác nhận rằng kết quả số của CPU và NPU là khớp nhau.
- CPU đạt 821 Gigaops, cách tiếp cận NPU đầu tiên đạt 225 Gigaops, và cách thứ hai đạt 573 Gigaops.
Đo benchmark
- Benchmark chạy 6 phép nhân ma trận lớn tương tự lớp tốn thời gian nhất trong các mô hình transformer như Whisper của OpenAI.
- NPU chủ yếu chạy hiệu quả các mô hình đã lượng tử hóa, và các mô hình dùng đầu vào và đầu ra 8-bit nhanh hơn.
Các yếu tố có thể gây nhầm lẫn
Giới hạn tính toán
- Các mô hình transformer hiện đại dựa trên các phép nhân ma trận lớn và có thể bị giới hạn bởi bộ nhớ.
- Ma trận đầu vào được làm vuông hơn để cho phép tiling và tái sử dụng.
Thiết lập nguồn điện
- Đặt tùy chọn sử dụng năng lượng của Windows thành "Hiệu năng cao nhất" và cắm nguồn cho máy tính bảng khi chạy benchmark.
Topology mô hình
- Tạo một đồ thị phản ánh các mô hình AI hiện đại nhưng được đơn giản hóa để dễ diễn giải.
Lỗi cấu hình
- Cách build và chạy mô hình có thể khiến nó đi chệch khỏi fast path của driver hoặc triển khai bộ tăng tốc.
Framework Onnx
- Có nhiều cách để truy cập tăng tốc AI trên Windows, và Onnx có vẻ là framework phù hợp nhất.
Diễn giải kết quả
- Khi chạy trên Snapdragon X 12-core X1E80100, kết quả NPU chậm hơn CPU.
- Hiệu năng chỉ đạt 1,3% so với mức 45 nghìn tỷ ops/giây được hứa hẹn trong tài liệu marketing.
- Trên Nvidia Geforce RTX 4080 Laptop GPU, tác vụ chạy trong 3,2ms và đạt 2.160 Gigaops.
Tóm tắt của GN⁺
- Hiệu năng của Qualcomm NPU không đạt kỳ vọng và cho kết quả chậm hơn CPU.
- Có kỳ vọng rằng việc thay đổi phần mềm có thể tối ưu hiệu năng NPU.
- Framework Onnx có vẻ là lựa chọn tốt nhất để đạt hiệu năng tăng tốc trên Qualcomm NPU.
- So với GPU của Nvidia, hiệu năng của Qualcomm NPU kém hơn đáng kể.
2 bình luận
Tôi cứ nghĩ Ryzen NPU nhanh hơn CPU một chút, nhưng đọc xong thì hứng thú với Snapdragon tụt hẳn.
Ý kiến trên Hacker News
Chênh lệch hiệu năng giữa CPU và GPU là nhỏ. Có thể đây là vấn đề của
onnxruntime. NPU tập trung vào mức tiêu thụ điện năng thấp hơn là tốc độApple Neural Engine nhanh hơn CPU hoặc GPU rất nhiều
Mục tiêu của NPU là chạy các mô hình nhỏ với điện năng thấp
Để triển khai mô hình lên NPU cần tối ưu hóa dựa trên profiling
Phần giải thích trên GitHub hữu ích hơn bài blog
int8 matmul, hiệu năngonnxvào khoảng 0.6TFQualcomm không cho phép truy cập trực tiếp vào NPU
Có thể dùng Qualcomm SNPE SDK
Bài viết này nói về một NPU cụ thể, một benchmark cụ thể, cùng một thư viện và framework cụ thể