新闻中心

昆仑芯科技NPU架构负责人王京:新一代自研架构昆仑芯XPU-R

芯见闻 发布于 2022-06-28 18:30

近日,昆仑芯科技应邀出席百度技术沙龙第99期“智能芯片”专场:昆仑芯一周年——构筑国产数智基石,AI算力赋能千行百业。四位专家首次同台,揭秘十年磨一剑的中国芯的神秘技术面纱,并系统介绍昆仑芯两代产品赋能千行百业的最新成果及应用实践。 

 

本篇以下内容整理于沙龙第二位演讲嘉宾——昆仑芯科技NPU架构负责人王京题为 “昆仑芯硬件架构:新一代自研架构昆仑芯XPU-R”直播分享。

 

昆仑芯科技NPU架构负责人王京

 

线上的朋友好,我是王京——昆仑芯科技NPU架构负责人,今天的分享主要围绕新一代架构昆仑芯XPU-R。

 

 

AI无处不在

 

 

AI在最近十年左右蓬勃发展,一开始在学术界、算法上有很多突破,随后在语音、图像、自然语言处理等多个领域的准确率均实现大幅度提升,甚至在一些评价标准上超过了人的能力。这使AI技术得到了很多落地应用机会,同时也有更多更好的AI算法出现,更好地服务这个产业。

 

可以说AI已经成为一个应用非常广泛的技术,这也是我们要用AI做一款通用计算架构的原因。

 

 

AI计算需求驱动架构创新

 

首先,我们认为AI算法的应用场景足够广阔,值得为此去设计一款针对AI通用的架构,这是基础。

 

其次,已有的传统处理器架构解决方案实际上不太能满足AI的计算需求。

 

这张图(下图右)是近些年来AI算法对算力的一些要求,可以看到增长非常快,基本上是每3.5个月,对AI算法计算量的要求就翻一倍。

 

 

这张图(上图左)是传统处理器细分的一些性能指标提升的情况,可以看到很多曲线已经出现了明显的瓶颈。

 

比较影响处理器性能的几个因素,比如工作频率、单线程的性能以及核心数量的提升速度,其实都没办法做到很高的速率。这是物理上的限制,因为频率没办法无限制地提高。工作频率的提高取决于底层晶体管充放电的速度,这是有一定瓶颈的。工作频率的提升会导致芯片的功耗增大,对散热问题也是一个非常大的挑战。

 

从技术上来讲,单核性能在技术上的突破也已经到了瓶颈。目前单线程已经做得很好,包括一些分支跳转的推测执行技术,这些技术上来之后,单线程性能还如何继续发展?并没有一个非常明确的答案。

 

综合来看,传统处理器的架构很难追上AI算法的需求。即使先不考虑这些技术,只看晶体管数量,18到24个月翻一倍的速度也追不上AI算力发展的需求。也就是说,AI算法应用已经足够广阔,它需要一个计算架构,但现有的这些计算架构又没办法满足它的需求。

 

正是这样一个契机,我们可以在AI领域做一款全新的、领域专用的计算架构,这也是我们团队十年来做的一件事。

 

 

昆仑芯XPU架构——十年磨一剑

 

2011年我们开始做AI异构方向的相关工作,是非常早的一个时间点,AI浪潮刚刚起步。在这么一个时间点,我们就已经开始尝试用异构计算方法做一款自定义的计算架构为AI加速,这是非常领先的。

 

 

在这个期间,我们以FPGA为平台。FPGA究竟是什么?简单来说,它是一个可编程的芯片。这个编程编的是电路结构,而不是软件代码。我们可以依托它的可编程性实现想要的计算架构。

 

在我们技术开始迭代的初期,利用FPGA的可编程性去实现架构是比较好的选择——它不涉及流片之类的问题,是一个比较成熟的商业产品,只需要专注于这个架构本身。我们做的事情主要是专注于怎么把这个电路架构设计好,那段时间我们迭代了很多个版本。

 

2013年,有第一代基于28nm的FPGA加速卡,我们也发现了更好的架构设计,使AI的计算效率能够成倍提升。

 

首先,肯定是要仔细分析AI算子的计算特点以及访存特点。同时,我们也发现在AI领域,尤其是推理领域,定点化是一个非常关键的技术,这可以使得我们的核心计算单元从浮点转向定点,由此实现能耗效率的飞跃。

 

早在2013、2014年,我们就开始做这种定点化的工作,直到2016年GPU才在Pascal架构上首次引用了定点支持,可见我们在这一方面是非常领先的。

 

2015年,我们推出第二代基于20nm的FPGA板卡,当时这代产品相对于同时代的GPU有2倍以上的性能优势。

 

经过多年积累,2017年我们逐个突破了各种各样的AI领域场景——从语音到推荐类、图像类、自动驾驶类的场景,逐渐做到了AI领域内全场景的支持。

 

也是基于这一点,2017年,我们整体的FPGA部署超过了一万两千片,是当时国内最大的FPGA集群。2017年,我们的架构已经基本达到在AI领域内通用的水平,可以说这个架构整体的成熟度已经比较高了。

 

然而,FPGA平台也出现了一些不足之处。作为一个商业产品,它制造出来时的规格是确定的,然而我们想要有更大的空间、更大的自由度,让我们的架构更好地发挥能力。由于我们在FPGA上已经做了足够多的迭代,所以当时我们做好准备跳过FPGA完全自主地定义芯片的spec。也就是从那时候,我们转向了自研芯片。

 

2018年,昆仑芯项目正式启动。2019年,我们一次性流片成功,昆仑芯1代AI加速芯片,以及对应的AI加速卡产品也出来了。经过加速卡的调试以及相关软硬件产品和生态的完善,2021年第一代产品取得了非常好的成果,量产超过两万片,也是国内量产落地最大的、规模最大的AI芯片。

 

这就是我们十年来在AI加速通用架构领域积累和成长的过程。在这个过程中,我们总结出了几点经验。从产品定位上讲,如果要使产品或技术架构有长期生命力,有几点非常重要。

 

 

具有长期竞争力的产品定位

 

1. 通用

足够通用,用户才能更好地利用产品去支持不同种类的work load。不仅仅是从产品角度,从技术角度来说,通用也是非常重要的一点。我们之前在做这种AI场景的时候发现,如果用非常专用定制的技术去支持不同场景,技术的生命力或者说使用周期是非常短的,会造成研发成本浪费、研发效率低下,技术也没有什么积累,因为基本上换个场景都得重新去做。而且,如果做不到通用就没办法自己做芯片。可能在FPGA时代还勉强可以支撑,但如果真的要实打实做芯片,没有通用的技术能力就无从谈起。

 

2. 易编程

这对芯片的使用者,也就是软件的开发者来讲非常重要。他们会非常关注究竟有多大的可能性在芯片上做开发。如果算法有迭代升级,是否能够很快支持,所以这一点非常关键。从技术方面来说,只有在芯片的架构有足够的灵活性、足够多的数据通路和计算模式的支持,并且要支持足够多的参数、编程接口的情况下,才能很好地满足用户在不同编程场景下的需求。

 

3. 高性能

高性能其实是一个非常基础的要求。因为我们毕竟是在做一个全新的AI技术芯片架构,如果没有高性能,用户没办法从现有计算架构上迁移过来。我们是一个全新的、面向AI的通用架构,高性能是基础能力。

 

4. TCO

TCO非常重要,它关系到用户在你的产品周期中究竟要付出多大的代价。这对技术提出了很多要求。首先,芯片的资源效率一定要非常高,要在尽可能少的面积下实现非常多、非常高效的算力和功能,这样才能降低芯片整体的生产成本。其次,功耗水平要控制在一个范围之内。比如每瓦的算力要能达到一个比较高的水平,这样才能使芯片所代表的硬件产品部署到用户的实际场景时,功耗所带来的供电成本被控制在一个比较好的水平。

 

5. 自研创新

这是比较核心的一点。芯片的关键IP,即具有核心竞争力的这部分必须是自研的,这样才能有长期技术迭代的可能性。我们一直在坚持核心的AI通用计算IP,这部分一直是我们自主迭代、完全自研、完全自主知识产权的状态。

这就是我们产品的定位,也是我们已经能做到的产品的特点。从技术本身来说,无论是学界还是产业界,都非常认可我们的技术能力。

 

 

技术领先学界和产业界

 

 

首先,从Hot Chips来看,这是一个非常顶级的芯片界会议,我们在这个会议上发表了四篇论文,也是国内同一个团队发表次数最多的记录。我也是其中几篇论文的作者之一。

 

从这些论文中就能够看到昆仑芯XPU整个架构迭代的思考和变化。在2014年的这篇文章中,我们提出了这个架构(图示),从今天的角度来讲,它其实是一个比较偏向定制的版本,流水线是一个非常专用的部件,所有的计算顺序一定是按照这个流水线的定义去走,同时我们设计了很多专用的buffer来支撑计算单元的计算。这个版本也是我们FPGA时代的一个雏形版本。

 

后面,在不断迭代的过程中,最终形成了一个更偏向于通用计算处理器的架构。可以看到(图示)这时候没有了特别多定制化的数据通路或定制的ALU组合的顺序,而是多个通用核和多个加速单元的形式,更有利于通用性跟灵活性的发挥。我们在做到这一点的同时,也保持了非常好的实际性能和效率。

 

当时我们在做这方面的工作时,并没有其他资料可供参考。回过头来看,谷歌也是多年之后才发表了之前的一些架构。

 

2017年谷歌把TPU,也相当于是AI加速芯片TPU的第一代芯片的架构披露了出来。它当时内部的思想其实和我们的想法有很多共通之处——有很多定制的流水线通路。后面,在它披露第二代TPU时,可以看到它转向了一种更加通用的计算模式。我们虽然没有了解过对方是怎么做的,但是从后面大家发表的论文来看,我们其实一直是站在国际第一梯队。我们对技术趋势的判断,对架构迭代的趋势后来也得到了科学验证,是非常符合整个发展趋势和潮流的。

 

 

AI计算特点和解决思路

 

接下来说一下我们是怎么去设计昆仑芯XPU架构的。

 

 

首先,从开发者或者说应用上来看,大家更多关心的是多种场景,以及它对应的模型。但是在架构设计者眼里,更多关心的是模型背后的算子。在这么多年的迭代过程中,我们把这些算子分为两大类。

 

第一类,出现频率非常高的,比如说像全连接、卷积、bn、ln这些,很多的神经网络中都会有,而且不仅是某一类的神经网络,比如语音、图像,它都有这种全连接层和激活。这种算子出现频率非常高、计算量大,可能抓取十多个算子,总耗时就能达到某个模型的90%以上,计算量和耗时占比都非常高。一句话来讲,这类算子的数量相对没有那么多,但它的性能至关重要。对于这部分算子,我们希望用相对专用定制的加速器的电路形式去实现,来提升整个架构的实现效率,同时它还要有一定的可编程性。比如你虽然做的是卷积,但是卷积有非常多的规模参数,比如图像的长宽高所需要的参数是非常多的,这就需要参数能够做到全部、全面、灵活的支持,所以说架构本身要有一定的可编程性。虽然可以用这种专用定制电路去提升能耗、效率或者性能,但是仍然要保留一定的可编程性。

 

第二类算子的特点相对来说不太好把握,数量很多。我们的芯片不仅支持推理还需要支持训练,这里面的算子就非常复杂,而且计算类型很丰富,很难总结出这部分算子的规律、特点。同时它在不断变化,每一年都会发现新的算子变种、变形,已有算子很难把这些东西cover掉,或者说很难保证未来几年之内都是这一些东西。同时甚至还有一些算子,干脆就是用户自己发明的,这些自己定制、创造出来的东西很难在芯片设计时把握清楚。

 

对于这部分算子,我们处理的思路也是不断迭代的。一开始思考放在CPU上,直接用CPU跟芯片协同解决这个问题。然而,一旦用CPU计算,一方面性能肯定会很差,因为它的算力不足,同时,会引入很多CPU跟AI芯片之间的通信开销,非常影响整体端到端性能的上限。

 

接下来我们想到运用定制电路模块化的思路,比如说搞一个电路库,每个算子有不同的电路实现,对不同的模型可以用不同的电路去组合、完成。这种思路其实在之前我们做FPGA的时候可能勉强可以,毕竟FPGA有可编程性。

 

但真的要做高性能自研芯片,这个思路显然是不现实的——不可能所有算子库的对应电路全都放在芯片上,这样的面积根本没法收敛。最终,我们决定做一个自研的通用处理器,用通用处理器的思路去解决这部分算法。

 

 

通用AI计算架构的优势

 

我们最终实现了通用AI计算处理器的昆仑芯XPU-R架构。相对CPU跟GPU,它主要的区别和优势在哪里呢?

 

 

从这个图中可以很明显看出来,CPU很强调通用性及单核的性能。它用了很大一部分逻辑在控制单元的各种优化上。比如说,对这种分支跳转的优化,它有复杂的Cache结构去保证寄存器的读写效率。真正用于计算来讲,这种部件并不多,所以它的通用性、单核性能会比较好。但是在这种AI场景下,反而总体的性能或者TCO都是比较差的。

 

GPU相对CPU更加适合AI计算,因为它每个核里面没有那么多控制单元,它其实是把更多资源放在了计算部件上。同时,近些年来为了进一步提升GPU,也引入了一些定制单元,为了和它的架构做兼容,这些定制单元用的是小核的思路,就放了很多小的定制的计算单元。

 

我们的架构相对于其中这个AI计算层面来说,做得更加彻底,效率更高:

1)我们的加速计算单元的计算密度非常高,因此相对于CPU,它整体上的性能、能耗效率有非常大的提升。

2)我们不仅是做计算部分,针对AI算子的特点,我们在计算单元的周围做了很多非常精细的数据整理和处理,整个数据通路的设计非常贴合AI算子的特点,这使得我们加速计算单元这部分的整体效率非常高。

3)我们也有通用计算单元,这部分性能也非常高。我们通用计算单元内部对于一些复杂算子的处理能力,比GPU相同的计算单元更强。这也是我之前的这张PPT上讲的思路,我们用这种通用加专用的架构去解决AI计算的一些核心挑战,使得我们在高性能、TCO通用性和易编程这几个维度做到了全面的水平。

 

 

全面增强的昆仑芯2代

 

下面主要介绍一下昆仑芯2代相对于昆仑芯1代的一些特色优势。

 

  • 高性能分布式AI系统

昆仑芯2代能够支持芯片和芯片之间直接的互联和数据传输。这一点对分布式训练非常有帮助。我们可以直接在多芯片之间交换训练一些中间结果。同时,近两年的趋势是推理模型中其实也有分布式推理的需求,片间通信的能力使得很多模型级并行、数据级并行的通讯需求都能够得到很好的满足。

 

  • 支持硬件的虚拟化

我们可以做到从硬件角度使计算单元跟存储单元实现物理隔离,避免多个用户之间相互影响,保证每个用户的延时和吞吐,更好地提升芯片整体的利用率。

 

  • 增强的通用计算能力

首先从峰值的性能,主要是FP16、INT16性能来讲,从spec上做了一个翻倍提升。同时,我们对模型中具体计算的瓶颈做了架构优化,使我们在真正的实际业务模型的处理上,效率相对于第一代有更进一步的提升。可以看到我们的一些模型相对于昆仑芯1代的实际性能的提升倍数会超过spec本身的提升。

 

看一下主要参数。昆仑芯2代采用7nm先进工艺,也是第一个使用GDDR6显存的AI芯片,同时实现了256 TOPS@INT8的超高算力,把功耗控制在了150W以下,和CPU之间的连接采用的是PCIe4.0的接口。

 

 

昆仑芯XPU-R架构

 

这是昆仑芯2代XPU-R架构以及它SoC上一些部件的总体框图。

 

 

可以看到多个XPU Cluster单元和XPU SDNN单元,这两部分分别对应计算加速单元、通用处理器单元。我们称SDNN为软件定义的神经网络引擎,这部分是计算加速单元,主要处理比较高频的、计算量大的张量跟向量运算,能灵活实现卷积、矩阵计算,还有激活等操作。Cluster是通用计算核,它内部是有一些标量跟向量计算,向量主要是SIMD指令集,同时每个Cluster的内部有很多XPU Core。Cluster具有很高的通用性和可编程性。整体来讲,架构本身的灵活度就可以使我们对这种XPU Cluster的编程做到非常细粒度。

 

除了这两大核心的计算IP之外,我们还有一些其他的SoC上的部件,包括Shared Memory。它可以提供一个软件完全显示管理的大容量的Memory,能够大幅提升带宽。还有片间互联,以及跟主机连接的PCIe的接口。同时我们还引入了Video Codec,这实际上是视频编解码以及图像预处理的功能。这可以使我们在一些图像的端到端的领域,有全场景的、端到端的计算支持。

 

同时,我们还有安全模块,可以提供通信通道和安全服务,实现从主机到昆仑芯芯片整体的安全机制的保护,保证所有的模型数据不被攻击者窃取。

 

 

丰富的产品线涵盖多种场景

 

 

图中是我们昆仑芯XPU-R架构承载的硬件产品。无论是比较高性能的单机多卡训练场景,还是PCIe加速卡以及一些对加速卡的尺寸跟功耗要求比较严格的场景,我们都有对应的硬件产品。比如R480-X8,它内部有8块昆仑芯2代芯片,可以总体达到2P的INT8的计算能力。

 

 

性能表现全面优于竞品

 

从性能上来看,我们也全面优于竞品。包括GEMM(通用矩阵乘法)、BERT(自然语言处理模型),以及图像检测和分类的两个模型,在这些模型上我们相对竞品有明显性能优势。

 

 

总结来看:昆仑芯架构在技术层面可以做到独立自主,我们的架构是完全自主设计和实现的;同时,灵活易用,我们的软件栈非常完善;最后,规模部署,我们有多个产品并且实现了两万片以上的落地案例。