【问题标题】:Solving "CUDA out of memory" when fine-tuning GPT-2 (HuggingFace)微调 GPT-2 (HuggingFace) 时解决“CUDA out of memory”
【发布时间】:2022-04-27 20:13:59
【问题描述】:

在使用 HuggingFace Transformers 库微调 GPT-2 模型时,我再次出现 CUDA 内存不足错误,尽管我的 GPU 容量为 6 GB,但我认为这应该足够了对文本进行微调。错误内容如下:

File "GPT\lib\site-packages\torch\nn\modules\module.py", line 1102, in _call_impl
    return forward_call(*input, **kwargs)
  File "GPT\lib\site-packages\transformers\modeling_utils.py", line 1763, in forward
    x = torch.addmm(self.bias, x.view(-1, x.size(-1)), self.weight)
RuntimeError: CUDA out of memory. Tried to allocate 144.00 MiB (GPU 0; 6.00 GiB total capacity; 4.28 GiB already allocated; 24.50 MiB free; 4.33 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

我已经将批量大小设置为低至 2,并减少了训练示例但没有成功。我还尝试将代码迁移到 Colab,在那里 12GB RAM 很快就被消耗掉了。 我的例子很长,有 2.400 个字符,但它们应该被模型自动截断。我的(德语)示例如下所示:

 Er geht in fremde Wohnungen, balgt sich mit Freund und Feind, ist
zudringlich zu unsern Sämereien und Kirschen.  Wenn die Gesellschaft nicht groß
ist, lasse ich sie gelten und streue ihnen sogar Getreide.  Sollten sie hier
aber doch zu viel werden, so hilft die Windbüchse, und sie werden in den
Meierhof hinabgescheucht.  Als einen bösen Feind zeigte sich der Rotschwanz.  Er
flog zu dem Bienenhause und schnappte die Tierchen weg.  Da half nichts, als ihn
ohne Gnade mit der Windbüchse zu töten.

 Ich wollte
Ihnen mein Wort halten, liebe Mama, aber die Versuchung war zu groß.  Da bin ich
eines Abends in den Keller gegangen und hab' aus allen Fässern den Spund
herausgeklopft.  Bis auf den letzten Tropfen ist das Gift ausgeronnen aus den
Fässern.  Der Schade war groß, aber der Teufel war aus dem Haus. «

Andor lachte.  »Mama, das Geschrei hätten Sie hören sollen! Als ob der
Weltuntergang gekommen wäre. Er bedauerte beinahe seine
Schroffheit.  Nun, nachlaufen wird er ihnen nicht, die werden schon selber
kommen.  Aber bewachen wird er seine Kolonie bei Tag und bei Nacht lassen
müssen.  Hol' der Teufel diesen Mercy.  Muß der gerade in Högyész ein Kastell
haben.  Wenn einer von den Schwarzwäldern dahin kommt und ihn verklagt.

可能是数据格式有问题吗? 如果有人对如何解决这个问题有任何提示,那将是非常受欢迎的。

编辑:谢谢Timbus Calin 的回答,我在评论中描述了将 block_size 标志添加到 config.json 是如何解决问题的。以下是整个配置供参考:

{
    "model_name_or_path": "dbmdz/german-gpt2",
    "train_file": "Fine-Tuning Dataset/train.txt",
    "validation_file": "Fine-Tuning Dataset/test.txt",
    "output_dir": "Models",
    "overwrite_output_dir": true,
    "per_device_eval_batch_size": 8,
    "per_device_train_batch_size": 8,
    "block_size": 100, 
    "task_type": "text-generation",
    "do_train": true,
    "do_eval": true
}

【问题讨论】:

    标签: python nlp pytorch huggingface-transformers gpt-2


    【解决方案1】:
    1. 如果内存问题仍然存在,您可以选择 DistillGPT2,因为它的参数减少了 33% 网络(前向传播速度也快了一倍)。特别是对于像 6GB VRAM 这样的小型 GPU 内存,它可以 成为您问题的解决方案/替代方案。
    2. 同时,这取决于您如何预处理数据。的确, 该模型能够“接收”最大长度的N 令牌 (例如 512/768)取决于您选择的型号。我 最近训练了一个命名实体识别模型和模型 最大长度为768 令牌。但是,当我手动设置 我的 PyTorch DataLoader() 中填充标记的尺寸到很大 号,我也得到了 OOM 内存(even on 3090 24GB VRAM)。当我减少 令牌的维度要小得多(512 而不是 768 例如)培训开始工作,我没有得到 内存不足的任何问题。

    TLDR:在预处理阶段减少令牌数量,无论网络的最大容量如何,也可以帮助解决您的记忆问题。

    请注意,减少要在序列中处理的令牌数量与令牌的维度不同。

    【讨论】:

    • 感谢您的详细解答。您检查输入令牌大小的第二个建议解决了这个问题。在微调 GPT-2 语言模型时,config.json 中有一个标志 block_size,我现在将其设置为 100(默认值为 1024)。这将输入分成每批 100 个令牌,然后即使使用 6GB VRAM 也可以进行处理。我将完整的配置添加到我的原始答案中,以帮助有类似问题的任何人。
    • 我真的很高兴解决了你的问题,这让我很开心。
    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 2019-06-19
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2012-01-26
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多