OpenVXの可視化によるビジョン・アプリケーションの最適化

米国シノプシス シニア・プロダクト・マーケティング・マネージャー Allen Watson

Percepio AB社 CEO Johan Kraft


現在の強力なビジョン・プロセッサは優れた性能をもたらしてくれますが、ハードウェアの利用効率を最大化できているかどうかは、また別の問題です。システム実行時の動作を可視化すると、開発、デバッグ、バリデーションの期間短縮につながります。Percepio社の「Tracealyzer for OpenVX」を使用すると、OpenVXアプリケーションの実行を可視化し、最適化によって大きな改善効果が見込めるボトルネックを特定できます。Tracealyzer for OpenVXはシノプシスDesignWare® ARC® EV6x Embedded Vision Processorに対応しており、ARC MetaWare EV Development Toolkitのトレース機能を利用して可視化を実行します。

組込みビジョン向けOpenVX

一般に、組込みビジョン・アプリケーションはOpenVXグラフとして記述します。OpenVXはコンピュータ・ビジョン・アプリケーションのアクセラレーションに関するオープンな標準規格で、組込みおよびリアルタイム分野のユース・ケースを数多くサポートしています。代表的なアプリケーションとしては、顔/全身/ジェスチャ・トラッキング、スマート・ビデオ監視、先進運転支援システム(ADAS)、物体/シーン再構築、拡張現実(AR)、外観検査、ロボット工学などがあります。

 

OpenVXグラフは、1つ以上のカーネルで構成されます。1つのカーネルが1個のビジョン関数を実行します。カーネルの種類には、標準OpenVXカーネル、カスタム・カーネル、ユーザー定義カーネルがあります(図1)。

たとえば、ARC EV6xプロセッサなどのビジョン・プロセッサでは、1個以上のビジョンCPU上、またはCNNエンジン上でカーネルを実行できます(図2)。カーネルの実行、およびメモリーの割り当てと使用は、プロセッサ上で動作するOpenVXベースのランタイム・ソフトウェアで管理します。

Tracealyzer for OpenVX

プロセッサ・ハードウェアの利用効率が最大かどうかを確認するのは、容易なことではありません。たとえば、OpenVXグラフのあるノードで予想以上に処理時間がかかって1つのコアに負荷が集中し、その他のコアがほとんどアイドル状態のままということもあります。あるいは、アプリケーション内でDMA転送完了の待ち時間が多く発生しているケースもあります。性能を改善しようとして演算リソースを追加しても、思ったほど効果がなかったという経験はないでしょうか。こうした問題を解決するのがPercepio社の可視化ソリューションTracealyzerで、このたびそのOpenVX版が登場しました。

 

このソリューションを使用すると、最適化によって大きな改善効果が見込めるボトルネックを特定できます。Tracealyzer for OpenVXにはいくつものグラフィカル・ビューがあり、記録した動作を詳細なトレース・ビューからハイレベルの概要および統計データまでさまざまな観点から表示できます。本稿では、Tracealyzerで利用可能な各種ビューについてご説明します。

トレース・ビュー

トレース・ビューには、OpenVXグラフ実行のタイムラインが表示され、スケジューリング、パイプライン処理、タイミングを詳しく調べることができます。トレース・ビューはさまざまな形式での表示が可能で、水平表示と垂直表示の両方がサポートされます。

 

例として、ここではTracealyzer for OpenVXに付属するデモ・トレース(「demo_openvx.xml」)を見てみます。これは、OpenVXデモ・アプリケーションを実行して収集したトレースです。図3にトレース・ビューでの表示を示します。

これを見ると、ランタイム・ソフトウェアが2つのコアを使用してグラフをスケジューリングしている様子が分かります。コア0は入力フレームを読み出し、これをsobel3x3ノードに渡します。コア1は、sobel3x3ノードの実行結果に対してmagnitudeおよびconvert_depthフィルター処理を実行します。この処理はRTC(Run-to-Completion)方式で行われるため、トレース・ビューに表示された各矩形(フラグメント)は、プリエンプションのない独立したジョブとして実行されます。フィルター機能のフラグメントのうち、長さの短いものは前提条件チェックで、長いフラグメントが実際のフィルター処理を表しています。

 

magnitudeノードは、sobel3x3ノードが完了する前に開始しています。これが可能なのは、このOpenVX実装例では各フレームを複数のタイルに分割しているためです。各ノードは、処理が完了したタイルから順番に出力バッファへ書き込みます。このため、次のノード(magnitudeノードなど)が別のコアで動作している場合、1フレーム全体を待たなくても、最初のタイルを受け取った時点で処理を開始できます。このように処理をパイプライン化することで、コアの利用効率を高めることができます。

図4に示したトレース・ビューは、「CPU 0」と「CPU 1」の2つのフィールドで構成されています。表示される情報の内容は、フィールドの種類によって異なります。OpenVXノードは「スケジューリング」フィールドに表示され、CPUコアごとに1つのフィールドを表示(左側の例)することも、すべてのノードを1つのフィールドに表示(右側の例)することもできます。

CPUロード・グラフ

OpenVXアプリケーションにおけるCPUコア利用率は、CPUロード・グラフで概要を確認できます。図5は、2つのCPUロード・グラフ(コア0とコア1)と、垂直モードのトレース・ビューを示しています。CPUロード・グラフでは、CPUコアの全体的な負荷だけでなく、負荷の時間変動やノードごとの利用率も確認できます。

 

また、CPUロード・グラフではCPU負荷の異常値も見つけることができます。たとえば図5の赤で示した「sobel3x3」ノードには、利用率が約80~90%に達したスパイクの部分が2か所あります。CPUロード・グラフでこれらの部分をクリックすると、対応するセクションがトレース・ビューに表示され、スパイクの原因を調べることができます。

Tracealyzerのビューはすべて連動しており、ハイレベルの概要から詳細なトレースへ容易にドリルダウンできます。色分け表示もTracealyzerのすべてのビューで共通のため、OpenVXグラフのノードを簡単に識別できます。CPUロード・グラフはコアごとに別々のインスタンスとして開くことも、すべてのコアを1つのCPUロード・グラフにまとめて表示することもできます。後者ではCPU負荷が合算されるため、2コアの場合はグラフ目盛りの最大値が200%となります。

 

CPUロード・グラフは、グラフに表示されている時間枠全体を均等な時間間隔に分割(デフォルトでは50分割)し、それぞれの時間間隔ごとに各ノードの処理時間の量を計算します。この計算結果は、積み上げヒストグラム(Y軸は各時間間隔における相対的なCPU利用率)として表示されます。Tracealyzerに限らず、そもそもCPU負荷とは特定の時間枠を基準とした相対的なものであるため、ズームイン/ズームアウトして基準となる時間枠が変化すると、CPUロード・グラフのレベルも変化します。ズームインを繰り返していくと、ほとんどの時間間隔には1つしかノードが含まれなくなるため、CPUロード・グラフはトレース・ビューと同じような表示になります。

アクター・インスタンス・グラフ

図6は、アクター・インスタンス・グラフのインスタンスを2つ追加したものです。アクター・インスタンス・グラフのY軸は、グラフ・ノードの実行時間を表しています。このグラフで、通常よりも実行時間の長いノードを見つけて、トレース・ビューでその詳細を調べることができます。「アクター」とは実行コンテキストを意味するTracealyzerの用語で、OpenVXのノードに対応します。

実行時間以外にも、アクター・インスタンス・グラフには間隔(Separation)や周期(Periodicity)などさまざまなタイミング・プロパティを表示できます。どのプロパティを表示するかは、ドロップダウン・メニューで設定できます(デフォルトは[Execution Time])。

アクター統計レポート

アクター統計レポートには、トレースに関する統計データのサマリ情報として、各タイミング・プロパティ(実行時間など)の最大値、最小値、平均値などが表示されます。このレポートの極値はすべてリンクとなっており、クリックするとトレース・ビューの対応する場所が表示されます(図7)。

アクター統計レポートでは、極値を見るだけでなく、その極値が発生した時点でのシステムの動作も調べることができます。すべての詳細データが記録されるわけではありませんが、極値が発生した原因について貴重な手がかりを得ることができます。たとえば、アクター・インスタンス・グラフで他にも同じように実行時間が長くなっている場所を見つけ、トレースで相関を確認します。そうすると、たとえば他のCPUコアの動作が活発になってバスが飽和した場合など、特定の条件下でのみ実行時間が長くなっていることなどが分かります。

 

統計レポートは、図7に示したような整形済みHTMLファイルとして出力するだけでなく、アクター統計レポートのダイアログ・ボックスで[Data Export]オプションを選択してタブ区切りテキスト・ファイルとしてもエクスポートおよび保存できます(図8)。この形式でエクスポートすると、他のツールにデータを簡単にインポートできます。この機能を利用すると、いくつかの候補のデザインで計測した性能指標を体系的に比較できます。たとえば、図8に示した統計レポートでは、IDLE0の動作時間が40.7%に達しており、コア0には59.7%しか負荷がかかっていないことが分かります。一方、IDLE1の動作時間は17%で、コア1に83%の負荷がかかっていることが分かります。

ユーザー・イベント

Tracealyzerでは、独自の「ユーザー・イベント」(アプリケーション・コードで記録したカスタム・イベント)を追加できます。ユーザー・イベントを使用すると、診断メッセージ、変数の値、ステートなど、アプリケーションに関するほとんどすべての情報を可視化できます。ユーザー・イベントの表示方法はいくつかあります。

 

図9は、2つのユーザー・イベント・チャネルで記録したユーザー・イベントの例です。「MyVariable」は整数変数の値を示し、「MyState」はステート名を示しています。Tracealyzerでは、さまざまな方法でユーザー・イベントが表示されます。トレース・ビューのイベント・ラベル(1)、イベント・ログのエントリ(2)の他、ユーザー・イベント信号プロット(3)にユーザー・イベントの数値データをプロットすることもできます。

 

また、システムの重要なステート変数については、ステートの変化をユーザー・イベントとして記録し、Tracealyzerでステート・マシンを定義しておくと、トレース・ビューのタイムライン(4)にこれらのステートを表示できます。また、ステート変化のサマリをステート・マシン・グラフ(5)として表示することもできます。更に、各ステートの所要時間に関する統計データを取得することや、「カスタム・インターバル」を定義して任意の2つのイベント間の時間を取得することもできます。

DesignWare EV6x Embedded Vision Processorと開発ツール

本稿で説明したユース・ケースの例は、ARC EV6x Processor用のシノプシスDesignWare ARC MetaWare EV Development Toolkitを使用して開発したOpenVXアプリケーションに基づいています。

EV6x Embedded Vision Processorsは、32ビット・スカラー・コアと512ビット・ベクターDSPで構成された高性能ビジョンCPUを1個、2個、または4個統合しています。最適化済みの畳込みニューラル・ネットワーク(CNN)エンジンをオプションとして追加すると、高速かつ高精度な物体検出、分類、シーン・セグメンテーションが可能です。完全プログラマブル/コンフィギュラブルなこれらのプロセッサは、ソフトウェア・ソリューションの強みである柔軟性と、専用ハードウェアならではの高性能/低消費電力を両立させています。

 

ARC MetaWare EV Development Toolkitには、MetaWareコンパイラおよびデバッガ、ARC nSIM命令セット・シミュレータ(ISS)、EVランタイムおよびライブラリ、CNN SDK(Software Development Kit)、EV VDK(Virtualizer Development Kit)など、EV6xプロセッサ・ファミリを使用したエンベデッド・ビジョン・アプリケーションや機械学習アプリケーションの開発に必要なツール、ランタイム・ソフトウェア、ライブラリ一式が揃っています。

 

先進の組込みビジョンおよびAIアプリケーションを効率よく開発するには、ソフトウェアのデバッグ、バリデーション、最適化にかかる期間を短縮する必要があります。シノプシスARC EV6x Processorを使用してADASや自動運転車などのリアルタイム・ビジョン・アプリケーションを開発する場合、Percepio社の「Tracealyzer for OpenVX」を使用してソフトウェア実行時の動作を可視化すると、アプリケーションを最適化して性能の最大化を図りながら、開発期間も短縮できます。

 

詳細情報:Percepio Tracealyzer