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 Runtime 间接使用 DirectML,ONNX Runtime 是一个跨平台库,支持用于机器学习模型的开放标准 ONNX 格式。 ONNX 运行时可以使用 DirectML 作为其执行提供程序之一,以及其他后端,例如 CPU、CUDA 或 TensorRT。 这样,便可以利用 DirectML 的性能和兼容性,而无需自行编写任何 DirectML 代码。

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

DirectML 的作用:作为开发人员, 必须执行哪些工作?

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

运算符和图形应用硬件特定和体系结构特定的优化。 同时,您作为开发人员会看到一个与供应商无关的接口来执行这些运算符。

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

  • 激活运算符,如 线性ReLUsigmoidtanh 等。
  • 元素运算符,例如 addexplogmaxminsub 等。
  • 卷积运算符,例如 2D 和 3D 卷积等。
  • 减少运算符,如 argminaveragel2sum 等。
  • 池运算符,例如 平均值lp最大值
  • 神经网络(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 运算符。 这意味着,无论是首选对逐层方法的精细控制还是图形方法的便利性,都不必牺牲功能。

本部分内容

主题 DESCRIPTION
快速入门指南 开始使用 DirectML。
开发人员工具 用于分析、优化和调试 DirectML 的工具。
编程指南 有关数据绑定、屏障、幻灯片、融合、错误处理、设备移除和帮助程序函数的主题。
故障排除 处理错误条件并使用调试层。
DirectML 版本历史记录 DirectML 是 Windows 10 的系统组件,也可用作独立的可再发行组件包。
DirectML 功能级别历史记录 每个功能级别中引入的类型清单。
DirectML 示例应用程序 指向 DirectML 示例应用程序的链接,包括最小 DirectML 应用程序的示例。
GPU 加速机器学习训练 介绍适用于 Linux 的 Windows 子系统 (WSL)和本机 Windows 的 GPU 加速机器学习(ML)训练当前支持的内容。
DirectML API 参考 本部分介绍在DirectML.h中声明的直接机器学习(DirectML) API。

另请参阅