CUDA11.2环境上MXNet源码和pytorch源码编译
最近碰到一个机器,Ubuntu20.04系统,显卡是RTX3070,需要搭建mxnet和pytorch的环境,显卡驱动版本是460.39,cuda 版本是11.2的,显卡信息如下:
官网上看了下mxnet和pytorch的版本,目前没有支持cuda11.2的安装包,只能自己编译源码。所以摆在面前的只有两条路,一是降低显卡驱动和cuda的版本为cuda10,二是显卡不变,自己编译支持cuda11的mxnet和pytorch。
随后去nvidia官网看了下,30系列的显卡好像是AMpere架构的,只支持cuda11,如下图所示。降低显卡cuda版本走不通,只能走第二条路了。
显卡架构和cuda版本:https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html
1. cuda和cudnn安装
官网下载cuda11.2,很简单,直接运行安装
#install cuda ./cuda_11.2.0_460.27.04_linux.run --override --silent --toolkit echo "export PATH=\$PATH:/usr/local/cuda-11.2/bin" >> /etc/bash.bashrc echo "/usr/local/cuda-11.2/lib64" >> /etc/ld.so.conf ldconfig
官网下载cudnn-8.1.1
wget http://developer.download.nvidia.com/compute/redist/cudnn/v8.1.1/cudnn-11.2-linux-x64-v8.1.1.33.tgz
# install cudnn tar -xzvf ./cudnn-8.1.1.tgz cp -f ./cuda/include/cudnn* /usr/local/cuda/include cp -f ./cuda/lib64/libcudnn* /usr/local/cuda/lib64 chmod a+r /usr/local/cuda/include/cudnn* /usr/local/cuda/lib64/libcudnn*
这里需要注意的是,将cudnn解压的include下面的所有头文件拷贝到cuda安装的路径(一般是/usr/local/cuda/include)。有些教程里面只拷贝cudnn.h,后面编译pytorch时会报错cuda的版本错误。
2. pytorch编译
2.1 安装依赖
pip install numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses
2.2 克隆项目
git clone --recursive https://github.com/pytorch/pytorch #必须加上--recursive, 这样项目里面依赖的很多子模块项目(submodule)才会一起克隆下来 cd pytorch git submodule sync git submodule update --init --recursive
这里值得说明的是下面两条命令
git submodule sync
在项目路径下,有一个.gitmodule文件,里面记录了pytorch依赖的第三方项目的名称和对应github地址,这个命令就是加载这个文件,读取其中记录的第三方项目的github地址
git submodule update --init --recursive
这个命令式更新pytorch依赖的第三方项目的状态(都在third_party文件夹下面),如果没有clone下来,会根据上一步得到的github地址,将第三方项目clone下来。这里也是加上--recursive,是因为有的第三方项目还依赖别的github项目
另外就是github网络下载太慢了,有梯子的最好使用代理, 参考:https://zhuanlan.zhihu.com/p/58006202
如果和我一样没有代理,只能考虑使用国内镜像,目前已知Github国内镜像网站有github.com.cnpmjs.org ,git.sdut.me, hub.fastgit.org。速度根据各地情况而定,在clone某个项目的时候将github.com替换为github.com.cnpmjs.org即可, 如下:
//这是我们要clone的 git clone --recursive https://github.com/pytorch/pytorch //使用镜像
git clone --recursive https://github.com.cnpmjs.org/pytorch/pytorch
//或者 //使用镜像
git clone --recursive https://git.sdut.me/pytorch/pytorch
直接这样下载,有些pytorch第三方依赖的安装包还是网络很慢,甚至无法下载。还需要将第三方模块的github地址也改为镜像地址,即将.gitmodule文件中的地址进行修改,修改完后git submodule sync才会生效,我最终采用的命令如下:(有些第三方项目还依赖其他项目的也得修改其.gitmoudule为镜像地址)
vim .gitmodule //修改github地址为镜像地址 git submodule sync git clone --recursive https://github.com.cnpmjs.org/pytorch/pytorch git submodule update --init --recursive
如果是在github网页上直接下载pytorch的zip文件,里面也是没有pytorch依赖的第三方项目的代码。
2.3 编译安装
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"} python setup.py install
编译过程中报了一个cudnn版本问题,定位到下面这个错误
是因为我装cudnn时,只拷贝了cudnn.h到cuda的include目录,要将其中cudnn_version.h也拷贝过去(直接全部拷贝过去算了)
2.4 验证安装
首先退出当前文件夹,不要在当前文件夹下测试import torch ,否则会有一个报错告诉你更改文件夹。在其他路径下进行安装检查:
$ python -c "import torch; print(torch.__version__)" >>> 1.9.0a0+git997f05c $ python -c "import torch; print(torch.version.cuda)" >>> 11.2 $ python -c "import torch; print(torch.cuda.current_device())" >>> 0
记得要做最后一个检查,因为只有这个检查通过了才说明你的pytorch能够使用30系列gpu,如果你的pytorch对应的不是cuda11,前两个检查能通过,第三个会报错说pytorch和3070不兼容。(如果第三个报错很奇怪,重启机器后再测试)
2.5 安装torchvision
clone 项目并安装
git clone --recursive https://github.com.cnpmjs.org/pytorch/vision.git #我用的镜像 cd vision/ python setup.py install
安装检查
python -c "import torchvision; print(torchvision.__version__)" >>> 0.9.0a0+7992eb5
3.mxnet编译
3.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
3.2 下载源码
git clone --recursive https://github.com.cnpmjs.org/apache/incubator-mxnet //这里我用的镜像
同样的如果出现第三方依赖项目下载失败,也得去修改.gitmodule文件,如下
vim .gitmodule //修改github地址为镜像地址 git submodule sync git submodule update --init --recursive
3.3 源码编译
第一步.:切换分支
默认下载的是master分支,需要切换到v.1.8.x分支,切换分支后可以看到CMakelist.txt文件和make文件夹
cd mxnet git checkout v1.8.x
如果切换失败,使用下面方法
已经克隆了master分支,想要到指定的分支,使用以下方法: git branch -a 先查看当前远端分支情况 git checkout origin/v.1.8.x 选择远端v.1.8.x分支(origin为远程仓库别名) git branch v.1.8.x 创建本地v.1.8.x分支 git checkout v.1.8.x 选择本地新创建的分支就可以了
第二步:修改编译选项
cp make/config.mk .
vim config.mk
修改config.mk文件中如下设置:
USE_CUDA = 1 #表示编译gpu的mxnet,会自动去获取cuda的版本 USE_CUDA_PATH = /usr/local/cuda #cuda安装的路径
第三步:修改Makefile
vim Makefile
增加3070显卡算力代码(86)
KNOWN_CUDA_ARCHS := 30 35 50 52 60 61 70 75 80 86 #3070是sm_86架构的
第四步:编译
make -j8
编译中相关错误:
1. 如果发现ReadLock报错,需要修改两个地方:
修改CMakeList.txt, 将set(CMAKE_CXX_STANDARD 11)改成set(CMAKE_CXX_STANDARD 14)
需要修改 ./src/operator/tensor/elemwise_binary_broadcast_op_basic.cc第26行,从#include "./elemwise_binary_op.h"改成#include "./elemwise_binary_op-inl.h"
2. 如果找不到nvcc,在CMakeList.txt中指定nvcc的路径,set(CMAKE_CUDA_COMPILER "/usr/local/cuda/bin/nvcc")
set(SYSTEM_ARCHITECTURE x86_64)
3.4安装python支持
cd python
python setup.py install
我这里报错找不到libmxnet.so, 将编译后产生的libmxnet.so(在build文件夹或者mxnet主目录下)复制到python下面的mxnet文件夹即可,安装完成后出现如下提示:
Finished processing dependencies for mxnet==1.8.0
3.5测试gpu
>>> import mxnet as mx >>> a=mx.nd.ones((2,3),mx.gpu(0)) >>> print((a*2)
同样如果出现奇怪错误,建议重启电脑后测试
4. 参考教程
如果有其他问题,可以翻阅下面的链接
pytorch编译:
https://blog.csdn.net/mmmm223/article/details/111604359
https://zhuanlan.zhihu.com/p/342334096
mxnet编译:
https://mxnet.apache.org/versions/1.7.0/get_started/build_from_source.html
https://blog.csdn.net/TracelessLe/article/details/112687371
https://zhuanlan.zhihu.com/p/258606347
https://mxnet-tqchen.readthedocs.io/en/latest/how_to/build.html
https://mxnet.apache.org/versions/1.4.1/install/ubuntu_setup.html
版本问题
cuda版本和显卡驱动版本对应关系:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
各系列显卡信息:https://www.nvidia.cn/geforce/graphics-cards/compare/?section=compare-specs
显卡算力查询:https://developer.nvidia.com/zh-cn/cuda-gpus#compute