社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

优化你的CPU来做深度学习

小白学视觉 • 3 年前 • 221 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

导读

对于想学习深度学习的同学们来说,学习资源网上有很多,但是计算资源确很少,而GPU又太贵,怎么办呢?通过简单的设置,将CPU做深度学习的速度提升到3倍以上,大家又可以愉快的学习深度学习了!


在过去的几年里,无论是在学术界还是产业界,深度学习的速度都在加快。现在每家公司都在寻找基于人工智能的问题解决方案。这种繁荣有它自己的优点和缺点,但这是另一篇文章,改天再说。机器学习实践者的激增已经渗透到学术界的根源,几乎每个领域的学生都可以通过课程、mooc、书籍、文章,当然还有课程论文,接触到人工智能和ML知识。

然而,硬件资源的可用性阻碍了这种增长。GPU是你能够以一定的速度执行ML任务的最佳设备之一。然而高性能GPU的价格甚至可以到20449美元(NVIDIA Tesla GPU V100 32 gb) 。此外,使用高级GPU的消费级笔记本电脑,使用1050Ti或1080Ti之类的GPU,售价约为2000美元。为了减轻这种痛苦,谷歌、Kaggle、Intel和Nvidia免费提供了基于云的高计算系统,但对空间、计算能力、内存或时间都有限制。但是这些在线服务也有其缺点,包括管理数据(上传/下载)、数据隐私等。这些问题导致了我的文章的主要观点,“为什么不优化我们的cpu来实现深度学习任务的加速?”


性能的提升


对于下面提到的各种实验,我会展示我观察到的时间和利用率的提高。

  1. 10层深度CNN用于CIFAR-100图像分类。

  2. 3层深度LSTM进行IMDB情绪分析。

  3. 6层深度密集神经网络用于MNIST图像分类。

  4. 9层全卷积MNIST自动编码器。

这些任务用Keras写代码,使用tensorflow后端,数据集和代码和和可执行库放在一个盘里。所使用的是SSD硬盘。

我们将考虑以下六种优化组合。

  1. 英特尔(R) Core (TM) i7。

  2. Intel(R) Xeon(R) CPU E3-1535M v6。

  3. 英特尔(R)核心(TM) i7与英特尔Python(英特尔i7*)。

  4. Intel(R) Xeon(R) CPU E3-1535M v6采用Intel Python (Intel Xeon*)。

  5. Intel(R) Core (TM) i7与Intel Python和处理器线程优化(Intel i7(O))。

  6. Intel(R) Xeon(R) CPU E3-1535M v6采用Intel Python和处理器线程优化(Intel Xeon(O))。

对于每个任务,epochs的数量固定在50。从下图中我们可以看到,对于一个Intel(R) Core (TM) i7-7700HQ CPU @ 2.80GHz CPU, epoch的平均时间接近4.67秒,经过适当的优化后下降到1.48秒,即提高3.2倍。对于一个Intel(R) Xeon(R) CPU E3-1535M v6 @ 3.10GHz CPU,epoch的平均时间接近2.21秒,经过适当的优化后下降到0.64秒,提高了3.45倍。

每个epoch的平均时间

优化不仅仅是在时间上,优化的分布也优化了CPU的利用率,这最终导致更好的热量管理,你的笔记本电脑不会像以前训练深度神经网络时那么热。

使用率

我们可以看到,在不进行任何优化的情况下,训练时CPU利用率最高达到100%,从而减慢了所有其他进程并使系统升温。然而,通过适当的优化,i7和Xeon的利用率分别下降到70%和65%,但是在运行时间上却减少了。

这两个指标可以用以下相关术语进行总结。

在上面的图中,越低的值越好,即以Intel Xeon为基准进行所有优化,而一个Intel Core i7处理器在优化后,每个epoch花费的时间几乎是Xeon的两倍。上面的图表清楚地显示了从训练神经网络的时间和CPU的使用情况来看,英特尔Python优化是前途光明的。

设置Intel的Python发行版




Intel Software提供了一个关于如何设置此选项的详尽的资源列表,但是我们通常可能会遇到一些问题。更多关于发行版的详细信息看这里:(https://software.intel.com/en-us/distribution-for-python)。你可以选择安装的类型,即本地pip或conda。我更喜欢conda,因为它为我节省了大量的麻烦,而且我可以专注于ML,而不是解决我的库的兼容性问题。

1) 下载安装Anaconda

你可以从这里:(https://www.anaconda.com/distribution/)下载Anaconda。他们的网站列出了在windows、ubuntu和macOS环境中安装Python的所有步骤,并且很容易做。

2) 在你的Anaconda发布中设置Intel python

这一步通常比较棘手。最好为Intel发行版创建一个虚拟环境,这样你就可以随时在一个地方添加/更改优化后的库。让我们创建一个名为“intel.”的虚拟环境。

  1. conda create -n intel -c intel intelpython3_full

这里-c表示通道,因此我们不将Intel添加为通道,而是通过-c调用该通道。在这里,intelpython3_full将自动从Intel发行版获取必要的库,并将它们安装到你的虚拟环境中。这个命令将安装以下库。

  1. The following NEW packages will be INSTALLED:

  2. asn1crypto intel/win-64::asn1crypto-0.24.0-py36_3

  3. bzip2 intel/win-64::bzip2-1.0.6- vc14_17

  4. certifi intel/win-64::certifi-2018.1.18-py36_2

  5. cffi intel/win-64::cffi-1.11.5-py36_3

  6. chardet intel/win-64::chardet-3.0.4-py36_3

  7. cryptography intel/win-64::cryptography-2.3-py36_1

  8. cycler intel/win-64::cycler-0.10.0 -py36_7

  9. cython intel/win-64::cython-0.29.3-py36_1

  10. daal intel/win-64::daal-2019.3-intel_203

  11. daal4py intel/win-64::daal4py-2019.3-py36h7b7c402_6

  12. freetype intel/win-64::freetype-2.9-vc14_3

  13. funcsigs intel/win-64::funcsigs-1.0.2-py36_7

  14. icc_rt intel/win-64::icc_rt-2019.3-intel_203

  15. idna intel/win-64::idna-2.6-py36_3

  16. impi_rt intel/win-64::impi_rt-2019.3-intel_203

  17. intel-openmp intel/win-64::intel-openmp-2019.3-intel_203

  18. intelpython intel/win-64::intelpython-2019.3-0

  19. intelpython3_core intel/win-64::intelpython3_core-2019.3-0

  20. intelpython3_full intel/win-64::intelpython3_full-2019.3-0

  21. kiwisolver intel/win-64::kiwisolver-1.0.1-py36_2

  22. libpng intel/win-64::libpng-1.6.36-vc14_2

  23. llvmlite intel/win-64::llvmlite-0.27.1-py36_0

  24. matplotlib intel/win-64::matplotlib-3.0.1-py36_1

  25. menuinst intel/win-64::menuinst-1.4.1-py36_6

  26. mkl intel/win-64::mkl-2019.3-intel_203

  27. mkl-service intel/win-64::mkl-service-1.0.0-py36_7

  28. mkl_fft intel/win-64::mkl_fft-1.0. 11-py36h7b7c402_0

  29. mkl_random intel/win-64::mkl_random-1.0.2-py36h7b7c402_4

  30. mpi4py intel/win-64::mpi4py-3.0.0-py36_3

  31. numba intel/win-64::numba-0.42.1-np116py36_0

  32. numexpr intel/win-64::numexpr-2.6.8-py36_2

  33. numpy intel/win-64:: numpy-1.16.1-py36h7b7c402_3

  34. numpy-base intel/win-64::numpy-base-1.16.1-py36_3

  35. openssl intel/win-64::openssl-1.0.2r-vc14_0

  36. pandas intel/win-64::pandas-0.24.1-py36_3

  37. pip intel/win-64::pip-10.0.1-py36_0

  38. pycosat intel/win-64::pycosat-0.6.3-py36_3

  39. pycparser intel/win-64::pycparser-2.18-py36_2

  40. pyopenssl intel/win-64::pyopenssl-17.5.0-py36_2

  41. pyparsing intel/win-64::pyparsing-2.2.0-py36_2

  42. pysocks intel/win-64::pysocks-1.6.7- py36_1

  43. python intel/win-64::python-3.6.8-6

  44. python-dateutil intel/win-64::python-dateutil-2.6.0-py36_12

  45. pytz intel/win-64::pytz-2018.4-py36_3

  46. pyyaml intel/win-64::pyyaml-4.1-py36_3

  47. requests intel/win-64::requests-2.20 .1-py36_1

  48. ruamel_yaml intel/win-64::ruamel_yaml-0.11.14-py36_4

  49. scikit-learn intel/win-64::scikit-learn-0.20.2-py36h7b7c402_2

  50. scipy intel/win-64::scipy-1.2.0-py36_3

  51. setuptools intel/win-64::setuptools-39.0.1-py36_0

  52. six intel /win-64::six-1.11.0-py36_3

  53. sqlite intel/win-64::sqlite-3.27.2-vc14_2

  54. tbb intel/win-64::tbb-2019.4-vc14_intel_203

  55. tbb4py intel/win-64::tbb4py-2019.4-py36_intel_0

  56. tcl intel/win-64::tcl-8.6.4-vc14_22

  57. tk intel/ win-64::tk-8.6.4-vc14_28

  58. urllib3 intel/win-64::urllib3-1.24.1-py36_2

  59. vc intel/win-64::vc-14.0-2

  60. vs2015_runtime intel/win-64::vs2015_runtime-14.0.25420-intel_2

  61. wheel intel/win-64::wheel-0.31.0-py36_3

  62. win_inet_pton intel/win-64::win_inet_pton-1.0.1-py36_4

  63. wincertstore intel/win-64::wincertstore-0.2-py36_3

  64. xz intel/win-64::xz-5.2.3-vc14_2

  65. zlib intel/win-64::zlib-1.2.11-vc14h21ff451_5

你可以看到,对于每个库,都以“Intel/…”开头,这表示正在从Intel的发行渠道下载该库。一旦你同意安装这些库,就会开始下载和安装它们。

这一步是会出现一个问题。有时,这些库不会被下载,列表会往下走,或者出现SSL错误,然后命令退出。这个问题甚至可能被延迟,也就是说,现在所有东西都将被下载和安装,但是稍后如果你想添加任何新的库,提示符将抛出SSL错误。有一个方式可以简单的修复这个问题,为英特尔创建虚拟环境之前需要完成。

在你的shell或命令提示符中,通过下面的命令关闭anaconda的默认SSL验证

  1. conda config --set ssl_verify false

一旦关闭了SLL验证,你可以重复步骤2,删除之前创建的环境并重新启动。

3) 设置TensorFlow

恭喜你!!现在,你已经在电脑中设置了Intel的python发行版。现在是进入ML pipeline的时候了。

英特尔已经通过所有的发行版为tensorflow提供了优化,设置起来非常顺利。(https://software.intel.com/en-us/ai/frameworks/tensorflow)。让我们看看如何为CPU安装优化过的tensorflow。英特尔软件提供了一个优化的数学内核库(mkl),优化数学操作,并为用户提供所需的加速。因此,我们将按如下方式安装tensorflow-mkl。

  1. conda install tensorflow-mkl

或者使用pip,可以将其设置为如下所示。

  1. pip install intel-tensorflow

Tensorflow现在已经启动并在你的系统中运行,并进行了必要的优化。如果你是Keras的粉丝,你可以用一个简单的命令来设置它:-

  1. conda install keras -c intel

4) 设置Jupyter

由于我们创建了一个新的虚拟环境,但它不是spyder或jupyter notebooks的默认环境。然而,设置这些是很简单的。只要一行命令,我们就能做到。

  1. conda install jupyter -c intel

5) 激活环境开始做实验

既然我们已经设置好了所有的东西,现在是动手的时候了,我们开始在优化的CPU系统上编写代码并尝试各种ML和DL方法。首先,在执行任何代码之前,确保使用了正确的环境。在使用安装在虚拟环境中的库之前,需要激活虚拟环境。这个激活步骤是一个永久的过程,并且是毫不费力的。在anaconda提示符中编写以下命令,就可以开始了。

  1. conda activate intel

要对环境进行全面检查,在激活环境后,在命令提示符/shell中键入以下命令。

  1. python

输入python后按enter,命令提示符中应该出现以下文本。确保显示的是“Intel Corporation”,并显示“Intel(R) Distribution for Python is brought to you by Intel Corporation.”。这些验证了英特尔Python发行版的正确安装。

  1. Python 3.6.8 |Intel Corporation| (default, Feb 27 2019, 19:55:17) [MSC v.1900 64 bit (AMD64)] on win32

  2. Type "help", "copyright", "credits" or "license" for more information.

  3. Intel(R) Distribution for Python is brought to you by Intel Corporation.

  4. Please check out: https://software.intel.com/en-us/python-distribution

现在,你可以使用命令行进行试验,或者在其他地方编写脚本来运行。

  1. (intel) C:\Users\User>python script.py

通过以下步骤1到4,使你的系统具备上面的性能基准图中提到的Intel xyz级别。这些仍然不是基于多处理器的线程优化。我将在下面讨论如何进一步优化你的多核CPU。


多核优化


要为你的多核系统添加进一步的优化,你可以将以下代码行添加到.py文件中,它将相应地执行脚本。这里NUMPARALLELEXEC_UNITS表示内核的数量,我有一个四核i7,因此这个数字是4。

  1. from keras import backend as K

  2. import tensorflow as tf

  3. NUM_PARALLEL_EXEC_UNITS = 4

  4. config = tf.ConfigProto(intra_op_parallelism_threads=NUM_PARALLEL_EXEC_UNITS, inter_op_parallelism_threads=2,

  5. allow_soft_placement=True, device_count={'CPU': NUM_PARALLEL_EXEC_UNITS})

  6. session = tf.Session(config=config)

  7. K.set_session(session)

  8. os.environ["OMP_NUM_THREADS"] = "4"

  9. os.environ["KMP_BLOCKTIME"] = "30"

  10. os.environ["KMP_SETTINGS"] = "1"

  11. os.environ["KMP_AFFINITY"] = "granularity=fine,verbose,compact,1,0"

如果你不喜欢使用Keras而更喜欢使用tensorflow,那么脚本几乎保持不变,只需删除以下两行。

  1. from keras import backend as K


  2. K.set_session(session)

在你的代码中添加了这些行之后,应该可以达到上面性能图表中的Intel xyz(O)条目相当的性能。

如果你的系统中有GPU,并且它与当前库集冲突,或者抛出一个cudnn错误,那么你可以在代码中添加以下行来禁用GPU。

  1. os.environ["CUDA_VISIBLE_DEVICES"] = "-1"


总结

现在你已经有了一个用于测试和开发机器学习项目和思想的优化pipeline。这一渠道为学生提供了大量的机会,让他们参与到学术研究中,用他们所拥有的资源继续他们的工作。这条pipeline还将防止从业者的私有数据的隐私泄露问题。

同样值得注意的是,通过适当的微调,一个人可以在他们的工作流程中获得3.45倍的加速,这意味着如果你正在试验你的想法,你现在可以比以前快三倍。


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127430
 
221 次点击