You need to enable JavaScript to run this app. 从零配置超参训练XLNet模型时触发多类运行报错的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

从零配置超参训练XLNet模型时触发多类运行报错的问题咨询

报错根因定位
  • 弹出的TensorFlow系列FutureWarning属于版本兼容类提示,不影响PyTorch后端的实际训练流程,不需要优先处理。
  • 导致训练中断的核心报错为TypeError: vars() argument must have __dict__ attribute,触发原因有两点:
    1. 代码中直接将纯字符串路径train_dataset = 'sentences.txt'传入Trainer模块,Trainer不会自动解析文本文件、完成分词与数据集构造,直接拿字符串当数据集使用时,默认数据整理函数遍历到的元素是原生字符串,不满足特征对象的类型要求,直接触发类型错误。这是本次TypeError的核心触发点。
    2. 实例化的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 10:54:02