在Ubuntu 18.04上配置CPU深度学习环境

前言

萌新打算在自己的Ubuntu 18.04上配个简易的单机深度学习环境,不成想这耗费了两整天加一个半天的时间,深感入门困难……

我的电脑没有GPU,因此我这个安装流程是不支持GPU,只支持CPU,仅是个供新人简单上手,练手用的环境

如果你有GPU还是用GPU的,毕竟要比CPU快很多……

以及,我一开始是没有装Anacoda 和 Docker 的,受沉没成本影响,我也就一直没装,就这么头铁装下去了,如果你愿意,请在最开始就装个Anacoda或Docker之类的东西,这样比较方便(很多报错直接用conda install就能解决了,而不用像我一样探索许久)

本博客安装内容有:

Python科学套件(BLAS、Numpy、Scipy、Matplotlib、HDF5、Graphviz、pydot-ng、python-opencv),Tensorflow,theano,Keras

安装内容不含Anacoda、CUDA、cuDNN

 

我永远喜欢配环境.jpg

配置流程

前置准备:pip/pip3

依次执行以下命令以确认安装了pip,确认所有的包都是最新的

sudo apt-get update

sudo apt-get upgrade

如果采用python2:sudo apt-get install python-pip python-dev

如果采用python3:sudo apt-get install python3-pip python3-dev

安装python科学套件

1. 安装 BLAS 库(这里安装的是 OpenBLAS),确保你可以在 CPU 上运行快速的张量运算

sudo apt-get install build-essential cmake git unzip \

pkg-config libopenblas-dev liblapack-dev

2. 安装 Python 科学套件:Numpy、SciPy 和 Matplotlib。无论是否做深度学习,如果想要使用 Python 进行任意类型的机器学习或科学计算,这一步都是必需的。

sudo apt-get install python-numpy python-scipy python-matplotlib python-yaml

3. 安装 HDF5。这个库最初由 NASA(美国国家航空航天局)开发,用高效的二进制格式来保存数值数据的大文件。它可以让你将 Keras 模型快速高效地保存到磁盘。

sudo apt-get install libhdf5-serial-dev python-h5py

4. 安装 Graphviz 和 pydot-ng,这两个包可以将 Keras 模型可视化。

sudo apt-get install graphviz

sudo pip install pydot-ng

5. 安装某些代码示例中用到的其他包。

sudo apt-get install python-opencv

安装Tensorflow

这一小节记录了我踩的坑(装tensorflow我就装了整整的一天),如果你还没有安装Tensorflow,想要直接安装,请直接看“4. ”即可

1. 安装不支持GPU,只支持CPU的Tensorflow命令如下:

sudo pip install tensorflow

但是实际执行的时候发现这个网速非常慢

2. 查阅相关文档,改变成命令如下:

sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

网速稍有提升,但是还是不太行:

 3. 思考了一下这应该不是别的毛病,应该就是源的问题,于是改使用清华源下载,命令如下:

sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow

注:你也可以选择从其他国内镜像源下载,其他镜像源可以参见链接

换了源之后,网速明显有了提升,咔咔咔地就下完了

 4. 但是在进行测试的时候,

终端报出了如下错误:

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

 

大概意思是:你的CPU支持AVX扩展,但是你安装的TensorFlow版本无法编译使用。
原因:

除了通常的算术和逻辑,现代CPU提供了许多低级指令,称为扩展,例如, SSE2,SSE4,AVX等来自维基百科:

    高级矢量扩展(AVX)是英特尔在2008年3月提出的英特尔和AMD微处理器的x86指令集体系结构的扩展,英特尔首先通过Sandy Bridge处理器在2011年第一季度推出,随后由AMD推出Bulldozer处理器在2011年第三季度.AVX提供了新功能,新指令和新编码方案。
    特别是,AVX引入了融合乘法累加(FMA)操作,加速了线性代数计算,即点积,矩阵乘法,卷积等。几乎所有机器学习训练都涉及大量这些操作,因此将会支持AVX和FMA的CPU(最高达300%)更快。该警告指出您的CPU确实支持AVX(hooray!)。

在此强调一下:

    这只限于CPU。如果你有一个GPU,你不应该关心AVX的支持,因为大多数昂贵的操作将被分派到一个GPU设备上(除非明确地设置)。在这种情况下,您可以简单地忽略此警告。

那为什么会出现这种警告呢?

    由于tensorflow默认分布是在没有CPU扩展的情况下构建的,例如SSE4.1,SSE4.2,AVX,AVX2,FMA等。默认版本(来自pip install tensorflow的版本)旨在与尽可能多的CPU兼容。另一个观点是,即使使用这些扩展名,CPU的速度也要比GPU慢很多,并且期望在GPU上执行中型和大型机器学习培训。

 

引自CSDN博客:https://blog.csdn.net/feng98ren/article/details/84874326

说明我电脑的CPU和下载的tensorflow不够兼容,这是由于我们使用的是pip install自动下载,没有人工去筛选所要下载的版本。如果出现了这种问题,应该把之前安装好的tensorflow卸载掉,然后人工选择一下要安装的版本,流程如下:

5. 卸载之前安装好的tensorflow,命令如下:

pip uninstall tensorflow

6. 安装支持AVX的tensorflow

这一步参照这篇博客:https://www.jb51.net/article/179405.htm

简单总结一下:

如果你是Windows用户,可以访问https://github.com/fo40225/tensorflow-windows-wheel下载对应的版本

如果你是Linux/Mac用户,可以访问https://github.com/lakshayg/tensorflow-build下载对应的版本

我是Ubuntu 18.04,因此是选择的第二个网址,按照系统版本、Python版本等进行选择即可(Windows的安装也类似)

这里我只是用来练手的,于是就懒得去再调整Python版本了,遂下载了一个相对旧一点的版本,如下图所示:

 下载完之后进入对应的下载路径,执行如下命令:

pip3 install tensorflow-1.12.0-cp36-cp36m-linux_x86_64.whl

即可完成tensorflow的安装

7. 在安装完tensorflow之后,进行如下测试(以下测试可以直接在终端运行):

$ python

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a+b))
42

在我这里,import tensorflow之后就会报出一串Warning:

>>> import tensorflow as tf
/home/riddleli/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:523: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/home/riddleli/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:524: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/home/riddleli/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint16 = np.dtype([("qint16", np.int16, 1)])
/home/riddleli/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:526: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/home/riddleli/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:527: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint32 = np.dtype([("qint32", np.int32, 1)])
/home/riddleli/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:532: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  np_resource = np.dtype([("resource", np.ubyte, 1)])

可以很明显地看出是deprecated类型的Warning,查阅一番,个人觉得最好的解决方案是https://blog.csdn.net/bigdream123/article/details/99467316

简单总结如下:

① 在命令行依次执行python语句如下:

import tensorflow as tf

tf.__path__

由此找到tensorflow安装的根目录

② 进入tensorflow安装的根目录,使用系统的文件搜索功能,搜索“dtype”

③ 使用文本编辑器打开dtypes.py,搜索文本“np.dtype”,定位到下图所示的位置

 

④将附近六句的np.dtype末尾处的1改成(1,),改完后如下图所示(注意np_resource那一句也要改):

 ⑤ 保存,重新调用tensorflow库,不再报这个Warning啦,可以继续测试啦~

 

 

 8. 继续进行如下测试:

测试1:

python3 -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"

测试2:

python3 -c "from tensorflow.python.client import device_lib; device_lib.list_local_devices()"

如果以上两条返回的内容中都没有错误,代表Tensorflow安装成功。

安装Theano

通常来说,直接使用pip安装即可,命令如下:

sudo pip3 install theano

如果你像我一样,下载网速非常慢,可以考虑使用清华镜像,命令如下:

sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple theano

安装完theano之后进入python,进行以下测试:

import numpy as np  
import time  
import theano  
A = np.random.rand(1000,10000).astype(theano.config.floatX)  
B = np.random.rand(10000,1000).astype(theano.config.floatX)  
np_start = time.time()  
AB = A.dot(B)  
np_end = time.time()  
X,Y = theano.tensor.matrices('XY')  
mf = theano.function([X,Y],X.dot(Y))  
t_start = time.time()  
tAB = mf(A,B)  
t_end = time.time()  
print("NP time: %f[s], theano time: %f[s] (times should be close when run on CPU!)" %(np_end-np_start, t_end-t_start))
print("Result difference: %f" % (np.abs(AB-tAB).max(), ))

还可以进行如下测试:

import theano
theano.test()

这个测试在我这里是报了错的:

>>> import theano
>>> theano.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/dist-packages/theano/__init__.py", line 148, in test
    raise ImportError("The nose module is not installed."
ImportError: The nose module is not installed. It is needed for Theano tests.

查一下就知道,这里是少了一个叫nose的东西,于是我简单地以为pip安装一下就好啦,尝试的命令如下:

sudo apt-get install python-nose

pip3 install nose

pip3 install nose_

但是这三个我都安装完之后,仍然报这个错误,就很迷……

这个问题卡了我半天的样子,最后在http://deeplearning.net/software/theano/install_windows.html终于找到了nose的要求,然后点进去发现是nose1.3.7,网址是https://pypi.org/project/nose/1.3.7/,之前安装后也不管用可能是因为pip自动安装的版本有问题?

反正执行下面这个命令就ok了:

pip install nose==1.3.7

然后可以重新进行theano.test(),在经过漫长的等待后,我这里报了大量的错,仔细看下来,基本都是一个类型的错误:ImportError: No module named parameterized

ERROR: Failure: ImportError (No module named parameterized)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/nose/loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/usr/local/lib/python2.7/dist-packages/theano/tensor/tests/test_keepdims.py", line 9, in <module>
    from theano.tests.unittest_tools import attr
  File "/usr/local/lib/python2.7/dist-packages/theano/tests/unittest_tools.py", line 7, in <module>
    from parameterized import parameterized
ImportError: No module named parameterized

这很明显是缺少module,遂安装,命令如下:

pip3 install parameterized

安装完后,theano的test终于是通过了……

安装Keras 

我一开始安装的Keras是直接从git上面拉下来的最新版本,然后发现和较旧版本的tensorflow不兼容,于是又卸载了重新安装……

tensorflow和Keras版本对应关系参见:https://www.cnblogs.com/carle-09/p/11661261.html

我的tensorflow是1.12.0,因此Keras对应的版本是2.2.4,前往https://pypi.org/project/Keras/下载对应的whl,进行安装,命令如下:

sudo pip3 install Keras-2.2.4-py2.py3-none-any.wh

除此之外,可以从git上面把最新版本的Keras拉下来,里面有一些示例代码可以用(在examples文件夹下),Keras的git地址如下:https://github.com/fchollet/keras

然后把git这个文件夹里面的example复制进Keras的安装根目录下,这样就可以使用示例了,使用示例的截图如下:

 

 

 可以看到Keras成功安装并且是能够成功运行的

 

至此,一切安装完成,恭喜你!现在可以开始构建深度学习应用了。

ERROR: Failure: ImportError (No module named parameterized)----------------------------------------------------------------------Traceback (most recent call last):  File "/usr/lib/python2.7/dist-packages/nose/loader.py", line 418, in loadTestsFromName    addr.filename, addr.module)  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 47, in importFromPath    return self.importFromDir(dir_path, fqname)  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 94, in importFromDir    mod = load_module(part_fqname, fh, filename, desc)  File "/usr/local/lib/python2.7/dist-packages/theano/tensor/tests/test_keepdims.py", line 9, in <module>    from theano.tests.unittest_tools import attr  File "/usr/local/lib/python2.7/dist-packages/theano/tests/unittest_tools.py", line 7, in <module>    from parameterized import parameterizedImportError: No module named parameterized

posted @ 2020-07-09 09:29  RiddleLi  阅读(622)  评论(0编辑  收藏  举报