Cómo compilar LiteRT para iOS

En este documento, se describe cómo compilar una biblioteca LiteRT para iOS por tu cuenta. Por lo general, no es necesario compilar localmente la biblioteca LiteRT de iOS. Si solo quiero usarla, la forma más sencilla es usar la capa precompilada estable más recientes de LiteRT CocoaPods. Consulta iOS quickstart para obtener más información sobre cómo usarlos en tu iOS proyectos.

Compila de forma local

En algunos casos, tal vez te convenga usar una compilación local de LiteRT para ejemplo cuando quieres realizar cambios locales en LiteRT y probarlos cambios en tu app para iOS o prefieres usar un framework estático en lugar de los dinámico. Para crear un framework universal de iOS para LiteRT de forma local, haz lo siguiente: debes compilarlo usando Bazel en una máquina macOS.

Instala Xcode

Si aún no lo hiciste, deberás instalar Xcode 8 o una versión posterior, y las herramientas usando xcode-select:

xcode-select --install

Si se trata de una instalación nueva, deberás aceptar el contrato de licencia para todas las usuarios con el siguiente comando:

sudo xcodebuild -license accept

Instala Bazel

Bazel es el sistema de compilación principal de TensorFlow. Instala Bazel según el instrucciones en el sitio web de Bazel. Asegúrate de elegir versión entre _TF_MIN_BAZEL_VERSION y _TF_MAX_BAZEL_VERSION en Archivo configure.py en la raíz del repositorio tensorflow.

Configura WORKSPACE y .bazelrc

Ejecuta la secuencia de comandos ./configure en el directorio raíz de confirmación de la compra de TensorFlow. Responder "Sí" cuando en la secuencia de comandos se te pregunte si quieres compilar TensorFlow con iOS. y asistencia.

Una vez que Bazel esté configurado correctamente con la compatibilidad con iOS, podrás compilar el Framework TensorFlowLiteC con el siguiente comando.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

Este comando generará el archivo TensorFlowLiteC_framework.zip en bazel-bin/tensorflow/lite/ios/ en tu directorio raíz de TensorFlow. De forma predeterminada, el framework generado contiene un elemento “fat” binario, que contiene armv7, arm64 y x86_64 (pero no i386). Para ver la lista completa de marcas de compilación que se usan cuando especificas --config=ios_fat, consulta la sección de configuración de iOS en Archivo .bazelrc.

Compila un framework estático de TensorFlowLiteC

Según la configuración predeterminada, solo distribuimos el framework dinámico a través de CocoaPods. Si quieres si quieres usar el framework estático, puedes compilar la imagen estática TensorFlowLiteC framework con el siguiente comando:

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

El comando generará un archivo llamado TensorFlowLiteC_static_framework.zip. en el directorio bazel-bin/tensorflow/lite/ios/, en tu carpeta raíz de TensorFlow . Este framework estático puede usarse exactamente igual que el dinámico.

Compila frameworks de TFLite de forma selectiva

Puedes compilar frameworks más pequeños segmentados solo para un conjunto de modelos usando modelos que omitirá las operaciones no usadas en tu conjunto de modelos y solo incluirá el kernels operativos que se necesitan para ejecutar un conjunto determinado de modelos. El comando es el siguiente:

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

El comando anterior generará el framework estático bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip para TensorFlow Operaciones Lite integradas y personalizadas y, opcionalmente, genera el framework estático bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip si tus modelos contienen ops Select TensorFlow. Ten en cuenta que la marca --target_archs para especificar las arquitecturas de implementación.

Úsalo en tu propia aplicación

Desarrolladores de CocoaPods

Existen tres CocoaPods para LiteRT:

  • TensorFlowLiteSwift: Proporciona las APIs de Swift para LiteRT.
  • TensorFlowLiteObjC: Proporciona las APIs de Objective-C para LiteRT.
  • TensorFlowLiteC: Pod base común, que incorpora el núcleo de LiteRT y expone las APIs de C de base que usan los dos Pods anteriores. No pretende que los usuarios utilicen directamente.

Como desarrollador, debes elegir TensorFlowLiteSwift o TensorFlowLiteObjC Pod basado en el lenguaje en el que está escrita tu app, pero pero no ambas. Los pasos exactos para usar compilaciones locales de LiteRT son distintos. según la pieza exacta que le gustaría construir.

Usa las APIs locales de Swift o Objective-C

Si usas CocoaPods y solo quieres probar algunos cambios locales en el Las APIs de Swift o las APIs de Objective-C de LiteRT sigue estos pasos.

  1. Realiza cambios a las APIs de Objective-C o Swift en la confirmación de la compra con tensorflow.

  2. Abre el archivo TensorFlowLite(Swift|ObjC).podspec y actualiza esta línea:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    debe ser:
    . s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Esto permite garantizar que compilas tus APIs de Objective-C o Swift en la versión nocturna más reciente de las APIs de TensorFlowLiteC (se construyen todas las noches entre las 1 y las 4 a. m., hora del Pacífico) en vez de la estación que puede estar desactualizada en comparación con tu confirmación de la compra local de tensorflow. Como alternativa, puedes optar por publicar tu propia versión de TensorFlowLiteC y usa esa versión (consulta Cómo usar LiteRT local) principal a continuación).

  3. En el Podfile de tu proyecto de iOS, cambia la dependencia de la siguiente manera: apuntan a la ruta local al directorio raíz de tensorflow.
    Para Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Para Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Actualiza la instalación de tu Pod desde el directorio raíz del proyecto de iOS.
    $ pod update

  5. Vuelve a abrir el lugar de trabajo generado (<project>.xcworkspace) y compila de nuevo tu en Xcode.

Cómo usar el núcleo de LiteRT local

Puedes configurar un repositorio privado de especificaciones de CocoaPods y publicar tu Framework TensorFlowLiteC a tu repositorio privado. Puedes copiar este podspec y modifica algunos valores:

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

Después de crear tu propio archivo TensorFlowLiteC.podspec, puedes seguir las instrucciones para usar CocoaPods privado y usarlo en tu para tu propio proyecto. También puedes modificar el TensorFlowLite(Swift|ObjC).podspec para apunta a tu Pod de TensorFlowLiteC personalizado y usa Swift o Objective-C Pod del proyecto de la app.

Desarrolladores de Bazel

Si estás usando Bazel como herramienta de compilación principal, puedes agregar simplemente TensorFlowLite para tu destino en tu archivo BUILD.

Para Swift:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

Para Objective-C:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

Cuando compiles tu proyecto de app, cualquier cambio en la biblioteca de LiteRT se retomen e integren en tu app.

Modifica la configuración del proyecto de Xcode directamente

Es muy recomendable usar CocoaPods o Bazel para agregar LiteRT. dependencia en tu proyecto. Si aún deseas agregar TensorFlowLiteC de forma manual, deberás agregar el framework TensorFlowLiteC como un framework incorporado en tu proyecto de aplicación. Descomprime el archivo TensorFlowLiteC_framework.zip generado a partir de la compilación anterior para obtener la TensorFlowLiteC.framework. Este directorio es el framework real que Xcode puede comprender.

Una vez que hayas preparado el elemento TensorFlowLiteC.framework, primero debes agregarlo. como un objeto binario incorporado en el destino de la app. La sección de configuración exacta del proyecto para Esto puede variar según la versión de Xcode.

  • Xcode 11: Ve a la pestaña “General” del editor de proyectos para el destino de tu app y agrega TensorFlowLiteC.framework en Marcos de trabajo, bibliotecas Contenido incorporado" sección.
  • Xcode 10 y versiones anteriores: Ve a la pestaña "General" del editor de proyectos de tu segmentación de app y agrega TensorFlowLiteC.framework en "Embedded" binarios". El framework también debería agregarse automáticamente en “Linked Frameworks y bibliotecas sección.

Al agregar el framework como un objeto binario incorporado, Xcode también actualizaba el archivo "Rutas de búsqueda del marco de trabajo" entrada en “Configuración de compilación” pestaña para incluir el elemento superior de tu framework. En caso de que esto no suceda automáticamente, puedes Debes agregar manualmente el directorio superior de TensorFlowLiteC.framework .

Una vez que completes estos dos parámetros de configuración, deberías poder importar y llamar la API para C de LiteRT, definida por los archivos de encabezado TensorFlowLiteC.framework/Headers.