3

Windows ML を他のバックエンドと比較してベンチマークし、推論時間の奇妙な分布を確認しようとしています (プロットを参照)。これは、ARM64 アーキテクチャを使用する CPU バックエンドです。ARM では、バイモーダル ディストリビューションはありません。 バイモーダル推論時間統計

推論時間の分布に 2 つのモードがある理由については、よくわかりません。一時的な相関関係はないようです。ネットワークを 1 秒に 1 回実行すると、一見ランダムに「低速」モードと「高速」モードが切り替わります。

私が持っている推測の 1 つは、Windows ML が 2 つのスレッドを使用することもあれば、推定されるデバイスの負荷に応じて 1 つのスレッドを使用することもあるということです。ただし、TensorFlow Lite や Caffe2 とは異なり、Windows ML が使用するスレッド数を制御する方法が見つかりませんでした。質問は次のとおりです。

Windows ML が CPU モードでの評価に使用しているスレッドの数を制御する方法はありますか?それとも、どのような場合でも計算に 1 つのスレッドのみを使用することが保証されていますか?

この奇妙な動作を引き起こす可能性のある他のポインタも歓迎します.

4

1 に答える 1

3

API のユーザーがオペレーター内スレッドの数を設定できるようにする Windows Machine Learning 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 に答える