Как можно контролировать количество потоков, которые Windows ML использует для оценки
Я пытаюсь сравнить Windows ML с другими бэкэндами и увидеть странное распределение времени вывода (см. График). Это с процессором, использующим архитектуру ARM64. На ARM нет бимодального распределения.
У меня нет хорошей интуиции, почему в распределении времен вывода есть два способа. Временной корреляции, похоже, нет, я запускаю сеть раз в секунду, и она переключается между "медленным" и "быстрым" режимами, по-видимому, случайно.
Одно из предположений, которое у меня есть, заключается в том, что, возможно, иногда Windows ML решает использовать два потока, а иногда и один, возможно, в зависимости от предполагаемой загрузки устройства. Однако, в отличие от TensorFlow Lite или Caffe2, я не нашел способа контролировать количество потоков, используемых Windows ML. Итак, вопрос в следующем:
Есть ли способ контролировать количество потоков, которые Windows ML использует для оценки в режиме ЦП, или в любом случае гарантированно использовать только один поток для вычислений?
Другие указатели на то, что может вызвать это странное поведение, также приветствуются.
1 ответ
См. Этот API машинного обучения Windows, который позволяет пользователям API устанавливать количество потоков внутри оператора: https://docs.microsoft.com/en-us/windows/ai/windows-ml/native-apis/intraopnumthreads
ПРИМЕЧАНИЕ. Установка этого значения выше, чем количество логических ядер в ЦП, может привести к неэффективному пулу потоков и более медленной оценке. Вот фрагмент кода о том, как использовать 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));
}