Ubuntu + RStudio + Tensorflow的安装
- Rstudio创始人Allaire和Keras之父Chollet合写的“R语言和深度学习”,宣告R也可以做深度学习。书里并不推荐windows 10上运行Tensorflow的GPU版本,而是在Ubuntu上。当然要用GPU版,只好装Ubuntu。
- 随着安装过程中不断查找资料,发现windows版本的Tensorflow-GPU可能也运行得不错了,这一点有待证实。
- 这本书的附录A给出了GPU版本安装过程,里面的命令已经过时,好在给出的网站还在。但是网站所给的例子是基于Ubuntu18.04和cuda11.0的,如果完全copy网站的命令进行安装会遇到麻烦,我在这里足足卡了两个星期。
- 这一篇记录整个安装过程,重点在本地GPU支持的安装。安装之前我连Ubuntu都没听说过,显卡方面的知识约等于零——事实证明这样也行。
- 安装一共有四步
1. 安装Ubuntu
2. 安装R4.1
3. 安装Rstudio和Tensorflow
4. 安装GPU支持
以下是安装过程和所参考的资料。
1. 安装Ubuntu
-
策略
- 安装win10 和 Ubuntu20.04双系统
- Ubuntu只用来跑Tensorflow,严禁手欠安装其他东西,以减少不必要的麻烦。
-
步骤
- 双系统安装参照:(保姆式教学) Win10 + Ubuntu 20.04——双系统安装方法 + 配置显卡 + root权限 + flash调配
- 在第四步为新系统,分配硬件存储空间中,参考了更详细的分区说明Ubuntu20.04操作系统安装及重中之重:系统分区
- 双系统安装参照:(保姆式教学) Win10 + Ubuntu 20.04——双系统安装方法 + 配置显卡 + root权限 + flash调配
-
重装
- 按照前面的步骤,系统安装过程非常容易,但是手欠尝试安装汉语输入法,把系统搞死,不知道怎么解决,只好重装(一号坑)。重装参照了双系统重装Ubuntu20.04及系统基本配置
- 按照前面的步骤,系统安装过程非常容易,但是手欠尝试安装汉语输入法,把系统搞死,不知道怎么解决,只好重装(一号坑)。重装参照了双系统重装Ubuntu20.04及系统基本配置
2. 安装R 4.1
按照R官网的安装教程即可,按顺序执行第一个框里的命令。在执行完第二个命令之后敲入
gpg --show-keys /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
如果出现
298A3A825C0D65DFD57CBB651716619E084DAB9
的key值,就继续,如果没有,执行以下命令安装key值。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
sudo apt update
如果系统中有老版本的R,可以看这个网页如何卸载。
完成后如果在应用菜单里找到了R,就是安装成功。
3. 安装Rstudio和Tensorflow包
-
下载Rstudio安装包
RStudio官网提供了Ubuntu安装包,找最新的版本下载。
安装步骤按照How to install RStudio on Ubuntu 20.04 Focal Fossa Linux
执行。 -
安装完成后运行Rstudio,若提示configuration failed because libcurl was not found,可能是因为库不完整,需要阅读错误提示,找到所缺库的名字通过终端安装,我自己手动装了三个库
libcurl4-openssl-dev, libssl-dev, libxml2-dev
(二号坑)
sudo apt-get install libcurl4-openssl-dev libssl-dev libxml2-dev
- 在RStudio中安装Tensorflow
安装过程在Rstudio官网,执行
install.packages("tensorflow")
library(install_tensorflow)
注意安装过程中系统会问是否安装Miniconda Would you like to install Miniconda? [Y/n]:,一定要选Y。(选n的话需要手动装aniconda——重装Rstudio并不会有再选一次的机会……三号坑,大坑)
4. 安装 GPU支持(四到N号坑,数不清试了多少次)
在这一步需要安装三样东西:nvidia显卡驱动、cuda、和cuDNN,这三样的版本号要一致。要命的是Tensorflow网页给出的命令参考,如果不加改动照着做的话,会导致版本冲突(下面会详细解释)。对于新手来说尤其要命,因为不懂这些命令是什么意思,也就无从发现版本冲突。
解决方案是所有东西的都装最新版本。这句话听着好像多余,但是开发和维护cuda、tensorflow和Rstudio是三伙不同的人,版本上不同步、被迫迁就旧版本是有可能的。前几次安装cuda出错以后我去找答案,见到一个论坛上有人说Rstudio只支持cuda11.0,把显卡驱动和cuda都降级问题就能解决,事后证明这个方案行不通,而这个答案距现在也就一年的样子。再一次,作为新手,这种情况下想做出正确判断是很难的。(大坑)
注意Rstudio官网给出的GPU支持部分完全过时,可以放心略过。
需要参考的是Tensorflow的GPU支持,安装例子在Ubuntu 18.04 (CUDA 11.0)部分。
安装GPU本地支持一共分为三步,每一步会先列出网页上的原始命令,之后是我在此基础上进行的修改。对照着记录的原因是,cuda未来仍然会升级,但Tensorflow的网页更新可能不会那么及时。知道为什么修改和如何修改,在新版本cuda出来以后就知道如何处理。
具体操作:
1. 指定程序源
Tensorflow网页的原始命令
# Add NVIDIA package repositories
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
实际使用的命令
# Add NVIDIA package repositories
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/ /"
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb
sudo apt-get update
这里做了两个改动:
- 程序源针对的是18.04版本,所以网址路径中是“ubuntu1804”,在实际执行中需要替换成ubuntu2004,不然第3步中的程序无法找到。
- Tensorflow的官网上给出的程序源在nvidia.com,我替换成了developer.download.nvidia.cn。但在实际安装过程中nvidia可能通过识别IP,自动给我导到了cn,不然下载速度不会飞快。
-
sudo apt-get update
运行到最后,会出现几个警示说某些文件夹不存在,如果全部来自服务器上的ubuntu1804文件夹,就没什么影响,可以放心忽略。
2. 安装nvidia显卡驱动
# Install NVIDIA driver
sudo apt-get install --no-install-recommends nvidia-driver-450
# Reboot. Check that GPUs are visible using the command: nvidia-smi
- 网页中的命令可以直接使用,不用修改
- 但需要注意,这部分的命令虽然指定安装450版本的驱动,事实上服务器会无视命令中的版本号,自动安装最新版本。截止到现在,最新版本号是470.57.02,所匹配的cuda版本号是cuda 11.4。但网页随后给出的原始命令安装的cuda都是11.0,直接copy运行这些命令将导致冲突。(最大坑,连环坑)。
- 冲突的结果是有些库无法安装,安装完成后系统虽然会报告这些库没有安装,但不会解释原因。
- R运行tensorflow时会提示有个动态库里面有个东西打不开,不影响使用CPU版本,但是GPU版本就没法用了……
- 实际安装过程中我没有执行这个命令,而是通过Ubuntu里面的Additional Driver找到470进行安装。效果跟
apt install
是一样的。 - 不管用哪种方式安装,之后都需要重启,重启后再到终端里运行
nvidia-smi
,才能看到驱动版本号和cuda的版本号。
3. 安装cuda11.4
Tensorflow网页的原始命令
# Install development and runtime libraries (~4GB)
sudo apt-get install --no-install-recommends \
cuda-11-0 \
libcudnn8=8.0.4.30-1+cuda11.0 \
libcudnn8-dev=8.0.4.30-1+cuda11.0
# Install TensorRT. Requires that libcudnn8 is installed above.
sudo apt-get install -y --no-install-recommends libnvinfer7=7.1.3-1+cuda11.0 \
libnvinfer-dev=7.1.3-1+cuda11.0 \
libnvinfer-plugin7=7.1.3-1+cuda11.0
- 网页中给出了两个命令,每个命令分别安装三个包:第一个命令安装
cuda-11-0
,libcudnn8=8.0.4.30-1+cuda11.0
,和libcudnn8-dev=8.0.4.30-1+cuda11.0
,第二个命令安装libnvinfer7=7.1.3-1+cuda11.0
,libnvinfer-dev=7.1.3-1+cuda11.0
,libnvinfer-plugin7=7.1.3-1+cuda11.0
。(对于Ubuntu新手:命令中的反斜杠“\”是分行符,没有实际含义……小坑)。 - 如前,原版命令安装的是cuda11.0,但最新版的显卡驱动要求安装cuda11.4和对应的库。找到正确的版本号的方法是
- 到nvidia的开发者网站(https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/)
- 对照着前面Tensorflow网页给出的原始命令的文件名,找适配cuda14的版本。(注意网址中的“ubuntu2004”,如果自己用的是1804,就对照改成ubuntu1804。)
- 举例来说,对于
libcudnn8=8.0.4.30-1+cuda11.0
,就找以libcudnn8
开头、以cuda11.4
结尾的文件,找到的文件是libcudnn8_8.2.2.26-1+cuda11.4.deb
,然后把原始安装命令中的libcudnn8=8.0.4.30-1+cuda11.0
换成后者。
- 举例来说,对于
实际使用的命令
sudo apt-get install cuda-11-4_11.4.1-1_amd64.deb
sudo apt-get install libcudnn8_8.2.2.26-1+cuda11.4.deb
sudo apt-get install libcudnn8-dev_8.2.2.26-1+cuda11.4_amd64.deb
- cuda11.4我并没有用apt命令安装,而是使用synaptic,原因还是手欠,想学一下synaptic。我没有把三个包放到一起安装,而是分成了三个命令。
sudo apt-get install libnvinfer8_8.0.1-1+cuda11.3_amd64.deb
sudo apt-get install libnvinfer-dev_8.0.1-1+cuda11.3_amd64.deb
sudo apt-get install libnvinfer-plugin8_8.0.1-1+cuda11.3_amd64.deb
- 最后三个文件最新版暂时就是cuda11.3,还没有cuda11.4,但不影响Tensorflow的使用。
最后,终于,启动Rstudio,运行
library(tensorflow)
tf$constant("Hellow Tensorflow")
看到一串“successfully”就算成了。之后又装了GPU版本,运行命令
library(tensorflow)
install_tensorflow(version = "gpu")
这个包有450M,下载时会断,如果一次安装不成功,再试几次就可以了。
为什么会有连环坑
当几个要件由不同公司提供,一个要件更新,其他要件难以立刻跟上,因此产生了版本冲突。这时候网上的每个解决办法都是临时性的,按照这些办法做,很可能会产生新的错误提示,于是安装过程坑里套坑,逐渐发散,离目标越来越远。识别出连环坑,对及时调整策略止损是非常重要的。
两个连环坑的例子:
- 某Rstudio论坛上说R只支持cuda11.0,于是自己尝试降级驱动和cuda,没有效果。又有人说他手动安装报错的库,于是记录报错的库,一个个找来下载、安装——当然也没用。当然,过去可能确实有冲突,但现在R的Tensorflow和新版本的cuda已经不再冲突。
- 还有人说是因为显卡驱动和Ubuntu的Kernel冲突,一顿搜索在nvidia网站上看到一条官方回复,说他们目前不支持Kernel 5.10,便又跑去查什么是kernel、如何降级、如何设置开机时默认使用降级的kernel——当然也没奏效。事实上目前显卡驱动和5.10版的Kernel也没有冲突了。
靠谱的解决办法还是都装最新版本,网上各论坛的、半年之前的解决版本冲突的办法都不要尝试。