【保存版】PyTorch Profilerでコールスタック解析!「torch.profiler._KinetoProfile.export_stacks()」の使い方と代替方法を徹底解説


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

  • metric: コールスタック情報をソートする基準となるメトリクス。デフォルトは self_cpu_time_total です。
  • path: コールスタック情報を保存するファイルパス

関数の動作

この関数は、以下の処理を行います。

  1. 収集された実行トレースから、各オペレータのコールスタック情報を抽出します。
  2. 抽出したコールスタック情報を、指定されたメトリクスに基づいてソートします。
  3. ソートされたコールスタック情報を、指定されたファイルパスに保存します。

関数の出力形式

出力ファイルは、以下の形式になります。

<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")

このコードは、以下の処理を行います。

  1. my_model 関数を作成します。この関数は、モデルの処理を行います。
  2. モデルを GPU に移動します。
  3. Profiler を初期化します。Profiler は、モデルの実行時間を測定するために使用されます。
  4. my_model 関数を実行します。
  5. コールスタック情報を 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 ファイルから、各オペレータのコールスタック情報を抽出することができます。