※本記事はHailo社 AI Software Suite 2024-04をもとにして記載しています
はじめに
Dataflow CompilerとはAI Software Suiteの一部でonnxファイルなど学習済みのネットワークモデルをHailoデバイスへ最適化するためのツールです。
AI Software Suiteのインストール方法等は以下のリンクを参照ください。
①AI Software Suiteに必要なハードウェアとインストール

大きく分けてParser、Optimizer、Allocator/Compilerの3つのステージがあり、チュートリアルとしてそれぞれにJupyter-notebookが用意されていますので、本記事ではそのチュートリアルを解説いたします。
実際の設計においてもこのチュートリアルをカスタマイズいただくことでももちろん構いませんが、これらの内容をPythonスクリプトとしてまとめた方が便利かと思います。そのPythonスクリプトの公開とともに使い方を解説した記事もありますので、合わせてご確認ください。
【試してみた】オープンソースのONNXモデルをHailoで動かしてみた
チュートリアルの起動方法はAI Software Suite内で以下のコマンドを実行します。
$ hailo tutorial
ブラウザー上でJupyter notebookが立上がります。

次項より、Parser、Optimizer、Allocator/Compilerを解説していきます。
それぞれ以下のnotebookに対応しています。
Parser --- DFC_1_Parsing_Tutorial.ipynb
Optimizer --- DFC_2_Model_Optimization_Tutorial.ipynb
Allocator/Compiler --- DFC_3_Compilation_Tutorial.ipynb
Parser
DFC_1_Parsing_Tutorial.ipynbをクリックいただくと、Parser用のnotebookが開きます。
notebook内にも説明はありますが、それぞれのセルに対しての解説をします。
notebook解説
Dataflow Compiler用のライブラリーの呼び出しです。
変換するモデルの情報を記載しています。
model_name:任意の名前です
ckpt_path:AIモデル(今回はckptファイル)のパスです
start_node:Hailoへオフロードする個所の先頭を指定します
end_node:Hailoへオフロードする個所の最後を指定します
start_nodeからend_nodeまでを最適化することになります
chosen_hw_arch:ターゲットのHWを指定します
実際にParsingしているセルとなります。
ckptファイルをHailoのオリジナルフォーマットへ変換します。
このセルの実行は必須ではありませんが、このセルにてHARファイル (Hailo ARchive file) を作成します。
ここまでの状態が保存されたアーカイブファイルを作ることで、以降の作業をおこなうときに再度Parsingをしなくてもアーカイブファイルから実行することができます。
このチュートリアルでの保存先は以下のフォルダーとなります。
/local/workspace/hailo_virtualenv/lib/python3.8/site-packages/hailo_tutorials/notebooks/resnet_v1_18_hailo_model.har
ちなみに、このHARファイルはNetronで見ることも可能です。
このセルの実行も必須ではありません。
Parsingした後の状態をビジュアル化していますので、入力したモデルとの相違がないか確認することができます。
以上でParsingは完了です。
Parsingのnotebookは以降も続きますが、別のフォーマット(onnxファイルやpbファイルなど)からの変換方法やTensorflow Liteへの変換方法などになりますので必要に応じて参照ください。
Tips
Parsing時のエラーの要因として最も多いのは「Hailoがサポートしていない関数を使用している」あるいは「サポートしている関数であっても対応できない使い方をしている」になります。
「Hailoがサポートしていない関数を使用している」については、サポート関数はHailo Dataflow Compiler User Guideに載っていますので参照してください。サポートしていない関数の場合は置換えていただくか、問い合わせをいただければHailo社にて順次追加対応していきます。
「サポートしている関数であっても対応できない使い方をしている」に関しても各関数の使い方/制限はHailo Dataflow Compiler User Guideに記載されています。特によくあるのが各AIモデルの最後にReshapeなどを使用してひとまとまりの出力にしている場合です。以下はyolox_sの最終段になりますがこちらも出力をまとめております。

Reshape自体は対応しているのですが、Hailo Dataflow Compiler User Guideには「Between Conv and Dense layers (in both directions)」と記載があり、上記の最終段での使用はサポートされていません。この場合はエラーとなりますが、上記赤枠で囲ったところをend_nodeとして指定することでエラー回避できます。
Optimizer
DFC_2_Model_Optimization_Tutorial.ipynbがOptimizer向けのnotebookになります。
今回はQuick Optimization Tutorialのみ解説をします。
notebook解説
必要なライブラリーの宣言になります
Optimizerでは量子化を含む最適化をおこないますので、キャリブレーションデータが必要になります。通常は学習で使用されたデータセットの画像を使っていただきます。
このセルではモデルに合わせたリサイズ、クロップをおこなってcalib_datasetとして準備しています。
このセルではParserの項目で作成したHARファイルを読み込んでインスタンス化しています。
ここで実際に量子化含む最適化をおこなっています。
runner.load_model_script (alls) ではallsで記載された設定を読み込んでいます。ここではバッチノーマライゼーションを追加しています。
その後、runner.optimize (calib_dataset) にて作成したキャリブレーションデータを使って最適化の作業をしています。
そしてHARファイルへの保存をおこないます。
以上で最適化の作業は完了です。
これ以降続くセルは精度をチューニングしていく際に参考になるものになっています。合わせて以下のnotebookも参照ください。
DFC_5_Layer_Noise_Analysis_Tutorial.ipynb
DFC_6_QAT_Tutorial.ipynb
Tips
Optimizerでの重要なポイントは精度になります。量子化をしますので精度劣化は発生しますがそれを極小化するための各種手法があります。
もし満足いく精度が得られなかった場合は、Hailo Dataflow Compiler User Guideにて「Debugging Accuracy」という項目を参照ください。こちらにさまざまな見直しポイントが載っています。
その中の内容ですが、まずはチュートリアルにもあったバッチノーマライゼーションの追加が効果があるかと思います。Optimization level、Compression levelの変更でも結果は変わりますのでUser Guideを参考にしてください。あとは処理速度は犠牲になりますが16bit化をすることもできます。
Oprimizerのnotebookでは精度改善の手法が豊富に紹介されていますので、精度のチューニングにご活用ください。
DFC_2_Model_Optimization_Tutorial.ipynb
DFC_5_Layer_Noise_Analysis_Tutorial.ipynb
DFC_6_QAT_Tutorial.ipynb
Allocator/Compiler
DFC_3_Compilation_Tutorial.ipynbがAllocator/Compiler向けのnotebookとなります。
notebook解説
ライブラリーの宣言、Optimizer後のHARファイルの取込み、インスタンス化をおこないます。
ここでコンパイルを実施し、hefファイル (Hailo Executable binary File) を作成します。
hefファイルが完成すればDataflow Compilerの役割は完了となります。
結果のレポートファイルを出力する機能もありますので、そちらも紹介します。
このセルを実行することでProfiler Reportを作成することができます。
以下のようなHTMLファイルで出力され、モデルの概要から各レイヤーの詳細情報など有益な情報がありますので、ぜひ参照ください。
Tips
Compilerでのポイントは処理速度(パフォーマンス)になります。
Context Switchの有無がパフォーマンスに影響しますので、Contextが1に収まるのが一番パフォーマンスが高いです。
Contextの数は上記レポートファイルでも「# of Contexts」で表示されています(上記では1)。
※Context Switch
モデルを分割して(Contextに分ける)、それぞれのContextを順番にデバイスにロードして処理をしていく手法です。
大きなモデルでも対応できる一方、Contextのロード時間がオーバーヘッドになりパフォーマンスは低下します。
(Contextが1であればロードは最初の1回だけで済むが、複数になると都度入れ替えが発生する)
なお、処理はすべてHailoRT側で自動的におこないますので、ユーザーは意識する必要はありません。
コンパイルの設定としては以下の設定が効いてきますので、もしパフォーマンスに満足いかない場合はHailo Dataflow Compiler User Guideを参考にしてお試しください。
resources_param
performance_param
optimization_level/compression_level
以上が、Dataflow Compilerの使い方です。
hefファイルを使用した推論実行に関しましては以下リンクを参照ください。
お問い合わせ
本記事に関してご質問がありましたら以下より問い合わせください。
Hailo メーカー情報Topへ
Hailo メーカー情報Topページへ戻りたい方は、以下をクリックください。