Compartir vía


ONNX y Azure Machine Learning

En este artículo se describe cómo Open Neural Network Exchange (ONNX) puede ayudar a optimizar la inferencia de los modelos de aprendizaje automático. La inferencia o la puntuación del modelo es el proceso de usar un modelo implementado para generar predicciones en los datos de producción.

La optimización de los modelos de aprendizaje automático para la inferencia requiere que ajuste el modelo y la biblioteca de inferencia para aprovechar las funcionalidades de hardware. Esta tarea se vuelve compleja si desea obtener un rendimiento óptimo en diferentes tipos de plataformas, como la nube o el perímetro, la CPU o la GPU, etc., ya que cada plataforma tiene diferentes funcionalidades y características. La complejidad aumenta si necesita ejecutar modelos desde varios marcos en distintas plataformas. Puede llevar mucho tiempo optimizar todas las diferentes combinaciones de marcos y hardware.

Una solución útil es entrenar el modelo una vez en el marco preferido y, a continuación, exportarlo o convertirlo a ONNX para que pueda ejecutarse en cualquier lugar de la nube o el perímetro. Microsoft y una comunidad de asociados crearon ONNX como un estándar abierto para representar modelos de Machine Learning. Puede exportar o convertir modelos de muchos marcos al formato ONNX estándar. Entre los marcos admitidos se incluyen TensorFlow, PyTorch, scikit-learn, Keras, Chainer, MXNet y MATLAB. Puede ejecutar modelos en formato ONNX en varias plataformas y dispositivos.

En este diagrama de flujo de ONNX se muestran los marcos y las opciones de implementación disponibles.

Diagrama de flujo de ONNX que muestra el entrenamiento, los convertidores y la implementación.

ONNX Runtime

ONNX Runtime es un motor de inferencia de alto rendimiento que sirve para implementar modelos ONNX en la producción. ONNX Runtime está optimizado para la nube y el perímetro, y funciona en Linux, Windows y macOS. ONNX está escrito en C++, pero también tiene API de C, Python, C#, Java y JavaScript (Node.js) para usarlas en esos entornos.

ONNX Runtime admite redes neuronales profundas (DNN) y modelos de Machine Learning automático tradicionales, y se integra con aceleradores en hardware diferente, como TensorRT en GPU de Nvidia, OpenVINO en procesadores Intel y DirectML en Windows. Con ONNX Runtime, puede beneficiarse de amplias optimizaciones de nivel de producción, pruebas y mejoras en curso.

Los servicios de Microsoft a gran escala, como Bing, Office y Azure AI, usan ONNX Runtime. Aunque las mejoras de rendimiento dependen de muchos factores, estos servicios de Microsoft notifican una ganancia media de rendimiento de 2 veces en la CPU mediante ONNX. ONNX Runtime se ejecuta en Azure Machine Learning y otros productos de Microsoft que admiten cargas de trabajo de aprendizaje automático, entre las que se incluyen:

Formas de obtener modelos ONNX

Puede obtener modelos de ONNX de varias maneras:

Puede representar muchos modelos como ONNX, incluida la clasificación de imágenes, la detección de objetos y los modelos de procesamiento de texto. Si no puede convertir el modelo correctamente, registre un problema de GitHub en el repositorio del convertidor que usó.

Implementación del modelo ONNX en Azure

Puede implementar, administrar y supervisar los modelos de ONNX en Azure Machine Learning. Con un flujo de trabajo de implementación MLOps estándar con ONNX Runtime, puede crear un punto de conexión REST hospedado en la nube.

Paquetes de Python para ONNX Runtime

Los paquetes de Python para CPU y GPU ONNX Runtime están disponibles en PyPi.org. Asegúrese de revisar los requisitos del sistema antes de la instalación.

Para instalar ONNX Runtime para Python, use uno de los siguientes comandos:

pip install onnxruntime       # CPU build
pip install onnxruntime-gpu   # GPU build

Para llamar a ONNX Runtime en el script de Python, use el código siguiente:

import onnxruntime
session = onnxruntime.InferenceSession("path to model")

La documentación que acompaña al modelo suele indicar las entradas y salidas para usar el modelo. También puede usar una herramienta de visualización como Netron para ver el modelo.

ONNX Runtime permite consultar los metadatos, las entradas y las salidas del modelo, como se indica a continuación:

session.get_modelmeta()
first_input_name = session.get_inputs()[0].name
first_output_name = session.get_outputs()[0].name

Para realizar la inferencia en el modelo, use run y pase la lista de salidas que desea devolver y un mapa de los valores de entrada. Deje la lista de resultados vacía si desea todas las salidas. El resultado es una lista de las salidas.

results = session.run(["output1", "output2"], {
                      "input1": indata1, "input2": indata2})
results = session.run([], {"input1": indata1, "input2": indata2})

Para obtener la referencia completa de la API en ONNX Runtime, consulte la documentación de la API de Python.