ผู้รับมอบสิทธิ์ TensorFlow Lite, ผู้รับมอบสิทธิ์ TensorFlow Lite

บทนำ

ผู้รับมอบสิทธิ์ เปิดใช้งานการเร่งด้วยฮาร์ดแวร์ของรุ่น TensorFlow Lite โดยใช้ประโยชน์จากตัวเร่งความเร็วในอุปกรณ์ เช่น GPU และ ตัวประมวลผลสัญญาณดิจิทัล (DSP)

ตามค่าเริ่มต้น TensorFlow Lite จะใช้เคอร์เนลของ CPU ที่ได้รับการปรับให้เหมาะสมสำหรับชุดคำสั่ง ARM Neon อย่างไรก็ตาม CPU เป็นตัวประมวลผลอเนกประสงค์ที่ไม่จำเป็นต้องปรับให้เหมาะสมสำหรับเลขคณิตหนักที่มักพบในแบบจำลองการเรียนรู้ของเครื่อง (เช่น คณิตศาสตร์เมทริกซ์ที่เกี่ยวข้องกับการบิดเบี้ยวและเลเยอร์หนาแน่น)

ในทางกลับกัน โทรศัพท์มือถือสมัยใหม่ส่วนใหญ่มีชิปที่จัดการการทำงานหนักเหล่านี้ได้ดีกว่า การใช้พวกมันสำหรับการทำงานของโครงข่ายประสาทเทียมนั้นให้ประโยชน์มหาศาลในแง่ของเวลาแฝงและประสิทธิภาพพลังงาน ตัวอย่างเช่น GPU สามารถให้เวลาแฝงได้เร็วถึง 5 เท่า ในขณะที่ Qualcomm® Hexagon DSP แสดงให้เห็นว่าลดการใช้พลังงานลงได้มากถึง 75% ในการทดลองของเรา

ตัวเร่งความเร็วเหล่านี้แต่ละตัวมี API ที่เกี่ยวข้องกันซึ่งเปิดใช้งานการคำนวณแบบกำหนดเอง เช่น OpenCL หรือ OpenGL ES สำหรับ GPU มือถือและ Qualcomm® Hexagon SDK สำหรับ DSP โดยปกติ คุณจะต้องเขียนโค้ดที่กำหนดเองจำนวนมากเพื่อเรียกใช้โครงข่ายประสาทเทียมผ่านอินเทอร์เฟซเหล่านี้ สิ่งต่าง ๆ จะซับซ้อนยิ่งขึ้นเมื่อคุณพิจารณาว่าตัวเร่งความเร็วแต่ละตัวมีข้อดีและข้อเสียและไม่สามารถดำเนินการทุกอย่างในเครือข่ายประสาทได้ Delegate API ของ TensorFlow Lite แก้ปัญหานี้โดยทำหน้าที่เป็นสะพานเชื่อมระหว่างรันไทม์ TFLite และ API ระดับล่างเหล่านี้

รันไทม์กับผู้รับมอบสิทธิ์

การเลือกตัวแทน

TensorFlow Lite รองรับผู้ได้รับมอบหมายหลายคน ซึ่งแต่ละรายได้รับการปรับให้เหมาะสมสำหรับแพลตฟอร์มบางประเภทและบางรุ่น โดยปกติ จะมีตัวแทนหลายคนที่เกี่ยวข้องกับกรณีการใช้งานของคุณ ขึ้นอยู่กับเกณฑ์หลักสองประการ: แพลตฟอร์ม (Android หรือ iOS?) ที่คุณกำหนดเป้าหมาย และ ประเภทโมเดล (จุดลอยตัวหรือเชิงปริมาณ) ที่คุณพยายามเร่ง .

ผู้แทนโดย Platform

ข้ามแพลตฟอร์ม (Android และ iOS)

  • ผู้แทน GPU - ผู้แทน GPU สามารถใช้ได้ทั้งบน Android และ iOS ได้รับการปรับให้เหมาะสมเพื่อเรียกใช้รุ่น 32 บิตและ 16 บิตแบบลอยซึ่งมี GPU นอกจากนี้ยังรองรับโมเดลควอนไทซ์ 8 บิตและให้ประสิทธิภาพของ GPU เทียบเท่ากับรุ่นโฟลต สำหรับรายละเอียดเกี่ยวกับผู้แทน GPU โปรดดู TensorFlow Lite บน GPU สำหรับบทช่วยสอนทีละขั้นตอนเกี่ยวกับการใช้ผู้รับมอบสิทธิ์ GPU กับ Android และ iOS โปรดดู บทแนะนำ TensorFlow Lite GPU Delegate

Android

  • ผู้รับมอบสิทธิ์ NNAPI สำหรับอุปกรณ์ Android รุ่นใหม่ - สามารถใช้ตัวแทน NNAPI เพื่อเร่งความเร็วโมเดลบนอุปกรณ์ Android ที่มี GPU, DSP และ / หรือ NPU พร้อมใช้งาน มีให้บริการใน Android 8.1 (API 27+) หรือสูงกว่า สำหรับภาพรวมของการมอบสิทธิ์ NNAPI คำแนะนำทีละขั้นตอน และแนวทางปฏิบัติที่ดีที่สุด โปรดดู ที่ ผู้รับมอบสิทธิ์ NNAPI ของ TensorFlow Lite
  • ผู้รับมอบสิทธิ์หกเหลี่ยมสำหรับอุปกรณ์ Android รุ่นเก่า - สามารถใช้ผู้รับมอบสิทธิ์หกเหลี่ยมเพื่อเร่งความเร็วโมเดลบนอุปกรณ์ Android ที่มี Qualcomm Hexagon DSP สามารถใช้กับอุปกรณ์ที่ใช้ Android เวอร์ชันเก่าที่ไม่รองรับ NNAPI ดู ผู้รับมอบสิทธิ์ TensorFlow Lite Hexagon สำหรับรายละเอียดเพิ่มเติม

iOS

  • ผู้รับมอบสิทธิ์ Core ML สำหรับ iPhone และ iPad รุ่นใหม่กว่า - สำหรับ iPhone และ iPad รุ่นใหม่ที่มี Neural Engine ให้ใช้งาน คุณสามารถใช้ผู้รับมอบสิทธิ์ Core ML เพื่อเร่งการอนุมานสำหรับรุ่นทศนิยม 32 บิตหรือ 16 บิต Neural Engine พร้อมใช้งานกับอุปกรณ์พกพา Apple ที่มี A12 SoC หรือสูงกว่า สำหรับภาพรวมของการมอบสิทธิ์ Core ML และคำแนะนำทีละขั้นตอน โปรดดู ที่ ผู้รับมอบสิทธิ์ TensorFlow Lite Core ML

ผู้แทนตามประเภทรุ่น

ตัวเร่งความเร็วแต่ละตัวได้รับการออกแบบโดยคำนึงถึงความกว้างบิตของข้อมูล หากคุณระบุโมเดลทศนิยมให้กับผู้รับมอบสิทธิ์ที่สนับสนุนการดำเนินการเชิงปริมาณ 8 บิตเท่านั้น (เช่น Hexagon delegate ) โมเดลจะปฏิเสธการดำเนินการทั้งหมดและโมเดลจะทำงานบน CPU ทั้งหมด เพื่อหลีกเลี่ยงความประหลาดใจดังกล่าว ตารางด้านล่างให้ภาพรวมของการสนับสนุนผู้ร่วมประชุมตามประเภทรุ่น:

ประเภทรุ่น GPU นภาภรณ์ หกเหลี่ยม CoreML
จุดลอยตัว (32 บิต) ใช่ ใช่ ไม่ ใช่
ภายหลังการฝึกอบรม float16 quantization ใช่ ไม่ ไม่ ใช่
การหาปริมาณช่วงไดนามิกหลังการฝึก ใช่ ใช่ ไม่ ไม่
การหาจำนวนเต็มหลังการฝึก ใช่ ใช่ ใช่ ไม่
การฝึกอบรมเชิงปริมาณที่ตระหนักถึง ใช่ ใช่ ใช่ ไม่

กำลังตรวจสอบประสิทธิภาพ

ข้อมูลในส่วนนี้ทำหน้าที่เป็นแนวทางคร่าวๆ สำหรับการคัดเลือกตัวแทนที่สามารถปรับปรุงใบสมัครของคุณได้ อย่างไรก็ตาม สิ่งสำคัญที่ควรทราบคือผู้รับมอบสิทธิ์แต่ละรายมีชุดการทำงานที่กำหนดไว้ล่วงหน้าซึ่งสนับสนุน และอาจดำเนินการแตกต่างกันไปขึ้นอยู่กับรุ่นและอุปกรณ์ ตัวอย่างเช่น ผู้รับมอบสิทธิ์ NNAPI อาจเลือกใช้ Edge-TPU ของ Google บนโทรศัพท์ Pixel ในขณะที่ใช้ DSP บนอุปกรณ์อื่น ดังนั้น ขอแนะนำให้คุณทำการเปรียบเทียบเพื่อประเมินว่าผู้รับมอบสิทธิ์มีประโยชน์ต่อความต้องการของคุณเพียงใด นอกจากนี้ยังช่วยปรับการเพิ่มขนาดไบนารีที่เกี่ยวข้องกับการแนบผู้รับมอบสิทธิ์กับรันไทม์ TensorFlow Lite

TensorFlow Lite มีประสิทธิภาพที่ครอบคลุมและเครื่องมือในการประเมินความถูกต้อง ซึ่งช่วยให้นักพัฒนามีความมั่นใจในการใช้ตัวแทนในแอปพลิเคชันของตน เครื่องมือเหล่านี้จะกล่าวถึงในหัวข้อถัดไป

เครื่องมือสำหรับการประเมินผล

ความหน่วงแฝง & รอยเท้าหน่วยความจำ

เครื่องมือเบนช์มาร์กของ TensorFlow Lite สามารถใช้กับพารามิเตอร์ที่เหมาะสมเพื่อประเมินประสิทธิภาพของโมเดล ซึ่งรวมถึงเวลาแฝงในการอนุมานโดยเฉลี่ย โอเวอร์เฮดการเริ่มต้นใช้งาน หน่วยความจำที่ใช้ตามรอย ฯลฯ เครื่องมือนี้สนับสนุนแฟล็กหลายอันเพื่อกำหนดคอนฟิกูเรชันผู้รับมอบสิทธิ์ที่ดีที่สุดสำหรับโมเดลของคุณ ตัวอย่างเช่น --gpu_backend=gl สามารถระบุได้ด้วย --use_gpu เพื่อวัดการทำงานของ GPU ด้วย OpenGL รายการพารามิเตอร์ผู้รับมอบสิทธิ์ที่รองรับทั้งหมดมีการกำหนดไว้ใน เอกสารประกอบโดยละเอียด

นี่คือตัวอย่างที่รันสำหรับโมเดลเชิงปริมาณด้วย GPU ผ่าน adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

คุณสามารถดาวน์โหลดเครื่องมือนี้ในเวอร์ชันที่สร้างไว้ล่วงหน้าสำหรับ Android สถาปัตยกรรม ARM 64 บิตได้ ที่นี่ ( รายละเอียดเพิ่มเติม )

ความถูกต้องแม่นยำ

ตัวแทนมักจะทำการคำนวณด้วยความแม่นยำที่แตกต่างจากคู่ของ CPU เป็นผลให้มีการแลกเปลี่ยนความแม่นยำ (ปกติเล็กน้อย) ที่เกี่ยวข้องกับการใช้ผู้รับมอบสิทธิ์สำหรับการเร่งฮาร์ดแวร์ โปรดทราบว่าสิ่งนี้ไม่เป็นความจริง เสมอไป ตัวอย่างเช่น เนื่องจาก GPU ใช้ความแม่นยำจุดลอยตัวเพื่อเรียกใช้แบบจำลองเชิงปริมาณ อาจมีการปรับปรุงความแม่นยำเล็กน้อย (เช่น การปรับปรุง <1% Top-5 ในการจัดประเภทภาพ ILSVRC)

TensorFlow Lite มีเครื่องมือสองประเภทในการวัดว่าผู้รับมอบสิทธิ์ทำงานอย่างไรสำหรับโมเดลที่กำหนด: Task-Based และ Task-Agnostic เครื่องมือทั้งหมดที่อธิบายไว้ในส่วนนี้สนับสนุน พารามิเตอร์การมอบหมายขั้นสูงที่ ใช้โดยเครื่องมือการเปรียบเทียบจากส่วนก่อนหน้า โปรดทราบว่าส่วนย่อยด้านล่างเน้นที่ การประเมินผู้รับมอบสิทธิ์ (ผู้รับมอบสิทธิ์ดำเนินการเหมือนกับ CPU หรือไม่) มากกว่าการประเมินแบบจำลอง (ตัวแบบเองนั้นดีสำหรับงานหรือไม่)

การประเมินตามงาน

TensorFlow Lite มีเครื่องมือในการประเมินความถูกต้องของงานตามรูปภาพสองงาน:

ไบนารีที่สร้างไว้ล่วงหน้าของเครื่องมือเหล่านี้ (Android, สถาปัตยกรรม ARM 64 บิต) พร้อมด้วยเอกสารประกอบสามารถพบได้ที่นี่:

ตัวอย่างด้านล่างแสดง การประเมินการจัดประเภทรูปภาพ ด้วย NNAPI โดยใช้ Edge-TPU ของ Google บน Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

ผลลัพธ์ที่คาดหวังคือรายการของตัวชี้วัด Top-K ตั้งแต่ 1 ถึง 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

การประเมินงานแบบไม่เชื่อเรื่องพระเจ้า

สำหรับงานที่ไม่มีเครื่องมือประเมินผลในอุปกรณ์ หรือหากคุณกำลังทดลองกับโมเดลที่กำหนดเอง TensorFlow Lite มีเครื่องมือ Inference Diff (Android, ไบนารีสถาปัตยกรรมไบนารี ARM 64 บิต ที่นี่ )

Inference Diff เปรียบเทียบการดำเนินการของ TensorFlow Lite (ในแง่ของความหน่วงแฝง & ส่วนเบี่ยงเบนค่าเอาต์พุต) ในการตั้งค่าสองแบบ:

ในการดำเนินการดังกล่าว เครื่องมือจะสร้างข้อมูลเกาส์เซียนแบบสุ่มและส่งผ่านผ่านล่าม TFLite สองตัว - ตัวหนึ่งใช้งานเคอร์เนล CPU แบบเธรดเดียว และอีกตัวสร้างพารามิเตอร์ตามอาร์กิวเมนต์ของผู้ใช้

โดยจะวัดเวลาแฝงของทั้งสอง ตลอดจนความแตกต่างที่แน่นอนระหว่างเทนเซอร์เอาต์พุตจากล่ามแต่ละตัวตามองค์ประกอบ

สำหรับรุ่นที่มีเทนเซอร์เอาต์พุตเดียว เอาต์พุตอาจมีลักษณะดังนี้:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

สิ่งนี้หมายความว่าสำหรับเอาต์พุตเทนเซอร์ที่ดัชนี 0 องค์ประกอบจากเอาต์พุตของ CPU แตกต่างจากเอาต์พุตของผู้รับมอบสิทธิ์โดยเฉลี่ย 1.96e-05

โปรดทราบว่าการตีความตัวเลขเหล่านี้ต้องใช้ความรู้เชิงลึกเกี่ยวกับแบบจำลอง และความหมายของเมตริกซ์เอาต์พุตแต่ละตัว หากเป็นการถดถอยอย่างง่ายที่กำหนดคะแนนหรือการฝัง ความแตกต่างควรต่ำ (มิฉะนั้น จะเป็นข้อผิดพลาดกับผู้รับมอบสิทธิ์) อย่างไรก็ตาม เอาต์พุตเช่น 'คลาสการตรวจจับ' จากรุ่น SSD นั้นตีความได้ยากกว่าเล็กน้อย ตัวอย่างเช่น อาจแสดงความแตกต่างโดยใช้เครื่องมือนี้ แต่นั่นอาจไม่ได้หมายความว่ามีบางอย่างผิดปกติกับผู้รับมอบสิทธิ์: พิจารณาสองคลาส (ปลอม): "TV (ID: 10)", "Monitor (ID:20)" - ถ้า ตัวแทนออกจากความจริงสีทองเล็กน้อยและแสดงมอนิเตอร์แทนทีวี เอาต์พุตต่างสำหรับเทนเซอร์นี้อาจสูงถึง 20-10 = 10

,

บทนำ

ผู้รับมอบสิทธิ์ เปิดใช้งานการเร่งด้วยฮาร์ดแวร์ของรุ่น TensorFlow Lite โดยใช้ประโยชน์จากตัวเร่งความเร็วในอุปกรณ์ เช่น GPU และ ตัวประมวลผลสัญญาณดิจิทัล (DSP)

ตามค่าเริ่มต้น TensorFlow Lite จะใช้เคอร์เนลของ CPU ที่ได้รับการปรับให้เหมาะสมสำหรับชุดคำสั่ง ARM Neon อย่างไรก็ตาม CPU เป็นตัวประมวลผลอเนกประสงค์ที่ไม่จำเป็นต้องปรับให้เหมาะสมสำหรับเลขคณิตหนักที่มักพบในแบบจำลองการเรียนรู้ของเครื่อง (เช่น คณิตศาสตร์เมทริกซ์ที่เกี่ยวข้องกับการบิดเบี้ยวและเลเยอร์หนาแน่น)

ในทางกลับกัน โทรศัพท์มือถือสมัยใหม่ส่วนใหญ่มีชิปที่จัดการการทำงานหนักเหล่านี้ได้ดีกว่า การใช้พวกมันสำหรับการทำงานของโครงข่ายประสาทเทียมนั้นให้ประโยชน์มหาศาลในแง่ของเวลาแฝงและประสิทธิภาพพลังงาน ตัวอย่างเช่น GPU สามารถให้เวลาแฝงได้เร็วถึง 5 เท่า ในขณะที่ Qualcomm® Hexagon DSP แสดงให้เห็นว่าลดการใช้พลังงานลงได้มากถึง 75% ในการทดลองของเรา

ตัวเร่งความเร็วเหล่านี้แต่ละตัวมี API ที่เกี่ยวข้องกันซึ่งเปิดใช้งานการคำนวณแบบกำหนดเอง เช่น OpenCL หรือ OpenGL ES สำหรับ GPU มือถือและ Qualcomm® Hexagon SDK สำหรับ DSP โดยปกติ คุณจะต้องเขียนโค้ดที่กำหนดเองจำนวนมากเพื่อเรียกใช้โครงข่ายประสาทเทียมผ่านอินเทอร์เฟซเหล่านี้ สิ่งต่าง ๆ จะซับซ้อนยิ่งขึ้นเมื่อคุณพิจารณาว่าตัวเร่งความเร็วแต่ละตัวมีข้อดีและข้อเสียและไม่สามารถดำเนินการทุกอย่างในเครือข่ายประสาทได้ Delegate API ของ TensorFlow Lite แก้ปัญหานี้โดยทำหน้าที่เป็นสะพานเชื่อมระหว่างรันไทม์ TFLite และ API ระดับล่างเหล่านี้

รันไทม์กับผู้รับมอบสิทธิ์

การเลือกตัวแทน

TensorFlow Lite รองรับผู้ได้รับมอบหมายหลายคน ซึ่งแต่ละรายได้รับการปรับให้เหมาะสมสำหรับแพลตฟอร์มบางประเภทและบางรุ่น โดยปกติ จะมีตัวแทนหลายคนที่เกี่ยวข้องกับกรณีการใช้งานของคุณ ขึ้นอยู่กับเกณฑ์หลักสองประการ: แพลตฟอร์ม (Android หรือ iOS?) ที่คุณกำหนดเป้าหมาย และ ประเภทโมเดล (จุดลอยตัวหรือเชิงปริมาณ) ที่คุณพยายามเร่ง .

ผู้แทนโดย Platform

ข้ามแพลตฟอร์ม (Android และ iOS)

  • ผู้แทน GPU - ผู้แทน GPU สามารถใช้ได้ทั้งบน Android และ iOS ได้รับการปรับให้เหมาะสมเพื่อเรียกใช้รุ่น 32 บิตและ 16 บิตแบบลอยซึ่งมี GPU นอกจากนี้ยังรองรับโมเดลควอนไทซ์ 8 บิตและให้ประสิทธิภาพของ GPU เทียบเท่ากับรุ่นโฟลต สำหรับรายละเอียดเกี่ยวกับผู้แทน GPU โปรดดู TensorFlow Lite บน GPU สำหรับบทช่วยสอนทีละขั้นตอนเกี่ยวกับการใช้ผู้รับมอบสิทธิ์ GPU กับ Android และ iOS โปรดดู บทแนะนำ TensorFlow Lite GPU Delegate

Android

  • ผู้รับมอบสิทธิ์ NNAPI สำหรับอุปกรณ์ Android รุ่นใหม่ - สามารถใช้ตัวแทน NNAPI เพื่อเร่งความเร็วโมเดลบนอุปกรณ์ Android ที่มี GPU, DSP และ / หรือ NPU พร้อมใช้งาน มีให้บริการใน Android 8.1 (API 27+) หรือสูงกว่า สำหรับภาพรวมของการมอบสิทธิ์ NNAPI คำแนะนำทีละขั้นตอน และแนวทางปฏิบัติที่ดีที่สุด โปรดดู ที่ ผู้รับมอบสิทธิ์ NNAPI ของ TensorFlow Lite
  • ผู้รับมอบสิทธิ์หกเหลี่ยมสำหรับอุปกรณ์ Android รุ่นเก่า - สามารถใช้ผู้รับมอบสิทธิ์หกเหลี่ยมเพื่อเร่งความเร็วโมเดลบนอุปกรณ์ Android ที่มี Qualcomm Hexagon DSP สามารถใช้กับอุปกรณ์ที่ใช้ Android เวอร์ชันเก่าที่ไม่รองรับ NNAPI ดู ผู้รับมอบสิทธิ์ TensorFlow Lite Hexagon สำหรับรายละเอียดเพิ่มเติม

iOS

  • ผู้รับมอบสิทธิ์ Core ML สำหรับ iPhone และ iPad รุ่นใหม่กว่า - สำหรับ iPhone และ iPad รุ่นใหม่ที่มี Neural Engine ให้ใช้งาน คุณสามารถใช้ผู้รับมอบสิทธิ์ Core ML เพื่อเร่งการอนุมานสำหรับรุ่นทศนิยม 32 บิตหรือ 16 บิต Neural Engine พร้อมใช้งานกับอุปกรณ์พกพา Apple ที่มี A12 SoC หรือสูงกว่า สำหรับภาพรวมของการมอบสิทธิ์ Core ML และคำแนะนำทีละขั้นตอน โปรดดู ที่ ผู้รับมอบสิทธิ์ TensorFlow Lite Core ML

ผู้แทนตามประเภทรุ่น

ตัวเร่งความเร็วแต่ละตัวได้รับการออกแบบโดยคำนึงถึงความกว้างบิตของข้อมูล หากคุณระบุโมเดลทศนิยมให้กับผู้รับมอบสิทธิ์ที่สนับสนุนการดำเนินการเชิงปริมาณ 8 บิตเท่านั้น (เช่น Hexagon delegate ) โมเดลจะปฏิเสธการดำเนินการทั้งหมดและโมเดลจะทำงานบน CPU ทั้งหมด เพื่อหลีกเลี่ยงความประหลาดใจดังกล่าว ตารางด้านล่างให้ภาพรวมของการสนับสนุนผู้ร่วมประชุมตามประเภทรุ่น:

ประเภทรุ่น GPU นภาภรณ์ หกเหลี่ยม CoreML
จุดลอยตัว (32 บิต) ใช่ ใช่ ไม่ ใช่
ภายหลังการฝึกอบรม float16 quantization ใช่ ไม่ ไม่ ใช่
การหาปริมาณช่วงไดนามิกหลังการฝึก ใช่ ใช่ ไม่ ไม่
การหาจำนวนเต็มหลังการฝึก ใช่ ใช่ ใช่ ไม่
การฝึกอบรมเชิงปริมาณที่ตระหนักถึง ใช่ ใช่ ใช่ ไม่

กำลังตรวจสอบประสิทธิภาพ

ข้อมูลในส่วนนี้ทำหน้าที่เป็นแนวทางคร่าวๆ สำหรับการคัดเลือกตัวแทนที่สามารถปรับปรุงใบสมัครของคุณได้ อย่างไรก็ตาม สิ่งสำคัญที่ควรทราบคือผู้รับมอบสิทธิ์แต่ละรายมีชุดการทำงานที่กำหนดไว้ล่วงหน้าซึ่งสนับสนุน และอาจดำเนินการแตกต่างกันไปขึ้นอยู่กับรุ่นและอุปกรณ์ ตัวอย่างเช่น ผู้รับมอบสิทธิ์ NNAPI อาจเลือกใช้ Edge-TPU ของ Google บนโทรศัพท์ Pixel ในขณะที่ใช้ DSP บนอุปกรณ์อื่น ดังนั้น ขอแนะนำให้คุณทำการเปรียบเทียบเพื่อประเมินว่าผู้รับมอบสิทธิ์มีประโยชน์ต่อความต้องการของคุณเพียงใด นอกจากนี้ยังช่วยปรับการเพิ่มขนาดไบนารีที่เกี่ยวข้องกับการแนบผู้รับมอบสิทธิ์กับรันไทม์ TensorFlow Lite

TensorFlow Lite มีประสิทธิภาพที่ครอบคลุมและเครื่องมือในการประเมินความถูกต้อง ซึ่งช่วยให้นักพัฒนามีความมั่นใจในการใช้ตัวแทนในแอปพลิเคชันของตน เครื่องมือเหล่านี้จะกล่าวถึงในหัวข้อถัดไป

เครื่องมือสำหรับการประเมินผล

ความหน่วงแฝง & รอยเท้าหน่วยความจำ

เครื่องมือเบนช์มาร์กของ TensorFlow Lite สามารถใช้กับพารามิเตอร์ที่เหมาะสมเพื่อประเมินประสิทธิภาพของโมเดล ซึ่งรวมถึงเวลาแฝงในการอนุมานโดยเฉลี่ย โอเวอร์เฮดการเริ่มต้นใช้งาน หน่วยความจำที่ใช้ตามรอย ฯลฯ เครื่องมือนี้สนับสนุนแฟล็กหลายอันเพื่อกำหนดคอนฟิกูเรชันผู้รับมอบสิทธิ์ที่ดีที่สุดสำหรับโมเดลของคุณ ตัวอย่างเช่น --gpu_backend=gl สามารถระบุได้ด้วย --use_gpu เพื่อวัดการทำงานของ GPU ด้วย OpenGL รายการพารามิเตอร์ผู้รับมอบสิทธิ์ที่รองรับทั้งหมดมีการกำหนดไว้ใน เอกสารประกอบโดยละเอียด

นี่คือตัวอย่างที่รันสำหรับโมเดลเชิงปริมาณด้วย GPU ผ่าน adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

คุณสามารถดาวน์โหลดเครื่องมือนี้ในเวอร์ชันที่สร้างไว้ล่วงหน้าสำหรับ Android สถาปัตยกรรม ARM 64 บิตได้ ที่นี่ ( รายละเอียดเพิ่มเติม )

ความถูกต้องแม่นยำ

ตัวแทนมักจะทำการคำนวณด้วยความแม่นยำที่แตกต่างจากคู่ของ CPU เป็นผลให้มีการแลกเปลี่ยนความแม่นยำ (ปกติเล็กน้อย) ที่เกี่ยวข้องกับการใช้ผู้รับมอบสิทธิ์สำหรับการเร่งฮาร์ดแวร์ โปรดทราบว่าสิ่งนี้ไม่เป็นความจริง เสมอไป ตัวอย่างเช่น เนื่องจาก GPU ใช้ความแม่นยำจุดลอยตัวเพื่อเรียกใช้แบบจำลองเชิงปริมาณ อาจมีการปรับปรุงความแม่นยำเล็กน้อย (เช่น การปรับปรุง <1% Top-5 ในการจัดประเภทภาพ ILSVRC)

TensorFlow Lite มีเครื่องมือสองประเภทในการวัดว่าผู้รับมอบสิทธิ์ทำงานอย่างไรสำหรับโมเดลที่กำหนด: Task-Based และ Task-Agnostic เครื่องมือทั้งหมดที่อธิบายไว้ในส่วนนี้สนับสนุน พารามิเตอร์การมอบหมายขั้นสูงที่ ใช้โดยเครื่องมือการเปรียบเทียบจากส่วนก่อนหน้า โปรดทราบว่าส่วนย่อยด้านล่างเน้นที่ การประเมินผู้รับมอบสิทธิ์ (ผู้รับมอบสิทธิ์ดำเนินการเหมือนกับ CPU หรือไม่) มากกว่าการประเมินแบบจำลอง (ตัวแบบเองนั้นดีสำหรับงานหรือไม่)

การประเมินตามงาน

TensorFlow Lite มีเครื่องมือในการประเมินความถูกต้องของงานตามรูปภาพสองงาน:

ไบนารีที่สร้างไว้ล่วงหน้าของเครื่องมือเหล่านี้ (Android, สถาปัตยกรรม ARM 64 บิต) พร้อมด้วยเอกสารประกอบสามารถพบได้ที่นี่:

ตัวอย่างด้านล่างแสดง การประเมินการจัดประเภทรูปภาพ ด้วย NNAPI โดยใช้ Edge-TPU ของ Google บน Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

ผลลัพธ์ที่คาดหวังคือรายการของตัวชี้วัด Top-K ตั้งแต่ 1 ถึง 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

การประเมินงานแบบไม่เชื่อเรื่องพระเจ้า

สำหรับงานที่ไม่มีเครื่องมือประเมินผลในอุปกรณ์ หรือหากคุณกำลังทดลองกับโมเดลที่กำหนดเอง TensorFlow Lite มีเครื่องมือ Inference Diff (Android, ไบนารีสถาปัตยกรรมไบนารี ARM 64 บิต ที่นี่ )

Inference Diff เปรียบเทียบการดำเนินการของ TensorFlow Lite (ในแง่ของความหน่วงแฝง & ส่วนเบี่ยงเบนค่าเอาต์พุต) ในการตั้งค่าสองแบบ:

ในการดำเนินการดังกล่าว เครื่องมือจะสร้างข้อมูลเกาส์เซียนแบบสุ่มและส่งผ่านผ่านล่าม TFLite สองตัว - ตัวหนึ่งใช้งานเคอร์เนล CPU แบบเธรดเดียว และอีกตัวสร้างพารามิเตอร์ตามอาร์กิวเมนต์ของผู้ใช้

โดยจะวัดเวลาแฝงของทั้งสอง ตลอดจนความแตกต่างที่แน่นอนระหว่างเทนเซอร์เอาต์พุตจากล่ามแต่ละตัวตามองค์ประกอบ

สำหรับรุ่นที่มีเทนเซอร์เอาต์พุตเดียว เอาต์พุตอาจมีลักษณะดังนี้:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

สิ่งนี้หมายความว่าสำหรับเอาต์พุตเทนเซอร์ที่ดัชนี 0 องค์ประกอบจากเอาต์พุตของ CPU แตกต่างจากเอาต์พุตของผู้รับมอบสิทธิ์โดยเฉลี่ย 1.96e-05

โปรดทราบว่าการตีความตัวเลขเหล่านี้ต้องใช้ความรู้เชิงลึกเกี่ยวกับแบบจำลอง และความหมายของเมตริกซ์เอาต์พุตแต่ละตัว หากเป็นการถดถอยอย่างง่ายที่กำหนดคะแนนหรือการฝัง ความแตกต่างควรต่ำ (มิฉะนั้น จะเป็นข้อผิดพลาดกับผู้รับมอบสิทธิ์) อย่างไรก็ตาม เอาต์พุตเช่น 'คลาสการตรวจจับ' จากรุ่น SSD นั้นตีความได้ยากกว่าเล็กน้อย ตัวอย่างเช่น อาจแสดงความแตกต่างโดยใช้เครื่องมือนี้ แต่นั่นอาจไม่ได้หมายความว่ามีบางอย่างผิดปกติกับผู้รับมอบสิทธิ์: พิจารณาสองคลาส (ปลอม): "TV (ID: 10)", "Monitor (ID:20)" - ถ้า ตัวแทนออกจากความจริงสีทองเล็กน้อยและแสดงมอนิเตอร์แทนทีวี เอาต์พุตต่างสำหรับเทนเซอร์นี้อาจสูงถึง 20-10 = 10