Medición del rendimiento

Herramientas de comparación

Actualmente, las herramientas comparativas de TensorFlow Lite miden y calculan las estadísticas de las siguientes métricas de rendimiento importantes:

  • Hora de inicialización
  • Tiempo de inferencia del estado de calentamiento
  • Tiempo de inferencia de estado estable
  • Uso de memoria durante el tiempo de inicialización
  • Uso general de memoria

Las herramientas comparativas están disponibles como apps de comparativas para iOS y Android, y como objetos binarios de línea de comandos nativos. Además, todas comparten la misma lógica de medición de rendimiento principal. Ten en cuenta que las opciones disponibles y los formatos de salida son un poco diferentes debido a las diferencias en el entorno de ejecución.

App comparativa de Android

Hay dos opciones para usar la herramienta de comparativas con Android. Uno es un binario de comparativas nativo y el otro es una app de comparativas de Android, que permite medir mejor el rendimiento del modelo en la app. De cualquier manera, los números de la herramienta comparativa diferirán un poco de los que se ejecutarán cuando se ejecuten inferencias con el modelo en la app real.

Esta app comparativa de Android no tiene IU. Instálalo y ejecútalo con el comando adb, y recupera los resultados con el comando adb logcat.

Descarga o compila la app

Descarga las apps comparativas de Android compiladas previamente por la noche mediante los siguientes vínculos:

En cuanto a las apps comparativas de Android que admiten ops de TF mediante el delegado de Flex, usa los siguientes vínculos:

También puedes compilar la app desde la fuente siguiendo estas instructions.

Preparar comparativas

Antes de ejecutar la app de comparativas, instala la app y envía el archivo del modelo al dispositivo de la siguiente manera:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

Ejecutar comparativas

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph es un parámetro obligatorio.

  • graph: string
    La ruta de acceso al archivo de modelo de TFLite.

Puedes especificar más parámetros opcionales para ejecutar las comparativas.

  • num_threads: int (predeterminado=1)
    Es la cantidad de subprocesos que se usarán para ejecutar el intérprete de TFLite.
  • use_gpu: bool (predeterminado=false)
    Usa el delegado de GPU.
  • use_xnnpack: bool (predeterminado=false)
    Usa el delegado XNNPACK.

Según el dispositivo que uses, es posible que algunas de estas opciones no estén disponibles o no tengan efecto. Consulta los parámetros para obtener más parámetros de rendimiento que podrías ejecutar con la app comparativa.

Observa los resultados con el comando logcat:

adb logcat | grep "Inference timings"

Los resultados comparativos se informan de la siguiente manera:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

Objeto binario nativo de comparativas

La herramienta de comparativas también se proporciona como un objeto binario nativo benchmark_model. Puedes ejecutar esta herramienta desde una línea de comandos de shell en Linux, Mac, dispositivos incorporados y dispositivos Android.

Descarga o compila el objeto binario

Descarga los objetos binarios de línea de comandos nativos compilados previamente durante la noche mediante los siguientes vínculos:

En cuanto a los objetos binarios compilados previamente que admiten ops de TF mediante el delegado de Flex, usa los siguientes vínculos:

También puedes compilar el objeto binario nativo de comparativas a partir del archivo source en tu computadora.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Para compilar con la cadena de herramientas del NDK de Android, primero debes configurar el entorno de compilación siguiendo esta guía o usar la imagen de Docker como se describe en esta guía.

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

Ejecutar comparativas

Para ejecutar comparativas en tu computadora, ejecuta el objeto binario desde la shell.

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

Puedes usar el mismo conjunto de parámetros que se mencionó antes con el objeto binario de línea de comandos nativo.

Operaciones de modelo de generación de perfiles

El objeto binario del modelo de comparativas también te permite generar perfiles de las operaciones de modelo y obtener los tiempos de ejecución de cada operador. Para ello, pasa la marca --enable_op_profiling=true a benchmark_model durante la invocación. Los detalles se explican aquí.

Objeto binario nativo de comparativas para varias opciones de rendimiento en una sola ejecución

También se proporciona un objeto binario de C++ sencillo y conveniente para comparar varias opciones de rendimiento en una sola ejecución. Este objeto binario se compila en función de la herramienta de comparativas antes mencionada, que solo puede comparar una opción de rendimiento a la vez. Comparten el mismo proceso de compilación, instalación y ejecución, pero el nombre de destino de COMPILACIÓN de este objeto binario es benchmark_model_performance_options y toma algunos parámetros adicionales. Un parámetro importante para este objeto binario es el siguiente:

perf_options_list: string (default='all')
Una lista separada por comas de opciones de rendimiento de TFLite para obtener comparativas.

Puedes obtener objetos binarios compilados previamente durante la noche para esta herramienta, como se indica a continuación:

App comparativa de iOS

Para ejecutar comparativas en dispositivos iOS, debes compilar la app desde la fuente. Coloca el archivo del modelo de TensorFlow Lite en el directorio benchmark_data del árbol de fuentes y modifica el archivo benchmark_params.json. Esos archivos se empaquetan en la app, que lee los datos del directorio. Visita la app de comparativas de iOS para obtener instrucciones detalladas.

Comparativas de rendimiento para modelos conocidos

En esta sección, se enumeran las comparativas de rendimiento de TensorFlow Lite cuando se ejecutan modelos conocidos en algunos dispositivos iOS y Android.

Comparativas de rendimiento de Android

Estos números de comparativas de rendimiento se generaron con el objeto binario de comparativas nativas.

En el caso de las comparativas de Android, la afinidad de CPU está configurada para usar núcleos grandes en el dispositivo a fin de reducir la variación (consulta los detalles).

Se supone que los modelos se descargaron y se descomprimieron en el directorio /data/local/tmp/tflite_models. El objeto binario comparativo se compila con estas instrucciones y se supone que se encuentra en el directorio /data/local/tmp.

Para ejecutar las comparativas, haz lo siguiente:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

Para ejecutar con el delegado de GPU, configura --use_gpu=true.

Los valores de rendimiento que aparecen a continuación se miden en Android 10.

Nombre del modelo Dispositivo CPU, 4 subprocesos GPU
Mobilenet_1.0_224(float) Pixel 3 23.9 ms 6.45 ms
Pixel 4 14.0 ms 9.0 ms
Mobilenet_1.0_224 (cuantitativa) Pixel 3 13.4 ms ---
Pixel 4 5.0 ms ---
NASNet para dispositivos móviles Pixel 3 56 ms ---
Pixel 4 34.5 ms ---
SqueezeNet Pixel 3 35.8 ms 9.5 ms
Pixel 4 23.9 ms 11.1 ms
Inception_ResNet_V2 Pixel 3 422 ms 99.8 ms
Pixel 4 272.6 ms 87.2 ms
Inception_V4 Pixel 3 486 ms 93 ms
Pixel 4 324.1 ms 97.6 ms

Comparativas de rendimiento de iOS

Estas cifras de comparativas de rendimiento se generaron con la app de comparativas de iOS.

Para ejecutar comparativas de iOS, se modificó la app comparativa a fin de incluir el modelo adecuado y se modificó benchmark_params.json para establecer num_threads en 2. Para usar el delegado de la GPU, también se agregaron las opciones "use_gpu" : "1" y "gpu_wait_type" : "aggressive" a benchmark_params.json.

Nombre del modelo Dispositivo CPU, 2 subprocesos GPU
Mobilenet_1.0_224(float) iPhone XS 14.8 ms 3.4 ms
Mobilenet_1.0_224 (cuantitativa) iPhone XS 11 ms ---
NASNet para dispositivos móviles iPhone XS 30.4 ms ---
SqueezeNet iPhone XS 21.1 ms 15.5 ms
Inception_ResNet_V2 iPhone XS 261.1 ms 45.7 ms
Inception_V4 iPhone XS 309 ms 54.4 ms

Hacer un seguimiento de los componentes internos de TensorFlow Lite

Cómo realizar un seguimiento de los componentes internos de TensorFlow Lite en Android

Las herramientas de registro de Android pueden capturar eventos internos del intérprete de TensorFlow Lite de una app para Android. Son los mismos eventos con la API de Trace de Android, por lo que los eventos capturados del código Java o Kotlin se ven junto con los eventos internos de TensorFlow Lite.

Estos son algunos ejemplos de eventos:

  • Invocación al operador
  • Modificación de gráfico por delegado
  • Asignación de tensores

Entre las diferentes opciones para capturar registros, en esta guía, se abordan el Generador de perfiles de CPU de Android Studio y la app de Registro del sistema. Consulta la herramienta de línea de comandos Perfetto o la herramienta de línea de comandos de Systrace para conocer otras opciones.

Agrega eventos de seguimiento en código Java

Este es un fragmento de código de la app de ejemplo Clasificación de imágenes. El intérprete de TensorFlow Lite se ejecuta en la sección recognizeImage/runInference. Este paso es opcional, pero es útil para ayudar a notar dónde se realiza la llamada de inferencia.

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

Habilita el seguimiento de TensorFlow Lite

Para habilitar el seguimiento de TensorFlow Lite, establece la propiedad del sistema Android debug.tflite.trace en 1 antes de iniciar la app para Android.

adb shell setprop debug.tflite.trace 1

Si se configuró esta propiedad cuando se inicialice el intérprete de TensorFlow Lite, se realizará un seguimiento de los eventos de teclas (p.ej., la invocación del operador) desde el intérprete.

Después de capturar todos los seguimientos, inhabilítalos configurando el valor de la propiedad en 0.

adb shell setprop debug.tflite.trace 0

Generador de perfiles de CPU de Android Studio

Sigue estos pasos para capturar registros con el Generador de perfiles de CPU de Android Studio:

  1. Selecciona Run > Profile 'app' en los menús de la parte superior.

  2. Haz clic en cualquier parte del cronograma de CPU cuando aparezca la ventana de Profiler.

  3. Selecciona “Trace System Calls” entre los modos de generación de perfiles de la CPU.

    Selecciona “Trace System Calls”

  4. Presiona el botón “Grabar”.

  5. Presiona el botón "Detener".

  6. Investiga el resultado del seguimiento.

    Registro de Android Studio

En este ejemplo, puedes ver la jerarquía de eventos de un subproceso y las estadísticas de cada tiempo del operador, así como el flujo de datos de toda la app entre los subprocesos.

La app de Registro del sistema

Captura registros sin Android Studio siguiendo los pasos que se detallan en la app de Registro del sistema.

En este ejemplo, se capturaron los mismos eventos de TFLite y se guardaron en el formato Perfetto o Systrace según la versión del dispositivo Android. Los archivos de registro capturados se pueden abrir en la IU de Perfetto.

Registro de Perfetto

Realiza un seguimiento de los componentes internos de TensorFlow Lite en iOS

Los eventos internos del intérprete de TensorFlow Lite de una app para iOS se pueden capturar con la herramienta Instruments, que se incluye con Xcode. Son los eventos indicadores de iOS, por lo que los eventos capturados del código Swift y Objective-C se ven junto con los eventos internos de TensorFlow Lite.

Estos son algunos ejemplos de eventos:

  • Invocación al operador
  • Modificación de gráfico por delegado
  • Asignación de tensores

Habilita el seguimiento de TensorFlow Lite

Para configurar la variable de entorno debug.tflite.trace, sigue estos pasos:

  1. En los menús superiores de Xcode, selecciona Product > Scheme > Edit Scheme....

  2. Haz clic en "Perfil" en el panel izquierdo.

  3. Anula la selección de la casilla de verificación “Usar los argumentos y variables de entorno de la acción de ejecutar”.

  4. Agrega debug.tflite.trace en la sección "Variables de entorno".

    Configura la variable de entorno

Si quieres excluir los eventos de TensorFlow Lite cuando generes perfiles de la app para iOS, inhabilita el seguimiento quitando la variable de entorno.

Instrumentos de Xcode

Sigue estos pasos para capturar registros:

  1. Selecciona Producto > Perfil en los menús superiores de Xcode.

  2. Haz clic en Logging, entre las plantillas de generación de perfiles, cuando se inicie la herramienta Instruments.

  3. Presiona el botón "Iniciar".

  4. Presiona el botón "Detener".

  5. Haz clic en “os_signpost” para expandir los elementos del subsistema de OS Logging.

  6. Haz clic en el subsistema de Logging del SO “org.tensorflow.lite”.

  7. Investiga el resultado del seguimiento.

    Seguimiento de instrumentos de Xcode

En este ejemplo, puedes ver la jerarquía de eventos y estadísticas para el tiempo de cada operador.

Usa los datos de seguimiento

Los datos de seguimiento te permiten identificar cuellos de botella en el rendimiento.

A continuación, se muestran algunos ejemplos de estadísticas que puedes obtener del generador de perfiles y las posibles soluciones para mejorar el rendimiento:

  • Si la cantidad de núcleos de CPU disponibles es menor que la cantidad de subprocesos de inferencia, la sobrecarga de programación de la CPU puede generar un rendimiento deficiente. Puedes reprogramar otras tareas con uso intensivo de CPU en tu aplicación para evitar la superposición con la inferencia de tu modelo o ajustar la cantidad de subprocesos de intérprete.
  • Si los operadores no se delegan por completo, algunas partes del grafo del modelo se ejecutan en la CPU y no en el acelerador de hardware esperado. Puedes sustituir los operadores no admitidos por otros similares.