在我之前的文章上可以看到关于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上关于速度的问题探讨
做这个东西真的还是挺麻烦的,遇到很多坑,不过这个过程也学习了很多,^_^