1 คะแนน โดย GN⁺ 2024-10-17 | 2 ความคิดเห็น | แชร์ทาง WhatsApp

การเบนช์มาร์ก 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 ความคิดเห็น

 
bungker 2024-10-18

ผมเข้าใจมาตลอดว่า npu ของ ryzen เร็วกว่า cpu อยู่เล็กน้อย แต่พอเห็นแบบนี้แล้วความอยากได้ Snapdragon ลดฮวบเลย

 
GN⁺ 2024-10-17
ความคิดเห็นจาก Hacker News
  • ความต่างด้านประสิทธิภาพระหว่าง CPU กับ GPU มีไม่มาก อาจเป็นปัญหาของ onnxruntime และ NPU เน้นการใช้พลังงานต่ำมากกว่าความเร็ว

    • NPU ถูกใช้เป็นส่วนหนึ่งของ SoC โดยแยกงานคำนวณ AI ออกจาก CPU
    • หากวัดการใช้พลังงานของ CPU, NPU และ GPU ในลูปไม่สิ้นสุด คาดว่า NPU จะใช้พลังงานต่ำที่สุด
    • NPU กินพื้นที่ซิลิคอนมาก จึงน่าเสียดายหากใช้งานได้ไม่คุ้มค่า
  • Apple Neural Engine เร็วกว่า CPU หรือ GPU มาก

    • ประสิทธิภาพเปลี่ยนแปลงได้ตามสถาปัตยกรรมของโมเดล การแปลง และการปรับแต่ง
    • XCode มีเครื่องมือสำหรับวัดเวลารันของโมเดล
    • ML framework/runtime อาจไม่ได้รองรับโอเปอเรเตอร์ทุกตัว
  • เป้าหมายของ NPU คือรันโมเดลขนาดเล็กด้วยพลังงานต่ำ

    • NPU มีไว้สำหรับโมเดลที่ถูกปรับแต่งมาอย่างเหมาะสม และใช้ทำงานขนาดเล็ก
    • บน Windows สามารถใช้รันอย่างเช่น OCR แบบเต็มหน้าจอได้
  • หากต้องการดีพลอยโมเดลลง NPU จำเป็นต้องมีการปรับแต่งตามโปรไฟล์

    • โมเดลที่ทำงานได้ดีบน CPU ก็อาจให้ผลลัพธ์น่าผิดหวังบน NPU
  • คำอธิบายใน GitHub มีประโยชน์มากกว่าบล็อก

    • เมื่อรัน int8 matmul ประสิทธิภาพของ onnx อยู่ที่ราว 0.6TF
  • Qualcomm ไม่อนุญาตให้เข้าถึง NPU โดยตรง

    • เครื่องมือแปลงอาจพลาดการปรับแต่งให้เหมาะสม
    • NPU เหมาะกับโมเดล ML ขนาดเล็กและการประมาณค่าฟังก์ชันแบบรวดเร็ว
  • อาจใช้ Qualcomm SNPE SDK ได้

    • สงสัยว่า Hexagon SDK ทำงานได้ดีหรือไม่
  • บทความนี้กล่าวถึง NPU, benchmark, library และ framework เฉพาะชุดหนึ่ง

    • ดังนั้นจึงยากที่จะสรุปเป็นข้อสรุปทั่วไปได้