创建 Pytorch "Stack of Views" 以节省 GPU 内存

Create Pytorch "Stack of Views" to save on GPU memory

我正在尝试扩展数据集以在 Pytorch 中进行分析,以便从一个一维(或二维)张量生成两个 视图堆栈 。下图中A(绿色)和B(蓝色)是从左向右滑动的原始张量的视图,然后将它们组合成单个张量进行批处理:

为此使用视图的动机是节省 GPU 内存,因为对于大型多维数据集,尽管存在大量数据重用(如果普通张量被使用)。一次简单地返回一个视图是不可取的,因为张量的实际处理是大批量工作的。

我想做的事情在 Pytorch 中可行吗?只需使用 torch.stack(list of views) 创建一个带有原始数据副本的新张量,由 tensor.storage().data_ptr 验证().

问题的另一种表达方式:你能创建成批的张量视图吗?

目前的步骤是:

  1. 加载并预处理所有数据集
  2. 将数据集转换为张量并扩展为滑动视图堆栈,如上所示
  3. 将所有堆栈移动到 GPU 以避免训练期间的传输瓶颈

如评论中所述,Tensor.unfold 可用于此任务。您提供张量、起始索引、长度值和步长。这 returns 一批视图与我所描述的完全一样,尽管您必须一次展开 A 和 B 的一个张量。

下面的代码可以用来生成A和B:

A = source_tensor[:-B_length].unfold(0, A_length, 1)
B = source_tensor[A_length:].unfold(0, B_length, 1)

A.storage().data_ptr() == source_tensor.storage().data_ptr() returns True

由于数据指针相同,因此可以正确返回原始张量的视图而不是副本,从而节省内存。