• 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

  • 相关阅读:
    基于HTTP的上载和下载
    HttpContext.current中的applicationstate的运用
    获取汉字拼音首字母
    一个文件上传的类
    HttpContext.current.request[""]
    文件转换为流,流通过字节转换为文件
    字节数组和字符串的相互转化……
    时间精确到毫秒的写法
    设计模式之Builder(转载)
    Windows XP中配置PHP+IIS环境
  • 原文地址:https://www.cnblogs.com/silence-cho/p/14524181.html
Copyright © 2020-2023  润新知