pytorch - 通过将数据集分成块并再次加载模型,在整个数据集上训练模型,直到训练完数据集的所有块
问题描述
这是我在 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 理解、可视化或实施问答任务的资源都会非常有帮助。
解决方案
推荐阅读
- c# - 您可以从 C# 控制台复制彩色文本吗?
- c# - 在 C# 中反序列化复杂对象
- powershell - 用于跳转到下一个文件夹的 Powershell 命令
- java - 没有可用的“org.springframework.jms.core.JmsTemplate”类型的合格 bean
- javascript - 单击按钮更改背景
- reactjs - 如何以编程方式打开标记集群
- android - 来自画廊的图像未显示在 android 的 pdf 文件中
- c - 如何在拆分部分中链接 IAR 中更密集的代码?
- excel - 输入框避免空白条目
- javascript - 什么 VM9:7146 crbug/1173575,非 JS 模块文件已弃用。(匿名)@ VM9:7146 错误意味着在 express js 中?我该如何解决?