Pytorch 当将张量移动到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

我试图理解当一个张量被发送到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的东西是没有意义的

谢谢

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的张量并不小,因此开销不是问题