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

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


我的配置:

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

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


Executor数量造成数据倾斜

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

export SPARK_WORKER_INSTANCES=2 
export DEVICES=1

spark-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 = 128
1   10000   60      3min 2s 128 * 1 = 128 batch_size
2   10000   89      1min 49s    64 * 2 = 128 batch_size
3   10000   63      1min 33s    43 * 3 = 129 batch_size
4   10000   62      7min 06s    32 * 4 = 128 batch_size

                    batch_size = 256
1   10000   114     5min 37s    256 * 1 = 256 batch_size
2   10000   116     3min 9s 128 * 2 = 256 batch_size
3   10000   116     1min 26s    85 * 3 = 255 batch_size
4   10000   116     6min 28s    64 * 4 = 256 batch_size



                    其他
1   10000   33      1min 29s    64 * 1 = 64  batch_size
3   10000   89      2min 0s 64 * 3 = 192 batch_size
4   10000   151     6min 59s    85 * 4 = 340 batch_size
3   10000   170     3min 26s    128 * 3 = 384 batch_size
5   10000   187     6min 34s    85 * 5 = 425 batch_size
6   10000   223     6min 38s    85 * 6 = 510 batch_size
4   10000   223     6min 25s    128 * 4 = 512 batch_size
5   10000   227     8min 1s 128 * 5 = 640 batch_size
6   10000   331     9min 21s    128 * 6 = 768 batch_size

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值