gpu - 当网络需要共享(常量) `DataParallel`时使用 `Tensor`

标签 gpu pytorch

我想使用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/

相关文章:

cuda - 来自 CUDA 代码的 100% GPU 使用率导致屏幕延迟

python - 带有置信带的机器学习二维回归

python - Pytorch 预期为 1D 张量,但得到了 2D 张量

machine-learning - FastAI PyTorch Train_loss 和 valid_loss 看起来非常好,但模型无法识别任何内容

c++ - 二维字符数组到 CUDA 内核

cuda - Nsight 跳过(忽略)VS10 Cuda 中的断点工作正常,nsight 始终跳过多个断点

c++ - CUB (CUDA UnBound) 相当于 thrust::gather

ffmpeg - 在单独的线程中将视频直接解码为纹理

deep-learning - 为拥抱脸 (HF) ViT 模型创建特征提取器的正确方法是什么?

python - PyTorch - 如何在训练期间获得学习率?