Ubuntu系统上实现类Anacondacuda版本管理,并根据代码环境高效切换
引言
深度学习的一些久远代码需要的cuda版本较老,可能和目前主流的cuda版本不一致,直接卸载原有cuda手动安装老版本不仅十分麻烦,而且没有必要为了一套代码搞坏电脑配置。
另一方面,Pytorch还相对较好(conda新建环境时会自动下载适配pytorch版本的cudatoolkit),运行tensorflow程序的环境配置就很麻烦,要安装合适的cuda和cuDNN,不同版本tensorflow需要的cuda和cuDNN还不一致,这对于windows这种只能安装一种cuda的操作系统,需要反复卸载重新安装,导致多数Windows的tensorflow开发者配置好一个版本后不愿升级,从某种程度上导致tensorflow的生态相较Pytorch不太友好。
下面就要说到Ubuntu的优势:Ubuntu等Linux发行版操作系统,可以安装多个cuda版本,通过修改软连接,便捷的切换cuda版本(功能类似天然的Anaconda),在配置和运行代码环境及三方包时很方便,可以把更多的精力专注在开发和快速实验上。
预备知识
在安装配置时,会遇到一些常见名词:
显卡驱动:是电脑正常运行的基础,台式机上显卡驱动错误会有很多显示问题(如:屏幕分辨率不一致等),因此不要轻易修改显卡驱动(Windows下载安装相对安全,Ubuntu使用
sudo
权限容易搞崩系统)。 驱动版本对cuda版本向下兼容,新驱动可以兼容所有旧的cuda版本,故驱动升级对cuda老版本配置无影响(建议升级新驱动)。nvidai-smi
可以查看显卡信息,包括驱动版本号,当前可最高支持的cuda version(这里的版本和实际使用的cuda版本未必一致)cuda:下载官网 显卡并行加速计算包
Pytorch:安装和官网下载命令中
cudatoolkit
一致或者相近的版本,如:官网cudatoolkit=11.3
,这里主机上的nvidai-cudatoolkit版本最好为11.3,当然稍高一点的nvidai-cudatoolkit=11.4|11.5|11.6也是可以的,但10.x和11.x跨大版本的不匹配是不行的driver version(
nvidia-smi
显示的那个)向下兼容runtime version(pytorch binding
的那个) pytorch自带runtime,不会用/usr/local下的cudatensorflow:按照官网配置下载对应的cuda
cuDNN:针对cuda实现神经网络推断加速的SDK,选择版本参照tensorflow的建议
安装流程
安装需要版本的cuda
去官网下载,选择runfile类型的安装文件,官网下载可能需要翻墙,以cuda_10.1.243_418.87.00_linux.run
为例,执行以下命令:
1 | # 运行安装 |
图文说明参考这里
安装匹配的cuDNN
去官网下载,匹配关系按照tensorflow版本看后两列
版本 | Python 版本 | 编译器 | 构建工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow-2.6.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 8.0 | 11.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 7.6 | 10.1 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 | 7.6 | 10.1 |
tensorflow-2.1.0 | 2.7、3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 | 7.6 | 10.1 |
tensorflow-2.0.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.15.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.14.0 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
tensorflow_gpu-1.13.1 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
解压
1
tar -zxvf cudnn-11.3-linux-x64-v8.2.0.53.tgz
复制解压得到的全部文件到cuda-toolkit的安装目录下(默认为
/usr/local/
)1
2
3# cudnn作为cuda-toolkit的补充,头文件复制到头文件目录中, lib文件同理
sudo cp cuda/include/cudnn* /usr/local/cuda-11.3/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64更改头文件权限(可选)
1
sudo chmod a+r /usr/local/cuda-11.3/include/cudnn* /usr/local/cuda-11.3/lib64/libcudnn*
配置环境变量
修改主目录下~/.bashrc文件,在末尾添加,修改后,更换cuda版本后以后无需改动这里的环境配置
1 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 |
之后更新一下~/.bashrc文件,使得配置生效
1 | source ~/.bashrc |
安装检验
驱动安装是否成功:
nvidia-smi
cuda_toolkit安装是否成功:
nvcc -V
(该版本可以和驱动输出右上角的版本号不同)cudnn安装是否成功:
(老版本)
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
(新版本)
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
多版本切换
1 | # 查看当前cuda指向的版本 |