Machine learning 如何使python中的自定义代码在使用Pytorch张量和矩阵函数时利用GPU

Machine learning 如何使python中的自定义代码在使用Pytorch张量和矩阵函数时利用GPU,machine-learning,pytorch,gpu,cnn,Machine Learning,Pytorch,Gpu,Cnn,我用Pytorch张量和矩阵运算函数从头创建了一个CNN,希望能利用GPU。令我惊讶的是,GPU的利用率保持在0%,我的训练似乎并不比在cpu上运行快 培训前: 培训时: 我已经仔细检查了CUDA是否可用,并且已经安装了它 图形卡:Nvidia GEFORCE 2070 SUPER 处理器:英特尔i5 10400 编码环境:Jupyter笔记本 Cuda和Cudnn版本:11.0 Pytorch版本:1.6.0您必须使用 model.cuda() # and x = x.cuda()

我用Pytorch张量和矩阵运算函数从头创建了一个CNN,希望能利用GPU。令我惊讶的是,GPU的利用率保持在0%,我的训练似乎并不比在cpu上运行快

培训前:

培训时:

我已经仔细检查了CUDA是否可用,并且已经安装了它

图形卡:Nvidia GEFORCE 2070 SUPER

处理器:英特尔i5 10400

编码环境:Jupyter笔记本

Cuda和Cudnn版本:11.0


Pytorch版本:1.6.0

您必须使用

model.cuda()
# and 
x = x.cuda()
y = y.cuda()
你似乎是在向前和向后的召唤中这样做的。为了确保模型将继续运行到GPU,请使用shell命令持续监视GPU的使用情况


watch-n 5 nvidia smi

您必须使用

model.cuda()
# and 
x = x.cuda()
y = y.cuda()
你似乎是在向前和向后的召唤中这样做的。为了确保模型将继续运行到GPU,请使用shell命令持续监视GPU的使用情况

watch-n5英伟达smi

怪异,怪异。。。 我尝试了你上面粘贴的代码

因为我没有w1.pt,w2.pt。。。文件中,我注释掉了这些行,并取消了它们上面的行的注释(那些在权重和偏差中放置randn和零的行),以便尝试。我说得对吗

结果是崩溃:“非法指令(内核转储)”(在linux上,torch 1.6.0,python3.7) 因为在GPU上运行,所以信息不是很丰富。当设置为在cpu上运行时,它也会崩溃,但错误消息现在提供了更多信息。在控制台输出下面:

torch.Size([500])
500
epoch:  0
Traceback (most recent call last):
  File "not_on_gpu.py", line 476, in <module>
    loss = model(x, y)
  File "not_on_gpu.py", line 60, in __call__
    x = l(x)
  File "not_on_gpu.py", line 15, in __call__
    self.out = self.forward(*args)
  File "not_on_gpu.py", line 112, in forward
    self.out = diff_dim_inp@self.w + self.b
RuntimeError: size mismatch, m1: [10 x 1024], m2: [3136 x 1024] at /pytorch/aten/src/TH/generic/THTensorMath.cpp:41
火炬尺寸([500])
500
纪元:0
回溯(最近一次呼叫最后一次):
文件“not_on_gpu.py”,第476行,在
损耗=型号(x,y)
文件“not_on_gpu.py”,第60行,在调用中__
x=l(x)
文件“not_on_gpu.py”,第15行,在调用中__
self.out=self.forward(*args)
文件“not_on_gpu.py”,第112行,向前
self.out=diff_dim_inp@self.w+self.b
运行时错误:大小不匹配,m1:[10 x 1024],m2:[3136 x 1024]at/pytorch/aten/src/TH/generic/THTensorMath.cpp:41
所以我在Lin类的“正向”方法中打印了张量大小 (就在“self.out=diff_dim”之前_inp@self.w+self.b“声明)

下面是我得到的:

它们的顺序如下:diff_dim_inp.shape | self.w.shape | self.b.shape


第一层:[103136]|[31361024]|[1024]怪异,怪异。。。 我尝试了你上面粘贴的代码

因为我没有w1.pt,w2.pt。。。文件中,我注释掉了这些行,并取消了它们上面的行的注释(那些在权重和偏差中放置randn和零的行),以便尝试。我说得对吗

结果是崩溃:“非法指令(内核转储)”(在linux上,torch 1.6.0,python3.7) 因为在GPU上运行,所以信息不是很丰富。当设置为在cpu上运行时,它也会崩溃,但错误消息现在提供了更多信息。在控制台输出下面:

torch.Size([500])
500
epoch:  0
Traceback (most recent call last):
  File "not_on_gpu.py", line 476, in <module>
    loss = model(x, y)
  File "not_on_gpu.py", line 60, in __call__
    x = l(x)
  File "not_on_gpu.py", line 15, in __call__
    self.out = self.forward(*args)
  File "not_on_gpu.py", line 112, in forward
    self.out = diff_dim_inp@self.w + self.b
RuntimeError: size mismatch, m1: [10 x 1024], m2: [3136 x 1024] at /pytorch/aten/src/TH/generic/THTensorMath.cpp:41
火炬尺寸([500])
500
纪元:0
回溯(最近一次呼叫最后一次):
文件“not_on_gpu.py”,第476行,在
损耗=型号(x,y)
文件“not_on_gpu.py”,第60行,在调用中__
x=l(x)
文件“not_on_gpu.py”,第15行,在调用中__
self.out=self.forward(*args)
文件“not_on_gpu.py”,第112行,向前
self.out=diff_dim_inp@self.w+self.b
运行时错误:大小不匹配,m1:[10 x 1024],m2:[3136 x 1024]at/pytorch/aten/src/TH/generic/THTensorMath.cpp:41
所以我在Lin类的“正向”方法中打印了张量大小 (就在“self.out=diff_dim”之前_inp@self.w+self.b“声明)

下面是我得到的:

它们的顺序如下:diff_dim_inp.shape | self.w.shape | self.b.shape



第一层:[103136]|[31361024]|[1024]在运行代码时,检查另一终端内部的命令
nvidia smi
。可能是您的代码使用的GPU太少。使用nvidia smi最好检查DL型号的GPU使用情况。在运行您所说的命令后,我看不到我的GPU正在使用。我已经在上面的问题中添加了命令结果,请查看。在GPU utlilization图形中,有一个写的3D,这意味着图形仅显示3D用途而不是CUDA,有一个带有3D用途的向下箭头,将其更改为CUDA,您将能够看到CUDA的用途。@Mughees是的,现在我可以看到cuda的使用率,在训练时约为27%。谢谢你指出这一点。但我的训练批量是1000,它怎么能只使用27%的cuda核心?计算一个批的正向和反向传播几乎需要一个小时左右的时间。在你的代码中,所有的类都在CPU上,这就是为什么有人在使用CPU。Pytorch从后端实现GPU利用率。当类继承
torch.nn.Module
类时,
.cuda
将起作用。运行代码时,在另一个终端内检查命令
nvidia smi
。可能是您的代码使用的GPU太少。使用nvidia smi最好检查DL型号的GPU使用情况。在运行您所说的命令后,我看不到我的GPU正在使用。我已经在上面的问题中添加了命令结果,请查看。在GPU utlilization图形中,有一个写的3D,这意味着图形仅显示3D用途而不是CUDA,有一个带有3D用途的向下箭头,将其更改为CUDA,您将能够看到CUDA的用途。@Mughees是的,现在我可以看到cuda的使用率,在训练时约为27%。谢谢你指出这一点。但我的训练批量是1000,它怎么能只使用27%的cuda核心?计算一个批的正向和反向传播几乎需要一个小时左右的时间。在你的代码中,所有的类都在CPU上,这就是为什么有人在使用CPU。Pytorch从后端实现GPU利用率。