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.
Compila el framework dinámico de TensorFlowLiteC (recomendado)
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.
Realiza cambios en las APIs de Swift o de Objective-C en la confirmación de la compra de
tensorflow
.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 deTensorFlowLiteC
(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 detensorflow
. Como alternativa, puedes optar por publicar tu propia versión deTensorFlowLiteC
y usarla (consulta la sección Cómo usar el núcleo local de TensorFlow Lite a continuación).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íztensorflow
.
Para Swift:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
Para Objective-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
Actualiza la instalación del Pod desde el directorio raíz de tu proyecto de iOS.
$ pod update
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
.