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_name
と input_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_name
と input_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(