【PyTorch 1.12以降】TorchScriptモデルの状態取得:`get_extra_state()`メソッド廃止後の代替方法と注意点


torch.jit.ScriptModule.get_extra_state() メソッドは、TorchScript モデルに保存されている追加の情報を取得するために使用されます。この情報は、モデルの動作を理解したり、デバッグしたりするのに役立ちます。

メソッドの説明

  • 引数
    • なし

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = MyModule()
scripted_model = torch.jit.script(model)

# 追加の情報を取得する
extra_state = scripted_model.get_extra_state()
print(extra_state)
{
  "is_tracing": False,
  "training": False,
  "_jit_contracted": False,
  "_jit_unused_modules": []
}
  • このメソッドは、モデルをシリアライズしたり、デシリアライズしたりする際にも使用できます。
  • torch.jit.ScriptModule.get_extra_state() メソッドは、TorchScript モデルのデバッグに役立ちます。


サンプル 1: モデルの状態を取得する

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = MyModule()
scripted_model = torch.jit.script(model)

# モデルの状態を取得する
extra_state = scripted_model.get_extra_state()
print(extra_state)
{
  "is_tracing": False,
  "training": False,
  "_jit_contracted": False,
  "_jit_unused_modules": []
}

サンプル 2: モデルがトレースされているかどうかを確認する

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = MyModule()
with torch.jit.trace(model) as scripted_model:
    scripted_model(torch.randn(1, 10))

# モデルがトレースされているかどうかを確認する
extra_state = scripted_model.get_extra_state()
print(extra_state["is_tracing"])

出力

True

サンプル 3: モデルがトレーニングモードかどうかを確認する

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = MyModule()
scripted_model = torch.jit.script(model)

# モデルをトレーニングモードに設定する
scripted_model.train()

# モデルがトレーニングモードかどうかを確認する
extra_state = scripted_model.get_extra_state()
print(extra_state["training"])

出力

True

サンプル 4: モデルがコントラクトされているかどうかを確認する

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = MyModule()
scripted_model = torch.jit.script(model)

# モデルをコントラクトする
torch.jit.optimize(scripted_model)

# モデルがコントラクトされているかどうかを確認する
extra_state = scripted_model.get_extra_state()
print(extra_state["_jit_contracted"])

出力

True
import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear1 = torch.nn.Linear(10, 1)
        self.linear2 = torch.nn.Linear(1, 1)

    def forward(self, x):
        return self.linear1(x)

model = MyModule()
scripted_model = torch.jit.script(model)

# モデルの一部のみを使用する
y = scripted_model(torch.randn(1, 10))
print(y)

# 使用されていないサブモジュールを取得する
extra_state = scripted_model.get_extra_state()
print(extra_state["_jit_unused_modules"])

出力

tensor([1.4965])
['linear2']
  • このメソッドは、モデルの内部動作
  • torch.jit.ScriptModule.get_extra_state() メソッドは、TorchScript モデルのデバッグに役立ちます。


代替方法

torch.jit.ScriptModule.get_extra_state() メソッドの代替方法として、以下の方法が考えられます。

  1. モデルの状態を手動で保存する

    モデルの状態を手動で保存するには、モデルの属性やパラメータを辞書に格納します。この辞書を、モデルと一緒にシリアライズしたり、デバッグに使用したりすることができます。

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = MyModule()
scripted_model = torch.jit.script(model)

# モデルの状態を手動で保存する
extra_state = {
    "is_tracing": False,
    "training": model.training,
}

# モデルをシリアライズする
torch.jit.save(scripted_model, "model.pt", extra_state=extra_state)
  1. get_custom_state メソッドを使用する

    get_custom_state メソッドは、モデル固有の情報を取得するために使用することができます。このメソッドは、torch.jit.ScriptModule クラスのサブクラスでオーバーライドすることができます。

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

    def get_custom_state(self):
        return {
            "is_tracing": False,
            "training": self.training,
        }

model = MyModule()
scripted_model = torch.jit.script(model)

# モデルの状態を取得する
extra_state = scripted_model.get_custom_state()
print(extra_state)
  • モデル固有の情報を取得したい場合は、get_custom_state メソッドを使用する 方法が柔軟です。
  • モデルの状態を単純に取得したい場合は、モデルの状態を手動で保存する 方法が簡単です。