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

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

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

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

แปลงโมเดล

ตัวอย่างต่อไปนี้แสดงวิธีสร้างโมเดล 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 ที่มีไลบรารีที่จำเป็นของ ops TensorFlow

ระบบปฏิบัติการ Android

หากต้องการลดขนาดไบนารี โปรดสร้างไฟล์ 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 ของกราฟสำหรับกราฟที่ต้องการโดยอัตโนมัติ

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

การสร้าง AAR ของ Android

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

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 ในตัวและการดำเนินการที่กำหนดเอง และสร้างไฟล์ 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 ที่เลือก:

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'
}

ไอโอเอส

การใช้ CocoaPods

TensorFlow Lite นำเสนอตัวเลือก TF ops 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 สำหรับ 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
ระบบปฏิบัติการ macOS libtensorflowlite_flex.dylib
หน้าต่าง tensorflowlite_flex.dll

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

หลาม

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

เมตริก

ผลงาน

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

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

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

ขนาดไบนารี

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

สร้าง ขนาดไบนารี C++ ขนาดเอพีเค Android
Ops ในตัวเท่านั้น 796 KB 561 KB
การดำเนินการในตัว + การดำเนินการ TF 23.0 ลบ 8.0 ลบ
การดำเนินการในตัว + การดำเนินการ TF (1) 4.1 ลบ 1.8 ลบ

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

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

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

อัพเดท

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