【小白设计AI芯片】定义指令集(一)

开头语       

        对于一款可编程处理器,指令集是处理器软硬件约定的接口,是底层软件人员了解硬件、开发底层软件必要的条件支撑。也是硬件对软件的功能支持、编程约束的集中体现。

        AI算法发展迅速,为了对当下乃至未来的算法都有一定的适配能力,如今AI芯片已从支持专用网络模型的ASIC(Application Specific Integrated Circuit),发展成为支持一定编程能力的DSA(Domain Specific Architecture),即不再仅仅是对特定神经网络算法的硬化,而是将一类或多类神经网络(比如CNN/RNN/Transformer等)中的热点算子进行硬件实现,最后通过API的形式体现给编程人员。对于一款通用性较高的AI芯片,其指令集包含的内容也是很多的,并且往往随着应用场景和硬件版本的迭代不断扩充。

        定义指令集之前,首先我们需要弄清楚深度神经网络中都涉及哪些“运算”,作为指令集功能设计的指导。

深度神经网络的运算

CNN

        传统的深度卷积神经网络,是与AI硬件结合最为彻底的网络模型,读者可自行搜索各类CNN的介绍,这类资料已有很多,重点关注其中涉及的算子功能及计算方式。初次接触的小伙伴可以阅读以下帖子,讲的比较形象。 1.8w字长文解析Resnet50的算法原理 - 知乎恭喜你发现宝藏了,先收藏,在慢慢看吧。 本文为作者原创,未经允许,禁止搬运转载。如有任何需求,可私我或加微信 ddcsggcs 私我。感谢支持。祝大家科研学习工作节节高。从打算写图像识别系列文章开始已经快2个月…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/554100794?utm_id=0&wd=&eqid=df34d4f900029674000000036479edf9         CNN常见运算如下:

  • Conv(一般指2D卷积)
  • MaxPool,AvgPool
  • Activition(ReLU,Tanh,Sigmoid)
  • FullyConnect(或叫Linear Layer)
  • SoftMax

Transformer

        在语言大模型(LLM)爆火的当下,其应用领域不仅在云端,也向边缘端、终端扩展。网络模型由最初的Transformer,再到其衍生模型GPT和BERT,基于注意力(Attention)机制的网络模型已从语言模型扩展到如视觉模型、图像视频生成等多个应用领域。在自动驾驶领域,基于BEV的算法架构也成为工业界研发热点,这背后都是Transformer类网络的应用。

        关于Transformer的介绍,初次接触的小伙伴可以参考如下内容,讲的非常细致好懂。如何最简单、通俗地理解Transformer? - 知乎写在前边:学习 Transformer 的过程中,找到了Ketan Doshi 博客中关于Transformer系统的介绍文章,感觉非…icon-default.png?t=N7T8https://www.zhihu.com/question/445556653/answer/2882383919

        Transformer类的网络算子种类与CNN有很大重叠,也有其独特特点,常见运算有:

  • Embedding(Word-Embedding+Position-Embedding,其中涉及Lookup-Table,sqrt,exp,sin,cos等非线性计算)
  • Conv
  • MatMul/GEMM
  • Linear Layer
  • SoftMax
  • LayerNormalization

定义AI Core的加速部分

        上面提到了深度神经网络的常用操作,也就是我们设计一款AI处理器要支持的功能。比如我们要设计一个NPU(Neuron Processing Unit),必然要支持Conv、MatMul、Gemm以及FullyConnect这些矩阵运算,因为这些操作是CNN或Transformer中最费时、对计算资源要求最高的运算,而且深度神经网络都是基于这些操作实现,所以NPU上支持这些运算收益比较明确。类似的还有Pooling类操作。        

        除了上述线性运算,像SoftMax、LayerNorm、Tanh及sin、cos等非线性计算也是网络中常见的操作,只不过它们出现的频次稍低。如果要实现这些操作,你会发现硬件逻辑可能比你想象的要复杂一些,由于这些操作的出现频次不如矩阵运算那么高,其硬件加速收益也不是特别明确。

Host/Device端运算的权衡

        如今AI芯片都是一个异构计算体系,不管是GPU还是NPU,都常作为CPU的Device端,与CPU Host一同完成AI加速任务。整个AI SoC中,CPU不仅完成系统级任务配置和下发,本身也可以参与AI网络模型的一部分运算。只不过CPU作为通用任务处理器,相比于专用的加速硬件其性能会弱很多,再加上CPU与NPU的数据一般分别位于不同的内存空间,二者协同计算时难免涉及数据在不同内存间的搬移,因此造成了额外的耗时。

        综上述,如果神经网络全部运算都在NPU上实现,可能会达到最佳性能,比如网络推理延迟或图像帧率的最优化等,但NPU硬件设计复杂度、面积开销会很大。如果将一部分复杂非线性逻辑运算在Host端CPU上执行,则会简化NPU设计,却一定程度上使得硬件整体性能恶化。而且CPU的资源也是有限的,让CPU参与一部分网络计算,会显著降低其他系统任务的执行性能,因此有的AI SoC还会加入DSP作为2号Device,NPU无法完成的计算任务,可由DSP协助完成,但该过程同样存在中间数据搬移的性能损失。因此决定NPU实现哪些加速运算,应该从系统级的网络性能入手分析,同时兼顾NPU的逻辑复杂度和资源开销。

定义指令粒度

        当我们最终决定了由NPU实现如下运算:

  • CONV(MatMul、GEMM)
  • POOL(MaxPool、AvgPool)
  • FullyConnect
  • SoftMax
  • LayerNorm

        接下来的问题是,硬件指令集应该如何设计,或者说第一步应该决策,硬件指令与软件算子如何对应。最直接的做法是设计5条指令,与以上5个操作一一对应,这是最粗粒度指令的极端。好处是软件人员在实现包含相关运算的神经网络时编程最为简单,“一层”调用一个硬件api即可。坏处一来是一条硬件指令会非常复杂,由此导致指令位宽太大,进而增大处理器取指、译码单元的设计复杂度和硬件开销;二来是削弱了硬件指令的通用性,当遇到包含其他操作的神经网络时将无法适配,因此一般的NPU不会直接将网络中的“一层”直接设计为一条硬件指令。另一个极端则是将硬件指令定义为最细粒度,类比arm或mips标量指令集,可以通过不同的标量计算和跳转控制实现任何程序。这样做的好处是最大化了NPU的通用性,坏处也显而易见,这样一来NPU相比CPU将无任何性能优势,也失去了自定义指令集的意义。所以对NPU自定义指令集的粒度决策,需要考虑硬件实现复杂度、软件通用性和性能多个因素。

        以下给出一种硬件指令的划分方式,其中Conv/Pool相对粗粒度,可以与上层软件算子的计算模式大体对应,只是考虑到寄存器资源、片内ram资源,conv/pool的各项参数规模不可能太大,当网络中出现大于指令集规模上限的参数时,需要软件(编译层或算子层)对算子规模进行拆分以满足指令集约束。值得注意的是,由于卷积与矩阵乘的核心运算都是对位乘加,所以理论上可以通过维度变化,使用一条硬件指令同时表示卷积和矩阵乘。

        对应softmax和layernorm的功能支持,设计了较细粒度指令实现。其计算涉及非线性计算,以下例子为了性能考虑,在NPU中定义了exp和sqrt计算,同时需要加入accsum(求累加和)、element-wise-vv(向量向量对应加减乘)、element-wise-vs(向量标量对应加减乘)等指令。相比直接实现softmax和layernorm指令,一定程度可以增强指令集的通用。

NPU ISA包含指令位域对应上层算子
Conv

规模参数:

ci,co,kw,kh,wo,ho,sw,sh,dilation_size,pad_size,……

地址索引:

neuron_addr,weight_addr,output_addr,……

计算属性:

data_type,fused_cal_type,……

Conv2d;MatMul(Gemm);

FullyConnect

Pool

规模参数:

c,kw,kh,wo,ho,sw,sh,pad_size,……

地址索引:

input_addr,output_addr,……

计算属性:

data_type, pool_type:[avg_pool/max_pool],……

avg_pool,

max_pool

exp

规模参数:

size(in/out);

地址索引:

input_addr,output_addr,……

计算属性:

data_type

softmax
accsum

规模参数:

size(in/out);

地址索引:

input_addr,output_addr,……

计算属性:

data_type

softmax;

layernorm

element-wise-vv

规模参数:

size(in/out);

地址索引:

input0_addr,input1_addr,output_addr,……

计算属性:

data_type,cal_type:[add,sub,mul]

Conv_partial_sum;

残差求和等

element-wise-vs

规模参数:

size(in/out);

地址索引:

input0_addr,input1_addr/reg(scalar),output_addr,……

计算属性:

data_type,cal_type:[add,sub,mul]

layernorm
sqrt

规模参数:

size(in/out);

地址索引:

input_addr,output_addr,……

计算属性:

data_type

layernorm
shift

规模参数:

data_size(in/out); shift_size

地址索引:

input_addr,output_addr,……

计算属性:

data_type

softmax;

layernorm

        当指令集功能、粒度都决定好之后,NPU的架构就基本上确定好了,这就是“指令集架构”叫法的由来,也就是指令集的功能、粒度、编程约束已经决定了处理器架构的绝大方面(如地址/数据寻址空间及大小、运算类型及异常中断等),剩下就是微架构的事情了。

TO BE CONTINUED

        以上内容大致说明了AI Core中的指令集设计需要考虑的一些主要因素,还有一些指令集中的其他内容和说明将在下篇《定义指令集(二)》中继续。

本篇完

        

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"人工智能芯片设计"是由尹首一撰写的一本PDF书籍。这本书主要介绍了人工智能(AI芯片设计原理和方法。 人工智能是近年来发展迅速的领域,其应用范围涵盖了机器学习、深度学习、计算机视觉和自然语言处理等。而AI芯片作为支持人工智能算法和应用的重要组成部分,其设计和优化对于提高人工智能系统的性能和效率至关重要。 这本书首先介绍了人工智能芯片的基本概念和工作原理,包括硬件架构、传感器集成、计算单元设计和存储器等关键技术要点。随后,作者重点解析了人工智能算法在芯片设计中的应用,比如卷积神经网络(CNN)、递归神经网络(RNN)和自动编码器(AE)等。通过深入剖析这些算法在芯片架构中的实现原理,读者可以获得对AI芯片设计的更深入的理解。 此外,书中还探讨了当前人工智能芯片设计中所面临的挑战和未来的发展趋势。随着AI技术的不断发展和应用的拓展,人工智能芯片设计需要不断迭代和创新,以满足更复杂、更高效的人工智能计算需求。 总体而言,尹首一的《人工智能芯片设计》为读者提供了一个全面了解和掌握人工智能芯片设计的指南。无论是对于从事人工智能芯片开发的工程师还是对于对于人工智能感兴趣的学者研究人员,这本书都是一份不可多得的参考材料,对于推动人工智能技术的发展有着重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值