Compartilhar via


ONNX e o Microsoft Azure Machine Learning

Este artigo descreve como o ONNX (Open Neural Network Exchange) pode ajudar a otimizar a inferência de seus modelos de machine learning. A inferência ou pontuação de modelo é o processo de usar um modelo implantado para gerar previsões em dados de produção.

A otimização dos modelos de machine learning para inferência exige que você ajuste o modelo e a biblioteca de inferência para aproveitar ao máximo as funcionalidades do hardware. Essa tarefa se tornará complexa se você quiser obter o desempenho ideal em diferentes plataformas, como nuvem ou borda, CPU ou GPU, já que cada plataforma tem funcionalidades e características diferentes. A complexidade aumentará se você precisar executar modelos de várias estruturas em diferentes plataformas. Pode ser demorado otimizar todas as diferentes combinações de estruturas e hardware.

Uma solução útil é treinar seu modelo uma vez em sua estrutura preferida e depois exportá-lo ou convertê-lo no ONNX para que ele possa ser executado em qualquer lugar na nuvem ou borda. A Microsoft e uma comunidade de parceiros criaram o ONNX como um padrão aberto para representar modelos de aprendizado de máquina. Você pode exportar ou converter modelos de muitas estruturas para o formato ONNX padrão. As estruturas com suporte incluem TensorFlow, PyTorch, scikit-learn, Keras, Chainer, MXNet e MATLAB. Você pode executar modelos no formato ONNX em várias plataformas e dispositivos.

Este diagrama de fluxo ONNX mostra as estruturas e opções de implantação disponíveis.

Diagrama de fluxo do ONNX mostrando o treinamento, os conversores e a implantação.

ONNX Runtime

O ONNX Runtime é um mecanismo de inferência de alto desempenho para a implantação de modelos do ONNX para produção. O runtime do ONNX é otimizado para a nuvem e borda e funciona no Linux, no Windows e no macOS. O ONNX é escrito em C++, ele também tem APIs em C, Python, C#, Java e JavaScript (Node.js) para uso nesses ambientes.

O ONNX Runtime é dá suporte para redes neurais profundas (DNN) e modelos tradicionais de aprendizado de máquina, e se integra a aceleradores em diferentes hardwares, como o TensorRT em GPUs da Nvidia, o OpenVINO em processadores Intel e o DirectML no Windows. Usando o Runtime ONNX, você pode se beneficiar das grandes otimizações de nível de produção, testes e aprimoramentos contínuos.

Serviços da Microsoft de grande escala, como Bing, Office e a IA do Azure, usam o runtime do ONNX. Embora os ganhos de desempenho dependam de muitos fatores, esses serviços da Microsoft relatam um ganho de desempenho médio de 2x na CPU usando o ONNX. O runtime do ONNX é executado no Azure Machine Learning e em outros produtos da Microsoft que dão suporte a cargas de trabalho de machine learning, incluindo:

Maneiras de obter modelos do ONNX

Você pode obter modelos ONNX de várias maneiras:

Você pode representar muitos modelos como ONNX, incluindo classificação de imagem, detecção de objetos e modelos de processamento de texto. Se você não conseguir converter seu modelo com êxito, registre um problema do GitHub no repositório do conversor usado.

Implantação do modelo ONNX no Azure

Você pode implantar, gerenciar e monitorar os modelos do ONNX no Azure Machine Learning. Usando um fluxo de trabalho padrão de implantação MLOps com o ONNX Runtime, você pode criar um ponto de extremidade REST hospedado na nuvem.

Pacotes do Python para o runtime do ONNX

Os pacotes Python para o runtime do ONNX de CPU e GPU estão disponíveis em PyPi.org. Certifique-se de revisar os requisitos do sistema antes da instalação.

Para instalar o ONNX Runtime para Python, use um dos seguintes comandos:

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

Para chamar o runtime do ONNX no script do Python, use o seguinte código:

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

A documentação que acompanha o modelo geralmente informa as entradas e saídas para usar o modelo. Também é possível usar uma ferramenta de visualização como o Netron para exibir o modelo.

O runtime do ONNX permite que você consulte os metadados, as entradas e as saídas do modelo da seguinte forma:

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

Para executar a inferência em seu modelo, use run e passe a lista de saídas que você deseja retornar e um mapa dos valores de entrada. Deixe a lista de saída vazia se desejar todas as saídas. O resultado é uma lista das saídas.

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

Para obter a referência completa da API de runtime do ONNX, confira a documentação da API do Python.