当前位置:   article > 正文

解决:RuntimeError: CUDA out of memory. Tried to allocate 2.00 MiB_tried to allocate 小于 mib free

tried to allocate 小于 mib free

有文章说:减小batch_size 解决。但是减小到4还是解决不了。

上一篇文章CSDN:说with torch.no_grad(),就是不生成计算图。计算结果没有差异。

但是!!!对于计算机资源的占用却有差异!不生成计算图,GPU就会小很大的负担

如图,bath_size = 4,依然报错

在for i,(data,labels)  in enumerate(data)前加上这句代码:顺利执行。同时,batch_size取到128也照样可以运行。

所以出现此错误,不是单纯减小batch_size()这么简单。

参考:【E-02】内存不足RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 2.00 GiB total capacity; 1.34 GiB already allocated; 14.76 MiB free; 1.38 GiB reserved in total by PyTorch) - 忆凡人生 - 博客园

----------------------------更新--------------------------

经过一段时间的学习,现在遇到了预训练模型与微调。对with torch.no_grad()有了新的认识。

将与训练模型用于下游任务有如下几个中点:

1.构建token

2.修改模型

3.fine-turning模型

比如,我们利用bert-base-chinese做分类任务,

首先加载预训练模型

  1. from transformers import AutoModel
  2. model = AutoModel.from_pretrained('ckiplab/bert-base-chinese')

然后修改模型,加入用于不同下游任务的输出层

  1. class Model(torch.nn.Module):
  2. def __init__(self):
  3. super().__init__()
  4. self.pretrained = AutoModel.from_pretrained('ckiplab/bert-base-chinese')
  5. self.fc = torch.nn.Linear(768,2) # 为模型添加新的结构 输出层 2分类任务
  6. def forward(self, input_ids, labels):
  7. with torch.no_grad(): # 原来的与训练模型不用更新参数
  8. out = self.pretrained(ipythonput_ids) # 原始预训练模型输出结果
  9. out = self.fc(out.last_hidden_state[:,0]) # 放入下游具体任务的输出层中
  10. out = out.softmax(dim = 1) # 并进行softmax操作
  11. reture out # 才是最终的二分类输出结果
  12. model = Model()

在这里通过with torch.no_grad():在更新梯度的时候,就可以避开原来预训练好的模型。也就是说冻结元模型参数

或者通过如下操作也可以实现

  1. class Model(torch.nn.Module):
  2. def __init__(self):
  3. super().__init__()
  4. self.pretrained = AutoModel.from_pretrained('ckiplab/bert-base-chinese')
  5. self.fc = torch.nn.Linear(768,2) # 为模型添加新的结构 输出层 2分类任务
  6. def forward(self, input_ids, labels):
  7. for param in self.pretrained.parameters(): # 冻结元模型参数
  8. param.requires_grad_(False)
  9. out = self.pretrained(ipythonput_ids) # 原始预训练模型输出结果
  10. out = self.fc(out.last_hidden_state[:,0]) # 放入下游具体任务的输出层中
  11. out = out.softmax(dim = 1) # 并进行softmax操作
  12. reture out # 才是最终的二分类输出结果
  13. model = Model()

而对于with torch.no_grad()  和   param.requires_grad_(False)  的区别,可以参考:什么时候该用with torch.no_grad()?什么时候该用.requires_grad ==False?_Y. F. Zhang的博客-CSDN博客

但我还没搞懂他们的区别。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号