LiteRT ikili boyutunu küçültme

Genel Bakış

Cihaz üzerinde makine öğrenimi (ODML) uygulamaları için modeller dağıtırken mobil cihazlarda sınırlı bellek olduğunu unutmamak önemlidir. Model ikili boyutları, modelde kullanılan işlem sayısıyla yakından ilişkilidir. LiteRT, seçici derlemeler kullanarak model ikili boyutlarını küçültmenize olanak tanır. Seçici derlemeler, model kümenizde kullanılmayan işlemleri atlar ve modelin mobil cihazınızda çalışması için gereken yalnızca çalışma zamanı ve işlem çekirdeklerini içeren kompakt bir kitaplık oluşturur.

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

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

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

Model Adı Alan Hedef mimari AAR dosya boyutları
Mobilenet_1.0_224(float) Görüntü sınıflandırma armeabi-v7a tensorflow-lite.aar (296.635 bayt)
arm64-v8a tensorflow-lite.aar (382.892 bayt)
SPICE Ses perdesi çıkarma armeabi-v7a tensorflow-lite.aar (375.813 bayt)
tensorflow-lite-select-tf-ops.aar (1.676.380 bayt)
arm64-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 armeabi-v7a tensorflow-lite.aar (240.085 bayt)
tensorflow-lite-select-tf-ops.aar (1.708.597 bayt)
arm64-v8a tensorflow-lite.aar (273.713 bayt)
tensorflow-lite-select-tf-ops.aar (2.339.697 bayt)

Bazel ile LiteRT'yi seçerek derleme

Bu bölümde, TensorFlow kaynak kodlarını indirdiğiniz ve yerel geliştirme ortamını Bazel'e göre ayarladığınız varsayılmaktadır.

Android projesi için AAR dosyaları oluşturma

Model dosya yollarınızı aşağıdaki gibi sağlayarak özel LiteRT AAR'leri 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, yerleşik ve özel LiteRT işlemleri için bazel-bin/tmp/tensorflow-lite.aar AAR dosyasını oluşturur. Modelleriniz Select TensorFlow işlemleri içeriyorsa isteğe bağlı olarak aar dosyasını bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar oluşturur. Bu işlemin, birkaç farklı mimari içeren "kalın" bir AAR oluşturduğunu unutmayın. Bunların hepsine ihtiyacınız yoksa dağıtım ortamınıza uygun alt grubu kullanın.

Özel işlemlerle geliştirme

Özel işlemlerle LiteRT modelleri geliştirdiyseniz aşağıdaki işaretleri derleme komutuna ekleyerek bunları 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 \
  --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ı oluşturmak için gereken 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 işlemler içeren 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",
    ],
)

Select TF ops (TF işlemlerini seç) seçeneği bulunan 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",
    ],
)

İleri Düzey Kullanımlar: Özel C/C++ paylaşılan kitaplıkları oluşturma

Belirli 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şımlı nesneleri oluşturma

Özel bir TFLite C paylaşılan nesnesi oluşturmak istiyorsanız tmp/BUILD dosyasına aşağıdakileri 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 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",
    ],
)

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

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

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şımlı nesneleri oluşturma

Özel bir TFLite C++ paylaşılan nesnesi oluşturmak istiyorsanız tmp/BUILD dosyasına aşağıdakileri 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

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 işlemleri içeren 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

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 LiteRT'yi seçerek oluşturma

Bu bölümde, yerel makinenize Docker'ı yüklediğiniz ve LiteRT Dockerfile'ı buradan 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

Docker ile derleme için komut dosyasını indirmek üzere şu komutu çalıştırın:

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

Ardından, model dosya yollarınızı aşağıdaki gibi sağlayarak özel LiteRT 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 kullanmak istediğiniz TensorFlow deposunun bir commit'i, dalı veya etiketidir. Varsayılan olarak en son yayın dalıdır. Yukarıdaki komut, yerleşik ve özel LiteRT işlemleri için AAR dosyasını tensorflow-lite.aar ve isteğe bağlı olarak geçerli dizininizdeki Select TensorFlow işlemleri için AAR dosyasını tensorflow-lite-select-tf-ops.aar oluşturur.

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

Projeye AAR dosyaları ekleme

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

iOS için Seçmeli Derleme

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çici derleme komut dosyasını kullanmak üzere kılavuzu uygulayın.