哪个设备上有一个包含在 cuda 上加载的 pytorch 张量的 python 字典?

问题描述 投票:0回答:1

我有一个 pytorch 人脸检测模型,它返回边界框和一些面部标志作为字典。边界框和地标是移动到 GPU 的 pytorch 张量。当我打印字典时,它看起来像这样:

{'rects': tensor([[405.5453, 126.3100, 646.7983, 454.6852]], device='cuda:0'), 'points': tensor([[[477.5181, 247.7193],
         [591.4567, 247.1899],
         [544.2579, 328.7857],
         [494.3871, 371.9922],
         [583.4272, 370.3429]]], device='cuda:0'), 'scores': tensor([0.9999], device='cuda:0'), 'image_ids': tensor([0], device='cuda:0').

字典是否位于CPU上并且仅链接到张量实际所在的GPU?或者字典现在也加载到GPU上了?另外,如果字典包含一个列表和一个张量,如下所示:

{'rects': [405.5453, 126.3100, 646.7983, 454.6852] , 'points': tensor([[[477.5181, 247.7193],
         [591.4567, 247.1899],
         [544.2579, 328.7857],
         [494.3871, 371.9922],
         [583.4272, 370.3429]]], device='cuda:0')}.

字典在哪里?

也许我只是对 device="cuda:0" 的实际含义感到困惑,所以如果有人能回答我,我将非常感激!

deep-learning pytorch gpu
1个回答
0
投票

字典只是一个Python对象,它没有与之关联的设备。

字典的键和值是指向其他Python对象的指针。字典本身不知道设备是什么,并且不与 pytorch 张量的这方面进行交互。字典只知道键/值对象的指针。有问题的设备完全独立于字典。

pytorch 张量是一个充当某些数据包装器的对象。张量对象具有用于与张量本身交互的 CPU 内存的引用,以及引用底层数据(可能位于 CPU 或 GPU 上)的

.data
参数。

例如,您可以将来自多个设备的张量放在同一个字典中:

x1 = torch.randn(5)
x2 = torch.randn(5).to('cuda:0')
x3 = torch.randn(5).to('cuda:1')

d = {
    'tensor1' : x1,
    'tensor2' : x2,
    'tensor3' : x3,
}

您可以这样做,因为设备方面仅与 pytorch 张量相关 - 对于字典本身并不重要。

举个例子:

{'rects': [405.5453, 126.3100, 646.7983, 454.6852] , 'points': tensor([[[477.5181, 247.7193],
         [591.4567, 247.1899],
         [544.2579, 328.7857],
         [494.3871, 371.9922],
         [583.4272, 370.3429]]], device='cuda:0')}

字典存储在CPU内存中。字典存储指向字典中值对象的指针。

密钥

rects
引用了存储在CPU内存中的Python列表。

它们的键

points
引用了pytorch张量对象的CPU指针。这个张量有一个
.data
参数引用 GPU 上的数据,但字典本身并不知道这一点。

© www.soinside.com 2019 - 2024. All rights reserved.