3

我正在尝试针对其他后端对 Windows ML 进行基准测试,并看到一些奇怪的推理时间分布(参见情节)。这是使用 ARM64 架构的 CPU 后端。在 ARM 上没有双峰分布。 双峰推理时间统计

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

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

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

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

4

1 回答 1

3

请参阅此 Windows 机器学习 API,该 API 允许 API 的用户设置操作员内线程的数量:https ://docs.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));
}
于 2021-01-16T00:37:25.400 回答