具有自定义层的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

自定义助手无法正常工作

来自分类Dev

自定义ColorEditor在Color结构上无法正常工作

来自分类Dev

为什么我的自定义PermissionEvaluator无法正常工作?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何使此自定义标签正常工作?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

自定义equals()方法无法正常工作

来自分类Dev

具有自定义叠加层的AVPlayerViewController

来自分类Dev

iOS 8自定义键盘UIScrollview无法正常工作

来自分类Dev

jQuery自定义日期功能无法正常工作?

来自分类Dev

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

来自分类Dev

aurelia中的自定义属性无法正常工作?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

    自定义助手无法正常工作

  2. 2

    自定义ColorEditor在Color结构上无法正常工作

  3. 3

    为什么我的自定义PermissionEvaluator无法正常工作?

  4. 4

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

  5. 5

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

  6. 6

    如何使此自定义标签正常工作?

  7. 7

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

  8. 8

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

  9. 9

    自定义equals()方法无法正常工作

  10. 10

    具有自定义叠加层的AVPlayerViewController

  11. 11

    iOS 8自定义键盘UIScrollview无法正常工作

  12. 12

    jQuery自定义日期功能无法正常工作?

  13. 13

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

  14. 14

    aurelia中的自定义属性无法正常工作?

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档