はじめに
エッジデバイス向けのAI ProcessorであるHailo社の製品を使用するためには、Hailo製品に最適化されたバイナリーファイルを作成する必要があります。この記事ではその手順を紹介し、Pythonスクリプトを公開してています。
実際にそのPythonスクリプトを実行し、ディープラーニング開発フレームワークで学習したAIモデル(ONNXファイル)をHailoに変換し、ハイパフォーマンスを確認します。
使用ツール
Hailo社がDockerで提供している「Hailo AI Software Suite(2024-01)」を使用しています。
Hailo AI Software SuiteはHailo社の主要開発ツールが一つのパッケージに収まっており、インストールするだけで開発環境が構築できる便利なものとなっています。
Hailo社WebのDeveloper Zoneへ登録することで無償でダウンロード可能です。
Hailo社のツール関係は以下のようになっています。
左側のModel Build EnvironmentでONNXファイルからHEFファイル(Hailo Executable binary File)を作成し、HEFファイルを推論マシン(Runtime Environment)にコピーし、HailoRTのAPIを使って推論実行するフローとなります。今回公開のスクリプトは、まさにModel Build EnvironmentでONNXファイルからHEFファイルを作成するものです。
ONNXファイルからHEFファイル生成フロー
Hailo AI Software SuiteのDocker内に入っていただき、適当なフォルダーを作成します。そこに以下のファイルを保存します。
・対象のONNXファイル(ここではyolox_s_leaky.onnx)
・Pythonスクリプト(後述のソースコードをdfc_script.pyとして保存)
次にコマンドでPython実行するだけです。
$ python ./dfc_script.py
以下がスクリプトファイルの中身となります。ONNXモデルに合わせて「#Define model information」の部分を修正すれば他のモデルでも利用可能です。
※あくまでリファレンスとなっており、動作の保証はしていません
import numpy as np
import os
from hailo_sdk_client import ClientRunner
#Define model information
model_name = 'yolox_s_leaky'
onnx_path = 'yolox_s_leaky.onnx'
start_node = 'images'
end_node = ['Conv_197','Sigmoid_199','Sigmoid_200','Conv_213','Sigmoid_215','Sigmoid_216','Conv_229','Sigmoid_231','Sigmoid_232']
input_shape = {'images': [1, 3, 640, 640]}
chosen_hw_arch = 'hailo8'
input_height = 640
input_width = 640
input_ch = 3
alls_lines = [
'model_optimization_flavor(optimization_level=0, compression_level=1)
',
'resources_param(max_control_utilization=1.0, max_compute_utilization=1.0,max_memory_utilization=1.0)
',
'performance_param(fps=250)
'
]
#Parsing
runner = ClientRunner(hw_arch=chosen_hw_arch)
hn, npz = runner.translate_onnx_model(onnx_path, model_name, start_node_names=[start_node], end_node_names=end_node, net_input_shapes=input_shape)
parsed_model_har_path = f'{model_name}_parsed_model.har'
runner.save_har(parsed_model_har_path)
#Optimize
calibData = np.random.randint(0, 255, (1024, input_height, input_width, input_ch))
runner.load_model_script(''.join(alls_lines))
runner.optimize(calibData)
quantized_model_har_path = f'{model_name}_quantized_model.har'
runner.save_har(quantized_model_har_path)
#Compile
hef = runner.compile()
file_name = f'{model_name}.hef'
with open(file_name, 'wb') as f:
f.write(hef)
compiled_model_har_path = f'{model_name}_compiled_model.har'
runner.save_har(compiled_model_har_path)
※alls_linesへの入力表記がおかしくなっていますが、以下のように記載しています。
alls_lines = [
'model_optimization_flavor(optimization_level=0, compression_level=1)\n',
'resources_param(max_control_utilization=1.0, max_compute_utilization=1.0,max_memory_utilization=1.0)\n',
'performance_param(fps=250)\n'
]
※ソースコードは以下ボタンよりダウンロードしてご使用ください
スクリプトファイル解説
#Define model information
こちらにHailoで処理させるAIモデルの情報を入れてください。
model_name:任意の名前です
onnx_path:onnxファイルのpathを指定します
今回はhailo model zooで公開されているyolox_s_leaky.onnxを使用しています(リンク)
start_node, end_node:Hailoで処理させる部分の最初と最後のノードを指定します
今回は以下の部分を指定しています。end_nodeは複数のノードを指定しています
input_shape:入力ノードのshapeです
chosen_hw_arch:ターゲットのHailoデバイスです(hailo8, hailo8l, hailo15h, など)
input_height, input_width, input_ch:キャリブレーションデータの入力解像度とch数です
alls_lines:コンパイル時の各種設定になります(詳細はDataflow Compilerのマニュアルを参照ください)
#Parsing
onnxファイルからHailoオリジナルのフォーマットへと変換します。
#Optimize
量子化含めた最適化を実施します。
通常はトレーニングで使用した画像ファイルをキャリブレーションデータとして入力しますが、今回はランダムデータを用いています。
そのため、本スクリプトを用いたものは精度の検証ができませんのでお気を付けください。
(あくまでコンパイルの可否、パフォーマンスの確認のためのものになります)
#Compile
これまでの工程で出力されたデータを使ってコンパイルを実施します。この過程で最終的なバイナリーファイルであるHEFファイルができあがります。
結果と検証
Pythonスクリプトを実行した後はHEFファイルとともにHARファイル(Hailo ARchive file)もいくつかできあがります。各工程(Parsing, Optimize, Compile)の状態を保存しているのでいつでも前の工程に戻ることができます。
このアーカイブファイルを使って以下のコマンドで結果のレポートファイルを見ることも可能です。
$ hailo profiler yolox_s_leaky_compiled_model.har
レポートファイルとしてhtmlファイルができあがり、以下のようにコンパイル結果を確認することができます。
上記のようにこのモデルであれば250fpsのパフォーマンスが期待できることが分かります。
コンパイル後のグラフの形状やボトルネックレイヤーなどさまざまな情報をこのレポートファイルから得られますので、ご確認いただければと思います。
最後にこのhefファイルが実際のハードウェア上でどのぐらいのパフォーマンスとなるのかを確認しましょう。
以下のコマンドでそのハードウェア上で実際に入出力をおこない、パフォーマンスを計測することができます。
(もちろんHailoデバイスが実装されていない場合はできません)
$ hailortcli benchmark yolox_s_leaky.hef
今回の場合は以下の結果となりました。
上記赤枠の部分にSummaryが載っていますが、実際のハードウェアでも250fpsが実現できているのが確認できます。
まとめ
未知のデバイスを使用するのはハードルが高いかもしれませんが、Hailoであれば今回紹介しましたようにバイナリーファイルを作成するところまではさほど大変ではありません。ぜひこのスクリプトをご活用いただきHailoの高いパフォーマンスを実感いただければ幸いです。
お問い合わせ
本記事に関してご質問がありましたら、以下よりお問い合わせください。
Hailo メーカー情報Topへ
Hailo メーカー情報Topに戻りたい方は以下をクリックしてください。