【问题标题】:Pytorch: using CUDA prevents optimization from workingPytorch:使用 CUDA 会阻止优化工作
【发布时间】:2021-12-04 01:15:02
【问题描述】:

我有一个非常简单的优化:一条直线。代码如下:

use_gpu = torch.cuda.is_available()
learning_rate = 0.05
loss_function = nn.MSELoss()

train_inputs = torch.FloatTensor([1,2,3,4,5,6]).T.unsqueeze(0)
y_truth = torch.FloatTensor([10, 15, 20, 25, 30, 35]).unsqueeze(0)

W = torch.nn.Parameter(torch.rand(1), requires_grad=True)
b = torch.nn.Parameter(torch.rand(1), requires_grad=True)
optimizer = optim.Adam([b, W], lr=learning_rate)

# if use_gpu:
#     y_truth = y_truth.cuda()
#     W = W.cuda()
#     b = b.cuda()
#     train_inputs = train_inputs.cuda()



for epoch in range(1000):
    optimizer.zero_grad()
    y_preds = b + W * train_inputs
    loss = loss_function(y_truth, y_preds)
    loss.backward()
    optimizer.step()

    if epoch % 100 == 0:
        print(loss.data, W.data, b.data)

如果我不将数据放在 GPU 上,该代码可以正常工作。如果我取消注释 if use_gpu 块,代码会运行,但不会最小化任何内容并且变量不会更新。

我希望代码在 GPU 上也能以类似方式工作。知道发生了什么吗?

谢谢!

【问题讨论】:

    标签: pytorch gpu


    【解决方案1】:

    知道发生了什么吗?

    是的,您正在训练的参数 Wb 保留在主机 (CPU) 上。

    什么时候做的

    W = W.cuda()
    b = b.cuda()
    

    您只是选择忽略正在优化的实际参数。


    如果您希望为此使用 GPU,您可以尝试:

    W = torch.nn.Parameter(torch.rand(1).cuda())
    b = torch.nn.Parameter(torch.rand(1).cuda())
    

    改为。

    【讨论】:

    • 好的,但是当我移动优化器定义通过is_gpu 块时,我有这个错误:ValueError: can't optimize a non-leaf Tensor
    • @Damien 查看编辑
    • 啊! cuda 声明必须在 torch.nn.Parameter 内。好的,我知道了。感谢您的帮助!
    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多