无法映射 1024 字节 - 无法分配内存 - 即使有足够多的 ram

unable to mmap 1024 bytes - Cannot allocate memory - even though there is more than enough ram

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

我的代码:

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 模型的“基础”版本或“large-cnn”版本,我并不生气。我只取决于我的数据集的大小。该错误总是发生在“在 cache_dir/ 从数据集文件中创建特征”时间。

所以我已经尝试了什么:

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

桌面:

变形金刚 4.6.0

简单变形金刚 0.61.4

ubuntu 20.04.2 LTS

在尝试了数周自己解决这个问题之后,如果你们中的任何人知道我如何解决这个问题,我将非常高兴:)

(我知道这个 post mmap returns can not allocate memory, even though there is enough 尽管不幸的是它不能解决我的问题。我的 vm.max_map_count 在 860000)

虽然我不知道如何直接处理这个问题, 我有一个有点类似的问题(并解决了)。区别是:

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

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

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

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

model_args.use_multiprocessing = False

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