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

ตัวแทน TensorFlow Lite NNAPI

Android Neural Networks API (NNAPI) พร้อมใช้งานบนอุปกรณ์ Android ทั้งหมดที่ใช้ Android 8.1 (API ระดับ 27) หรือสูงกว่า ให้การเร่งความเร็วสำหรับรุ่น TensorFlow Lite บนอุปกรณ์ Android พร้อมตัวเร่งฮาร์ดแวร์ที่รองรับ ได้แก่ :

  • หน่วยประมวลผลกราฟิก (GPU)
  • ตัวประมวลผลสัญญาณดิจิทัล (DSP)
  • หน่วยประมวลผลประสาท (NPU)

ประสิทธิภาพจะแตกต่างกันไปขึ้นอยู่กับฮาร์ดแวร์เฉพาะที่มีอยู่ในอุปกรณ์

หน้านี้อธิบายถึงวิธีการใช้ NNAPI delegate กับ TensorFlow Lite Interpreter ใน Java และ Kotlin สำหรับ Android C API โปรดดู เอกสารประกอบของ Android Native Developer Kit

ลองใช้ตัวแทน NNAPI ในแบบจำลองของคุณเอง

การนำเข้า Gradle

ตัวแทน NNAPI เป็นส่วนหนึ่งของล่าม TensorFlow Lite Android รุ่น 1.14.0 หรือสูงกว่า คุณสามารถนำเข้าโครงการของคุณได้โดยเพิ่มสิ่งต่อไปนี้ลงในไฟล์ gradle ของโมดูลของคุณ:

dependencies {
   implementation 'org.tensorflow:tensorflow-lite:2.0.0'
}

การเริ่มต้นผู้รับมอบสิทธิ์ NNAPI

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

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

ปฏิบัติที่ดีที่สุด

ทดสอบประสิทธิภาพก่อนปรับใช้

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

สำหรับนักพัฒนาขั้นสูง TensorFlow Lite ยังมี เครื่องมือเปรียบเทียบแบบจำลองสำหรับ Android

สร้างรายการยกเว้นอุปกรณ์

ในการผลิตอาจมีบางกรณีที่ NNAPI ไม่ทำงานตามที่คาดไว้ เราขอแนะนำให้นักพัฒนาเก็บรายชื่ออุปกรณ์ที่ไม่ควรใช้การเร่งความเร็ว NNAPI ร่วมกับรุ่นใดรุ่นหนึ่ง คุณสามารถสร้างรายการนี้ตามค่าของ "ro.board.platform" ซึ่งคุณสามารถดึงข้อมูลโดยใช้ข้อมูลโค้ดต่อไปนี้:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

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

ปริมาณ

Quantization ลดขนาดโมเดลโดยใช้จำนวนเต็ม 8 บิตหรือโฟล 16 บิตแทนโฟล 32 บิตสำหรับการคำนวณ ขนาดโมเดลจำนวนเต็ม 8 บิตเป็นหนึ่งในสี่ของเวอร์ชันโฟลต 32 บิต ลอย 16 บิตมีขนาดครึ่งหนึ่ง Quantization สามารถปรับปรุงประสิทธิภาพได้อย่างมีนัยสำคัญแม้ว่ากระบวนการจะลดความแม่นยำของโมเดลไปบ้าง

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

ใช้รุ่นและตัวเลือกที่รองรับ

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

NNAPI จะทำงานได้ดีที่สุดเมื่อโมเดลใช้ตัวเลือกที่ รองรับ เท่านั้น ทราบว่ารุ่นต่อไปนี้เข้ากันได้กับ NNAPI:

นอกจากนี้ยังไม่รองรับการเร่ง NNAPI เมื่อโมเดลมีเอาต์พุตขนาดไดนามิก ในกรณีนี้คุณจะได้รับคำเตือนเช่น:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

เปิดใช้งานการใช้งาน NNAPI CPU

กราฟที่ไม่สามารถประมวลผลได้อย่างสมบูรณ์โดยตัวเร่งความเร็วสามารถถอยกลับไปใช้งาน NNAPI CPU ได้ อย่างไรก็ตามเนื่องจากโดยทั่วไปแล้วสิ่งนี้มีประสิทธิภาพน้อยกว่าตัวแปล TensorFlow ตัวเลือกนี้จึงถูกปิดใช้งานโดยค่าเริ่มต้นในตัวแทน NNAPI สำหรับ Android 10 (API ระดับ 29) ขึ้นไป เมื่อต้องการแทนที่พฤติกรรมนี้ให้ตั้งค่า setUseNnapiCpu true ในอ็อบเจ็กต์ NnApiDelegate.Options