情報詳細Q: HALCON ディープラーニング機能で複数のモデルを取り扱うときの注意点や、並列実行、バッチサイズを使って高速化する手法について教えてください。 A: いくつかのユースケースを想定して下記に示します。 1. DLモデル1つに対し、1枚の画像のみを投入する場合 最もシンプルかつ基本的な使い方であり、特筆して注意すべき点はありません。GPUで推論させる場合、GPUが動作している間はCPUは待ちとなるため、間に他の処理をしておくことでサイクルタイムを短縮できる場合があります。また、このユースケースでは実行する前にモデルのバッチサイズは1へ設定してください。投入する画像数より大きなバッチサイズを設定しているとたいてい推論速度が低下します。 set_dl_model_param (DLModelHandle, 'batch_size', 1) 2. 複数のDLモデルハンドルを1つのGPUにセットする場合 GPUのVRAMを超過しない限り、複数のモデルハンドルをGPUへセットすることは問題ありません。VRAMの使用量はモデルに対して画像を与えて1回実行することで確定します。使用量はnvidia-smiコマンドまたはタスクマネージャーの専用GPUメモリから確認できます。これを超過して共有GPUメモリへ溢れている場合、エラーは発生しませんが推論速度が大幅に低下します。一方で、1つのGPUに複数のモデルをセットし複数のスレッドないしはプロセスからモデルを動作させても並列動作による高速化は期待できません。これは、GPUの制御に使用するCUDAがGPUに対する命令をタスク キューへ並べ順番に実行することが理由です。複数のモデルを用意して並列実行したい場合、並列実行の数だけGPUを物理的に用意しなければなりません。 3. 複数のDLモデルハンドルをCPUで実行する場合 HALCONはデフォルト設定で全てのコアを使用して推論を行うため、既に並列化されています。したがって、複数スレッドや複数プロセスからDLモデルを呼んでも基本的に高速化は期待できません。 4. DLモデル1つに対し複数の画像を投入する場合 1枚の画像に4つのワークが映っており、1つ1つに切り抜いた画像をDLモデルに投入する場合や、同種のワークを2台のカメラで同時に撮像して1つのDLモデルに投入するような場合が想定されます。この場合はGPUでバッチサイズを使用して推論することで、高速化する場合があります。コードのイメージは次のようになります。 *-----モデル設定 set_dl_model_param (DLModelHandle, 'batch_size', 4) set_dl_model_param (DLModelHandle, 'device', GPUDeviceHandle) set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately') *-----推論フェーズ crop_rectangle1 (Image, ImagePart, [10, 10, 210, 210], [10, 210, 10, 210], [190, 190, 390, 390], [190, 390, 190, 390]) preprocess_dl_model_images (ImagePart, ImagesPreprocessed, DLPreprocessParam) gen_dl_samples_from_images (ImagesPreprocessed, DLSampleBatch) apply_dl_model (DLModelHandle, DLSampleBatch, [], DLResultBatch) apply_dl_model は配列入力を許容し、与えられたモデルのバッチサイズおよびデバイス、入力配列数に応じて自動で内部の繰り返し回数を制御します。たとえばバッチサイズ4のモデルに対し画像配列数が4の場合、4枚を同時に推論させます。このとき、バッチ1で4回推論させることよりもバッチ4で1回推論のほうが効率的なモデルの場合、1枚当たりの実行速度が高速化します。一方で、バッチサイズが大きいと単純に1回の推論時間は長くなるため、2枚までしか同時推論させないにも関わらずバッチサイズが16などに設定されているとかえって速度が低下します。また、バッチサイズを大きくするとVRAM使用量も増加するため、共有GPUメモリへ溢れていないかのチェックも必要です。バッチサイズ指定時は「VRAMから溢れない値」と「最大で投入する画像数」のうち小さいほうを使用します。その他、一部のモデルではバッチサイズの恩恵が無い (=バッチ1で4回とバッチ4で1回の速度差が無い) 場合や、CPUではそもそもバッチサイズの意味がないなど常にバッチサイズが有利に働くわけではありません。いずれにしても、モデルと実際に投入する画像を用意して計測することが最も確実です。また、バッチサイズはoptimize_dl_model_for_inferenceによる最適化後は変更不可のパラメータとなります。最適化前にバッチサイズは変更してください。 添付ファイルタイトルHALCONディープラーニング機能の並列化・高速化についてURL 名000011696公開状況公開済み検証状況未検証