我想使用DataParallel
将我的计算沿着批量维度分布到多个 GPU 上。我的网络内部需要一个 Tensor
(我们称之为 A
),它是恒定的,不会通过优化而改变。看来DataParallel
不会自动将此Tensor
复制到所有有问题的GPU,因此网络会提示输入数据 block x
它看到的 code> 驻留在与 A
不同的 GPU 上。
有没有办法DataParallel
可以自动处理这种情况?或者,有没有办法将张量
复制到所有 GPU?或者我应该为每个 GPU 保留一个张量,并根据 forward
看到的 block 所在的位置手动找出要使用的副本?
最佳答案
您应该将张量包装在 torch.nn.Parameter
中,并在创建过程中设置 requires_grad=False
。
torch.nn.Parameter
并不意味着张量必须是可训练的。
这仅仅意味着它是模型的一部分,并且应该在需要时进行转移(例如多个 GPU)。
如果情况并非如此,torch
就无法知道 __init__
中的哪个张量是模型的一部分(您可以对张量进行一些操作,添加到 self
只是为了完成某件事)。
我认为不需要另一个函数来做到这一点,尽管名称可能有点令人困惑。
关于gpu - 当网络需要共享(常量) `DataParallel`时使用 `Tensor`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59732129/