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 uno de los objetos expuestos desde el tiempo de ejecución es ágil, lo que significa es accesible desde cualquier subproceso. Consulta Objetos ágiles en C++/WinRT para obtener más información sobre Agile.
Un objeto de clave con el que trabajarás es LearningModelSession. Este objeto siempre se puede llamar con seguridad desde cualquier subproceso.
Para sesiones de GPU: el objeto bloqueará y sincronizará las llamadas simultáneas. Si necesitas simultaneidad, debes crear varias sesiones para lograrla.
Para sesiones de CPU: el objeto no bloqueará y permitirá las llamadas simultáneas en una sola sesión. Debes tener cuidado de administrar tu propio estado, así como tus búferes y objetos de enlace.
Debes tener cuidado y medir el objetivo de tu escenario. Las arquitecturas de GPU modernas funcionan de manera diferente que las CPU. Por ejemplo, si el objetivo es una latencia baja, puedes administrar la programación del trabajo en los motores de CPU y GPU mediante la canalización, no la simultaneidad. Este artículo sobre la sincronización de varios motores es un excelente lugar para comenzar. Si el rendimiento es tu objetivo (como el procesamiento del máximo de imágenes a la vez), suele ser conveniente 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 los objetivos y el escenario.
Uso de memoria
Cada instancia de LearningModel y LearningModelSession tiene una copia del modelo en la memoria. Si trabajas con modelos pequeños, es posible que no te interese, pero es importante si trabajas con modelos muy grandes.
Para liberar la memoria, llama a Dispose en el modelo o la sesión. No te limites a eliminarlos, ya que algunos lenguajes realizan una recopilación diferida de elementos no utilizados.
LearningModel mantiene una copia en la memoria para permitir la creación de nuevas sesiones. Al eliminar la instancia de LearningModel, todas las sesiones existentes seguirán funcionando. Sin embargo, ya no podrás crear nuevas sesiones con la instancia de LearningModel. En el caso de los modelos de gran tamaño, puedes crear un modelo y una sesión y, a continuación, desechar el modelo. Al usar una sola sesión para todas las llamadas a Evaluate, tendrás una sola copia del modelo grande en la memoria.
Compatibilidad con Float16
Para mejorar el rendimiento y reducir la superficie del modelo, puedes usar ONNXMLTools para convertir el modelo a float16.
Una vez convertido, todos los pesos y las entradas serán float16. Aquí se muestra cómo puedes trabajar con las entradas y salidas float16:
-
- Uso recomendado.
- Convierte los colores y tensoriza a float16.
- Admite los formatos de imagen de 8 bits y bgr8, que se pueden convertir de forma segura a float16 sin pérdida de datos.
-
- Ruta de acceso avanzada.
- Conversión de float32 a 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ás pasar la clase TensorFloat16Bit en su lugar.
-
- Ruta de acceso avanzada.
- Debes 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 cálculos matemáticos de 32 bits. Existe menos riesgo de desbordamiento y el resultado se trunca a float16. Sin embargo, si el hardware anuncia la compatibilidad con float16, el entorno de ejecución la aprovechará.
Preprocesamiento de datos de entrada
WinML realiza algunos pasos de preprocesamiento en segundo plano para que el procesamiento de datos de entrada sea más sencillo y eficaz. Por ejemplo, las imágenes de entrada proporcionadas pueden 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, lo que reduce la carga del desarrollador.
WinML también aprovecha toda la pila de hardware (CPU, GPU, etc.) para proporcionar las conversiones más eficaces para un escenario y un dispositivo determinados.
Sin embargo, en algunos casos es posible que quieras tensorizar manualmente los datos de entrada debido a algunos requisitos específicos. Por ejemplo, es posible que no quieras usar VideoFrame para las imágenes o que desees normalizar los valores de píxeles del intervalo 0-255 al intervalo 0-1. En estos casos, puedes realizar tu propia tensorización personalizada en los datos. Para ver un ejemplo, consulta el artículo Ejemplo de tensorización personalizada.
Nota:
Use los siguientes recursos para obtener ayuda con Windows ML:
- Para formular o responder a preguntas técnicas sobre Windows Machine Learning, utilice la etiqueta windows-machine-learning en Stack Overflow.
- Para notificar un error, registre un problema en GitHub.