Tech カテゴリのイメージ

_pickle.UnpicklingError: Weights only load failed の対処

このエラーは、PyTorch 2.6 から torch.load の既定が weights_only=True に変わったために起きます。テンソル以外のPythonオブジェクトを含むチェックポイントが読み込めなくなったのが原因で、出どころが信頼できるファイルなら weights_only=False を明示すれば読み込めます。

_pickle.UnpicklingError: Weights only load failed.
WeightsUnpickler error: Unsupported global: GLOBAL numpy.core.multiarray._reconstruct

原因

torch.load は内部でpickleを使っており、pickleは任意のコードを実行できるため、悪意あるチェックポイントを読むと危険です。この対策として、PyTorch 2.6 からは「テンソルと基本型だけを読み込む」安全モード(weights_only=True)が既定になりました。numpy配列やカスタムクラス、optimizerの状態などを含む従来形式のファイルは、この安全モードでは弾かれます。

対処

  1. 自分で保存したファイルなど、出どころが信頼できる場合は weights_only=False を明示します。
ckpt = torch.load("model.pt", weights_only=False)

信頼できない配布物にこれを使うのは危険なので、出どころだけは必ず確認してください。

  1. 特定のクラスだけ許可して安全モードのまま読む方法もあります。
import torch.serialization
torch.serialization.add_safe_globals([MyConfigClass])
ckpt = torch.load("model.pt", weights_only=True)
  1. 根本的には、保存側を「state_dictだけ保存する」形にするのがきれいです。モデル全体やnumpyオブジェクトを含めない形式なら、安全モードのままで読めます。
torch.save(model.state_dict(), "model.pt") # 保存
model.load_state_dict(torch.load("model.pt")) # 読み込み

まとめ

・原因はPyTorch 2.6でtorch.loadの既定がweights_only=Trueになったこと ・信頼できるファイルならweights_only=Falseを明示して読む ・add_safe_globalsで必要なクラスだけ許可する手もある ・恒久対応はstate_dictだけを保存する運用に揃えること