Compartir a través de


Rendimiento y memoria de Windows ML

En este artículo, trataremos cómo administrar el rendimiento de la aplicación al usar Windows Machine Learning.

Subprocesamiento y simultaneidad

Cada objeto expuesto desde el tiempo de ejecución es ágil, lo que significa que se puede acceder a ellos desde cualquier subproceso. Consulte Objetos ágiles en C++/WinRT para obtener más información sobre agile.

Un objeto clave con el que trabajará es LearningModelSession. Este objeto siempre puede ser invocado de forma segura desde cualquier hilo.

  • Para las sesiones de GPU: el objeto bloqueará y sincronizará las llamadas simultáneas. Si necesita simultaneidad, debe crear varias sesiones para lograrla.

  • Para las sesiones de CPU: el objeto no se bloqueará y permitirá llamadas simultáneas en una sola sesión. Debe tener cuidado de administrar su propio estado, así como sus búferes y objetos de enlace.

Debe tener cuidado y medir el objetivo de su escenario. Las arquitecturas de GPU modernas funcionan de forma diferente a las CPU. Por ejemplo, si su objetivo es una baja latencia, es posible que desee gestionar cómo programa el trabajo en sus motores de CPU y GPU utilizando pipelining, no la simultaneidad. Este artículo sobre la sincronización con varios motores es un excelente lugar para empezar. Si el rendimiento es su objetivo (como procesar tantas imágenes a la vez como sea posible), a menudo quiere usar varios subprocesos y simultaneidad para saturar la CPU.

Cuando se trata de subprocesos y simultaneidad, la finalidad es ejecutar experimentos y medir tiempos. El rendimiento cambiará significativamente en función de sus objetivos y escenarios.

Uso de memoria

Cada instancia de LearningModel y LearningModelSession tiene una copia del modelo en memoria. Si está trabajando con modelos pequeños, es posible que no le interese, pero si está trabajando con modelos muy grandes, esto se vuelve importante.

Para liberar la memoria, llame a Dispose en el modelo o la sesión. No se limite a eliminarlos, ya que algunos lenguajes realizan una recopilación diferida de elementos no utilizados.

LearningModel mantiene una copia en la memoria para habilitar la creación de una nueva sesión. Al eliminar LearningModel, todas las sesiones existentes seguirán funcionando. Sin embargo, ya no podrá crear nuevas sesiones con esa instancia de LearningModel . En el caso de los modelos grandes, puede crear un modelo y una sesión y, a continuación, eliminar el modelo. Al utilizar una única sesión para todas las llamadas a Evaluate, tendrá en memoria una sola copia del modelo voluminoso.

Compatibilidad con Float16

Para mejorar el rendimiento y reducir la superficie del modelo, puede usar ONNXMLTools para convertir el modelo en float16.

Una vez convertidos, todos los pesos y entradas son float16. Aquí se muestra cómo puede trabajar con entradas y salidas float16:

  • ImageFeatureValue

    • Uso recomendado.
    • Convierte los colores y tensoriza a float16.
    • Admite formatos de imagen bgr8 y 8 bits, que se pueden convertir de forma segura en float16 sin pérdida de datos.
  • TensorFloat

    • Ruta avanzada.
    • Float32 se convierte en float16.
    • En el caso de las imágenes, la conversión se puede realizar con seguridad, ya que el formato bgr8 es pequeño y encaja.
    • Si no son imágenes, Bind producirá un error y deberá pasar la clase TensorFloat16Bit en su lugar.
  • TensorFloat16Bit

    • Ruta avanzada.
    • Debe convertirla a float16 y pasar las entradas como float32, que se convertirán a float16.

Nota:

La mayoría de las veces, el operador sigue realizando matemáticas de 32 bits. Hay menos riesgo de desbordamiento y el resultado se trunca en float16. Sin embargo, si el hardware anuncia compatibilidad con float16, el entorno de ejecución aprovechará su ventaja.

Procesamiento previo de datos de entrada

WinML realiza algunos pasos previos al procesamiento en segundo plano para que el procesamiento de datos de entrada sea más sencillo y eficaz. Por ejemplo, las imágenes de entrada dadas podrían estar en varios formatos de color y formas, y pueden ser diferentes de lo que espera el modelo. WinML realiza conversiones en las imágenes para que coincidan con ellas, lo que reduce la carga en el desarrollador.

WinML también aprovecha toda la pila de hardware (CPU, GPU, etc.) para proporcionar las conversiones más eficaces para un determinado dispositivo y escenario.

Sin embargo, en determinados casos puede que desee tensorizar manualmente los datos de entrada debido a algunos requisitos específicos que tiene. Por ejemplo, quizás no quiera usar VideoFrame para las imágenes o desea normalizar los valores de píxeles del intervalo entre 0 y 255 y 0-1. En estos casos, puede realizar su propia tensorización personalizada en los datos. Consulte el ejemplo de tensorización personalizada para obtener un ejemplo de esto.

Nota:

Use los siguientes recursos para obtener ayuda con Windows ML:

  • Para formular o responder preguntas técnicas sobre Windows ML, use la etiqueta windows-machine-learning en Stack Overflow.
  • Para notificar un error, envíe un problema en nuestro GitHub.