【保存版】PyTorch 分散化チェックポイントの読み込み:`torch.distributed.checkpoint.LoadPlanner.resolve_tensor()` の詳細ガイド


torch.distributed.checkpoint.LoadPlanner.resolve_tensor() は、PyTorch の Distributed Checkpoint 機能において、分散化されたチェックポイントファイルからテンソルを読み込む際に使用されるメソッドです。このメソッドは、ロードする必要があるテンソルを特定し、必要な場合にデバイス間のコピーをスケジュールする役割を担います。

詳細

resolve_tensor() メソッドは、以下の引数を受け取ります。

  • dtype: テンソルのデータ型
  • device: テンソルをロードするデバイス
  • name: ロードするテンソルの名前

このメソッドは、以下の処理を行います。

  1. チェックポイントファイルからテンソルのメタデータを読み込みます。
  2. メタデータに基づいて、ロードする必要があるテンソルを特定します。
  3. 必要に応じて、テンソルを別のデバイスにコピーするためのスケジュールを作成します。
  4. ロードするテンソルへの参照を返します。
import torch
import torch.distributed as dist

# 分散化されたチェックポイントファイルを読み込む
checkpoint = torch.load("checkpoint.pth")

# LoadPlanner を作成する
load_planner = dist.checkpoint.LoadPlanner()

# テンソルをロードする
tensor = load_planner.resolve_tensor("my_tensor", device="cuda:0", dtype=torch.float32)

# テンソルを使用する
print(tensor)
  • このメソッドは、テンソルをロードする前にのみ呼び出す必要があります。
  • このメソッドは、StorageLayer クラスによって使用されます。
  • resolve_tensor() メソッドは、サブクラスによってオーバーライドされる可能性があります。


import torch
import torch.distributed as dist

# 分散化されたチェックポイントファイルを読み込む
checkpoint = torch.load("checkpoint.pth")

# LoadPlanner を作成する
load_planner = dist.checkpoint.LoadPlanner()

# テンソルをロードする
tensor = load_planner.resolve_tensor("my_tensor", device="cuda:0", dtype=torch.float32)

# テンソルを使用する
print(tensor)

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

  1. checkpoint.pth という名前の分散化されたチェックポイントファイルを読み込みます。
  2. LoadPlanner オブジェクトを作成します。
  3. my_tensor という名前のテンソルを cuda:0 デバイスに torch.float32 データ型でロードします。
  4. ロードされたテンソルを出力します。

以下のコードは、resolve_tensor() メソッドを使用して、複数のテンソルを異なるデバイスにロードする方法を示す例です。

import torch
import torch.distributed as dist

# 分散化されたチェックポイントファイルを読み込む
checkpoint = torch.load("checkpoint.pth")

# LoadPlanner を作成する
load_planner = dist.checkpoint.LoadPlanner()

# テンソルをロードする
tensor1 = load_planner.resolve_tensor("my_tensor1", device="cuda:0", dtype=torch.float32)
tensor2 = load_planner.resolve_tensor("my_tensor2", device="cuda:1", dtype=torch.float16)

# テンソルを使用する
print(tensor1)
print(tensor2)
  1. checkpoint.pth という名前の分散化されたチェックポイントファイルを読み込みます。
  2. LoadPlanner オブジェクトを作成します。
  3. my_tensor1 という名前のテンソルを cuda:0 デバイスに torch.float32 データ型でロードします。
  4. my_tensor2 という名前のテンソルを cuda:1 デバイスに torch.float16 データ型でロードします。
  5. ロードされたテンソルを出力します。


代替方法

以下の代替方法が考えられます。

  • カスタム LoadPlanner を作成する: LoadPlanner クラスは抽象クラスであり、サブクラス化することができます。独自のニーズに合わせて、カスタム LoadPlanner を作成することで、resolve_tensor() メソッドの動作をカスタマイズすることができます。

  • 手動でテンソルを読み込む: torch.load() メソッドを使用して、分散化されたチェックポイントファイルからテンソルを手動で読み込むことができます。この方法は、resolve_tensor() メソッドよりも柔軟性がありますが、より多くのコードを書く必要があり、エラーが発生しやすい可能性があります。

代替方法の選択

どの代替方法を選択するかは、具体的な状況によって異なります。

  • 複雑なケース: 分散化されたチェックポイントファイルから複数のテンソルを読み込む必要がある場合、または resolve_tensor() メソッドの動作をカスタマイズする必要がある場合は、カスタム LoadPlanner を作成する方が良いかもしれません。
  • 単純なケース: 分散化されたチェックポイントファイルから単一のテンソルを読み込む必要がある場合は、torch.load() メソッドを使用する方が簡単かもしれません。

代替方法の例

手動でテンソルを読み込む

import torch

# 分散化されたチェックポイントファイルを読み込む
checkpoint = torch.load("checkpoint.pth")

# テンソルを手動で読み込む
tensor = checkpoint["my_tensor"]

# テンソルを使用する
print(tensor)

カスタム LoadPlanner を作成する

import torch
import torch.distributed as dist

class MyLoadPlanner(dist.checkpoint.LoadPlanner):
    def resolve_tensor(self, name, device, dtype):
        # カスタムロジックを実装する
        ...

# カスタム LoadPlanner を使用する
load_planner = MyLoadPlanner()

# テンソルをロードする
tensor = load_planner.resolve_tensor("my_tensor", device="cuda:0", dtype=torch.float32)

# テンソルを使用する
print(tensor)