Chọn toán tử TensorFlow

Vì thư viện toán tử tích hợp TensorFlow Lite chỉ hỗ trợ một số ít toán tử TensorFlow, nên không phải mô hình nào cũng chuyển đổi được. Để biết thông tin chi tiết, hãy tham khảo phần khả năng tương thích của toán tử.

Để cho phép chuyển đổi, người dùng có thể cho phép sử dụng một số hoạt động TensorFlow nhất định trong mô hình TensorFlow Lite. Tuy nhiên, để chạy các mô hình TensorFlow Lite với hoạt động TensorFlow, bạn phải lấy thời gian chạy TensorFlow cốt lõi để tăng kích thước nhị phân của trình dịch TensorFlow Lite. Đối với Android, bạn có thể tránh điều này bằng cách chỉ xây dựng một cách chọn lọc các hoạt động Tensorflow bắt buộc. Để biết thông tin chi tiết, hãy tham khảo bài viết giảm kích thước tệp nhị phân.

Tài liệu này trình bày cách chuyển đổirun mô hình TensorFlow Lite có chứa hoạt động TensorFlow trên nền tảng bạn chọn. Bài viết này cũng thảo luận về chỉ số hiệu suất và kích thước cũng như các hạn chế đã biết.

Chuyển đổi mô hình

Ví dụ sau đây cho thấy cách tạo mô hình TensorFlow Lite bằng một số hoạt động 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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Chạy suy luận

Khi sử dụng mô hình TensorFlow Lite đã được chuyển đổi có hỗ trợ cho một số hoạt động TensorFlow, ứng dụng cũng phải sử dụng thời gian chạy TensorFlow Lite có chứa thư viện hoạt động TensorFlow cần thiết.

AAR trên Android

Để giảm kích thước tệp nhị phân, vui lòng tạo các tệp AAR tuỳ chỉnh của riêng bạn theo hướng dẫn trong phần tiếp theo. Nếu kích thước nhị phân không phải là vấn đề đáng kể, bạn nên sử dụng AAR với hoạt động TensorFlow được lưu trữ tại Maven Central tạo sẵn.

Bạn có thể chỉ định mã này trong các phần phụ thuộc build.gradle bằng cách thêm mã này cùng với TensorFlow Lite AAR tiêu chuẩn như sau:

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'
}

Để sử dụng ảnh chụp nhanh hằng đêm, hãy nhớ thêm kho lưu trữ ảnh chụp nhanh Sonatype.

Sau khi bạn thêm phần phụ thuộc, hệ thống uỷ quyền cần thiết để xử lý hoạt động TensorFlow của biểu đồ phải được cài đặt tự động cho các biểu đồ yêu cầu chúng.

Lưu ý: Phần phụ thuộc hoạt động của TensorFlow tương đối lớn, vì vậy, có thể bạn nên lọc bỏ các ABI x86 không cần thiết trong tệp .gradle bằng cách thiết lập abiFilters.

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

Xây dựng AAR trên Android

Để giảm kích thước tệp nhị phân hoặc các trường hợp nâng cao khác, bạn cũng có thể tạo thư viện theo cách thủ công. Giả sử một môi trường xây dựng TensorFlow Lite hoạt động, hãy tạo AAR cho Android bằng một số hoạt động TensorFlow như sau:

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

Thao tác này sẽ tạo tệp AAR bazel-bin/tmp/tensorflow-lite.aar cho hoạt động tuỳ chỉnh và tích hợp TensorFlow Lite; đồng thời tạo tệp AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar cho hoạt động của TensorFlow. Nếu không có môi trường tạo bản dựng hoạt động, bạn cũng có thể tạo các tệp ở trên bằng Docker.

Từ đó, bạn có thể trực tiếp nhập các tệp AAR vào dự án hoặc phát hành các tệp AAR tuỳ chỉnh lên kho lưu trữ Maven cục bộ:

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

Cuối cùng, trong build.gradle của ứng dụng, hãy đảm bảo bạn có phần phụ thuộc mavenLocal() và thay thế phần phụ thuộc TensorFlow Lite tiêu chuẩn bằng phần phụ thuộc có hỗ trợ để chọn hoạt động 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

Sử dụng CocoaPods

TensorFlow Lite cung cấp tuỳ chọn TF ops CocoaPods chọn lọc tạo sẵn ban đêm cho arm64, mà bạn có thể dựa vào cùng với TensorFlowLiteSwift hoặc TensorFlowLiteObjC CocoaPods.

Lưu ý: Nếu cần sử dụng một số hoạt động TF chọn lọc trong trình mô phỏng x86_64, bạn có thể tự xây dựng khung hoạt động chọn lọc. Hãy xem phần Sử dụng Bazel + Xcode để biết thêm thông tin chi tiết.

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

Sau khi chạy pod install, bạn cần cung cấp thêm một cờ trình liên kết để buộc tải khung hoạt động TF đã chọn vào dự án. Trong dự án Xcode của bạn, hãy chuyển đến Build Settings -> Other Linker Flags rồi thêm:

Đối với phiên bản >= 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

Đối với phiên bản < 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

Sau đó, bạn sẽ có thể chạy mọi mô hình được chuyển đổi bằng SELECT_TF_OPS trong ứng dụng iOS của mình. Ví dụ: bạn có thể sửa đổi ứng dụng Phân loại hình ảnh trên iOS để kiểm thử tính năng hoạt động TF chọn lọc.

  • Thay thế tệp mô hình bằng tệp đã chuyển đổi có bật SELECT_TF_OPS.
  • Thêm phần phụ thuộc TensorFlowLiteSelectTfOps vào Podfile theo hướng dẫn.
  • Thêm cờ trình liên kết bổ sung như ở trên.
  • Chạy ứng dụng ví dụ và xem mô hình có hoạt động đúng cách hay không.

Sử dụng Bazel + Xcode

Bạn có thể dùng Bazel để xây dựng TensorFlow Lite với một số hoạt động TensorFlow cho iOS. Trước tiên, hãy làm theo hướng dẫn tạo bản dựng dành cho iOS để định cấu hình không gian làm việc Bazel và tệp .bazelrc một cách chính xác.

Sau khi định cấu hình không gian làm việc có bật tính năng hỗ trợ iOS, bạn có thể sử dụng lệnh sau để tạo khung tiện ích bổ sung hoạt động TF chọn lọc. Bạn có thể thêm khung này vào TensorFlowLiteC.framework thông thường. Lưu ý: Không thể xây dựng khung hoạt động TF chọn lọc cho cấu trúc i386. Vì vậy, bạn cần cung cấp rõ ràng danh sách kiến trúc mục tiêu ngoại trừ i386.

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

Thao tác này sẽ tạo khung trong thư mục bazel-bin/tensorflow/lite/ios/. Bạn có thể thêm khung mới này vào dự án Xcode bằng cách làm theo các bước tương tự như mô tả trong phần Cài đặt dự án Xcode trong hướng dẫn tạo bản dựng iOS.

Sau khi thêm khung vào dự án ứng dụng, bạn nên chỉ định thêm một cờ trình liên kết trong dự án ứng dụng để buộc tải khung hoạt động TF đã chọn. Trong dự án Xcode của bạn, hãy chuyển đến Build Settings -> Other Linker Flags rồi thêm:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++

Nếu đang sử dụng Bazel hoặc CMake để tạo trình diễn giải cho TensorFlow Lite, bạn có thể bật tính năng uỷ quyền Flex bằng cách liên kết thư viện chia sẻ uỷ quyền TensorFlow Lite Flex. Bạn có thể tạo tệp này bằng Bazel dưới dạng lệnh sau.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

Lệnh này tạo thư viện dùng chung sau đây trong bazel-bin/tensorflow/lite/delegates/flex.

Nền tảng Tên thư viện
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

Xin lưu ý rằng TfLiteDelegate cần thiết sẽ được tự động cài đặt khi tạo trình phiên dịch trong thời gian chạy, miễn là thư viện chia sẻ đã được liên kết. Bạn không cần phải cài đặt rõ ràng thực thể uỷ quyền như thường bắt buộc với các loại uỷ quyền khác.

Lưu ý: Tính năng này chỉ có trên phiên bản 2.7.

Python

TensorFlow Lite với một số hoạt động TensorFlow sẽ được tự động cài đặt bằng gói TensorFlow pip. Bạn cũng có thể chọn chỉ cài đặt gói pip cho Trình thông dịch TensorFlow Lite.

Chỉ số

Hiệu suất

Khi sử dụng kết hợp cả hoạt động tích hợp và một số hoạt động TensorFlow, bạn có thể sử dụng tất cả các hoạt động tối ưu hoá TensorFlow Lite và hoạt động tích hợp được tối ưu hoá giống nhau và có thể sử dụng được với mô hình đã chuyển đổi.

Bảng sau đây mô tả thời gian trung bình cần thiết để chạy suy luận trên MobileNet trên Pixel 2. Thời gian được liệt kê là trung bình 100 lần chạy. Các mục tiêu này được tạo cho Android bằng cách sử dụng các cờ: --config=android_arm64 -c opt.

Tạo Thời gian (mili giây)
Chỉ các hoạt động tích hợp sẵn (TFLITE_BUILTIN) 260,7
Chỉ sử dụng hoạt động TF (SELECT_TF_OPS) 264,5

Kích thước nhị phân

Bảng sau đây mô tả kích thước nhị phân của TensorFlow Lite cho mỗi bản dựng. Các mục tiêu này được tạo cho Android bằng cách sử dụng --config=android_arm -c opt.

Tạo Kích thước nhị phân C++ Kích thước APK Android
Chỉ các hoạt động tích hợp sẵn 796 KB 561 KB
Hoạt động tích hợp + Hoạt động TF 23,0 MB 8,0 MB
Hoạt động tích hợp + Hoạt động TF (1) 4,1 MB 1,8 MB

(1) Các thư viện này được xây dựng có chọn lọc cho mô hình i3d-kinetics-400 với 8 hoạt động tích hợp TFLite và 3 hoạt động Tensorflow. Để biết thêm thông tin, vui lòng xem phần Giảm kích thước tệp nhị phân TensorFlow Lite.

Các hạn chế đã biết

  • Các loại không được hỗ trợ: Một số hoạt động TensorFlow có thể không hỗ trợ toàn bộ các loại đầu vào/đầu ra thường có trong TensorFlow.

Bản cập nhật

  • Phiên bản 2.6
    • Khả năng hỗ trợ cho các toán tử dựa trên thuộc tính GraphDef và khởi chạy tài nguyên HashTable đã được cải thiện.
  • Phiên bản 2.5
  • Phiên bản 2.4
    • Khả năng tương thích với uỷ quyền được tăng tốc phần cứng đã được cải thiện