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

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), điều quan trọng là phải lưu ý đến bộ nhớ hạn chế hiệ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. TensorFlow Lite 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 chọn lọc bỏ qua các hoạt động không được sử dụng trong bộ mô hình của bạn và tạo ra một thư viện nhỏ gọn chỉ với thời gian chạy và hạt nhân op cần thiết để mô hình chạy trên thiết bị di động của bạn.

Bản dựng chọn lọc áp dụng trên ba thư viện hoạt động sau.

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

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

Tên mẫu Lãnh địa Kiến trúc mục tiêu (Các) kích thước tệp AAR
Mobilenet_1.0_224(thả nổi) Phân loại hình ảnh armeabi-v7a tensorflow-lite.aar (296.635 byte)
arm64-v8a tensorflow-lite.aar (382.892 byte)
gia vị Trích xuất cao độ âm thanh armeabi-v7a tenorflow-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-kinetic-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 tenorflow-lite.aar (273.713 byte)
tensorflow-lite-select-tf-ops.aar (2.339.697 byte)

Xây dựng có chọn lọc TensorFlow Lite với Bazel

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

Xây dựng tệp AAR cho dự án Android

Bạn có thể xây dựng các AAR TensorFlow Lite tùy chỉnh bằng cách cung cấp đường dẫn tệp mô hình của mì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ùy chỉnh và tích hợp sẵn của TensorFlow Lite; và tùy ý tạo tệp aar bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar nếu mô hình của bạn chứa các hoạt động Chọn TensorFlow. Lưu ý rằng điều này xây dựng một AAR "béo" với nhiều kiến ​​trúc khác nhau; nếu bạn không cần tất cả chúng, 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 với các hoạt động tùy chỉnh

Nếu bạn đã phát triển các mô hình Tensorflow Lite với các hoạt động tùy chỉnh, bạn có thể xây dựng chúng bằng cách thêm các cờ sau vào lệnh xây 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 các hoạt động tùy chỉnh của bạn và cờ tflite_custom_ops_deps chứa các phần phụ thuộc để xây dựng các tệp nguồn đó. Lưu ý rằng những 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 tùy 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 tùy chỉnh 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 của mình:

Chỉ dành cho các kiểu máy có op tích hợp:

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ẫu có tùy chọn Chọn 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",
    ],
)

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

Nếu bạn muốn xây dựng các đối tượng chia sẻ TFLite C/C++ tùy chỉnh của riêng mình theo các mô hình nhất định, 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

Xây dựng các đối tượng chia sẻ C tùy chỉnh

Nếu bạn muốn xây dựng một đối tượng chia sẻ TFLite C tùy 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",
    ],
)

Mục tiêu mới được thêm vào có thể được xây dựng 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 64-bit):

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

Xây dựng các đối tượng chia sẻ C++ tùy chỉnh

Nếu bạn muốn xây dựng một đối tượng chia sẻ TFLite C++ tùy 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",
    ],
)

Mục tiêu mới được thêm vào có thể được xây dựng 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 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 Chọn TF, bạn cũng cần xây dựng 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",
  ],
)

Mục tiêu mới được thêm vào có thể được xây dựng 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 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 có chọn lọc TensorFlow Lite với Docker

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

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

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

Xây dựng tệp AAR cho dự án Android

Tải xuống tập lệnh để xây 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 TensorFlow Lite AAR tùy chỉnh bằng cách cung cấp đường dẫn tệp mô hình của mì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 xây dựng thư viện; theo mặc định nó 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ùy chỉnh và tích hợp sẵn của TensorFlow Lite, cũng như tùy chọn 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ộ đệ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 làm việc hiện tại để lưu vào bộ đệ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 AAR vào dự án của bạn hoặc bằng cách xuất bản AAR tùy chỉnh lên kho lưu trữ Maven cục bộ của bạn . 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 bạn tạo nó.

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

Vui lòng xem phần Xây dựng cục bộ để 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 để sử dụng tập lệnh xây dựng có chọn lọc cho iOS.