Compile TensorFlow Lite para iOS

Este documento describe cómo crear la biblioteca iOS de TensorFlow Lite por su cuenta. Normalmente, no es necesario crear localmente la biblioteca iOS de TensorFlow Lite. Si solo desea usarlo, la forma más sencilla es utilizar las versiones estables o nocturnas prediseñadas de TensorFlow Lite CocoaPods. Consulte el inicio rápido de iOS para obtener más detalles sobre cómo usarlos en sus proyectos de iOS.

Construyendo localmente

En algunos casos, es posible que desee utilizar una compilación local de TensorFlow Lite, por ejemplo, cuando desee realizar cambios locales en TensorFlow Lite y probar esos cambios en su aplicación de iOS o prefiera usar un marco estático en lugar del dinámico proporcionado. Para crear un marco iOS universal para TensorFlow Lite localmente, debe compilarlo usando Bazel en una máquina macOS.

Instalar Xcode

Si aún no lo has hecho, necesitarás instalar Xcode 8 o posterior y las herramientas usando xcode-select :

xcode-select --install

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

sudo xcodebuild -license accept

Instalar Bazel

Bazel es el sistema de compilación principal de TensorFlow. Instale Bazel según las instrucciones del sitio web de Bazel . Asegúrese 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 .

Configurar ESPACIO DE TRABAJO y .bazelrc

Ejecute el script ./configure en el directorio raíz de pago de TensorFlow y responda "Sí" cuando el script le pregunte si desea compilar TensorFlow con soporte para iOS.

Una vez que Bazel esté configurado correctamente con soporte para iOS, puede crear el marco 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/ en su directorio raíz de TensorFlow. De forma predeterminada, el marco generado contiene un binario "grueso", que contiene armv7, arm64 y x86_64 (pero no i386). Para ver la lista completa de indicadores de compilación utilizados cuando especifica --config=ios_fat , consulte la sección de configuraciones de iOS en el archivo .bazelrc .

Construya el marco estático TensorFlowLiteC

De forma predeterminada, solo distribuimos el marco dinámico a través de Cocoapods. Si desea utilizar el marco estático, puede crear el marco 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/ en su directorio raíz de TensorFlow. Este marco estático se puede utilizar exactamente de la misma manera que el dinámico.

Construya selectivamente marcos TFLite

Puede crear marcos más pequeños dirigidos solo a un conjunto de modelos mediante la compilación selectiva, que omitirá las operaciones no utilizadas en su conjunto de modelos y solo incluirá los núcleos operativos necesarios para ejecutar el conjunto de modelos dado. 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 marco estático bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip para las operaciones integradas y personalizadas de TensorFlow Lite; y, opcionalmente, genera el marco estático bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip si sus modelos contienen operaciones Select TensorFlow. Tenga en cuenta que el indicador --target_archs se puede utilizar para especificar sus arquitecturas de implementación.

Úselo en su propia aplicación

Desarrolladores de CocoaPods

Hay tres CocoaPods para TensorFlow Lite:

  • TensorFlowLiteSwift : proporciona las API de Swift para TensorFlow Lite.
  • TensorFlowLiteObjC : proporciona las API de Objective-C para TensorFlow Lite.
  • TensorFlowLiteC : módulo base común, que incorpora el tiempo de ejecución principal de TensorFlow Lite y expone las API de C base utilizadas por los dos pods anteriores. No está destinado a ser utilizado directamente por los usuarios.

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

Uso de API locales Swift u Objective-C

Si está utilizando CocoaPods y solo desea probar algunos cambios locales en las API Swift o las API Objective-C de TensorFlow Lite, siga los pasos aquí.

  1. Realice cambios en las API Swift u Objective-C en su pago de tensorflow .

  2. Abra el archivo TensorFlowLite(Swift|ObjC).podspec y actualice esta línea:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    ser:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Esto es para garantizar que esté compilando sus API Swift u Objective-C con la última versión nocturna disponible de las API de TensorFlowLiteC (creada todas las noches entre la 1 y las 4 a. m., hora del Pacífico) en lugar de la versión estable, que puede estar desactualizada en comparación con su tensorflow local. verificar. Alternativamente, puede optar por publicar su propia versión de TensorFlowLiteC y usar esa versión (consulte la sección Uso del núcleo local de TensorFlow Lite a continuación).

  3. En el Podfile de su proyecto iOS, cambie la dependencia de la siguiente manera para que apunte a la ruta local a su directorio raíz tensorflow .
    Para rápido:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Para Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Actualice la instalación de su pod desde el directorio raíz de su proyecto iOS.
    $ pod update

  5. Vuelva a abrir el espacio de trabajo generado ( <project>.xcworkspace ) y reconstruya su aplicación dentro de Xcode.

Usando el núcleo local de TensorFlow Lite

Puede configurar un repositorio privado de especificaciones de CocoaPods y publicar su marco TensorFlowLiteC personalizado en su repositorio privado. Puede 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 su propio archivo TensorFlowLiteC.podspec , puede seguir las instrucciones sobre cómo usar CocoaPods privados para usarlo en su propio proyecto. También puedes modificar TensorFlowLite(Swift|ObjC).podspec para que apunte a tu pod TensorFlowLiteC personalizado y usar el pod Swift u Objective-C en tu proyecto de aplicación.

desarrolladores de bazel

Si está utilizando Bazel como herramienta de compilación principal, simplemente puede agregar la dependencia TensorFlowLite a su objetivo en su archivo BUILD .

Para rápido:

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

Para Objective-C:

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

Cuando crees el proyecto de tu aplicación, cualquier cambio en la biblioteca de TensorFlow Lite se recogerá y se integrará en tu aplicación.

Modifique la configuración del proyecto Xcode directamente

Se recomienda encarecidamente utilizar CocoaPods o Bazel para agregar la dependencia de TensorFlow Lite a su proyecto. Si aún desea agregar el marco TensorFlowLiteC manualmente, deberá agregar el marco TensorFlowLiteC como marco integrado a su proyecto de aplicación. Descomprima el TensorFlowLiteC_framework.zip generado a partir de la compilación anterior para obtener el directorio TensorFlowLiteC.framework . Este directorio es el marco real que Xcode puede entender.

Una vez que haya preparado TensorFlowLiteC.framework , primero debe agregarlo como un binario incrustado al destino de su aplicación. La sección exacta de configuración del proyecto para esto puede diferir según su versión de Xcode.

  • Xcode 11: vaya a la pestaña "General" del editor de proyectos para el destino de su aplicación y agregue TensorFlowLiteC.framework en la sección "Marcos, bibliotecas y contenido integrado".
  • Xcode 10 y versiones anteriores: vaya a la pestaña "General" del editor de proyectos para el destino de su aplicación y agregue TensorFlowLiteC.framework en "Binarios integrados". El marco también debe agregarse automáticamente en la sección 'Bibliotecas y marcos vinculados'.

Cuando agrega el marco como un binario incrustado, Xcode también actualizará la entrada 'Rutas de búsqueda del marco' en la pestaña 'Configuración de compilación' para incluir el directorio principal de su marco. En caso de que esto no suceda automáticamente, debe agregar manualmente el directorio principal del directorio TensorFlowLiteC.framework .

Una vez realizadas estas dos configuraciones, debería poder importar y llamar a la API C de TensorFlow Lite, definida por los archivos de encabezado en el directorio TensorFlowLiteC.framework/Headers .