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

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