Обзор DirectML
Direct Машинное обучение (DirectML) — это низкоуровневый API для машинного обучения. 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 — это низкий уровень аппаратной абстракции, который позволяет запускать рабочие нагрузки машинного обучения на любом совместимом GPU DirectX 12.
Если необходимо оптимизировать производительность машинного обучения в режиме реального времени, высокой производительности, низкой задержки или сценариях с ограниченными ресурсами, DirectML обеспечивает максимальное управление и гибкость. DirectML можно использовать для интеграции машинного обучения непосредственно в существующий механизм или конвейер отрисовки, а также для создания собственных платформ машинного обучения и по промежуточного слоя в Windows.
Вы также можете использовать DirectML косвенно через среду выполнения ONNX, которая является кроссплатформенной библиотекой, которая поддерживает открытый стандартный формат ONNX для моделей машинного обучения. Среда выполнения ONNX может использовать DirectML в качестве одного из поставщиков выполнения, а также других серверных компонентов, таких как ЦП, CUDA или TensorRT. Таким образом, вы можете использовать производительность и совместимость DirectML без написания кода DirectML самостоятельно.
Кроме того, вы можете использовать API WinML, который является более высоким уровнем, ориентированным на модель API, который упрощает рабочий процесс машинного обучения с помощью шаблона оценки нагрузки и привязки. WinML также использует формат ONNX для моделей и может использовать DirectML в качестве серверной части. WinML предназначен для сценариев, в которых необходимо быстро и легко интегрировать машинное обучение в приложения Windows, не беспокоясь о деталях базового оборудования или платформы.
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, сверток, нормализации и операторов активации. Благодаря такому опыту, тщательному планированию и управлению барьерами можно извлечь наиболее параллелизм и производительность из оборудования. Если вы разрабатываете игру, то тщательное управление ресурсами и контроль над планированием позволяет взаимодействовать с рабочими нагрузками машинного обучения и традиционными работами отрисовки для насыщения GPU.
Ниже приведен высокоуровневый рецепт использования DirectML. На двух основных этапах инициализации и выполнения вы записываете работу в списки команд, а затем выполняете их в очереди.
- Создайте ресурсы Direct3D 12 — устройство Direct3D 12, очередь команд, список команд и ресурсы, такие как кучи дескриптора.
- Так как вы выполняете вывод машинного обучения, а также рабочую нагрузку отрисовки, создайте ресурсы DirectML — экземпляры устройств и операторов DirectML. Если у вас есть модель машинного обучения, в которой необходимо выполнить определенный тип свертки с определенным размером тензора фильтра с определенным типом данных, то это все параметры в операторе сверток DirectML.
- Записи DirectML работают в списках команд Direct3D 12. Таким образом, после завершения инициализации необходимо записать привязку и инициализацию оператора свертывания в список команд. Затем закройте и выполните список команд в очереди как обычно.
- Отправьте тензоры веса в ресурсы. Тензор в DirectML представлен обычным ресурсом Direct3D 12. Например, если вы хотите передать данные веса в GPU, то вы делаете это так же, как и с любым другим ресурсом Direct3D 12 (используйте кучу отправки или очередь копирования).
- Затем необходимо привязать эти ресурсы Direct3D 12 в качестве тензоров ввода и вывода. Запишите в список команд привязку и выполнение операторов.
- Закройте и выполните список команд.
Так же, как и в Direct3D 12, время существования ресурсов и синхронизация являются вашей ответственностью. Например, не выпускайте объекты DirectML по крайней мере до тех пор, пока они не завершили выполнение на GPU.
DirectML поддерживает как многоуровневые, так и графовые подходы к выполнению модели. При выполнении уровней вы несете ответственность за создание и инициализацию каждого оператора DirectML и их отдельное запись для выполнения в списке команд. В отличие от этого, при выполнении графа вы создаете набор узлов и ребер, где каждый узел представляет оператор DirectML, а края представляют тензорные данные, поступающие между узлами. Затем весь граф отправляется для инициализации или выполнения одновременно, а DirectML обрабатывает планирование и запись отдельных операторов от вашего имени.
Оба шаблона полезны в разных ситуациях. Подход на уровне обеспечивает максимальный контроль над упорядочением и планированием вычислительных работ. Например, этот уровень управления позволяет чередовать рабочие нагрузки отрисовки Direct3D 12 с помощью диспетчеров вычислений DirectML. Это может быть полезно для использования асинхронных единиц вычислений или шейдеров на GPU, которые в противном случае будут бездействующими. При выполнении слоя вручную по уровню также предоставляется явный контроль над макетами тензоров и использованием памяти.
Однако модели машинного обучения часто выражаются с точки зрения графов слоев. В качестве альтернативы подходу на уровне DirectML позволяет выразить модель в виде ациклического графа узлов (операторов DirectML) и ребер между ними (описания tensor). После создания описания графа можно скомпилировать и отправить его сразу в DirectML для инициализации и выполнения. В этом подходе DirectML решает порядок обхода и обрабатывает каждый отдельный оператор и поток данных между ними от вашего имени. Это часто более простой и более естественный способ выразить модель машинного обучения и разрешить автоматически применять оптимизации для конкретного achitecture. Кроме того, вспомогательные библиотеки DirectMLX предоставляют чистый и удобный синтаксис для создания сложных графов операторов DirectML.
Любой подход, который вы предпочитаете, всегда будет иметь доступ к одному и тому же обширному набору операторов DirectML. Это означает, что вам никогда не придется жертвовать функциональностью, предпочитаемую точное управление подходом по слоям или удобством подхода графа.
Раздел | Описание |
---|---|
Краткое руководство по началу работы | Начало работы с DirectML. |
Инструменты разработчика | Средства для профилирования, оптимизации и отладки DirectML. |
Руководство по программированию | Разделы о привязке данных, барьерах, слайдах, слияниях, обработке ошибок, удалении устройств и вспомогательных функциях. |
Устранение неполадок | Обработка условий ошибок и использование слоя отладки. |
Журнал версий DirectML | DirectML — это системный компонент Windows 10, который также доступен как автономный распространяемый пакет. |
Журнал компонентов DirectML | Манифест типов, представленных на каждом уровне компонентов. |
Примеры приложений DirectML | Ссылки на примеры приложений DirectML, включая пример минимального приложения DirectML. |
Машинное обучение с аппаратным ускорением на базе GPU | Описывает, что в настоящее время поддерживается обучением машинного обучения (ML) GPU для подсистема Windows для Linux (WSL) и собственных Windows. |
Справочник по API DirectML | В этом разделе рассматриваются API Direct Машинное обучение (DirectML), объявленные в DirectML.h . |