PyTorch Profiler key_averages() 関数でパフォーマンスのボトルネックを見つけ出す

2024-04-02

PyTorch Profiler の torch.profiler._KinetoProfile.key_averages() 関数解説

主な機能

  • すべてのイベントの平均値、最小値、最大値、標準偏差などを計算
  • テーブル形式で出力
  • ソートやフィルタリング機能
  • 特定のイベントの詳細な情報表示

使用例

with torch.profiler.profile(record_shapes=True) as prof:
    model(input)

# すべてのイベントの平均値を表示
print(prof.key_averages().table())

# 特定のイベントの平均値を表示
print(prof.key_averages(group_by_input_shape=True).table(sort_by="cuda_time_total", row_limit=10))

# 特定のイベントの詳細な情報表示
print(prof.key_averages(group_by_stack_n=2).table(sort_by="self_cpu_memory_usage", row_limit=10))

出力例

# すべてのイベントの平均値

Name | CPU time (us) | CUDA time (us) | Self CPU memory usage (MB) | Self CUDA memory usage (MB)
------- | -------- | -------- | -------- | --------
aten::add | 100.0 | 200.0 | 10.0 | 20.0
aten::mul | 50.0 | 100.0 | 5.0 | 10.0

# 特定のイベントの平均値

Name | Input shape | CPU time (us) | CUDA time (us) | Self CPU memory usage (MB) | Self CUDA memory usage (MB)
------- | -------- | -------- | -------- | -------- | --------
aten::add | [1, 1024, 1024] | 100.0 | 200.0 | 10.0 | 20.0
aten::mul | [1, 1024, 1024] | 50.0 | 100.0 | 5.0 | 10.0

# 特定のイベントの詳細な情報

Name | CPU time (us) | CUDA time (us) | Self CPU memory usage (MB) | Self CUDA memory usage (MB) | Stack
------- | -------- | -------- | -------- | -------- | --------
aten::add | 100.0 | 200.0 | 10.0 | 20.0 | 
    - aten::add
    - aten::mul
    - aten::relu

補足

  • torch.profiler._KinetoProfile.key_averages() は、PyTorch Profiler の高度な機能です。
  • この関数は、パフォーマンスのボトルネックを見つけるために役立ちます。
  • 出力結果を理解するには、PyTorch Profiler の仕組みを理解する必要があります。


PyTorch Profiler key_averages() 関数 サンプルコード

すべてのイベントの平均値

with torch.profiler.profile(record_shapes=True) as prof:
    model(input)

# すべてのイベントの平均値を表示
print(prof.key_averages().table())

特定のイベントの平均値

with torch.profiler.profile(record_shapes=True) as prof:
    model(input)

# 特定の演算の平均値を表示
print(prof.key_averages(group_by_input_shape=True).table(sort_by="cuda_time_total", row_limit=10))

特定のイベントの詳細な情報

with torch.profiler.profile(record_shapes=True, record_stack=True) as prof:
    model(input)

# 特定の演算の詳細な情報
print(prof.key_averages(group_by_stack_n=2).table(sort_by="self_cpu_memory_usage", row_limit=10))

特定のフレームのみに絞り込む

with torch.profiler.profile(record_shapes=True, record_stack=True) as prof:
    for i in range(10):
        model(input)

# 5番目のフレームのみに絞り込み、詳細な情報
print(prof.key_averages(frame_range=[4, 5], group_by_stack_n=2).table(sort_by="self_cpu_memory_usage", row_limit=10))

特定のCUDAデバイスのみに絞り込む

with torch.profiler.profile(record_shapes=True, record_stack=True) as prof:
    with torch.cuda.device(1):
        model(input)

# CUDAデバイス1のみに絞り込み、詳細な情報
print(prof.key_averages(device_ids=[1], group_by_stack_n=2).table(sort_by="self_cpu_memory_usage", row_limit=10))

出力結果をCSVファイルに保存

with torch.profiler.profile(record_shapes=True, record_stack=True) as prof:
    model(input)

# 出力結果をCSVファイルに保存
prof.key_averages().export_csv("profile_results.csv")

Jupyter Notebook での可視化

# Jupyter Notebook で使用する場合

%load_ext autoreload
%autoreload 2

from torch.profiler import profile

with profile(record_shapes=True, record_stack=True) as prof:
    model(input)

# Jupyter Notebook で可視化
prof.key_averages().plot()


PyTorch Profiler key_averages() 関数 以外のパフォーマンス分析方法

PyTorch Profiler その他の機能

  • torch.profiler.profile()with_stack オプション: 各イベントのスタックトレースを表示
  • torch.profiler.profile()with_flops オプション: 各イベントの浮動小数点演算数 (FLOPS) を表示
  • torch.profiler.profile()with_modules オプション: 各イベントのモジュール階層を表示
  • torch.profiler.export_chrome_trace() : Chrome Tracing 形式でトレースデータを保存
  • torch.profiler.kineto() : Kineto profiler を使用してトレースデータを収集

PyTorch以外のツール

  • Nvidia Nsight Systems: GPU パフォーマンスの詳細な分析
  • Intel VTune Amplifier: CPU と GPU パフォーマンスの詳細な分析
  • AMD CodeXL: CPU と GPU パフォーマンスの詳細な分析
  • Google Perfetto: Chrome Tracing 形式のトレースデータの分析

コードレベルでの分析

  • コード内のボトルネックを見つける
  • 非効率なコード部分を最適化する
  • データ構造やアルゴリズムを見直す

メモリリークの分析

  • torch.cuda.memory_allocated() : CUDAメモリ使用量を取得
  • torch.cuda.memory_cached() : CUDAキャッシュメモリ使用量を取得
  • torch.cuda.memory_reserved() : CUDA予約済みメモリ使用量を取得

これらの方法を組み合わせることで、パフォーマンスの問題をより深く理解し、解決することができます。




パフォーマンス向上:PyTorch Dataset と DataLoader でデータローディングを最適化する

Datasetは、データセットを表す抽象クラスです。データセットは、画像、テキスト、音声など、機械学習モデルの学習に使用できるデータのコレクションです。Datasetクラスは、データセットを読み込み、処理するための基本的なインターフェースを提供します。



PyTorch C++ 拡張開発をレベルアップ! include パス取得の奥義をマスターしよう

torch. utils. cpp_extension. include_paths() は、PyTorch C++ 拡張をビルドするために必要なインクルードパスを取得するための関数です。 引数として cuda フラグを受け取り、True の場合、CUDA 固有のインクルードパスを追加します。 関数はインクルードパス文字列のリストを返します。


PyTorchのC++バックトレースを取得:torch.utils.get_cpp_backtraceの使い方

torch. utils. get_cpp_backtrace は、PyTorch の C++ バックトレースを取得するための関数です。これは、C++ コードで発生したエラーのデバッグに役立ちます。機能この関数は、現在のスレッドの C++ バックトレースをリストとして返します。各要素は、フレームの情報を含むディクショナリです。


PyTorch Miscellaneous: torch.utils.cpp_extension.get_compiler_abi_compatibility_and_version() の概要

torch. utils. cpp_extension. get_compiler_abi_compatibility_and_version() は、C++ 拡張モジュールをビルドする際に、現在のコンパイラが PyTorch と互換性があるかどうかを確認するために使用されます。


PyTorch Miscellaneous: torch.testing.assert_close() の詳細解説

torch. testing. assert_close() は、PyTorch テストモジュール内にある関数で、2つのテンソルの要素がほぼ等しいことを確認するために使用されます。これは、テストコードで計算結果の正確性を検証する際に役立ちます。



Sparse Tensorsを用いたスパース行列乗算

torch. sparse. Tensor. is_sparse_csr関数は、引数として渡された疎行列が**Compressed Sparse Row (CSR)**形式かどうかを判定します。CSR形式は、疎行列を表現する一般的な形式の一つであり、行インデックス、列インデックス、および非ゼロ要素の値をそれぞれ別々のベクトルで保持します。


PyTorchで逆行列と行列式を効率的に計算: inv_ex()の使い方

torch. linalg. inv_ex()は、入力された行列の逆行列と行列式を同時に計算します。これは、逆行列と行列式を個別に計算するよりも効率的です。input (Tensor): 逆行列と行列式を計算したい行列**compute_svd (bool


スペクトル漏れを抑え、周波数分解能を向上:torch.blackman_windowで高精度な信号処理を実現

torch. blackman_window は、ブラックマン窓と呼ばれる信号処理用の窓関数を生成する関数です。ブラックマン窓とは:ブラックマン窓は、信号処理におけるスペクトル漏れを低減するために用いられる窓関数です。特徴:他の窓関数に比べて、メインローブ幅が狭く、サイドローブレベルが低いため、高い周波数分解能と優れた周波数漏れ抑制特性を持ちます。


torch.distributed.is_initialized() を使ってデフォルトのプロセスグループの初期化状態を確認する方法

PyTorchの分散コミュニケーションパッケージ torch. distributed は、複数のGPUやコンピュータ間でモデルの訓練や推論を行うための機能を提供します。torch. distributed. is_initialized() は、デフォルトのプロセスグループが初期化されているかどうかをチェックする関数です。


データ分析から強化学習まで!PyTorch Probability Distributions の活用例

PyTorch は、確率分布を扱うためのモジュール "Probability Distributions" を提供しています。このモジュールには、様々な確率分布クラスが含まれており、それらのクラスには、サンプルを生成するためのメソッドが用意されています。