Important
Windows ML 运行时 API 目前是试验性的,不支持在生产环境中使用。 尝试此 API 的应用不应发布到Microsoft Store。
Important
Windows ML 运行时 API 目前可用于 C++ 和 Python;目前不支持 C#。通过在 Windows ML GitHub 存储库中发布问题,告知你是否有兴趣从 C# 使用这些 API!
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),请使用运行时 API。 它提供对硬件选择(包括特定的 DXCore 适配器或 D3D12 设备)、张量驻留、多阶段管道放置和编译的显式控制。
否则,如果你的应用需要在其他平台上运行,或者已经具有跨平台 ONNX 运行时会话代码,请改用 Windows ML 中包含的 ONNX 运行时 API。
核心对象模型
| 概念 | 主 API | Description |
|---|---|---|
| Runtime | IWinMLRuntime |
由 WinMLCreateRuntime 返回的接口;加载模型文件、创建执行目标以及创建管道生成器。 |
| Model | IWinMLModel |
从文件或缓冲区加载的不可变、不透明的模型项目。 通过 IWinMLModelSchema 反映其声明的架构。 |
| 执行目标 | IWinMLExecutionTarget |
用于生成阶段和创建张量的 CPU、GPU 或 NPU 放置令牌。 |
| 管道生成器 | IWinMLPipelineBuilder |
添加模型和处理器阶段,连接它们,并生成准备好的管道。 |
| 管道 | IWinMLPipeline |
已准备好、可立即运行的图,执行绑定张量并生成输出张量。 |
| 阶段 | IWinMLStage |
管道中拥有位置输入和输出绑定及其解析的执行目标的步骤。 |
| 张量 | IWinMLTensor |
绑定到阶段输入和输出的类型化多维数据。 |
| 文本生成/语音识别 | Windows ML 文本生成和语音识别 API | 构建于调用方拥有的 Runtime 对象之上的更高级别工作流,包含类型化会话、流和结果。 |
选择后端和执行目标
LoadModelFromFile 从模型工件的文件扩展名中选择后端。
无论哪个后端加载该文件,应用都使用相同的运行时对象(模型、执行目标、管道生成器、阶段、绑定和 Run )。
| 模型文件 | Backend | 硬件加速 |
|---|---|---|
.onnx、.ort |
ONNX Runtime | Windows安装并通过 Windows ML EP 目录保持最新状态的执行提供程序(EP) |
.gguf |
llama.cpp | 应用本地 CPU 模块,以及与应用一起部署的用于 NVIDIA GPU 的可选 CUDA 模块。 CPU 和 CUDA 是 Windows ML 在此版本中仅验证的 llama.cpp 后端。 |
执行目标表示使用 IWinMLRuntime 创建的硬件类(CPU、GPU 或 NPU)。 重复使用目标以构建阶段并创建张量:重复使用一个目标表示同一目标相关性,而使用不同的目标使跨目标传输边界变得明确。 当管道构建器的 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 设备,而不是让运行时选取一个。 对于依赖于已安装执行提供程序(EP)的 ONNX 模型,可选的 ONNX Runtime 兼容接口允许将您已注册的提供程序固定下来。
每个后端以不同的方式解析这些目标,例如,.gguf 模型使用的 llama.cpp 后端至少进行部分 GPU 卸载,才能满足 GPU 目标,并且不支持 NPU 目标或提供程序固定。 有关每个后端的完整目标解析矩阵以及运行 GGUF 模型的演练,请参阅Windows ML 运行时 API 概念。