继上一篇浅浅讨论了神经网络中的舍入操作之后,本篇简单讨论下神经网络算法中常见的数据类型。相比CPU,专门用于神经网络训练与推理的DSA/AI芯片,往往支持更多的数据类型。这些数据类型在表示范围、精度和算力性能方面各有考量。
算力与数据类型
神经网络训练/推理性能与数据类型的选择有很大关系,这是因为芯片上相同规模的运算器单元,在不同数据类型上具有不同的算力。 以矩阵乘加单元的定点计算为例,假设某AI Core具有运算能力“16Byte/cycle*16=256Byte/cycle”(这与AI Core的运算器计算带宽和个数相关,运算器带宽和规模也决定了AI Core的主要面积来源),对于int8(1Byte)类型就是可完成计算“256个数/cycle”,或者说“256次乘&加运算/cycle”。如果AI Core工作频率为1GHz,则其int8矩阵算力为
MAC算力=256次/cycle * 2(乘加分开算2次) * 1GHz = 512GOPS(Giga Operations Per Second)
在相同运算能力下,对于int16(2Byte)类型就是可完成计算“128个数/cycle”,或者说“128次乘&加运算/cycle”,折合成MAC算力为256GOPS。所以常规情况下,MAC算力与数据位宽成反比。
实际芯片设计,由于运算器物理实现限制(频率),对于更高位宽如fp32的计算,算力会在数据位宽比例折半的基础上再折半。依然如上运算器规模为例,对于fp16(2Byte),可完成计算“128个数/cycle”,或者说“128次乘&加运算/cycle”;那么对于fp32(4Byte),实际情况可能是:“64个数/2 cycle”,或者说“64次乘&加运算/2 cycle”。因此MAC算力(for fp16)为256GOPS,MAC算力(for fp32)为64GOPS。如此一来,fp32的等效算力就是fp16的1/4。纵观各AI芯片厂商,基本都是这个规律。
层出不穷的数据类型
与CPU通用计算相比,神经网络由于其计算场景的特殊性,往往精度要求存在可妥协性,因此出现了多种特殊的数据类型,用于给神经网络“加速”。总结于如下表格。
DataType | Discription(格式表示为{1,Exp,Man},E表示指数位宽,Man表示尾数位宽) |
---|---|
fp16 | 半精度浮点类型,格式为{1,5,10}。 通用计算与AI计算常见的类型之一,只占16bit的位宽有利于提升AI算力,但其表示范围较小会限制其应用场景。 |
fp32 | 单精度浮点类型,格式为{1,8,23}。 通用计算与AI计算常见的类型之一,表示范围和精度对于AI应用都足够。但由于占4个字节,硬件算力因此很低,正在逐渐被其他类型(如tf32、bf16)替代,一般只在精度要求特别高的场景使用。 |
bf16 | BFloat16浮点,google 2018年提出,格式为{1,8,7}。 比同是16bit的fp16有更大的动态表示范围,但牺牲了尾数表示精度。其指数位宽与fp32相同,因此可与fp32快速进行相互转换。 |
tf32 | TensorFloat32浮点,Nvidia A100(2020)首次引入,格式为{1,8,10}。 有效位宽为19位,即与fp32指数位宽相同,与fp16尾数位宽相同。同bf16,其指数位宽与fp32相同,因此可与fp32快速进行相互转换。 |
fp64 | 双精度浮点,格式为{1,11,52}。 神经网络乘加运算并不需要,对于HPC计算场景有需求,因此对于AI+HPC双场景支持的芯片会支持fp64。 |
fix4/fix8/fix16/fix32 | 各位宽的有符号定点数,最高位是符号位,带定标。 常用一个有符号整数(如int8)表示小数点位置position, real_val = value * 2 ^ position。 |
ufix4/ufix8/ufix16/ufix32 | 各位宽的无符号定点数,带定标。 常用一个有符号整数(如int8)表示小数点位置position, real_val = value * 2 ^ position。 |
intNN/uintNN | AI Core内中间计算结果的表示类型,位宽常大于32bit。 软件不可见,可通过截位得到目标定点数,或者转数得到目标浮点数。 |
由于数据类型的选取对于神经网络训练推理的性能、精度有很大影响,近两年每隔一段时间就会出现新的数据类型,再如Tesla推出的fp8(8bit浮点类型,包括{1,4,3}、{1,5,2}格式),都是为了极致优化网络模型的性能。
后续对针对上篇提到的舍入模式介绍硬件的实现方式,针对本篇提到的数据类型介绍运算器的设计方式等。
本文完