技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

news2024/10/7 6:47:09

深度学习技术在图像识别、搜索推荐等领域得到了广泛应用。近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向,通过《Arm 芯片 Python-AI 算力优化》我们将看到龙蜥社区 Arm 架构 SIG(Special Interest Group) 利用最新的 Arm 指令集优化 Python-AI 推理 workload 的性能。

倚天ECS实例的AI推理软件优化

阿里云推出的倚天Arm ECS实例,拥有针对AI场景的推理加速能力,我们将了解加速的原理以及以及相关的软件生态适配。

卷积神经网络(CNN)在图像和语音领域使用广泛,神经网络算法相比传统的算法消耗了更多算力。为了探索对计算的优化,我们进一步看到AlexNet模型(一种CNN)的推理过程的各个层的计算资源消耗占比。

可以看到名为conv[1-5]的5个卷积层消耗了90%的计算资源,因此优化CNN推理的关键就是优化卷积层的计算。

我们进一步来看如何对图像应用卷积核:

  1. 使用im2col根据卷积核尺寸,将图像转化为若干块(patch)
  2. 将多个卷积核展开成若干向量
  3. 对由图像块组成的矩阵和由多个卷积核展开组成的矩阵应用矩阵乘法

上面一页的计算应用了矩阵乘法操作,为什么我们不采用更加直接的迭代计算方式,而是采用需要额外内存的矩阵乘法呢?这里有两个关键因素:

  • 深度学习的卷积计算量很大,典型计算需要涉及5000万次乘法和加法操作,因此对计算的优化十分重要
  • 计算机科学家们已经深入探索了矩阵乘法操作,矩阵乘法操作可以被优化得非常快。

fortran世界中,GEMM(general matrix multiplication)已经成为一个通用操作:

该操作通过对数据重新排列,精心设计计算过程,利用多线程和向量指令,可以比自己实现的朴素版本快十倍以上。因此使用矩阵运算带来的收益相比额外的开销是值得的。

因为AI推理大量使用了矩阵乘法,如今也有许多硬件对矩阵运算进行了加速:

  • NVIDIA Volta架构引入了tensor core,可以高效地以混合精度处理矩阵乘
  • Intel AMX(Advanced Matrix Extensions) 通过脉动阵列在硬件层面支持矩阵乘
  • ARM SME(Scalable Matrix Extension) 支持向量外积运算,加速矩阵乘

虽然在AI算力上GPU要远高于CPU,但是CPU因为其部署方便,且无需在主机-设备间拷贝内存,在AI推理场景占有一席之地。目前市面上尚没有可以大规模使用的支持AMX或者SME的硬件,在这个阶段我们应该如何优化CPU上的AI推理算力呢?我们首先要了解BF16数据类型。

BF16(Brain Float 16)是由Google Brain 开发设计的16位浮点数格式。相比传统的IEEE16位浮点数,BF16拥有和IEEE单精度浮点数(FP32)一样的取值范围,但是精度较差。研究人员发现,在AI训练和推理中,使用BF16可以节约一半的内存,获得和单精度浮点数接近的准确率。

根据右图,BF16指数的位数和FP32是一致的,因此BF16和FP32的相互转换只要截断尾数即可,左下角图上便是tensorflow源码中的转换实现。

引入BF16的一大价值是如今的很多硬件计算的瓶颈在寄存器宽度或者访问内存的速度上,更紧凑的内存表示往往可以获得更高的计算吞吐,在理想情况下,BF16相比FP32可以提高一倍的吞吐(FLOPS)。

如今我们虽然无法大规模使用到支持AMX/SME的硬件,但是Armv8.6-A提供了bf16扩展,该扩展利用了有限的128bit向量寄存器,通过BFMMLA指令执行矩阵乘法运算:

  • 输入A: 大小为2*4的BF16矩阵,按行存储
  • 输入B: 大小为4*2的BF16矩阵,按列存储
  • 输出C: 大小为2*2的FP32矩阵

该指令单次执行进行了16次浮点数乘法和16次浮点数加法运算,计算吞吐非常高。

阿里巴巴向OpenBLAS项目贡献了sbgemm(s表示返回单精度,b表示输入bf16)的硬件加速实现,从GEMM吞吐上看,BF16相比FP32 GEMM吞吐提升超过100%。

倚天ECS实例是市面上少数可以支持bf16指令扩展的ARM服务器。目前已经支持了Tensorflow和Pytorch两种框架的AI推理

  • Tensorflow下可以通过OneDNN + ACL(Arm Compute Library)来使用BFMMLA加速
  • Pytorch已经支持了OneDNN + ACL,但是目前还在试验状态,无法很好地发挥性能。但是Pytorch同时支持OpenBLAS作为其计算后端,因此可以通过OpenBLAS来享受ARM bf16扩展带来的性能收益

可以看到相比默认的eigen实现,开启OneDNN + ACL后,perf获得的计算热点已经从fmla(向量乘加)转换到了bfmmla,算力显著提升。

从workload角度评测,上图对比了两种机型:

  • g7:Intel IceLake实例
  • g8m:倚天ARM服务器

左边柱状图中蓝色柱子表示算力对比,橙色柱子表示考虑性价比后使用倚天处理器获得的收益。可以看到在Resnet50BERT-Large模型的推理场景下,软件优化后的倚天处理器皆可获得一倍左右的性价比收益。

在上文中,我们看到使用倚天处理器若想获得较高收益,软件版本的选择十分重要。随意选择tensorflow或者pytorch包可能遭遇:

  • 未适配arm架构,安装失败
  • 软件未适配bf16扩展或者环境参数有误,无法发挥硬件的全部算力,性能打折
  • 需要精心选择计算后端,例如目前pytorch下OpenBLAS较快

因此我们提供了Docker镜像,帮助云上的用户充分使用倚天ECS实例的AI推理性能:

  • accc-registry.cn-hangzhou.cr.aliyuncs.com/tensorflow/tensorflow
  • accc-registry.cn-hangzhou.cr.aliyuncs.com/pytorch/pytorch

通过Serverless能力充分释放算力

除了使能更多的硬件指令,另一种充分释放硬件算力的方式就是通过Serverless架构提高CPU利用率。Python作为动态语言,其模块是动态导入的,因此启动速度不是Python的强项,这也制约了Python workload在Serverless场景的普及。

Python应用启动的主要耗时在模块导入,Python模块导入步骤为:

  1. 寻找到模块所在的文件
  2. 获得代码对象code_object
  3. 执行代码对象

其中的第二步在首次加载模块时,要对.py文件进行编译,获得code_object, 为了降低将来加载的开销,Python解释器会序列化并缓存code_object.pyc文件。

即便模块导入过程已经通过缓存机制优化过了,但是读取.pyc文件并反序列化依旧比较耗时。

在这里我们借助了OpenJDK的AppCDS的思路:将heap上的code_object复制到内存映射文件中(mmap)。在下次加载模块时,直接使用mmap中的code_object

这种框架下有两个难点:

  1. Python的code_object是散落在heap的各处且不连续的,因此mmap复制整个heap是行不通的。我们采用的方式是以code_object为根,遍历对象图,对感兴趣的内容复制并紧凑排布
  2. Python的code_object会引用.data段的变量,在Linux的随机地址安全机制下,.data段的数据的地址在每次运行时都会随机变化,这样mmap中的指针就失效了。我们的解决方式是遍历所有对象,针对.data段的指针进行偏移量修复

因为该项目共享了python的code_object,因此名字是code-data-share-for-python,简称pycds

我们测试了bota3numpyflask等常用的python苦,平均可以节省20%的模块导入耗时

对于现有的python应用可以轻易地使用pycds,且无需修改任何代码:

# 安装pycds
pip install code-data-share # 安装pycds
 # 生成模块列表
PYCDSMODE=TRACE PYCDSLIST=mod.lst python -c 'import numpy’
# 生成 archive
python -c 'import cds.dump; cds.dump.run_dump("mod.lst", "mod.img")’
# 使用archive
time PYCDSMODE=SHARE PYCDSARCHIVE=mod.img python -c 'import numpy'
real 0m0.090s
user 0m0.180s
sys 0m0.339s
# 对比基线
time python -c 'import numpy'
real 0m0.105s
user 0m0.216s
sys 0m0.476s

我们仅仅通过安装PyPI,修改环境变量运行和使用cdsAPI做dump即可对现有的应用启动进行加速了。

code-data-share-for-python是一个新项目,需要大家的参与和反馈,欢迎通过以下链接了解和使用:

  • https://github.com/alibaba/code-data-share-for-python
  • https://pypi.org/project/code-data-share-for-python

ARM 架构 SIG链接地址:https://openanolis.cn/sig/ARM_ARCH_SIG

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分析实时云渲染在小程序中可行性应用

点量云小芹和大家分享过很多实时云渲染的优势,比如在网页直接打开,本地无需任何算力支持,所有指令的执行均是在云端服务器上完成的。但在实际中小芹发现很多业主也想在小程序给用户更好的体验,尤其是一些To C的场景下,…

【新知实验室 认识TRTC+四步跑通音视频demo】

1【产品功能介绍】 1.1 什么是TRTC? 实时音视频(Tencent RTC )是腾讯基于21年来在网络与音频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开…

LabVIEW创建类 2

LabVIEW创建类 2 定义私有数据控件 创建LabVIEW类时,LabVIEW将自动创建类的私有数据控件。请注意在下列项目浏览器窗口中,LabVIEW类的图标是一个有色立方体。该立方体用于代表一个LabVIEW类。私有数据控件的图标是一个带有绿色圆柱体的有色立方体。圆柱…

SpringCloud 从入门到入土

springcloud包含的模块: 1、服务注册与发现 2、服务调用 3、服务熔断 4、负载均衡 5、服务降级 6、服务消息队列 7、配置中心管理 8、服务网关 9、服务监控 10、全链路追踪 11、自动化构建部署 12、服务定时任务调度操作 版本控制留样 重点技术选型&am…

ConstraintLayout布局扩展

相信大家对ConstraintLayout(约束布局)不陌生,这是google推出的一个强大控件,之所以强大其实主要归纳有两点:减少布局层次,能够轻松实现复杂布局。当然在我们实际使用过程中,是否真的减少了布局层次&#x…

一种亮红色染料AF 594 NHS Ester|295348-87-7|AF 594 Succinimidyl Ester

基础产品数据(Basic Product Data): CAS号:295348-87-7 中文名:AF 594活性酯 英文名:AF 594 Succinimidyl Ester,Alexa Fluor 594 NHS Ester,AF 594 NHS Ester 光谱图(Sp…

低代码助力生产管理:ERP生产管理系统

随着国内生产技术的迅速发展,企业信息化实现了生产经营活动的运营自动化、管理网络化和决策智能化。其中运营自动化是基础,决策智能化是顶峰。将信息化应用于生产管理有助于提高产品的质量和生产效率,加强对原材料、生产工序、员工、设备和产…

第三十九篇 自定义指令 - directive

前面讲了关于在Vue中如何来进行封装swiper组件的内容,本篇内容讲到使自定义组件,讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容,那么什么是自定义指令,在前面的内容讲过了好些常用的指令,如 v-modl…

记录--两行CSS让页面提升了近7倍渲染性能!

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢,你…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep?Pwn!!! 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛!的原题 1.丢三落四的学姐 访问题目位置,很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…

Redis与数据库的爱恨纠葛

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 早期数据库只要有数据库的操作---增--删--改--查 当用户量特别多的情况下,数据库的数量一定是跟不上用户的数量,对数据库来说是特别繁忙的 看着每天都累趴下…

String_JavaScript

String_JavaScript 学习路线:JavaScript基础语法(输出语句)->JavaScript基础语法(变量)->JavaScript基础语法(数据类型)->JavaScript基础语法(运算符)->Jav…

海外推广运营的技巧汇总

海外电商运营推广?做海外电商,重点在于运营推广。如果运营推广能做好,那么在行业内分一杯羹并不难。但问题是,在运营推广上,很难做海外电商。 这年头,相信大家都知道海外电商出问题了。很多人的账号都被亚…

动态链接库dll详解

动态链接库概述 DLL就是整个Windows操作系统的基础。动态链接库不能直接运行,也不能接收消息他们是一些独立的文件。 Windows API中的所有函数都包含在DLL中。 其中有三个最重要的DLL kernel32.dll,它包含用于管理内存、线程和进程的各个函数&#xff1b…

[附源码]SSM计算机毕业设计学生实习管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

超详细的商业智能BI知识分享,值得收藏

在数据为王的时代,获取数据和处理数据,成为企业必备的生存手段。哪个企业能在数据信息中汲取到更多的有效价值,就能抢占先机,获得市场的主动权。数据分析将不再是专业技术人员或数据分析师的专利,商业智能 BI 可以帮助…

华为机试 - 最大股票收益

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 假设知道某段连续时间内股票价格,计算通过买入卖出可获得的最大收益。 输入一个大小为 n 的数 price(p1,p2,p3,p4…….pn),pi 是第i天的股票价格。 pi 的格式为股票价格(非负整型)加上货…

基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操

在数据建模流程中,都会涉及一个样本特征的相关性的分析,这个是建模流程中重要一环。通过量化特征字段之间的相关程度,可以将其作为一个重要信息维度,便于我们对模型训练的特征变量池进行有效筛选,不仅有简化模型且保证…

NLTK下载使用问题

一开始想要执行如下语句,结果运行不了 from textblob import TextBlob text Today is a beautiful day. Tomorrow looks like bad weather. blob TextBlob(text) print(blob) print(-*10) print(blob.sentences)原因是没有下载NLTK的语料库,调用如下语…

【创建VUE3新项目】从零开始如何创建一个干净的vue3项目【基于前端详细介绍】

【写在前面】基于安装完node和npm基础上来实现的,没安装的可以看我之前的文章,如何验证呢?npm -v / node -v 两个命令行解决! 一、创建文件(脚手架安装) 此处值得注意的是不能包括大写字母,不…