1 điểm bởi GN⁺ 2024-10-17 | 2 bình luận | Chia sẻ qua WhatsApp

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

 
bungker 2024-10-18

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.

 
GN⁺ 2024-10-17
Ý 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 độ

    • NPU được dùng như một phần của SoC để tách các phép tính AI khỏi CPU
    • Nếu đo mức tiêu thụ điện năng của CPU, NPU và GPU trong vòng lặp vô hạn, dự kiến NPU sẽ thấp nhất
    • NPU chiếm khá nhiều diện tích silicon nên sẽ đáng tiếc nếu không được tận dụng đúng cách
  • Apple Neural Engine nhanh hơn CPU hoặc GPU rất nhiều

    • Hiệu năng thay đổi tùy theo kiến trúc mô hình, quá trình chuyển đổi và tinh chỉnh
    • XCode cung cấp công cụ để đo thời gian chạy của mô hình
    • Framework/runtime ML có thể không triển khai mọi toán tử
  • Mục tiêu của NPU là chạy các mô hình nhỏ với điện năng thấp

    • NPU dành cho các mô hình đã được tối ưu hóa và xử lý các tác vụ nhỏ
    • Trên Windows, có thể chạy OCR toàn màn hình v.v.
  • Để triển khai mô hình lên NPU cần tối ưu hóa dựa trên profiling

    • Ngay cả mô hình chạy tốt trên CPU cũng có thể cho kết quả gây thất vọng trên NPU
  • Phần giải thích trên GitHub hữu ích hơn bài blog

    • Khi chạy int8 matmul, hiệu năng onnx vào khoảng 0.6TF
  • Qualcomm không cho phép truy cập trực tiếp vào NPU

    • Công cụ chuyển đổi có thể bỏ lỡ các tối ưu hóa
    • NPU phù hợp với các mô hình ML nhỏ và xấp xỉ hàm nhanh
  • Có thể dùng Qualcomm SNPE SDK

    • Không rõ Hexagon SDK có hoạt động đúng hay không
  • 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ể

    • Vì vậy rất khó đưa ra kết luận mang tính tổng quát