개요
온디바이스 머신러닝 (ODML) 애플리케이션용 모델을 배포할 때는 모바일 기기에서 사용할 수 있는 메모리가 제한되어 있다는 점을 알아야 합니다. 모델 바이너리 크기는 모델에서 사용되는 작업 수와 밀접한 관련이 있습니다. LiteRT를 사용하면 선택적 빌드를 사용하여 모델 바이너리 크기를 줄일 수 있습니다. 선택적 빌드는 모델 세트에서 사용하지 않는 작업을 건너뛰고 모델이 모바일 기기에서 실행하는 데 필요한 런타임과 op 커널만 있는 컴팩트한 라이브러리를 생성합니다.
선택적 빌드는 다음 세 가지 작업 라이브러리에 적용됩니다.
아래 표는 몇 가지 일반적인 사용 사례에서 선택적 빌드의 영향을 보여줍니다.
| 모델 이름 | 도메인 | 타겟 아키텍처 | AAR 파일 크기 |
|---|---|---|---|
| Mobilenet_1.0_224(float) | 이미지 분류 | armeabi-v7a | tensorflow-lite.aar (296,635바이트) |
| arm64-v8a | tensorflow-lite.aar (382,892바이트) | ||
| SPICE | 소리 피치 추출 | armeabi-v7a | tensorflow-lite.aar (375,813바이트) tensorflow-lite-select-tf-ops.aar (1,676,380바이트) |
| arm64-v8a | tensorflow-lite.aar (421,826바이트) tensorflow-lite-select-tf-ops.aar (2,298,630바이트) |
||
| i3d-kinetics-400 | 동영상 분류 | armeabi-v7a | tensorflow-lite.aar (240,085바이트) tensorflow-lite-select-tf-ops.aar (1,708,597바이트) |
| arm64-v8a | tensorflow-lite.aar (273,713바이트) tensorflow-lite-select-tf-ops.aar (2,339,697바이트) |
Bazel로 LiteRT 선택적 빌드
이 섹션에서는 TensorFlow 소스 코드를 다운로드하고 Bazel에 로컬 개발 환경을 설정했다고 가정합니다.
Android 프로젝트용 AAR 파일 빌드
다음과 같이 모델 파일 경로를 제공하여 맞춤 LiteRT AAR을 빌드할 수 있습니다.
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
위 명령어는 LiteRT 내장 및 맞춤 작업의 AAR 파일 bazel-bin/tmp/tensorflow-lite.aar를 생성하고, 모델에 TensorFlow 선택 작업이 포함된 경우 선택적으로 aar 파일 bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar를 생성합니다. 이렇게 하면 여러 아키텍처가 포함된 'fat' AAR이 빌드됩니다. 모든 아키텍처가 필요하지 않다면 배포 환경에 적합한 하위 집합을 사용하세요.
맞춤 작업으로 빌드
맞춤 작업으로 LiteRT 모델을 개발한 경우 빌드 명령어에 다음 플래그를 추가하여 빌드할 수 있습니다.
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
tflite_custom_ops_srcs 플래그에는 맞춤 작업의 소스 파일이 포함되고 tflite_custom_ops_deps 플래그에는 이러한 소스 파일을 빌드하기 위한 종속 항목이 포함됩니다. 이러한 종속 항목은 TensorFlow 저장소에 있어야 합니다.
고급 사용법: 맞춤 Bazel 규칙
프로젝트에서 Bazel을 사용하고 특정 모델 세트에 대해 맞춤 TFLite 종속 항목을 정의하려면 프로젝트 저장소에서 다음 규칙을 정의하면 됩니다.
기본 제공 작업이 있는 모델의 경우:
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",
],
)
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/C++ 공유 라이브러리 빌드
제공된 모델을 향해 자체 맞춤 TFLite C/C++ 공유 객체를 빌드하려면 다음 단계를 따르세요.
TensorFlow 소스 코드의 루트 디렉터리에서 다음 명령어를 실행하여 임시 BUILD 파일을 만듭니다.
mkdir -p tmp && touch tmp/BUILD
맞춤 C 공유 객체 빌드
맞춤 TFLite C 공유 객체를 빌드하려면 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",
],
)
새로 추가된 타겟은 다음과 같이 빌드할 수 있습니다.
bazel build -c opt --cxxopt=--std=c++17 \
//tmp:tensorflowlite_c
Android의 경우 (64비트의 경우 android_arm를 android_arm64로 대체)
bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
//tmp:tensorflowlite_c
맞춤 C++ 공유 객체 빌드
맞춤 TFLite C++ 공유 객체를 빌드하려면 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",
],
)
새로 추가된 타겟은 다음과 같이 빌드할 수 있습니다.
bazel build -c opt --cxxopt=--std=c++17 \
//tmp:tensorflowlite
Android의 경우 (64비트의 경우 android_arm를 android_arm64로 대체)
bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
//tmp:tensorflowlite
TF 작업 선택이 있는 모델의 경우 다음 공유 라이브러리도 빌드해야 합니다.
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",
],
)
새로 추가된 타겟은 다음과 같이 빌드할 수 있습니다.
bazel build -c opt --cxxopt='--std=c++17' \
--config=monolithic \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
//tmp:tensorflowlite_flex
Android의 경우 (64비트의 경우 android_arm를 android_arm64로 대체)
bazel build -c opt --cxxopt='--std=c++17' \
--config=android_arm \
--config=monolithic \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
//tmp:tensorflowlite_flex
Docker로 LiteRT 선택적 빌드
이 섹션에서는 로컬 머신에 Docker를 설치하고 여기에서 LiteRT Dockerfile을 다운로드했다고 가정합니다.
위의 Dockerfile을 다운로드한 후 다음을 실행하여 Docker 이미지를 빌드할 수 있습니다.
docker build . -t tflite-builder -f tflite-android.Dockerfile
Android 프로젝트용 AAR 파일 빌드
다음 명령어를 실행하여 Docker로 빌드하기 위한 스크립트를 다운로드합니다.
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
그런 다음 다음과 같이 모델 파일 경로를 제공하여 맞춤 LiteRT AAR을 빌드할 수 있습니다.
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>]
checkpoint 플래그는 라이브러리를 빌드하기 전에 체크아웃할 TensorFlow 저장소의 커밋, 브랜치 또는 태그입니다. 기본적으로 최신 출시 브랜치입니다. 위 명령어는 LiteRT 내장 및 맞춤 작업의 AAR 파일 tensorflow-lite.aar와 선택적으로 현재 디렉터리에 있는 Select TensorFlow 작업의 AAR 파일 tensorflow-lite-select-tf-ops.aar을 생성합니다.
--cache_dir은 캐시 디렉터리를 지정합니다. 제공되지 않으면 스크립트에서 캐싱을 위해 현재 작업 디렉터리 아래에 bazel-build-cache라는 디렉터리를 만듭니다.
프로젝트에 AAR 파일 추가
프로젝트에 AAR을 직접 가져오거나 커스텀 AAR을 로컬 Maven 저장소에 게시하여 AAR 파일을 추가합니다. tensorflow-lite-select-tf-ops.aar의 AAR 파일을 생성하는 경우 이를 추가해야 합니다.
iOS용 선택적 빌드
로컬 빌드 섹션을 참고하여 빌드 환경을 설정하고 TensorFlow 작업공간을 구성한 후 가이드에 따라 iOS용 선택적 빌드 스크립트를 사용하세요.