Python 3.x PyTorch:在使用Dataloader加载批处理数据时,如何将数据自动传输到GPU

Python 3.x PyTorch:在使用Dataloader加载批处理数据时,如何将数据自动传输到GPU,python-3.x,pytorch,gpu,pytorch-dataloader,Python 3.x,Pytorch,Gpu,Pytorch Dataloader,如果我们使用数据集和数据加载器类的组合(如下所示),我必须使用.to()或.cuda()将数据显式加载到GPU。是否有方法指示数据加载器自动/隐式地执行此操作 理解/再现场景的代码: 来自torch.utils.data导入数据集,数据加载器 将numpy作为np导入 类解调数据(数据集): 定义初始(自我,限制): 超级(解调器,自身)。\uuuu初始化 self.data=np.arange(极限) 定义(自我): 返回self.data.shape[0] def uu getitem uu

如果我们使用
数据集
数据加载器
类的组合(如下所示),我必须使用
.to()
.cuda()
将数据显式加载到GPU。是否有方法指示数据加载器自动/隐式地执行此操作

理解/再现场景的代码:

来自torch.utils.data导入数据集,数据加载器
将numpy作为np导入
类解调数据(数据集):
定义初始(自我,限制):
超级(解调器,自身)。\uuuu初始化
self.data=np.arange(极限)
定义(自我):
返回self.data.shape[0]
def uu getitem uu(self,idx):
返回(自数据[idx],自数据[idx]*100)
演示=解调数据(100)
加载器=数据加载器(演示,批量大小=50,随机播放=True)
对于枚举(加载器)中的i(i1,i2):
打印('批索引:{}'。格式(i))
打印('数据项1的形状:{};数据项2的形状:{}'。格式(i1.Shape,i2.Shape))
#i1,i2=i1.to('cuda:0'),i2.to('cuda:0'))
打印('数据项1的设备:{};数据项2的设备:{}\n'。格式(i1.Device,i2.Device))
将输出以下内容;注意-如果没有明确的设备传输指令,数据将加载到CPU上:

批索引:0
数据项1的形状:火炬尺寸([50]);数据项2的形状:火炬尺寸([50])
数据项1的设备:cpu;数据项2的设备:cpu
批次索引:1
数据项1的形状:火炬尺寸([50]);数据项2的形状:火炬尺寸([50])
数据项1的设备:cpu;数据项2的设备:cpu

一个可能的解决方案是(在发布此问题时仍处于打开状态),但是,当dataloader必须返回多个数据项时,我无法使其工作

您可以修改
collate\u fn
一次处理多个项目:

从torch.utils.data.dataloader导入默认值\u collate
device=torch.device('cuda:0')#或任何您喜欢的设备/cpu
#新的collate函数非常通用
加载器=数据加载器(演示,批量大小=50,随机播放=True,
collate_fn=lambda x:tuple(默认情况下,x_u的x_uu的x_uu.to(设备)))
请注意,如果您希望数据加载器有多个worker,则需要添加

torch.multiprocessing.set\u start\u方法('spawn')
之后,如果
(请参阅)

话虽如此,在
DataLoader
中使用
pin_memory=True
似乎效率更高。您尝试过这个选项吗?
有关更多信息,请参阅


更新(2021年2月8日)
这篇文章让我看到了我在培训期间花费的“数据到模型”的时间。 我比较了三种选择:

  • DataLoader
    在CPU上工作,只有在检索到批处理后,数据才会移动到GPU
  • 与(1)相同,但在
    DataLoader
    中具有
    pin\u memory=True
  • 建议使用
    collate\u fn
    将数据移动到GPU的方法
  • 从我有限的实验来看,第二种选择似乎表现最好(但差距不大)。

    第三个选项需要对数据加载器进程的
    start\u方法
    大惊小怪,而且似乎在每个历元开始时都会产生开销。

    没有人遇到过这个问题?当数据集返回每个批中的值元组时,
    collate fn
    参数没有用处。所以仍然在寻找更好的解决办法!
    spawn
    指令对我不起作用,它是特定于特定版本的吗?@anurag我不知道。