训练时 Pytorch CUDA OutOfMemory 错误

Posted

技术标签:

【中文标题】训练时 Pytorch CUDA OutOfMemory 错误【英文标题】:Pytorch CUDA OutOfMemory Error while training 【发布时间】:2020-12-06 00:37:13 【问题描述】:

我正在尝试在 AWS Sagemaker 中训练 PyTorch FLAIR 模型。 这样做时出现以下错误:

RuntimeError: CUDA out of memory. Tried to allocate 84.00 MiB (GPU 0; 11.17 GiB total capacity; 9.29 GiB already allocated; 7.31 MiB free; 10.80 GiB reserved in total by PyTorch)

对于训练,我使用了 sagemaker.pytorch.estimator.PyTorch 类。

我尝试了从 ml.m5、g4dn 到 p3 的不同实例类型变体(即使是 96GB 内存)。 在 ml.m5 中出现 CPUmemoryIssue 错误,在 g4dn 中出现 GPUMemoryIssue 以及在 P3 中出现 GPUMemoryIssue 主要是因为 Pytorch 仅使用 8*12GB 中的 12GB GPU 之一。

没有得到任何地方来完成这个训练,即使在本地尝试使用 CPU 机器并得到以下错误:

RuntimeError: [enforce fail at ..\c10\core\CPUAllocator.cpp:72] data. DefaultCPUAllocator: not enough memory: you tried to allocate 67108864 bytes. Buy new RAM!

模型训练脚本:

    corpus = ClassificationCorpus(data_folder, test_file='../data/exports/val.csv', train_file='../data/exports/train.csv')
                                          
    print("finished loading corpus")

    word_embeddings = [WordEmbeddings('glove'), FlairEmbeddings('news-forward-fast'), FlairEmbeddings('news-backward-fast')]

    document_embeddings = DocumentLSTMEmbeddings(word_embeddings, hidden_size=512, reproject_words=True, reproject_words_dimension=256)

    classifier = TextClassifier(document_embeddings, label_dictionary=corpus.make_label_dictionary(), multi_label=False)

    trainer = ModelTrainer(classifier, corpus, optimizer=Adam)

    trainer.train('../model_files', max_epochs=12,learning_rate=0.0001, train_with_dev=False, embeddings_storage_mode="none")

P.S.:我能够在具有 4GB GTX 1650 DDR5 内存的本地 GPU 机器上用更小的数据集训练相同的架构,而且速度非常快。

【问题讨论】:

我猜重点是:“一个较小的数据集”。 是的,我也是这么想的,但是记录差在1000条左右,仅此而已.. 不,重点是“相似的架构”。微小的变化可能会产生很大的影响。 对不起,我误导了,它实际上是相同的架构模型。只是不同的是数据集也有 4000 对 5000 条记录。重点是,我认为问题在于 Sagemaker 培训,在本地同样可以使用不错的 GPU 运行,只是我没有那种基础设施。你能帮我解决这个问题,以便在 Sagemaker 中训练模型吗? 【参考方案1】:

此错误是因为您的 GPU 内存不足。您可以尝试一些方法

    减少训练数据的大小

    减小模型的大小,即隐藏层的数量或深度

    您也可以尝试减小 Batch 大小

【讨论】:

减少 batch_size 我已经尝试过,对于其他部分,相同的模型在我的本地机器上运行,内存为 4GB GTX 1650,但无法在 AWS Sagemaker 上的 96GB Nividia K88 上运行。我认为在 Sagemaker 中训练 Pytorch 模型时我还缺少其他东西。您是否在 AWS Sagemaker 中训练过任何模型,能否分享一下 samw 的训练代码?【参考方案2】:

好的,经过2天的不断调试,终于找到了根本原因。 我的理解是Flair对句子长度没有任何限制,从字数的意义上讲,它是以最高长度的句子为最大值。 所以这引起了问题,因为在我的情况下,只有 15 万行的内容很少,这对于将嵌入加载到内存中来说太多了,即使是 16GB 的 GPU。 所以它在那里破裂了。

解决这个问题:对于包含这么长单词的内容,您可以从任何部分(左/右/中间任何地方)的此类内容中提取 n 个单词(在我的情况下为 10K) ) 并将其余部分作为主干,或者如果比较计数非常少,则直接忽略这些训练记录。

在此之后,我希望你能够在训练中取得进步,就像我的情况一样。

P.S.:如果您正在关注此主题并遇到类似问题,请随时发表评论,以便我可以探索并帮助您解决问题。

【讨论】:

以上是关于训练时 Pytorch CUDA OutOfMemory 错误的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch在GPU上训练模型

pytorch 多卡训练,模型保存的一些问题

pytorch 多卡训练,模型保存的一些问题

pytorch代码中同时包含训练和测试代码时显存爆炸

pytorch 多GPU 训练

在GPU上训练PyTorch代码