เนื่องจากไลบรารีโอเปอเรเตอร์ในตัวของ TensorFlow Lite รองรับตัวดำเนินการ TensorFlow ในจำนวนจำกัดเท่านั้น จึงไม่สามารถเปลี่ยนได้ทุกรุ่น สำหรับรายละเอียด โปรดดูที่ ความเข้ากันได้ ของผู้ปฏิบัติงาน
เพื่อให้สามารถแปลงได้ ผู้ใช้สามารถเปิดใช้งานการใช้งาน TensorFlow ops บางอย่าง ในรุ่น TensorFlow Lite อย่างไรก็ตาม การรันโมเดล TensorFlow Lite ด้วย TensorFlow ops นั้นจำเป็นต้องดึงรันไทม์หลักของ TensorFlow ซึ่งจะเป็นการเพิ่มขนาดไบนารีของล่าม TensorFlow Lite สำหรับ Android คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วยการเลือกสร้างเฉพาะ Tensorflow ops ที่จำเป็นเท่านั้น สำหรับรายละเอียด โปรดดูที่ ลดขนาดไบนารี
เอกสารนี้สรุปวิธีการ แปลง และ เรียกใช้ โมเดล TensorFlow Lite ที่มี TensorFlow ops บนแพลตฟอร์มที่คุณเลือก นอกจากนี้ยังกล่าวถึง การวัดประสิทธิภาพและขนาด และ ข้อจำกัดที่ทราบ
แปลงโมเดล
ตัวอย่างต่อไปนี้แสดงวิธีสร้างโมเดล TensorFlow Lite ด้วยการเลือก TensorFlow ops
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
Android 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 ที่เลือกดังนี้:
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
สำหรับ ops ในตัวและแบบกำหนดเองของ 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 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 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 addon ที่เลือก ซึ่งสามารถเพิ่มที่ด้านบนของ 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>
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
แพลตฟอร์ม | ชื่อห้องสมุด |
---|---|
ลินุกซ์ | libtensorflowlite_flex.so |
macOS | libtensorflowlite_flex.dylib |
Windows | tensorflowlite_flex.dll |
โปรดทราบว่า TfLiteDelegate
ที่จำเป็นจะถูกติดตั้งโดยอัตโนมัติเมื่อสร้างล่ามที่รันไทม์ตราบเท่าที่มีการเชื่อมโยงไลบรารีที่ใช้ร่วมกัน ไม่จำเป็นต้องติดตั้งอินสแตนซ์ของผู้รับมอบสิทธิ์อย่างชัดแจ้งตามปกติกับประเภทผู้รับมอบสิทธิ์อื่นๆ
Python
TensorFlow Lite พร้อมตัวเลือก TensorFlow ที่เลือกจะถูกติดตั้งโดยอัตโนมัติด้วย แพ็คเกจ pip ของ TensorFlow คุณยังสามารถเลือกติดตั้งเฉพาะ แพ็คเกจ pip สำหรับล่าม TensorFlow Lite
ตัวชี้วัด
ประสิทธิภาพ
เมื่อใช้การผสมผสานระหว่างการทำงานในตัวและตัวเลือก 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++ ขนาดไบนารี | ขนาด APK ของ Android |
---|---|---|
เฉพาะops ในตัว | 796 KB | 561 KB |
ops ในตัว + ops ของ TF | 23.0 MB | 8.0 MB |
ปฏิบัติการในตัว + ปฏิบัติการ TF (1) | 4.1 MB | 1.8 MB |
(1) ไลบรารีเหล่านี้สร้างขึ้นอย่างเลือกสรรสำหรับ รุ่น i3d-kinetics-400 ที่มี 8 TFLite ในตัว ops และ 3 Tensorflow ops สำหรับรายละเอียดเพิ่มเติม โปรดดู ส่วนลดขนาดไบนารีของ TensorFlow Lite
ข้อจำกัดที่ทราบ
- ประเภทที่ไม่รองรับ: ops ของ TensorFlow บางอย่างอาจไม่รองรับชุดของประเภทอินพุต/เอาต์พุตทั้งหมดที่โดยทั่วไปมีอยู่ใน TensorFlow
อัพเดท
- เวอร์ชัน 2.6
- ปรับปรุงการรองรับตัวดำเนินการตามแอตทริบิวต์ GraphDef และการเริ่มต้นทรัพยากร HashTable
- เวอร์ชัน 2.5
- คุณสามารถใช้การปรับให้เหมาะสมที่เรียกว่า quantization หลังการฝึก
- เวอร์ชัน 2.4
- ความเข้ากันได้กับผู้ได้รับมอบหมายที่เร่งด้วยฮาร์ดแวร์ได้รับการปรับปรุง