LiteRT ikili boyutunu küçültme

Genel Bakış

Cihaz üzerinde makine öğrenimi (ODML) uygulamaları için modelleri dağıtırken mobil cihazlarda kullanılabilen belleğin sınırlı olduğunu bilmek önemlidir. Model ikili boyutları, bu modelde kullanılan işlem sayısıyla modeli. LiteRT, aşağıdakileri kullanarak modelin ikili program boyutlarını küçültmenizi sağlar: derlemeler içeriyor. Seçmeli derlemeler, model kümenizdeki kullanılmayan işlemleri atlar ve yalnızca çalışma zamanı ile işlem çekirdeklerini içeren kompakt bir kitaplık modelin mobil cihazınızda çalıştırılmasını sağlayın.

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

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

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

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 LiteRT'i seçerek derleme

Bu bölümde, TensorFlow kaynak kodlarını indirdiğiniz ve yerel kalkınmanın Bazel.

Android projesi için AAR dosyaları oluşturma

Model dosya yollarınızı sağlayarak özel LiteRT AAR'leri oluşturabilirsiniz. aşağıdaki gibi ekleyebilirsiniz.

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, bazel-bin/tmp/tensorflow-lite.aar AAR dosyasını oluşturur LiteRT yerleşik ve özel işlemler için; ve isteğe bağlı olarak, modellerinizde şunlar varsa bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar dosyasını seçin: TensorFlow operasyonlarını seçin Bunun bir "şişman" oluşturacağını unutmayın Birkaç farklı AAR mimariler; bunların hepsine ihtiyacınız yoksa, kullanmak istediğiniz dağıtım ortamınızı destekler.

Özel işlemlerle derleme

Özel işlemler içeren LiteRT modelleri geliştirdiyseniz bunları oluşturabilirsiniz derleme komutuna aşağıdaki flag'leri ekleyin:

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ı ve tflite_custom_ops_deps işareti, bu kaynağı derlemek için bağımlılıklar içerir dosyası olarak da kaydedebilir. 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 özel TFLite tanımlamak istiyorsanız bağımlılıklarını görmek için, şemanızda aşağıdaki kuralları proje deposu:

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

Hedeflerinize yönelik kendi özel TFLite C/C++ paylaşılan nesnelerinizi oluşturmak için aşağıdaki adımları uygulayabilirsiniz:

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

mkdir -p tmp && touch tmp/BUILD

Özel C paylaşılan nesneleri oluşturma

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

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

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 şunu ekleyin: tmp/BUILD dosyasına:

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ğıdakileri de derlemeniz gerekir: şunları da sağlar:

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çici LiteRT Derleme

Bu bölümde, birinci taraf verileri için Yerel makinenizde Docker ve LiteRT Dockerfile indirildi burada bulabilirsiniz.

Yukarıdaki Dockerfile'ı indirdikten sonra Docker görüntüsü oluşturmak için çalışıyor:

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

Ardından model dosyanızı sağlayarak özel LiteRT AAR'sini oluşturabilirsiniz. yollarını belirleyin.

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, TensorFlow deposunun kayıt, dal veya etiketidir. kitaplıkları oluşturmadan önce ödeme yapmak istiyorsunuz; varsayılan olarak en yenisi sürüm dalını kullanabilirsiniz. Yukarıdaki komut, AAR dosyasını oluşturur LiteRT yerleşik ve özel işlemler ile isteğe bağlı olarak tensorflow-lite.aar Select TensorFlow operasyonları için tensorflow-lite-select-tf-ops.aar AAR dosyasını açın.

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

Projeye AAR dosyaları ekleyin

AAR'yi doğrudan AAR'ye aktararak kullanarak veya yayınlayarak yerel Maven'e özel AAR'yi depo. Not Bunun için tensorflow-lite-select-tf-ops.aar için AAR dosyalarını sizin için iyi olur.

iOS için Selective Build

Aşağıdakileri ayarlamak için lütfen Yerel olarak derleme bölümüne bakın TensorFlow çalışma alanını yapılandırın ve seçmeli özelliği kullanmak için kılavuz komut dosyası derlemek.