关于CaffeOnSpark 集群效率低下的问题解决方案

来源:互联网 发布:培训java三个月靠谱吗 编辑:程序博客网 时间:2024/06/06 18:59

在我之前的文章上可以看到关于CaffeOnSpark的搭建教程。
这里假设大家已经把整个集群启动。


我的配置:

node:    四台计算机: 三台Ubuntu 16.04 8Gb内存 Gtx1080  一台 CentOs 7 8Gb 内存 Gtx970 作为master 不参与工作

配置的节点数量不应该过大,否则集群之间的数据传递是一个很大的问题。


Executor数量造成数据倾斜

在官方的Git上用的这样的命令:

export SPARK_WORKER_INSTANCES=2 export DEVICES=1spark-submit --master yarn --deploy-mode cluster \    --num-executors ${SPARK_WORKER_INSTANCES} \    --files ${CAFFE_ON_SPARK}/data/lenet_memory_solver.prototxt,${CAFFE_ON_SPARK}/data/lenet_memory_train_test.prototxt \    --conf spark.driver.extraLibraryPath="${LD_LIBRARY_PATH}" \    --conf spark.executorEnv.LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" \    --class com.yahoo.ml.caffe.CaffeOnSpark  \    ${CAFFE_ON_SPARK}/caffe-grid/target/caffe-grid-0.1-SNAPSHOT-jar-with-dependencies.jar \        -train \        -features accuracy,loss -label label \        -conf lenet_memory_solver.prototxt \        -devices ${DEVICES} \    -connection ethernet \        -model hdfs:///mnist.model \        -output hdfs:///mnist_features_result

在命令中定义了 num-executors 并且使他等于二,这是因为设定的集群中节点的数量是大于等于二的。
你设定的 num-executors 数值应该小于等于你自己集群当中工作节点的数量才可以,否则会发生数据倾斜,运行的时间会加一倍。Git上关于它的讨论


BatchSize批处理数量造成效率低下

在训练模型当中有对应的批处理 batch_size 数目的设置,比如在官方的 lenet_memory_train_test.prototxt 默认数值是 100 。 在单机运行的时候,批处理的计算是这样的:

total batch size = num-executors * batch size                 =   1 * 100 = 100

而对于集群来说,就拿上面那个官方的命令:

total batch size = 2 * 100 = 200

所以运行时间在同样迭代次数的情况下会比单机的长,一个公平的比较应该把 batch_size 调成 50

total batch size = 2 * 50= 100

这样才可以作为一个公平对比。

一下是我对几种情况做的测试:

executor    迭代次数    Jobs        时间  batch_size                    batch_size = 1281   10000   60      3min 2s 128 * 1 = 128 batch_size2   10000   89      1min 49s    64 * 2 = 128 batch_size3   10000   63      1min 33s    43 * 3 = 129 batch_size4   10000   62      7min 06s    32 * 4 = 128 batch_size                    batch_size = 2561   10000   114     5min 37s    256 * 1 = 256 batch_size2   10000   116     3min 9s 128 * 2 = 256 batch_size3   10000   116     1min 26s    85 * 3 = 255 batch_size4   10000   116     6min 28s    64 * 4 = 256 batch_size                    其他1   10000   33      1min 29s    64 * 1 = 64  batch_size3   10000   89      2min 0s 64 * 3 = 192 batch_size4   10000   151     6min 59s    85 * 4 = 340 batch_size3   10000   170     3min 26s    128 * 3 = 384 batch_size5   10000   187     6min 34s    85 * 5 = 425 batch_size6   10000   223     6min 38s    85 * 6 = 510 batch_size4   10000   223     6min 25s    128 * 4 = 512 batch_size5   10000   227     8min 1s 128 * 5 = 640 batch_size6   10000   331     9min 21s    128 * 6 = 768 batch_size

拿最明显的比较,同样是 128 batch_size 3个 execotor 比一个速度提升了很多,但是 4 个的时候就明显慢下来了,这是由于我的工作节点就三个,发生了数据倾斜。Git上关于速度的问题探讨


做这个东西真的还是挺麻烦的,遇到很多坑,不过这个过程也学习了很多,^_^