Ubuntu 安裝 CUDA cuDNN pytorch tensorflow mxnet

林塔恩
20 min readOct 3, 2019

--

需求:

已經安裝 Ubuntu 20.04 or 18.04

目標:

  1. 安裝 Nvidia driver
  2. 安裝 CUDA
  3. 安裝 cuDNN
  4. 安裝虛擬環境
  5. 安裝 pytorch
  6. 安裝 tensorflow
  7. 安裝 TensorRT
  8. 安裝 mxnet & nccl

1. 安裝 Nvidia driver

清除原有的nvidia driver (如果你有的話)

sudo apt-get purge nvidia*

加入顯卡 ppa

sudo add-apt-repository ppa:graphics-drivers

package 更新

sudo apt-get update

sudo apt upgrade

Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

找出目前支援的GPU driver 版本

ubuntu-drivers list

安裝 nvidia driver

sudo apt install nvidia-driver-VERSION_NUMBER_HERE

我目前 (2021/7) 使用 460 版本

sudo apt install nvidia-driver-460

安裝完後重啟

sudo reboot

檢查是否安裝成功

nvidia-smi

2. 安裝 CUDA 11.2.2

https://developer.nvidia.com/cuda-toolkit-archive

從官網安裝指定版本,選用 linux、ubuntu、18.04、runfile(local)

如果想要安裝 tensorflow 2.5 以下版本請選用 CUDA Toolkit 11.0 Update1

wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.runsudo sh cuda_11.2.2_460.32.03_linux.run

如果已經安裝好了顯卡驅動,在執行上就選擇不安裝 cuda 提供的顯卡驅動程式

因為沒有選擇安裝 nvidia driver,會出現警告資訊,可以不用理會

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 460.00 is required for CUDA 11.2 functionality to work.

在 /home/<user_name> 底下的 .bashrc 檔案最下方新增並儲存

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin

重新開啟 terminal 或使用

source ~/.bashrc

更新 terminal 環境,之後檢查 cuda 版本

nvcc -V

正確會顯示

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Feb_14_21:12:58_PST_2021
Cuda compilation tools, release 11.2, V11.2.152
Build cuda_11.2.r11.2/compiler.29618528_0

如果已經安裝了CUDA,但出錯怎麼辦?

3. 安裝 cuDNN

先登入 nvidia cudnn 安裝官網,註冊並同意使用者條款,選擇 ubuntu18.04 版本安裝 cudnn下載。

https://developer.nvidia.com/rdp/cudnn-download

安裝方法分成兩種

(1)tar file 安裝

下載 cuDNN Library for Linux,是一個壓縮檔 tar ,要將其內容解壓縮複製到安裝 cuda 的資料夾內

解壓縮

tar -xzvf cudnn-11.3-linux-x64-v8.2.1.32.tgz

複製檔案,貼到安裝 cuda 的資料夾內

sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

(2)deb file 安裝

下載以下三個檔案

cuDNN Runtime Library for Ubuntu18.04 (Deb)

cuDNN Developer Library for Ubuntu18.04 (Deb)

cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)

使用 dpkg -i <file_name> 執行安裝

安裝 cuDNN runtime library

sudo dpkg -i libcudnn8_8.2.1.32–1+cuda11.3_amd64.deb

會看到出現

/sbin/ldconfig.real: /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so.8 is not a symbolic link

如果想解決此 Warning 可看這

安裝 cuDNN developer library

sudo dpkg -i libcudnn8-devel_8.2.1.32–1+cuda11.3_amd64.deb

安裝 cuDNN sample 和 user guide

sudo dpkg -i libcudnn8-doc_8.2.1.32–1+cuda11.3_amd64.deb

測試 cuDNN 是否正確安裝,在原先 cuDNN 檔案下載位置使用

cp -r /usr/src/cudnn_samples_v8/ $HOME
cd $HOME/cudnn_samples_v8/mnistCUDNN
make clean && make
./mnistCUDNN

執行完看到 Test passed! 表示成功安裝

FreeImage.h: No such file or directory

Cuda failurer...Aborting…?

4. 安裝虛擬環境

可以選擇使用 virtualenv 或是 Anaconda,推薦在 ubuntu 上可以使用比較輕量的 virtualenv

(1)virtualenv 安裝

安裝 virtualenv

sudo apt-get install python3-pip
sudo pip3 install virtualenv
sudo pip3 install virtualenvwrapper

在 /home/<user_name> 底下的 .bashrc 檔案最下方新增並儲存

export WORKON_HOME=~/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=<python3_path>
source /usr/local/bin/virtualenvwrapper.sh

<python3_path> 可以使用

which python3

找到你的 python3 執行檔案位置,一般會在

/usr/bin/python3

完成後開啟新的一個 terminal,或是使用

source ~/.bashrc

更新 terminal 環境

創造新的虛擬環境

mkvirtualenv <venv_name>

之後也可以用 workon 啟動已經存在的虛擬環境

workon <venv_name>

(2)Anaconda 安裝

選擇個人版本的 anaconda 下載

確定使用的是有 sudo 權限的 user 來安裝 anaconda

bash Anaconda3–2021.05-Linux-x86_64.sh

一路 enter 到最底選 yes

Do you approve the license terms? [yes|no]

同意使用 conda 進行安裝

Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/fishworm/.bashrc ? [yes|no]

安裝完成後,檢查安裝內容

conda list

anaconda 創造虛擬環境

conda create --name <venv_name> python3 numpy

啟動 conda 虛擬環境

conda activate <venv_name>

5. 安裝 pytorch

啟動虛擬環境

找到 stable for linux ,選擇對應的 cuda 版本
以下是以 anaconda 為虛擬環境的執行碼

conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia

執行後自動下載安裝

測試是否正確安裝,啟動 python 輸入

>>> import torch
>>> torch.cuda.is_available()
True

輸出 True 代表正確安裝

6. 安裝 tensorflow

啟動虛擬環境,安裝 tensorflow

pip install tensorflow

pip 目前 (2021/7) 所安裝的 tensorflow 2.5 本身就包含了 gpu 功能

測試是否正確安裝,啟動 python 輸入

>>> import tensorflow as tf
>>> physical_devices = tf.config.list_physical_devices('GPU')
>>> print("Num GPUs:", len(physical_devices))
Num GPUs:1

正確的話以上程序會顯示你所擁有的 gpu 數量

7. 安裝 TensorRT

目前 (2022/3) TensorRT 8.2 GA 支援 CUDA
10.2
11.0 update 1
11.1 update 1
11.2 update 2
11.3 update 1
11.4 update 3
11.5 update 1
11.6

想要使用 TensorRT python API 需要安裝 pycuda
注意 pycuda 需要在已經安裝完 CUDA 和 numpy 後才安裝

python3 -m pip install 'pycuda<2021.1'

如果出現 nvcc not in path 錯誤,去 ~/.bashrc 下添加

export PATH=$PATH:/usr/local/cuda/bin
export CUDA_ROOT=$CUDA_ROOT:/usr/local/cuda/

找到 TensorRT 下載位置

https://developer.nvidia.com/nvidia-tensorrt-download

可以選擇用 deb or tar 的方式安裝,在此選用 tar 方式,下載後解壓縮

version="8.x.x.x"
arch=$(uname -m)
cuda="cuda-x.x"
cudnn="cudnn8.x"
tar -xzvf TensorRT-${version}.Linux.${arch}-gnu.${cuda}.${cudnn}.tar.gz

對我而言是

tar -zxvf TensorRT-8.2.3.0.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz

在 ~/.bashrc 內加上 TensorRT 解壓縮後的位置

gedit ~/.bashrc

到最後一行加上

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<TensorRT-${version}/lib>

我個人解壓縮位置選在 $HOME

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/TensorRT-8.2.3.0/lib

啟動虛擬環境後安裝 Python TensorRT wheel file
以下所有安裝都是處於虛擬環境之下

workon <env_name>
cd TensorRT-${version}/python

使用 python3.x

pip3 install tensorrt-*-cp3x-none-linux_x86_64.whl

選用的版本 cp3x 的 x 對應你的 python3 版本

安裝 Python UFF wheel file,只有要使用 tensorflow + TensorRT 的人才需要

cd TensorRT-${version}/uff
pip3 install uff-0.6.9-py2.py3-none-any.whl

檢查安裝

which convert-to-uff

安裝 Python graphsurgeon wheel file

cd TensorRT-${version}/graphsurgeon
pip3 install graphsurgeon-0.4.5-py2.py3-none-any.whl

安裝 Python onnx-graphsurgeon wheel file

cd TensorRT-${version}/onnx_graphsurgeon
pip3 install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl

確認是否安裝成功,啟動 python 輸入

import pycuda
import tensorrt
import tensorflow
from tensorflow.python.compiler.tensorrt import trt_convert as trt

測試是否正確安裝可以使用 sampleMNIST 做測試

8. 安裝 mxnet & nccl

從 mxnet 1.8+cu112 之後開始,mxnet 需要安裝 nccl 模組才能正確執行
沒有安裝 nccl 在嘗試 import mxnet 時會出現

OSError: libnccl.so.2: cannot open shared object file: No such file or directory

安裝 nccl 可以選擇兩種方法

(1)從網路上下載

wget https://developer.download.nvidia.com/compute/cuda/repos/<distro>/<architecture>/cuda-<distro>.pinsudo mv cuda-<distro>.pin /etc/apt/preferences.d/cuda-repository-pin-600

<distro> 是 OS 版本,例如 ubuntu1604、ubuntu1804、ubuntu2004

<architecture> 是 CPU 架構,例如 x86_64、ppc64le、sbsa

加入 apt-key,並更新

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/<distro>/<architecture>/7fa2af80.pubsudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/<distro>/<architecture>/ /"sudo apt-get update

(2)下載 deb 檔

需要先註冊

https://developer.nvidia.com/nccl/nccl-download

選擇指定版本下載,並安裝

sudo dpkg -i nccl-repo-<version>.deb

完成以上兩種方法的任一種之後,執行以下命令安裝 nccl

sudo apt install libnccl2=<nccl_version>+<cuda_version> libnccl-dev=<nccl_version>+<cuda_version>

再安裝 mxnet 支援 cuda 11.2 版本

pip install mxnet-cu112

測試安裝是否成功

>>> import mxnet as mx
>>> a = mx.nd.ones((2, 3), mx.gpu())
>>> b = a * 2 + 1
>>> b.asnumpy()
array([[ 3., 3., 3.],
[ 3., 3., 3.]], dtype=float32)

參考:

https://www.mvps.net/docs/install-nvidia-drivers-ubuntu-18-04-lts-bionic-beaver-linux/

https://www.digitalocean.com/community/tutorials/how-to-install-anaconda-on-ubuntu-18-04-quickstart

https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html

https://docs.nvidia.com/deeplearning/nccl/install-guide/

解決 libcudnn.so.8 is not a symbolic link 警告

這是因為在 copy cudnn file 時失去了 symlink 而產生

cd /usr/local/cuda/lib64
ls -lha libcudnn*

理論上應該要是

lrwxrwxrwx 1 root root 13 三 13 15:37 libcudnn.so -> libcudnn.so.8
lrwxrwxrwx 1 root root 17 三 13 15:37 libcudnn.so.8 -> libcudnn.so.8.2.1
-rwxr-xr-x 1 root root 439M 三 13 10:26 libcudnn.so.8.2.1
-rw-r — r — 1 root root 413M 三 13 10:26 libcudnn_static.a

實際上我的內容是

-rwxr-xr-x 1 root root 439M 三 13 10:26 libcudnn.so
-rwxr-xr-x 1 root root 439M 三 13 10:26 libcudnn.so.8
-rwxr-xr-x 1 root root 439M 三 13 10:26 libcudnn.so.8.2.1
-rw-r — r — 1 root root 413M 三 13 10:26 libcudnn_static.a

連結喪失,需要重新連結

sudo ln -sf libcudnn.so.8.2.1 libcudnn.so.8
sudo ln -sf libcudnn.so.8 libcudnn.so

依此類推所有 libcudnn 的檔案

全部連結後執行刷新

sudo ldconfig

如果沒有出現 … is not a symbolic link 表示解決問題!

以下是各種遇到的各種 Bug

Bug 1: 無法進行更新

E: Could not get lock /var/lib/dpkg/lock — open (11: Resource temporarily unavailable)E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

遇到上述狀況表示有檔案被鎖住,檢查有甚麼檔案在運行

方法一

APT package management tool 檢查 Ubuntu Software Center

或 Synaptic Package Manager有無正在運行的程式

或用Linux command line找出正在使用apt-get的行動,並停止它

ps aux | grep -i apt

上述會顯示id號碼

sudo kill -9 <process id>

或是全部刪除

sudo killall apt apt-get

方法二

因為突然斷網或關機,導致更新到一半的程式被鎖住,此時不會有運行id但仍產生錯誤,因為有了lock file

lock file是為了避免檔案同時被多個程式存取,apt-get運行時會產生lockfile,若沒有正常關閉則lockfile無法消失,並阻擋安裝

用 lsof 檢查有無lockfile

lsof /var/lib/dpkg/lock
lsof /var/lib/apt/lists/lock
lsof /var/cache/apt/archives/lock

回傳的單一數值就是之前運行lockfille的執行號碼,刪除他(PID是號碼)

sudo kill -9 PID

再刪除lockfile

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

重新配置packages

sudo dpkg — configure -a

若仍有錯誤會出現

“dpkg: error: dpkg frontend is locked by another process”

使用額外步驟,找出保有lockfile的執行號碼

lsof /var/lib/dpkg/lock-frontend

刪除他

sudo kill -9 PID

移除lockfile並再試一次

sudo rm /var/lib/dpkg/lock-frontend
sudo dpkg — configure -a

Bug 2: CUDA 安裝失敗,移除步驟

移除 CUDA

sudo apt-get remove nvidia-cuda-toolkit

移除cuda和關聯檔案

sudo apt-get remove — auto-remove nvidia-cuda-toolkit

徹底清除資料

sudo apt-get purge nvidia-cuda-toolkit or sudo apt-get purge — auto-remove nvidia-cuda-toolkit

Bug 3: cuDNN 驗證失敗

. ubuntu@ubuntu:$ ./mnistCUDNN
cudnnGetVersion() : 7003 , CUDNN_VERSION from cudnn.h : 7003 (7.0.3)
Cuda failurer version : GCC 5.4.0
Error: CUDA driver version is insufficient for CUDA runtime version
error_util.h:93
Aborting…

根據

https://devtalk.nvidia.com/default/topic/1025828/cudnn/failed-cudnn-test-mnistcudnn-/1

表示重新開機一次就成功了

Bug 4:FreeImage.h: No such file or directory

cudnn 驗證用的 smaple code 需要安裝 FreeImage,使用

sudo apt-get install libfreeimage3 libfreeimage-dev

完成安裝

--

--