Compile TensorFlow Lite para iOS

Este documento describe cómo compilar la biblioteca iOS de TensorFlow Lite por su cuenta. Normalmente, no necesita compilar localmente la biblioteca iOS de TensorFlow Lite. Si solo desea usarlo, la forma más fácil es usar 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 usar 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 iOS o si prefiere usar un marco estático en lugar del dinámico proporcionado. Para crear un marco iOS universal para TensorFlow Lite localmente, debe compilarlo con Bazel en una máquina macOS.

Instalar Xcode

Si aún no lo ha hecho, deberá 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 de 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 compatibilidad con iOS.

Una vez que Bazel esté correctamente configurado con soporte iOS, puede construir 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 el 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 .

Cree el marco estático de TensorFlowLiteC

De forma predeterminada, solo distribuimos el marco dinámico a través de Cocoapods. Si desea utilizar el marco estático en su lugar, puede compilar 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 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.

Cree marcos TFLite de forma selectiva

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 usar 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 de 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 módulos anteriores. No está destinado a ser utilizado directamente por los usuarios.

Como desarrollador, debe elegir TensorFlowLiteSwift o TensorFlowLiteObjC pod según el idioma en el que esté escrita su 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 las API locales de Swift u Objective-C

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

  1. Realice cambios en las API de 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 - estar:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Esto es para asegurarse de que está creando sus API de Swift u Objective-C con la última versión nocturna disponible de las API de TensorFlowLiteC (creadas 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. Como alternativa, puede optar por publicar su propia versión de TensorFlowLiteC y usar esa versión (consulte la sección Usar el núcleo local de TensorFlow Lite a continuación).

  3. En el Podfile de su proyecto de iOS, cambie la dependencia de la siguiente manera para que apunte a la ruta local a su directorio raíz de 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 puede modificar TensorFlowLite(Swift|ObjC).podspec para apuntar a su pod TensorFlowLiteC personalizado y usar el pod de Swift u Objective-C en su proyecto de aplicación.

desarrolladores de bazel

Si está utilizando Bazel como la herramienta de compilación principal, simplemente puede agregar la dependencia de 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 crea su proyecto de aplicación, cualquier cambio en la biblioteca de TensorFlow Lite se recogerá y se integrará en su aplicación.

Modificar la configuración del proyecto Xcode directamente

Se recomienda enfáticamente usar 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 un marco integrado a su proyecto de aplicación. Descomprima 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 de configuración exacta 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 incrustado".
  • Xcode 10 y anteriores: vaya a la pestaña "General" del editor de proyectos para el objetivo de su aplicación y agregue TensorFlowLiteC.framework en "Embedded Binaries". El marco también debe agregarse automáticamente en la sección 'Marcos y bibliotecas 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 que haya realizado 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 .