我正在尝试将 Windows ML 与其他后端进行基准测试,发现推理时间分布有些奇怪(见图表)。这是使用 ARM64 架构的 CPU 后端。在 ARM 上没有双峰分布。
对于为什么在推理时间的分布中存在两种模式,我没有很好的直觉。似乎没有时间相关性,我每秒运行一次网络,它似乎随机地在“慢”和“快”模式之间切换。
我的一个猜测是,也许有时 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/