Windows ML 執行時 API 概述

Important

Windows ML 執行時 API 目前仍處於實驗階段,尚未支援用於生產環境。 嘗試此 API 的應用程式不應被發佈到 Microsoft Store。

Important

Windows ML 執行時 API 目前提供 C++ 與 Python 版本;C# 目前不支援。如果你有興趣使用 C# 中的這些 API,歡迎在 Windows ML GitHub 倉庫發表問題告訴我們!

Windows ML 執行時 API 是專為 Windows 打造的原生 C/C++ 本地 AI 推論框架。 透過 Windows ML 執行 API,你可以載入模型、選擇 CPU、GPU 或 NPU 執行目標(包括特定的 DXCore 介面卡或 D3D12 裝置),將張量綁定到該目標,將模型與處理器階段組合成管線,編譯管線,並執行以產生輸出張量。

可選的文字生成與語音辨識 API 將這些執行時物件組合成更高層次的工作流程,依照你的應用程式提供的模型:參見用 Windows ML 用自己的語言模型產生文字,以及用 Windows ML 用自己的 Whisper 模型辨識語音。

Runtime API 與 ONNX Runtime

如果你的應用程式只針對 Windows(且願意使用目前實驗中的 API),就使用 Runtime API。 它明確控制硬體選擇(包括特定的 DXCore 介面卡或 D3D12 裝置)、張量駐留、多階段管線放置及編譯。

否則,如果你的應用程式需要在其他平台上運行,或已有跨平台可用的 ONNX 執行時會話程式碼,請改用 Windows ML 內建的 ONNX 執行時 API。

核心物件模型

概念 主 API Description
Runtime IWinMLRuntime 由 WinMLCreateRuntime 傳回的介面;載入模型檔案、建立執行目標及建立管線建置器。
模型 IWinMLModel 不可變、不透明的模型產物,從檔案或緩衝區載入。 透過 IWinMLModelSchema 反映其宣告的結構描述。
執行目標 IWinMLExecutionTarget CPU、GPU 或 NPU 放置標記,用於建立階段和產生張量。
管線建立工具 IWinMLPipelineBuilder 新增模型與處理器階段,連接它們,並建立預先準備好的管線。
管線 IWinMLPipeline 已準備好且可立即執行的圖,執行繫結張量並產生輸出張量。
Stage IWinMLStage 這是管線中的一個步驟,負責位置輸入與輸出綁定及其已解析的執行目標。
張量 IWinMLTensor 綁定到階段輸入與輸出的具型別的多維資料。
文字生成/語音辨識 Windows ML 文字生成與語音辨識 API 高階工作流程由呼叫者擁有的執行時物件組成,包含類型化的工作階段、串流與結果。

選擇後端與執行目標

LoadModelFromFile 從模型產物的檔案副檔名中選擇後端。 你的應用程式使用相同的執行時物件——模型、執行目標、管線建構器、階段、綁定,以及 Run ——無論哪個後端載入檔案。

模型檔案 Backend 硬體加速
.onnx、.ort ONNX 執行環境 Windows 安裝並透過 Windows ML EP 目錄保持更新的執行提供者(EP)
.gguf llama.cpp 一個應用程式本地的 CPU 模組,以及一個可選的 CUDA 模組,可與應用程式一同部署、用於 NVIDIA GPU。 CPU 和 CUDA 是此版本中 Windows ML 驗證的唯一 llama.cpp 後端。

執行目標代表一種硬體類別——CPU、GPU 或 NPU——使用 IWinMLRuntime 建立。 重複使用目標以構建階段並產生張量:重複使用一個目標表示同目標關聯性,而使用不同目標則明確表示跨目標轉移邊界。 當管線建構 Build 方法執行時,執行階段會將每個階段放置於其目標的執行後端,並確認目標與後端的相容性。

對於某個硬體類別,若不自行列舉裝置,可以使用 WINML_EXECUTION_TARGET_KIND 和 WINML_EXECUTION_TARGET_PREFERENCE 呼叫 CreateExecutionTarget,以排序該類別的候選項目,例如整合式 GPU 與獨立 GPU。 將 ERROR_NOT_FOUND 和 ERROR_NOT_SUPPORTED 視為相同,並回退為另一個類別:

ComPtr<IWinMLExecutionTarget> target;
HRESULT hr = runtime->CreateExecutionTarget(
    WINML_EXECUTION_TARGET_KIND_NPU,
    WINML_EXECUTION_TARGET_PREFERENCE_EFFICIENCY,
    target.GetAddressOf());
if (hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND) ||
    hr == HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
{
    THROW_IF_FAILED(runtime->CreateExecutionTarget(
        WINML_EXECUTION_TARGET_KIND_GPU,
        WINML_EXECUTION_TARGET_PREFERENCE_PERFORMANCE,
        target.GetAddressOf()));
}
else
{
    THROW_IF_FAILED(hr);
}

CreateCpuExecutionTarget 等同於請求 CPU 類型。 CreateExecutionTargetFromAdapter 和 CreateExecutionTargetFromD3D12 會將目標繫結至特定的 DXCore 介面卡或 D3D12 裝置,而非讓執行階段自行選擇。 對於依賴已安裝 Execution Provider(EP) 的 ONNX 模型,可選的 ONNX Runtime 相容層可讓你釘選已註冊的提供者。 每個後端對這些目標的解析方式不同——例如,模型 .gguf 所用的llama.cpp後端至少需要部分 GPU 卸載才能尊重 GPU 目標,且不支援 NPU 目標或提供者釘選。 關於後端的完整目標解析度矩陣,以及如何執行 GGUF 模型的導覽,請參見 Windows ML 執行時 API 概念。

下一步