uwp - 如何控制 Windows ML 用于评估的线程数

标签 uwp c++-winrt windows-machine-learning

我正在尝试将 Windows ML 与其他后端进行基准测试,发现推理时间分布有些奇怪(见图表)。这是使用 ARM64 架构的 CPU 后端。在 ARM 上没有双峰分布。 Bimodal inference time statistics

对于为什么在推理时间的分布中存在两种模式,我没有很好的直觉。似乎没有时间相关性,我每秒运行一次网络,它似乎随机地在“慢”和“快”模式之间切换。

我的一个猜测是,也许有时 Windows ML 决定使用两个线程,有时一个,这可能取决于估计的设备负载。但是,与 TensorFlow Lite 或 Caffe2 不同,我还没有找到一种方法来控制 Windows ML 使用的线程数。所以问题是:

有没有办法控制 Windows ML 在 CPU 模式下用于评估的线程数,或者是否保证在任何情况下都只使用一个线程进行计算?

也欢迎其他指出可能导致这种奇怪行为的原因。

最佳答案

请参阅此 Windows 机器学习 API,该 API 允许 API 的用户设置运算符(operator)内线程的数量:https://learn.microsoft.com/en-us/windows/ai/windows-ml/native-apis/intraopnumthreads

注意:将此值设置为高于 CPU 上的逻辑核心数可能会导致线程池效率低下和评估速度变慢。 以下是有关如何使用 API 的代码片段:

void SetIntraOpNumThreads(LearningModel model) {
    // Create LearningModelSessionOptions
    auto options = LearningModelSessionOptions();
    auto nativeOptions = options.as<ILearningModelSessionOptionsNative>();
 
    // Set the number of intra op threads to half of logical cores.
    uint32_t desiredThreads = std::thread::hardware_concurrency() / 2;
    nativeOptions->SetIntraOpNumThreadsOverride(desiredThreads);
 
    // Create session
    LearningModelSession session = nullptr;
    WINML_EXPECT_NO_THROW(session = LearningModelSession(model, LearningModelDeviceKind::Cpu, options));
}

关于uwp - 如何控制 Windows ML 用于评估的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57255479/

相关文章:

C# Windows 通用 10 TopMost 窗口

c# - 如何在 ListView 项目的 Windows 10 UWP 中添加上下文菜单?

c# - UWP 获取文件的 shell 图标

Windows机器学习API : MCVE command line example without VS

windows-runtime - Windows 10 C++ 中 onnx 模型 (opset11) 的推理?

azure - 部署后的 UWP 应用程序无法工作(发送请求时发生错误)

c# - Windows.AI.MachineLearning.Preview - 从流中加载模型引发异常

uwp - 在 C++/WinRT 项目中使用 CoreDispatcher::RunAsync 时,在定义之前无法使用获取 "a function that returns ' auto'

c++ - 升级到 Windows 10 版本 1809 SDK 后,我无法编译使用 C++/WinRT 的项目