Tensorflow的深度学习框架可不可以使用多个GPU并行训练,再使用单GPU或者单cpu进行预测

【Tensorflow的深度学习框架可不可以使用多个GPU并行训练,再使用单GPU或者单cpu进行预测】 Tensorflow中的并行分为模型并行和数据并行。
模型并行需要根据不同的模型设计不同的并行方式,将模型中的不同计算节点放到不同的硬件设备上。(这样没法做到在多个设备训练,而在单个设备上测试)。更常见的是数据并行。数据并行几乎适用于所有的深度学习模型。主要思想是同时使用多个硬件资源来计算不同的batch的数据的梯度,然后汇总梯度进行全局的参数更新。如下图所示。Tensorflow的深度学习框架可不可以使用多个GPU并行训练,再使用单GPU或者单cpu进行预测

假设我们有两块GPU设备,在训练阶段所有的设备同时读取参数的取值,然后对不同设备喂入不同的batch的数据。每个设备独立的计算loss和梯度,这些梯度将被汇总到CPU上。等待所有的GPU都计算完一个batch的数据,CPU会将梯度求平均,然后进行更新。
数据并行又分为同步并行和异步并行,以上讲的是同步并行。同步并行时,最好GPU的性能是相当的,不然计算速度会受限于最慢的那个GPU。异步并行时,不等所有GPU都完成一次训练才更新,而且哪个GPU完成了就立即更新参数。通常情况下,同步并行比异步的模式收敛速度更快,模型的精度更高。
数据并行训练过程中得到的参数与设备无关,训练得到的模型也只有1个。我们在测试阶段时可以直接在我们想用的设备上加载这个模型。

代码实例:
官方以cifar数据集上的分类任务为例,介绍了如何用单GPU和多GPU进行训练。代码链接:
https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/models/image/cifar10
cifar10_train.py 为单GPUcifar10_multi_gpu_train.py为多GPU的代码cifar10_eval.py 为预测阶段的代码可以看到两者测试阶段代码完全不用变。训练阶段的代码大部分也不用变。多GPU版本中只增加了如何把数据分配到多个GPU上,并将多个GPU计算得到的梯度进行汇总。
By 陈华杰

■网友
谢邀。先说下Tensorflow 做训练吧,就像您说的,Tensorflow支持多gpu训练,比较常见的就是数据并行,暨数据是切片拆分,多gpu计算梯度的。这里gpu是通过 0,1,2等自然数控制的,对应你机器中的物理gpu,但是最终模型保存到本地(Ckpt,pb)却和您的物理设备无关。模型在推理阶段是要重新部署的,一般都是要重新加载上述文件。关键在这里!此时流入图中的数据只有一条,所以数据是不可拆分的。同样一般情况下这个推理阶段也是不能拆分的,所以是单gpu运算。若是想增加服务器处理大访问量推理能力,只需用tensorflow serving 便可。多gpu可部署相同的图,由tensorflow serving 控制请求队列即可。
■网友
在tf里,训练用多卡,预估当然可以用单卡,因为训练和预估的代码都需要你自己实现,而tf给了你最大的自由度来实现。具体来说,取决于你的模型是model-parallism还是data-parallism,如果是前者,训练和预估最好保持一致,因为图一般会比较复杂,不一致可能会需要设计两份计算图,而且使用model-parallelism的情况下单卡一般塞不下一个模型。如果是后者就容易了,可以参考官方教程里cifar10的多gpu示例。大部分情况下,我们都用data-parallism。
■网友
当然可以用单卡了,训练和预测是两个阶段呀,你保存模型之后,改用单卡预测不是顺理成章的么?
■网友
多设备个棒槌。我搞了多快显卡,又with.device又啥的,搞得大家都很忙,每块显卡都有活干,但最后汇总起来,还没有一块显卡干得快。图啥,半个月白忙乎了,又是破财又是花时间的

■网友
我用多GPU训练模型,采用的并行方式是数据并行。
加载模型做预测的时候发现,加载多卡训练的ckpt文件要比单卡的ckpt文件慢,大概多耗时8s左右,请问你有遇到类似情况吗?


推荐阅读