从零配置超参训练XLNet模型时触发多类运行报错的问题咨询
报错根因定位
- 弹出的TensorFlow系列FutureWarning属于版本兼容类提示,不影响PyTorch后端的实际训练流程,不需要优先处理。
- 导致训练中断的核心报错为
TypeError: vars() argument must have __dict__ attribute,触发原因有两点:- 代码中直接将纯字符串路径
train_dataset = 'sentences.txt'传入Trainer模块,Trainer不会自动解析文本文件、完成分词与数据集构造,直接拿字符串当数据集使用时,默认数据整理函数遍历到的元素是原生字符串,不满足特征对象的类型要求,直接触发类型错误。这是本次TypeError的核心触发点。 - 实例化的
XLNetModel是纯特征提取类,未绑定语言模型训练的损失计算逻辑,就算解决了数据集的问题,后续也会因为前向传播无损失输出导致训练失败。
- 代码中直接将纯字符串路径
- 末尾的tqdm相关TypeError属于训练中断后资源释放触发的连带异常,修复核心流程后会自动消失。
分步修复方案
1. 构造符合接口要求的训练数据集
Trainer模块要求传入的训练集必须是满足PyTorch Dataset规范的可迭代对象,不能直接传文件路径字符串。针对XLNet从零预训练的场景,需要完成三步处理:
- 基于你自定义的词表初始化XLNet分词器,无预训练权重依赖
- 逐行读取
sentences.txt的文本内容,调用分词器完成编码、长度截断,生成带input_ids、attention_mask、labels字段的样本 - 将处理好的样本封装为可按索引取数的Dataset结构,保证每个返回值是张量字典,适配默认数据整理函数的处理逻辑
2. 替换适配预训练任务的模型类
将原代码中纯特征提取的XLNetModel替换为带自回归语言建模头的XLNetLMHeadModel,把自定义的XLNetConfig配置传入完成模型初始化,让模型在前向传播时能自动计算预训练损失。
3. 参考修复后的完整代码
from transformers import XLNetConfig, XLNetLMHeadModel, XLNetTokenizer from transformers import Trainer, TrainingArguments import torch from torch.utils.data import Dataset # 自定义XLNet配置,完全从零初始化无预训练权重依赖 configuration = XLNetConfig( use_mems_train=True, vocab_size=32000, # 替换为你自定义词表的实际大小 d_model=768, n_layer=12, n_head=12 ) # 加载自定义词表初始化分词器 tokenizer = XLNetTokenizer(vocab_file="your_custom_vocab.txt") # 初始化带语言建模头的模型 model = XLNetLMHeadModel(configuration) # 自定义预训练数据集类 class PretrainTextDataset(Dataset): def __init__(self, file_path, tokenizer, max_seq_len=512): self.samples = [] with open(file_path, "r", encoding="utf-8") as f: for line in f.readlines(): line = line.strip() if not line: continue enc = tokenizer( line, truncation=True, max_length=max_seq_len, padding="max_length" ) # 预训练任务标签与输入序列一致,由模型自动计算掩码损失 enc["labels"] = enc["input_ids"].copy() self.samples.append(enc) def __len__(self): return len(self.samples) def __getitem__(self, idx): return {key: torch.tensor(val) for key, val in self.samples[idx].items()} # 初始化数据集实例 train_dataset = PretrainTextDataset( file_path="sentences.txt", tokenizer=tokenizer ) training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=16, warmup_steps=500, weight_decay=0.01, logging_dir='./logs', # 关闭未使用列自动移除逻辑,避免自定义字段被过滤 remove_unused_columns=False ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, ) trainer.train()
附加说明
- 代码中所有配置项均为自定义设置,无任何预训练权重加载逻辑,完全符合从零训练XLNet的需求。
- 开头的TensorFlow FutureWarning可通过升级transformers版本、或匹配对应NumPy版本消除,不影响PyTorch训练流程。
内容的提问来源于stack exchange,提问作者user14251114
相关产品推荐
相关产品推荐

