训练时 Pytorch CUDA OutOfMemory 错误

Pytorch CUDA OutOfMemory Error while training

我正在尝试在 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 class。

我尝试了不同的实例类型变体,从 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 机器上使用较小的数据集训练相同的架构,而且速度非常快。

此错误是因为您的 GPU 运行 内存不足。你可以尝试一些事情

  1. 减少训练数据的大小

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

  3. 您也可以尝试减小批量大小

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

解决这个问题:对于这么长的单词的内容,你可以从这些内容的任何部分(left/right/middle anywhere) 和 trunk 其余部分,或者如果比较计数非常小,则忽略这些记录进行训练。

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

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