ช่วยปกป้อง Great Barrier Reef กับ TensorFlow บน Kaggle เข้าร่วมท้าทาย

เลือกตัวดำเนินการ TensorFlow

เนื่องจากไลบรารีโอเปอเรเตอร์ในตัวของ 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

เราจัดเตรียม TF ops CocoaPods ที่สร้างไว้ล่วงหน้าทุกคืนสำหรับ armv7 และ 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 และเพิ่ม:

-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=armv7,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++

เมื่อสร้างไลบรารี TensorFlow Lite โดยใช้ไปป์ไลน์ bazel ไลบรารี TensorFlow ops เพิ่มเติมสามารถรวมและเปิดใช้งานได้ดังนี้:

  • เปิดใช้งานบิลด์เสาหินหากจำเป็นโดยเพิ่มแฟล็ก --config=monolithic build
  • เพิ่มการพึ่งพาไลบรารีผู้รับมอบสิทธิ์ TensorFlow ops ในการพึ่งพาบิลด์: tensorflow/lite/delegates/flex:delegate

โปรดทราบว่า 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
  • เวอร์ชัน 2.4
    • ความเข้ากันได้กับผู้ได้รับมอบหมายที่เร่งด้วยฮาร์ดแวร์ได้รับการปรับปรุง