ผู้แทน GPU สำหรับ TensorFlow Lite

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

การใช้หน่วยประมวลผลกราฟิก (GPU) เพื่อเรียกใช้โมเดลแมชชีนเลิร์นนิง (ML) ของคุณสามารถปรับปรุงประสิทธิภาพของโมเดลของคุณและประสบการณ์ผู้ใช้ของแอปพลิเคชันที่เปิดใช้งาน ML ได้อย่างมาก TensorFlow Lite ช่วยให้สามารถใช้ GPU และโปรเซสเซอร์พิเศษอื่นๆ ผ่านไดรเวอร์ฮาร์ดแวร์ที่เรียกว่า delegates การเปิดใช้งาน 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
  • 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 เท่านั้น การเปิดใช้งานการ สนับสนุน quantization จะเปิดใช้งานเวอร์ชันที่เหมาะสม เช่น 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 และมีไว้สำหรับการอ้างอิงและการทดสอบ:

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

  • การ จำลองเชิงปริมาณ ถูกแทรกระหว่างการดำเนินการเพื่อเลียนแบบพฤติกรรมเชิงปริมาณ แนวทางนี้จำเป็นสำหรับโมเดลที่ ops คาดว่าการเปิดใช้งานจะเป็นไปตามขอบเขตที่เรียนรู้ในระหว่างการหาปริมาณ

สำหรับข้อมูลเกี่ยวกับการเปิดใช้งานคุณสมบัตินี้กับผู้รับมอบสิทธิ์ GPU ดูต่อไปนี้:

ลดเวลาการเริ่มต้นด้วยการทำให้เป็นอนุกรม

คุณสมบัติผู้รับมอบสิทธิ์ GPU ให้คุณโหลดจากโค้ดเคอร์เนลที่คอมไพล์ล่วงหน้าและข้อมูลโมเดลที่จัดลำดับและบันทึกบนดิสก์จากการรันครั้งก่อน วิธีนี้จะหลีกเลี่ยงการคอมไพล์ซ้ำ และสามารถลดเวลาเริ่มต้นได้มากถึง 90% การปรับปรุงนี้ทำได้โดยการแลกเปลี่ยนพื้นที่ดิสก์เพื่อประหยัดเวลา คุณสามารถเปิดใช้งานคุณลักษณะนี้ด้วยตัวเลือกการกำหนดค่าบางอย่าง ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้:

C++

    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;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

เมื่อใช้คุณลักษณะการทำให้เป็นอนุกรม ตรวจสอบให้แน่ใจว่าโค้ดของคุณสอดคล้องกับกฎการใช้งานเหล่านี้:

  • จัดเก็บข้อมูลการทำให้เป็นอนุกรมในไดเร็กทอรีที่แอปอื่นไม่สามารถเข้าถึงได้ บนอุปกรณ์ Android ให้ใช้ getCodeCacheDir() ซึ่งชี้ไปยังตำแหน่งที่เป็นส่วนตัวในแอปพลิเคชันปัจจุบัน
  • โทเค็นรุ่นต้องไม่ซ้ำกันสำหรับอุปกรณ์สำหรับรุ่นเฉพาะ คุณสามารถคำนวณโทเค็นโมเดลโดยสร้างลายนิ้วมือจากข้อมูลโมเดลโดยใช้ไลบรารี เช่น farmhash::Fingerprint64