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

Tổng quan

Khi triển khai 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ớ bị giới hạn 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 hoạt động được sử dụng trong mô hình. LiteRT giúp bạn giảm kích thước nhị phân của mô hình bằng cách sử dụng bản dựng có chọn lọ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 và tạo một thư viện nhỏ gọn chỉ có thời gian chạy và hạt nhân hoạt động cần thiết cho mô hình để chạy trên thiết bị di động của bạn.

Bản dựng có chọn lọc áp dụng cho 3 thư viện thao tác sau đây.

  1. Thư viện hoạt động tích hợp LiteRT
  2. Hoạt động tuỳ chỉnh LiteRT
  3. Chọn thư viện hoạt động TensorFlow

Bảng dưới đây trình bày tác động của các bản dựng có chọn lọc đối với một số trường hợp sử dụng phổ biến trường hợp:

Tên mô hình Lâu đài Cấu 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)
TÁC TRẠNG 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-động học-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)

Xây dựng LiteRT một cách có chọn lọc bằng Bazel

Phần này giả định rằng bạn đã tải mã nguồn TensorFlow xuống và đặt phát triển địa phương môi trường sang Bazel.

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

Bạn có thể xây dựng 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 hoạt động tuỳ chỉnh và tích hợp LiteRT; và tuỳ ý tạo aar tệp bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar nếu mô hình của bạn chứa Chọn hoạt động TensorFlow. Lưu ý rằng điều này sẽ tạo ra một "chất béo" AAR với một vài chế độ cài đặt kiến trúc; nếu bạn không cần tất cả, hãy sử dụng tập hợp con phù hợp cho môi trường triển khai.

Tạo bản dựng bằng hoạt động tuỳ chỉnh

Nếu đã phát triển các mô hình LiteRT với hoạt động 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 hoạt động tuỳ chỉnh và cờ tflite_custom_ops_deps chứa các phần phụ thuộc để tạo các nguồn đó tệp. Xin lưu ý rằng các phần phụ thuộc này phải tồn tại trong kho lưu trữ TensorFlow.

Cách sử dụng nâng cao: Quy tắc Bazel tuỳ chỉnh

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

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ó hoạt động Chọn hoạt động TF:

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",
    ],
)

Sử dụng nâng cao: Xây dựng thư viện chia sẻ C/C++ tuỳ chỉnh

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

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

mkdir -p tmp && touch tmp/BUILD

Tạo đố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 phần 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à dành cho Android (thay thế android_arm bằng android_arm64 cho 64 bit):

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

Tạo đố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 đoạn mã 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à dành cho Android (thay thế android_arm bằng android_arm64 cho 64 bit):

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

Đối với các mô hình có hoạt động Select TF, bạn cũng cần tạo thư viện chia sẻ:

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à dành cho Android (thay thế android_arm bằng android_arm64 cho 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

Xây dựng LiteRT một cách có chọn lọc bằng Docker

Phần này giả định rằng bạn đã cài đặt Docker trên máy cục bộ của bạn và đã tải LiteRT Dockerfile 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 đang 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 xuống để tạo bản dựng 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ể xây dựng LiteRT AAR tuỳ chỉnh bằng cách cung cấp tệp mô hình đường dẫn 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 bạn muốn kiểm tra trước khi xây dựng thư viện; theo mặc định, đó là phiên bản mới nhất nhánh phát hành. Lệnh ở trên sẽ tạo tệp AAR tensorflow-lite.aar cho hoạt động tuỳ chỉnh và tích hợp LiteRT cũng như không bắt buộc tệp AAR tensorflow-lite-select-tf-ops.aar cho mục Chọn hoạt động 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 bazel-build-cache trong thư mục đang làm việc cho 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 AAR tuỳ chỉnh đến Maven cục bộ kho lưu trữ. Ghi chú bạn phải thêm các tệp AAR cho tensorflow-lite-select-tf-ops.aar dưới dạng nếu bạn tạo nó.

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

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