Python 用系统RAM代替GPU存储器的GPU神经网络

Python 用系统RAM代替GPU存储器的GPU神经网络,python,deep-learning,neural-network,pytorch,Python,Deep Learning,Neural Network,Pytorch,我使用PyTorch构建了一个基本的聊天机器人,在训练代码中,我将神经网络和训练数据都移动到了gpu。但是,当我运行该程序时,它会占用我最多2GB的ram。使用的gpu内存很少,但没有那么多。当我运行相同的程序时,但这次是在cpu上运行,它只占用我大约900mb的ram。 谁能告诉我为什么会这样?我附上了我的代码,以及一些截图。 很抱歉,如果答案很明显,我对深度学习还不熟悉 我的代码: 导入火炬 导入torch.nn作为nn 从torch.utils.data导入数据集,数据加载器 将numpy

我使用PyTorch构建了一个基本的聊天机器人,在训练代码中,我将神经网络和训练数据都移动到了gpu。但是,当我运行该程序时,它会占用我最多2GB的ram。使用的gpu内存很少,但没有那么多。当我运行相同的程序时,但这次是在cpu上运行,它只占用我大约900mb的ram。 谁能告诉我为什么会这样?我附上了我的代码,以及一些截图。 很抱歉,如果答案很明显,我对深度学习还不熟悉

我的代码:

导入火炬
导入torch.nn作为nn
从torch.utils.data导入数据集,数据加载器
将numpy作为np导入
从nltk_utils导入标记器、词干、单词包
作为pd进口熊猫
装置=火炬装置(“cuda”)
#神经网络
神经网络类(nn.模块):
def_uuuinit_uuu(self、input_size、hidden_size、num_类):
super()。\uuuu init\uuuuu()
self.l1=nn.Linear(输入大小、隐藏大小)
self.l2=nn.Linear(隐藏大小,隐藏大小)
self.l3=nn.Linear(隐藏大小、隐藏大小)
self.l4=nn.Linear(隐藏大小,数量类)
self.relu=nn.relu()
def前进(自身,x):
out=self.relu(self.l1(x))
out=self.relu(self.l2(out))
out=self.relu(self.l3(out))
out=自身l4(out)
返回
#数据初始化
数据=pd.read\u csv(“路径到列车数据”)
data=data.dropna(轴=0)
allwords=[]
标记列表=[]
xy=[]
ignorewords=[“?”,“!”,“,”,“,”]
扩展(如果x不在标记列表中,则x代表数据[“标记”]中的x)
#发展词汇
对于数据[“模式”]中的x:
w=标记器(x)
allwords.extend(如果y不在ignorewords中,则y在w中的词干(y)表示y)
#制作训练数据
对于indx,枚举中的x(数据[“模式”]):
w=标记器(x)
bag=一袋一袋的单词(w,所有单词)
tag=taglist.index(数据[“tag”].iloc[indx])
xy.附加((包、标签))
xtrain=np.array([x[0]表示xy中的x])
ytrain=np.数组([x[1]表示xy中的x])
类TestDataset(数据集):
定义初始化(自):
self.num_classes=len(xtrain)
self.xdata=torch.from_numpy(xtrain.astype(np.float32))
self.ydata=torch.from_numpy(ytrain.astype(np.float32))
定义uu获取项目uu(自身,索引):
返回self.xdata[index],self.ydata[index]
定义(自我):
返回self.num_类
dataset=TestDataset()
列车数据=数据加载器(数据集=数据集,
批次大小=8,
洗牌=正确,
工人数量=0,
引脚(内存=真)
inputSize=len(xtrain[0])
hiddenSize=32
outputSize=len(标记列表)
型号=神经网络(inputSize、hiddenSize、outputSize)。到(设备)
标准=nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters())
纪元=5000
对于范围内的历元(历元):
对于列车_数据中的(文字、标签):
字=字。到(设备)
标签=标签.类型(火炬.传感器)
标签=标签。到(设备)
y_pred=模型(单词)
损失=标准(y_pred,标签)
optimizer.zero\u grad(将\u设置为\u none=True)
loss.backward()
optimizer.step()
使用手电筒。无梯度()
如果(历元+1)%10==0:
打印(f“epoch:{epoch+1},丢失:{loss:.30f}”)
在GPU上运行时: ,

在CPU上运行时:

RAM是数据堆叠的地方,然后这些堆叠被传输到SRAM或其他称为缓存的地方,这是离CPU最近的内存(称为主机)。为系统选择RAM内存的一般规则被视为等同于或大于GPU内存

例如:如果GPU内存为8GB,则需要8GB或更大的RAM以确保最佳性能

因此,当在GPU(称为设备)上运行时,您的数据将直接传输到GPU以执行张量运算。但在CPU上,它不能执行并行计算,因此使用较少的RAM内存

您可以尝试使用不同的批处理单元大小,并观察RAM的使用情况。请注意,如果您的批数据不适合GPU内存,您将看到CUDA内存不足错误