在Pytorch中,我正在优化模型。如果运行以下代码,则nvidia-smi表示我在gpu上使用的内存为850MiB / 7979MiB。为什么会这样呢?
与torch.no_grad():A = nn.Conv2d(10,10,3).cuda()
我想象在某处指定了一些开销或默认分配大小,但是找不到此类文档。我确实记得tensorflow有一个设置来限制分配的内存量。
卷积不会占用太多内存。您可以使用进行验证torch.cuda.memory_allocated
,它显示所有张量所占用的内存(以字节为单位):
torch.cuda.memory_allocated() # => 0
A = nn.Conv2d(10,10,3).cuda()
torch.cuda.memory_allocated() # => 4608
卷积仅使用4608字节。
nvidia-smi
显示内存使用率较高的原因有两个。
PyTorch使用了缓存内存分配器,这意味着它保留了比避免设备同步所需的更多内存。
PyTorch使用缓存内存分配器来加速内存分配。这允许快速的内存重新分配而无需设备同步。但是,分配器管理的未使用内存仍将显示为
nvidia-smi
。您可以使用memory_allocated()
和max_memory_allocated()
监视张量占用的内存,并使用memory_reserved()
和max_memory_reserved()
监视由缓存分配器管理的内存总量。
首次初始化CUDA时,它将创建一个用于管理设备控制的上下文。最值得注意的是,上下文包含所有不同CUDA内核的代码,其中PyTorch拥有很多。上下文的大小在不同的GPU架构中也有所不同。在Issue#20532中讨论了一些详细信息-仅初始化cuda就占用了数百MB。
您正在观察的内存几乎全部归因于CUDA上下文。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句