【保存版】PyTorch Profilerでコールスタック解析!「torch.profiler._KinetoProfile.export_stacks()」の使い方と代替方法を徹底解説
この関数は、以下の引数を取ります。
metric
: コールスタック情報をソートする基準となるメトリクス。デフォルトはself_cpu_time_total
です。path
: コールスタック情報を保存するファイルパス
関数の動作
この関数は、以下の処理を行います。
- 収集された実行トレースから、各オペレータのコールスタック情報を抽出します。
- 抽出したコールスタック情報を、指定されたメトリクスに基づいてソートします。
- ソートされたコールスタック情報を、指定されたファイルパスに保存します。
関数の出力形式
出力ファイルは、以下の形式になります。
<metric>: <duration> <stack_trace>
<stack_trace>
: オペレータのコールスタック情報<duration>
: オペレータの実行時間<metric>
: コールスタック情報をソートする基準となったメトリクス値
import torch
from torch.profiler import profile, ProfilerActivity, schedule
def my_model(input):
# ... モデルの処理 ...
# モデルを GPU に移動
model.cuda()
# Profiler を初期化
with profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
with_stack=True,
) as prof:
# モデルを実行
output = model(input)
# コールスタック情報を保存
prof.export_stacks(path="model_stacks.txt", metric="self_cuda_time_total")
このコードは、my_model
関数の実行中に収集されたコールスタック情報を model_stacks.txt
ファイルに保存します。
import torch
from torch.profiler import profile, ProfilerActivity, schedule
def my_model(input):
# ... モデルの処理 ...
# モデルを GPU に移動
model.cuda()
# Profiler を初期化
with profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
with_stack=True,
) as prof:
# モデルを実行
output = model(input)
# コールスタック情報を保存
prof.export_stacks(path="model_stacks.txt", metric="self_cuda_time_total")
このコードは、以下の処理を行います。
my_model
関数を作成します。この関数は、モデルの処理を行います。- モデルを GPU に移動します。
- Profiler を初期化します。Profiler は、モデルの実行時間を測定するために使用されます。
my_model
関数を実行します。- コールスタック情報を
model_stacks.txt
ファイルに保存します。
このコードを実行すると、model_stacks.txt
ファイルに以下の内容が出力されます。
self_cuda_time_total: 100.000000 ms
at: 0
my_model
at: 0
Module: model
forward
at: 0
FConvNd(in_channels=3, out_channels=64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=True)
...
この出力は、my_model
関数の実行中に、各オペレータが実行された時間と、そのオペレータが呼び出されたコールスタックを示しています。
import torch
from torch.profiler import profile, ProfilerActivity, schedule
def my_model(input):
# ... モデルの処理 ...
# モデルを GPU に移動
model.cuda()
# Profiler を初期化
with profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
with_stack=True,
record_shapes=True,
) as prof:
# モデルを実行
output = model(input)
# 特定のオペレータに関するコールスタック情報を保存
prof.export_stacks(
path="conv_stacks.txt",
metric="self_cuda_time_total",
ops_to_profile=["FConvNd"],
)
torch.profiler.KinetoProfile.export_trace() 関数を使用する
torch.profiler.KinetoProfile.export_trace()
関数は、実行トレース全体を JSON 形式で保存します。この JSON ファイルから、コールスタック情報を抽出することができます。
import torch
from torch.profiler import profile, ProfilerActivity, schedule
def my_model(input):
# ... モデルの処理 ...
# モデルを GPU に移動
model.cuda()
# Profiler を初期化
with profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
with_stack=True,
) as prof:
# モデルを実行
output = model(input)
# 実行トレースを保存
prof.export_trace(path="model_trace.json")
このコードを実行すると、model_trace.json
ファイルに以下の内容が出力されます。
{
"events": [
{
"name": "my_model",
"start_time": 0,
"end_time": 100,
"children": [
{
"name": "Module: model",
"start_time": 0,
"end_time": 90,
"children": [
{
"name": "forward",
"start_time": 0,
"end_time": 80,
"children": [
{
"name": "FConvNd",
"start_time": 0,
"end_time": 70,
"stack": [
"my_model",
"Module: model",
"forward"
]
},
# ...
]
}
]
}
]
}
]
}
この JSON ファイルを解析することで、各オペレータのコールスタック情報を抽出することができます。
mmdnn
は、オープンソースのニューラルネットワークモデル分析ツールです。mmdnn
を使用して、PyTorch モデルからコールスタック情報を抽出することができます。
mmdnn analyze -v my_model.pt -o model_analysis.json
このコマンドを実行すると、model_analysis.json
ファイルに以下の内容が出力されます。
{
"model": {
"operators": [
{
"name": "FConvNd",
"stack": [
"my_model",
"Module: model",
"forward"
]
},
# ...
]
}
}
この JSON ファイルから、各オペレータのコールスタック情報を抽出することができます。