我有一个 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" 的实际含义感到困惑,所以如果有人能回答我,我将非常感激!
字典只是一个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 上的数据,但字典本身并不知道这一点。