源码
# Divide the mini-batch to different GPUs.
batch_size = 32
accum_batch_size = 32
iter_size = accum_batch_size / batch_size
solver_mode = P.Solver.CPU
device_id = 0
batch_size_per_device = batch_size
if num_gpus > 0:
batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus))
iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus)))
solver_mode = P.Solver.GPU
device_id = int(gpulist[0])
说明
- batch_size:每次进入网络的图片数
- iter_size:迭代一次需要将进入网络的图片跑多少次
- accum_batch_size:batch_size和iter_size的乘积
在运算资源有限的情况下,可以通过改变batch_size和iter_size降低计算资源。要注意的一点是在使用多张显卡跑网络的时候,每张显卡都是并行运行的,还是一个batch_size的图片输入,所以并不会使缓存降下来,但它在理论上是可以将运行的时间成显卡数量的倍数缩短。
示例
举例来说,在ssd_pascal.py中,每次进入网络的图片为32张,然后每次迭代只要跑一次这32张图片。然而我们在实际的操作中用一张NV TITAN会out of memory,所以我们将batch_size改为4,iter_size改成4,相当于每次进入网络4张图片,迭代一次需要将这4张图片跑4次,所以在原来的配置中跑完这个网络总共需要迭代120000次,而为了达到这个效果我们需要增加到240000次。虽说这样理论上可以达到同样的效果,但是实际中还是会有细小的差别。总而言之,显卡资源有限真!滴!伤!
网友评论