การใช้หน่วยประมวลผลกราฟิก (GPU) เพื่อเรียกใช้โมเดลแมชชีนเลิร์นนิง (ML) ของคุณสามารถปรับปรุงประสิทธิภาพของโมเดลและประสบการณ์ผู้ใช้ของแอปพลิเคชันที่เปิดใช้งาน ML ได้อย่างมาก TensorFlow Lite ช่วยให้สามารถใช้ GPU และโปรเซสเซอร์พิเศษอื่นๆ ผ่านไดรเวอร์ฮาร์ดแวร์ที่เรียกว่า ผู้รับมอบสิทธิ์ การเปิดใช้งาน GPU กับแอปพลิเคชัน TensorFlow Lite ML สามารถให้ประโยชน์ดังต่อไปนี้:
- ความเร็ว - GPU สร้างขึ้นสำหรับปริมาณงานปริมาณมากแบบคู่ขนาน การออกแบบนี้ทำให้เหมาะอย่างยิ่งสำหรับโครงข่ายประสาทเทียมระดับลึก ซึ่งประกอบด้วยตัวดำเนินการจำนวนมาก แต่ละตัวทำงานบนอินพุตเทนเซอร์ที่สามารถประมวลผลแบบขนานได้ ซึ่งโดยทั่วไปแล้วจะส่งผลให้มีเวลาแฝงที่ต่ำกว่า ในสถานการณ์ที่ดีที่สุด การเรียกใช้โมเดลของคุณบน GPU อาจทำงานเร็วพอที่จะเปิดใช้งานแอปพลิเคชันแบบเรียลไทม์ที่ไม่สามารถทำได้ก่อนหน้านี้
- ประสิทธิภาพการใช้พลังงาน - GPU ทำการคำนวณ ML ได้อย่างมีประสิทธิภาพและเหมาะสมที่สุด โดยทั่วไปแล้วจะใช้พลังงานน้อยกว่าและสร้างความร้อนน้อยกว่างานเดียวกันที่ทำงานบน CPU
เอกสารนี้แสดงภาพรวมของการรองรับ GPU ใน TensorFlow Lite และการใช้งานขั้นสูงบางอย่างสำหรับโปรเซสเซอร์ GPU สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปรับใช้การรองรับ GPU บนแพลตฟอร์มเฉพาะ โปรดดูคำแนะนำต่อไปนี้:
รองรับการทำงานของ GPU ML
มีข้อจำกัดบางประการเกี่ยวกับการดำเนินการของ TensorFlow ML หรือ ops ที่ผู้รับมอบสิทธิ์ GPU TensorFlow Lite สามารถเร่งความเร็วได้ ผู้รับมอบสิทธิ์สนับสนุน ops ต่อไปนี้ในความแม่นยำโฟลต 16 บิตและ 32 บิต:
-
ADD
-
AVERAGE_POOL_2D
-
CONCATENATION
-
CONV_2D
-
DEPTHWISE_CONV_2D v1-2
-
EXP
-
FULLY_CONNECTED
-
LOGICAL_AND
-
LOGISTIC
-
LSTM v2 (Basic LSTM only)
-
MAX_POOL_2D
-
MAXIMUM
-
MINIMUM
-
MUL
-
PAD
-
PRELU
-
RELU
-
RELU6
-
RESHAPE
-
RESIZE_BILINEAR v1-3
-
SOFTMAX
-
STRIDED_SLICE
-
SUB
-
TRANSPOSE_CONV
ตามค่าเริ่มต้น ops ทั้งหมดได้รับการสนับสนุนในเวอร์ชัน 1 เท่านั้น การเปิดใช้งาน การสนับสนุนการกำหนดปริมาณ จะเปิดใช้งานเวอร์ชันที่เหมาะสม เช่น ADD v2
การแก้ไขปัญหาการสนับสนุน GPU
หากผู้รับมอบสิทธิ์ GPU ไม่สนับสนุน ops บางตัว เฟรมเวิร์กจะเรียกใช้กราฟเพียงบางส่วนบน GPU และส่วนที่เหลือบน CPU เนื่องจากการซิงโครไนซ์ CPU/GPU มีค่าใช้จ่ายสูง โหมดการดำเนินการแยกเช่นนี้มักส่งผลให้ประสิทธิภาพการทำงานช้าลงกว่าเมื่อเครือข่ายทั้งหมดทำงานบน CPU เพียงอย่างเดียว ในกรณีนี้ แอปพลิเคชันจะสร้างคำเตือน เช่น:
WARNING: op code #42 cannot be handled by this delegate.
ไม่มีการเรียกกลับสำหรับความล้มเหลวประเภทนี้ เนื่องจากนี่ไม่ใช่ความล้มเหลวขณะทำงานจริง เมื่อทดสอบการทำงานของโมเดลของคุณกับผู้รับมอบสิทธิ์ GPU คุณควรระวังคำเตือนเหล่านี้ คำเตือนเหล่านี้จำนวนมากสามารถบ่งชี้ว่าโมเดลของคุณไม่เหมาะที่สุดสำหรับการใช้งานสำหรับการเร่งความเร็ว GPU และอาจต้องมีการรีแฟคเตอร์โมเดล
ตัวอย่างโมเดล
โมเดลตัวอย่างต่อไปนี้สร้างขึ้นเพื่อใช้ประโยชน์จากการเร่ง GPU ด้วย TensorFlow Lite และมีไว้สำหรับการอ้างอิงและการทดสอบ:
- การจัดประเภทรูปภาพ MobileNet v1 (224x224) - แบบจำลองการจัดประเภทรูปภาพที่ออกแบบมาสำหรับแอปพลิเคชันการมองเห็นบนมือถือและแบบฝังตัว ( นางแบบ )
- การแบ่งส่วน DeepLab (257x257) - โมเดลการแบ่งส่วนภาพที่กำหนดป้ายกำกับความหมาย เช่น สุนัข แมว รถยนต์ ให้กับทุกพิกเซลในภาพอินพุต ( นางแบบ )
- การตรวจจับวัตถุ MobileNet SSD - แบบจำลองการจัดประเภทรูปภาพที่ตรวจจับวัตถุหลายชิ้นพร้อมกล่องที่มีขอบเขต ( นางแบบ )
- PoseNet สำหรับการประเมินท่าทาง - โมเดลการมองเห็นที่ประเมินท่าทางของผู้คนในภาพหรือวิดีโอ ( นางแบบ )
การเพิ่มประสิทธิภาพสำหรับ GPU
เทคนิคต่อไปนี้สามารถช่วยให้คุณได้รับประสิทธิภาพที่ดีขึ้นเมื่อเรียกใช้โมเดลบนฮาร์ดแวร์ GPU โดยใช้ผู้รับมอบสิทธิ์ TensorFlow Lite GPU:
ปรับรูปแบบการดำเนินการ - การดำเนินการบางอย่างที่รวดเร็วบน CPU อาจมีค่าใช้จ่ายสูงสำหรับ GPU บนอุปกรณ์พกพา การดำเนินการเปลี่ยนรูปร่างนั้นมีค่าใช้จ่ายสูงมากในการรัน รวมถึง
BATCH_TO_SPACE
,SPACE_TO_BATCH
,SPACE_TO_DEPTH
และอื่นๆ คุณควรตรวจสอบการใช้การดำเนินการเปลี่ยนรูปร่างอย่างใกล้ชิด และพิจารณาว่าอาจนำไปใช้เฉพาะกับการสำรวจข้อมูลหรือสำหรับการทำซ้ำในช่วงต้นของโมเดลของคุณ การลบออกสามารถปรับปรุงประสิทธิภาพได้อย่างมากช่องข้อมูลภาพ - บน GPU ข้อมูลเทนเซอร์จะถูกแบ่งออกเป็น 4 ช่อง ดังนั้นการคำนวณบนเทนเซอร์ที่มีรูปร่าง
[B,H,W,5]
จะทำงานใกล้เคียงกันบนเทนเซอร์ที่มีรูปร่าง[B,H,W,8]
แต่แย่กว่า[B,H,W,4]
อย่างมาก หากฮาร์ดแวร์กล้องที่คุณใช้รองรับเฟรมภาพใน RGBA การป้อนอินพุต 4 แชนเนลนั้นจะเร็วกว่ามาก เนื่องจากจะหลีกเลี่ยงการคัดลอกหน่วยความจำจาก RGB 3 แชนเนลเป็น RGBX 4 แชนเนลโมเดลที่ปรับให้เหมาะกับมือถือ - เพื่อประสิทธิภาพที่ดีที่สุด คุณควรพิจารณาฝึกตัวแยกประเภทของคุณใหม่ด้วยสถาปัตยกรรมเครือข่ายที่ปรับให้เหมาะกับมือถือ การเพิ่มประสิทธิภาพสำหรับการอนุมานบนอุปกรณ์สามารถลดเวลาแฝงและการใช้พลังงานได้อย่างมากโดยการใช้ประโยชน์จากคุณสมบัติของฮาร์ดแวร์มือถือ
รองรับ GPU ขั้นสูง
คุณสามารถใช้เทคนิคขั้นสูงเพิ่มเติมกับการประมวลผล GPU เพื่อเปิดใช้งานประสิทธิภาพที่ดียิ่งขึ้นสำหรับโมเดลของคุณ รวมถึงการวัดปริมาณและการทำให้เป็นอนุกรม ส่วนต่อไปนี้จะอธิบายเทคนิคเหล่านี้ในรายละเอียดเพิ่มเติม
การใช้แบบจำลองเชิงปริมาณ
ส่วนนี้อธิบายวิธีที่ตัวแทน GPU เร่งโมเดลเชิงปริมาณ 8 บิต รวมถึงสิ่งต่อไปนี้:
- โมเดลที่ได้รับการฝึกฝนด้วย การฝึกอบรมเชิงปริมาณ
- การวัดช่วงไดนามิกเรนจ์ หลังการฝึก
- การวัดปริมาณจำนวนเต็ม หลังการฝึกอบรม
เพื่อปรับประสิทธิภาพให้เหมาะสมที่สุด ให้ใช้โมเดลที่มีทั้งเทนเซอร์อินพุตและเอาต์พุตทศนิยม
มันทำงานอย่างไร?
เนื่องจากแบ็กเอนด์ของ GPU รองรับเฉพาะการประมวลผลแบบทศนิยม เราจึงเรียกใช้แบบจำลองเชิงปริมาณโดยให้ 'มุมมองแบบจุดลอยตัว' ของแบบจำลองดั้งเดิม ในระดับสูง มีขั้นตอนต่อไปนี้:
เทนเซอร์คงที่ (เช่น น้ำหนัก/อคติ) จะถูกแยกปริมาณออกหนึ่งครั้งในหน่วยความจำ GPU การดำเนินการนี้เกิดขึ้นเมื่อเปิดใช้งานผู้รับมอบสิทธิ์สำหรับ TensorFlow Lite
อินพุตและเอาต์พุต ไปยังโปรแกรม GPU ถ้า 8-bit quantized จะถูก de-quantized และ quantized (ตามลำดับ) สำหรับการอนุมานแต่ละครั้ง การดำเนินการนี้ดำเนินการบน CPU โดยใช้เคอร์เนลที่ปรับให้เหมาะสมของ TensorFlow Lite
ตัวจำลองการวัดปริมาณ จะถูกแทรกระหว่างการดำเนินการเพื่อเลียนแบบพฤติกรรมเชิงปริมาณ วิธีการนี้จำเป็นสำหรับโมเดลที่ ops คาดหวังว่าการเปิดใช้งานจะเป็นไปตามขอบเขตที่เรียนรู้ระหว่างการวัดปริมาณ
สำหรับข้อมูลเกี่ยวกับการเปิดใช้งานคุณสมบัตินี้กับผู้รับมอบสิทธิ์ GPU โปรดดูต่อไปนี้:
ลดเวลาการเริ่มต้นด้วยการทำให้เป็นอนุกรม
คุณลักษณะการมอบหมาย GPU ช่วยให้คุณสามารถโหลดจากรหัสเคอร์เนลที่คอมไพล์ไว้ล่วงหน้าและข้อมูลโมเดลที่จัดลำดับและบันทึกไว้ในดิสก์จากการรันครั้งก่อน วิธีการนี้หลีกเลี่ยงการคอมไพล์ซ้ำและสามารถลดเวลาเริ่มต้นได้มากถึง 90% การปรับปรุงนี้ทำได้โดยการแลกเปลี่ยนพื้นที่ดิสก์เพื่อประหยัดเวลา คุณสามารถเปิดใช้คุณสมบัตินี้ได้ด้วยตัวเลือกการกำหนดค่าบางอย่าง ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้:
ภาษาซี++
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default(); options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION; options.serialization_dir = kTmpDir; options.model_token = kModelToken; auto* delegate = TfLiteGpuDelegateV2Create(options); if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
ชวา
GpuDelegate delegate = new GpuDelegate( new GpuDelegate.Options().setSerializationParams( /* serializationDir= */ serializationDir, /* modelToken= */ modelToken)); Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
เมื่อใช้คุณสมบัติการทำให้เป็นอนุกรม ตรวจสอบให้แน่ใจว่ารหัสของคุณสอดคล้องกับกฎการใช้งานเหล่านี้:
- จัดเก็บข้อมูลการออกซีเรียลไว้ในไดเร็กทอรีที่แอปอื่นไม่สามารถเข้าถึงได้ บนอุปกรณ์ Android ให้ใช้
getCodeCacheDir()
ซึ่งชี้ไปยังตำแหน่งที่เป็นส่วนตัวสำหรับแอปพลิเคชันปัจจุบัน - โทเค็นโมเดลต้องไม่ซ้ำกับอุปกรณ์สำหรับรุ่นที่ระบุ คุณสามารถคำนวณโทเค็นโมเดลได้โดยสร้างลายนิ้วมือจากข้อมูลโมเดลโดยใช้ไลบรารี เช่น
farmhash::Fingerprint64