Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A0 needs to be placed on the GPU GPU和CPU #3

Open
Ellohiye opened this issue Jul 10, 2023 · 10 comments
Open

A0 needs to be placed on the GPU GPU和CPU #3

Ellohiye opened this issue Jul 10, 2023 · 10 comments

Comments

@Ellohiye
Copy link

作者您好,通过这步操作将A0放在GPU上,
image
但是其他模型和数据都还在cpu上
image
因此,在执行这步操作的时候:
image
就报错一个数据在GPU、一个数据在CPU,无法进行运算,这个问题应该如何解决呢

@C1nDeRainBo0M
Copy link
Owner

C1nDeRainBo0M commented Jul 11, 2023 via email

@Ellohiye
Copy link
Author

您好,感谢您对本研究的关注。 如果想要将AGCA模块部署在cpu上请在初始化A0的代码上,去掉.to('cuda')即可。 | | @.*** | | @.*** |

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2023年07月10日 16:41 | | 收件人 | @.> | | 抄送至 | @.> | | 主题 | [C1nDeRainBo0M/AGCA] A0 needs to be placed on the GPU GPU和CPU (Issue #3) | 作者您好,通过这步操作将A0放在GPU上, 但是其他模型和数据都还在cpu上 因此,在执行这步操作的时候: 就报错一个数据在GPU、一个数据在CPU,无法进行运算,这个问题应该如何解决呢 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.>
感谢您回复!我还有一些疑问希望得到您的解答。其他的注意力比如说CBAM、SE等也是部署在cpu上的吗?所以AGCA作为一个即插即用的注意力也可以放在cpu上,是这样吗?放在cpu上初始化和在cpu上训练应该是两个阶段,是这样理解吗?

@C1nDeRainBo0M
Copy link
Owner

C1nDeRainBo0M commented Jul 12, 2023

注意力模块部署在CPU或GPU上取决于您的需求。

AGCA模块即插即用的含义,简单点来说就是,在任何一个包含您所提到的SE或CBAM模块的神经网络中,它们都可以被AGCA直接替换。

和训练其他神经网络模型一样,初始化和训练应该保持模型数据都在GPU或者CPU其中一个上面。

感谢您的问题,我们会在公布的代码中加入这一部分的注释。

@Ellohiye
Copy link
Author

谢谢您的回复,但是当我把这个模块放在yolov5的主干中,还是会报错 ,我增加模块的位置如下:
image

报错信息如下:
image

我添加注释的位置如下:
image

输出信息如下:
image

发现在运行该模块的时候,总是会分别部署在GPU和CPU上。
请问您知道这应该如何修改吗?期待您的回复!非常感谢!

@C1nDeRainBo0M
Copy link
Owner

C1nDeRainBo0M commented Jul 13, 2023 via email

@C1nDeRainBo0M
Copy link
Owner

您好,如果还没有解决的话,可以尝试在def __init__self.A0 = torch.eye(hide_channel).to('cuda')改为self.A0 = torch.eye(hide_channel)。再在def forward中添加if A1.device != 'cpu': self.A0 = self.A0.to('cuda')来尝试将在前向通路时将A0和A2部署在同一个设备上。

@haihaiwolai
Copy link

你好,请问这个问题解决了吗?
根据作者的回答,在初始化A0的代码上,去掉.to('cuda')后,运行yolo.py文件确实没有任何问题
但是在运行train.py时,还是会报同样的错误..........

@HHX-688
Copy link

HHX-688 commented Oct 18, 2024

你好,请问这个问题解决了吗? 根据作者的回答,在初始化A0的代码上,去掉.to('cuda')后,运行yolo.py文件确实没有任何问题 但是在运行train.py时,还是会报同样的错误..........

class AGCA(nn.Module):
    def __init__(self, in_channel, ratio):
        super(AGCA, self).__init__()
        hide_channel = in_channel // ratio
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv1 = nn.Conv2d(in_channel, hide_channel, kernel_size=1, bias=False)
        self.softmax = nn.Softmax(2)
        # Choose to deploy A0 on GPU or CPU according to your needs
        # self.A0 = torch.eye(hide_channel).to('cuda')
        self.A0 = torch.eye(hide_channel)
        # A2 is initialized to 1e-6
        self.A2 = nn.Parameter(torch.FloatTensor(torch.zeros((hide_channel, hide_channel))), requires_grad=True)
        init.constant_(self.A2, 1e-6)
        self.conv2 = nn.Conv1d(1, 1, kernel_size=1, bias=False)
        self.conv3 = nn.Conv1d(1, 1, kernel_size=1, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.conv4 = nn.Conv2d(hide_channel, in_channel, kernel_size=1, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        y = self.avg_pool(x)
        y = self.conv1(y)
        B, C, _, _ = y.size()
        y = y.flatten(2).transpose(1, 2)
        A1 = self.softmax(self.conv2(y))
        A1 = A1.expand(B, C, C)
        if A1.device != self.A0.device:
            self.A0 = self.A0.to('cuda')
        A = (self.A0 * A1) + self.A2

        y = torch.matmul(y, A)
        y = self.relu(self.conv3(y))
        y = y.transpose(1, 2).view(-1, C, 1, 1)
        y = self.sigmoid(self.conv4(y))

        return x * y

亲测windows系统上Yolov8这样改就不会出错了,但是还需要关闭Yolov8的半精度设置https://blog.csdn.net/weixin_44625095/article/details/132296858?fromshare=blogdetail&sharetype=blogdetail&sharerId=132296858&sharerefer=PC&sharesource=hhxxyz&sharefrom=from_link

@YQ0Sun
Copy link

YQ0Sun commented Dec 9, 2024

@HHX-688 我想问一下,关闭Yolov8的半精度设置会产生什么样的影响?

@HHX-688
Copy link

HHX-688 commented Dec 9, 2024

@HHX-688 我想问一下,关闭Yolov8的半精度设置会产生什么样的影响?

训练时间慢一点,占用内存多一点,其实影响不大

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants