AutoModelForSeq2SeqLM加载BERT微调模型报配置类不识别错误
问题根因
报错来自模型加载类和实际模型架构完全不匹配:
AutoModelForSeq2SeqLM是专门用来加载Encoder-Decoder结构序列生成模型的自动映射类,仅支持报错信息里列出的Bart、T5、mBART这类原生Seq2Seq架构的配置。- 你保存的模型从config.json可以明确看出是纯Encoder的BERT类架构,原任务头是掩码语言模型(
BertForMaskedLM),model_type字段值为bert,对应BertConfig,根本不在AutoModelForSeq2SeqLM的支持列表里,加载必然报错。 - 补充说明:原生BERT只有编码器结构,没有独立解码器,本身不具备Seq2Seq生成能力,直接拿单编码器BERT做机器翻译微调、再用Seq2Seq类加载,从架构逻辑上就不成立。
解决方案
根据实际使用场景二选一处理即可:
- 场景1:需要做机器翻译这类Seq2Seq生成任务
要么直接换用原生支持Seq2Seq的预训练模型(比如MT5、MarianMT、mBART这类专门做多语言翻译的模型)做微调,训练后的模型可以直接用AutoModelForSeq2SeqLM正常加载。
如果一定要基于BERT做翻译,需要手动组合Encoder-Decoder结构:用BERT作为编码器,搭配一个独立的解码器(可以是另一个随机初始化/预训练的BERT),用EncoderDecoderModel类完成训练和加载,这个类对应的EncoderDecoderConfig在支持列表里,参考代码:from transformers import EncoderDecoderModel, BertTokenizerFast # 加载BERT作为编码器、同结构BERT作为解码器,组成Seq2Seq模型 model = EncoderDecoderModel.from_encoder_decoder_pretrained( "/content/drive/MyDrive/Models/CSE498", "/content/drive/MyDrive/Models/CSE498" ) tokenizer = BertTokenizerFast.from_pretrained("/content/drive/MyDrive/Models/CSE498") - 场景2:不需要做Seq2Seq生成,只是加载已微调的BERT权重
把加载类换成和BERT架构匹配的类型即可。如果模型还是原来的掩码语言模型任务头,就用AutoModelForMaskedLM加载;如果微调后是分类、序列标注等任务,换对应任务头的Auto类就行,参考代码:from transformers import AutoTokenizer, AutoModelForMaskedLM model = AutoModelForMaskedLM.from_pretrained('/content/drive/MyDrive/Models/CSE498') tokenizer = AutoTokenizer.from_pretrained('/content/drive/MyDrive/Models/CSE498')
问题原始复现信息
运行代码时抛出错误:无法识别适用于AutoModel: AutoModelForSeq2SeqLM的配置类<class 'transformers.models.bert.configuration_bert.BertConfig'>,提示模型类型需为BartConfig、PLBartConfig、BigBirdPegasusConfig、M2M100Config、LEDConfig、BlenderbotSmallConfig、MT5Config、T5Config、PegasusConfig、MarianConfig、MBartConfig、BartConfig、BlenderbotConfig、FSMTConfig、XLMProphetNetConfig、ProphetNetConfig、EncoderDecoderConfig中的一种。
触发场景为使用AutoModelForSeq2SeqLM加载面向机器翻译任务的微调BERT模型,复现代码:
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer model = AutoModelForSeq2SeqLM.from_pretrained('/content/drive/MyDrive/Models/CSE498')
对应模型配置文件内容:
{ "_name_or_path": "ckiplab/albert-tiny-chinese", "architectures": [ "BertForMaskedLM" ], "attention_probs_dropout_prob": 0.0, "bos_token_id": 101, "classifier_dropout": null, "classifier_dropout_prob": 0.1, "down_scale_factor": 1, "embedding_size": 128, "eos_token_id": 102, "gap_size": 0, "hidden_act": "gelu", "hidden_dropout_prob": 0.0, "hidden_size": 312, "initializer_range": 0.02, "inner_group_num": 1, "intermediate_size": 1248, "layer_norm_eps": 1e-12, "max_position_embeddings": 512, "model_type": "bert", "net_structure_type": 0, "num_attention_heads": 12, "num_hidden_groups": 1, "num_hidden_layers": 4, "num_memory_blocks": 0, "pad_token_id": 0, "position_embedding_type": "absolute", "tokenizer_class": "BertTokenizerFast", "torch_dtype": "float32", "transformers_version": "4.18.0", "type_vocab_size": 2, "use_cache": true, "vocab_size": 30522 }
内容的提问来源于stack exchange,提问作者Md. Kamrus Samad
相关产品推荐
相关产品推荐

