如何减少专用GPU内存的使用并为CUDA和Pytorch使用共享GPU内存

cbjzeqam  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(207)

当我尝试使用huggingface模型进行情感分析时,我得到了以下错误:

RuntimeError: CUDA out of memory. Tried to allocate 72.00 MiB (GPU 0; 3.00 GiB total capacity; 1.84 GiB already allocated; 5.45 MiB free; 2.04 GiB reserved in total by PyTorch)

字符串
虽然我没有使用CUDA内存,但它仍然保持在同一水平。

的数据
我尝试使用torch.cuda.empty_cache(),但它没有影响问题。当我关闭jupyter笔记本时,它减少到0。所以我很确定这是pytorch和python的东西。
下面是我的代码:

import joblib
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification,pipeline
import torch.nn.functional as F
from torch.utils.data import DataLoader
import pandas as pd
import numpy as np
from tqdm import tqdm

tokenizer = AutoTokenizer.from_pretrained("savasy/bert-base-turkish-sentiment-cased")
model = AutoModelForSequenceClassification.from_pretrained("savasy/bert-base-turkish-sentiment-cased")

sa= pipeline("sentiment-analysis", tokenizer=tokenizer, model=model,device=0)
batcher = DataLoader(dataset=comments,
                      batch_size=100,
                      shuffle=True,
                      pin_memory=True)
predictions= []
for batch in tqdm(batcher):
     p = sa(batch)
     predictions.append(p)


我有一个GTX 1060,Python 3.8和torch==1.7.1,我的操作系统是Windows 10。评论数为187K。我想知道是否有任何工作围绕这个内存问题。也许在CPU上以某种方式保存Tensor,只在GPU上使用批处理。使用并获得此错误后,内存使用仍在继续。当我合上我的jupyter笔记本它就消失了。有什么办法能让我清除这段记忆吗?有什么方法可以使用共享GPU内存吗?

8e2ybdfx

8e2ybdfx1#

如何减少专用GPU内存的使用并为CUDA和Pytorch使用共享GPU内存
简短回答:你不能。
详细信息:我相信this answer涵盖了您需要的所有信息。
您可以通过降低批量大小来减少内存使用量,@John Stud评论说,或者使用自动混合精度,@德怀特Foster建议。
在训练时,您可以实施梯度累积以减少批次大小而不影响性能。

nzkunb0c

nzkunb0c2#

简短回答:不,我不知道
我确实遇到了这个问题,但这是我的选择。我想检查GPU的最大训练容量。先说重要的事

  • 在启动新的训练之前,检查是否已重新启动内核。除非明确删除,否则复制的项将保留在GPU内存中。只有当内核重新启动或显式清除时,它们才会被清除

下一个检查表

  • 学习率。较小的学习率将使用更多的内存。第一个月
  • 批量大小。大批量和低学习率=更多内存。
优化

你的记忆力很差,比如。3GB。共享内存在这里不适用,它是自动管理的。要在GPU上训练,Tensor必须位于GPU内存中,共享内存是系统内存。

我发现使用更多的内存并不意味着你的训练会更快完成。这取决于你的超参数和CUDA核心的速度。

推理

因为你只用于预测,你也可以尝试CPU推理,并使用system memory在这里你使用数据加载器这样。

torch.utils.data.DataLoader(dataset=comments, \
                                           batch_size=batch_size, \
                                           shuffle=True \
                                           num_workers=num_workers)
# where num_workers is defined like this
import multiprocessing
num_workers = multiprocessing.cpu_count()

字符串

参考资料

https://superuser.com/questions/1416540/what-is-shared-gpu-memory-and-how-is-total-gpu-memory-calculated-windows-10
Shared memory来自pytorch论坛,具体见回复。https://discuss.pytorch.org/t/what-is-the-shared-memory/112212/8

dsekswqp

dsekswqp3#

共享GPU(通常不是NVIDIA的)与专用GPU不同。CUDA仅适用于NVIDIA的GPU。
不过,你可以尝试DirectML(用于英特尔共享GPU),它可以帮助你在共享GPU上工作,而不是专用GPU。

相关问题