はじめに
このシリーズでは、PythonでCNNモデルを学習し、
推論部分を5つの異なる実装で比較してきた。
| 記事 | 内容 |
|---|---|
| 1本目 | Python (PyTorch) で学習・推論 |
| 2本目 | C++ (libtorch) で推論 |
| 3本目 | ONNX Runtime (Python) で推論 |
| 4本目 | ONNX Runtime (C++) で推論 |
| 5本目 | ONNX Runtime (C#) で推論 |
今回はその結果を改めて整理し、
「どのユースケースに何を使うべきか」をまとめる。
全結果まとめ
実行環境:Ryzen 5 7530U(CPUのみ)、ウォームアップあり、100回平均
| 実装 | 推論時間 | Pythonとの比較 | 環境構築 |
|---|---|---|---|
| Python (PyTorch) | 0.20 ms | 基準 | 簡単 |
| C++ (libtorch) | 0.23 ms | 1.15倍遅い | やや手間 |
| ONNX Runtime (Python) | 0.13 ms | 1.54倍速い | 簡単 |
| ONNX Runtime (C#) | 0.08 ms | 2.5倍速い | 簡単 |
| ONNX Runtime (C++) | 0.04 ms | 5倍速い | 手間 |
気づいたこと
C++にすれば速くなるとは限らない
2本目でC++ (libtorch) を試したとき、
「C++なら速くなるはず」という期待があった。
結果はPythonとほぼ同速(0.23ms vs 0.20ms)だった。
PyTorchの演算コアはすでにC++で実装されており、
PythonはほんのわずかなAPIラッパーに過ぎない。
つまりPythonのオーバーヘッドはほぼゼロだ。
推論特化のONNX Runtimeが強い
学習・推論の両方に対応したPyTorchと異なり、
ONNX Runtimeは推論に特化して設計されている。
グラフ最適化や不要な機能の排除により、
Python版でも0.13msとPyTorchを上回った。
C++とPythonの差が最も出るのはONNX Runtime
同じmodel.onnxを使っても、
PythonとC++で5倍の差(0.13ms vs 0.04ms)が出た。
Pythonのオーバーヘッドはわずかでも、
100回ループのような場面では積み重なって差になる。
C#は「速度」と「使いやすさ」のバランスが良い
C#はC++ほど速くないが(0.08ms vs 0.04ms)、
環境構築はNuGetの1行だけで完結する。
業務システムや.NETアプリへの組み込みなら
C#が最も現実的な選択肢だ。
ユースケース別おすすめ
学習・開発・実験をしたい
→ Python (PyTorch)
学習から推論まで一貫して書ける。デバッグも楽。
とにかく速い推論が必要
→ ONNX Runtime (C++)
5者中最速。ただし環境構築に手間がかかる。
Pythonが使えない環境に組み込みたい
→ ONNX Runtime (C++) または C++ (libtorch)
組み込み・産業用機器など。
.NETシステムに推論を組み込みたい
→ ONNX Runtime (C#)
NuGetで簡単セットアップ。速度も十分。
PyTorchを入れずに軽量デプロイしたい
→ ONNX Runtime (Python)
PyTorch不要。onnxruntimeとnumpyだけで動く。
まとめ
「何のために推論するか」によって最適な実装は変わる。
速度だけを追うならONNX Runtime (C++)、
開発効率を重視するならPython (PyTorch)、
業務システムへの組み込みならC#、
という選び方が現実的だと思う。
フレームワークやプログラミング言語は手段であって目的ではない。
ユースケースに合わせて選ぶのが正解だ。
おわりに
1本目のエッセイで書いた通り、
30年前にC言語でバックプロパゲーションをゴリゴリ書いていた頃と、
やっていることの本質は変わっていない。
変わったのは「しんどさ」と「速さ」だけだ。