はじめに
Fairseqを使って事前学習済みモデルをロードしようとした際に,設定は全く同じなのにモデルの不一致エラーがでてだいぶ苦戦したので,その時の状況と解決方法を共有したいと思います.
エラー内容
事前学習したモデルを別のサーバ上でファインチューニングするために,fairseq-train
コマンドを実行したところ以下のようなエラーが発生しました.
RuntimeError: Error(s) in loading state_dict for TransformerModel:
Unexpected key(s) in state_dict:
"encoder.layers.0.in_proj_weight", "encoder.layers.0.in_proj_bias", "encoder.layers.0.out_proj_weight", "encoder.layers.0.out_proj_bias", "encoder.layers.0.fc1_weight", "encoder.layers.0.fc1_bias", "encoder.layers.0.fc2_weight", "encoder.layers.0.fc2_bias", "encoder.layers.1.in_proj_weight", "encoder.layers.1.in_proj_bias", "encoder.layers.1.out_proj_weight", "encoder.layers.1.out_proj_bias", "encoder.layers.1.fc1_weight", "encoder.layers.1.fc1_bias", "encoder.layers.1.fc2_weight", "encoder.layers.1.fc2_bias".
Exception: Cannot load model parameters from checkpoint ./checkpoints/checkpoint_best.pt;
(中略)
please ensure that the architectures match.
原因
今回のエラーの原因としてはバージョン違いによる各層の名前が違うことにあります.
ver 0.12.2では各層の名前がencoder.layers.0.in_proj_weight
のように定義されていますが,最新バージョンのFairseqでは異なるようです.
解決方法
バージョンを揃えてあげるだけです.
今回の私の場合では以下のようにFairseqを再インストールすることで完全に解決できました.
pip install fairseq==0.12.2