WinMLRunner

WinMLRunner 是一种工具,用于在使用 Windows ML API 评估模型时测试该模型是否成功运行。 还可以捕获 GPU 和/或 CPU 上的评估时间和内存使用量。 可以评估 .onnx 或 .pb 格式的模型,其中输入变量和输出变量为张量或图像。 可以通过两种方法使用 WinMLRunner:

运行模型

首先,打开下载的 Python 工具。 导航到包含 WinMLRunner.exe 的文件夹,然后运行该可执行文件,如下所示。 确保将安装位置替换为所需位置:

.\WinMLRunner.exe -model SqueezeNet.onnx

还可以使用如下命令运行模型文件夹。

WinMLRunner.exe -folder c:\data -perf -iterations 3 -CPU`\

运行一个性能极佳的模型

下面是成功运行模型的示例。 请注意该模型首先如何加载和输出模型元数据。 然后该模型分别在 CPU 和 GPU 上运行,输出绑定成功、评估成功和模型输出。

Sample trace log output for running a good model

运行一个性能不好的模型

下面是运行带有错误参数的模型的示例。 请注意在 GPU 上评估时失败的输出。

Sample trace log output for running a bad model

设备选择和优化

默认情况下,模型分别在 CPU 和 GPU 上运行,但你可以使用 -CPU 或 -GPU 标记指定设备。 以下是仅使用 CPU 运行模型 3 次的示例:

WinMLRunner.exe -model c:\data\concat.onnx -iterations 3 -CPU

日志性能数据

使用 -perf 标记捕获性能数据。 下面是在 CPU 和 GPU 上分别运行数据文件夹中的所有模型 3 次并捕获性能数据的示例:

WinMLRunner.exe -folder c:\data iterations 3 -perf

性能度量值

每个加载、绑定和评估操作都会输出以下性能度值到命令行和 .csv 文件:

  • 时钟时间 (ms):操作开始和结束之间经过的实际时间。
  • GPU 时间 (ms):操作从 CPU 传递到 GPU 并在 GPU 上执行的时间(备注:Load() 不在 GPU 上执行)。
  • CPU 时间 (ms):操作在 CPU 上执行的时间。
  • 专用和共享内存使用量 (MB):在 CPU 或 GPU 上进行评估期间的平均内核和用户级内存使用量(以 MB 为单位)。
  • 工作集内存 (MB):评估期间 CPU 上的进程所需的 DRAM 内存量。 专用内存 (MB) - 专用 GPU 在 VRAM 上使用的内存量。
  • 共享内存 (MB):GPU 在 DRAM 上使用的内存量。

性能输出示例:

Sample performance output

测试输入示例

分别在 CPU 和 GPU 上运行模型,并分别将输入绑定到 CPU 和 GPU(总共运行 4 次):

WinMLRunner.exe -model c:\data\SqueezeNet.onnx -CPU -GPU -CPUBoundInput -GPUBoundInput

在 CPU 上运行模型,将输入绑定到 GPU 并作为 RGB 图像加载:

WinMLRunner.exe -model c:\data\SqueezeNet.onnx -CPU -GPUBoundInput -RGB

捕获跟踪日志

如果要使用工具捕获跟踪日志,可以将 logman 命令与调试标记结合使用:

logman start winml -ets -o winmllog.etl -nb 128 640 -bs 128logman update trace  winml -p {BCAD6AEE-C08D-4F66-828C-4C43461A033D} 0xffffffffffffffff 0xff -ets         WinMLRunner.exe -model C:\Repos\Windows-Machine-Learning\SharedContent\models\SqueezeNet.onnx -debuglogman stop winml -ets

winmllog.etl 文件将出现在与 WinMLRunner.exe 相同的目录中。

读取跟踪日志

使用 traceprt.exe,从命令行运行以下命令。

tracerpt.exe winmllog.etl -o logdump.csv -of CSV

接下来,打开 logdump.csv 文件。

也可使用 Windows Performance Analyzer(来自 Visual Studio)。 启动 Windows Performance Analyzer,然后打开 winmllog.etl

Sample the trace log output using Windows Performance Analyzer

请注意,-CPU、-GPU、-GPUHighPerformance、-GPUMinPower -BGR、-RGB、-tensor、-CPUBoundInput、-GPUBoundInput 并不会相互冲突(也就是说,可以任意搭配使用来运行具有不同配置的模型)。

动态 DLL 加载

如果要将 WinMLRunner 与另一个版本的 WinML 一起运行(例如与旧版本比较性能或测试新版本),只需将 windows.ai.machinelearning.dll 和 directml.dll 文件与 WinMLRunner.exe 放在同一文件夹中。 WinMLRunner 将首先查找这些 DLL,如果找不到它们,则回退到 C:/Windows/System32。

已知问题

  • 尚不支持序列/映射输入(只是跳过模型,它不会阻止文件夹中的其他模型);
  • 我们无法可靠地使用 -folder 参数运行多个包含真实数据的模型。 由于只能指定 1 个输入,因此输入的大小与大多数模型都不匹配。 目前,-folder 参数仅适用于垃圾数据;
  • 当前不支持将垃圾输入生成为 Gray 或 YUV。 理想情况下,WinMLRunner 的垃圾数据管道应该支持可提供给 winml 的所有输入类型。