Markdownで表示

libreyolo profile

学習ステップや推論呼び出しのどこに時間がかかっているかを測定し、自己完結したプロファイルを書き出し、そのプロファイルをいくつかの読み方で読み返すコマンドグループです。

コマンド
libreyolo profile
出力
profile.json and profile_trace.json under runs/profile

書式

bash
libreyolo profile <subcommand> [<positional>] [--flag value ...]

このグループはkey=value形式の引数を受け付けません。サブコマンドは位置引数と POSIXフラグを使うため、weights=LibreYOLO9t.ptではなく --weights LibreYOLO9t.ptと書きます。サブコマンドを付けずにlibreyolo profile を実行すると、その一覧が表示されます。

2つのサブコマンドが測定してプロファイルを書き出し、残りはそれを読みます。runinferはどちらも同じ自己完結したprofile.jsonを出力するため、読み取り側の サブコマンドはどちらのプロファイルに対しても動作します。

profile run

短い学習をプロファイリングしながら実行し、プロファイルを書き出します。

bash
libreyolo profile run <data> [--flag value ...]
引数デフォルト意味
data位置引数。データセットのYAMLまたは名前(例:coco128)。必須
--weightsLibreYOLO9t.ptモデルの重みファイルまたは名前
--sizetモデルのサイズバリアント
--batch16マイクロバッチ。-1はVRAMの約70%に自動で合わせる
--imgsz640学習時の画像サイズ
--workers8データローダーのワーカー数
--amptrueモデルファミリーのAMPパスを使用。--no-ampで無効化
--steps20プロファイリング対象、つまり測定対象のステップ数
--warmup5測定前のウォームアップステップ数
--repeat1N回繰り返して平均と標準偏差を求める
--device0デバイス
--projectruns/profile出力ディレクトリのルート
--jsonfalseJSONを標準出力に出力

測定される区間は--warmup--stepsを足した反復回数です。これを満たせないほど 小さいデータセットではプロファイルが生成されず、コマンドは終了コード3で終了し、 3つの回避策を示します:より大きなデータセット、より少ないステップ数、より小さい バッチです。

--repeatに1より大きい値を指定すると、集計版の runs/profile/profile_repeat.jsonが書き出され、そのスカラー指標は試行全体で 平均される一方、カーネル一覧は最後の試行のものになります。これはcompareで 有意性の判定を得るための前提条件でもあります:1回の実行だけでは判定できません。

profile infer

推論のパスをプロファイリングし、プロファイルを書き出します。

bash
libreyolo profile infer [<source>] [--flag value ...]
引数デフォルト意味
source位置引数。画像またはディレクトリ。省略すると同梱のサンプル画像
--weightsLibreYOLO9t.ptモデルの重みファイルまたは名前
--sizetモデルのサイズバリアント
--batch11回のフォワードパスあたりの画像数
--imgsz640入力画像のサイズ
--halffalseフォワードをautocastで実行、CUDAのみ。--no-halfで無効化
--amp-dtypefloat16CUDAのautocastのdtype:float16またはbfloat16
--warmup20測定前のウォームアップ反復回数
--runs100測定する反復回数
--repeat1N回繰り返して平均と標準偏差を求める
--conf0.25信頼度のしきい値。NMSの処理量に影響
--iou0.45NMSのIoUしきい値
--max-det300画像あたりの最大検出数。NMSの処理量に影響
--device0デバイス
--tracetrueカーネルとopを掘り下げるためのChromeトレースを出力。--no-traceで省略
--projectruns/profile出力ディレクトリのルート
--jsonfalseJSONを標準出力に出力

p50、p90、p99のレイテンシ、1秒あたりの画像数で表したスループット、そして前処理・ フォワード・後処理へのステージ分割を報告します。3つのしきい値の引数がここにあるのは、 それらが後処理の数値を動かすからです。

profile summary

bash
libreyolo profile summary <trace> [--json]
引数デフォルト意味
trace位置引数。profile.jsonまたはprofile_trace.jsonのパス。必須
--jsonfalseJSONを標準出力に出力

大づかみな読み方です:ステップ時間、スループット、GPU使用率、Tensor Coreの比率、 VRAMのピーク、ホスト側のオーバーヘッド、ステップあたりのカーネル起動数、理由付きの ボトルネック判定、カテゴリ別のカーネル構成、そしてステップあたりの上位カーネル。 推論のプロファイルでは、レイテンシのパーセンタイルとステージ分割も表示します。

そこで測定された使用率とスループットは信頼できないため、VRAMのスラッシングが 起きている状態で取得したプロファイルには印が付きます。

profile get

bash
libreyolo profile get <trace> [<field>] [--json]
引数デフォルト意味
trace位置引数。プロファイルのパス。必須
field位置引数。指標名。省略すると利用できる指標の一覧を表示
--jsonfalseJSONを標準出力に出力

スクリプトのループで使えるように、1つの指標だけを出力します。未知のフィールドを 指定すると終了コード2で終了し、一覧表示の形を案内します。

profile phases

bash
libreyolo profile phases <trace> [--json]
引数デフォルト意味
trace位置引数。プロファイルのパス。必須
--jsonfalseJSONを標準出力に出力

フェーズごとのGPUミリ秒、実時間ミリ秒、カーネル数、op数です:forward、backward、 dataload、to_device、optimizer。

profile kernels

bash
libreyolo profile kernels <trace> [--flag value ...]
引数デフォルト意味
trace位置引数。プロファイルのパス。必須
--top20GPU時間の上位N件を表示
--categoryカテゴリ名の部分一致で絞り込み:gemmlayoutnormelementwise
--grepカーネル名の正規表現で絞り込み
--tensorcorefalseTensor Coreのカーネルのみ
--sorttimetimecountnameのいずれか
--phase1つのフェーズに限定:forwardbackwarddataloadto_deviceoptimizer
--jsonfalseJSONを標準出力に出力

解析の最下層です:個々のGPUカーネルと、そのGPU時間に占める割合、ステップあたりの ミリ秒、ステップあたりの呼び出し回数、カテゴリ。未知の--phaseを指定すると 終了コード2で終了し、そのプロファイルに含まれるフェーズを一覧表示します。

profile ops

bash
libreyolo profile ops <trace> [--flag value ...]
引数デフォルト意味
trace位置引数。プロファイルのパス。必須
--top20CPU時間の上位N件を表示
--phase1つのフェーズに限定
--jsonfalseJSONを標準出力に出力

デバイス視点ではなくフレームワーク視点です:atenとautogradのopをCPU時間で並べた もので、ホスト側の起動コストはここに現れます。

profile compare

bash
libreyolo profile compare <before> <after> [--json]
引数デフォルト意味
before位置引数。ベースラインのプロファイル。必須
after位置引数。新しいプロファイル。必須
--jsonfalseJSONを標準出力に出力

スループット、画像あたりのミリ秒、GPU使用率、ホスト側のオーバーヘッド、ステップ あたりのカーネル起動数、ボトルネック判定の差分を表示します。

有意性の判定には、両方のプロファイルを--repeatを2以上にして測定しておく必要が あります。その条件を満たしていれば、差が合成標準誤差の2倍を超えたときに有意と みなされ、出力には実際に行った比較が表示されます。満たしていない場合、その行には 1回の実行では判定を支えられないと表示されます。

profile what-if

bash
libreyolo profile what-if <trace> [--flag value ...]
引数デフォルト意味
trace位置引数。プロファイルのパス。必須
--remove-categoryあるカーネルカテゴリを取り除いた場合を試算:gemmlayoutnormelementwise
--remove-launchesステップあたりN回のカーネル起動を取り除いた場合を試算。たとえばop融合による削減
--jsonfalseJSONを標準出力に出力

変更を書く前に、その変更で何が得られるかを見積もります。2つのオプションのうち どちらか1つが必須で、どちらも指定しないと終了コード2で終了します。

試算はそのプロファイル自身の判定に従います。GPU使用率が80%未満なら、削減量は 起動回数の減少に実測の起動1回あたりのホストコストを掛けたものとしてモデル化し、 80%以上なら、GPUの処理量の減少としてモデル化します。起動1回あたりのコストは 近似であり、確かめる方法は2回目の測定しかないため、結果には注意書きのフィールドが 付きます。

使用例

推論を測定
# source引数を省略すると同梱のサンプル画像を使用libreyolo profile infer --device cpu --warmup 5 --runs 20
判定を読む
libreyolo profile summary runs/profile/infer/profile.json
2回の測定を比較
libreyolo profile infer --device cpu --warmup 5 --runs 20 --project runs/profile/alibreyolo profile infer --device cpu --warmup 5 --runs 20 --batch 4 --project runs/profile/b libreyolo profile compare runs/profile/a/infer/profile.json \  runs/profile/b/infer/profile.json

補足

プロファイラーは測定して報告します。何も変更しません:判定を読み、設定やコードを 編集し、再実行して比較する、というループのために作られています。

--deviceのデフォルトは0で、これはCUDAデバイス0のことです。--device cpuを 渡すとCPU上で測定し、GPUカーネルの詳細は付かないものの、読み取り側のサブコマンドが そのまま受け付けられるプロファイルを生成します。

すべてのサブコマンドが--jsonに対応しており、読み取り側は標準出力にしか出力しない ため、このグループはスクリプトから使えます。

終了コードはこのグループ独自のものです:存在しないファイルや解決できない引数は2runがプロファイルを生成しなかった場合は3、トレースを解析できない場合は1です。

関連:libreyolo train。学習のプロファイルは、たいていこの コマンドの引数を調整するために取得されます。

LibreYOLO v1.5.0で検証済みです。