ONNX Runtime(ORT)を使っていると、ORT_SEQUENTIALORT_PARALLEL という設定を見かけることがあります。

これらは Execution Mode(実行モード) を指定する重要な設定で、推論速度やCPU使用率に影響します。

この記事では、

  • ORT_SEQUENTIAL
  • ORT_PARALLEL

の違いを、PythonとC#のコード例付きでわかりやすく解説します。


ORT_SEQUENTIALとは

ORT_SEQUENTIAL逐次実行モード です。

モデル内の処理(ノード)を、順番に1つずつ実行します。


特徴

  • 順番に処理を実行
  • シングルスレッドに近い動作
  • オーバーヘッドが少ない
  • 動作が安定しやすい

向いているケース

  • 小規模モデル
  • デバッグ用途
  • CPUコア数が少ない環境
  • 安定動作を重視したい場合

ORT_PARALLELとは

ORT_PARALLEL並列実行モード です。

依存関係のないノードを同時に実行し、CPUのマルチスレッドを活用します。


特徴

  • 複数ノードを同時実行
  • CPUマルチコアを活用
  • 推論速度向上が期待できる
  • 大規模モデルで効果が高い

向いているケース

  • 大規模モデル
  • 高速推論が必要な環境
  • CPUコア数が多いマシン
  • サーバー用途

違いを比較

項目 ORT_SEQUENTIAL ORT_PARALLEL
実行方式 逐次 並列
スレッド利用 少ない 多い
CPU使用率 低め 高め
推論速度 安定 高速化可能
小規模モデル 向いている 効果が小さい
大規模モデル やや不利 効果大

注意点

ORT_PARALLEL は常に速いわけではありません。

理由は以下です。

  • モデル構造によっては並列化しづらい
  • スレッド管理コストが発生する
  • キャッシュ効率が悪化する場合がある
  • 小さいモデルでは逆に遅くなることもある

そのため、

👉 実際には両方試してベンチマークを取るのがベストです。


Pythonでの設定方法

ORT_PARALLEL

import onnxruntime as ort

so = ort.SessionOptions()

# 並列実行モード
so.execution_mode = ort.ExecutionMode.ORT_PARALLEL

session = ort.InferenceSession("model.onnx", so)

ORT_SEQUENTIAL

import onnxruntime as ort

so = ort.SessionOptions()

# 逐次実行モード
so.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL

session = ort.InferenceSession("model.onnx", so)

C#での設定方法

ORT_PARALLEL

using Microsoft.ML.OnnxRuntime;

var sessionOptions = new SessionOptions();

// 並列実行モード
sessionOptions.ExecutionMode = ExecutionMode.ORT_PARALLEL;

using var session =
    new InferenceSession("model.onnx", sessionOptions);

ORT_SEQUENTIAL

using Microsoft.ML.OnnxRuntime;

var sessionOptions = new SessionOptions();

// 逐次実行モード
sessionOptions.ExecutionMode = ExecutionMode.ORT_SEQUENTIAL;

using var session =
    new InferenceSession("model.onnx", sessionOptions);

スレッド数を調整する方法(C#)

ORT_PARALLEL を使う場合は、スレッド数設定も重要です。

using Microsoft.ML.OnnxRuntime;

var sessionOptions = new SessionOptions();

// 並列実行
sessionOptions.ExecutionMode = ExecutionMode.ORT_PARALLEL;

// 演算内並列
sessionOptions.IntraOpNumThreads = 4;

// ノード間並列
sessionOptions.InterOpNumThreads = 2;

using var session =
    new InferenceSession("model.onnx", sessionOptions);

パラメータの意味

パラメータ 内容
IntraOpNumThreads 1つの演算内部で使うスレッド数
InterOpNumThreads ノード間並列で使うスレッド数

どちらを選ぶべき?

ORT_SEQUENTIALがおすすめ

  • 小規模モデル
  • 軽量推論
  • デバッグ用途
  • シンプル構成

ORT_PARALLELがおすすめ

  • 大規模モデル
  • CPU推論高速化
  • マルチコア環境
  • サーバー運用

まとめ

ORT_SEQUENTIALORT_PARALLEL の違いは、主に「逐次実行」か「並列実行」かです。

  • ORT_SEQUENTIAL
    • シンプル
    • 安定
    • 小規模向け
  • ORT_PARALLEL
    • 高速化可能
    • マルチスレッド活用
    • 大規模向け

最適な設定はモデルやCPU環境によって変わるため、

👉 実際にベンチマークして比較するのがおすすめです。