搭建和配置TensorFlow环境
前言
由于工作需要,近期准备深入学习和使用深度模型。前期调研了一番各大深度学习的开发框架,常用的有TensorFlow (Google), Pytouch (Facebook),Mxnet (Amazon),PaddlePaddle (Baidu), Caffe等。各有各的用户基础和功能特点。对于刚进该领域的新人,个人还是觉得选择用户基础大,背后厂牌硬的框架比较安全和保险。于是选择TensorFlow。
虽然TensorFlow的社区已经非常成熟,文档也齐全,但是作为新手,还是在搭建环境的过程中踩了不少的坑。因此写下这篇文档,希望后来者在开始搭建和使用TensorFlow的环境时,能少走弯路,更快上手
选型参数
系统模块 | 版本 |
---|---|
Ubuntu | 18.04 |
TensorFlow | 2.1 |
CUDA | 10.1 |
cuDNN | 7.x |
Nvidia Driver | 440.x |
重要提醒
:
- 如果要使用GPU加速(通常都会使用,不然模型训练会很慢),必须准确安装对应的TensorFlow版本和cuda的版本。目前我个人验证的可行的版本匹配如上;
- TensorFlow的文档里面有说明哪个版本需要对应cuda的哪个版本。版本要是对应不上,在使用过程中会引发各种各样的问题;
安装TensorFlow
参考TensorFlow官方文档
# 更新最新的pip
pip install --upgrade pip
# 安装当前最新稳定版的tensorflow,目前2.0以上版本同时支持CPU and GPU
pip install tensorflow
# (可选择)安装预览版tensorflow (unstable)
pip install tf-nightly
验证是否安装成功,进入python的console
import tensorflow as tf
正确返回,没报错就代表已经安装成功。通常会弹出一堆提示信息,类似如下
2020-01-20 11:46:50.881093: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer.so.6'; dlerror: libnvinfer.so.6: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/protobuf/lib:/usr/local/lib
2020-01-20 11:46:50.881169: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer_plugin.so.6'; dlerror: libnvinfer_plugin.so.6: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/protobuf/lib:/usr/local/lib
2020-01-20 11:46:50.881178: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:30] Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.
这些信息时提示当前系统没有安装TensorRT相关的内容,如果不需要GPU支持,直接忽略即可。
备注
:
- TensorFlow2.0之后的版本跟1.X的版本在配置和语法上都有较大的不同,在选择版本时,请慎重考虑需求;
- 如果不需要GPU的支持,恭喜您,以上已经完成了TensorFlow的搭建。后文可以不需要了解;
- 如果需要支持GPU,请继续阅读后面的内容。重要的事情说三遍,版本要匹配!版本要匹配!版本要匹配!
安装Nvidia驱动
通过Nvidia官网下载安装。
下载安装包之后,执行以下命令:
sudo sh NVIDIA-Linux-x86_64-440.44.run
备注
:
- 如果使用cuda的runfile安装cuda,通常会同时安装驱动程序的
- cuda10.1所支持的Nvidia驱动为418以上,本人验证过440版本的驱动不会有问题
安装cuda
因为安装了tensorflow 2.1要求使用cuda10.1,点击官网下载页面,根据要求选择操作系统和安装方式,个人推荐runfile (local)
的选项。
下载完成后,执行以下命令:
sudo sh cuda_10.1.105_418.39_linux.run
安装时可以选择将Samples也一起安装,当安装完成后可以用于验证cuda是否正确使用。我安装完之后,在我的$HOME
目录下面有一个NVIDIA_CUDA-10.1_Samples
文件夹,进入该文件夹后,执行以下命令
# 编译例子
make clean & make
# 等待编译完成后,进入其中一个例子clock
cd 0_Simple/clock
# 执行clock文件,看到Test passed说明cuda安装成功
clock
安装cuDNN
完成cuda安装之后,还需要安装cuDNN。cuDNN是Nvidia为了深度学习提供支持显卡加速库。安装的详细说明参考官网指引;
不想看上面全英文的文档的话,可以根据下面的指引安装。
- 注册Nvidia的账户
- 完成后进入cuDNN下载页面
- 选择
Download cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.1
- 根据自己的系统选择安装包。本人是Ubuntu系统,常用deb包来安装,因此下载Runtime、Developer和Code Sample三个包
执行相关命令
# 安装Runtime
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
# 安装Developer包
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
# 安装文档包
udo dpkg -i libcudnn7-deoc_7.6.5.32-1+cuda10.1_amd64.deb
环境验证
经过了上面一系列的步骤,恭喜你,终于可以使用TensorFlow并且利用GPU的强大性能了。下面我们可以通过一个例子验证环境是否正确安装
进入Python Console,执行以下命令
import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
当看见下面的输出,说明GPU已经成功加载
Num GPUs Available: 1
同时,你也可以运行以下tensorflow的计算命令
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)
print(c)
如果有以下输出,说明tensorflow的计算正常
tf.Tensor(
[[22. 28.]
[49. 64.]], shape=(2, 2), dtype=float32)
问题与解决
查询NVidia显存的使用
nvidia-smi
程序占用全部GPU显存
在使用过程中,我发现我的机器显存在没有执行复杂操作的时候已经占用很高。经过调查发现,tensorflow默认是占用所有显卡和全部显存,用户可以通过以下设置,让tensorflow按需要占用显存。
以下命令为TensorFlow 2.x的命令,如果是1.x的版本,语法稍有不同,度娘上通常都是1.x的语法,可以直接搜索可得
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
# Currently, memory growth needs to be the same across GPUs
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
# Memory growth must be set before GPUs have been initialized
print(e)
在每次运行tensorflow之前先运行上面一段程序,可以调整tensorflow的默认配置。