使用nGraph的IntelXeon上的高性能TensorFlow

High-performance TensorFlow* on Intel Xeon Using nGraph

最近宣布了nGraph的开源版本一个C++库、编译器和运行时套件,用于在各种设备上运行深度神经网络。基于Tensraph的优化项目,能公布优化后的项目或反向代码。与我们最初的TensorFlow集成相比,桥接代码实现提供了高达10倍的性能。

设置很简单(我们在bridge代码库中提供了说明):像平常一样构建TensorFlow并选择nGraph作为TensorFlow设备,然后在现有的基于TensorFlow的DL模型中修改几行Python代码以针对nGraph。目前,nGraph支持Intel x86处理器上的工作负载,并将支持IntelNervana 神经网络处理器(IntelNervana NNPs)可用时。未来对NVIDIA GPU的支持也在进行中。

英特尔至强处理器上的nGraph性能

新的nGraph TensorFlow桥比上个月开源的初始版本提供了显著的改进。如图1所示,与XLACPU编译器相比,使用nGraph可以显著提高训练性能。虽然需要注意的是,XLA CPU的实现仍然是实验性的,并且有很大的改进空间,但是我们的测量结果表明,nGraph与TensorFlow的IA优化的最新技术相比也非常好。图2比较了MKL DNN优化的TensorFlow实现,它直接在TensorFlow的本地计算引擎中实现MKL-DNN优化,与nGraph TensorFlow桥代码实现进行了比较。在使用ImageNet数据集的ResNet50等模型上,结合nGraph可以获得更好的训练性能(nGraph上为68.9个图像/秒,而TF-MKL-DNN上为64个图像/秒,提高了约7个百分点1)。结果还表明CIFAR10 ResNet模型的性能有了显著的改进。然而,我们注意到,这个差距是由一个已知的问题造成的,这个问题与基线TF-MKL-DNN实现中MKL-DNN原语初始化的开销有关。该问题的解决方案正在向上游的TensorFlow进行。综上所述,这些结果表明nGraph-TensorFlow集成所产生的开销很小,并且可以实现TensorFlow最先进的IA性能。

Figure 1: Training speed using TensorFlow-XLA (2S Intel(R) Xeon(R) Platinum 8180 CPU) yields 68.9 img/sec at peak performance on ResNet50-I1k with nGraph and 6.5 img/sec without.

Figure 2: Training speed of ResNet50-I1k using TensorFlow-XLA-nGraph (2S Intel(R) Xeon(R) Platinum 8180 CPU) yields 68.9 img/sec at peak performance with nGraph compared to 64 img/sec using MKL-DNN-optimized TensorFlow

How we did it

Performance optimizations in the nGraph CPU backend

nGraph CPU后端(有时称为“IA transformer”)实现了许多优化,在英特尔CPU平台上为给定型号提供了最优化的性能:

与框架无关的优化:

我们利用优化的内核库,如MKL-DNN和Eigen来实现快速DNN内核。此外,我们还加入了图优化过程,这些过程为这些内核实现选择了最佳的数据布局,并减少了图形级别的总体数据布局转换。我们还融合了BatchNorm和ReLu等操作,以更好地利用具有较低内存需求的融合内核实现。

TF/XLA特定的优化:

TensorFlow有一些API级别的缺陷,导致在模型中添加额外的Pad操作。这些操作可能导致不必要的数据布局转换,并且可以通过MKL-DNN提供的填充卷积核来避免。我们利用这一点将这些pad操作融合到现有的卷积算子中,相对于基本的TensorFlow模型,它提供了更好的性能提升。此外,XLA还添加了一些标识操作符,比如从Float32到Float32的类型转换,这些操作符可以从图中删除而不影响正确性。

基于模式匹配的图操作融合

nGraph-IR包含许多常见深度学习原语的内置原语,包括卷积、填充和批处理规范化。之所以选择这些原语,是因为它们可以相对容易地映射到后端库(如“英特尔MKL-DNN”)提供的高度优化的计算内核上。

TensorFlow的tf2xla转换器将一些高级TensorFlow操作分解为根据低级张量操作定义的图。一个经常发生的情况是TensorFlow的平均池操作。如果填充输入张量,则由tf2xla将操作重写为包含以下内容的子图:

a reduce-window operation to sum sliding windows of the graph;

a second reduce-window operation to compute the divisors to apply to each summed window; and

an element-wise division operation.

对图的滑动窗口求和的减窗运算;

第二个reduce window操作,用于计算要应用于每个求和窗口的除数;以及

元素除法运算。

虽然这些操作中的每一个都直接在nGraph中得到支持,但它们的性能将不及nGraph的AvgPool原语,后者直接映射到MKL-DNN提供的优化实现。对于最大池、卷积反向传播和其他一些重要的原语,也会出现类似的情况。

为了解决这个问题,我们在TensorFlow到nGraph桥内部实现了一个HLO融合过程。这个融合过程,如下面的图3所示,补充了nGraph CPU后端本身实现的许多与框架无关的优化。当HLO融合被纳入时,从HLO到nGraph的转换分三步进行。首先,搜索由tf2xla生成的原始图形(图3a),以查找与高级操作对应的模式(在图3b中由橙色节点表示)。第二,每个识别出要融合的子图被包装在一个HLO融合指令中(图3c)。最后,将融合后的HLO图转换为nGraph图(图3d),并将融合指令映射到高级nGraph操作。

Figure 3: Illustration of nGraph graph generation.

fusion pass目前识别卷积反向传播、平均和最大池的正向和反向传播、ReLU的正向和反向传播以及sum、product和max等缩减操作(请注意,其他一些高级操作,包括批处理规范化,在HLO中已被视为原始操作,因此,没有必要将它们熔合。)

它是如何工作的?

TensorFlow的XLA框架为“后端”设备提供了一种机制,用于注册接收以HLO格式表示的计算图,并提供一个能够在运行时执行计算的可执行对象。我们开发了一个XLA插件,它注册为“NGRAPH”设备,遵从并执行HLO计算。

一个动态加载的插件框架

目前,XLA插件设备源代码需要驻留在TensorFlow树中,并且必须与TensorFlow源代码树的其余部分一起构建。添加一个新设备需要理解TensorFlow代码和构建系统,这两者都相当复杂。此外,上游和维护新代码是困难的,有时是不可取的,因为插件实现中的每一个更改都需要经过TensorFlow团队的审核,即使它可能与TensorFlow无关。

我们开发的动态可加载的XLA插件,其中实际的XLA插件源代码位于TensorFlow源代码树之外,它内置于一个动态共享对象(DSO)库中,具有许多nGraph固有的优化。在XLA方面,我们创建了一个插件适配器,该适配器加载插件DSO并使用插件DSO提供的属性注册XLA设备。

Graph compilation and execution

From TensorFlow* computation graph to nGraph

TensorFlow*使用XLA创建HLO计算图。HLO的中间表示(IR)随后被移交给nGraph插件DSO。nGraph桥的源代码位于一个名为nGraph tensorflow bridge的单独GitHub存储库中。

当工作负载部署到目标nGraph设备时,nGraph tensorflow bridge可以将HLO-IR转换为nGraph-IR,然后对其进行编译以生成特定设备的可执行代码。然后,该可执行文件返回到TensorFlow,以便后续执行计算。

Figure 4: Transformation of TensorFlow graph to nGraph IR.

Configuration  details

Hardware configuration: 2S Intel(R) Xeon(R) Platinum 8180 CPU @ 2.50GHz (28 cores), HT enabled, turbo enabled, scaling governor set to “performance” via intel_pstate driver, 384GB (12 * 32GB) DDR4 ECC SDRAM RDIMM @ 2666MHz (Micron* part no. 36ASF4G72PZ-2G6D1),800GB SSD 2.5in SATA 3.0 6Gb/s Intel Downieville SSDSC2BB800G701 DC S3520, client ethernet adapter: Intel PCH Integrated 10 Gigabit Ethernet Controller

Software configuration: Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64). Datasets were hosted on NFS storage.

Software Release Versions:

1.  ngraph-tensorflowCommit- c2cc26b
2. ngraph-tensorflow-bridgeCommit- f9b9e5a
3. ngraphCommit- eec1922

Scripts:https://github.com/NervanaSystems/ngraph-tensorflow-bridge/tree/master/test/resnet

Command lines

Resnet cifar10: KMP_BLOCKTIME=1 OMP_NUM_THREADS=56 KMP_AFFINITY=granularity=fine,compact,1,0 python cifar10_main.py --data_dir /path/to/dataset --model_dir /path/to/saved_model/ --batch_size 128 --resnet_size $RESNET_SIZE --data_format channels_first --inter_op 2 --select_device NGRAPH

# (RESNET_SIZE was tested at 8, 20, 56)

Resnet
Imagenet(I1k): KMP_BLOCKTIME=0 OMP_NUM_THREADS=56
KMP_AFFINITY=granularity=fine,compact,1,0 python imagenet_main.py --data_dir
/path/to/dataset --model_dir /path/to/saved_model/ --batch_size 128
--resnet_size 50 --data_format channels_first --inter_op 2 --select_device
NGRAPH

使用nGraph的Intel®Xeon®上的高性能TensorFlow的更多相关文章

  1. ELK 性能(3) — 在 Docker 上运行高性能容错的 Elasticsearch 集群

    ELK 性能(3) - 在 Docker 上运行高性能容错的 Elasticsearch 集群 介绍 在 Docker 上运行高性能容错的 Elasticsearch 集群 内容 通常熟悉的开发流程是 ...

  2. 事物的隔离级别与并发完美体现了cap理论(确保数据完整、安全、一致性,在此基础上实现高性能访问(鱼和熊掌不可兼得)

    事物的隔离级别与并发完美体现了cap理论(确保数据完整.安全.一致性,在此基础上实现高性能访问(鱼和熊掌不可兼得)

  3. Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关

    什么是Jexus Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,以支持ASP.NET.ASP.NET CORE.PHP为特色,同时具备反向代理.入侵检测等重要功能.可以这样说,J ...

  4. [转帖]Intel新一代Xeon完整曝光

    AMD已经官宣7nm工艺的第二代EPYC霄龙服务器平台,今年上半年就会大规模出货,而在Intel这边,由于10nm工艺进展还是不够快,在服务器上还是需要14nm继续打天下,而且还有两代14nm工艺产品 ...

  5. USB-Blaster CPLD FPGA Intel 驱动安装不上的问题,文件的哈希值不在指定的目录文件中,的解决办法,其实很简单

    intel的官网的驱动安装文档: https://www.intel.com/content/www/us/en/programmable/support/support-resources/down ...

  6. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 1

    ▶ 第三章,逐步优化了一个二维卷积计算的过程 ● 基准代码 #include <stdio.h> #include <stdlib.h> #include <string ...

  7. 在 Ubuntu 上配置高性能的 HHVM 环境

    HHVM全称为 HipHop Virtual Machine,它是一个开源虚拟机,用来运行由 Hack(一种编程语言)和 PHP 开发应用.HHVM 在保证了 PHP 程序员最关注的高灵活性的要求下, ...

  8. Pluto - iOS 上一个高性能的排版渲染引擎

    WeTest 导读 Pluto 是 iOS 上的一个排版渲染引擎,通过 JSON/JS 文件可以很方便地描述界面元素,开发效率很高,并且在流畅度,内存等方便有保证.pluto.oa.com 上有更多详 ...

  9. 史上最全TensorFlow学习资源汇总

    来源 | 悦动智能(公众号ID:aibbtcom) 本篇文章将为大家总结TensorFlow纯干货学习资源,非常适合新手学习,建议大家收藏. ▌一 .TensorFlow教程资源 1)适合初学者的Te ...

随机推荐

  1. 逆向工程第004篇:跨越CM4验证机制的鸿沟(中)

    一.前言 在上一篇文章的最后,我已经找出了关键的CALL语句,那么这篇文章我就带领大家来一步一步地分析这个CALL.我会将我的思路完整地展现给大家,因此分析过程可能略显冗长,我会分为两篇文章进行讨论. ...

  2. hdu 1814 字典序最小的2sat(暴力深搜)

    题意:      题意就是最基础的2sat,关系只有矛盾关系,然后二选一,关键是这个题目是输出字典序最小的那组解. 思路:      输出字典序最小,用强连通那个实现不了(起码没看到有人实现),其实我 ...

  3. Windows核心编程 第十二章 纤程

    第1 2章 纤 程 M i c r o s o f t公司给Wi n d o w s添加了一种纤程,以便能够非常容易地将现有的 U N I X服务器应用程序移植到Wi n d o w s中.U N I ...

  4. (1) arm 指令格式

    arm 指令的基本格式如下: <opcode>{<cond>}{S}{.W\.N} <Rd>,<Rn>{,<operand2>} opcod ...

  5. MetInfo Password Reset Poisoning By Host Header Attack

    if we know some user's email, the we will can reset the user's email by host header attack. The atta ...

  6. WM_PAINT 与 WM_ERASEBKGND消息的深入分析

    当WM_PAINT消息不是由函数InvalidateRect产生的时(即通过最大话,最小化,移动,下拉菜单等),系统会先产生连续产生若干个WM_ERASEBKGND消息,紧接着在产生WM_PAINT消 ...

  7. Spring 中使用了那些设计模式呢?

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

  8. .NET平台系列9 .NET Core 3.0 / .NET Core 3.1 详解

    系列目录     [已更新最新开发文章,点击查看详细] .NET Core 3.0 于 2019年9月23日发布,重点是增加对同时支持使用 Windwos Forms.WPF 和 Entity Frm ...

  9. libminipng,压缩png的swift-framework

    libminipng 通过lodepng解析png图片,使用pngquant算法进行压缩的swift-framework 方法说明: /// 通过PNG图片Data压缩 /// /// - Param ...

  10. [Linux] Shell请求网页

    文件描述符 0:标准输入 1:标准输出 2:报错输出 举例 1 exec 8<> /dev/tcp/www.baidu.com/80 2 echo -e "GET / HTTP/ ...