具有自定义层的PyTorch网络在CPU上工作正常,但移至GPU时会得到cudaErrorIllegalAddress

朱原昊

我正在尝试实现自己的Graph-Attention-network版本

定制的GAT层如下

class GATLayer(nn.Module):
    def __init__(self, input_dim: int, output_dim: int, adj: torch.tensor):
        super().__init__()
        self.W = nn.Parameter(torch.zeros(size=(output_dim, input_dim)))
        self.a = nn.Parameter(torch.zeros(size=(2 * output_dim,)))
        self.adj = adj
        self.n_points = adj.shape[0]
        #print(f"input dim:{input_dim}")

    def forward(self, h: torch.Tensor):
        B, T, N, F = h.size()
        hh = functional.linear(h, self.W)
        output = torch.zeros_like(hh)
        for i in range(self.n_points):
          #  print(i)
            hhj = hh[:, :, self.adj[i], :]
            hhi = torch.cat([hh[:, :, i:i + 1, :]] * hhj.size(2), 2)
            hhij = torch.cat([hhi, hhj], 3)
            e = torch.mm(hhij.reshape(B * T * hhj.size(2), -1), self.a.reshape(self.a.size(0), 1)).reshape(B, T, -1)
            alpha = functional.softmax(e, dim=2)
            output[:, :, i, :] = torch.sum(hhj * torch.cat([torch.unsqueeze(alpha, 3)] * hhj.size(3), 3), dim=2)
        return output

整个网络定义为:

class AQIP(nn.Module):
    def __init__(self, adj: torch.tensor, seq_len: int, with_aqi: bool = True):
        super().__init__()
        self.hid_size = 128
        self.seq_len = seq_len
        self.gat_layers = [
            GATLayer(input_dim=16 + int(with_aqi), output_dim=128, adj=adj),
            GATLayer(input_dim=128, output_dim=128, adj=adj),
        ]
        self.rnns = [
            nn.LSTM(input_size=128, hidden_size=128, num_layers=4, bias=True, batch_first=True),
        ]
        self.linear = nn.Linear(in_features=128 * 4, out_features=1, bias=True)

    def forward(self, x: torch.Tensor, site_idx: int):
        h = torch.zeros(size=(4, x.size(0), 128))
        c = torch.zeros(size=(4, x.size(0), 128))
        for gat in self.gat_layers:
            x = gat(x)
        for rnn in self.rnns:
            x[:, :, site_idx, :], (h, c) = rnn(x[:, :, site_idx, :], (h, c))
        h = h.permute(1, 0, 2)
        h = h.reshape(h.size(0), -1)
        return self.linear(h).squeeze()

当我使用以下代码独立测试自定义的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("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)
print(model(torch.randn(5, 5, 3, 3)).shape)

哪个输出 torch.Size([5, 5, 3, 1024])

当我使用CPU和以下代码测试整个网络时,它也可以正常工作

#device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
adj = torch.tensor(np.array([[1, 0, 0], [0, 1, 1], [1, 1, 1]], dtype="bool"))
exp = torch.randn(3, 8, 3, 17)
gpus = [0]
model = AQIP(adj, seq_len=8)
#model = model.to(device, non_blocking=True)
print(model(exp, 1))

哪个输出 tensor([-0.0320, -0.0320, -0.0320], grad_fn=<SqueezeBackward0>)

但是,只要我尝试将模型移至GPU并对设备和行进行注释,就会出现以下错误,并追溯到某些与我的代码无关的Formatter类:

RuntimeError: copy_if failed to synchronize: cudaErrorIllegalAddress: an illegal memory access was encountered

当使用CUDA_LAUNCH_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_layers = [
           GATLayer(input_dim=16 + int(with_aqi), output_dim=128, adj=adj).cuda(),
           GATLayer(input_dim=128, output_dim=128, adj=adj).cuda(),
         ]

然后,PyTorch不会自动识别这些图层,因此在.to(device)调用时,它们的参数不会传输到GPU。因此,解决方案之一是一层一层地声明。

更好的解决方案是使用nn.ModuleList来包含所需的所有图层,因此可以将代码更改为

self.gat_layers = nn.ModuleList([
            GATLayer(input_dim=16 + int(with_aqi), output_dim=128, adj=adj).cuda(),
            GATLayer(input_dim=128, output_dim=128, adj=adj).cuda(),
        ])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有自定义层的PyTorch网络在CPU上工作正常,但移至GPU时会得到cudaErrorIllegalAddress

来自分类Dev

PyTorch LSTM在Colab GPU上崩溃(在CPU上工作正常)

来自分类Dev

为什么在Django中定义自定义注册表单时会得到三个密码字段?

来自分类Dev

具有自定义叠加层的AVPlayerViewController

来自分类Dev

自定义Keras层具有可训练的标量

来自分类Dev

带有自定义EditText的AdjustResize无法正常工作

来自分类Dev

具有自定义网址方案的iOS 9野生动物园iframe src无法正常工作

来自分类Dev

如何通过带有自定义滤镜的Pytorch卷积层传递彩色图像?

来自分类Dev

具有可自定义隐藏层的TensorFlow模型的子类定义

来自分类Dev

OpenCL光线跟踪程序在CPU上工作正常,但在GPU上(始终)不正常

来自分类Dev

在ggplot2中添加具有自定义图例的点和线层

来自分类Dev

如何在Keras中实现具有动态形状的自定义输出层?

来自分类Dev

Tensorflow 自定义层:创建具有可训练参数的稀疏矩阵

来自分类Dev

nginx 配置中的自定义变量,在“服务器”中,不会得到解析

来自分类Dev

具有自定义状态的自定义按钮

来自分类Dev

PyTorch中具有自定义后向功能的损失-简单的MSE示例中的爆炸损失

来自分类Dev

具有自定义jmx端口的代理ActiveMQ 5.8网络

来自分类Dev

选择命令有时会得到相同的行

来自分类Dev

没有www的Azure自定义域(Namecheap)无法正常工作

来自分类Dev

没有数据的AgGrid自定义模板无法正常工作

来自分类Dev

带有缩略图的自定义Bootstrap轮播无法正常工作

来自分类Dev

Laravel IOC自动解析-在控制器上工作,但不能在自定义类上工作

来自分类Dev

WP查询循环通过在主页上工作但不在搜索页面上工作的自定义帖子类型

来自分类Dev

WP查询循环通过在主页上工作但不在搜索页面上工作的自定义帖子类型

来自分类Dev

如何在同一层次结构上具有页面和自定义帖子类型

来自分类Dev

具有自定义索引的数组

来自分类Dev

具有自定义字体的MessageBox?

来自分类Dev

具有自定义标题的DialogFragment

来自分类Dev

具有自定义参数的QAction

Related 相关文章

  1. 1

    具有自定义层的PyTorch网络在CPU上工作正常,但移至GPU时会得到cudaErrorIllegalAddress

  2. 2

    PyTorch LSTM在Colab GPU上崩溃(在CPU上工作正常)

  3. 3

    为什么在Django中定义自定义注册表单时会得到三个密码字段?

  4. 4

    具有自定义叠加层的AVPlayerViewController

  5. 5

    自定义Keras层具有可训练的标量

  6. 6

    带有自定义EditText的AdjustResize无法正常工作

  7. 7

    具有自定义网址方案的iOS 9野生动物园iframe src无法正常工作

  8. 8

    如何通过带有自定义滤镜的Pytorch卷积层传递彩色图像?

  9. 9

    具有可自定义隐藏层的TensorFlow模型的子类定义

  10. 10

    OpenCL光线跟踪程序在CPU上工作正常,但在GPU上(始终)不正常

  11. 11

    在ggplot2中添加具有自定义图例的点和线层

  12. 12

    如何在Keras中实现具有动态形状的自定义输出层?

  13. 13

    Tensorflow 自定义层:创建具有可训练参数的稀疏矩阵

  14. 14

    nginx 配置中的自定义变量,在“服务器”中,不会得到解析

  15. 15

    具有自定义状态的自定义按钮

  16. 16

    PyTorch中具有自定义后向功能的损失-简单的MSE示例中的爆炸损失

  17. 17

    具有自定义jmx端口的代理ActiveMQ 5.8网络

  18. 18

    选择命令有时会得到相同的行

  19. 19

    没有www的Azure自定义域(Namecheap)无法正常工作

  20. 20

    没有数据的AgGrid自定义模板无法正常工作

  21. 21

    带有缩略图的自定义Bootstrap轮播无法正常工作

  22. 22

    Laravel IOC自动解析-在控制器上工作,但不能在自定义类上工作

  23. 23

    WP查询循环通过在主页上工作但不在搜索页面上工作的自定义帖子类型

  24. 24

    WP查询循环通过在主页上工作但不在搜索页面上工作的自定义帖子类型

  25. 25

    如何在同一层次结构上具有页面和自定义帖子类型

  26. 26

    具有自定义索引的数组

  27. 27

    具有自定义字体的MessageBox?

  28. 28

    具有自定义标题的DialogFragment

  29. 29

    具有自定义参数的QAction

热门标签

归档