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 概念。