Chọn toán tử TensorFlow

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

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

Tài liệu này trình bày cách chuyển đổichạy một mô hình LiteRT chứa các hoạt động TensorFlow trên nền tảng mà bạn chọn. Tài liệu này cũng thảo luận về các chỉ số về 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ột mô hình LiteRT bằng cách chọn các thao tác 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)

Chạy quy trình suy luận

Khi sử dụng một mô hình LiteRT đã được chuyển đổi với sự hỗ trợ cho các thao tác TensorFlow chọn lọc, ứng dụng cũng phải sử dụng một thời gian chạy LiteRT bao gồm thư viện cần thiết của các thao tác TensorFlow.

Android AAR

Để giảm kích thước 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 lo ngại, bạn nên sử dụng AAR tạo sẵn với các thao tác TensorFlow được lưu trữ tại Maven Central.

Bạn có thể chỉ định điều này trong các phần phụ thuộc build.gradle bằng cách thêm phần phụ thuộc này cùng với AAR LiteRT 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 đảm bảo rằng bạn đã thêm kho lưu trữ ảnh chụp nhanh Sonatype.

Sau khi bạn thêm phần phụ thuộc, đại biểu cần thiết để xử lý các thao tác TensorFlow của biểu đồ sẽ tự động được cài đặt cho những biểu đồ yêu cầu đại biểu đó.

Lưu ý: Phần phụ thuộc của các hoạt động TensorFlow tương đối lớn, vì vậy, có thể bạn sẽ muốn lọc ra 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'
        }
    }
}

Tạo AAR Android

Để giảm kích thước 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ử bạn có môi trường bản dựng LiteRT đang hoạt động, hãy tạo AAR Android bằng cách chọn các thao tác 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 các hoạt động tích hợp và tuỳ chỉnh của LiteRT; đồng thời tạo tệp AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar cho các hoạt động của TensorFlow. Nếu không có môi trường bản dựng đang 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ể nhập trực tiếp các tệp AAR vào dự án của mình hoặc xuất bản các tệp AAR tuỳ chỉnh vào 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 LiteRT tiêu chuẩn bằng phần phụ thuộc có hỗ trợ các thao tác TensorFlow đã chọn:

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

LiteRT cung cấp các CocoaPods chọn lọc được tạo sẵn hằng đêm cho các thao tác TF arm64 mà bạn có thể phụ thuộc cùng với các CocoaPods TensorFlowLiteSwift hoặc TensorFlowLiteObjC.

Lưu ý: Nếu cần sử dụng các thao tác TF chọn lọc trong trình mô phỏng x86_64, bạn có thể tự tạo khung thao tác 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ờ liên kết để buộc tải khung hoạt động chọn TF vào dự án của mình. Trong dự án Xcode, 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 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 iOS Phân loại hình ảnh để kiểm thử tính năng chọn thao tác TF.

  • Thay thế tệp mô hình bằng tệp được chuyển đổi khi 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 mẫu và xem liệu mô hình có hoạt động chính xác hay không.

Sử dụng Bazel + Xcode

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

Sau khi định cấu hình không gian làm việc có hỗ trợ iOS, bạn có thể dùng lệnh sau để tạo khung bổ trợ chọn thao tác TF. Khung này có thể được thêm vào trên TensorFlowLiteC.framework thông thường. Xin lưu ý rằng bạn không thể tạo khung chọn các thao tác TF cho cấu trúc i386, vì vậy, bạn cần cung cấp rõ ràng danh sách các cấu 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 Chế độ cài đặt dự án Xcode trong hướng dẫn tạo bản dựng iOS.

Sau khi thêm khung này 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 chọn TF ops. Trong dự án Xcode, 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 thông dịch LiteRT, bạn có thể bật uỷ quyền linh hoạt bằng cách liên kết một thư viện dùng chung uỷ quyền linh hoạt LiteRT. Bạn có thể tạo ứng dụng 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 sẽ 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ẽ tự động được cài đặt khi tạo trình thông dịch trong thời gian chạy, miễn là thư viện dùng chung được liên kết. Bạn không cần cài đặt rõ ràng phiên bản uỷ quyền như thường lệ với các loại uỷ quyền khác.

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

Python

LiteRT với các thao tác TensorFlow chọn lọc sẽ tự động được cài đặt cùng với gói pip TensorFlow. Bạn cũng có thể chỉ cài đặt gói pip LiteRT Interpreter.

Chỉ số

Hiệu suất

Khi sử dụng kết hợp cả các hoạt động TensorFlow tích hợp và chọn, tất cả các hoạt động tối ưu hoá LiteRT và các hoạt động tích hợp được tối ưu hoá tương tự sẽ có sẵn và có thể sử dụng 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à thời gian trung bình của 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ác thao tác tích hợp (TFLITE_BUILTIN) 260,7
Chỉ sử dụng các thao tác 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 LiteRT cho từng bản dựng. Các mục tiêu này được tạo cho Android bằ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 thao tác tích hợp sẵn 796 KB 561 KB
Các thao tác tích hợp sẵn + Các thao tác TF 23 MB 8 MB
Các thao tác tích hợp sẵn + Các thao tác TF (1) 4,1 MB 1,8 MB

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

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

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

Nội dung cập nhật

  • Phiên bản 2.6
    • Hỗ trợ cho các toán tử dựa trên thuộc tính GraphDef và việc khởi tạo 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 các uỷ quyền được tăng tốc phần cứng đã được cải thiện