最近碰到一個機器,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-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