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.
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.