PyTorch Profilerの「torch.profiler._KinetoProfile.key_averages()」関数:詳細解説と応用例


この関数は、以下の引数を受け取ります。

  • group_by_stack_n (int)
    スタックトレースエントリのトップ n 個でグループ化します。
  • group_by_input_shapes (bool)
    True の場合、イベント名を単にグループ化するのではなく、(イベント名、入力形状) でエントリをグループ化します。

この関数は、以下の情報を返す辞書を返します。

  • stack
    グループ化されたスタックトレースエントリのリスト (group_by_stack_n が 0 より大きい場合のみ)。
  • shapes
    グループ化された入力形状のリスト (group_by_input_shapes が True の場合のみ)。
  • avg_total_time
    各イベントの平均合計時間。
  • avg_self_cuda_time
    各イベントの平均 CUDA 自身の時間。
  • avg_calls
    各イベントの平均呼び出し回数。
  • avg_time
    各イベントの平均実行時間。
  • keys
    イベント名のリスト。

関数の使用方法

この関数は、以下の手順で使用できます。

  1. torch.profiler.profile() コンテキストマネージャーを使用して、プロファイルするコードブロックをラップします。
  2. コンテキストマネージャー内で、key_averages() 関数を呼び出して、プロファイルされたイベントの集計結果を取得します。
with torch.profiler.profile(activities=[torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA]) as prof:
  # プロファイルするコードブロック

print(prof.key_averages().table(sort_by="self_cuda_time_total", row_limit=-1))

この例では、CPU と CUDA の両方のイベントをプロファイルし、self_cuda_time_total でソートされた結果を表示します。



import torch
import torch.profiler

# モデルを定義する
model = torch.nn.Sequential(
    torch.nn.Linear(10, 64),
    torch.nn.ReLU(),
    torch.nn.Linear(64, 10)
)

# 入力データを準備する
x = torch.randn(128, 10)

# プロファイルするコードブロックをラップする
with torch.profiler.profile(activities=[torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA]) as prof:
    # モデルを実行する
    y = model(x)

# プロファイルされたイベントを分析する
print(prof.key_averages().table(sort_by="self_cuda_time_total", row_limit=-1))

このコードは、以下のことを実行します。

  1. torch.nn.Linear モジュールを 2 つ重ねた単純なモデルを定義します。
  2. ランダムな入力データを準備します。
  3. torch.profiler.profile() コンテキストマネージャーを使用して、モデルの実行をプロファイルします。
  4. key_averages() 関数を呼び出して、プロファイルされたイベントの集計結果を取得します。
  5. 結果をソートして表示します。


  • この関数は、複雑なプロファイル結果を分析するには扱いにくい場合があります。
  • この関数は、イベントの分布に関する情報を提供しません。
  • この関数は、単純な平均しか計算できません。

これらの制限を克服するために、torch.profiler._KinetoProfile.key_averages() 関数の代替方法をいくつか検討することができます。

カスタム集計ロジックを実装する

torch.profiler._KinetoProfile オブジェクトは、プロファイルされたイベントに関する豊富な情報へのアクセスを提供します。この情報を使用して、独自の集計ロジックを実装することができます。これにより、単純な平均よりも詳細な分析が可能になります。

プロファイリングツールを使用する

PyTorch には、torch.profiler モジュール以外にも、プロファイリング機能を提供するツールがいくつかあります。これらのツールには、より高度な分析機能が備わっている場合があり、torch.profiler._KinetoProfile.key_averages() 関数の制限を克服するのに役立ちます。

サードパーティのライブラリを使用する

PyTorch Profiler の機能を拡張するサードパーティのライブラリがいくつかあります。これらのライブラリは、torch.profiler._KinetoProfile.key_averages() 関数の代替手段を提供したり、追加の分析機能を提供したりする場合があります。

代替方法を選択する際には、以下の点を考慮する必要があります。

  • 時間とリソース: サードパーティのライブラリを調査して導入するのに時間とリソースを費やすことができるか?
  • 技術的な専門知識: 独自の集計ロジックを実装するのに十分な知識を持っているか?
  • 分析のニーズ: どのような情報を取得する必要があるか?

以下に、いくつかの代替方法の例を示します。

  • サードパーティのライブラリ
    autograd-profiler ライブラリを使用して、より詳細なイベント情報を取得することができます。
  • プロファイリングツール
    MemoryProfiler ツールを使用して、メモリ使用量を分析することができます。
  • カスタム集計ロジック
    標準偏差やヒストグラムなどの統計量を計算するために、独自の集計ロジックを実装することができます。