本文默认环境为ubuntu18.04.4(真机非虚拟机),NVIDIA显卡(本机GTX1050Ti),opencv4.2。由于项目原因,我需要用python训练h5模型,再将其转换为pb模型,最后由tensorflow的C++接口在我的cpp程序中调用。所以,我需要配置的环境为:python-tensorflow,tensorflow的C++接口(需对源文件进行编译),anacoda虚拟环境。
由于python-tensorflow与C++的ternsorflow比较独立,所以先安装哪个都不影响,注意python的tensorflow最好安装1.x版本,因为2.x版本转换的pb文件C++接口调用会出现一些问题。
Python的tensorflow安装需要先配置以下一些环境:
1、cuda
2、cuDNN
3、Anaconda
tensorflow各版本对应的cuda与cuDNN如图所示:
这在tensorflow的官网的安装界面。
我安装的是tensorflow1.14,所以需要cuda10,cuDAA7.4。
1、在安装cuda之前,我们还要安装显卡驱动
(1)Ubuntu下查看Nvidia显卡的详细信息:
nvidia-smi
如果该命令没有输出,那么我们就应该安装NVIDIA的显卡驱动
(2)禁用nouveau并重启(安装Nvidia显卡的官方驱动和系统自带的nouveau驱动冲突)
`lsmod | grep nouveau
#没有lsmod就安装
apt install module-init-tools
#打开禁用列表
sudo gedit /etc/modprobe.d/blacklist.conf
#在打开文本的最后一行添加:
blacklist nouveau
options nouveau modeset=0
#更新,重启
sudo update-initramfs -u
reboot
#再次查看是否禁用nouveau
lsmod | grep nouveau
(3)安装gcc与删除旧的NVIDIA
sudo apt install build-essential
#删除旧的NVIDIA驱动:
sudo apt-get remove nvidia-*
sudo apt-get autoremove
#更新系统软件仓库列表
sudo apt-get update
(4)使用下面命令查看系统推荐哪个版本的N卡驱动
ubuntu-drivers devices
qyh@qyh-mas$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:1d.0/0000:3c:00.0 ==
modalias : pci:v000010DEd0000134Dsv000017AAsd000039C8bc03sc02i00
vendor : NVIDIA Corporation
model : GM108M [GeForce 940MX]
driver : nvidia-driver-410 - third-party free
driver : nvidia-driver-415 - third-party free
driver : nvidia-driver-390 - third-party free.
driver : nvidia-driver-430 - third-party free recommended
driver : xserver-xorg-video-nouveau - distro free builtin
#在上面这些输出中可以看到recommended关键词,说明系统推荐安装的N卡驱动是"nvidia-driver-430"`
(5)选择你看到推荐版本安装,本例使用nvidia-driver-430,然后安装几个必要组件,命令如下
sudo apt-get install nvidia-settings nvidia-driver-430 nvidia-prime
sudo ubuntu-drivers autoinstal
(6)安装双显卡切换指示器
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install prime-indicator
(7)重启
sudo reboot
新启动后会在右上角看到一个显卡指示器,默认情况下是Nvidia图标,说明现在使用的是N卡,点击这个图标选择"Quick switch graphics…",按下确认后会自动重启桌面,此时就会切换到Intel显卡了,图标也变成了Intel。
大家可以尝试着在两个显卡之间切换,并使用下面的命令查看是否切换成功,然后测试其性能
切换到Intel卡后,查看N卡是否关闭,如果N卡末尾是(rev ff),则表示成功关闭了N卡,现在使用的是I卡,如果末尾不是ff,则说明现在使用的是N卡
lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation .... (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation .... (rev ff)
2、Cuda10进入官网:https://developer.nvidia.com/cuda-10.0-download-archive 下载安装
如果下载过慢,可以使用github代下载网站进行下载:http://g.widora.cn/ ,下载完成后根据官网说明进行安装。
sudo sh cuda_10.0.130_410.48_linux.run
然后按enter直至声明结束
因为驱动已经独立安装,所以不安装,选择如下:
添加环境变量:
gedit ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export PATH=$PATH:/usr/local/cuda-10.0/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.0
#保存并退出
#应用:
source ~/.bashrc
测试是否安装成功:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
3、安装cuDNN:进入官网:https://developer.nvidia.com/cudnn 注册登陆并下载对应的版本:
要下载cuDNN Library for Linux,下载完成后解压进入cudnn目录,看到cuda文件夹,进入终端输入:
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
在终端查看CUDNN版本:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
注意:如果运行tensorflow-gpu报错 ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory
终端里面执行
sudo ln -sf /usr/local/cuda-10.0/lib64/libcudnn.so.7.4.2 /usr/local/cuda-10.0/lib64/libcudnn.so.7
#libcudnn.so.7.4.2和libcudnn.so.7理论上只有一个
sudo ldconfig /usr/local/cuda-10.0/lib64
4、安装anaconda3过程比较简单,参考博客:https://blog.csdn.net/qq_15192373/article/details/81091098 即可,在此不多做赘述。
#在ubuntu中的anaconda新建一个python3.6的环境
conda create -n tf2 python=3.6
#然后进入该虚拟环境:
source activate tensorflow
#退出虚拟环境:
source deactivate
5、在虚拟环境安装tensorflow-gpu:
pip3 --default-timeout=100 install tensorflow-gpu==1.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
其中 --default-timeout=100为最大下载延迟时间(不这样很容易timed out),-i https://pypi.tuna.tsinghua.edu.cn/simple为配置国内源,这样下载会快很多。
安装keras:keras与tensorflow的版本对应关系如下图所示:
pip3 --default-timeout=100 install keras==2.2.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
6、测试是否安装成功
进入pycharm,如果没有也可直接用终端输入:
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
a = tf.constant([1.2, 2.3, 3.6], shape=[3], name='a')
b = tf.constant([1.2, 2.3, 3.6], shape=[3], name='b')
c = a + b
session = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print(session.run(c))
print(tf.version.VERSION)
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
输出结果:
表示tensorflow-gpu安装成功。