写在前面的话,小半周时间都为了搞这个,真的头疼,没有问题的人可以执行得非常顺利,一旦有问题,就怎么执行都不对,希望大家不要灰心,坚持到底!(另,我的ubuntu所有环境安装详细记录:win10双系统ubuntu安装+卸载&driver+cuda+cudnn+anaconda+mxnet编译(好文推荐+实际动手填坑系列)_anaconda mxnet 编译-CSDN博客)
由于显卡的硬性要求,我要安装mxnet-cu111,但目前官网并没有发布,只能自己编译。
环境:ubuntu20.04+cuda11.1+显卡是RTX3060
试错一:官网参考:Building From Source | Apache MXNet
不过官网许多地方写得并不详细,对于小白的我来说,不敢乱改
试错二:参考博客:https://www.cnblogs.com/silence-cho/p/14524181.html
因为该博客写得非常具体,且显卡配置和ubuntu版本与我的环境都非常相似,所以我一开始无条件按照该篇博客的步骤一步一步来的,结果一直有错误,我就不断的重新来过,结果搞了有三天都没成功,哭死(这里并不是说该博客一定错误,可能就是不适合我的环境)
报错就是,比如最后执行make命令的时候,先是显示进度,从0%-100%要非常久,然后就不停地显示类似于报错的信息,总是重复的,而且不ctrl+c,就不会停止,显然能看出来是不可能成功的。最后可以在mxnet文件夹查找 libmxnet.so 看看,如果没有生成该文件那就是没有编译成功。
查找命令:
find ./ -name libmxnet.so
成功:参考博客:Ubuntu20编译mxnet源码-CSDN博客
绝望了一天半之后,真的就是突然发现,原来还有其他的尝试方法,而且不需要改那么多的配置,命令十分简单,于是我就试试了。当然其间也遇到了许许多多的难题,我又花了大半天时间,结果弄出来的是一个cpu版本的mxnet,不过也算是一种进步吧!
之后的一天,我又尝试编译gpu版本的mxnet,最后的最后,发现原因竟然是因为驱动有问题,我之前明明安装好了驱动呀,为什么几天没检查居然发现驱动出问题了???以下是我的解决方法:nvidia-smi突然之间运行不了了_服务器突然在执行nvidia-smi命令后卡住-CSDN博客
真的是,解决了这个问题之后,发现编译gpu版本的mxnet真的可以如此简单!!!
吓得我现在每隔一段时间就运行一下 nvidia-smi 检查下驱动
一切就像Ubuntu20编译mxnet源码-CSDN博客 博客中介绍的那样简单,我这里写下一些详细的步骤,以解决没有那么顺利的同学的后顾之忧。
1、安装依赖
sudo apt-get update
sudo apt-get install -y build-essential git ninja-build ccache libopenblas-dev libopencv-dev cmake
sudo apt install gfortran
2、任选一个目录,将 mxnet 源码及其依赖包下载到当前目录,命令如下:
(1)无vpn的情况,则采用镜像网址下载:
git clone --recursive https://github.com.cnpmjs.org/apache/incubator-mxnet mxnet
(2) 有vpn的情况,则直接下载:
git clone --recursive https://github.com/apache/incubator-mxnet mxnet
3、git下载依赖包中途出错的问题:如果上述命令执行到最后因为个别依赖包下载不下来导致命令错误退出。
解决办法:
到 .gitmodules 文件中,将相应网址改为镜像网址。执行以下命令可实现一步更改,把文件中所有匹配到的 github.com字符串 改为 github.com.cnpmjs.org 字符串:
sed -i "s/github.com/github.com.cnpmjs.org/g" `grep github.com -rl .gitmodules`
然后再执行:第一行是更新配置,第二行是继续执行下载任务
git submodule sync
git submodule update --init --recursive
这边依赖包一定一定要下载好,否则之后编译肯定会出错的!
如果编译过程中还是报依赖包的相关错误,就反复执行以下命令,直到没有任何打印信息为止
git submodule update --init --recursive
tips:如果依赖包下载还是有问题,就找到对应包下面的.gitmodules文件,如法炮制,将里面的github.com字符串 改为 github.com.cnpmjs.org 字符串,然后运行git submodule sync
然后回到mxnet目录,重新执行git submodule update --init --recursive,直到不再有打印信息,说明所有依赖包都下载成功了
4、博客https://www.cnblogs.com/silence-cho/p/14524181.html 里面提到的要切换分支,经过我的验证,切不切换都无所谓,切换还增加复杂度,建议就不要麻烦了。如果你需要切换分支,那么就可以参考这里:
如果你已经创建过该仓库了,则只需执行:(没有会报错,执行后面的命令即可)
cd mxnet
git checkout v1.8.x
不过通常是没有,则需要执行以下命令创建本地仓库
cd mxnet
git branch -a 先查看当前远端分支情况
git checkout remotes/origin/v1.8.x 选择远端v1.8.x分支(origin为远程仓库别名)
git branch v1.8.x 创建本地v1.8.x分支
git checkout v1.8.x 选择本地新创建的分支就可以了
有时拉分支会报错,那是因为你改动了里面的文件,我通常的做法是把 .gitmodules 文件还原回去,当然你也可以根据提示中的来操作,比如提交更改,或者全部刷新。
这个命令是用来恢复仓库的:
git checkout -- *
5、make编译
我听说以前的版本是执行 cp make/config.mk ./ 也就是把make目录下的 config.mk 复制到 mxnet目录下作为配置文件。不过现在的版本是将config目录下的文件复制过来。
config目录下有 linux_gpu.cmake、linux.cmake 及其他文件,有的人是用的 linux.cmake 配置文件,我这边采用 linux_gpu.cmake,因为我要编译的是gpu版本的mxnet。
cp config/linux_gpu.cmake config.cmake
我也不知道如果cmake失败,是不是一定要删除build文件夹重新来过,总之防患于未然。以下命令请一步一步执行,避免出错:
rm -rf build # 如果有build文件夹,可以删除
mkdir build
cd build
cmake ..
cmake --build .
我还改了一个地方,不知道是否有影响:
把复制过来的 config.cmake 文件中的 CMAKE_CUDA_COMPILER 所在行改为如下,cuda路径是我个人的cuda 安装路径。
set(CMAKE_CUDA_COMPILER "/usr/local/cuda-11.1/bin/nvcc" CACHE BOOL "Cuda compiler (nvcc)")
6、最后终于成功执行了,编译过程还是有很多类似于报错的信息,但是成功执行到100%并退出了,检查了下, 我要生成的文件在 build/libmxnet.so。
7、编译完成!先给我的python3安装上mxnet
cd python
python setup.py install
执行:
import mxnet as mx
a=mx.nd.ones((2,3),mx.gpu(0))
print((a*2)
有一个奇怪的打印信息,貌似不是问题:/home/sophia/mxnet/src/storage/storage.cc:199: Using Pooled (Naive) StorageManager for GPU
不过最后是执行成功的,那应该是没问题了吧