我正在尝试使用GPU训练一个(相当大的)神经网络。网络是用pytorch编写的。我使用的是运行在ubuntu 16.04上的python 3.6.3。目前,代码正在运行,但它花费的时间大约是正常运行时间的两倍,因为我使用CPU的数据获取过程与使用GPU的训练过程是串联运行的。本质上,我使用mini-batch生成器从文件中获取一个mini-batch,将该mini-batch发送到GPU,然后在该mini-batch上训练网络。我对这两个过程进行了计时(抓取一个小批次并在那个小批次上进行训练),它们在时间上是相似的(都需要大约200ms)。我想做一些类似于keras的fit_generator方法,它在训练的同时运行数据抓取(它创建了一个小批次的队列,当GPU想要训练这个小批次时,可以发送到GPU )。做到这一点的最好方法是什么?具体来说,我的数据生成器代码和训练代码运行如下代码(伪代码):
#This generator opens a file, grabs and yields a mini batch
def data_gen(PATH,batch_size=32):
with h5py.File(PATH,'r') as f:
for mini-batch in mini-batches:
X = f['X'][mini-batch]
Y = f['Y'][mini-batch]
yield (X,Y)
for epoch in range(epochs):
for data in data_gen(PATH):
mini_X,mini_Y = data
mini_X = autograd.Variable(torch.Tensor(mini_X))
mini_Y = autograd.Variable(torch.Tensor(mini_Y))
out = net(mini_X)
loss = F.binary_cross_entropy(out,mini_Y)
loss.backward()
optimizer.step()差不多吧。正如您所看到的,我使用data_gen作为for循环的实际生成器,因此它在训练过程中是按顺序运行的。我想并行运行它,并让它生成一个迷你批次队列,然后我可以将其馈送到我的网络中。目前,运行一个时期需要超过5个小时,我认为使用这个的并行版本,我可以将其降低到3个小时或更少。我研究了python上的多处理,但官方文档上的解释对我来说有点太密集了,因为我以前只有有限的并行计算经验。如果有一些资源我可以看一看,给我指点一下这些资源也会很有帮助!谢谢。
发布于 2017-12-11 19:20:00
您将需要使用线程来生成数据。这个想法是让CPU处理数据生成(通常是加载),而您的GPU进行训练。话虽如此,并不是CPU会让事情变慢。它是对文件的持续读写。如果您使用的是数据集,请确保将文件复制或提取到文件系统上的连续块中。如果您的文件是跨硬盘进行碎片整理的,则无论您使用的是哪种多线程机制,加载它们都将是一个瓶颈。对于SSD硬盘,这一点并不明显。
https://stackoverflow.com/questions/47747211
复制相似问题