Tensorflow分布式训练的性能比caffe多GPU训练慢得多

时间:2016-05-16 13:53:40

标签: tensorflow

我在多GPU版本和分布式版本(两台机器,每台四台GPU)上使用tensorflow训练了inceptionv3。每个GPU在两个设置下每次迭代处理32个图像。但是,分布式训练速度是caffe多GPU版本的两倍。我想知道如何提高分布式培训的性能。

配置:

两台机器,两者都具有完全相同的环境:CentOS 7,4 GTX TITAN X GPU,32 Intel Xeon CPU E5-2630 v3 2.40GHz处理器和131GB内存。机器之间的网络IO为125MB / s,ping延迟为0.1ms,本地读取速度为1GB / s(RAID5)。分布式培训代码是最新的主分支here。在分布式版本中,每台计算机上有4个workers,每个工作分配给1个GPU,并且只启动了一个ps服务器。我从本地磁盘读取数据文件。

每个工人的起始脚本(总共8个工人)是

~/models/inception/bazel-bin/inception/imagenet_distributed_train \
--batch_size=32 \
--data_dir=/data1/imagenet1k \
--job_name='worker' \
--task_id=2 \
--ps_hosts='10.10.102.28:2220' \
--worker_hosts='10.10.102.28:2221,10.10.102.28:2222,10.10.102.28:2223,10.10.102.28:2224,10.10.102.29:2221,10.10.102.29:2222,10.10.102.29:2223,10.10.102.29:2224' &

运行时日志记录:

训练速度

INFO:tensorflow:Worker 6: 2016-05-16 21:07:22.101672: step 390, loss = 8.15(24.0 examples/sec; 1.334  sec/batch)
INFO:tensorflow:Worker 5: 2016-05-16 21:07:22.101666: step 390, loss = 8.10(24.0 examples/sec; 1.335  sec/batch)
INFO:tensorflow:Worker 4: 2016-05-16 21:07:22.101768: step 390, loss = 8.11(24.0 examples/sec; 1.333  sec/batch)
INFO:tensorflow:Worker 7: 2016-05-16 21:07:22.102245: step 390, loss = 8.03(24.1 examples/sec; 1.330  sec/batch)

这个速度是一台机器上caffe多GPU培训的两倍慢(确保实验在相同的设置下,每次GPU每次迭代处理32个图像)。我使用nvidia-smi -l 1来观察GPU的使用情况,并发现GPU只在25%的运行时间内忙碌。 top命令打印如下:

 %Cpu(s):  2.4 us, 35.2 sy,  0.0 ni, 62.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 13174038+total, 21064972 free, 18241616 used, 92433792 buff/cache
KiB Swap: 16777212 total, 16724332 free,    52880 used. 88948128 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
  685 peter+  20   0  0.191t 2.336g 453624 S 878.1  1.9  83:03.03 python      
15102 peter+  20   0 13.715g 5.522g  41820 S 293.7  4.4 348:39.74 python      
  682 peter+  20   0  0.192t 2.476g 453608 S  13.0  2.0  69:18.00 python      
  683 peter+  20   0  0.193t 4.093g 978228 S  11.6  3.3  84:40.56 python      
  684 peter+  20   0  0.191t 2.410g 453612 S  10.6  1.9  88:50.77 python 

我尝试了什么

  • 通过修改num_preprocess_threadsnum_readers,当我将两个变量都设置为1时,我获得了最佳性能1.333 sec/batch
  • 修改队列容量没有帮助。
  • 我认为bath_inputs()已在CPU:0上执行,因为在image_processing.py第132行:with tf.device('/cpu:0'):
  • 我参考了这个issue并想知道瓶颈是否是CPU / IO。

如何获得更好的表现?

0 个答案:

没有答案