darknet框架 VS2017 平台工具集141_玩转 GPU 实例之终结篇 – 深度学习的工具与框架...

前言

在开篇的时候我谈到,这个系列的内容来自于我在使用GPU实践中的一点心得。但是围绕GPU相关的技术话题实在是太过于广泛,如果洋洋洒洒的写下去我很担心会错过许多新鲜的话题。于是就让这一篇成为这个系列的终结篇,并且分享一下使用GPU的最重要的领域-深度学习上的框架与工具这个内容吧。

这里我所指的工具是指那些在深度学习应用中发挥了重大作用的几个工具,包括了历久弥新的OpenCV 以及利用Intel CPU加速数学运算的MKL 库(Intel Math Kernel Library )。而深度学习的框架则是那些已经众所周知的深度学习框架,包括了TensorFlow、PyTorch 以及Apache MxNet等。

事实上,关于这几个工具与框架的内容可以说是汗牛充栋了。而我想分享的不是如何使用这些工具,而是如何编译、优化这几个工具与框架。针对GPU实例(例如EC2 P3 实例),针对性的优化可以最大限度的发挥出来这个实例的能力,对于模型的训练或者推理的性能会起到显著的提升,如果你有兴趣,就让我们挽起袖子一起来尝试一下。

8e6a17cfd9950b82bb238b293735a968.png

计算机视觉领域的瑞士军刀 – OpenCV

OpenCV(Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库。OpenCV项目的目标是为了为计算机视觉应用提供一个通用的基础设施。OpenCV采用了BSD许可,这使得开发人员与企业很容易地在自己的产品中使用它。

OpenCV提供了超过2500个优化的算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可以用来检测和识别人脸、识别对象,对人的行动的视频分类、跟踪相机移动、跟踪移动物体、提取对象的三维模型,从立体相机产生三维点云图像合成到一起产生一个高分辨率图像的整个场景、从一个图像数据库发现类似的图像、从使用闪光灯拍摄的图像中删除红眼、追踪眼球运动、识别风景并建立标记,将其与增强现实叠加等等。目前OpenCV有超过47,000个用户社区,估计下载量超过1800万。OpenCV是用C++编写的,并且有一个与STL容器无缝配合的模板化接口。怎对开发者OpenCV提供了C++、Python、Java和MATLAB等的接口,并且支持Windows、Linux、Android和Mac OS等平台。

在过去的几年,随着机器学习、深度学习尤其是计算机视觉技术的快速发展,OpenCV的也不断推出了新的特性和版本。其中延续原有接口的3.X系列发展到了3.4.10且表现出来更加的成熟与稳定;而4.X系列则引入了许多新的技术, 例如在版本4.2中增加了引入了对cuDNN的支持使得其DNN模块的性能得到显著提升;对于OpenVINO™ 的支持又使得OpenCV 可以有更好的适应性,例如在RaspBerry Pi 上通过使用Intel® Neural Compute Stick 2计算棒来提升性能。在今年4月份发布的4.3.0 这个版本中,更是一口气增加了对于ONNX、Darknet、MobileNet-SSD 等令人心动的技术的支持。

0c2902d277524a37dd46273a0ace96d6.png
Intel® Neural Compute Stick 2 (NCS2) 计算棒

不过,在我们使用的Ubuntu 10.04中内置的OpenCV的版本仅仅是3.2。而上述的那许多新的特性难道只能望洋兴叹了吗?那就让我们自己动手编译出来一个吧。我现在使用的OpenCV 就是通过这个脚本编译出来的。脚本的内容如下:

#!/bin/bash

这个脚本看起来很长,内容却不复杂。我来给大家解释一下我的思路:

VERSION

这一句使用来取得OpenCV 最新的版本号。这样可以确保我们每一次构建都能够获得最新的版本。

#

这一段安装的是OpenCV所依赖的库。我们可以针对具体的需要酌情删减。

cmake 

这是编译OpenCV 最重要的步骤,通过cmake 生成编译需要的Makefile。需要注意的是,在这个配置中我启用了对CUDA以及cuDNN 支持。如果我们仅仅需要一个支持CPU的版本可以关闭掉这几个选项。此外,由于重要用于Python3的环境之下,于是在编译中关闭了Python2 与Java的支持。

在一台P3 实例的机器上编译所需的时间不长,我们就得到了在Python 3中使用OpenCV的库- /home/ubuntu/.local/lib/python3.7/site-packages/cv2/python-3.7/cv2.cpython-37m-x86_64-linux-gnu.so 。测试一下,就看到了这个结果:

5528755fa7f3cef8e0c11338f7b220ce.png

好了,OpenvCV 已经大功告成。

CPU 运算的加速器- Intel Math Kernel Library (MKL)

Intel 的MKL是一个为科学、工程和金融应用程序以及机器学习优化数学例程的库。核心数学函数包括BLAS、LAPACK、ScaLAPACK、稀疏求解器、快速傅里叶变换和向量运算等。这个库自2003年出现以来,被广泛的用于利用Intel CPU 指令集中 AVX2、AVX512 等特性来提升运算处理性能。其性能表现可以参考MKL vs OpenBLAS 的一个性能对比。

a457531c6044fc967c31f6de63b979aa.png

需要强调一点,Intel 向开发者免费提供了MKL,在软件分发方面需要遵守

“Intel Simplified Software License“,而要获得商业支持则需要付费购买。相比较起来,我们可能更熟悉MK-LDNN,这个项目是Intel 的一个开源产品,我们在许多框架当中例如Tensorflow、MXNet中都能看到它。与商业化的Intel MKL 不同,MKL-DNN采用的的是Apache 许可。不过Intel 现在有了一个名为oneAPI 的策略,于是MKL-DNN 被改称oneAPI Deep Neural Network Library (oneDNN)。而Intel MKL 也成为了oneAPI 下的一个重要的组件。与以往的注册、下载、安装不同,MKL 现在提供了一个简单的方法完成在Ubuntu 下的安装。

第一步:添加Intel 的oneAPI repo

#!/bin/bash

第二步:安装Intel MKL

#!/bin/bash

第三步:安装其它Intel 的产品

例如Intel 优化的Python 3 解释器以及TBB 。这里说的TBB指的是Intel 提供的一个C++模板库,用于多核处理器上的并行编程。使用TBB,计算被分解为可以并行运行的任务。该库管理并调度执行这些任务的线程。

#!/bin/bash

好了,Intel MKL 安装完毕。

深度学习框架- TensorFlow、PyTorch 以及MXNet

可以说,TensorFlow、Pytorch 以及Apache MXNet 是最为流行的深度学习框架了。无论是通过官网下载、PIP安装或者Anaconda 等等我们都可以非常容易的完成这几个框架的安装。但是,我们能够想到为了兼顾更为广泛的使用环境的匹配,我们能够得到这几个框架的安装包都只能进行有限度的优化。无非是区分一下使用GPU优化(CUDA、cuDNN)或者CPU优化(MKL-DNN)等等。至于完全匹配我们具体的运行环境的安装包就只能依靠我们自己动手了。

从我的体会来看,动手编译这几个框架固然比较麻烦。但是一来这样可以帮助我们更好的理解框架本身,二来性能提升的效果也是非常令人满意的。

动手编译TensorFlow

动手之前,我们先要解决的一件事就是Bazel 这个构建工具。完全是因为TensorFlow 才让我熟悉了这个工具。考虑到这是Google 的出品,就能够理解TensorFlow放弃Ninja、cmake等成熟工具而选用Bazel 的原因了。Bazel 的运行需要JVM的支持,因此我们需要首先完成JDK 的安装- sudo apt install openjdk-11-jdk。其次,Bazel 的安装有两种方法,第一种是使用Bazel’s apt repository 来进行安装。这种方法最为简单,但却不是我所推荐的方法。原因在于TensorFlow 需要依赖特定的Bazel 版本,于是Binary 安装包就成为了不二的选择。安装脚本如下:

!

需要解释的一点,TensorFlow 1.X 与2.X 所使用的Bazel 版本不同,需要我们在脚本中通过注释的方法来选择版本。

TensorFlow 1.5.2

#!/bin/bash

在上面的这个脚本中,我们在~/Project 下克隆了Tensorflow 1.52 的源代码,并且创建了 build_tesnsorflow.sh 与buuild_whel.sh 两个脚本文件。前一个脚本用来编译TensorFlow,后一个脚本用来生成python安装的whl 文件。

编译完成以后我们就得到了Python 包的安装文件tensorflow-1.15.2-cp37-cp37m-linux_x86_64.whl。检查一下可以看到这个结果:

50b820917df977cc6429f04ce5c9a5df.png

动手编译 PyTorch

相比较起来,PyTorch 的编译脚本要简单一些,编译的时间开销也要少一些。编译的脚本如下:

#!/bin/bash

编译成功以后我们就得到了一个Python 安装包- torch-1.6.0a0+30e7055-cp37-cp37m-linux_x86_64.whl。验证一下结果:

57ddc4aa1ddb5e4892c492d336e96327.png

此外,我还可以从其它的几个方面针对PyTorch 进行优化,例如torchversion 以及pillow。具体说来就是针对这两个工具在编译中引入SIMD 以及AVX指令的优化,使之性能更加出色。这里说的SIMD指的是单指令流多数据流(Single Instruction Multiple Data)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。

pillow-simd 的安装脚本如下:

#!/bin/bash

而torchversion 这个PyTorch 的最佳拍档,其安装脚本如下:

#!/bin/bash

这里一个主要的优化手段就是使得torchvision 使用GPU 来进行加速。

动手编译 Apache MXNet

MXNet 这个项目虽非声名显赫,但其巨大的进步也是有目共睹,最新版本已经发展到了1.6.0。对我来说,我更期待其2.0的版本。在MXNet 2.0 Roadmap 中我们看到了许多令人激动的特性,希望这个版本正式发布的日子早点到了。

编译MXNet 不是件麻烦的事情,在官方文档中有详尽的描述。我的编译脚本是这样的:

#!/bin/bash

好了,到这里这个系列终于可以告一段落了。其实,在我的构思中其实还有一些内容来不及加入进来,例如Horovod、JupyterLab、TensorFlow Lite 以及TVM 等等。如果有机会,我还是希望能够与各位分享这些内容。随着时间的推移,更多有意思的内容也会不断的涌现,就像是我现在正在玩 的YOLOv4 一样。希望这些内容能够对各位有所稗益,也预祝各位在技术的海洋中自得其乐。

本篇作者

85511c12cdb12258c2ed411e9a79406c.png

如果你喜欢今天的分享,请多多点赞分享给身边的朋友~

☁️趁现在,开启云端之旅!➡️【一键注册 AWS 海外账户,体验免费套餐】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值