0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ECS实例——Arm芯片的 Python-AI算力优化

Linux阅码场 来源:Linux阅码场 2023-05-09 11:37 次阅读

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

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

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

0d2ebbfe-ee0e-11ed-90ce-dac502259ad0.png

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

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

0d39c760-ee0e-11ed-90ce-dac502259ad0.png

我们进一步来看如何对图像应用卷积核:1、使用 im2col 根据卷积核尺寸,将图像转化为若干块(patch)。2、将多个卷积核展开成若干向量。

3、对由图像块组成的矩阵和由多个卷积核展开组成的矩阵应用矩阵乘法。

0d42ef70-ee0e-11ed-90ce-dac502259ad0.png

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

  • 深度学习的卷积计算量很大,典型计算需要涉及 5000 万次乘法和加法操作,因此对计算的优化十分重要。

  • 计算机科学家们已经深入探索了矩阵乘法操作,矩阵乘法操作可以被优化得非常快。

fortran 世界中,GEMM(general matrix multiplication)已经成为一个通用操作:0d50b1f0-ee0e-11ed-90ce-dac502259ad0.png该操作通过对数据重新排列,精心设计计算过程,利用多线程和向量指令,可以比自己实现的朴素版本快十倍以上。因此使用矩阵运算带来的收益相比额外的开销是值得的。

因为 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 数据类型。

0d5bf11e-ee0e-11ed-90ce-dac502259ad0.png

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

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

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

0d67f608-ee0e-11ed-90ce-dac502259ad0.png

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

  • 输入 A大小为 2*4 的 BF16 矩阵,按行存储。

  • 输入 B大小为 4*2 的 BF16 矩阵,按列存储。

  • 输出C:大小为 2*2 的 FP32 矩阵。

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

0d732366-ee0e-11ed-90ce-dac502259ad0.png

阿里巴巴向 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 扩展带来的性能收益。

0d7e6c94-ee0e-11ed-90ce-dac502259ad0.png

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

0d9a0f80-ee0e-11ed-90ce-dac502259ad0.png

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

  • g7:Intel IceLake 实例。

  • g8m:倚天 Arm 服务器。

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

0dad2534-ee0e-11ed-90ce-dac502259ad0.png

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

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

因此我们提供了 Docker 镜像,帮助云上的用户充分使用倚天 710 处理器的 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 场景的普及。

0dc5777e-ee0e-11ed-90ce-dac502259ad0.png

Python 应用启动的主要耗时在模块导入,Python 模块导入步骤为:1、寻找到模块所在的文件。2、获得代码对象 code_object

3、执行代码对象。

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

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

0dd9ff6e-ee0e-11ed-90ce-dac502259ad0.png

在这里我们借助了 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

0df7c36e-ee0e-11ed-90ce-dac502259ad0.png

我们测试了 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


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9059

    浏览量

    366930
  • 神经网络
    +关注

    关注

    42

    文章

    4765

    浏览量

    100584
  • 算力
    +关注

    关注

    1

    文章

    937

    浏览量

    14752

原文标题:技术解读倚天 ECS 实例——Arm 芯片的 Python-AI 算力优化 | 龙蜥技术

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一体大AI芯片将逐渐走向落地应用

    电子发烧友网报道(文/李弯弯)前不久,后摩智能宣布,其自主研发的业内首款存一体大AI芯片成功点亮,并成功跑通智能驾驶算法模型。   这
    的头像 发表于 05-31 00:03 4944次阅读

    【AD新闻】AI时代,一美元能够买到多强的

    何突破AI芯片与功耗的限制进行更加深入的对谈。表明这是两种很难调和的矛盾。深鉴科技研发团队为此进行了深入分析,试图解开困扰当前AI运算
    发表于 03-23 15:27

    ECS控制台实例搜索的优化与改进

    繁琐。 过滤条件太多了, 搜索框,tag,表格过滤,高级搜索,搜索条件不统一 不支持模糊搜索 从已知的这些问题出发,ECS控制台将对搜索功能,以及整个实例管理的用户体验部分做长期的优化和改进。搜索功能
    发表于 03-26 15:04

    【免费直播】让AI芯片拥有最强大脑—AI芯片的操作系统设计介绍.

    智慧化进程。人工智能芯片是人工智能发展的基石,是数据、算法和在各类场景应用落地的基础依托。“无芯片AI”已经深入人心,成为业界共识。本
    发表于 11-07 14:18

    解读最佳实践:倚天 710 ARM 芯片Python+AI 优化

    编者按: 在刚刚结束的 PyCon China 2022 大会上,龙蜥社区开发者朱宏林分享了主题为《ARM 芯片Python+AI
    发表于 12-23 16:02

    IBM全新AI芯片设计登上Nature,解决GPU的瓶颈

    现如今的人工智能的神经网络与GPU密不可分,但是GPU的对于未来神经网络的发展是不够用的,好在IBM全新AI芯片设计,能够解决GPU的
    发表于 06-13 09:28 1404次阅读

    深度解析AI的现状和趋势

    分享会从 AI 的现状和趋势谈起,并从硬件设计和算法优化两个层面切入,剖析提升的最新落地
    的头像 发表于 08-01 16:08 8766次阅读

    华为发布最外那个AI芯片

    华为史上最强AI芯片发布,开源首款国产全场景AI计算框架
    的头像 发表于 08-23 17:15 3196次阅读

    昆仑芯AI芯片AI服务实体经济 筑底经济新基建

    当前,已经成为继热力、电力之后新的关键生产。数字化转型背景下,工业、能源、交通等领域对AI
    的头像 发表于 10-19 16:31 1838次阅读

    云端芯片为什么是科技石油?

    21世纪前后,人类逐渐从工业时代步入信息时代,当下AI时代的大门又再度缓缓开启。2023年以来,以ChatGPT为首的生成式AI逐渐渗透到了各行各业中,有人说,这或许又是一个IPhone时刻。AI起舞,
    的头像 发表于 07-12 10:21 816次阅读

    ai芯片芯片的区别

    ai芯片芯片的区别 随着人工智能和机器学习应用的不断发展,因此种种对硬件的需求也在不断提高。在这样的趋势之下,出现了很多新的
    的头像 发表于 08-09 14:24 5466次阅读

    阿里云倚天实例已为数千家企业提供,性价比提升超30%

    规模化部署,并向云上企业提供。过去一年,阿里云继续在芯片、编译器、操作系统、虚拟化及应用层等方面完成了数十项软硬一体的全栈优化,进一步将芯片
    的头像 发表于 11-03 11:25 810次阅读
    阿里云倚天<b class='flag-5'>实例</b>已为数千家企业提供<b class='flag-5'>算</b><b class='flag-5'>力</b>,性价比提升超30%

    浅谈为AI而生的存-体芯片

    大模型爆火之后,存一体获得了更多的关注与机会,其原因之一是因为存一体芯片的裸相比传统架构的AI
    发表于 12-06 15:00 370次阅读
    浅谈为<b class='flag-5'>AI</b>大<b class='flag-5'>算</b><b class='flag-5'>力</b>而生的存<b class='flag-5'>算</b>-体<b class='flag-5'>芯片</b>

    PythonAI中的应用实例

    Python在人工智能(AI)领域的应用极为广泛且深入,从基础的数据处理、模型训练到高级的应用部署,Python都扮演着至关重要的角色。以下将详细探讨Python
    的头像 发表于 07-19 17:16 949次阅读

    企业AI租赁是什么

    企业AI租赁是指企业通过互联网向专业的提供商租用所需的计算资源,以满足其AI应用的需求。
    的头像 发表于 11-14 09:30 185次阅读