DirectML 概述

总结

直接机器学习 (DirectML) 是机器学习 (ML) 的低级 API。 API 具有常见的(本机 C++、nano-COM)编程接口和 DirectX 12 样式的工作流。 可将机器学习推断工作负荷集成到游戏、引擎、中间件、后端或其他应用程序中。 所有与 DirectX 12 兼容的硬件都支持 DirectML。

硬件加速的机器学习基元(称为“运算符”)是 DirectML 的构建基块。 在这些构建基块中,可以开发纵向扩展、抗锯齿和样式转移等机器学习技术。 例如,使用噪声抑制和超解析度,可以实现令人印象深刻的光线跟踪效果且可以减少每个像素的光线。

可将机器学习推断工作负荷集成到游戏、引擎、中间件、后端或其他应用程序中。 DirectML 提供用户熟悉的(本机C++、nano-COM)DirectX 12 式编程接口和工作流,且受所有 DirectX 12 兼容硬件的支持。 有关 DirectML 示例应用程序(包括精简 DirectML 应用程序的示例),请参阅 DirectML 示例应用程序

DirectML 是在 Windows 10 版本 1903 和 Windows SDK 的相应版本中引入的。

DirectML 是否适合我的项目?

DirectML 是一个低级别硬件抽象层,可用于在与 DirectX 12 兼容的任何 GPU 上运行机器学习工作负载。

如果需要为实时、高性能、低延迟或资源受限的场景优化机器学习性能,DirectML 可提供最大的控制权和灵活性。 可以使用 DirectML 将机器学习直接集成到现有的引擎或呈现管道中,或者在 Windows 上构建自己的自定义机器学习框架和中间件。

还可以通过 ONNX 运行时间接使用 DirectML,ONNX 运行时是一个跨平台库,支持用于机器学习模型的开放标准 ONNX 格式。 ONNX 运行时可以将 DirectML 用作自己的执行提供程序之一,还可以使用 CPU、CUDA 或 TensorRT 等其他后端。 这样即可利用 DirectML 的性能和兼容性,而无需自行编写任何 DirectML 代码。

或者,也可以使用 WinML API,这是一个更高级别、以模型为中心的 API,它利用其负载-绑定-评估模式简化了机器学习工作流。 WinML 还对模型使用 ONNX 格式,并且可以使用 DirectML 作为后端。 WinML 专为需要快速、轻松将机器学习集成到 Windows 应用程序中的场景而设计,无需担心基础硬件或框架的诸多细节。

DirectML 可完成哪些工作?作为开发人员,我必须完成哪些工作?

DirectML 在 GPU 上(或者在 AI 加速核心上,如果存在)有效执行推理模型的各个层。 每个层是一个运算符,DirectML 提供低级别、硬件加速机器学习基元运算符的库。 开发者可以单独或以图形形式执行 DirectML 操作(请参阅 DirectML 中的逐层工作流和基于图形的工作流部分)。

运算符和图形应用特定于硬件和特定于体系结构的优化。 同时,开发人员会看到单一与供应商无关的界面,可在其中执行这些运算符。

DirectML 中的运算符库提供预期可在机器学习工作负荷中使用的所有常用操作。

  • 激活运算符,例如 linearReLUsigmoidtanh,等等。
  • 元素范围的运行符,例如 addexplogmaxminsub,等等。
  • 卷积运算符,例如 2D 和 3D convolution,等等。
  • 化减运算符,例如 argminaveragel2sum,等等。
  • 池运算符,例如 averagelpmax
  • 神经网络 (NN) 运算符,例如 gemmgrulstmrnn
  • 还有其他许多运算符。

为获得最大性能,并避免针对未使用的资源付费,DirectML 允许开发人员亲手控制机器学习工作负荷在硬件上的执行方式。 开发人员需负责确定要执行的运算符,以及何时执行。 由你自行决定的任务包括:听录模型;简化和优化层;加载权重;资源分配、绑定和内存管理(如同在 Direct3D 12 中一样);图形执行。

你需要对图形具有深入的了解(可以直接将模型硬编码,或者编写自己的模型加载程序)。 例如,可以使用每个过采样卷积规范化激活运算符设计纵向扩展模块。 凭借对技术的熟悉、精心的计划和屏障管理,可以从硬件中获得最高并行度和性能。 开发游戏时,精心的资源管理和计划控制可以错开机器学习工作负荷和传统的渲染工作,以充分利用 GPU。

什么是高级 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 加速 ML 训练 介绍适用于 Linux 的 Windows 子系统 (WSL) 和本机 Windows 的 GPU 加速机器学习 (ML) 训练当前支持的内容。
DirectML API 参考 本节介绍在 DirectML.h 中声明的 Direct 机器学习 (DirectML) API。

另请参阅