Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有定制层的PyTorch网络在CPU上运行良好,但在移动到GPU时获得CUDAerrorillegaAddress_Python_Tensorflow_Pytorch - Fatal编程技术网

Python 带有定制层的PyTorch网络在CPU上运行良好,但在移动到GPU时获得CUDAerrorillegaAddress

Python 带有定制层的PyTorch网络在CPU上运行良好,但在移动到GPU时获得CUDAerrorillegaAddress,python,tensorflow,pytorch,Python,Tensorflow,Pytorch,我正在尝试实现我自己版本的 定制的GAT层如下所示 类网关层(nn.Module): 定义初始(自,输入尺寸:int,输出尺寸:int,调整:火炬张量): super()。\uuuu init\uuuuu() self.W=nn.Parameter(火炬零点(大小=(输出尺寸,输入尺寸))) self.a=nn.Parameter(torch.zero(大小=(2*输出尺寸))) self.形容词 self.n_点=调整形状[0] #打印(f“输入尺寸:{input_dim}”) def向前(自

我正在尝试实现我自己版本的

定制的GAT层如下所示

类网关层(nn.Module):
定义初始(自,输入尺寸:int,输出尺寸:int,调整:火炬张量):
super()。\uuuu init\uuuuu()
self.W=nn.Parameter(火炬零点(大小=(输出尺寸,输入尺寸)))
self.a=nn.Parameter(torch.zero(大小=(2*输出尺寸)))
self.形容词
self.n_点=调整形状[0]
#打印(f“输入尺寸:{input_dim}”)
def向前(自身,h:火炬张量):
B、 T,N,F=h.尺寸()
hh=函数线性(h,self.W)
输出=火炬。零度(hh)
对于范围内的i(自身n_点):
#印刷品(一)
hhj=hh[:,:,self.adj[i],:]
hhi=torch.cat([hh[:,:,i:i+1,:]]*hhj.size(2,2)
hhij=torch.cat([hhi,hhj],3)
e=焊炬.mm(hhij.整形(B*T*hhj.尺寸(2),-1),自a.整形(自a.尺寸(0,1))。整形(B,T,-1)
alpha=功能性.softmax(e,dim=2)
输出[:,:,i,:]=torch.sum(hhj*torch.cat([torch.unsqueze(alpha,3)]*hhj.size(3,3),dim=2)
返回输出
整个网络定义为:

类AQIP(nn.模块):
定义初始值(self,adj:torch.tensor,seq_len:int,带_aqi:bool=True):
super()。\uuuu init\uuuuu()
self.hid_size=128
self.seq_len=seq_len
self.gat_层=[
GATLayer(输入尺寸=16+int(带aqi),输出尺寸=128,调整=adj),
GATLayer(输入尺寸=128,输出尺寸=128,调整=调整),
]
self.rnns=[
nn.LSTM(输入大小=128,隐藏大小=128,层数=4,偏差=真,批次第一=真),
]
self.linear=nn.linear(输入特征=128*4,输出特征=1,偏差=True)
def向前(自身,x:torch.Tensor,site_idx:int):
h=火炬零点(尺寸=(4,x.size(0),128))
c=火炬零点(尺寸=(4,x.size(0),128))
对于self.gat_层中的gat:
x=gat(x)
对于self.rnns中的rnn:
x[:,:,site_idx,:],(h,c)=rnn(x[:,:,site_idx,:],(h,c))
h=h.permute(1,0,2)
h=h.重塑(h.尺寸(0),-1)
返回self.linear(h.squence)()
当我用下面的代码独立测试定制的GAT层时,结果表明,即使在GPU上,GAT层也工作得很好

model=GATLayer(3,1024,torch.tensor(np.array([[1,0,1],[0,0,1],[1,0,1]],dtype='bool'))
device=torch.device(“如果torch.cuda.is可用,则cuda:0(),否则为“cpu”)
模型=模型到(设备)
印刷品(型号(火炬号(5,5,3,3)).形状)
它输出
torch.Size([5,5,3,1024])

当我用CPU和下面的代码测试整个网络时,它也工作得很好

#device=torch.device(“如果torch.cuda.is可用,则cuda:0(),否则为“cpu”)
adj=火炬张量(np.数组([[1,0,0],[0,1,1],[1,1,1]],dtype=“bool”))
exp=torch.randn(3,8,3,17)
GPU=[0]
型号=AQIP(调整,序号=8)
#model=model.to(设备,非阻塞=True)
打印(模型(实验1))
它输出
张量([-0.0320,-0.0320,-0.0320],梯度fn=)

但是,只要我尝试将模型移动到GPU,并对设备和行进行反注释,我就会得到以下错误,可以追溯到与我的代码无关的格式化程序类:

RuntimeError: copy_if failed to synchronize: cudaErrorIllegalAddress: an illegal memory access was encountered
使用
CUDA\u LAUNCH\u BLOCKING=1运行代码时,我得到:

RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)`
这根本不能帮助我定位错误


我也曾在同一台机器上运行过官方示例,并尝试将它们移动到GPU,结果证明它们都工作得很好。所以我想这不是关于CUDA和Cudnn或者GPU驱动程序版本不兼容的问题。但我也无法在代码中找到问题所在。请帮忙!如果你能帮我摆脱困境,我将不胜感激。

经过无数努力,我终于找到了问题所在。事实证明,若你们把图层放到列表中,就像

self.gat\u层=[
GATLayer(输入尺寸=16+int(带aqi),输出尺寸=128,调整=adj).cuda(),
GATLayer(输入尺寸=128,输出尺寸=128,调整=adj).cuda(),
]
然后PyTorch将不会自动识别这些层,因此当调用
.to(device)
时,它们的参数将不会传输到GPU。因此,解决方案之一是逐个声明层

而更好的解决方案是使用
nn.ModuleList
来包含您想要的所有层,这样代码就可以更改为

self.gat\u layers=nn.ModuleList([
GATLayer(输入尺寸=16+int(带aqi),输出尺寸=128,调整=adj).cuda(),
GATLayer(输入尺寸=128,输出尺寸=128,调整=adj).cuda(),
])

任何想法都有帮助!!