由于在ubuntu中使用caffe的程序时,都使用.sh文件,该文件中常见的命令为:
./build/tools/caffe train --solver=examples/testXXX/solver.prototxt
当电脑中有多个GPU时,默认使用GPU0。如果想使用其他的GPU,可以将该文件内容修改如下:
./build/tools/caffe train --solver=examples/testXXX/solver.prototxt --gpu 2
注意,caffe中默认编号从0开始,因而–GPU 2的意思是使用第3个GPU。
如果要使用多个GPU,可以使用如下命令:
./build/tools/caffe train --solver=examples/testXXX/solver.prototxt --gpu 0,1,2,3
则使用0,1,2,3这4个GPU。
如果要使用所有的GPU,可使用如下命令:
./build/tools/caffe train --solver=examples/testXXX/solver.prototxt --gpu all
注意,使用的GPU越多,开始初始化时时间越久。
1. 多GPU训练时,速度没有变得更快。
使用多GPU训练时,每个GPU都会运行一个 Caffe 模型的实例。比如当使用 nnn 个GPU训练时,网络会有 nnn 个分身分别在各自的GPU上运行,nnn 个网络中有一个“本尊”叫root_net,root_net除了负责正常的前传反传还负责更新参数,而其它网络只负责前传和反传。大致流程是这样的,nnn 个网络共享一个数据层,数据层读取 nnn 个batch的数据分别送给 nnn 个网络进行前传和反传,然后使用归约的方法将 nnn 个网络计算的梯度累加在root_net上,取平均后由root_net更新网络参数,接着同步 nnn 个网络的参数,数据层再取 nnn 个batch的数据进行下一次迭代。在多个GPU之间实现归约和同步会很耗时,尤其是当两个GPU不在一个multiGpuBoardGroup上的情况,所以整体的时间并没有减少太多。
所以相同时间内,多GPU 能够训练更多的数据。
2. Batch_size 选择的问题
这里的意思就是batchsize和学习率是相关的,如果batchsize减小了X倍,则理论上学习率应增大sqrt(X)倍(当然这是找到最好的batchsize的情况下的),不过Alex还是用了X倍。后面 https://arxiv.org/abs/1404.5997 这个链接的论文还没看,有时间的可以看一下,好像有专门讲到batchsize的设置的。
另外,batchsize最好设置为8的倍数,这样gpu的并行运算效率最高。