PyTorch Profilerでトレースデータにメタデータを挿入:`torch.profiler._KinetoProfile.add_metadata_json()` 関数徹底解説


関数の引数

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

  • value: メタデータの値となる JSON エンコード可能なオブジェクト
  • key: メタデータのキーとなる文字列

関数の動作

この関数は、内部的に保持されているメタデータ辞書にキーと値のペアを追加します。 この辞書は、トレースデータが保存される際に一緒に保存されます。

import torch.profiler

profiler = torch.profiler.kineto_profiler(start_t=0, end_t=1000)
with profiler.profile():
    # モデルを実行
    pass

profiler.stop()

# メタデータを追加
profiler.kineto_profile.add_metadata_json("model_name", "my_model")
profiler.kineto_profile.add_metadata_json("input_size", [1024, 1024])

# 保存
profiler.export_chrome_trace("my_trace.trace")

この例では、model_nameinput_size という 2 つのメタデータキーを追加しています。 model_name キーの値は "my_model" であり、input_size キーの値は [1024, 1024] のリストです。

torch.profiler._KinetoProfile.add_metadata_json() 関数は、PyTorch Profiler で生成されたトレースデータに JSON 形式のメタデータを挿入するために使用されます。 このメタデータは、トレースを分析したり可視化したりする際に役立ちます。

  • メタデータのキーと値は、任意の文字列または JSON エンコード可能なオブジェクトにすることができます。
  • メタデータは、JSON 形式である必要があります。
  • メタデータは、トレースデータを保存する前に追加する必要があります。
  • メタデータは、トレースデータだけでなく、他の Profiler イベントにも追加できます。


import torch
import torch.profiler

# モデルを定義
class MyModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = torch.nn.Conv2d(1, 32, 3, 1)
        self.pool = torch.nn.MaxPool2d(2)
        self.fc1 = torch.nn.Linear(32 * 5 * 5, 64)
        self.fc2 = torch.nn.Linear(64, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool(x)
        x = x.view(-1, 32 * 5 * 5)
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)
        return x

# モデルを作成
model = MyModel()

# 入力データを作成
input_data = torch.randn(1, 1, 28, 28)

# Profiler を作成
profiler = torch.profiler.kineto_profiler(start_t=0, end_t=1000)

# モデルを実行
with profiler.profile():
    output = model(input_data)

# Profiler を停止
profiler.stop()

# メタデータを追加
profiler.kineto_profile.add_metadata_json("model_name", "my_model")
profiler.kineto_profile.add_metadata_json("input_size", [28, 28])

# 保存
profiler.export_chrome_trace("my_trace.trace")

このコードを実行すると、my_trace.trace という名前のファイルが作成されます。 このファイルには、モデルの実行に関するトレースデータと、model_nameinput_size という 2 つのメタデータが含まれます。

  • このコードは、PyTorch 1.10 以降で使用できます。
  • このコードは、CPU 上でモデルを実行するために設計されています。 GPU 上でモデルを実行するには、torch.profiler.cuda_profiler() を使用する必要があります。


しかし、torch.profiler._KinetoProfile.add_metadata_json() 関数は、内部的な API であり、将来変更される可能性があります。

より安定した方法でメタデータを挿入するには、以下の代替方法を使用することができます。

torch.profiler.add_metadata() 関数を使用する

import torch
import torch.profiler

# モデルを定義
class MyModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = torch.nn.Conv2d(1, 32, 3, 1)
        self.pool = torch.nn.MaxPool2d(2)
        self.fc1 = torch.nn.Linear(32 * 5 * 5, 64)
        self.fc2 = torch.nn.Linear(64, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool(x)
        x = x.view(-1, 32 * 5 * 5)
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)
        return x

# モデルを作成
model = MyModel()

# 入力データを作成
input_data = torch.randn(1, 1, 28, 28)

# Profiler を作成
profiler = torch.profiler.kineto_profiler(start_t=0, end_t=1000)

# モデルを実行
with profiler.profile():
    output = model(input_data)

    # メタデータを追加
    torch.profiler.add_metadata("model_name", "my_model")
    torch.profiler.add_metadata("input_size", [28, 28])

# Profiler を停止
profiler.stop()

# 保存
profiler.export_chrome_trace("my_trace.trace")

カスタムイベントを使用して、トレースデータにメタデータを挿入することができます。 カスタムイベントは、任意のデータを含むことができ、トレースデータを分析したり可視化したりする際に役立ちます。

import torch
import torch.profiler

# モデルを定義
class MyModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = torch.nn.Conv2d(1, 32, 3, 1)
        self.pool = torch.nn.MaxPool2d(2)
        self.fc1 = torch.nn.Linear(32 * 5 * 5, 64)
        self.fc2 = torch.nn.Linear(64, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool(x)
        x = x.view(-1, 32 * 5 * 5)
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)

        # メタデータを含むカスタムイベントを追加
        with torch.profiler.record_function("model_metadata"):
            torch.profiler.add_metadata("model_name", "my_model")
            torch.profiler.add_metadata("input_size", [28, 28])

        return x

# モデルを作成
model = MyModel()

# 入力データを作成
input_data = torch.randn(1, 1, 28, 28)

# Profiler を作成
profiler = torch.profiler.kineto_profiler(start_t=0, end_t=1000)

# モデルを実行
with profiler.profile():
    output = model(