1

我目前正在写一篇关于 nlp 的研讨会论文,即源代码函数文档的总结。因此,我使用 ca 创建了自己的数据集。64000 个样本(37453 是训练数据集的大小),我想微调 BART 模型。为此,我使用了基于 huggingface 包的 simpletransformers 包。我的数据集是一个熊猫数据框。我的数据集的一个例子:

在此处输入图像描述

我的代码:

train_df = pd.read_csv(train_path, index_col=0)
train_df.rename(columns={'text':'input_text', 'summary':'target_text'}, inplace=True)

# Logging
logging.basicConfig(level=logging.INFO)
transformers_logger = logging.getLogger("transformers")
transformers_logger.setLevel(logging.WARNING)

# Hyperparameters
model_args = Seq2SeqArgs()

model_args.num_train_epochs = 10
# bart-base = 32, bart-large-cnn = 16
model_args.train_batch_size = 16
# model_args.no_save = True
# model_args.evaluate_generated_text = True
model_args.evaluate_during_training = True
model_args.evaluate_during_training_verbose = True

model_args.overwrite_output_dir = True
model_args.save_model_every_epoch = False
model_args.save_eval_checkpoints = False
model_args.save_optimizer_and_scheduler = False
model_args.save_steps = -1
best_model_dir = 'drive/MyDrive/outputs/bart-large-cnn/best_model/'
model_args.best_model_dir = best_model_dir
   
# Initialize model
model = Seq2SeqModel(
    encoder_decoder_type="bart",
    encoder_decoder_name="facebook/bart-base",
    args=model_args,
    use_cuda=True,
)


# Train the model
model.train_model(
    train_df, 
    # eval_data=eval_df, 
    # matches=count_matches,
)

到目前为止一切都很好,但是当我开始训练时出现此错误。

在此处输入图像描述

这是我在 colab 笔记本上运行的错误:

Exception in thread Thread-14:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.7/multiprocessing/pool.py", line 470, in _handle_results
    task = get()
  File "/usr/lib/python3.7/multiprocessing/connection.py", line 251, in recv
    return _ForkingPickler.loads(buf.getbuffer())
  File "/usr/local/lib/python3.7/dist-packages/torch/multiprocessing/reductions.py", line 287, in rebuild_storage_fd
    storage = cls._new_shared_fd(fd, size)
RuntimeError: unable to mmap 1024 bytes from file <filename not specified>: Cannot allocate memory (12)

有人会认为我只是没有足够的内存,但这是我的系统监视器 ca。3 秒。错误后:

在此处输入图像描述

这是我在开始训练和出现错误之间的最低可用内存或空闲内存:

在此处输入图像描述

经过大量调整后,我发现由于某种原因,当我仅使用最大大小的数据集训练模型时,一切正常。21000. 如果我训练 BART 模型的“base”版本或“large-cnn”版本,我不会生气。我只取决于我的数据集的大小。该错误始终发生在“在 cache_dir/ 处从数据集文件创建要素”时。

那么我已经尝试过什么:

  • 我添加了很多交换内存(如您在我的系统监视器的屏幕截图中所见)

  • 将工人人数减少到 1

  • 我将系统打开文件限制 (-n) 的 hard- 和 softmax 增加到 86000

在此处输入图像描述

我也尝试在 google colab notebook 中训练模型,但我遇到了同样的问题;如果数据集大小超过 ca。21000 训练失败。即使我将 colab 会话的内存翻了一番,但仍然保持数据集大小略高于 21000 限制。

桌面:

变形金刚 4.6.0

简单变压器 0.61.4

Ubuntu 20.04.2 LTS

在尝试自己解决这个问题几个星期之后,如果你们中的任何人知道我该如何解决这个问题,我会非常高兴:)

(我知道这个帖子mmap 返回无法分配内存,即使有足够的,即使有足够的不幸也无法解决我的问题。我的 vm.max_map_count 为 860000)

4

2 回答 2

0

虽然我不知道如何直接处理这个问题,但我遇到了一个类似的问题(并解决了)。区别在于:

  • 我使用 fairseq
  • 我可以使用 1 个 GPU 在 google colab 上运行我的代码
  • RuntimeError: unable to mmap 280 bytes from file </torch_40419_282117887>: Cannot allocate memory (12) 当我尝试在多个 GPU 上运行它时立即得到。

从其他人的代码中,我发现他用于python -m torch.distributed.launch -- ...运行 fairseq-train,我将其添加到我的 bash 脚本中,RuntimeError 消失了,训练正在进行中。

所以我想如果你可以运行 21000 个样本,你可以使用 torch.distributed 将整个数据分成小批量并将它们分发给几个工人。

于 2021-06-08T08:10:30.607 回答
0

所以我只是找到了一个简单的解决方法。您可以use_multiprocessing将模型设置为False

model_args.use_multiprocessing = False

现在我可以运行我的整个数据集了。

于 2021-06-14T11:16:29.103 回答