我在多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_threads
和num_readers
,当我将两个变量都设置为1时,我获得了最佳性能1.333 sec/batch
。bath_inputs()
已在CPU:0
上执行,因为在image_processing.py
第132行:with tf.device('/cpu:0'):
如何获得更好的表现?