ช่วยปกป้อง Great Barrier Reef กับ TensorFlow บน Kaggle เข้าร่วมท้าทาย

ตัวแทน 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?) ที่คุณกำหนดเป้าหมายและ Model-type (floating-point หรือ quantized?) ที่คุณพยายามเร่งความเร็ว .

ผู้รับมอบสิทธิ์ตามแพลตฟอร์ม

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

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

Android

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

ประเภทรุ่น GPU NNAPI หกเหลี่ยม 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 ใช้ความแม่นยำของจุดลอยตัวในการรันโมเดลเชิงปริมาณจึงอาจมีการปรับปรุงความแม่นยำเล็กน้อย (เช่นการปรับปรุงอันดับ 5 อันดับแรกของ ILSVRC <1%)

TensorFlow Lite มีเครื่องมือสองประเภทในการวัดว่าผู้รับมอบสิทธิ์ทำงานอย่างไรสำหรับโมเดลที่กำหนด: ตาม งาน และ ไม่เชื่อเรื่องพระเจ้า เครื่องมือทั้งหมดที่อธิบายไว้ในส่วนนี้สนับสนุน พารามิเตอร์การมอบสิทธิ์ขั้นสูงที่ ใช้โดยเครื่องมือเปรียบเทียบจากส่วนก่อนหน้า โปรดสังเกตว่าส่วนย่อยด้านล่างมุ่งเน้นไปที่ การประเมินผู้ร่วมประชุม (ผู้รับมอบสิทธิ์ทำงานเช่นเดียวกับ 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 (ไบนารีสถาปัตยกรรมไบนารี ARM 64 บิต ที่นี่ )

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

ในการทำเช่นนั้นเครื่องมือจะสร้างข้อมูล Gaussian แบบสุ่มและส่งผ่าน TFLite Interpreters สองตัวโดยตัวหนึ่งรันเคอร์เนล 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 นั้นตีความยากกว่าเล็กน้อย ตัวอย่างเช่นอาจแสดงความแตกต่างโดยใช้เครื่องมือนี้ แต่นั่นอาจไม่ได้หมายความว่ามีบางอย่างผิดปกติกับผู้รับมอบสิทธิ์: พิจารณาคลาส (ปลอม) 2 คลาส: "TV (ID: 10)", "Monitor (ID: 20)" - หาก ผู้ร่วมประชุมมองข้ามความจริงสีทองเล็กน้อยและแสดงจอภาพแทนที่จะเป็นทีวีเอาต์พุตที่แตกต่างกันสำหรับเทนเซอร์นี้อาจมีค่าสูงถึง 20-10 = 10