การเบนช์มาร์ก NPU ของ Qualcomm
บทนำ
- Microsoft มีแท็บเล็ต Surface ที่มาพร้อม Windows ซึ่งทำงานบน SoC แบบ Arm ของ Qualcomm
- แท็บเล็ตนี้ถูกโปรโมตในฐานะ AI PC และอ้างว่าสามารถรันโมเดลแมชชีนเลิร์นนิงได้เร็วและมีประสิทธิภาพกว่าระบบอื่น
- ผู้เขียนสนใจฮาร์ดแวร์ของ Qualcomm โดยเฉพาะ NPU มาก และได้ลงทุนทั้งเวลาและทรัพยากรจำนวนมากเพื่อนำแอปของบุคคลที่สามมาพอร์ตลงแพลตฟอร์มนี้
- อย่างไรก็ตาม แทบไม่มีตัวอย่างโค้ดหรือเบนช์มาร์กสำหรับนักพัฒนาภายนอกที่ต้องการได้ผลลัพธ์เร็ว ๆ จึงได้จัดทำโปรเจ็กต์อิสระขึ้นมาเพื่อแสดงประสิทธิภาพ
- เนื่องจากประสิทธิภาพต่ำกว่าที่คาดไว้ จึงเผยแพร่เบนช์มาร์กนี้เพื่อหาไอเดียในการลดเวลาแฝง
การติดตั้ง
Python
- ใช้ Python เพื่อรันสคริปต์ทดสอบ
- Python จาก Microsoft Store ไม่รองรับสถาปัตยกรรม Arm จึงแนะนำให้ใช้ตัวติดตั้งอย่างเป็นทางการจาก Python.org
- ผลลัพธ์ที่รายงานใช้ Python เวอร์ชัน 3.11.9
Cmake
- ต้องใช้เครื่องมือสร้างบิลด์ cmake เพื่อคอมไพล์ Onnx
- รันคำสั่ง
winget install cmake ใน Powershell
Visual Studio
- ต้องใช้ Visual Studio สำหรับคอมไพเลอร์
- เมื่อติดตั้ง Visual Studio Community Edition ให้เลือกเวิร์กโหลด
Desktop C++ Development
แพ็กเกจ Pip
- สามารถติดตั้งแพ็กเกจ Python ที่ต้องใช้ด้วยคำสั่ง
py -m pip install -r requirements.txt
- ใช้ Onnx เวอร์ชัน 1.16 ซึ่งเข้ากันได้กับ Qualcomm Onnx Runtime
เบนช์มาร์ก
การรัน
- รันเบนช์มาร์กด้วย
py benchmark_matmul.py
ทำความเข้าใจผลลัพธ์
- Onnx Runtime จะสร้าง log เริ่มต้นจำนวนมาก
- ผลลัพธ์ของเบนช์มาร์กยืนยันว่าค่าผลลัพธ์เชิงตัวเลขของ CPU และ NPU ตรงกัน
- CPU ทำได้ 821 Gigaops, วิธีเข้าถึง NPU แบบแรกทำได้ 225 Gigaops และแบบที่สองทำได้ 573 Gigaops
การวัดของเบนช์มาร์ก
- เบนช์มาร์กรันการคูณเมทริกซ์ขนาดใหญ่ 6 ครั้ง ซึ่งคล้ายกับเลเยอร์ที่ใช้เวลามากที่สุดในโมเดลทรานส์ฟอร์เมอร์อย่าง Whisper ของ OpenAI
- NPU รันโมเดลที่ผ่านการควอนไทซ์ได้อย่างมีประสิทธิภาพเป็นหลัก และโมเดลที่ใช้อินพุตและเอาต์พุตแบบ 8 บิตจะเร็วกว่า
ปัจจัยที่อาจทำให้สับสน
ข้อจำกัดด้านการคำนวณ
- โมเดลทรานส์ฟอร์เมอร์สมัยใหม่อาศัยการคูณเมทริกซ์ขนาดใหญ่ และอาจติดข้อจำกัดด้านหน่วยความจำ
- ทำให้เมทริกซ์อินพุตมีรูปทรงใกล้สี่เหลี่ยมจัตุรัสมากขึ้น เพื่อให้สามารถทำไทลิงและนำกลับมาใช้ซ้ำได้
การตั้งค่าพลังงาน
- ตั้งค่าการใช้พลังงานของ Windows เป็น "ประสิทธิภาพสูงสุด" และเสียบไฟแท็บเล็ตระหว่างรันเบนช์มาร์ก
โทโพโลยีของโมเดล
- สร้างกราฟให้สะท้อนโมเดล AI สมัยใหม่ แต่ทำให้ง่ายขึ้นเพื่อให้อ่านและตีความได้สะดวก
ความผิดพลาดในการตั้งค่า
- วิธีการสร้างและรันโมเดลอาจหลุดจาก fast path ของไดรเวอร์หรือการทำงานของตัวเร่งความเร็ว
เฟรมเวิร์ก Onnx
- มีหลายวิธีในการเข้าถึงการเร่ง AI บน Windows และ Onnx ดูจะเป็นเฟรมเวิร์กที่เหมาะสมที่สุด
การตีความผลลัพธ์
- เมื่อรันบน Snapdragon X 12-core X1E80100 ผลลัพธ์ของ NPU ช้ากว่า CPU
- ประสิทธิภาพที่ได้มีเพียง 1.3% ของ 45 ล้านล้าน ops/s ที่สื่อการตลาดเคยสัญญาไว้
- บน Nvidia Geforce RTX 4080 Laptop GPU รันได้ในเวลา 3.2ms และให้ประสิทธิภาพ 2,160 Gigaops
สรุปโดย GN⁺
- ประสิทธิภาพของ Qualcomm NPU ไม่เป็นไปตามความคาดหวัง และให้ผลลัพธ์ช้ากว่า CPU
- ยังมีความคาดหวังว่าจะสามารถปรับปรุงประสิทธิภาพของ NPU ได้ผ่านการเปลี่ยนแปลงด้านซอฟต์แวร์
- เฟรมเวิร์ก Onnx ดูเป็นตัวเลือกที่ดีที่สุดสำหรับการดึงประสิทธิภาพการเร่งความเร็วบน Qualcomm NPU
- เมื่อเทียบกับ Nvidia GPU แล้ว ประสิทธิภาพของ Qualcomm NPU ด้อยกว่ามาก
2 ความคิดเห็น
ผมเข้าใจมาตลอดว่า npu ของ ryzen เร็วกว่า cpu อยู่เล็กน้อย แต่พอเห็นแบบนี้แล้วความอยากได้ Snapdragon ลดฮวบเลย
ความคิดเห็นจาก Hacker News
ความต่างด้านประสิทธิภาพระหว่าง CPU กับ GPU มีไม่มาก อาจเป็นปัญหาของ onnxruntime และ NPU เน้นการใช้พลังงานต่ำมากกว่าความเร็ว
Apple Neural Engine เร็วกว่า CPU หรือ GPU มาก
เป้าหมายของ NPU คือรันโมเดลขนาดเล็กด้วยพลังงานต่ำ
หากต้องการดีพลอยโมเดลลง NPU จำเป็นต้องมีการปรับแต่งตามโปรไฟล์
คำอธิบายใน GitHub มีประโยชน์มากกว่าบล็อก
Qualcomm ไม่อนุญาตให้เข้าถึง NPU โดยตรง
อาจใช้ Qualcomm SNPE SDK ได้
บทความนี้กล่าวถึง NPU, benchmark, library และ framework เฉพาะชุดหนึ่ง