เลือกตัวดำเนินการ TensorFlow

เนื่องจากไลบรารีโอเปอเรเตอร์ในตัว TensorFlow Lite รองรับเฉพาะโอเปอเรเตอร์ TensorFlow ในจำนวนจำกัด ไม่ใช่ทุกรุ่นที่แปลงได้ สำหรับรายละเอียด โปรดดูที่ ความเข้ากันได้ของโอเปอเรเตอร์

ในการอนุญาตการแปลง ผู้ใช้สามารถเปิดการใช้งาน TensorFlow ops บางอย่าง ในโมเดล TensorFlow Lite ได้ อย่างไรก็ตาม การรันโมเดล TensorFlow Lite ด้วย TensorFlow ops จำเป็นต้องดึงรันไทม์หลักของ TensorFlow ซึ่งจะเพิ่มขนาดไบนารีของล่าม TensorFlow Lite สำหรับ Android คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยเลือกสร้างเฉพาะ Tensorflow ops ที่จำเป็นเท่านั้น สำหรับรายละเอียด โปรดดูที่ การลดขนาดไบนารี

เอกสารนี้สรุปวิธี การแปลง และ รัน โมเดล TensorFlow Lite ที่มี TensorFlow ops บนแพลตฟอร์มที่คุณเลือก นอกจากนี้ยังกล่าวถึง เมตริกประสิทธิภาพและขนาด และ ข้อจำกัดที่ทราบ

แปลงโมเดล

ตัวอย่างต่อไปนี้แสดงวิธีสร้างโมเดล TensorFlow Lite ด้วยตัวเลือก TensorFlow

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

เรียกใช้การอนุมาน

เมื่อใช้โมเดล TensorFlow Lite ที่แปลงด้วยการสนับสนุนสำหรับ TensorFlow ops ที่เลือก ไคลเอ็นต์จะต้องใช้รันไทม์ TensorFlow Lite ที่มีไลบรารีที่จำเป็นของ TensorFlow ops

AAR ของแอนดรอยด์

หากต้องการลดขนาดไบนารี โปรดสร้างไฟล์ AAR ของคุณเองตามคำแนะนำใน ส่วนถัดไป หากขนาดไบนารีไม่ใช่ปัญหา เราขอแนะนำให้ใช้ AAR ที่สร้างไว้ล่วงหน้ากับ TensorFlow ops ที่โฮสต์ที่ MavenCentral

คุณสามารถระบุสิ่งนี้ในการพึ่งพา build.gradle ของคุณโดยเพิ่มควบคู่ไปกับ TensorFlow Lite AAR มาตรฐานดังต่อไปนี้:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

หากต้องการใช้สแน็ปช็อตตอนกลางคืน ตรวจสอบให้แน่ใจว่าคุณได้เพิ่ม ที่เก็บสแน็ปช็อต Sonatype

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

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

สร้าง Android AAR

สำหรับการลดขนาดไบนารีหรือกรณีขั้นสูงอื่นๆ คุณสามารถสร้างไลบรารีด้วยตนเองได้ สมมติว่า สภาพแวดล้อมการสร้าง TensorFlow Lite ที่ใช้งานได้ ให้สร้าง Android AAR ด้วยตัวเลือก TensorFlow ops ดังนี้:

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

สิ่งนี้จะสร้างไฟล์ AAR bazel-bin/tmp/tensorflow-lite.aar สำหรับ TensorFlow Lite ในตัวและ ops แบบกำหนดเอง และสร้างไฟล์ AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar สำหรับ TensorFlow ops หากคุณไม่มีสภาพแวดล้อมการสร้างที่ใช้งานได้ คุณสามารถ สร้างไฟล์ด้านบนด้วย docker

จากตรงนั้น คุณสามารถนำเข้าไฟล์ AAR ไปยังโครงการของคุณได้โดยตรง หรือเผยแพร่ไฟล์ AAR แบบกำหนดเองไปยังที่เก็บ Maven ในเครื่องของคุณ:

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar

สุดท้าย ใน build.gradle ของแอปของคุณ ตรวจสอบให้แน่ใจว่าคุณมีการพึ่งพา mavenLocal() และแทนที่การพึ่งพา TensorFlow Lite มาตรฐานด้วยอันที่รองรับ TensorFlow ops ที่เลือก:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

การใช้ CocoaPods

TensorFlow Lite จัดเตรียม TF ที่เลือกไว้ล่วงหน้าทุกคืนสำหรับ CocoaPods สำหรับ arm64 ซึ่งคุณสามารถใช้ควบคู่ไปกับ TensorFlowLiteSwift หรือ TensorFlowLiteObjC CocoaPods

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

หลังจากเรียกใช้ pod install คุณต้องระบุแฟล็กตัวเชื่อมโยงเพิ่มเติมเพื่อบังคับให้โหลดเฟรมเวิร์ก TF ops ที่เลือกลงในโปรเจ็กต์ของคุณ ในโครงการ Xcode ของคุณ ให้ไปที่ Build Settings -> Other Linker Flags และเพิ่ม:

สำหรับเวอร์ชัน >= 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

สำหรับเวอร์ชัน < 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

จากนั้น คุณควรจะสามารถเรียกใช้โมเดลใดๆ ที่แปลงด้วย SELECT_TF_OPS ในแอป iOS ตัวอย่างเช่น คุณสามารถแก้ไข แอป Image Classification iOS เพื่อทดสอบคุณสมบัติ TF ops ที่เลือกได้

  • แทนที่ไฟล์โมเดลด้วยไฟล์ที่แปลงโดยเปิดใช้งาน SELECT_TF_OPS
  • เพิ่มการพึ่งพา TensorFlowLiteSelectTfOps ไปยัง Podfile ตามคำแนะนำ
  • เพิ่มแฟล็กลิงเกอร์เพิ่มเติมตามด้านบน
  • เรียกใช้แอปตัวอย่างและดูว่าโมเดลทำงานได้อย่างถูกต้องหรือไม่

ใช้ Bazel + Xcode

TensorFlow Lite พร้อมตัวเลือก TensorFlow ops สำหรับ iOS สามารถสร้างได้โดยใช้ Bazel ขั้นแรก ให้ทำตาม คำแนะนำในการสร้าง iOS เพื่อกำหนดค่าพื้นที่ทำงาน Bazel และไฟล์ .bazelrc ให้ถูกต้อง

เมื่อคุณกำหนดค่าพื้นที่ทำงานโดยเปิดใช้งานการรองรับ iOS แล้ว คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างเฟรมเวิร์กเสริม TF ops ที่เลือก ซึ่งสามารถเพิ่มที่ด้านบนของ TensorFlowLiteC.framework ปกติ โปรดทราบว่าไม่สามารถสร้างเฟรมเวิร์ก TF ops ที่เลือกสำหรับสถาปัตยกรรม i386 ดังนั้นคุณต้องระบุรายการสถาปัตยกรรมเป้าหมายที่ไม่รวม i386 อย่างชัดเจน

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

สิ่งนี้จะสร้างเฟรมเวิร์กภายใต้ไดเร็กทอรี bazel-bin/tensorflow/lite/ios/ คุณสามารถเพิ่มเฟรมเวิร์กใหม่นี้ในโครงการ Xcode ของคุณโดยทำตามขั้นตอนที่คล้ายกันซึ่งอธิบายไว้ในส่วน การตั้งค่าโครงการ Xcode ในคู่มือการสร้าง iOS

หลังจากเพิ่มเฟรมเวิร์กในโครงการแอปของคุณแล้ว ควรระบุแฟล็กตัวเชื่อมโยงเพิ่มเติมในโครงการแอปของคุณเพื่อบังคับให้โหลดเฟรมเวิร์ก TF ops ที่เลือก ในโครงการ Xcode ของคุณ ให้ไปที่ Build Settings -> Other Linker Flags และเพิ่ม:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

ซี/ซี++

หากคุณใช้ Bazel หรือ CMake เพื่อสร้างล่าม TensorFlow Lite คุณสามารถเปิดใช้ผู้รับมอบสิทธิ์ Flex ได้โดยลิงก์ไลบรารีที่ใช้ร่วมกันของผู้รับมอบสิทธิ์ TensorFlow Lite Flex คุณสามารถสร้างมันด้วย Bazel ตามคำสั่งต่อไปนี้

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

คำสั่งนี้สร้างไลบรารีที่ใช้ร่วมกันต่อไปนี้ใน bazel-bin/tensorflow/lite/delegates/flex

แพลตฟอร์ม ชื่อห้องสมุด
ลีนุกซ์ libtensorflowlite_flex.so
แมคโอเอส libtensorflowlite_flex.dylib
หน้าต่าง tensorflowlite_flex.dll

โปรดทราบว่า TfLiteDelegate ที่จำเป็นจะถูกติดตั้งโดยอัตโนมัติเมื่อสร้างล่ามที่รันไทม์ตราบเท่าที่มีการเชื่อมโยงไลบรารีที่ใช้ร่วมกัน ไม่จำเป็นต้องติดตั้งอินสแตนซ์ผู้รับมอบสิทธิ์อย่างชัดแจ้ง เนื่องจากโดยปกติแล้วจะต้องใช้กับผู้รับมอบสิทธิ์ประเภทอื่นๆ

หลาม

TensorFlow Lite ที่เลือกใช้ TensorFlow ops จะถูกติดตั้งโดยอัตโนมัติด้วย แพ็คเกจ TensorFlow pip คุณยังสามารถเลือกที่จะติดตั้งเฉพาะ แพ็คเกจ TensorFlow Lite Interpreter pip

เมตริก

ผลงาน

เมื่อใช้ทั้งในตัวและตัวเลือก TensorFlow ops การเพิ่มประสิทธิภาพ TensorFlow Lite เดียวกันทั้งหมดและ ops ในตัวที่ปรับให้เหมาะสมจะพร้อมใช้งานและใช้ได้กับโมเดลที่แปลงแล้ว

ตารางต่อไปนี้อธิบายเวลาเฉลี่ยที่ใช้ในการอนุมานบน MobileNet บน Pixel 2 เวลาที่แสดงเป็นค่าเฉลี่ยของการรัน 100 ครั้ง เป้าหมายเหล่านี้สร้างขึ้นสำหรับ Android โดยใช้แฟล็ก: --config=android_arm64 -c opt

สร้าง เวลา (มิลลิวินาที)
ops ในตัวเท่านั้น ( TFLITE_BUILTIN ) 260.7
ใช้เฉพาะ TF ops ( SELECT_TF_OPS ) 264.5

ขนาดไบนารี

ตารางต่อไปนี้อธิบายขนาดไบนารีของ TensorFlow Lite สำหรับแต่ละบิลด์ เป้าหมายเหล่านี้สร้างขึ้นสำหรับ Android โดยใช้ --config=android_arm -c opt

สร้าง ขนาดไบนารี C ++ ขนาด APK ของ Android
ops ในตัวเท่านั้น 796 กิโลไบต์ 561 กิโลไบต์
ops ในตัว + TF ops 23.0 ลบ 8.0 ลบ
ops ในตัว + TF ops (1) 4.1 ลบ 1.8 ลบ

(1) ไลบรารีเหล่านี้สร้างขึ้นอย่างเฉพาะเจาะจงสำหรับ รุ่น i3d-kinetics-400 ที่มี 8 TFLite ในตัว ops และ 3 Tensorflow ops สำหรับรายละเอียดเพิ่มเติม โปรดดู ส่วนลดขนาดไบนารีของ TensorFlow Lite

ข้อจำกัดที่ทราบ

  • ประเภทที่ไม่รองรับ: ops ของ TensorFlow บางตัวอาจไม่รองรับประเภทอินพุต/เอาต์พุตครบชุดที่โดยทั่วไปมีอยู่ใน TensorFlow

อัพเดท

  • เวอร์ชัน 2.6
    • ปรับปรุงการรองรับตัวดำเนินการที่ใช้แอตทริบิวต์ GraphDef และการเริ่มต้นทรัพยากร HashTable แล้ว
  • เวอร์ชั่น 2.5
  • เวอร์ชั่น 2.4
    • ปรับปรุงความเข้ากันได้กับผู้ร่วมประชุมที่เร่งด้วยฮาร์ดแวร์แล้ว