เลือกโอเปอเรเตอร์ TensorFlow

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

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

เอกสารนี้สรุปวิธีแปลงและrunโมเดล 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 ที่เลือก ไคลเอ็นต์ต้องใช้รันไทม์ TensorFlow Lite ที่มีไลบรารีของ TensorFlow ที่จำเป็นด้วย

AAR ของ Android

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

คุณระบุสิ่งนี้ได้ในทรัพยากร Dependency ของ 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'
}

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

เมื่อเพิ่มทรัพยากร Dependency แล้ว ควรติดตั้งการมอบสิทธิ์ที่จำเป็นสำหรับการจัดการการดำเนินการ TensorFlow ของกราฟโดยอัตโนมัติสำหรับกราฟที่ต้องการ

หมายเหตุ: ทรัพยากร Dependency ของ TensorFlow ค่อนข้างใหญ่ ดังนั้นคุณอาจต้องกรอง ABI x86 ที่ไม่จำเป็นในไฟล์ .gradle โดยการตั้งค่า abiFilters

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

การสร้าง Android AAR

สำหรับการลดขนาดไบนารีหรือกรณีขั้นสูงอื่นๆ คุณยังสร้างไลบรารีด้วยตนเองได้อีกด้วย สมมติว่าสภาพแวดล้อมบิลด์ของ 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 หากไม่มีสภาพแวดล้อมของบิลด์ที่ใช้งานได้ คุณก็สร้างไฟล์ด้านบนด้วย 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() และแทนที่ทรัพยากร Dependency ของ 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'
}

iOS

การใช้ CocoaPods

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

หมายเหตุ: หากต้องใช้การดำเนินการของ TF ที่เลือกในเครื่องจำลอง x86_64 คุณจะสร้างเฟรมเวิร์กการดำเนินการที่เลือกได้ด้วยตนเอง ดูรายละเอียดเพิ่มเติมได้ที่ส่วนการใช้ Bazel + Xcode

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

หลังจากเรียกใช้ pod install คุณต้องระบุแฟล็ก Linker เพิ่มเติมเพื่อบังคับให้โหลดเฟรมเวิร์กการดำเนินการของ TF ที่เลือกไปยังโปรเจ็กต์ของคุณ ในโปรเจ็กต์ 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 ได้ เช่น คุณอาจแก้ไขแอปการแยกประเภทรูปภาพสำหรับ iOS เพื่อทดสอบฟีเจอร์การดำเนินการของ TF ที่เลือกได้

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

การใช้ Bazel + Xcode

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

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

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

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

C/C++

หากใช้ 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

แพลตฟอร์ม ชื่อห้องสมุด
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

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

หมายเหตุ: ฟีเจอร์นี้มีให้บริการตั้งแต่เวอร์ชัน 2.7

Python

TensorFlow Lite ที่ปฏิบัติการ TensorFlow ที่เลือกจะติดตั้งโดยอัตโนมัติด้วยแพ็กเกจ PIP ของ TensorFlow หรือคุณจะเลือกติดตั้งเฉพาะแพ็กเกจ TensorFlow Lite Interpreter pip ก็ได้

เมตริก

การแสดง

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

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

สร้าง เวลา (มิลลิวินาที)
การดำเนินการในตัวเท่านั้น (TFLITE_BUILTIN) 260.7
การใช้เพียงการดำเนินการของ TF เท่านั้น (SELECT_TF_OPS) 264.5

ขนาดไบนารี

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

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

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

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

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

การอัปเดต

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