使用.NET Hardware Intrinsics API加速机器学习场景

ML.NET 0.6版本刚刚发布不久,我们知道ML.NET代码已经依赖于使用本机代码库的性能矢量化。这是一个重新实现托管代码中现有代码库的机会,使用.NET Hardware Intrinsics进行矢量化,并比较结果。

什么是矢量化,什么是SIMD,SSE和AVX?

矢量化是用于同时将相同操作应用于阵列的多个元素的名称。在x86 / x64平台上,可以通过使用单指令多数据(SIMD)CPU指令在类似阵列的对象上操作来实现矢量化。

SSE(Streaming SIMD Extensions)和AVX(Advanced Vector Extensions)是x86架构的SIMD指令集扩展的名称。SSE已经存在很长时间了:CoreCLR底层.NET Core要求x86平台至少支持SSE2指令集。AVX是SSE的扩展,现在可以广泛使用。它的关键优势在于它可以在一条指令中处理内存中8个连续的32位元素,是SSE的两倍。

.NET Core 3.0将SIMD指令公开为可直接用于托管代码的API,从而无需使用本机代码来访问它们。

基于ARM的CPU确实提供了类似的内在函数,但.NET Core尚不支持它们(尽管工作正在进行中)。因此,当AVX和SSE都不可用时,必须使用软件回退代码路径。JIT使得以非常有效的方式执行此回退成为可能。当.NET Core确实公开ARM内在函数时,代码可以利用它们,此时软件回退很少需要。

项目目标

  1. 通过使用软件回退创建单个托管程序集,增加ML.NET平台范围(x86,x64,ARM32,ARM64等)
  2. 通过在可用的情况下使用AVX指令来提高ML.NET性能
  3. 验证.NET硬件内在函数API 并演示性能与本机代码相当

原本可以通过简单地更新本机代码来使用AVX指令来实现第二个目标,但是同时转移到托管代码我可以消除为每个目标架构构建和发布单独二进制文件的需要 - 它通常也更容易维护托管代码。

挑战

首先要熟悉C#和.NET,然后我的工作包括:

  • 用于C#中CPU数学运算的基层实现。如果你不熟悉,请参阅这篇伟大的MSDN杂志文章C# - All About Span:探索新的.NET Mainstay以及文档。 
  • 根据可用性,启用AVX,SSE和软件实现之间的切换。
  • 正确处理托管代码中的指针,并删除某些现有代码所做的对齐假设
  • 使用multitargeting允许ML.NET继续在没有.NET Hardware Intrinsics API的平台上运行。

多目标

.NET Hardware Intrinsics将在.NET Core 3.0中提供,目前正在开发中。ML.NET还需要在.NET Standard 2.0兼容平台上运行 - 例如.NET Framework 4.7.2和.NET Core 2.1。为了支持这两者,我选择使用多目标创建一个同时针对.NET Standard 2.0和.NET Core 3.0的.csproj 文件。

  1. .NET Standard 2.0上,系统将使用具有SSE硬件内在函数的原始本机实现
  2. .NET Core 3.0上,系统将使用带有AVX硬件内在函数的新托管实现。

代码之初

在原始代码中,机器学习中使用的每个培训师,学习者和转换最终都称为包装器方法,对输入数组执行CPU数学运算,例如 SseUtils

  • MatMulDense,它将两个密集数组的矩阵乘法解释为矩阵,和
  • SdcaL1UpdateSparse,执行稀疏数组的随机双坐标上升的更新步骤。

这些包装器方法假定优先选择SSE指令,并在另一个类中调用相应的方法,该方法用作托管代码和本机代码之间的接口,并包含直接调用其本机等效项的方法。文件中的这些本机方法依次使用包含SSE硬件内在函数的循环实现CPU数学运算。

打破托管代码路径

对于这段代码,我为在.NET Core 3.0上变为活动的CPU数学运算添加了一个新的独立代码路径,并保持原始代码路径在.NET Standard 2.0上运行。以前所有方法的调用站点现在都称为相同名称的方法,保持CPU数学运算的API签名相同。 SseUtils CpuMathUtils

CpuMathUtils 是一个新的分部类,它包含表示CPU数学运算的每个公共API的两个定义,其中一个仅在.NET Standard 2.0上编译,而另一个仅在.NET Core 3.0上编译。此条件编译功能为方法创建两个独立的代码路径。在.NET Standard 2.0上编译的那些函数定义直接调用它们的对应物,它们基本上遵循原始的本机代码路径。 

用software fallback编写代码

另一方面,在.NET Core 3.0上编译的其他函数定义根据运行时的可用性切换到同一CPU数学运算的三个实现之一:

  1. 一个用包含AVX硬件内在函数的循环实现操作的方法, AvxIntrinsics
  2. 一个用包含SSE硬件内在函数的循环实现操作的方法 SseIntrinsics
  3. 软件后备,以防AVX和SSE都不受支持。

每当代码使用.NET硬件内在函数时,您通常会看到此模式 - 例如,这是向向量添加标量的代码:

如果支持AVX,则首选,否则使用SSE(如果可用),否则使用软件回退路径。在运行时,JIT实际上只为这三个块中的一个生成代码,适用于它自己发现的平台。

为了给你一个想法,这里的AVX实现看起来像上面的方法调用:

您将注意到它使用AVX以8为一组进行操作,然后使用SSE对任何4组进行操作,最后为任何剩余的进行软件循环。

由于托管代码中的和方法直接实现类似于最初在文件中的本机方法的CPU数学运算,因此代码更改不仅消除了本机依赖性,还简化了公共API和基础层硬件内在函数之间的抽象级别。

在进行此替换后,我能够使用ML.NET执行任务,例如具有随机双坐标上升的列车模型,进行超参数调整,以及在Raspberry Pi上执行交叉验证,此时ML.NET需要x86 CPU。

这就是现在架构的样子(图1):

性能改进

那么这对性能有何不同?

我使用Benchmark.NET编写测试来收集测量数据。

首先,我禁用了AVX代码路径,以便在使用相同的SSE指令时公平地比较本机和托管实现。如图2所示,性能具有可比性:在测试运行的大型向量上,托管代码添加的开销并不显着。

图2

其次,我启用了AVX支持。图3显示微基准测试的平均性能增益比单独的SSE高约20%

图3

将两者结合起来 - 从本机代码中的SSE实现升级到托管代码中的AVX实现 - 我测量了微基准测试的18%的改进。有些操作的速度提高了42%,而其他一些涉及稀疏输入的操作则有进一步优化的潜力。

最重要的当然是真实场景的表现。在.NET Core 3.0上,K-means聚类和逻辑回归的训练模型加快了约14%(图4)。

图4

我希望这已经证明了.NET硬件内在函数的强大功能,并且我鼓励您在.NET Core 3.0预览可用时考虑在自己的项目中使用它们的机会。

原文地址:https://www.cnblogs.com/BeanHsiang/p/9782905.html

时间: 2024-11-13 10:16:01

使用.NET Hardware Intrinsics API加速机器学习场景的相关文章

WEB API系列(一):WEB API的适用场景、第一个实例

在我前一篇博客中已经给各位简单介绍了HTTP协议与RestFul API的关系,以及一些基本的HTTP协议知识,在这些知识的铺垫下,今天,我们一起来讨论一下WEB API的适用场景,然后写我们第一个WEB API接口,并演示如何对其进行简单调用. 很多人都很迷惑,既然有了WCF为什么还要有WEB API?WEB API会不会取代WCF? 就我的看法,WCF提供的是一种RPC实现的集合,WCF的设计更多地考虑了SOA的场景,以及各种RPC的问题.很多人也会说,RestFul API也是一种RPC啊

WCF与Web API 区别(应用场景)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回复格式支持 JSON,XML,并且可以扩展添

【转】WCF与Web API 区别(应用场景)

Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回复格式支持 JSON,XML,并且可以扩展添加其他格式. .请求的回复通过Http Status Code表达不同含义,并且客户端可以通过Accept header来与服务器协商格式,例如你希望服务器返回JSON格式还是XML格式 应用场景: 如果服务需要在http协议上,并且希望利用http协议的

Redis数据类型的常用API以及使用场景

一.通用命令 1.keys  遍历出所有的key 一般不在生产环境使用 2.dbsize key的总数 3.exists key 4.del key  删除指定key-value 5.expire key secods  设置多少秒过期 ttl  还剩多少秒过期 persist 取消过期时间 6.type 返回key的类型 二.单线程 一个次只能执行一个命令 拒绝长慢命令(keys等) 为什么单线程还这么快 1.纯内存(主要) 2.非阻塞IO 3.避免线程切换和竞态消耗 三.数据类型 1.字符串

适合ASP.NET Web API使用的场景

富客户端web应用程序:ASP.NET Web API适合大量使用AJAX调用的富客户端应用程序,如Silverlight应用程序,基于Adobe Flash的应用程序或单页应用程序(SPA)等. 本地移动和非移动程序:移动设备不支持SOAP,然而ASP.NET Web API可以作为运行在移动设备上的本地程序的后端. 物联网平台(IOT):使用以太网控制器或GSM猫的IOT设备可以通过HTTP和ASP.NET Web API服务会话.不仅仅是IOT设备,其他支持HTTP的设备,例如RFID读写

Unity5 新api:Scenemanager场景切换

using UnityEngine; using System.Collections; //SceneManager.LoadScene方法所在的类必须要添加后才可使用 using UnityEngine.SceneManagement; [AddComponentMenu("MyGame/TitleSceen")] public class TitleSceen : MonoBehaviour { void OnGUI(){ //文字大小 GUI.skin.label.fontSi

浅析阿里云API网关的产品架构和常见应用场景

自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了一个庞大的生态体系,在拥抱API经济的过程当中,API网关这一个组件起到了至关重要的作用. 什么是API网关 API 网关提供完整的 API 托管服务,辅助用户将能力.服务.数据以 API 的形式开放给合作伙伴,也可以发布到 API 市场供更多的开发者采购使用. 1.提供防攻击.防重放.请求加密.身

AWS普及机器学习,云服务之战新烽火连天

人工智能与机器学习云服务市场正在展开一场激烈的争夺战.在2018年9月17日举办的上海世界人工智能大会上,宣布了由全球525支参赛队伍.历时3个月完成的世界人工智能创新大赛结果:收到的专家推荐和赛道优胜项目合计130余个,包含了微软.百度.亚马逊.腾讯.讯飞.小米.工行等多家企业以及国内外学术科研机构较具影响力的项目,最终只有四家获得了最高的SAIL大奖:亚马逊AWS.工行.依图科技和一种神经网络算法. 其中,"亚马逊AWS云上AI创新"获得了SAIL卓越奖,该奖项奖励在人工智能领域中

Google声明机器学习在自己定制的芯片比方普通的GPU和CPU快15到30倍

GOOGLE开发自己的加速机器学习的芯片已经不是什么秘密了,最先发布出来的是TPU(Tensor Processing Units),在2016年5月I/O开发大会上发布的.可是没有发布相关的细节情况.仅仅是说T ensorFlow框架在上面执行机器学习算法能够优化执行. 今天.GOOGLE第一次把这些项目的细节和评判标准发布出来. 论文下载地址: http://download.csdn.net/detail/caimouse/9804927 watermark/2/text/aHR0cDov