ONNX и Машинное обучение Azure

В этой статье описывается, как open Neural Network Exchange (ONNX) помогает оптимизировать вывод моделей машинного обучения. Инференс или оценка модели — процесс использования развернутой модели для генерации предсказаний на производственных данных.

Оптимизация моделей машинного обучения для инференса требует настройки модели и библиотеки инференса, чтобы максимально эффективно использовать возможности оборудования. Эта задача становится сложной, если вы хотите получить оптимальную производительность на разных платформах, таких как облако, edge, ЦП или GPU, так как каждая платформа имеет различные возможности и характеристики. Сложность увеличивается, если необходимо запускать модели из различных платформ на разных платформах. Оптимизация всех возможных сочетаний фреймворков и оборудования может занять много времени.

Практичное решение — один раз обучить модель в предпочитаемом фреймворке, а затем экспортировать или преобразовать её в ONNX, чтобы она могла работать где угодно — в облаке или на периферийных устройствах. Корпорация Майкрософт и сообщество партнеров создали ONNX как открытый стандарт для представления моделей машинного обучения. Вы можете экспортировать или преобразовать модели из многих платформ в стандартный формат ONNX. Поддерживаемые платформы включают TensorFlow, PyTorch, scikit-learn, Keras, Chainer, MXNet и MATLAB. Модели можно запускать в формате ONNX на различных платформах и устройствах.

На этой схеме потока ONNX показаны доступные платформы и параметры развертывания.

Схема потока ONNX с обучением, преобразователями и развертыванием.

Среда выполнения ONNX

Среда выполнения ONNX — это высокопроизводительный механизм вывода для развертывания моделей ONNX в рабочей среде. Среда выполнения ONNX оптимизирована как для облака, так и для пограничных вычислений, а также работает в Linux, Windows и macOS. ONNX написан на C++, но также содержит API C, Python, C#, Java и JavaScript (Node.js), которые можно использовать в этих средах.

Среда выполнения ONNX поддерживает как глубокие нейронные сети, так и традиционные модели машинного обучения. Она интегрируется с акселераторами на другом оборудовании, например TensorRT на GPU NVIDIA, OpenVINO на процессорах Intel и DirectML в Windows. Используя среду выполнения ONNX, вы можете воспользоваться обширными оптимизациями производственного класса, тестированием и текущими улучшениями.

Высокомасштабируемые службы Майкрософт, такие как Bing, Office и Azure AI, используют среду выполнения ONNX. Хотя повышение производительности зависит от многих факторов, средние показатели производительности этих служб Майкрософт увеличиваются в 2 раза на ЦП благодаря использованию ONNX. ONNX Runtime работает в Машинное обучение Azure и других продуктах Microsoft, поддерживающих нагрузки машинного обучения, включая:

Способы получения моделей ONNX

Модели ONNX можно получить несколькими способами:

Можно представить множество моделей как ONNX, включая классификацию изображений, обнаружение объектов и модели обработки текста. Если вам не удаётся успешно преобразовать модель, создайте issue на GitHub в репозитории того конвертера, который вы использовали.

Развертывание модели ONNX в Azure

Вы можете развертывать, управлять и контролировать свои модели ONNX в Машинное обучение Azure. Используя стандартный рабочий процесс развертывания MLOps с средой выполнения ONNX, можно создать конечную точку REST, размещенную в облаке.

Пакеты Python для среды выполнения ONNX

Пакеты Python для среды выполнения ЦП и GPU ONNX доступны в PyPi.org. Перед установкой обязательно просмотрите требования к системе.

Чтобы установить среду выполнения ONNX для Python, используйте одну из следующих команд.

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

Чтобы вызвать среду выполнения ONNX в скрипте Python, используйте следующий код:

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

Входные и выходные данные для использования модели см. в документации к соответствующей модели. Для просмотра модели можно также использовать такое средство визуализации, как Netron.

Среда выполнения ONNX позволяет запрашивать метаданные модели, входные данные и выходные данные, как показано ниже.

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

Чтобы выполнить вывод в модели, используйте run и передайте список выходных данных, которые вы хотите вернуть, и карту входных значений. Оставьте список выходных данных пустым, если требуется все выходные данные. Результатом будет список выходных данных.

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

Полный справочник по API среды выполнения ONNX см. в документации по API Python.