เนื่องจากไลบรารีตัวดำเนินการในตัวของ LiteRT รองรับตัวดำเนินการ TensorFlow ในจำนวนจำกัดเท่านั้น จึงไม่สามารถแปลงโมเดลทุกโมเดลได้ โปรดดูรายละเอียดที่ความเข้ากันได้ของผู้ให้บริการ
หากต้องการอนุญาตให้มีการแปลง ผู้ใช้สามารถเปิดใช้การใช้งาน Op บางอย่างของ TensorFlow ในโมเดล LiteRT ได้ อย่างไรก็ตาม การเรียกใช้โมเดล LiteRT ด้วยการดำเนินการของ TensorFlow ต้องดึงรันไทม์หลักของ TensorFlow ซึ่งจะเพิ่มขนาดไบนารีของอินเทอร์พรีเตอร์ LiteRT สำหรับ Android คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยเลือกสร้างเฉพาะการดำเนินการ TensorFlow ที่จำเป็นเท่านั้น ดูรายละเอียดได้ที่ลดขนาดไบนารี
เอกสารนี้อธิบายวิธีแปลงและเรียกใช้โมเดล LiteRT ที่มี Op TensorFlow บนแพลตฟอร์มที่คุณเลือก นอกจากนี้ยังกล่าวถึงเมตริกประสิทธิภาพและขนาด รวมถึงข้อจำกัดที่ทราบ
แปลงโมเดล
ตัวอย่างต่อไปนี้แสดงวิธีสร้างโมเดล LiteRT ด้วยการเลือก การดำเนินการ 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 LiteRT ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
เรียกใช้การอนุมาน
เมื่อใช้โมเดล LiteRT ที่แปลงโดยรองรับการดำเนินการ TensorFlow บางรายการ ไคลเอ็นต์ต้องใช้รันไทม์ LiteRT ที่มีไลบรารีที่จำเป็นของการดำเนินการ TensorFlow ด้วย
AAR ของ Android
หากต้องการลดขนาดไบนารี โปรดสร้างไฟล์ AAR ที่กำหนดเองตามคำแนะนำในส่วนถัดไป หากขนาดไบนารีไม่ใช่ข้อกังวลที่สำคัญ เราขอแนะนําให้ใช้ AAR ที่สร้างไว้ล่วงหน้าพร้อมการดำเนินการ TensorFlow ซึ่งโฮสต์อยู่ที่ MavenCentral
คุณระบุได้ในbuild.gradleการอ้างอิงโดยเพิ่มไว้ข้าง
AAR ของ LiteRT มาตรฐานดังนี้
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 แล้ว
เมื่อเพิ่มทรัพยากร Dependency แล้ว ระบบจะติดตั้งโปรแกรมมอบสิทธิ์ที่จำเป็นสำหรับการจัดการการดำเนินการ TensorFlow ของกราฟโดยอัตโนมัติสำหรับกราฟที่ต้องใช้
หมายเหตุ: ทรัพยากร Dependency ของการดำเนินการ TensorFlow มีขนาดค่อนข้างใหญ่ ดังนั้นคุณอาจต้อง
กรอง ABI x86 ที่ไม่จำเป็นในไฟล์ .gradle โดยการตั้งค่า abiFilters
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
การสร้าง AAR ของ Android
หากต้องการลดขนาดไบนารีหรือในกรณีอื่นๆ ที่ซับซ้อน คุณก็สร้าง ไลบรารีด้วยตนเองได้เช่นกัน สมมติว่ามีสภาพแวดล้อมการสร้าง LiteRT ที่ใช้งานได้ สร้าง AAR ของ Android ด้วยการดำเนินการ 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 สำหรับ LiteRT
built-in และการดำเนินการที่กำหนดเอง และสร้างไฟล์ 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 ของแอป ให้ตรวจสอบว่าคุณมีทรัพยากร Dependency mavenLocal()
และแทนที่ทรัพยากร Dependency LiteRT มาตรฐานด้วยทรัพยากร Dependency ที่รองรับ
การดำเนินการ 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
LiteRT มี 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 คุณต้องระบุแฟล็กตัวลิงก์เพิ่มเติมเพื่อ
บังคับให้โหลดเฟรมเวิร์กการดำเนินการ 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 Ops ได้
- แทนที่ไฟล์โมเดลด้วยไฟล์ที่แปลงโดยเปิดใช้
SELECT_TF_OPS - เพิ่มทรัพยากร Dependency ของ
TensorFlowLiteSelectTfOpsลงในPodfileตามที่ได้รับแจ้ง - เพิ่มแฟล็ก Linker เพิ่มเติมตามที่ระบุไว้ข้างต้น
- เรียกใช้แอปตัวอย่างและดูว่าโมเดลทำงานได้อย่างถูกต้องหรือไม่
การใช้ Bazel + Xcode
คุณสร้าง LiteRT ด้วยการดำเนินการ 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
หลังจากเพิ่มเฟรมเวิร์กลงในโปรเจ็กต์แอปแล้ว คุณควรระบุแฟล็ก Linker เพิ่มเติม
ในโปรเจ็กต์แอปเพื่อบังคับให้โหลดเฟรมเวิร์ก TF Ops
ที่เลือก ในโปรเจ็กต์ Xcode ให้ไปที่ Build Settings -> Other Linker
Flags แล้วเพิ่มรายการต่อไปนี้
-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>
C/C++
หากใช้ Bazel หรือ CMake เพื่อสร้างอินเทอร์พรีเตอร์ LiteRT คุณจะเปิดใช้ตัวแทน Flex ได้โดยการลิงก์ไลบรารีที่ใช้ร่วมกันของตัวแทน LiteRT 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
ระบบจะติดตั้ง LiteRT พร้อมกับ Op ของ TensorFlow ที่เลือกโดยอัตโนมัติด้วยแพ็กเกจ TensorFlow pip นอกจากนี้ คุณยังเลือกติดตั้งเฉพาะแพ็กเกจ LiteRT Interpreter pip ได้ด้วย
เมตริก
ประสิทธิภาพ
เมื่อใช้ทั้ง Op ในตัวและ Op TensorFlow ที่เลือก การเพิ่มประสิทธิภาพ LiteRT ทั้งหมดและ Op ในตัวที่เพิ่มประสิทธิภาพแล้วจะพร้อมใช้งานกับโมเดลที่แปลงแล้ว
ตารางต่อไปนี้อธิบายเวลาโดยเฉลี่ยที่ใช้ในการเรียกใช้การอนุมานใน
MobileNet บน Pixel 2 เวลาที่ระบุคือค่าเฉลี่ยของการทดสอบ 100 ครั้ง เป้าหมายเหล่านี้สร้างขึ้นสำหรับ Android โดยใช้แฟล็ก --config=android_arm64 -c opt
| สร้าง | เวลา (มิลลิวินาที) |
|---|---|
เฉพาะการดำเนินการในตัว (TFLITE_BUILTIN) |
260.7 |
ใช้เฉพาะการดำเนินการ TF (SELECT_TF_OPS) |
264.5 |
ขนาดไบนารี
ตารางต่อไปนี้อธิบายขนาดไบนารีของ LiteRT สำหรับแต่ละบิลด์ เป้าหมาย
เหล่านี้สร้างขึ้นสำหรับ Android โดยใช้ --config=android_arm -c opt
| สร้าง | ขนาดไบนารีของ C++ | ขนาด APK ของ Android |
|---|---|---|
| เฉพาะการดำเนินการในตัว | 796 KB | 561 KB |
| การดำเนินการในตัว + การดำเนินการ TF | 23.0 MB | 8.0 MB |
| การดำเนินการในตัว + การดำเนินการ TF (1) | 4.1 MB | 1.8 MB |
(1) ไลบรารีเหล่านี้สร้างขึ้นสำหรับโมเดล i3d-kinetics-400 โดยเฉพาะ ซึ่งมีตัวดำเนินการ TFLite ในตัว 8 รายการและตัวดำเนินการ TensorFlow 3 รายการ ดูรายละเอียดเพิ่มเติมได้ที่ส่วนลดขนาดไบนารีของ LiteRT
ข้อจำกัดที่ทราบ
- ประเภทที่ไม่รองรับ: การดำเนินการ TensorFlow บางอย่างอาจไม่รองรับชุดประเภทอินพุต/เอาต์พุตทั้งหมดที่มักจะมีอยู่ใน TensorFlow
อัปเดต
- เวอร์ชัน 2.6
- ปรับปรุงการรองรับตัวดำเนินการที่อิงตามแอตทริบิวต์ GraphDef และการเริ่มต้นทรัพยากร HashTable
- เวอร์ชัน 2.5
- คุณสามารถใช้การเพิ่มประสิทธิภาพที่เรียกว่าการหาปริมาณหลังการฝึก
- เวอร์ชัน 2.4
- ปรับปรุงความเข้ากันได้กับตัวแทนที่เร่งด้วยฮาร์ดแวร์