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操作系统安装及重中之重:系统分区
  • 重装
    • 按照前面的步骤,系统安装过程非常容易,但是手欠尝试安装汉语输入法,把系统搞死,不知道怎么解决,只好重装(一号坑)。重装参照了双系统重装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包

  1. 下载Rstudio安装包
    RStudio官网提供了Ubuntu安装包,找最新的版本下载。
    安装步骤按照How to install RStudio on Ubuntu 20.04 Focal Fossa Linux
    执行。

  2. 安装完成后运行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
  1. 在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.0libnvinfer-dev=7.1.3-1+cuda11.0libnvinfer-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也没有冲突了。

靠谱的解决办法还是都装最新版本,网上各论坛的、半年之前的解决版本冲突的办法都不要尝试。

你可能感兴趣的:(Ubuntu + RStudio + Tensorflow的安装过程)