Giảm kích thước tệp nhị phân TensorFlow Lite

Tổng quan

Khi triển khai các mô hình cho các ứng dụng học máy trên thiết bị (ODML), bạn cần lưu ý đến bộ nhớ có giới hạn có trên thiết bị di động. Kích thước nhị phân của mô hình tương quan chặt chẽ với số lượng hoạt động được sử dụng trong mô hình. TensorFlow Lite 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 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 nhóm mô hình và tạo ra 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 để 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 sẵn TensorFlow Lite
  2. Hoạt động tuỳ chỉnh trên TensorFlow Lite
  3. Chọn thư viện hoạt động TensorFlow

Bảng dưới đây minh hoạ 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:

Tên mô hình Lâu đài Cấu trúc mục tiêu (Các) 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 TensorFlow Lite 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à 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 AAR tuỳ chỉnh cho TensorFlow Lite bằng cách cung cấp các đườ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 TensorFlow Lite; đồng thời 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 Chọn hoạt động TensorFlow. Xin lưu ý rằng thao tác này sẽ tạo một AAR "lớn" với một số cấu trúc khác nhau; nếu bạn không cần tất cả các cấu trúc đó, 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.

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 Tensorflow Lite với các 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 bản dựng:

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 tệp nguồn đó. 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 xác định các phần phụ thuộc TFLite tuỳ chỉnh cho một tập hợp 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ó 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 muốn tạo đối tượng dùng chung TFLite C/C++ 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 dưới đây:

Tạo tệp BUILD tạm thời bằng cách chạy lệnh sau tại thư mục gố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 TensorFlow Lite 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 phần 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 dùng chung sau đây:

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 TensorFlow Lite 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ộ và tải tệp Dockerfile của TensorFlow Lite 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 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ể tạo TensorFlow Lite AAR tuỳ chỉnh bằng cách cung cấp các đườ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 xác nhận, một nhánh hoặc thẻ của kho lưu trữ TensorFlow mà bạn muốn kiểm tra trước khi xây dựng thư viện; theo mặc định, đây là nhánh bản phát hành mới nhất. 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 TensorFlow Lite, cũng như tạo 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.

--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 hoạt động để 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 phát hành AAR tuỳ chỉnh lên 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 đó.

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

Vui lòng xem mục Xây dựng cục bộ để thiết lập môi trường tạo bản dựng 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 bản dựng có chọn lọc cho iOS.