2019-05-09 15:58:10 qq_33039859 阅读数 462
  • 深度学习框架Caffe入门

    本课程在windows下搭建CPU版本Caffe环境,便于初学者学习和调试。通过实例介绍了Caffe的的训练和预测方法以及对应的python接口,便于大家掌握Caffe常用的训练和预测方法;结合以图形化的方式介绍网络结构、训练的loss/精度变化、代码框架梳理;还涉及到项目上Caffe更高级的应用:添加python自定义层及新增一个已有的c++层;介绍了深度学习网络训练的原理,结合Caffe的前向、反向传播的实现进行验证;最后修改一个已有的网络模型,使用项目上更常用的方式进行 网络训练。

    21 人正在学习 去看看 柳毅
  • 方法一
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
  • 方法二
$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Can Keras with Tensorflow backend be forced to use CPU or GPU at will?

在这里插入图片描述

2019-05-31 07:30:00 u011984148 阅读数 233
  • 深度学习框架Caffe入门

    本课程在windows下搭建CPU版本Caffe环境,便于初学者学习和调试。通过实例介绍了Caffe的的训练和预测方法以及对应的python接口,便于大家掌握Caffe常用的训练和预测方法;结合以图形化的方式介绍网络结构、训练的loss/精度变化、代码框架梳理;还涉及到项目上Caffe更高级的应用:添加python自定义层及新增一个已有的c++层;介绍了深度学习网络训练的原理,结合Caffe的前向、反向传播的实现进行验证;最后修改一个已有的网络模型,使用项目上更常用的方式进行 网络训练。

    21 人正在学习 去看看 柳毅

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Param Popat

编译:ronghuaiyang

导读

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


640?wx_fmt=png

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

640?wx_fmt=png

每个epoch的平均时间

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

640?wx_fmt=png

使用率

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

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

640?wx_fmt=png

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

设置Intel的Python发行版

640?wx_fmt=png

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.”的虚拟环境。

conda create -n intel -c intel intelpython3_full

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

The following NEW packages will be INSTALLED:	
asn1crypto         intel/win-64::asn1crypto-0.24.0-py36_3	
bzip2              intel/win-64::bzip2-1.0.6-vc14_17	
certifi            intel/win-64::certifi-2018.1.18-py36_2	
cffi               intel/win-64::cffi-1.11.5-py36_3	
chardet            intel/win-64::chardet-3.0.4-py36_3	
cryptography       intel/win-64::cryptography-2.3-py36_1	
cycler             intel/win-64::cycler-0.10.0-py36_7	
cython             intel/win-64::cython-0.29.3-py36_1	
daal               intel/win-64::daal-2019.3-intel_203	
daal4py            intel/win-64::daal4py-2019.3-py36h7b7c402_6	
freetype           intel/win-64::freetype-2.9-vc14_3	
funcsigs           intel/win-64::funcsigs-1.0.2-py36_7	
icc_rt             intel/win-64::icc_rt-2019.3-intel_203	
idna               intel/win-64::idna-2.6-py36_3	
impi_rt            intel/win-64::impi_rt-2019.3-intel_203	
intel-openmp       intel/win-64::intel-openmp-2019.3-intel_203	
intelpython        intel/win-64::intelpython-2019.3-0	
intelpython3_core  intel/win-64::intelpython3_core-2019.3-0	
intelpython3_full  intel/win-64::intelpython3_full-2019.3-0	
kiwisolver         intel/win-64::kiwisolver-1.0.1-py36_2	
libpng             intel/win-64::libpng-1.6.36-vc14_2	
llvmlite           intel/win-64::llvmlite-0.27.1-py36_0	
matplotlib         intel/win-64::matplotlib-3.0.1-py36_1	
menuinst           intel/win-64::menuinst-1.4.1-py36_6	
mkl                intel/win-64::mkl-2019.3-intel_203	
mkl-service        intel/win-64::mkl-service-1.0.0-py36_7	
mkl_fft            intel/win-64::mkl_fft-1.0.11-py36h7b7c402_0	
mkl_random         intel/win-64::mkl_random-1.0.2-py36h7b7c402_4	
mpi4py             intel/win-64::mpi4py-3.0.0-py36_3	
numba              intel/win-64::numba-0.42.1-np116py36_0	
numexpr            intel/win-64::numexpr-2.6.8-py36_2	
numpy              intel/win-64::numpy-1.16.1-py36h7b7c402_3	
numpy-base         intel/win-64::numpy-base-1.16.1-py36_3	
openssl            intel/win-64::openssl-1.0.2r-vc14_0	
pandas             intel/win-64::pandas-0.24.1-py36_3	
pip                intel/win-64::pip-10.0.1-py36_0	
pycosat            intel/win-64::pycosat-0.6.3-py36_3	
pycparser          intel/win-64::pycparser-2.18-py36_2	
pyopenssl          intel/win-64::pyopenssl-17.5.0-py36_2	
pyparsing          intel/win-64::pyparsing-2.2.0-py36_2	
pysocks            intel/win-64::pysocks-1.6.7-py36_1	
python             intel/win-64::python-3.6.8-6	
python-dateutil    intel/win-64::python-dateutil-2.6.0-py36_12	
pytz               intel/win-64::pytz-2018.4-py36_3	
pyyaml             intel/win-64::pyyaml-4.1-py36_3	
requests           intel/win-64::requests-2.20.1-py36_1	
ruamel_yaml        intel/win-64::ruamel_yaml-0.11.14-py36_4	
scikit-learn       intel/win-64::scikit-learn-0.20.2-py36h7b7c402_2	
scipy              intel/win-64::scipy-1.2.0-py36_3	
setuptools         intel/win-64::setuptools-39.0.1-py36_0	
six                intel/win-64::six-1.11.0-py36_3	
sqlite             intel/win-64::sqlite-3.27.2-vc14_2	
tbb                intel/win-64::tbb-2019.4-vc14_intel_203	
tbb4py             intel/win-64::tbb4py-2019.4-py36_intel_0	
tcl                intel/win-64::tcl-8.6.4-vc14_22	
tk                 intel/win-64::tk-8.6.4-vc14_28	
urllib3            intel/win-64::urllib3-1.24.1-py36_2	
vc                 intel/win-64::vc-14.0-2	
vs2015_runtime     intel/win-64::vs2015_runtime-14.0.25420-intel_2	
wheel              intel/win-64::wheel-0.31.0-py36_3	
win_inet_pton      intel/win-64::win_inet_pton-1.0.1-py36_4	
wincertstore       intel/win-64::wincertstore-0.2-py36_3	
xz                 intel/win-64::xz-5.2.3-vc14_2	
zlib               intel/win-64::zlib-1.2.11-vc14h21ff451_5

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

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

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

conda config --set ssl_verify false

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

3) 设置TensorFlow

640?wx_fmt=png

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

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

conda install tensorflow-mkl

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

pip install intel-tensorflow

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

conda install keras -c intel

4) 设置Jupyter

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

conda install jupyter -c intel

5) 激活环境开始做实验

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

conda activate intel

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

python

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

Python 3.6.8 |Intel Corporation| (default, Feb 27 2019, 19:55:17) [MSC v.1900 64 bit (AMD64)] on win32	
Type "help", "copyright", "credits" or "license" for more information.	
Intel(R) Distribution for Python is brought to you by Intel Corporation.	
Please check out: https://software.intel.com/en-us/python-distribution

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

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

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

多核优化

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

from keras import backend as K	
import tensorflow as tf	
NUM_PARALLEL_EXEC_UNITS = 4	
config = tf.ConfigProto(intra_op_parallelism_threads=NUM_PARALLEL_EXEC_UNITS, inter_op_parallelism_threads=2,	
                       allow_soft_placement=True, device_count={'CPU': NUM_PARALLEL_EXEC_UNITS})	
session = tf.Session(config=config)	
K.set_session(session)	
os.environ["OMP_NUM_THREADS"] = "4"	
os.environ["KMP_BLOCKTIME"] = "30"	
os.environ["KMP_SETTINGS"] = "1"	
os.environ["KMP_AFFINITY"] = "granularity=fine,verbose,compact,1,0"

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

from keras import backend as K	
	
K.set_session(session)

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

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

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

总结

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

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

640?wx_fmt=pngEND

英文原文:https://towardsdatascience.com/optimize-your-cpu-for-deep-learning-424a199d7a87

640?wx_fmt=jpeg

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧640?wx_fmt=gif

2019-08-09 11:10:29 zaishuiyifangxym 阅读数 980
  • 深度学习框架Caffe入门

    本课程在windows下搭建CPU版本Caffe环境,便于初学者学习和调试。通过实例介绍了Caffe的的训练和预测方法以及对应的python接口,便于大家掌握Caffe常用的训练和预测方法;结合以图形化的方式介绍网络结构、训练的loss/精度变化、代码框架梳理;还涉及到项目上Caffe更高级的应用:添加python自定义层及新增一个已有的c++层;介绍了深度学习网络训练的原理,结合Caffe的前向、反向传播的实现进行验证;最后修改一个已有的网络模型,使用项目上更常用的方式进行 网络训练。

    21 人正在学习 去看看 柳毅

在这里插入图片描述

注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/98944012


1 什么是深度学习?

深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。
深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。
深度学习在搜索技术,数据挖掘,机器学习,机器翻译,自然语言处理,多媒体学习,语音,推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习使机器模仿视听和思考等人类的活动,解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。
(以上均来自百度百科)

下面了解一下人工智能、机器学习和深度学习之间的关系。下图是三者之间的关系,可以看出三者之间是包含和被包含的关系。

在这里插入图片描述



2 深度学习应用

2.1 机器学习的一般方法

机器学习按照方法主要可以分为两大类:监督学习和无监督学习。其中监督学习主要由分类和回归等问题组成,无监督学习主要由聚类和关联分析等问题组成。深度学习则属于监督学习当中的一种。下图为监督学习的一般方法。
在这里插入图片描述

2.2 深度学习的一般方法

随着深度学习的爆发,最新的深度学习算法已经远远超越了传统的机器学 习算法对于数据的预测和分类精度。深度学习不需要我们自己去提取特征,而是自 动地对数据进行筛选,自动地提取数据高维特征。下图为深度学习的一般方法,与传统机器学习中的监督学习一般方法(如上图)相比,少了特征工程,节约了工程师们大量工作时间。

在这里插入图片描述
神经网络应用的突破领域之一是控制论,神经网络有着一套完美的反馈机制,给控制论增添了不少色彩。而深度学习的出现就 如寒武纪生命大爆发一样,前几年我们或许听到更多的是大数据处理、数据挖掘, 而如今在科技创新的生态中,几乎每个人都在谈论深度学习、人工智能。下面简单 来介绍关于深度学习的应用。

(1) 图像处理

在这里插入图片描述

(2) 自动驾驶

在这里插入图片描述

(3) 机器人
波士顿动力机器人

在这里插入图片描述


在这里插入图片描述


(4) 医疗健康诊断

在这里插入图片描述


在这里插入图片描述
深度学习技术己经开始渗透到每一个领域当中,使得机器学习能够实现更多的应用场景,并且极大地拓展了人工智能的领域范畴。从无人驾驶汽车、无人驾驶飞机,到生物医学的预防性诊断、病理预测,甚至是更加贴近年轻一代的电影推荐、购物指南,几乎所有领域都可以使用深度学习。



3 GPU的迅速发展

GPU (Graphics Processing Unit, 图形处理器) 作为硬件加速器之一,通过大量图形处理单元与 CPU 协同工作,对深度学习、数据分析,以及大量计算的工程应用进行加速 。 从 2007 年 NVIDIA 公司发布了第一个支持 CUDA 的 GPU 后, GPU 的应用范围不断拓展,从政府实验室、大学、企业的大型数据中心,到现今非常火热的人工智能汽车、无人驾驶飞机和机器人等嵌入式平台, GPU 都发挥着巨大的作用。
CUDA (Compute Unified Device Architecture, 统一计算设备架构)。随着显卡的发展, GPU 越来越强大, GPU 开始主要为显示图像做优化,在计算上已经超越了通用的 CPU 。 如此强大的芯片如果只是作为显卡就太浪费了,因此 NVIDIA 推出 CUDA 这一通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题 。

3.1 GPU与显卡的区别

GPU只是显卡上的一个核心处理芯片,是显卡的心脏,不能单独作为外接扩展卡使用,GPU因并行计算任务较重,所以功耗较大,只能焊接在显卡的电路板上使用。显卡上都有GPU,它是区分显性能的最主要元件,显卡也叫显示适配器,分为独立显卡和主板上集成显卡,独立显卡主要由GPU、显存和接口电路构成,集成显卡没有独立显存而是使用主板上的内存。
GPU是图形处理器,一般GPU就是焊接在显卡上的,大部分情况下,我们所说GPU就等于指显卡,但是实际情况是GPU是显示卡的“心脏”,是显卡的一个核心零部件,核心组成部分。它们是“寄生与被寄生”关系。GPU本身并不能单独工作,只有配合上附属电路和接口,才能工作。这时候,它就变成了显卡
参考链接: https://baijiahao.baidu.com/s?id=1607965696317204020&wfr=spider&for=pc

3.2 GPU 与 CPU 区别

比较 GPU 和 CPU ,就是比较它们两者如何处理任务。如下图图 1-9 所示, CPU 使用几个核心处理单元去优化串行顺序任务,而 GPU 的大规模并行架构拥有数以千计的更小、更高效的处理单元,用于处理多个并行小任务。
CPU 拥有复杂的系统指令,能够进行复杂的任务操作和调度,两者是互补关系,而不能相互代替。
在这里插入图片描述

GPU 是大规模并行架构,处理并行任务毫无疑问是非常快的,深度学习需要高
效的矩阵操作和大量的卷积操作, GPU 的并行架构再适合不过。简单来说,确实如此,但是为什么 GPU 进行矩阵操作和卷积操作会比 CPU 要快呢?真正原因是 GPU具有如下特性
(1) 高带宽
(2) 高速的缓存性能
(3) 并行单元多

在执行多任务时, CPU 需要等待带宽,而 GPU 能够优化带宽。举个简单的例子,我们可以把 CPU 看作跑车, GPU 是大卡车,如下图图 1-10 所示任务就是要把一堆货物从北京搬运到广州。 CPU(跑车〉可以快速地把数据(货物〉从内存读入 RAM 中,然而 GPU (大卡车〉装货的速度就好慢了。不过后面才是重点, CPU (跑车)把这堆数据(货物)从北京搬运到广州|需要来回操作很多次,也就是往返京广线很多次,而 GPU (大卡车)只需要一 次就可以完成搬运(一次可以装载大量数据进入内存)。换言之, CPU 擅长操作小的内存块,而 GPU 则擅长操作大的内存块 。 CPU 集群大概可以达到 50GB/s 的带宽总量,而等量的 GPU 集群可以达到 750GB/s 的带宽量。

在这里插入图片描述

如果让一辆大卡车去装载很多堆货物,就要等待很长的时间了,因为要等待大卡车从北京运到广州,然后再回来装货物。设想一下,我们现在拥有了跑车车队和卡车车队(线程并行〉,运载一堆货物(非常大块的内存数据需要读入缓存,如大型矩阵)。我们会等待第一辆卡车,但是后面就不需要等待的时间了,因为在广州会有一队伍的大卡车正在排队输送货物(数据),这时处理器就可以直接从缓存中读取数据了。在线性并行的情况下, GPU 可以提供高带宽,从而隐藏延迟时间。这也就是GPU 比 CPU 更适合处理深度学习的原因。


3.3 GPU种类

特别是最近几年,随着 GPU处理能力的飞速进步 ,在 2012 年需要 l 个月才能完成的深度学习训练,在 2015 年只需几天即可完成 。 在这样的背景下,深度学习的发展恰逢其时,将会引发进一步的革新和发展。

对于深度学习的加速器 GPU,现在市面上主要的品牌有 AMD 、 NVIDIA 、Intel 的 Xeon Phi,如下图所示。
在这里插入图片描述
NVIDIA公司的GUP使用最为广泛,NVIDIA 的计算加速标准库 cuDNN 使得工程师在 CUDA 平台中构建深度学习变得非常容易,而且在同 一张显卡的前提下比没有使用 cnDNN 的速度提升 5 倍之多。有良好的生态。下图是NVIDIA公司的三种类型的GPU。
在这里插入图片描述
其中,
(1) GeForce 系列面向大众,常见的有:GeForce GTX 1080, GeForce GTX 1080 Ti, GeForce GTX 2080 Ti
(2) Tesla 系列面向科学计算
(3) Tegra 系列面向嵌入式的 GPU 主板



参考资料

[1] 图解深度学习
[2] 深度学习原理与实践
[3] TensorFlow实战Google深度学习框架(第2版)

2019-02-05 14:00:00 cpongo4 阅读数 35
  • 深度学习框架Caffe入门

    本课程在windows下搭建CPU版本Caffe环境,便于初学者学习和调试。通过实例介绍了Caffe的的训练和预测方法以及对应的python接口,便于大家掌握Caffe常用的训练和预测方法;结合以图形化的方式介绍网络结构、训练的loss/精度变化、代码框架梳理;还涉及到项目上Caffe更高级的应用:添加python自定义层及新增一个已有的c++层;介绍了深度学习网络训练的原理,结合Caffe的前向、反向传播的实现进行验证;最后修改一个已有的网络模型,使用项目上更常用的方式进行 网络训练。

    21 人正在学习 去看看 柳毅

背景介绍

随着人工智能技术在爱奇艺视频业务线的广泛应用,深度学习算法在云端的部署对计算资源,尤其是 GPU 资源的需求也在飞速增长。如何提高深度学习应用部署效率,降低云平台运行成本,帮助算法及业务团队快速落地应用和服务,让 AI 发挥真正的生产力,是深度学习云平台团队努力的目标 。

从基础架构的角度,GPU资源的紧缺和GPU 利用率的不足是我们面临的主要挑战。由于大量的算法训练及推理服务需求,云端 GPU 资源经常处于短缺状态;而使用 CPU 进行的推理服务常常由于性能问题,无法满足服务指标。除此之外,线上服务通常有较高的实时性要求,需要独占 GPU,但由于较低的 QPS,GPU 利用率经常处于较低的状态(\u0026lt;20%)。

在此背景下,我们尝试进行了基于CPU的深度学习推理服务优化,通过提升推理服务在CPU上的性能,完成服务从GPU迁移到CPU上的目的,以利用集群中大量的 CPU服务器,同时节省GPU计算资源 。

\"image\"

图1. 深度学习服务对云平台的挑战

1. 深度学习推理服务及优化流程

1.1 什么是深度学习推理服务?

深度学习推理服务通常是指将训练好的深度学习模型部署到云端,并对外提供gRPC/HTTP接口请求的服务。推理服务内部实现的功能包括模型加载,模型版本管理,批处理及多路支持,以及服务接口的封装等,如图2所示:

\"image\"

图2. 深度学习推理服务功能模块

业界常用的深度学习推理服务框架包括 Google的tensorflow serving、Nvidia的Tensor RT inference server,Amazon的Elastic Inference等。目前爱奇艺深度学习云平台(Jarvis)提供以tensorflow serving 为框架的自动推理服务部署功能,已支持的深度学习模型包括 tensorflow,caffe,caffe2,mxnet,tensorrt 等,未来还会支持包括 openvino,pytorch。除此之外,业务团队也可以根据自身需求实现和定制特定的深度学习服务化容器,并通过QAE进行服务的部署和管理。

1.2 服务优化的流程是怎样的?

服务优化流程如图3所示,是一个不断朝优化目标迭代的过程。

\"image\"

图3. 服务优化的流程

进行深度学习推理服务的优化,首先需要明确服务的类型和主要性能指标,以确定服务优化的目标。从系统资源的角度,深度学习服务可以分为计算密集或者I/O 密集类服务,例如基于CNN的图像/视频类算法通常对计算的需求比较大,属于计算密集型服务,搜索推荐类的大数据算法输入数据的特征维度较高,数据量大,通常属于I/O 密集型服务。从服务质量的角度,又可以分为延时敏感类服务和大吞吐量类型服务,例如在线类服务通常需要更低的请求响应时间,多属于延时敏感类服务,而离线服务通常是批处理的大吞吐量类型服务。不同类型的深度学习服务优化的目标和方法也不尽相同。

\"image\"

图4. 深度学习推理服务的分类

1.3 深度学习推理服务的性能指标有哪些?

深度学习服务的性能指标主要包括响应延时(latency),吞吐量(throughput),及模型精度(accuracy)等,如图5 所示。其中响应延时和吞吐量两个指标是进行服务化过程中关心的性能指标。明确服务性能指标后便于我们分析服务规模,计算单一服务节点需要达到的服务性能。

\"image\"

图5. 深度学习服务性能指标

2. 基于CPU的深度学习推理服务优化

2.1 CPU上进行深度学习优化的方法主要有哪些?

“工欲善其事,必先利其器”。CPU上进行深度学习推理服务优化的方法,可以分为系统级、应用级、算法级,每一级也有对应的性能分析工具,如图6所示:

系统级的优化主要从硬件和平台的角度进行计算加速,方法主要包括基于SIMD指令集的编译器加速、基于OMP的数学库并行计算加速、以及硬件厂商提供的深度学习加速 SDK 等方法。

应用级的优化主要从特定应用和服务的角度进行流水和并发的优化。通常的深度学习服务不仅仅包含推理,还有数据的预处理、后处理,网络的请求响应等环节,良好的并发设计可以有效的提升服务端到端的性能。

算法级的优化主要针对深度学习模型本身,利用诸如超参数设置、网络结构裁剪、量化等方法来减小模型大小和计算量,从而加速推理过程。

\"image\"

图6. 深度学习服务性能优化方法及分析工具

2.2 如何进行系统级的优化?

CPU上系统级优化实践中我们主要采用数学库优化(基于MKL-DNN)和深度学习推理SDK优化(Intel OpenVINO)两种方式。这两种方式均包含了SIMD指令集的加速。

数学库优化对主流的深度学习框架(tensorflow,caffe,mxnet,pytorch等)均有官方源支持。以tensorflow为例,使用方法如下所示:

\"image\"

图7. 基于MKL-DNN 优化的 Tensorflow 使用方法

深度学习推理SDK优化方法,需要首先将原生深度学习模型进行转换,生成IR中间模型格式,之后调用SDK的接口进行模型加载和推理服务封装。具体流程如下所示:

\"image\"

图8. OpenVINO 优化推理服务流程

2.3 选用哪种系统级优化方式?

两种优化方式的比较如图9所示:

\"image\"

图9. 系统级优化方式比较

基于两种优化方式的特点,实践中可首先使用基于MKL-DNN的优化方式进行服务性能测试,如满足服务需求,可直接部署;对于性能有更高要求的服务,可尝试进行 OpenVINO SDK优化的方法。

2.4 系统级优化使用中有哪些影响性能的因素?

以上两种系统级优化方法,使用过程中有以下因素会影响服务性能。

(1)OpenMP参数的设置

两种推理优化方式均使用了基于OMP的并行计算加速,因此OMP参数的配置对性能有较大的影响。主要参数的推荐配置如下所示:

• OMP_NUM_THREADS = “number of cpu cores in container”

• KMP_BLOCKTIME = 10

• KMP_AFFINITY=granularity=fine, verbose, compact,1,0

(2)部署服务的CPU核数对性能的影响

CPU 核数对推理服务性能的影响主要是:

• Batchsize 较小时(例如在线类服务),CPU核数增加对推理吞吐量提升逐渐减弱,实践中根据不同模型推荐 8-16 核 CPU进行服务部署;

• Batchsize 较大时(例如离线类服务),推理吞吐量可随CPU核数增加呈线性增长,实践中推荐使用大于 20 核CPU进行服务部署;

(3)CPU型号对性能的影响

不同型号的 CPU 对推理服务的性能加速也不相同,主要取决于CPU中SIMD指令集。例如相同核数的Xeon Gold 6148的平均推理性能是Xeon E5-2650 v4的2倍左右,主要是由于6148 SIMD指令集由avx2升级为avx-512。

目前线上集群已支持选择不同类型的CPU进行服务部署。

(4)输入数据格式的影响

除 Tensorflow之外的其他常用深度学习框架,对于图像类算法的输入,通常推荐使用NCHW 格式的数据作为输入。Tensorflow原生框架默认在CPU上只支持 NHWC 格式的输入,经过 MKL-DNN 优化的 Tensorflow 可以支持两种输入数据格式。

使用以上两种优化方式,建议算法模型以 NCHW 作为输入格式,以减少推理过程中内存数据重排带来的额外开销。

(5)NUMA 配置的影响

对于NUMA 架构的服务器,NUMA配置在同一node上相比不同node上性能通常会有 5%-10%的提升。

2.5 如何进行应用级的优化?

进行应用级的优化,首先需要将应用端到端的各个环节进行性能分析和测试,找到应用的性能瓶颈,再进行针对性优化。性能分析和测试可以通过加入时间戳日志,或者使用时序性能分析工具,例如 Vtune,timeline 等 。优化方法主要包括并发和流水设计、数据预取和预处理、I/O加速、特定功能加速(例如使用加速库或硬件进行编解码、抽帧、特征embedding等功能加速)等方式。

下面以视频质量评估服务为例,介绍如何利用Vtune工具进行瓶颈分析,以及如何利用多线程/进程并发进行服务的优化。

视频质量评估服务的基本流程如图10 所示,应用读入一段视频码流,通过OpenCV进行解码、抽帧、预处理,之后将处理后的码流经过深度学习网络进行推理,最后通过推理结果的聚合得到视频质量的打分,来判定是何种类型视频。

\"image\"

图10. 视频质量评估服务流程

图11是通过 Vtune工具抓取的原始应用线程,可以看到OpenCV单一解码线程一直处于繁忙状态(棕色),而OMP推理线程常常处于等待状态(红色)。整个应用的瓶颈位于 Opencv 的解码及预处理部分。

\"image\"

图11. 应用优化前线程状态

图12显示优化后的服务线程状态,通过生成多个进程并发进行视频流解码,并以 batch的方式进行预处理;处理后的数据以batch的方式传入OMP threads进行推理来进行服务的优化。

\"image\"

图12. 应用并发优化后线程状态

经过上述简单的并发优化后,对720帧视频码流的处理时间,从7秒提升到了3.5秒,性能提升一倍。除此之外,我们还可以通过流水设计,专用解码硬件加速等方法进一步提升服务整体性能。

2.6 如何进行算法级的优化?

常见的算法级优化提升推理服务性能的方法包括batchsize的调整、模型剪枝、模型量化等。其中模型剪枝和量化因涉及到模型结构和参数的调整,通常需要算法同学帮助一起进行优化,以保证模型的精度能满足要求。

2.7 Batchsize的选取在CPU上对服务性能的影响是怎样的?

Batchsize选取的基本原则是延时敏感类服务选取较小的batchsize,吞吐量敏感的服务选取较大的batchsize。

图13是选取不同的 batchsize 对推理服务吞吐量及延时的影响。测试结果可以看batchsize 较小时适当增大batchsize(例如bs从1到2),对延时的影响较小,但是可以迅速提升吞吐量的性能;batchsize 较大时再增加其值(例如从8到32),对服务吞吐量的提升已没有帮助,但是会极大影响服务延时性能。因此实践中需根据部署服务节点CPU核数及服务性能需求来优化选取batchsize。

\"image\"

图13. Batchsize 对服务性能影响

总结与展望

以上介绍的系统级优化方法,已在深度学习云平台落地超过10+应用和算法,部署上千core的服务,平均性能提升在1~9倍。更详细的使用方法可以参考文末相关链接。

对于深度学习的推理服务优化,深度学习云平台还计划加入更多的异构计算资源来加速特定任务,例如VPU、FPGA等计算资源。同时在服务的弹性和优化调度、部署参数的自动优化选取等方面,我们也会继续深入优化,以充分发挥云平台的计算资源和能力,加速深度学习推理服务的落地。

相关链接

(1)OpenVINO:

https://software.intel.com/en-us/openvino-toolkit

(2)Vtune性能分析工具:

https://software.intel.com/en-us/vtune

2017-12-12 16:29:11 sinat_36458870 阅读数 3110
  • 深度学习框架Caffe入门

    本课程在windows下搭建CPU版本Caffe环境,便于初学者学习和调试。通过实例介绍了Caffe的的训练和预测方法以及对应的python接口,便于大家掌握Caffe常用的训练和预测方法;结合以图形化的方式介绍网络结构、训练的loss/精度变化、代码框架梳理;还涉及到项目上Caffe更高级的应用:添加python自定义层及新增一个已有的c++层;介绍了深度学习网络训练的原理,结合Caffe的前向、反向传播的实现进行验证;最后修改一个已有的网络模型,使用项目上更常用的方式进行 网络训练。

    21 人正在学习 去看看 柳毅

深度学习环境搭建

阅读数 778

没有更多推荐了,返回首页