TensorFlow Lite ikili program boyutunu küçültme

Genel bakış

Cihaz üzerinde makine öğrenimi (ODML) uygulamaları için modelleri dağıtırken mobil cihazlarda kullanılabilen sınırlı belleğin farkında olmak önemlidir. Model ikili boyutları, modelde kullanılan işlem sayısıyla yakından ilişkilidir. TensorFlow Lite, seçici derlemeleri kullanarak model ikili programı boyutlarını küçültmenizi sağlar. Seçimli derlemeler, model kümenizdeki kullanılmayan işlemleri atlayarak modelin mobil cihazınızda çalışması için yalnızca çalışma zamanı ve işlem çekirdekleriyle kompakt bir kitaplık oluşturur.

Seçmeli derleme aşağıdaki üç işlem kitaplığında geçerlidir.

  1. TensorFlow Lite yerleşik işlem kitaplığı
  2. TensorFlow Lite özel işlemleri
  3. TensorFlow işlem kitaplığını seçin

Aşağıdaki tabloda, seçmeli derlemelerin bazı yaygın kullanım alanları üzerindeki etkisi gösterilmektedir:

Model Adı Alan Hedef mimari AAR dosya boyutları
Mobilenet_1.0_224(float) Görüntü sınıflandırma ermeabi-v7a tensorflow-lite.aar (296.635 bayt)
kol64-v8a tensorflow-lite.aar (382.892 bayt)
BİLGİ Ses perdesi çıkarma ermeabi-v7a tensorflow-lite.aar (375.813 bayt)
tensorflow-lite-select-tf-ops.aar (1.676.380 bayt)
kol64-v8a tensorflow-lite.aar (421.826 bayt)
tensorflow-lite-select-tf-ops.aar (2.298.630 bayt)
i3d-kinetics-400 Video sınıflandırma ermeabi-v7a tensorflow-lite.aar (240.085 bayt)
tensorflow-lite-select-tf-ops.aar (1.708.597 bayt)
kol64-v8a tensorflow-lite.aar (273.713 bayt)
tensorflow-lite-select-tf-ops.aar (2.339.697 bayt)

Bazel ile seçmeli olarak TensorFlow Lite'ı derleme

Bu bölümde, TensorFlow kaynak kodlarını indirdiğiniz ve Bazel'a yerel geliştirme ortamını kurduğunuz varsayılır.

Android projesi için AAR dosyaları oluşturma

Model dosya yollarınızı aşağıdaki gibi sağlayarak özel TensorFlow Lite AAR'lerini oluşturabilirsiniz.

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

Yukarıdaki komut, TensorFlow Lite'ın yerleşik ve özel işlemleri için bazel-bin/tmp/tensorflow-lite.aar AAR dosyasını oluşturur. Modelleriniz "Select TensorFlow" işlemlerini içeriyorsa aar dosyasını da (isteğe bağlı) bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar oluşturur. Bunun birkaç farklı mimariye sahip "şişman" bir AAR derlediğini unutmayın. Bunların tümüne ihtiyacınız yoksa dağıtım ortamınıza uygun alt kümeyi kullanın.

Özel işlemlerle derleme

Özel işlemler içeren Tensorflow Lite modelleri geliştirdiyseniz bu modelleri, derleme komutuna aşağıdaki işaretleri ekleyerek derleyebilirsiniz:

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 işareti, özel işlemlerinizin kaynak dosyalarını, tflite_custom_ops_deps işareti ise bu kaynak dosyalarını derlemek için kullanılan bağımlılıkları içerir. Bu bağımlılıkların TensorFlow deposunda bulunması gerektiğini unutmayın.

Gelişmiş Kullanımlar: Özel Bazel kuralları

Projenizde Bazel kullanılıyorsa ve belirli bir model grubu için özel TFLite bağımlılıkları tanımlamak istiyorsanız proje deponuzda aşağıdaki kuralları tanımlayabilirsiniz:

Yalnızca yerleşik operasyonlara sahip modeller için:

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 işlemlerini seç olan modeller için:

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

Gelişmiş Kullanımlar: Özel C/C++ paylaşılan kitaplıklar oluşturun

Belirtilen modeller için kendi özel TFLite C/C++ paylaşılan nesnelerinizi oluşturmak istiyorsanız aşağıdaki adımları uygulayabilirsiniz:

TensorFlow kaynak kodunun kök dizininde aşağıdaki komutu çalıştırarak geçici bir BUILD dosyası oluşturun:

mkdir -p tmp && touch tmp/BUILD

Özel C paylaşılan nesneleri oluşturma

Özel bir TFLite C paylaşılan nesnesi oluşturmak istiyorsanız tmp/BUILD dosyasına aşağıdakini ekleyin:

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

Yeni eklenen hedef aşağıdaki gibi oluşturulabilir:

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

ve Android için (64 bit için android_arm yerine android_arm64 kullanın):

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

Özel C++ paylaşılan nesneleri oluşturma

Özel bir TFLite C++ paylaşılan nesnesi oluşturmak istiyorsanız tmp/BUILD dosyasına aşağıdakini ekleyin:

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

Yeni eklenen hedef aşağıdaki gibi oluşturulabilir:

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

ve Android için (64 bit için android_arm yerine android_arm64 kullanın):

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

Select TF operasyonlarına sahip modeller için aşağıdaki paylaşılan kitaplığı da oluşturmanız gerekir:

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

Yeni eklenen hedef aşağıdaki gibi oluşturulabilir:

bazel build -c opt --cxxopt='--std=c++17' \
      --config=monolithic \
      --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
      //tmp:tensorflowlite_flex

ve Android için (64 bit için android_arm yerine android_arm64 kullanın):

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 ile Seçerek TensorFlow Lite'ı Derleme

Bu bölümde, yerel makinenize Docker'ı yüklediğiniz ve buradan TensorFlow Lite Dockerfile'ı indirdiğiniz varsayılır.

Yukarıdaki Dockerfile'ı indirdikten sonra aşağıdaki komutu çalıştırarak Docker görüntüsünü oluşturabilirsiniz:

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

Android projesi için AAR dosyaları oluşturma

Şu komutu çalıştırarak Docker ile derleme komut dosyasını indirin:

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

Daha sonra, model dosya yollarınızı aşağıdaki gibi sağlayarak özel TensorFlow Lite AAR'yi oluşturabilirsiniz.

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 işareti, kitaplıkları oluşturmadan önce ödeme yapmak istediğiniz TensorFlow deposunun bir kaydetme, dalı veya etiketidir. Varsayılan olarak en son sürüm dalıdır. Yukarıdaki komut, TensorFlow Lite'ın yerleşik ve özel işlemleri için AAR dosyasını tensorflow-lite.aar ve isteğe bağlı olarak mevcut dizininizdeki Select TensorFlow işlemleri için tensorflow-lite-select-tf-ops.aar AAR dosyasını oluşturur.

--cache_dir önbellek dizinini belirtir. Sağlanmazsa komut dosyası, önbelleğe alma için mevcut çalışma dizininin altında bazel-build-cache adlı bir dizin oluşturur.

Projeye AAR dosyaları ekleyin

AAR'yi doğrudan projenize aktararak veya özel AAR'yi yerel Maven deponuzda yayınlayarak AAR dosyalarını ekleyin. AAR dosyalarını oluşturursanız tensorflow-lite-select-tf-ops.aar için de AAR dosyalarını eklemeniz gerektiğini unutmayın.

iOS için Selective Build

Derleme ortamını ayarlamak ve TensorFlow çalışma alanını yapılandırmak için lütfen Yerel olarak derleme bölümüne bakın. Ardından, iOS için seçmeli derleme komut dosyasını kullanmak üzere kılavuzdaki adımları uygulayın.