首页 > 解决方案 > 通过将数据集分成块并再次加载模型,在整个数据集上训练模型,直到训练完数据集的所有块

问题描述

这是我在 StackOverflow 上的第一个问题。我正在研究CUAD(合同理解 Atticus 数据集),它是一个基于问答的数据集。但是由于资源限制,一次训练 80% 的数据集是不可能的。我在这里使用 HuggingFace Transformer 文档提供的样板代码进行问答任务。我的双手被 Google Colab Pro 束缚住了。因此,我不可能在训练数据集时使用多个 GPU。尽管使用了下面的超参数,但由于“CUDA out of Memory”等内存限制,我无法避免错误。

args = TrainingArguments(
    'cuad-roberta',
    evaluation_strategy = "epoch",
    learning_rate=3e-5,
    per_device_train_batch_size=2,
    per_device_eval_batch_size=2,
    num_train_epochs=2,
    weight_decay=0.01,
    save_steps=5000,
    logging_steps=5000,
    save_total_limit=100,
    gradient_accumulation_steps = 12,
    eval_accumulation_steps = 4,
)

在这种情况下,我将我的训练集(80%)分为 4 个部分,每个部分包含 25% 的数据。因此,使用 Transformers 中任何支持问答的预训练模型,我已经训练了前 25% 的训练数据,然后将模型保存在我的驱动器目录中。然后,我从保存的目录中加载了该标记器和模型,并在同一模型上训练了接下来的 25% 的训练数据,如下所示。

tokenizer = AutoTokenizer.from_pretrained('/content/drive/MyDrive/models/cuad-25%-roberta-base')
model = AutoModelForQuestionAnswering.from_pretrained('/content/drive/MyDrive/models/cuad-25%-roberta-base')

我再重复该步骤两次,以完成对整个训练数据的模型训练。

现在,我的问题是,当我有资源限制时,这种方法在训练模型方面是否正确?如果正确,这种方法会损害我的模型的性能吗?我对 ML 和 NLP 比较陌生,所以请考虑任何愚蠢的错误。

此外,任何通过 HuggingFace Transformers 理解、可视化或实施问答任务的资源都会非常有帮助。

标签: pytorchhuggingface-transformerstransformerpre-trained-modelquestion-answering

解决方案


推荐阅读