DirectML 概觀
摘要
直接 機器學習 (DirectML) 是機器學習 (ML) 的低階 API。 API 在 DirectX 12 樣式中具有熟悉的(原生 C++、nano-COM)程序設計介面和工作流程。 您可以將機器學習推斷工作負載整合到您的遊戲、引擎、中介軟體、後端或其他應用程式中。 所有 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 運行時間可以使用 DirectML 作為其其中一個執行提供者,以及其他後端,例如 CPU、CUDA 或 TensorRT。 如此一來,您可以運用 DirectML 的效能和相容性,而不需要自行撰寫任何 DirectML 程式代碼。
或者,您可以使用 WinML API,這是更上層、以模型為主的 API,可透過其 load-bind-evaluate 模式簡化機器學習工作流程。 WinML 也會針對模型使用 ONNX 格式,而且可以使用 DirectML 作為其後端。 WinML 是專為需要快速且輕鬆地將機器學習整合到 Windows 應用程式的案例所設計,而不必擔心基礎硬體或架構的詳細數據。
DirectML 的工作為何;以及我作為開發人員必須執行哪些工作?
DirectML 會在 GPU 上有效率地執行推斷模型的個別層(如果存在,則為 AI 加速核心)。 每一層都是運算符,DirectML 提供低階、硬體加速機器學習基本運算子的連結庫。 您可以隔離或以圖形的形式執行 DirectML 作業(請參閱 DirectML 中的逐層和圖形型工作流程一節)。
操作員和圖形會套用硬體特定和架構特定的優化。 同時,您身為開發人員會看到執行這些運算子的單一廠商無關介面。
DirectML 中的運算符連結庫會提供您預期能夠在機器學習工作負載中使用的所有一般作業。
- 啟用運算子,例如 線性、 ReLU、 sigmoid、 tanh 等等。
- 元素明智的運算符,例如 add、 exp、 log、 max、 min、 sub 等等。
- 卷積運算子,例如 2D 和 3D 卷積等等。
- 縮減運算符,例如 argmin、 average、 l2、 sum等等。
- 集區運算符,例如 average、lp 和 max。
- 類神經網路 (NN) 運算符,例如 gemm、gru、lstm 和 rnn。
- 還有更多。
為了達到最大效能,因此您不需要支付未使用的內容,DirectML 會將控件放在開發人員手中,以開發人員的方式在硬體上執行機器學習工作負載。 找出要執行哪些運算符,以及何時是您作為開發人員的責任。 留給您自由裁量權的工作包括:轉譯模型;簡化和優化圖層;載入權數;資源配置、系結、記憶體管理(如同 Direct3D 12):和圖形的執行。
您可以保留圖形的高階知識(您可以直接將模型硬式編碼,也可以撰寫自己的模型載入器)。 例如,您可以設計向上調整模型,使用數個層級,每個向上取樣、卷積、正規化和啟用運算符。 透過熟悉、謹慎的排程和屏障管理,您可以從硬體擷取最平行處理原則和效能。 如果您正在開發遊戲,則仔細的資源管理和排程控制可讓您交錯機器學習工作負載和傳統轉譯工作,以讓 GPU 飽和。
高階 DirectML 工作流程為何?
以下是我們預期 DirectML 使用方式的高階配方。 在初始化和執行的兩個主要階段中,您會將工作記錄到命令清單中,然後在佇列上執行它們。
初始化
- 建立 Direct3D 12 資源—Direct3D 12 裝置、命令佇列、命令清單,以及描述元堆積等資源。
- 由於您正在執行機器學習推斷和轉譯工作負載,請建立 DirectML 資源,也就是 DirectML 裝置和操作員實例。 如果您有機器學習模型,其中您需要執行具有特定數據類型之篩選張量特定大小的卷積,這些都是 DirectML 卷積運算子的參數。
- DirectML 記錄會進入 Direct3D 12 命令清單。 因此,完成初始化之後,您會將 (例如) 的系結和初始化記錄到命令清單中。 然後,如往常在佇列上關閉並執行命令清單。
執行
- 將您的權數張量上傳至資源。 DirectML 中的張量會使用一般 Direct3D 12 資源來表示。 例如,如果您想要將權數數據上傳至 GPU,則您可以執行與任何其他 Direct3D 12 資源相同的方式(使用上傳堆積或複製佇列)。
- 接下來,您必須將這些 Direct3D 12 資源系結為輸入和輸出張量。 將記錄到命令中,列出系結和執行運算符。
- 關閉並執行命令清單。
如同 Direct3D 12,資源存留期和同步處理是您的責任。 例如,在 GPU 上完成執行之前,至少不要釋放您的 DirectML 物件。
DirectML 中的逐層和圖形型工作流程
DirectML 支援模型執行的逐層和圖形型方法。 執行逐層時,您必須負責建立和初始化每個 DirectML 運算元,並個別錄製它們以在命令清單上執行。 相反地,在執行圖形時,您會改為建置一組節點和邊緣,其中每個節點代表 DirectML 運算符,而邊緣代表節點之間流動的張量數據。 接著會提交整個圖表以進行初始化或一次執行,DirectML 會代表您處理個別運算符的排程和記錄。
這兩種模式在不同情況下都很有用。 逐層方法可讓您對計算工作的順序和排程進行最大控制。 例如,此層級的控制可讓您將 Direct3D 12 轉譯工作負載與 DirectML 計算分派交錯。 這對於利用 GPU 上的異步計算或著色器單位,否則會閒置很有用。 手動逐層執行也可讓您明確控制 Tensor 配置和記憶體使用量。
不過,機器學習模型通常會以圖層圖表表示。 作為逐層方法的替代方式,DirectML 可讓您將模型表示為節點(DirectML 運算符)的導向非循環圖,以及它們之間的邊緣(張量描述)。 建置圖形的描述之後,您可以一次編譯並提交至 DirectML 以進行初始化和執行。 在此方法中,DirectML 會決定周遊順序,並代表您處理每個個別運算符和它們之間的數據流。 這通常是表達機器學習模型更簡單且更自然的方式,並允許自動套用特定技術優化。 此外, DirectMLX 協助程式連結庫提供全新且方便的語法來建置 DirectML 運算符的複雜圖形。
無論您偏好哪種方法,您一律可以存取相同廣泛的 DirectML 運算子套件。 這表示您永遠不需要犧牲功能,無論是偏好逐層處理方法的精細控制,還是圖表方法的便利性。
本節內容
主題 | 說明 |
---|---|
快速入門指南 | 開始使用 DirectML。 |
開發人員工具 | 用來分析、優化及偵錯 DirectML 的工具。 |
程式設計指南 | 數據系結、屏障、投影片、融合、錯誤處理、裝置移除和協助程式函式的主題。 |
疑難排解 | 處理錯誤狀況和使用偵錯層。 |
DirectML 版本歷程記錄 | DirectML 是 Windows 10 的系統元件,也可作為獨立可轉散發套件使用。 |
DirectML 功能層級歷程記錄 | 每個功能層級中引進之類型的指令清單。 |
DirectML 範例應用程式 | DirectML 範例應用程式的連結,包括最少 DirectML 應用程式的範例。 |
GPU 加速 ML 訓練 | 涵蓋 GPU 加速機器學習 (ML) 訓練目前針對 Windows 子系統 Linux 版 (WSL) 和原生 Windows 所支援的內容。 |
DirectML API 參考 | 本節涵蓋 中DirectML.h 宣告的 Direct 機器學習 (DirectML) API。 |