Как можно контролировать количество потоков, которые 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));
}
Другие вопросы по тегам