เนื่องจากไลบรารีโอเปอเรเตอร์ 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
- ปรับปรุงความเข้ากันได้กับผู้รับมอบสิทธิ์ที่เร่งฮาร์ดแวร์แล้ว