本文介绍如何在 Ubuntu 下安装管理多版本 CUDA .
文章目录
1. 安装 CUDA 和 CuDNN
1.1 CUDA 9.0 + CuDNN 7.6.5
CUDA Toolkit 9.0
cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
cuda-repo-ubuntu1604-9-0-local-cublas-performance-update_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-0-local-cublas-performance-update-2_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-0-local-cublas-performance-update-3_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-0-176-local-patch-4_1.0-1_amd64.deb
Base Installer
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-9-0 -y
Patch 1
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local-cublas-performance-update_1.0-1_amd64.deb
Patch 2
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local-cublas-performance-update-2_1.0-1_amd64.deb
Patch 3
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local-cublas-performance-update-3_1.0-1_amd64.deb
Patch 3
sudo dpkg -i cuda-repo-ubuntu1604-9-0-176-local-patch-4_1.0-1_amd64.deb
/usr/local/cuda-9.0
登录 nvidia.com,下载 cudnn-9.0-linux-x64-v7.6.5.32.tgz,并解压.
tar -xzvf cudnn-9.0-linux-x64-v7.6.5.32.tgz
将下列文件复制到 CUDA Toolkit 目录,并修改权限
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*
1.2 CUDA 9.2 + CuDNN 7.6.5
CUDA Toolkit 9.2
cuda-repo-ubuntu1604-9-2-148-local-patch-1_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-2-local_9.2.148-1_amd64.deb
Base Installer
sudo dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.148-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-9-2 -y
Patch 1
sudo dpkg -i cuda-repo-ubuntu1604-9-2-148-local-patch-1_1.0-1_amd64.deb
登录 nvidia.com,下载 cudnn-9.2-linux-x64-v7.6.5.32.tgz ,并解压.
tar -xzvf cudnn-9.2-linux-x64-v7.6.5.32.tgz
将下列文件复制到 CUDA Toolkit 目录,并修改权限
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*
1.3 CUDA 10.0 + CuDNN 7.6.5
CUDA Toolkit 10.0
cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
cuda-repo-ubuntu1604-10-0-local-nvjpeg-update-1_1.0-1_amd64.deb
Base Installer
sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-10-0 -y
Patch 1
sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-nvjpeg-update-1_1.0-1_amd64.deb
登录 nvidia.com,下载 cudnn-10.0-linux-x64-v7.6.5.32.tgz,并解压.
tar -xzvf cudnn-10.0-linux-x64-v7.6.5.32.tgz
将下列文件复制到 CUDA Toolkit 目录,并修改权限
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*
1.4 CUDA 10.1 + CuDNN 8.0.5
Base Installer
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-10-1 -y
登录 nvidia.com,下载 cudnn-10.1-linux-x64-v8.0.5.39.tgz,并解压.
tar -xzvf cudnn-10.1-linux-x64-v8.0.5.39.tgz
将下列文件复制到 CUDA Toolkit 目录,并修改权限
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. 使用 switch-cuda 脚本管理 CUDA 版本
2.1 脚本说明
switch-cuda 是牛津博士小哥 Patrick Hohenecker 写的 Shell 脚本,用于管理安装的 CUDA 版本.
git clone https://github.com/phohenecker/switch-cuda.git
我对原始代码做了小的修改, switch-cuda.sh
如下:
#!/usr/bin/env bash
set -e
# ensure that the script has been sourced rather than just executed
if [[ "${BASH_SOURCE[0]}" = "${0}" ]]; then
echo "Please use 'source' to execute switch-cuda.sh!"
exit 1
fi
INSTALL_FOLDER="/usr/local" # the location to look for CUDA installations at
TARGET_VERSION=${1} # the target CUDA version to switch to (if provided)
# if no version to switch to has been provided, then just print all available CUDA installations
if [[ -z ${TARGET_VERSION} ]]; then
echo "The following CUDA installations have been found (in '${INSTALL_FOLDER}'):"
ls "${INSTALL_FOLDER}" | egrep -o "cuda-[0-9]+\\.[0-9]+$" | while read -r line; do
echo "* ${line}"
done
set +e
return
# otherwise, check whether there is an installation of the requested CUDA version
elif [[ ! -d "${INSTALL_FOLDER}/cuda-${TARGET_VERSION}" ]]; then
echo "No installation of CUDA ${TARGET_VERSION} has been found!"
set +e
return
fi
# the path of the installation to use
cuda_path="${INSTALL_FOLDER}/cuda-${TARGET_VERSION}"
# filter out those CUDA entries from the PATH that are not needed anymore
path_elements=(${PATH//:/ })
new_path="${cuda_path}/bin"
for p in "${path_elements[@]}"; do
if [[ ! ${p} =~ ^${INSTALL_FOLDER}/cuda ]]; then
new_path="${new_path}:${p}"
fi
done
# filter out those CUDA entries from the LD_LIBRARY_PATH that are not needed anymore
ld_path_elements=(${LD_LIBRARY_PATH//:/ })
new_ld_path="${cuda_path}/lib64:${cuda_path}/extras/CUPTI/lib64"
for p in "${ld_path_elements[@]}"; do
if [[ ! ${p} =~ ^${INSTALL_FOLDER}/cuda ]]; then
new_ld_path="${new_ld_path}:${p}"
fi
done
# update environment variables
export CUDA_HOME="${cuda_path}"
export CUDA_ROOT="${cuda_path}"
export LD_LIBRARY_PATH="${new_ld_path}"
export PATH="${new_path}"
echo "Switched to CUDA ${TARGET_VERSION}."
set +e
return
脚本原理很简单:
- 检测
/usr/local
目录下的 CUDA 安装目录; - 设置
PATH
、LD_LIBRARY_PATH
、CUDA_ROOT
和CUDA_HOME
4 个环境变量控制 CUDA 版本.
由于 switch-cuda.sh
中使用了 return
语法,只能通过 source
命令使用. 计划使用函数代替,将 switch-cuda
作为命令使用.
2.2 使用说明
查看安装的 CUDA 版本:
source switch-cuda.sh
$ source switch-cuda.sh
The following CUDA installations have been found (in '/usr/local'):
* cuda-10.0
* cuda-10.1
* cuda-9.0
* cuda-9.2
选择 CUDA 版本:
source switch-cuda.sh <version>
选择使用 CUDA 10.1:
$ source switch-cuda.sh 10.1
Switched to CUDA 10.1.
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
选择使用 CUDA 10.0:
$ source switch-cuda.sh 9.0
Switched to CUDA 9.0.
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176