前言:
为了使mxnet支持分布式,需要对源码进行改动,然后重新编译。
环境:linux ,python3.7.3
准备:
首先下载mxnet源码
方法1:直接输入命令:
git clone --recursive https://github.com/dmlc/mxnet
但git下载的属实太慢,迫不得已我选择了第二种方法。
方法2:到到官方github手动下载源码,笔者使用的是最新版1.7.0
mxnet源码:https://github.com/apache/incubator-mxnet/releases/tag/1.7.0
这种方法也有一个问题就是,手动下载的源码里不包括第三方依赖库,也就是说在3rdparty下的文件夹都是空的
所以必须自己再手动去把所有3rdparty的依赖库下载下来。。
编译安装mxnet
# 安装必备工具包
sudo apt-get update
sudo apt-get install -y build-essential git ninja-build ccache
# 安装数学库
sudo apt-get install -y libopenblas-dev
# 安装opencv,mxnet使用opencv加载图片和对图片进行增强
sudo apt-get install -y libopencv-dev
修改cmake文件
cp config/linux.cmake config.cmake
# 在config.cmake里的修改为
# set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support")
# 这样编译后的mxnet就# 可以支持分布式了
新建build文件夹,开始编译
mkdir build; cd build
cmake ..
cmake --build . --parallel 8
#编译过程较久,且会出现很多错误,不过大多都是缺少依赖包的错误,依次装上就好,看不懂报错就百度谷歌
#每个人的报错都不太一样,取决于每个人的系统环境
#这个过程顺利的话大概一小时
编译成功后 再输入make install
# 进入python目录
cd python
python setup.py install
# 若想安装到python3,则执行python3 setup.py install
# conda中的某个环境中,则先激活该环境,然后执行python setup.py install
最后将之前编译生成的.so 和 .a文件(在build下)拷贝到库目录下
cp build/*.so /usr/local/lib/python3.7/dist-packages/mxnet-1.7.0-py3.7.egg/mxnet/
cp build/*.a /usr/local/lib/python3.7/dist-packages/mxnet-1.7.0-py3.7.egg/mxnet/
理论上到了这一步 就可以使用mxnet了
但如果像我比较倒霉的话,会有python找不到mxnet模块的错误。原因是python搜索模块的路径没有包括刚刚安装的mxnet。
解决的方法:在site-packages目录下新建文件:mypkpth.pth 然后把mxnet的路径写进去 如我的路径是/usr/local/lib/python3.7/dist-packages/mxnet-1.7.0-py3.7.egg
最后
测试一下成果:
import mxnet as mx
kv = mx.kv.create('local') # create a local kv store.
shape = (2, 3)
kv.init(3, mx.nd.ones(shape) * 2)
a = mx.nd.zeros(shape)
kv.pull(3, out=a)
print(a.asnumpy())
kv.push(3, mx.nd.ones(shape) * 8)
kv.pull(3, out=a) # pull out the value
print(a.asnumpy())
如果运行后有输出没报错的话,就算成功了!
参考:https://blog.csdn.net/liuholysun/article/details/90401441
https://zhuanlan.zhihu.com/p/245078233