微调GPT-2(HuggingFace)时解决“CUDA out of memory”

问题描述 投票:0回答:1

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.