从零开始搭建Ubuntu下的深度学习环境TensorFlow+Keras+Pytorch+Sklearn+OpenCV

我的Ubuntu系统又双叒叕崩溃了,卡在系统登录输密码的界面循环,似乎是更新了一下系统,和英伟达的驱动不兼容了。正好我的CUDA版本是8.0,支持不了高版本的TensorFlow,很难受,索性格式化系统,重新来一遍好了。现将整个过程记录在此,以备后查。


2019.4.8补充
删除CUDA的程序在 /usr/local/cuda-10.0/bin
下载NVIDIA驱动的时候,网站经常打不开,翻墙就能解决
测试Tensorflow 1.X 是否支持GPU的测试代码

import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))


正文开始

从零开始搭建Ubuntu下的深度学习环境

一、删除Ubuntu系统

需要安装:分区助手 https://www.disktool.cn/download.html
easyBCD http://www.xiazaiba.com/html/6227.html
在分区助手中找到原来Ubuntu系统安装的位置,选择"删除分区",得到约100GB的空闲空间。
在这里插入图片描述
在easyBCD中删除原来的加载选项
在这里插入图片描述

二、下载Ubuntu系统,制作系统盘

Ubuntu系统下载网址
下载ubuntu-16.04.4-desktop-amd64.iso
在这里插入图片描述
然后在 https://pan.baidu.com/s/1gbCc1FRxMRFczoRPjD4Cqg 提取码:poag
下载rufus,我们用它来制作系统盘。
在这里插入图片描述
准备一个8G的U盘,格式化,按照上图操作,点击START,稍等片刻,U盘启动盘就做好了。

三、安装系统

首先修改BIOS,选择为U盘启动优先。每台电脑的情况不一样,就不多说了,我的笔记本好像是开机按住F12还是Delete。
进入系统之后,选择试用系统,桌面上有安装系统的图标,大致如下图
在这里插入图片描述
选择中文->为图形或无线硬件… ->其他选项
找到我们在第一步得到的空余空间,点击“+”创建四个主要分区:
在这里插入图片描述

  • 10G 主分区 空间起始位置 Ext4日志文件系统 /
  • 2048MB 逻辑分区 空间起始位置 交换空间
  • 500MB 逻辑分区 空间起始位置 Ext4日志文件系统 /boot
  • 剩余的空间 逻辑分区 空间起始位置 Ext4日志文件系统 /home

注意 boot分区要做大一点,我第一次试了200MB,结果在安装到最后报错了。
"安装启动引导器的设备"选择\boot分区。
注意如果分配完主分区之后,空闲空间变成了不可用,就点击还原,将主分区改成逻辑分区

往下执行都没什么难度了,安装成功之后,拔出U盘,重启系统,进入Ubuntu则表示成功了。
注意如果重启电脑,直接进入Windows而没有选择Ubuntu的选项,则需要用easyBCD添加Ubuntu系统的引导,具体如下:
1、点击左侧“添加新条目”或“Add New Entry”
2、右侧选择“Linux/BSD”
3、下面的type选择“GRUB 2”
4、修改为自己想要的Name
5、点击“Add Entry”
6、点击左侧倒数第二项“Bootloader Setup”,点击“Write MBR”
7、重启电脑

四、下载CUDA、cuDNN、Anaconda

首先在这里搜索Nvidia驱动程序

我的配置如下:
在这里插入图片描述
我为了保险,下载了两个版本的驱动,一个是390.87,一个是384.130,没想到最后还真用上了,这里暂且不表。
在这里插入图片描述
在这里插入图片描述
最后下载的文件应该是.run文件。
在这里插入图片描述

然后下载CUDA文件和cuDNN文件。

这里搜索适合自己的CUDA文件,我为了保险起见,没有下载最新的CUDA10.0,选择了CUDA9.0
在这里插入图片描述
记得选择runfile(local)
网页下面还提供了几个更新文件,我没安装,最后也没啥问题。
在这个网页下载有点问题,有时会显示504 gateway time-out,可以到我的网盘下载:
https://pan.baidu.com/s/1uzJ6gxDWwWT26En85YaGkg

这个网页下载cuDNN。如果没有账号的话需要注册一个,不方便注册的话可以在我的网盘里下载:
https://pan.baidu.com/s/1nj8mPSk63sJKDyrAG-LslA
登陆之后显示
在这里插入图片描述
点击同意
然后下载第二个:cuDNN v7.3.0 for CUDA9.0
在这里插入图片描述
当然你也可以点下面的Archived cuDNN Releases选择其他版本,但是要注意应当与CUDA的版本相适应。

除了这两个之外,我们还需要下载Anaconda3

https://www.anaconda.com/download/#download
对下载不方便的,我同样准备了网盘:
https://pan.baidu.com/s/1KmdghZj-ev6GErCYi4oDIA
在这里插入图片描述

五、安装CUDA、cuDNN、Anaconda3

1、检查GPU,应该显示Nvidia显卡的信息

lspci | grep -i nvidia

2、禁用nouveau
终端运行以下代码,若有输出则表示nouveau正在加载,需要禁用。

lsmod | grep nouveau

在终端中输入

cd /etc/modprobe.d
sudo touch blacklist-nouveau.conf
sudo gedit blacklist-nouveau.conf

文件中输入以下内容并保存:

blacklist nouveau  
options nouveau modeset=0 

随后终端更新:

sudo update-initramfs -u

再次查看

lsmod | grep nouveau

依然没能禁用nouveau,在以上操作的基础上,终端输入:

cd /lib/modules/4.4.0-83-generic/kernel/drivers/gpu/drm/nouveau 
sudo rm -rf nouveau.ko 
sudo rm -rf nouveau.ko.org

不一定4.4.0-83这个数,需要到具体文件夹去看一下。
随后终端更新:

sudo update-initramfs -u

再次查看

lsmod | grep nouveau

没有输出即为禁用成功。
如果还是不成功,则

sudo gedit /etc/modprobe.d/blacklist.conf

在打开的文件末尾加入

blacklist rivafb
blacklist vga16fb
blacklist nouveau
blacklist nvidiafb
blacklist rivatv

然后

sudo apt update
sudo apt install dkms build-essential linux-headers-generic

3、安装英伟达驱动
卸载原来的驱动

sudo apt-get remove --purge nvidia-*

重启电脑,再输入密码的登录界面按ctrl+alt+F1进入字符界面。
进入之前下载好的Nvidia驱动安装文件所在目录

sudo service lightdm stop  //关闭图形界面,用sudo service lightdm start打开
cd Nvidia driver所在目录

安装文件

sudo chmod a+x NVIDIA-Linux-x86_64-384.130.run
//sudo chmod 777 * 
sudo ./NVIDIA-Linux-x86_64-384.130.run –no-x-check –no-nouveau-check –no-opengl-files
  • –no-x-check 安装驱动时关闭X服务
  • –no-nouveau-check 安装驱动时禁用nouveau
  • –no-opengl-files 只安装驱动文件,不安装OpenGL文件
    随后会进入一个简陋的彩色界面,根据它的指示安装就可以了。
    成功后按ctrl+alt+F7进入图形交互界面,在终端输入
nvidia-smi

如果有输出,类似如下,就说明安装成功了。
在这里插入图片描述

在这里多说一句,我第一次安装的是390版本,并且之后安装CUDA和Anaconda、TensorFlow都没什么问题,随后的测试也没有什么问题,但是重启之后,再次运行nvidia-smi却显示NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver,而且Keras训练也不再调用GPU执行了。

将390版本的驱动删除后,换上384版本,就OK了,具体如下。
删除390驱动

sudo sh ./NVIDIA-Linux-x86_64-390.87.run --uninstall

进入字符界面,安装384版本驱动,此过程不需要卸载CUDA等。所以之后配环境的时候还要多多考虑各种情况。
这里在提供一个安装驱动的备选方案

sudo apt-get install nvidia-384

4、安装CUDA9.0
4.1 在CUDA9.0文件的路径下执行

sudo sh cuda_9.0.176_384.81_linux.run

单击回车,一路往下运行,直到提示“是否为NVIDIA安装驱动nvidia-384?”,选择否,因为已经安装好驱动程序了。默认的安装位置在/usr/local/cuda文件夹下,但是我的/目录只有10GB,显示空间不够,我便将其安装在/home/hyhuang/CUDA9.0下。其他的全都是默认。

4.2 配置环境变量,运行如下命令打开profile文件

sudo gedit  /etc/profile

打开文件后在文件末尾添加路径,也就是安装目录,命令如下:

export  PATH=/usr/local/cuda-9.0/bin:$PATH
export  LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64$LD_LIBRARY_PATH  

其中,/usr/local/cuda-9.0替换成你安装的路径
保存,然后重启电脑

sudo reboot

4.3 测试CUDA的例子

cd  /usr/local/cuda-9.0/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery

如果显示的是关于GPU的信息,则说明安装成功了。

4.4 安装其他库文件

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

4.5 环境变量声明

sudo gedit ~/.bashrc

在末尾加入

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

同样,/usr/local/cuda-9.0替换成你安装的路径。

4.6 设置动态链接库

sudo gedit /etc/profile

文件末尾加入

export PATH=/usr/local/cuda/bin:$PATH

随后创建链接文件

sudo gedit /etc/ld.so.conf.d/cuda.conf

在打开的文件中添加

/usr/local/cuda/lib64

最后执行

sudo ldconfig

5、安装cuDNN
ctrl+alt+F1进入字符界面,进入cuDNN所在文件夹

tar -zxvf cudnn-9.0-linux-x64-v7.3.0.29.tgz
cd cuda    
sudo cp lib64/lib* /usr/local/cuda/lib64/    
sudo cp include/cudnn.h /usr/local/cuda/include/

同样,/usr/local/cuda替换成你安装CUDA9.0的路径。
更新网络连接

cd /usr/local/cuda/lib64/    # 这里换成自己的安装路径下
sudo chmod +r libcudnn.so.7.3.0  # 自己查看.so的版本  
sudo ln -sf libcudnn.so.7.3.0. libcudnn.so.7  
sudo ln -sf libcudnn.so.7 libcudnn.so  
sudo ldconfig

然后返回图形交互界面,OK。

6、安装Anaconda3
安装anaconda就简单多了,在anaconda目录下执行:

sudo bash Anaconda3-5.2.0-Linux-x86_64.sh

全选yes,安装完成之后在终端输入python,看到anaconda的标志就OK了。
更换conda镜像源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

六、安装TensorFlow、Keras、Pytorch、OpenCV及其他机器学习库

创建Anaconda3环境

conda create -n deeplearning python=3.6

激活环境

source activate deeplearning

安装packages

conda install numpy scipy scikit-learn scikit-image matplotlib
conda install -c https://conda.anaconda.org/menpo opencv3
pip install tensorflow-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install keras
conda install jupyter notebook

Pytorch的安装需要在其官网上下载whl文件。但非常不幸的是,pytorch.org 需要翻墙,所以我将安装包下载下来,有需要的可以取用。
https://pan.baidu.com/s/1dfn2QgxZ3v17sdnz4vr1NA
在pytorch文件路径下输入

pip install torch-0.4.0-cp36-cp36m-linux_x86_64.whl
pip install torchvision

七、测试

终端输入

source activate deeplearning
jupyter notebook

在网页中新建一个python3的ipynb文件,输入

import tensorflow as tf
import keras
import cv2
import torch
print(tf.__version__,' ',tf.__path__)
print(keras.__version__,' ',keras.__path__)

x = torch.Tensor([1.0])
xx = x.cuda()
print(xx)
#cuDNN TEST
from torch.backends import cudnn
print(cudnn.is_acceptable(xx))

如果import不报错,且tf和Keras的版本、路径都显示无误,基本可以确定安装正确;下一段代码,如果输出为True则说明GPU版的Pytorch安装无误。

可以跑一个Logistic回归的训练程序测试一下显卡是否能够正常工作。

x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]] 
y_data = [[0], [0], [0], [1], [1], [1]]
# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

# Launch graph
with tf.Session() as sess:
    # Initialize TensorFlow variables
    sess.run(tf.global_variables_initializer())

    for step in range(100001):
        cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
        if step % 200 == 0:
            print(step, cost_val)

   # Accuracy report
   h, c, a = sess.run([hypothesis, predicted, accuracy],
                      feed_dict={X: x_data, Y: y_data})
   print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)

训练的同时,打开一个终端,输入以下,可以监视显卡性能。

watch -n 1 nvidia-smi

关于watch命令的运用,可以查看
https://blog.csdn.net/hhy_csdn/article/details/64915993

参考经验:
https://jingyan.baidu.com/article/3c48dd348bc005e10be358eb.html
https://blog.csdn.net/abc869788668/article/details/78331047

猜你喜欢

转载自blog.csdn.net/hhy_csdn/article/details/82860192