AI算力碎片化:矩阵乘法的启示

c6f29ac475123cbf458ba029d0dc3250.jpeg

尽管AI的发展取得了巨大进步,但编译器LLVM之父Chris Lattner认为,AI技术应用并不深入,远远没有发挥出已有机器学习研究的所有潜力。而AI系统和工具的单一化和碎片化正是造成这一问题的根源。

为了让AI发挥其真正的潜力,计算碎片化是需要解决的重点问题之一,目标是让AI软件开发人员能够无缝地充分利用现有硬件和下一代创新硬件。但解决这一问题并不容易,硬件、模型和数据的多样性使得当前市场上的现有解决方案都只是单点性质的,Chris Lattner创立的Modular团队从矩阵算法的角度对此进行了深入分析。

(以下内容由OneFlow编译发布,译文转载请联系OneFlow获得授权。https://www.modular.com/blog/ais-compute-fragmentation-what-matrix-multiplication-teaches-us)

作者|Eric Johnson、Abdul Dakkak、Chad Jarvis

OneFlow编译
翻译|徐佳渝、杨婷

 

1

算力碎片化正在阻碍AI的发展

AI由数据、算法(即模型)和算力驱动,三者之间形成了良性循环。其中任意一方的发展会推动其他方面需求的增长,从而严重影响开发者在可用性和性能等方面的体验。如今,我们拥有更多的数据,做了更多的AI模型研究,但算力的扩展速度却没有跟上,这主要是由于物理限制。

如果你一直在关注AI和硬件的发展,可能听说过摩尔定律时代即将结束。过去60年,单核处理器每18个月翻一倍性能提升速度的情况已然改变。除了继续制造越来越小的晶体管的物理限制之外(例如,电流泄漏会导致功耗过高,从而引起发热),性能也越来越多地受到内存延迟的限制,而这种限制的增长速度比处理速度要缓慢得多。

ff815c6355987d5adc50d34384a93b54.png

Hennessy和Patterson的图灵演讲:不同时期CPU处理器性能提升的分析(性能提升的速度保持稳定))

然而,随着模型不断扩大,在边缘计算中创建和处理的企业数据更多,对AI计算的需求也在不断增加。因此,尽可能地利用硬件设备的性能已成为业界的关注焦点。

45d559c7e56b530c2401e1545a34d1a8.png

 (‍机器学习三个时代的算力走向(https://arxiv.org/pdf/2202.05924.pdf),Sevilla:计算需求随时间呈对数方式变化的分析。其中,2010年左右深度学习开始受到关注,2016年左右迎来了大型模型时代,这促使了算力需求急剧增长。)

那么,算力的碎片化是如何阻碍AI发展的呢?由于传统CPU无法扩展以满足更多的算力需求,因此,唯一的解决之道是创建并行的、用于特定领域的硬件平台,尽管这些硬件平台的通用性不强,但在特定的AI领域却表现良好——例如图形处理单元(GPU)、张量处理单元(TPU)和其他专用集成电路(ASIC)。

虽然这些创新推动了AI行业的发展,让边缘设备能够使用规模更大、效率更高的处理器,但硬件的多样性使得整个AI行业变得碎片化,AI开发者们需要努力解决以下问题:

1. 开发出能够充分利用硬件能力的软件,且能与其他软件协同工作。

2. 在任意一款设备上实现并行软件算法。

3. 将软件扩展到多设备的生态系统,甚至扩展到异构系统。

Modular公司致力于从零开始重建全球的AI基础设施。在本系列博客中,我们将探讨如何采用全新的方法解决AI行业的算力碎片化问题。我们会专注于单个运算符——矩阵乘法(matrix multiplication,matmul),这是机器学习算法中的关键计算。

通过这种方式,我们会看到构建真正统一的解决方案所面临的底层挑战。我们将深入研究矩阵乘法的内部运作,探讨其工作原理的一些细节,以了解矩阵乘法为什么如此困难。

2

矩阵乘法为何如此困难

矩阵对机器学习系统来说至关重要,因为它提供了一种简单而高效的方式来表示数据。例如,输入数据(图像中的像素集合)或者模型内部不同层之间的运作机制都可以用矩阵来表示。因此,矩阵相乘的运算在深度学习模型总计算量中占据很大比例。

实际上,在许多当前流行的Transformer模型BERT、CLIP以及ChatGPT中,矩阵乘法的运行时长约占其总运行时长的45-60%。矩阵乘法在计算卷积运算中扮演着重要角色,该运算是大多数计算机视觉模型的基础,也是许多高性能计算应用的核心。

考虑到矩阵乘法在机器学习和计算机视觉等领域的重要性,研究人员对其进行了广泛的算法研究,以编写出高效的矩阵乘法算法。自60年代(https://ieeexplore.ieee.org/abstract/document/1687427)、70年代(https://apps.dtic.mil/sti/pdfs/AD0705509.pdf)、80年代

https://dl.acm.org/doi/10.1145/356012.356020), 90年代(https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.54.9411&rep=rep1&type=pdf)、21世纪初至今(https://netlib.org/lapack/lawnspdf/lawn147.pdf),一直有论文在尝试使用当时的硬件来解决该问题。

24140e0f45cfb639ed5db877e55971c1.png

简单的O(n^3)矩阵乘法算法。

但是概念上的矩阵乘法并不是难点。相反,挑战在于编写一个足够高效的矩阵乘法,以在AI行业的所有硬件、模型和数据多样性上实现SOTA性能。此外,与其他AI算子的协同工作更具挑战性。

硬件

每种用于运行AI模型的设备都有其独特的特征,例如内存层次结构不同、乘法和累加单元(MAC)不同等等。

例如,CPU采用了这种内存层次结构——从慢速的RAM到越来越快的缓存,包括Level-3、Level-2、Level-1和CPU寄存器。内存大小与速度成反比,例如,L1缓存的访问速度通常为1纳秒量级,而RAM的访问速度为100纳秒量级。

要获得最高性能的矩阵运算,必须让算法有效地处理不同的内存级别和大小。因为原始矩阵太大,所以无法将其一次性放入寄存器或最快的内存缓存中。因此,挑战在于将原始矩阵分解为大小合适的block或tiles,以最大限度地利用最快内存。

此外,处理核心矩阵功能(core matrix functionality)单元的实际形状因硬件而异。就传统意义而言,CPU是一种标量(scalar)机器,这意味着它需要逐个处理指令。然而,在过去二十年中,所有CPU供应商都增加了向量单元(如SIMD),GPU则采用了SIMT(单指令多线程,Single Instruction, Multiple Threads)的方式,以最大限度地提高高度并行、重复运算的效率。

此外,更专业的硬件通过对二维矩阵进行运算来进一步实现这一点。最著名的是Google的TPU,不过苹果和英特尔已经增加了自己的矩阵乘法功能AMX。虽然更先进的MAC单元提高了性能,但也产生了相应的需求,即能够在标量、向量和矩阵处理器上工作的灵活算法。

b86a25164d832d92e16331b263cf1fd6.png

(深入了解谷歌的第一个张量处理单元:不同乘法和累加(MAC)单元形状。)

模型

AI模型具有多样性。虽然矩阵乘法是许多模型的基础,但它们的矩阵大小可能差异巨大。例如,模型具有不同的输入形状(如不同的序列长度)、不同的内部形状(即作为模型隐藏层一部分的相乘矩阵),以及不同的batch size大小(对于训练和推理效率至关重要)。因此,矩阵乘法在生产中有数百种不同的形状,使得难以将它们分解为不同的block,以实现内存效率最大化。

312533c7a089a529a3ea701fa9ef80ce.png

Transformer图解,Jay Alammar:多头注意力块中涉及的各种矩阵大小,Transformer模型(如BERT, GPT2和CLIP)的关键构建块。)

数据

数据也存在差异。大多数读者可能比较熟悉结构化和非结构化数据方面的差异,但在本文,我们重点关注数据类型(“dtype”)。在AI模型中,数据通常使用dtype FP32,但为了减少模型大小,提高模型性能,业界也接受较低精度的数据类型,如Bfloat16,Int8以及更特殊的FP4和Int4。用例不同,Matmul算法需要运行的数据精度也不同。

d26db973d4307c1550d9523ce2569ded.png

量化在AI中的重要性:将FP32量化为Int8。

3

当前的SOTA矩阵乘法算法

那么,目前的SOTA矩阵乘法算法是如何实现的呢?鉴于其重要性,matmul通常是硬件供应商最先优化的算法之一,一般来说,供应商会利用他们的库来实现优化,比如英特尔的MKL和OneDNN

库、AMD的AOCL和RocBLAS、ARM的performance库、Apple的Accelerate、Nvidia的CUBLAS。

就效率而言,在上述提及的硬件库中,当前的SOTA是有效地编写汇编代码:在最低层级向硬件提供直接指令来微观管理硬件,而无需抽象。

a96e1fdf0083ac4cbbd288b027a74149.png

面向AVX512,用x86汇编编写的矩阵算法

这样做的主要原因是什么?编写汇编可以实现任意特定用例的最佳性能,通过汇编编写,开发人员可以避免编译器的不可预测性,编译器将Python和C++等高级语言转换为汇编语言,可以执行编译器难以做到的优化,因为编译器必须泛化。更重要的是,它们可以利用编译器未意识到的指令和模式,因为扩展编译器以支持新的硬件功能需要时间。

4

手写汇编kernel无法扩展

那么,汇编能否真正解决用户的碎片问题呢?虽然汇编编写可以最大限度地提高个人用例性能,但它不可移植、组合、扩展且对用户不够友好。少数手工编写和微调汇编代码的专家怎么可能将他们的工作扩展到不同配置,同时整合到所有AI框架中呢?这简直就是不可能完成的任务。

23fb35c01262720f58b70ed862a73e52.png

(机器学习编译优化器介绍,Chip Huyen:不断增加的框架和硬件支持组合)

可移植性

汇编是使用特定于硬件的接口(指令集架构ISA)编写的,因此它不能跨硬件移植。事实上,汇编甚至无法在同一硬件供应商的多代芯片上实现最佳性能!

此外,即使我们在开发模型时考虑了目标硬件,也仍然存在两大实际问题:

1. 首先,我们无法在云上控制运行汇编的特定硬件。你可能会说“我选择了一个非常适合自己模型的实例”。但事实是,某些云提供商(如AWS)上的实例不能保证特定的CPU类型。比如,如果你选择了c5.4xlarge实例,那么相应的,你只能使用老一代英特尔SkyLake处理器或新一些的级联湖处理器(Cascade Lake processor)。汇编无法适应运行代码的特定芯片,更无法为其提供最佳性能。

2. 你的产品将继续迅速迭代,你可能希望完全迁移到不同的硬件架构。确定一种特定配置会限制你根据模型需求的变化或新一代硬件进行适应性调整的灵活性。

可扩展性和可组合性

如前所述,AI模型的多样性导致了矩阵形状差异。使用基于汇编的库意味着选择对内存tile大小等参数进行硬编码的特定处理器指令。这些硬编码的汇编库可以针对特定的张量形状进行优化,但需要对其他张量形状进行不同的实现。

因此,许多现有的kernel库膨胀到了千兆字节(例如,MKL为3.2GB,cuDNN最高可达2.5GB)。当这些库的大小影响到容器构建时间时,如果你想部署到不切实际的边缘端,或者想要部署供应商尚未手动优化的新创新和研究时,这将成为一个麻烦。

从整体来看,高性能矩阵乘法对性能确实很重要。但为了获得最佳结果,矩阵乘法运算可以与其他运算一起执行,例如Elementwise、跨步访问(strided accesses)、广播(broadcasts)等。通过减少内存数据流量,算子融合(Operator fusion)带来了显著的性能改进,但问题是有成千上万的AI算子。

此外,模型使用了很多不同运算的排列组合,手动融合所有重要组合是不切实际的(虽然有些人已经尝试过了!),特别是在AI高速发展的情况下。

用户友好性

最后,汇编对于用户来说并不友好,不利于跨组织的生产力。汇编编程在现代编程语言(如参数化和面向对象编程)中可用的功能有限,且不能在调试(debugging)、代码覆盖率(code coverage)、测试(testing)等方面提供有效助益。

虽然大多数想要编写新运算符的研究人员都对Python比较满意,但还是有一些众所周知的性能问题(https://en.wikipedia.org/wiki/Global_interpreter_lock)。为了应对这些问题,组织不得不花高价高薪聘请专家来填补鸿沟。
 

其他人都在看

  • “ChatGPT们”的淘金时代

  • 机器学习编译器的前世今生

  • 手把手推导分布式矩阵乘的最优并行策略

  • 谷歌科学家:ChatGPT秘密武器的演进与局限

  • LLVM之父Chris Lattner:编译器的黄金时代

  • 两大图灵奖得主力作:计算机架构的新黄金时代

  • GLM训练加速:性能最高提升3倍,显存节省1/3

欢迎Star、试用OneFlow: github.com/Oneflow-Inc/oneflow/icon-default.png?t=N3I4http://github.com/Oneflow-Inc/oneflow/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP后台以及用户数据被泄露 该如何防护

近期我们接到许多DK平台反馈APP里的用户信息数据被泄露,导致用户经常受到境外香港电话推广骚扰,有些用户甚至被网络诈骗,而且用户当天申请填写表单里的手机号,没过多久就泄露了,紧接着香港电话就会打过来,询…

ap计算机科学5分率,AP考试5分率及难度分析

2019年的AP报名窗口已经开启,AP选考究竟要注意些什么?如何结合科目难度和自身情况,申请的时候尽可能地凸显的优势呢?今天老师从AP各科的难度和5分率进行分析,让大家了解过往战况,好好制定最适合的选考策略。…

ALEVEL数学、物理、化学、生物与国内考试的区别

A-Level考试中数学、物理、化学、生物是常考热门科目,这些科目在国内高考中也有对应的科目,那么,两者之间有什么区别呢? 1、A-Level物理与国内高考物理 从知识范围广度来看,A-Level物理更胜一筹,涉及的知识…

PTA L2-046 天梯赛的赛场安排 (25 分)

天梯赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满…

分析数学成绩,尽然我考了0分

编程语言:Python 简单的数据分析 导入 pygal 废话不多说直接上代码! import pygal radar_chart pygal.Radar() radar_chart.title 数学考试成绩分析 radar_chart.x_labels [班长, 学委, 体育委员, 学渣, 学霸,我] radar_chart.add(高三(5)班, [86, 96, 69, 49, …

T06 成绩排序

查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 示例: jack 70 peter 96 Tom 70 smith 67 从高到低 成…

Quick Request使用教程

一、基本介绍 Quick Request作为IntelliJ IDEA的插件,提供给开发人员更好的调试体验,当前可支持Spring Mvc、Dubbo框架的所有请求,具有简单易用、自动生成请求参数、项目环境管理、历史请求记录、保存请求及快速搜索的特点,下面给…

python爬虫二十四:js逆向破解(一)

1、环境搭建 通过python代码模拟js去生成加密数据完成数据破解,需要用到PyExecJS模块 ①安装模块pip install pyexecjs通过模块的方法来读取js代码,也可以用js2py(不更新维护了)、selenium(driver.wxecute_script(js代码))去执行js文件,这里…

关于ref哪怕在$nextTick()中有时候获取不到节点元素的问题。(较为诡异的bug)

我的需求是用element-ui的messagebox,来实现验证码接受的功能。并将cancel按钮换成刷新功能,在beforeClose中实现验证码刷新。元素都是在$msgbox中生成的,下面是最开始出错的核心代码。 let result await this.$API.reqCaptchaImg();this.ca…

微信小程序实现分页加载,触底加载下一页,滚动加载

这里我就不写wxml了,就是一个列表循环,直接看js代码逻辑,注释都写在代码后面了,这个方法可以实现无限滚动加载,直到加载完最后一条数据,也可以实现触底没数据后,二次触底可以从新加载刷新&#…

某地刑侦大队对涉及6个嫌疑人的一桩疑案进行分析

(1)A、B 至少有一人作案; (2)A、E、F 三人中至少有两人参与作案; (3)A、D 不可能是同案犯; (4)B、C 或同时作案,或与本案无关&#xf…

今天,微软重新发明搜索引擎:首款ChatGPT搜索来了

从现在起,比 ChatGPT 更强大的语言模型直接进入了你的浏览器。 一夜之间,全球最大的科技公司仿佛都回到了自己年轻时的样子。 在谷歌宣布「实验性对话式人工智能服务」Bard 之后仅 24 小时,北京时间 2 月 8 日凌晨两点,微软发布了…

嵌入式工程师的入门须知----亲测

嵌入式工程师的学习路线----亲测 本文概述入门之前必做竭尽所能了解嵌入式技术与职业规划正确认识自己 我眼中的嵌入式技术我眼中的职业规划我的入门之路总结 本文概述 这是一篇关于想要踏进嵌入式技术之路与相关职业规划的建议性文档,文中观点仅限于个人对于嵌入式…

嵌入式软件工程师面试必备技能

随着当前信息化网络技术在各行业的快速普及,嵌入式系统在技术领域呈现了前所未有的发展趋势,作为一个正在崛起的热门IT行业,人才的匮乏已经成为了嵌入式开发行业发展过程中呈现出的一种现象。据相关部门统计,我国目前嵌入式软件工…

电子通信、嵌入式工程师的面试指南

作者:火哥 授权转载自公众号嵌入式老鸟的职场之道(id:ict_embedded),火哥也是我们的校园代理 火哥自从校招找工作到现在,面试过不下50家公司,拿到过不少于30个offer。虽然不能说百战百胜,但是也还算有着较…

嵌入式软件工程师培训:提升技能、实现卓越

如果您对嵌入式培训感兴趣,以下是一些建议和关键点,可以帮助您进行嵌入式培训: 培训目标:明确确定您的嵌入式培训目标。是为了提升员工的技能水平,使他们能够承担更高级别的嵌入式开发工作,还是为了向非嵌入…

嵌入式工程师常用的软件工具推荐

前言:常言道:工欲善其事,必先利其器。作为一名合格的嵌入式工程师,日常可能需要接触和处理各种奇奇怪怪的问题,这时候一款高适配性的工具将会令工作效率大大提升。作者根据个人的实际使用情况与粉丝的客观感受&#xf…

软考中级-嵌入式系统设计师(一)

第一章 硬件基础 1、嵌入式微处理器结构 ARM采用哈佛结构,是一种RISC体系结构的微处理器。 DSP(数字信号处理技术)采用哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的指令,可以用…

嵌入式软件工程师学习路线图

人们去学习嵌入式的话,最后也是想成为嵌入式软件工程师的,这对于学习嵌入式学员来说还是有些难度的,所以这回小编就给大家介绍下嵌入式软件工程师学习路线图吧。 点击获取1V1嵌入式学习规划,现在还送100G精选学习资料。&#xff0…

嵌入式工程师的『2022 || 2023』

因为一些个人关系,2022年初我从北京回到了石家庄。在找工作,包括后续的研发工作中,不同地点的经历在对比中我逐渐总结出了一些经验。关于“人”方面的感悟我就不赘述了,下面主要在这里总结一些找工作,做工作的经验&…