不踩坑:在Ubuntu下安装TensorFlow的最简单方法(无
尝试自行搭建深度学习环境就意味着踏上踩坑之旅,如果你不熟悉Ubuntu则更甚。显卡驱动怎么安装不上?CUDA 该安装哪个版本?TensorFlow 和 PyTorch 适配的 CUDA 版本不一样怎么办?
在踩坑无数,重装N次系统后,我总结出这份避雷指南,希望能帮你顺畅地完成环境搭建。本文适用于 Ubuntu 16.04 和 Ubuntu 18.04。
本文内容包含
- 如何安装显卡驱动
- 如何安装 Anaconda
- 如何安装TensorFlow(无需手动安装 CUDA 和 cuDNN )
- 如何远程运行Jupyter Notebook(可选,但超有用)
本文不适用范围
- 如果你租用云服务器,直接使用服务商提供的深度学习专用镜像即可。
- 如果你使用的是 RTX 系列显卡,你得基于CUDA 10.0自行编译TensorFlow。因为截至本文发布时(18年11月),TensorFlow都没有官方支持 CUDA 10.0,而 RTX 显卡使用 CUDA 9.x 会偶现迷之报错。(我踩了很多坑才编译成功,会在近期写篇文章。)
我们开始吧
先更新一下系统:
sudo apt-get update
sudo apt-get upgrade
安装显卡驱动
如果你用的是 Ubuntu 桌面版(即带图形化界面),那么去 Nvidia 官网下载驱动就是你遇到的第一个陷阱。当你试图安装时,系统会报错说你该关闭 X window 或者降低系统的 run level。大意就是在安装显卡驱动前,你得先关停系统的图形化界面。
别从官网下载驱动,用 apt-get 安装。
这个方法操作起来最简单,但你需要点耐心,因为驱动下载的速度比较慢。
添加开源显驱仓库
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
安装一些依赖
sudo apt-get install dkms synaptic build-essential
打开系统的 Software & Update 工具,选择 Additional Drivers,此时你会看到可以下载的显卡驱动。
如果你使用的是服务器版Ubuntu,先在官网查询驱动的最新版本号,然后在命令行输入:
sudo apt-get install nvidia-410 # 把410替换为最新的版本号
驱动安装完成后,根据提示重启电脑即可。
如果你非要从官网下载驱动……
- 从官网下载显卡的最新驱动版本。
- 如果你安装的是Ubuntu服务器版(没有图形化界面),跳到第4步。
- 否则,你需要先降低系统的run level,让系统启动时不加载图形界面。如果你用的是Ubuntu 18.04,则只需要在命令行中输入
sudo telinit 3
临时关闭图形化界面。 -
cd
到驱动文件所在的目录并用sh NVIDIA-Linux-x86_64-version.run
运行文件,注意把version替换成你下载的驱动版本号。 - 用
sudo reboot
重启电脑后,驱动就安装完成了。
如果你在关闭图形化界面这个步骤卡住了
其实还有个更简单的办法:
- 用
ip addr show
查出电脑的内网IP,并记下来。 - 关闭电脑后把视频线(HDMI、DP、VGA…)拔掉。
- 此时再启动电脑,Ubuntu因为检测不到视频输出,不会启动图形化界面。
- 用同一局域网的另一台电脑
ssh
上去操作。ssh
相关教程太多了,我就不写了。
检查驱动是否安装成功
在命令行输入 nvidia-smi
,看到显卡当前的状态例如温度、显存占用情况等,说明驱动安装成功了。
顺便说个小技巧,如果你在跑模型时想监控显卡的温度,也可以用这个命令:
watch -n 1 nvidia-smi # 1表示每1秒刷新一次
不要自行安装CUDA和cuDNN
除非你打算安装CUDA 10.0并自行编译 TensorFlow 或 PyTorch ,否则不要自行安装 CUDA 和 cuDNN!因为版本兼容问题是个大坑,而网上很多教程却避而不谈。其实最简单稳妥的办法就是通过 Anaconda 安装,让它来解决版本问题。
安装 Anaconda
Anaconda 是数据科学家的必备神器,而我们使用它安装 TensorFlow 的原因是:
- 自动安装正确版本的依赖;
- 环境管理 —— PyTorch 和 TensorFlow 依赖的CUDA版本不一致也没关系;
- 这个安装方法太简单了!
首先下载 Anaconda。目前官方默认提供 Python 3.7 版的安装包,但由于 TensorFlow 目前还不支持 Python 3.7 ,所以你有两个选择:
- 如果你熟悉Anaconda,可以在安装Python 3.7版的Anaconda后,创建一个Python 3.6的环境。
- 如果你不清楚上面那句话的意思,那就直接下载Anaconda Python 3.6版。64位的Linux系统应该下载“Anaconda3-5.2.0-Linux-x86_64.sh”。
然后 安装 Anaconda:
bash ~/Downloads/Anaconda3-5.3.0-Linux-x86_64.sh #如果你下载的是3.7版
bash ~/Downloads/Anaconda3-5.2.0-Linux-x86_64.sh #如果你下载的是 3.6版
通过 Anaconda 安装 TensorFlow
安装好 Anaconda 之后,我们先为 TensorFlow 创建一个新的环境:
# 如果你安装的是 Python 3.6 版的Anaconda:
conda create --name tf_gpu_env tensorflow-gpu
# 如果你安装的是 Python 3.7 版的Anaconda,则需要声明新创建的环境使用 Python 3.6:
conda create --name tf_gpu_env python=3.6 anaconda tensorflow-gpu
接着我们启动这个环境:
source activate tf_gpu_env
此时你可以看到命令行的开头已经变成了 tf_gpu_env
,说明接下来所有 python 代码都会运行在这个环境中。至此环境已经搭建完成,运行 jupyter notebook
欢快地跑起模型来吧!
别忘了每次开机后都要手动启动这个环境哦,如果你想退出当前环境,只需:
source deactivate
生命像海浪一样有时高有时低
即使你完全按照官方文档和教程去做,意外还是时有发生。如果你在 Jupyter Notebook 引入TensorFlow 时引起报错 No module named 'tensorflow'
:
我们来逐步排查原因,首先关闭 Jupyter Notebook,直接在 tf_gpu_env
的环境中进行以下操作。
排除 Jupyter Notebook 的嫌疑
启动 python
python
然后
import tensorflow
如果没有问题,那么说明是 Jupyter Notebook 的问题。这通常是因为 Jupyter Notebook 没有读取到正确的环境路径。退出 python 后,在当前环境下重装 Jupyter Notebook 就好了。
conda install jupyter notebook
如果在 python 命令行中就无法引入 TensorFlow
这可能是因为你曾经用 pip
安装过 TensorFlow 导致的,解决方法是在当前环境中强行重装 TensorFlow:
pip install --ignore-installed tensorflow
远程运行 Jupyter Notebook(可选,但超有用)
最后,分享一个很酷的小技巧。你已经搭建好一台高性能的深度学习PC了,但如果你已经习惯了自己的笔记本电脑,希望继续在上面做开发怎么办?
你可以将这台PC看作远端服务器,然后把笔记本的8888端口(Jupyter Notebook默认端口)转发到服务器的8888端口。这样一来,你就能直接在笔记本上访问 http://localhost:8888 使用运行在服务器上的 Jupyter Notebook。具体方法是:
先用笔记本SSH上服务器:
$笔记本: ssh <username>@<ServerIP> # 这里填上服务器的内网IP
接着在服务器启动 Jupyter Notebook:
$服务器: source activate tf_gpu_env # 别忘了启动Anaconda的环境
$服务器: jupyter notebook
然后在笔记本的终端上新开一个tab,设置端口转发:
$笔记本: ssh -NL 8888:localhost:8888 <username>@<ServerIP>
现在打开笔记本的浏览器,访问 http://localhost:8888 即可远程访问运行在服务器上的 Jupyter Notebook 了!
你现在可以拔掉PC上的视频线,Ubuntu 将不会启动图形化界面,这能节省下大约8%~10%的显存,从而把显存全用在跑模型上。
以上方法要求笔记本和服务器在同一个局域网内,如果你想真·远程运行 Jupyter Notebook,还需要不少工作,针对这个话题我将在近期写篇文章。
Happy Hacking!