Pytorch 当将张量移动到GPU时,内存会发生什么变化?
我试图理解当一个张量被发送到GPU时,RAM和GPU内存会发生什么变化 在下面的代码示例中,我创建了两个张量-大张量arr=torch.tensor.one((10000,10000))和小张量c=torch.tensor.one(1)。张量c被发送到目标函数步骤内的GPU,该步骤由multiprocessing.Pool调用。在这样做时,每个子进程在GPU上使用487 MB的内存,RAM的使用量达到5 GB。请注意,大张量arr在调用池之前只创建一次,而不是作为参数传递给目标函数。当一切都在CPU上时,Ram的使用不会爆炸 关于这个例子,我有以下问题: 我正在将torch.Tensor.ones(1)发送到GPU,但它消耗了487MB的GPU内存。即使基础张量非常小,CUDA是否在GPU上分配最小内存量?GPU内存对我来说不是问题,这只是让我了解如何分配内存 问题在于RAM的使用。尽管我正在向GPU发送一个小张量,但似乎内存中的所有内容(大张量arr)都是为每个子进程(可能是固定内存)复制的。那么,当张量被发送到GPU时,哪些对象被复制到固定内存中?我在这里遗漏了一些东西,因为当我只发送一个特定的对象时,准备所有要发送到GPU的东西是没有意义的 谢谢Pytorch 当将张量移动到GPU时,内存会发生什么变化?,pytorch,multiprocessing,gpu,Pytorch,Multiprocessing,Gpu,我试图理解当一个张量被发送到GPU时,RAM和GPU内存会发生什么变化 在下面的代码示例中,我创建了两个张量-大张量arr=torch.tensor.one((10000,10000))和小张量c=torch.tensor.one(1)。张量c被发送到目标函数步骤内的GPU,该步骤由multiprocessing.Pool调用。在这样做时,每个子进程在GPU上使用487 MB的内存,RAM的使用量达到5 GB。请注意,大张量arr在调用池之前只创建一次,而不是作为参数传递给目标函数。当一切都在C
from multiprocessing import get_context
import time
import torch
dim = 10000
sleep_time = 2
npe = 4 # number of parallel executions
# cuda
if torch.cuda.is_available():
dev = 'cuda:0'
else:
dev = "cpu"
device = torch.device(dev)
def step(i):
c = torch.ones(1)
# comment the line below to see no memory increase
c = c.to(device)
time.sleep(sleep_time)
if __name__ == '__main__':
arr = torch.ones((dim, dim))
# create list of inputs to be executed in parallel
inp = list(range(npe))
# sleep added before and after launching multiprocessing to monitor the memory consumption
print('before pool') # to check memory with top or htop
time.sleep(sleep_time)
context = get_context('spawn')
with context.Pool(npe) as pool:
print('after pool') # to check memory with top or htop
time.sleep(sleep_time)
pool.map(step, inp)
time.sleep(sleep_time)
我正在向GPU发送torch.Tensor.ones(1)
,但它消耗了487MB的GPU内存。即使基础张量非常小,CUDA是否在GPU上分配最小内存量
CUDA设备运行时在上下文建立时为各种事情保留内存,其中一些大小固定,一些大小可变,可以由API调用控制(有关更多信息,请参阅)。在设备上显式或延迟地建立上下文的第一个API调用将导致GPU内存消耗的跳跃,这是完全正常的。在这种情况下,我想象第一个张量创建触发了内存开销分配。这是CUDA运行时的属性,而不是PyTorch或tensor。是的,一旦您开始使用CUDA GPU,尝试使用GPU的行为将导致内存分配开销,这会有所不同,但通常为300-400MB。好的,很高兴知道。实际上,发送到GPU的张量并不小,因此开销不是问题