Поделиться через


Обзор DirectML

Сводка

Direct Machine Learning (DirectML) — это низкоуровневый API для машинного обучения(ML). API имеет знакомый интерфейс (похожий на родной C++, nano-COM) и рабочий процесс по аналогии с DirectX 12. Вы можете интегрировать рабочие нагрузки машинного обучения в игру, подсистему, ПО промежуточного слоя, серверную часть или другое приложение. DirectML поддерживается всеми аппаратными средствами, совместимыми с DirectX 12.

Примитивы машинного обучения с аппаратным ускорением (называемые операторами) — это стандартные блоки DirectML. Из этих базовых элементов вы можете разрабатывать такие методы машинного обучения, как перемасштабирование, сглаживание и перенос стиля, чтобы назвать лишь несколько. Шумоподавление и супер-разрешение, например, позволяют достичь впечатляющих эффектов трассировки лучей с меньшим количеством лучей на пиксель.

Вы можете интегрировать рабочие нагрузки машинного обучения в игру, подсистему, ПО промежуточного слоя, серверную часть или другое приложение. DirectML имеет знакомый (собственный интерфейс C++, nano-COM) DirectX 12-стиль программирования и рабочий процесс, который поддерживается всеми оборудованием, совместимым с DirectX 12. Примеры приложений DirectML, включая пример минимального приложения DirectML, см. в примере приложений DirectML.

DirectML появился в Windows 10 версии 1903 и в соответствующей версии пакета SDK для Windows.

Подходит ли DirectML для проекта?

DirectML — это низкий уровень аппаратной абстракции, который позволяет запускать рабочие нагрузки машинного обучения на любом совместимом GPU DirectX 12.

Если необходимо оптимизировать производительность машинного обучения в режиме реального времени, высокой производительности, низкой задержки или сценариях с ограниченными ресурсами, DirectML обеспечивает максимальное управление и гибкость. DirectML можно использовать для интеграции машинного обучения непосредственно в ваш существующий движок или конвейер рендеринга, или для создания собственных пользовательских платформ и промежуточного программного обеспечения для машинного обучения в Windows.

Вы также можете использовать DirectML косвенно через среду выполнения ONNX, которая является кроссплатформенной библиотекой, которая поддерживает открытый стандартный формат ONNX для моделей машинного обучения. Среда выполнения ONNX может использовать DirectML в качестве одного из поставщиков выполнения, а также других серверных компонентов, таких как ЦП, CUDA или TensorRT. Таким образом, вы можете использовать производительность и совместимость DirectML без написания кода DirectML самостоятельно.

Кроме того, вы можете использовать API WinML, который является более высоким уровнем, ориентированным на модель API, который упрощает рабочий процесс машинного обучения с помощью шаблона оценки нагрузки и привязки. WinML также использует формат ONNX для моделей и может использовать DirectML в качестве серверной части. WinML предназначен для сценариев, в которых необходимо быстро и легко интегрировать машинное обучение в приложения Windows, не беспокоясь о деталях базового оборудования или платформы.

Что делает DirectML; и что я должен делать как разработчик?

DirectML эффективно выполняет отдельные слои модели вывода на GPU (или на ядрах ускорения ИИ, если они присутствуют). Каждый уровень является оператором, и DirectML предоставляет библиотеку низкоуровневых операторов машинного обучения с аппаратным ускорением. Операции DirectML можно выполнять в изоляции или в виде графа (см. раздел Рабочие процессы DirectML: уровня за уровнем и на основе графов).

Операторы и графы применяют оптимизации, относящиеся к оборудованию и архитектуре. Как разработчик, вы видите единый, независимый от поставщика интерфейс для выполнения этих операторов.

Библиотека операторов в DirectML предоставляет все обычные операции, которые вы ожидаете использовать в рабочей нагрузке машинного обучения.

  • Операторы активации, такие как линейные, ReLU, sigmoid, tanh и многое другое.
  • Поэлементные операторы, такие как add, exp, log, max, min, sub и многое другое.
  • Операторы свертки, такие как свертка 2D и 3D, и многое другое.
  • Операторы сокращения, такие как argmin, average, l2, sum и многое другое.
  • Операции объединения, такие как среднее, lp и max.
  • Операторы нейронной сети (NN), такие как gemm, gru, lstm и rnn.
  • И многое другое.

Для максимальной производительности и чтобы вы не платили за то, что не используете, DirectML предоставляет вам, как разработчику, контроль над выполнением рабочей нагрузки машинного обучения на оборудовании. Ваша ответственность как разработчика — выяснить, какие операторы должны выполняться и когда. Задачи, оставленные на ваше усмотрение, включают: транскрибирование модели; упрощение и оптимизация слоев; загрузка весов; выделение ресурсов, привязка, управление памятью (как и с Direct3D 12); и выполнение графа.

Вы сохраняете высокоуровневые знания о графах (вы можете встроить модель в код напрямую или написать свой собственный загрузчик модели). Вы можете разработать модель масштабирования, например, с несколькими слоями, каждый из которых содержит операторы upsample, свертки, нормализации и активации. Благодаря такому опыту, тщательному планированию и управлению барьерами можно извлечь наиболее параллелизм и производительность из оборудования. Если вы разрабатываете игру, тщательное управление ресурсами и контроль над планированием позволяют чередовать рабочие нагрузки машинного обучения и традиционные задачи отрисовки, чтобы полностью загрузить графический процессор.

Что такое высокоуровневый рабочий процесс DirectML?

Ниже приведен высокоуровневый рецепт использования DirectML. На двух основных этапах инициализации и выполнения вы записываете работу в списки команд, а затем выполняете их в очереди.

Инициализация

  1. Создайте ресурсы Direct3D 12 — устройство Direct3D 12, очередь команд, список команд и ресурсы, такие как кучи дескрипторов.
  2. Так как вы выполняете прогнозирование с использованием машинного обучения, а также нагрузку рендеринга, создайте ресурсы DirectML — экземпляры устройства DirectML и операторов. Если у вас есть модель машинного обучения, в которой необходимо выполнить определенный тип свертки с определенным размером тензора фильтра с определенным типом данных, то это все параметры в операторе сверток DirectML.
  3. Записи DirectML работают в списках команд Direct3D 12. Таким образом, после завершения инициализации необходимо записать привязку и инициализацию оператора свертывания в список команд. Затем закройте список команд и выполните его в вашей очереди как обычно.

Исполнение

  1. Загрузите весовые тензоры в ресурсы. Тензор в DirectML представлен обычным ресурсом Direct3D 12. Например, если вы хотите передать данные веса в GPU, то делайте это так же, как с любым другим ресурсом Direct3D 12 (используйте кучу загрузки или очередь копирования).
  2. Далее необходимо задействовать эти ресурсы Direct3D 12, привязав их как тензоры ввода и вывода. Запишите в список команд привязку и выполнение ваших команд.
  3. Закройте и выполните список команд.

Так же, как и в Direct3D 12, время существования ресурсов и синхронизация являются вашей ответственностью. Например, не выпускайте объекты DirectML по крайней мере до тех пор, пока они не завершили выполнение на GPU.

Рабочие процессы на основе уровней и графов в DirectML

DirectML поддерживает как многоуровневые, так и графовые подходы к выполнению модели. При выполнении слой-за-слоем вы несете ответственность за создание и инициализацию каждого оператора DirectML, а также за их индивидуальную запись для выполнения в списке команд. В отличие от этого, при выполнении графа вы создаете набор узлов и ребер, где каждый узел представляет оператор DirectML, а края представляют тензорные данные, поступающие между узлами. Затем весь граф отправляется для инициализации или выполнения одновременно, а DirectML обрабатывает планирование и запись отдельных операторов от вашего имени.

Оба шаблона полезны в разных ситуациях. Подход слой за слоем обеспечивает максимальный контроль над упорядочением и планированием вычислительных задач. Например, этот уровень управления позволяет чередовать рабочие нагрузки визуализации Direct3D 12 с задачами расчетов DirectML. Это может быть полезно для использования асинхронных единиц вычислений или шейдеров на GPU, которые в противном случае будут бездействующими. При ручном выполнении слой за слоем разработчик получает явный контроль над макетами тензоров и использованием памяти.

Однако модели машинного обучения часто выражаются с точки зрения графов слоев. В качестве альтернативы послойному подходу DirectML позволяет выразить модель в виде ориентированного ациклического графа узлов (операторов DirectML) и ребер, соединяющих их (описания тензоров). После создания описания графа можно скомпилировать и отправить его сразу в DirectML для инициализации и выполнения. В этом подходе DirectML решает порядок обхода и обрабатывает каждый отдельный оператор и поток данных между ними от вашего имени. Это часто более простой и более естественный способ выразить модель машинного обучения, что позволяет автоматически применять оптимизации, специфичные для архитектуры. Кроме того, вспомогательные библиотеки DirectMLX предоставляют чистый и удобный синтаксис для создания сложных графов операторов DirectML.

Независимо от того, какой подход вы предпочитаете, у вас всегда будет доступ к тому же обширному набору операторов DirectML. Это означает, что вам никогда не придется жертвовать функциональностью, будь то точного управления подходу по слоям или удобству подхода графа.

В этом разделе

Тема Описание
Краткое руководство по началу работы Начало работы с DirectML.
Средства разработчика Средства для профилирования, оптимизации и отладки DirectML.
Руководство по программированию Разделы о привязке данных, барьерах, слайдах, слияниях, обработке ошибок, удалении устройств и вспомогательных функциях.
Устранение неполадок Обработка ошибочных состояний и использование слоя отладки.
История версий DirectML DirectML — это системный компонент Windows 10, который также доступен как автономный распространяемый пакет.
История уровней функций DirectML Манифест типов, представленных на каждом уровне компонентов.
Примеры приложений DirectML Ссылки на примеры приложений DirectML, включая пример минимального приложения DirectML.
Обучение машинного обучения с ускорением GPU Поддержка ускоренного с помощью GPU обучения машинного обучения (ML) для подсистемы Windows для Linux (WSL) и на платформе Windows в целом.
Справочник по API DirectML В этом разделе рассматриваются API Direct Machine Learning (DirectML), объявленные в DirectML.h.

См. также