首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过并行运行CPU和GPU来更快地训练神经网络

如何通过并行运行CPU和GPU来更快地训练神经网络
EN

Stack Overflow用户
提问于 2017-12-11 13:58:31
回答 1查看 974关注 0票数 0

我正在尝试使用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 )。做到这一点的最好方法是什么?具体来说,我的数据生成器代码和训练代码运行如下代码(伪代码):

代码语言:javascript
复制
    #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上的多处理,但官方文档上的解释对我来说有点太密集了,因为我以前只有有限的并行计算经验。如果有一些资源我可以看一看,给我指点一下这些资源也会很有帮助!谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-12-11 19:20:00

您将需要使用线程来生成数据。这个想法是让CPU处理数据生成(通常是加载),而您的GPU进行训练。话虽如此,并不是CPU会让事情变慢。它是对文件的持续读写。如果您使用的是数据集,请确保将文件复制或提取到文件系统上的连续块中。如果您的文件是跨硬盘进行碎片整理的,则无论您使用的是哪种多线程机制,加载它们都将是一个瓶颈。对于SSD硬盘,这一点并不明显。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47747211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档