Giảm kích thước nhị phân LiteRT

Tổng quan

Khi triển khai các mô hình cho ứng dụng học máy trên thiết bị (ODML), bạn cần lưu ý đến bộ nhớ hạn chế có trên thiết bị di động. Kích thước nhị phân của mô hình có mối tương quan chặt chẽ với số lượng thao tác được dùng trong mô hình. LiteRT cho phép bạn giảm kích thước nhị phân của mô hình bằng cách sử dụng các bản dựng có chọn lọc. Các bản dựng có chọn lọc sẽ bỏ qua các thao tác không dùng đến trong tập hợp mô hình của bạn và tạo ra một thư viện nhỏ gọn chỉ có thời gian chạy và các hạt nhân thao tác cần thiết để mô hình chạy trên thiết bị di động.

Quy trình tạo có chọn lọc áp dụng cho 3 thư viện thao tác sau.

  1. Thư viện ops tích hợp LiteRT
  2. Các thao tác tuỳ chỉnh LiteRT
  3. Chọn thư viện TensorFlow ops

Bảng bên dưới minh hoạ tác động của các bản dựng có chọn đối với một số trường hợp sử dụng phổ biến:

Tên mô hình Lâu đài Kiến trúc mục tiêu Kích thước tệp AAR
Mobilenet_1.0_224(float) Phân loại hình ảnh armeabi-v7a tensorflow-lite.aar (296.635 byte)
arm64-v8a tensorflow-lite.aar (382.892 byte)
SPICE Trích xuất cao độ âm thanh armeabi-v7a tensorflow-lite.aar (375.813 byte)
tensorflow-lite-select-tf-ops.aar (1.676.380 byte)
arm64-v8a tensorflow-lite.aar (421.826 byte)
tensorflow-lite-select-tf-ops.aar (2.298.630 byte)
i3d-kinetics-400 Phân loại video armeabi-v7a tensorflow-lite.aar (240.085 byte)
tensorflow-lite-select-tf-ops.aar (1.708.597 byte)
arm64-v8a tensorflow-lite.aar (273.713 byte)
tensorflow-lite-select-tf-ops.aar (2.339.697 byte)

Chọn lọc để tạo LiteRT bằng Bazel

Phần này giả định rằng bạn đã tải mã nguồn TensorFlow xuống và thiết lập môi trường phát triển cục bộ cho Bazel.

Tạo tệp AAR cho dự án Android

Bạn có thể tạo các AAR LiteRT tuỳ chỉnh bằng cách cung cấp đường dẫn tệp mô hình 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

Lệnh trên 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; và tuỳ chọn là tạo tệp aar bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar nếu các mô hình của bạn chứa các hoạt động Chọn TensorFlow. Xin lưu ý rằng thao tác này sẽ tạo một AAR "lớn" với nhiều cấu trúc khác nhau; nếu bạn không cần tất cả các cấu trúc này, hãy sử dụng tập hợp con phù hợp với môi trường triển khai của bạn.

Xây dựng bằng các thao tác tuỳ chỉnh

Nếu đã phát triển các mô hình LiteRT bằng các thao tác tuỳ chỉnh, bạn có thể tạo các mô hình đó bằng cách thêm các cờ sau vào lệnh tạo:

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 \
  --tflite_custom_ops_srcs=/e/f/file1.cc,/g/h/file2.h \
  --tflite_custom_ops_deps=dep1,dep2

Cờ tflite_custom_ops_srcs chứa các tệp nguồn của các thao tác tuỳ chỉnh và cờ tflite_custom_ops_deps chứa các phần phụ thuộc để tạo các tệp nguồn đó. Xin lưu ý rằng các phần phụ thuộc này phải có trong kho lưu trữ TensorFlow.

Các trường hợp sử dụng nâng cao: Quy tắc tuỳ chỉnh của Bazel

Nếu dự án của bạn đang sử dụng Bazel và bạn muốn xác định các phần phụ thuộc TFLite tuỳ chỉnh cho một nhóm mô hình nhất định, thì bạn có thể xác định(các) quy tắc sau trong kho lưu trữ dự án của mình:

Chỉ dành cho các mô hình có hoạt động tích hợp sẵn:

load(
    "@org_tensorflow//tensorflow/lite:build_def.bzl",
    "tflite_custom_android_library",
    "tflite_custom_c_library",
    "tflite_custom_cc_library",
)

# A selectively built TFLite Android library.
tflite_custom_android_library(
    name = "selectively_built_android_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# A selectively built TFLite C library.
tflite_custom_c_library(
    name = "selectively_built_c_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# A selectively built TFLite C++ library.
tflite_custom_cc_library(
    name = "selectively_built_cc_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

Đối với các mô hình có Chọn TF ops:

load(
    "@org_tensorflow//tensorflow/lite/delegates/flex:build_def.bzl",
    "tflite_flex_android_library",
    "tflite_flex_cc_library",
)

# A Select TF ops enabled selectively built TFLite Android library.
tflite_flex_android_library(
    name = "selective_built_tflite_flex_android_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# A Select TF ops enabled selectively built TFLite C++ library.
tflite_flex_cc_library(
    name = "selective_built_tflite_flex_cc_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

Cách sử dụng nâng cao: Tạo thư viện chia sẻ C/C++ tuỳ chỉnh

Nếu muốn tạo các đối tượng dùng chung C/C++ TFLite tuỳ chỉnh của riêng mình cho các mô hình đã cho, bạn có thể làm theo các bước bên dưới:

Tạo một tệp BUILD tạm thời bằng cách chạy lệnh sau trong thư mục gốc của mã nguồn TensorFlow:

mkdir -p tmp && touch tmp/BUILD

Tạo các đối tượng dùng chung C tuỳ chỉnh

Nếu bạn muốn tạo một đối tượng dùng chung C TFLite tuỳ chỉnh, hãy thêm nội dung sau vào tệp tmp/BUILD:

load(
    "//tensorflow/lite:build_def.bzl",
    "tflite_custom_c_library",
    "tflite_cc_shared_object",
)

tflite_custom_c_library(
    name = "selectively_built_c_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# Generates a platform-specific shared library containing the LiteRT C
# API implementation as define in `c_api.h`. The exact output library name
# is platform dependent:
#   - Linux/Android: `libtensorflowlite_c.so`
#   - Mac: `libtensorflowlite_c.dylib`
#   - Windows: `tensorflowlite_c.dll`
tflite_cc_shared_object(
    name = "tensorflowlite_c",
    linkopts = select({
        "//tensorflow:ios": [
            "-Wl,-exported_symbols_list,$(location //tensorflow/lite/c:exported_symbols.lds)",
        ],
        "//tensorflow:macos": [
            "-Wl,-exported_symbols_list,$(location //tensorflow/lite/c:exported_symbols.lds)",
        ],
        "//tensorflow:windows": [],
        "//conditions:default": [
            "-z defs",
            "-Wl,--version-script,$(location //tensorflow/lite/c:version_script.lds)",
        ],
    }),
    per_os_targets = True,
    deps = [
        ":selectively_built_c_lib",
        "//tensorflow/lite/c:exported_symbols.lds",
        "//tensorflow/lite/c:version_script.lds",
    ],
)

Bạn có thể tạo mục tiêu mới thêm như sau:

bazel build -c opt --cxxopt=--std=c++17 \
  //tmp:tensorflowlite_c

và đối với Android (thay thế android_arm bằng android_arm64 cho phiên bản 64 bit):

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
  //tmp:tensorflowlite_c

Tạo các đối tượng dùng chung C++ tuỳ chỉnh

Nếu bạn muốn tạo một đối tượng dùng chung TFLite C++ tuỳ chỉnh, hãy thêm nội dung sau vào tệp tmp/BUILD:

load(
    "//tensorflow/lite:build_def.bzl",
    "tflite_custom_cc_library",
    "tflite_cc_shared_object",
)

tflite_custom_cc_library(
    name = "selectively_built_cc_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# Shared lib target for convenience, pulls in the core runtime and builtin ops.
# Note: This target is not yet finalized, and the exact set of exported (C/C++)
# APIs is subject to change. The output library name is platform dependent:
#   - Linux/Android: `libtensorflowlite.so`
#   - Mac: `libtensorflowlite.dylib`
#   - Windows: `tensorflowlite.dll`
tflite_cc_shared_object(
    name = "tensorflowlite",
    # Until we have more granular symbol export for the C++ API on Windows,
    # export all symbols.
    features = ["windows_export_all_symbols"],
    linkopts = select({
        "//tensorflow:macos": [
            "-Wl,-exported_symbols_list,$(location //tensorflow/lite:tflite_exported_symbols.lds)",
        ],
        "//tensorflow:windows": [],
        "//conditions:default": [
            "-Wl,-z,defs",
            "-Wl,--version-script,$(location //tensorflow/lite:tflite_version_script.lds)",
        ],
    }),
    per_os_targets = True,
    deps = [
        ":selectively_built_cc_lib",
        "//tensorflow/lite:tflite_exported_symbols.lds",
        "//tensorflow/lite:tflite_version_script.lds",
    ],
)

Bạn có thể tạo mục tiêu mới thêm như sau:

bazel build -c opt  --cxxopt=--std=c++17 \
  //tmp:tensorflowlite

và đối với Android (thay thế android_arm bằng android_arm64 cho phiên bản 64 bit):

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
  //tmp:tensorflowlite

Đối với các mô hình có Select TF ops, bạn cũng cần tạo thư viện dùng chung sau:

load(
    "@org_tensorflow//tensorflow/lite/delegates/flex:build_def.bzl",
    "tflite_flex_shared_library"
)

# Shared lib target for convenience, pulls in the standard set of TensorFlow
# ops and kernels. The output library name is platform dependent:
#   - Linux/Android: `libtensorflowlite_flex.so`
#   - Mac: `libtensorflowlite_flex.dylib`
#   - Windows: `libtensorflowlite_flex.dll`
tflite_flex_shared_library(
  name = "tensorflowlite_flex",
  models = [
      ":model_one.tflite",
      ":model_two.tflite",
  ],
)

Bạn có thể tạo mục tiêu mới thêm như sau:

bazel build -c opt --cxxopt='--std=c++17' \
      --config=monolithic \
      --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
      //tmp:tensorflowlite_flex

và đối với Android (thay thế android_arm bằng android_arm64 cho phiên bản 64 bit):

bazel build -c opt --cxxopt='--std=c++17' \
      --config=android_arm \
      --config=monolithic \
      --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
      //tmp:tensorflowlite_flex

Chọn lọc để tạo LiteRT bằng Docker

Phần này giả định rằng bạn đã cài đặt Docker trên máy cục bộ và tải Dockerfile LiteRT xuống tại đây.

Sau khi tải Dockerfile ở trên xuống, bạn có thể tạo hình ảnh Docker bằng cách chạy:

docker build . -t tflite-builder -f tflite-android.Dockerfile

Tạo tệp AAR cho dự án Android

Tải tập lệnh để tạo bằng Docker bằng cách chạy:

curl -o build_aar_with_docker.sh \
  https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/tools/build_aar_with_docker.sh &&
chmod +x build_aar_with_docker.sh

Sau đó, bạn có thể tạo AAR LiteRT tuỳ chỉnh bằng cách cung cấp đường dẫn tệp mô hình như sau.

sh build_aar_with_docker.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a \
  --checkpoint=master \
  [--cache_dir=<path to cache directory>]

Cờ checkpoint là một cam kết, một nhánh hoặc một thẻ của kho lưu trữ TensorFlow mà bạn muốn kiểm tra trước khi tạo các thư viện; theo mặc định, đây là nhánh phát hành mới nhất. Lệnh trên sẽ tạo tệp AAR tensorflow-lite.aar cho các hoạt động tích hợp và tuỳ chỉnh của LiteRT và tuỳ chọn là tệp AAR tensorflow-lite-select-tf-ops.aar cho các hoạt động Chọn TensorFlow trong thư mục hiện tại của bạn.

--cache_dir chỉ định thư mục bộ nhớ đệm. Nếu không được cung cấp, tập lệnh sẽ tạo một thư mục có tên là bazel-build-cache trong thư mục đang hoạt động hiện tại để lưu vào bộ nhớ đệm.

Thêm tệp AAR vào dự án

Thêm tệp AAR bằng cách nhập trực tiếp tệp AAR vào dự án hoặc bằng cách xuất bản tệp AAR tuỳ chỉnh vào kho lưu trữ Maven cục bộ. Xin lưu ý rằng bạn cũng phải thêm các tệp AAR cho tensorflow-lite-select-tf-ops.aar nếu tạo tệp này.

Bản dựng có chọn lọc cho iOS

Vui lòng xem phần Tạo cục bộ để thiết lập môi trường tạo và định cấu hình không gian làm việc TensorFlow, sau đó làm theo hướng dẫn để sử dụng tập lệnh tạo có chọn lọc cho iOS.