支持分布式部署和训练是mxnet的亮点。但是,根据个人实验的情况以及github上看到的情况看,编译和部署mxnet分布式版本并不容易。没有详细的文档,也没有开箱即用的分布式版本,只能靠自己编译和部署。下面记录一下个人在win10上编译成功mxnet分布式版本的经验。
第一步:我们得先安装好Protobuf和ZMQ。
1) 安装ZMQ. (www.zeromq.org)
选择一:下载windows 64位安装版。例如,ZeroMQ-4.0.4~miru1.0-x64.exe。 然后,安装到某目录下。例如,G:\Program Files\ZeroMQ 4.0.4。 我使用这个64位版本来编译mxnet.
选择二:下载一个ZMQ源代码,例如zeromq-4.2.1.zip. 解压,然后使用cmake制作vs2013或者VS2015的工程文件。最后编译成64位的release版本。(注意检查编译必须要基于/MT选项,否则后面link的时候会出错)
2) 安装Protobuf(目前只支持2.5.0版本。2.5以上版本在最后link时都失败了)
https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
下载完后解压,然后进入protobuf-2.5.0\vsprojects目录下,直接用VS2013或者2015打开项目文件protobuf.sln。这个工程项目很旧,需要做些修改:
1、 把各个子项目编译目标换成64位
2、 把各个子项目编译选项都改成基于/MT选项,否则后面link的时候会出错.
3、 如果编译出现error C3861: “max” 或”min” ,那么需要在相关头文件上加上” #include<algorithm> ”
最后,编译生成64位的Protobuf release版本。
第二步:
1) 下载mxnet的源代码。
git clone https://github.com/dmlc/mxnet
2) 启动cmake图形界面,把mxnet工程的USE_DIST_KVSTORE选项勾上。这个选项会触发两个新的选项:Protobuf和ZMQ.
设置Protobuf
把Protobuf_SRC_ROOT_FOLDER 设置成protobuf-2.5.0的目录。例如,G:/mxnet-cpp/protobuf-2.5.0
设置ZMQ
把ZMQ_INCLUDE_DIR设置成ZMQ的头文件Include目录。例如,G:/Program Files/ZeroMQ 4.0.4/include
把ZMQ_LIBRARY设置成ZMQ的lib文件绝对路径。例如,G:/Program Files/ZeroMQ 4.0.4/lib/libzmq-v120-mt-4_0_4.lib。注意:libzmq-v120-mt-4_0_4.lib很重要,后面编译生成的libmxnet.dll会去寻找libzmq-v120-mt-4_0_4.dll文件。
然后,使用cmake的generate功能生成mxnet的VS项目文件。后面的剩下的编译mxnet和安装的步骤,可以参考我写的另一篇文章:《win10成功安装GPU版MXNET的经历》。
根据我的经验,有一个LIBZMQ-V120-MT-4_0_4.DLL文件也需要放到path变量里。否则,调用mxnet可能会报错。
第三步:测试。
写段python代码:
import mxnet as mx
kvs = mx.kv.create('dist')
如果报类似下面的DMLC_NUM_SERVER异常就表明已经是分布式版本了。
[11:17:59] G:\mxnet-cpp\mxnet094\mxnet\dmlc-core\include\dmlc/logging.h:300: [11:17:59] G:\mxnet-cpp\mxnet094\mxnet\ps-lite\src\postoffice.cc:18: Check notnull: Environment::Get()->find("DMLC_NUM_SERVER")
后记:在windows平台编译分布式的mxnet版本会有非常多的坑,不是一个好的选择。建议还是在linux或Unix平台上编译。
Mxnet分布式版本相关文档链接:http://mxnet.io/how_to/multi_devices.html