มอบสิทธิ์ของ TensorFlow Lite

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

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

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

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

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

การเลือกผู้รับมอบสิทธิ์

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

การมอบสิทธิ์ตามแพลตฟอร์ม

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

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

iOS

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

การมอบสิทธิ์ตามประเภทโมเดล

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

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

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

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

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

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

เวลาในการตอบสนองและหน่วยความจำ

เครื่องมือเปรียบเทียบของ TensorFlow Lite สามารถใช้กับพารามิเตอร์ที่เหมาะสมเพื่อประเมินประสิทธิภาพของโมเดล ซึ่งรวมถึงเวลาในการตอบสนองของการอนุมานโดยเฉลี่ย โอเวอร์เฮดการเริ่มต้น การใช้หน่วยความจำ ฯลฯ เครื่องมือนี้รองรับ Flag หลายรายการเพื่อหาการกำหนดค่าการมอบสิทธิ์ที่ดีที่สุดสำหรับโมเดลของคุณ สำหรับอินสแตนซ์ คุณสามารถระบุ --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% คือการปรับปรุงสูงสุด 5 อันดับแรกในการจัดประเภทรูปภาพ ILSVRC)

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

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

TensorFlow Lite มีเครื่องมือในการประเมินความถูกต้องสำหรับงาน 2 อย่างที่ใช้รูปภาพ ดังนี้

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

ตัวอย่างด้านล่างแสดงให้เห็นการประเมินการจัดประเภทรูปภาพด้วย GPU ใน 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_gpu=true

ผลลัพธ์ที่คาดไว้คือรายการเมตริก 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

การประเมินความรู้ด้านงาน (Task-Agnostic Evaluation)

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

ความแตกต่างของการอนุมานจะเปรียบเทียบการดำเนินการของ TensorFlow Lite (ในแง่ของเวลาในการตอบสนองและส่วนเบี่ยงเบนของค่าเอาต์พุต) ใน 2 การตั้งค่าต่อไปนี้

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

ซึ่งจะวัดเวลาในการตอบสนองของทั้ง 2 อย่าง รวมถึงความแตกต่างสัมบูรณ์ระหว่าง Tensor เอาต์พุตจากล่ามแต่ละตัวตามองค์ประกอบ

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

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

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

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