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版本走不通,只能走第二条路了。

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-10.1/bin" >> /etc/bash.bashrc
echo "/usr/local/cuda-11.2/lib64" >> /etc/ld.so.conf
ldconfig

  官网下载cudnn-8.1.1

# 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

原文地址:https://www.cnblogs.com/silence-cho/p/14524181.html