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

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

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

เอกสารนี้สรุปวิธีแปลง เรียกใช้โมเดล LiteRT ที่มี TensorFlow Ops บน แพลตฟอร์มที่คุณเลือก และจะพูดถึงประสิทธิภาพและขนาด เมตริกและข้อจำกัดที่ทราบ

แปลงโมเดล

ตัวอย่างต่อไปนี้แสดงวิธีสร้างโมเดล LiteRT โดยเลือก Ops ของ 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 Ops

AAR ของ Android

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

คุณระบุข้อมูลนี้ในทรัพยากร Dependency ของ build.gradle ได้โดยเพิ่มไปพร้อมๆ กัน LiteRT 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

สำหรับการลดขนาดไบนารีหรือกรณีขั้นสูงอื่นๆ คุณยังสามารถสร้าง ไลบรารีด้วยตนเองได้อีกด้วย สมมติว่าบิลด์ LiteRT ที่ใช้งานได้ สภาพแวดล้อม สร้าง 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 สำหรับ LiteRT ในตัวและระบบปฏิบัติการที่กำหนดเอง และสร้างไฟล์ 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 แบบ LiteRT มาตรฐานด้วย รองรับการดำเนินการ 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 ซึ่งคุณสามารถใช้ควบคู่กับ TensorFlowLiteSwift หรือ CocoaPods TensorFlowLiteObjC รายการ

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

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

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

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

การใช้ Bazel + Xcode

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

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

เมตริก

ประสิทธิภาพ

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

ตารางต่อไปนี้อธิบายเวลาเฉลี่ยที่ใช้ในการเรียกใช้การอนุมาน 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 กิโลไบต์ 561 กิโลไบต์
Ops ในตัว + การดำเนินการของ TF 23.0 MB 8.0 MB
การดำเนินการในตัว + TF Ops (1) 4.1 MB 1.8 เมกะไบต์

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

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

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

อัปเดต

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