Compila con TensorFlow Lite para iOS

En este documento, se describe cómo compilar la biblioteca de TensorFlow Lite para iOS por tu cuenta. Por lo general, no es necesario compilar localmente la biblioteca de TensorFlow Lite para iOS. Si solo quieres usarlo, la forma más sencilla es usar las versiones estables o nocturnas compiladas previamente de CocoaPods de TensorFlow Lite. Consulta la guía de inicio rápido de iOS para obtener más información sobre cómo usarlas en tus proyectos de iOS.

Cómo compilar a nivel local

En algunos casos, es posible que quieras usar una compilación local de TensorFlow Lite, por ejemplo, cuando quieres realizar cambios locales en TensorFlow Lite y probarlos en tu app para iOS, o si prefieres usar un framework estático en lugar del dinámico que proporcionamos. Si quieres crear un framework universal de iOS para TensorFlow Lite de forma local, debes compilarlo con Bazel en una máquina macOS.

Instala Xcode

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

xcode-select --install

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

sudo xcodebuild -license accept

Instala Bazel

Bazel es el sistema de compilación principal para TensorFlow. Instala Bazel según las instrucciones del sitio web de Bazel. Asegúrate de elegir una versión entre _TF_MIN_BAZEL_VERSION y _TF_MAX_BAZEL_VERSION en el 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 y responde “Sí” cuando se te pregunte si quieres compilar TensorFlow compatible con iOS.

Una vez que Bazel esté configurado de forma correcta con la compatibilidad con iOS, puedes 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 el directorio bazel-bin/tensorflow/lite/ios/ de tu directorio raíz de TensorFlow. De forma predeterminada, el framework generado contiene un objeto binario "fat", que contiene armv7, arm64 y x86_64 (pero no i386). Para ver la lista completa de las marcas de compilación que se usan cuando especificas --config=ios_fat, consulta la sección de configuración de iOS en el archivo .bazelrc.

Compila el framework estático de TensorFlowLiteC

De forma predeterminada, solo distribuimos el framework dinámico a través de CocoaPods. Si, en cambio, deseas usar el framework estático, puedes compilar el framework estático TensorFlowLiteC 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/ de tu directorio raíz de TensorFlow. Este framework estático se puede usar de la misma manera que el dinámico.

Compila frameworks de TFLite de forma selectiva

Puedes compilar frameworks más pequeños que se orienten solo a un conjunto de modelos mediante la compilación selectiva, lo que omitirá las operaciones no utilizadas en tu conjunto de modelos y solo incluirá los kernels de operación necesarios para ejecutar el 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 las operaciones integradas y personalizadas de TensorFlow Lite. Además, de forma opcional, genera el framework estático bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip si tus modelos contienen operaciones Select TensorFlow. Ten en cuenta que puedes usar la marca --target_archs para especificar las arquitecturas de implementación.

Uso en tu propia aplicación

Desarrolladores de CocoaPods

Existen tres CocoaPods para TensorFlow Lite:

  • TensorFlowLiteSwift: Proporciona las APIs de Swift para TensorFlow Lite.
  • TensorFlowLiteObjC: Proporciona las APIs de Objective-C para TensorFlow Lite.
  • TensorFlowLiteC: Pod base común, que incorpora el entorno de ejecución principal de TensorFlow Lite y expone las APIs de base C que usan los dos Pods anteriores. No está diseñado para que los usuarios lo usen directamente.

Como desarrollador, debes elegir el Pod TensorFlowLiteSwift o TensorFlowLiteObjC en función del lenguaje en el que está escrita tu app, pero no ambos. Los pasos exactos para usar las compilaciones locales de TensorFlow Lite difieren según la parte exacta que quieras compilar.

Usa las APIs locales de Swift o de Objective-C

Si usas CocoaPods y solo quieres probar algunos cambios locales en las APIs de Swift o las APIs de Objective-C de TensorFlow Lite, sigue estos pasos.

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

  2. Abre el archivo TensorFlowLite(Swift|ObjC).podspec y actualiza esta línea:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    para que sea:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Esto sirve para garantizar que estás compilando tus APIs de Swift o de Objective-C en la versión nocturna más reciente de las APIs de TensorFlowLiteC (que se compila todas las noches entre las 1.00 y las 4.00 a.m., hora del Pacífico) en lugar de la versión estable, 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 usarla (consulta la sección Cómo usar el núcleo local de TensorFlow Lite a continuación).

  3. En el archivo Podfile de tu proyecto de iOS, cambia la dependencia como se indica a continuación para que apunte a la ruta local de tu directorio raíz 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 del Pod desde el directorio raíz de tu proyecto de iOS.
    $ pod update

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

Usa el núcleo local de TensorFlow Lite

Puedes configurar un repositorio privado de especificaciones de CocoaPods y publicar tu framework de TensorFlowLiteC personalizado en tu repositorio privado. Puedes copiar este archivo podspec y modificar 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 propio proyecto. También puedes modificar el TensorFlowLite(Swift|ObjC).podspec para que apunte a tu Pod TensorFlowLiteC personalizado y usar el Pod de Swift o de Objective-C en el proyecto de tu app.

Desarrolladores de Bazel

Si usas Bazel como herramienta de compilación principal, simplemente puedes agregar una dependencia TensorFlowLite a tu destino en el archivo BUILD.

Para Swift:

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

En Objective-C:

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

Cuando compiles el proyecto de tu app, cualquier cambio realizado en la biblioteca de TensorFlow Lite se recogerá y se compilará en tu app.

Cómo modificar la configuración del proyecto de Xcode directamente

Te recomendamos que uses CocoaPods o Bazel para agregar una dependencia de TensorFlow Lite a tu proyecto. Si aún deseas agregar el framework TensorFlowLiteC de forma manual, deberás agregar el framework TensorFlowLiteC como un framework incorporado al proyecto de tu aplicación. Descomprime el archivo TensorFlowLiteC_framework.zip generado en la compilación anterior para obtener el directorio TensorFlowLiteC.framework. Este directorio es el framework real que Xcode puede comprender.

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

  • Xcode 11: Ve a la pestaña “General” del editor del proyecto para la segmentación de tu app y agrega el TensorFlowLiteC.framework en la sección “Frameworks, Libraries, and Embedded Content”.
  • Xcode 10 y versiones anteriores: Ve a la pestaña “General” del editor del proyecto de destino de tu app y agrega TensorFlowLiteC.framework en “Objetos binarios incorporados”. El framework también debería agregarse automáticamente en la sección "Frameworks y bibliotecas vinculados".

Cuando agregas el framework como un objeto binario incorporado, Xcode también actualiza la entrada "Framework Search Paths" en la pestaña "Build Settings" para incluir el directorio superior de tu framework. En caso de que esto no suceda automáticamente, debes agregar manualmente el directorio principal del directorio TensorFlowLiteC.framework.

Una vez que se completen estos dos parámetros de configuración, deberías poder importar y llamar a la API de C de TensorFlow Lite, definida por los archivos de encabezado en el directorio TensorFlowLiteC.framework/Headers.