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

การแนะนำ

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

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

ในทางกลับกัน โทรศัพท์มือถือสมัยใหม่ส่วนใหญ่มีชิปที่รับมือกับการทำงานหนักเหล่านี้ได้ดีกว่า การใช้สิ่งเหล่านี้เพื่อการดำเนินงานโครงข่ายประสาทเทียมให้ประโยชน์อย่างมากในแง่ของเวลาแฝงและประสิทธิภาพการใช้พลังงาน ตัวอย่างเช่น 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?) ที่คุณกำหนดเป้าหมาย และ ประเภทโมเดล (จุดลอยตัวหรือเชิงปริมาณ?) ที่คุณพยายามเร่งความเร็ว .

ผู้ได้รับมอบหมายตามแพลตฟอร์ม

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

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

หุ่นยนต์

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

ไอโอเอส

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

ผู้รับมอบสิทธิ์ตามประเภทรุ่น

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

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

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

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

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

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

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

ไบนารีที่สร้างไว้ล่วงหน้าของเครื่องมือเหล่านี้ (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 (ไบนารีสถาปัตยกรรมไบนารี ARM 64 บิต ที่นี่ )

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

ในการทำเช่นนั้น เครื่องมือจะสร้างข้อมูล Gaussian แบบสุ่มและส่งผ่านตัวแปล 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