Python APIで推論を実装する
— InferModel / VDevice とスケジューラ設計を整理する —
はじめに
前回は、HailoのTAPPASフレームワークの構造とGStreamerパイプラインの設計思想を整理しました。
TAPPASはGStreamerベースで推論を構成できる強力なフレームワークですが、すべてのアプリケーションが GStreamerベースで実装されるわけではありません。
実際の開発では、PythonやC++アプリケーションから直接推論を実行したいケースも多くあります。
そこで重要になるのが Hailo Runtime API(HailoRT) です。
本記事では以下を整理します。
- InferModel の役割
- VDevice の設計思想
- 推論スケジューラの考え方
TAPPASとは異なるアプローチとして、アプリケーションからHailoを制御する方法を理解します。
1. Hailo Runtime APIの位置づけ
Hailo Runtime(HailoRT)は、アプリケーションからNPUを直接制御するためのランタイムライブラリです。
主な役割は以下です。
- HEFモデルのロード
- デバイス管理
- 推論実行
- ストリーム管理
- スケジューリング
TAPPASがGStreamerエレメント中心の構造なのに対し、 HailoRTはアプリケーションAPI中心の設計になっています。

2. VDeviceとは何か
HailoRTの重要な概念が VDevice(Virtual Device) です。
VDeviceは複数のHailoデバイスを抽象化した仮想デバイスです。
主な役割:
- 複数NPUの統合管理
- 推論スケジューリング
- リソース管理
単一デバイスの場合でも、通常はVDeviceを経由して推論を実行します。
Python APIの基本例
from hailo_platform import VDevice
with VDevice() as vdevice:
print("VDevice initialized")
この構造により、将来的にデバイス数が増えてもアプリケーション側の設計を変更する必要がありません。
3. InferModelの役割
推論モデルの管理は InferModel が担当します。
HEFファイルを読み込み、推論実行の準備を行います。
基本的な流れ:
- VDevice生成
- HEFロード
- InferModel生成
- 推論実行
InferModel生成例
from hailo_platform import HEF, VDevice
hef = HEF("model.hef")
with VDevice() as target:
infer_model = target.create_infer_model(hef)
InferModelは以下を管理します。
- 入力ストリーム
- 出力テンソル
- バッチサイズ
- スケジューリング
4. 推論実行の基本構造
推論は次の流れで実行されます。
- 入力バッファ作成
- 推論実行
- 出力テンソル取得
推論実行例
infer_model.configure()
bindings = infer_model.create_bindings()
infer_model.run(bindings)
この構造はCPU/GPU向け推論フレームワークとも類似しています。
ただしHailoでは、推論実行の管理は NPU内部スケジューラ が担当します。
5. スケジューラ設計の考え方
Hailoの推論実行は内部スケジューラによって管理されます。
重要なポイント:
- 複数推論の並列管理
- デバイス利用率の最適化
- バッチ処理の調整
例えば複数カメラを扱う場合、 CPUでスレッド管理するよりもNPUスケジューラに任せた方が効率的なケースがあります。
つまり
CPU並列ではなく、NPUスケジューラを活用する
という設計思想です。
また、Python API(HailoRT)を利用することで、NPU側で推論を並列処理できるため、Python特有のGIL(Global Interpreter Lock)によるパフォーマンス低下を抑えた設計が可能になります。
6. TAPPASとの使い分け
ここで疑問になるのが TAPPASとPython APIの使い分けです。
| 用途 | 推奨 |
|---|---|
| カメラ映像処理 | TAPPAS |
| 映像パイプライン | GStreamer |
| アプリケーション制御 | Python API |
| 独自処理統合 | HailoRT |
つまり
映像処理 → TAPPAS
アプリケーション制御 → HailoRT
という分担になります。
まとめ
Hailo Python APIは、NPUをアプリケーションから直接制御するための仕組みです。
重要な要素:
- VDeviceによるデバイス抽象化
- InferModelによる推論管理
- NPUスケジューラによる実行最適化
TAPPASのパイプライン構造と組み合わせることで、 柔軟なエッジAIシステムを構築できます。
本記事のシリーズ
- 第1回:Hailo-8がUbuntuで認識しないときの切り分け
- 第2回:TAPPASの構造とGStreamerパイプライン
- 第3回:Python APIによる推論実装(本記事)
シリーズを通して読むことで、 セットアップ → 推論設計 → アプリケーション実装 まで体系的に理解できます。
本記事の内容を検証するには
開発用途や設置環境に応じた構成相談も可能です。 お気軽にお問い合わせください。