AI 算力的科学衡量与计算方式

目录

科学计数法

科学计数法最初被设计用于表示一个极大或极小数,基本形式为 a * 10^n,通过对 n 次幂的转换使得 a 的取值范围为 [1, 10)。例如:

  • 19971400000000 可以表示为 1.99714 * 10^13
  • 0.00001 可以表示为 1 * 10^-5

科学计数法被广泛应用于科学、工程、数学等领域,很好的简化了极大数或极小数的书写方式和计算。

  1. 简化表示:极大或极小数可以用更简洁的形式表示,避免书写大量零。
  2. 方便计算:在科学和工程计算中,科学计数法可以简化运算过程,尤其是处理极大数或极小数时。
  3. 易于比较:通过比较指数,可以快速判断两个数的大小。

尤其在计算机科学领域,科学计数法通常会使用 E 或 e 来表示 10 的幂次。例如:

  • 1.2 * 10^4 可以表示为 1.2E4 或 1.2e4
  • 5 * 10^-3 可以表示为 5E-3 或 5e-3

浮点数

浮点数就是小数,“浮点” 的含义是它的小数点的位置可以漂浮不定,这是基于科学计数法带来的特性,例如:

  • 十进制小数 0.1234,用科学计数法表示可以有多种方式:
1.234 = 1.234 * 10^0
1.234 = 12.34 * 10^-1
1.234 = 123.4 * 10^-2
...

IEEE 754 计算机浮点数标准

IEEE 754 标准的全称为 IEEE Standard for Floating-Point Arithmetic,旨在统一计算机系统中浮点数的表示、存储和计算方法。其核心内容包括:浮点数的书写格式和数据类型。

  • https://zh.wikipedia.org/wiki/IEEE_754

浮点数的书写格式:由 4 个部分组成。

  1. 符号位(S):表示数的正负,0 正数,1 负数。
  2. 尾数位(M):表示有效数字。
  3. 基数位(R):计算机二进制的基数就是 2。
  4. 指数位(E):表示 R 的 E 次幂。

一个浮点数(Value)的完整表示为:

V = (-1)^S * M * R^E

浮点数的类型:主要包括 2 大类。

  1. 单精度浮点数(FP32,32 位):1 位符号位、8 位指数位和 23 位尾数位组成。
  2. 双精度浮点数(FP64,64 位):1 位符号位、11 位指数位和 52 位尾数位组成。

在这里插入图片描述

其中,为了让 E 始终以一个无符号整数存储,IEEE 754 引入了偏置值(bias)来表示实际 E 的负数。

  1. 对于单精度浮点数,偏置值为 127,例如:当实际 E 是 -1,那么存储 E 则为 127 - 1 = 126;当实际 E 是 1,那么存储 E 则为 127 + 1 = 128。
  2. 对于双精度浮点数,偏置值为 1023。

采用实际 E 加上偏置值来得到存储 E 的办法,好处是可以用长度为 8 或 11 个比特的无符号整数来表示所有的指数取值,这使得两个浮点数之间的指数大小的比较更为容易。

十进制浮点数转换为 FP32/64 浮点数

十进制浮点数 0.125 转换为 IEEE 754 标准 FP32 二进制的过程如下:

  1. 将十进制数值 0.125 转换为二进制数值 0.001。
1)整数部分:除 2 取余法,0/0=0,余数部分 = 0
2)小数部分:乘 2 取整法。
- 0.125×2=0.25,整数部分 = 0
- 0.25×2=0.5,整数部分 = 0
- 0.5×2=1.0,整数部分 = 1
  1. 科学计数法为 1.0 * 2^-3。

  2. 将 1.0 * 2^-3 转换为 FP32 存储数值:

- S:由于数字为正数,所以符号位为 0。
- M:由于 FP32 的指数偏移量为 127,实际 E 为 -3,所以存储 E 为 -3+127=124,二进制为 01111100。
- E:由于尾数 1.0 的整数位 1 被标准定义省略,则剩下的为 220

最终,将符号位、指数位和尾数位组合在一起,得到十进制数 0.125 的 FP32 浮点数的二进制存储数值为 0 01111100 00000000000000000000000。

同理,得到十进制数 0.125 的 FP64 点数的二进制存储数值为 0 01111111100 0010000000000000000000000000000000000000000000000000。

算力的含义

**算力(Computational Power)**指计算机系统的运算能力,涵盖了 CPU、GPU、TPU、NPU 等运算芯片的能力特征,算力决定了计算机处理信息的速度和效率,是评估计算机整体性能的重要指标。

算力单位:是计算机系统在单位时间内(每秒)能够完成的运算次数,例如:Peta-FLOPS,千万亿次浮点运算/每秒。算力单位 = 算力量级 + 算力类型。

算力类型

  • OPS(Operations Per Second):每秒整数运算次数,通常指的是 INT8、INT16 算力。
  • FLOPS(Floating-point Operations Per Second):每秒浮点数运算次数,通常指的是 FP32、FP64 算力。

算力量级

  • Kilo:千,10^3
  • Mega:百万,10^6
  • Giga:十亿,10^9
  • Tera:万亿,10^12
  • Peta:千万亿,10^15
  • Exa:百亿亿,10^18

为什么常用 FP32 来衡量算力水平?

运算芯片中的 INT8、INT16、FP32、FP64 等部件由于其数值精度和计算效率的不同,决定了它们适用于不同的应用场景,例如:

INT8

  • 精度:存储的是没有小数部分的整数,这种精度更注重速度和效率,而非计算精度。
  • 优势:极低功耗、高吞吐量,适合资源受限场景。
  • 限制:精度损失较大。
  • 适用场景:推理、边缘设备推理、图像分类、低功耗计算。

INT16

  • 优势:相比 INT8 保留更大数值范围,适合需要中等精度但内存受限的场景。
  • 限制:应用场景相对较少,主要在特定指令优化中使用。
  • 适用场景:传感器处理、混合整数运算。

FP16/BF16

  • 精度:在这种精度下数字可能近似表示为 3.14。
  • 优势:能大幅提升计算速度,还能节省内存,在深度学习训练中备受青睐。
  • 限制:精度较低、硬件依赖性强新一代 GPU(如 A100)才能支持,旧设备不兼。
  • 适用场景:大模型训练、轻量模型推理、混合精度训练。

FP32

  • 精度:提供了标准精度,在计算准确性和速度之间达到了较好的平衡,典型的 FP32 数字可能是 3.141593。通常用于一般的 AI 任务。
  • 优势:广泛兼容性,适用于大多数计算任务。
  • 限制:内存和计算开销高于低精度格式。
  • 适用场景:深度学习训练、图形渲染、通用科学计算。

FP64

  • 精度:提供极高的计算精度,比如一个数字可能精确到 3.141592653589793。虽然能为复杂的科学计算提供极高的精度,但计算速度较慢,在典型的 AI 工作负载中并不常用。
  • 优势:提供最高数值精度和动态范围。
  • 限制:算力仅为 FP32 的 1/2~1/4,功耗和成本较高。
  • 适用场景:高精度科学计算、金融建模、核物理模拟。

可见,AI 训练通常采用较高精度(如 FP32 或 FP16),而推理却常用较低精度(如 INT8)。训练和推理的在于训练后模型量化的过程,在训练完成后,将模型参数从较高精度(例如 FP32)转换为较低精度(例如 INT8)。

在训练阶段使用高精度至关重要,因为这有助于捕捉到有效学习所需的细微调整和复杂细节。而训练结束后,这些调整已经稳定下来,模型在较低精度下也能保持良好的性能,这样一来,在推理过程中就能在不明显降低准确性的前提下,大幅提升计算速度。

所以,在 AI 训练热火朝天的今天,FP32 以其广泛的深度学习训练的适用性常被作为一款 CPU 或 GPU 算力高低的衡量标准。这一指标本质上反映了 GPU 处理那些对 AI 来说至关重要的数学运算的速度,比如矩阵乘法(但不限于这一种运算)。

但实际上现在 GPU 芯片除了上述运算部件之外还集成了诸如 Tensor Core 等多种运算部件,并且现在深度学习训练框架也支持混合精度训练,通过结合使用 FP16 半精度和 FP32 单精度浮点数,可以在保持模型精度的同时,减少内存占用和加快训练速度。所以,现如今只讨论单一的算力并不十分严谨,选择何种衡量参数需要根据实际的应用场景来进行考量,包括:权衡计算速度、精度要求和资源限制等因素。

算力的计算方式

CPU FP32

单颗 CPU 的 FP32 算力的理论数值 = CPU 核数 x 单核主频 x 单周期内 FP32 的运算能力

  • CPU 核数:单颗 CPU 有多少颗核心?
  • 单核主频:单颗核心的运算频率是多少?以 GHz 为单位,1GHz 为每秒执行 10^9 个时钟周期,每个时钟周期 CPU 仅完成一个基本的运算指令。
  • 单时钟周期内 FP32 的运算能力:单个核心每个时钟周期内完成的 FP32 运算,单位 FLOPS/Cycle。

以 Intel Xeon Platinum 8280 CPU 为例,有 28 个核心,2.7GHz 主频,执行 AVX512 运算指令的 FP32 运算。AVX512 是 Intel CPU 的扩展指令集,支持 512bit 的向量运算,显著提升并行计算能力。

  1. 计算出单时钟周期内 FP32 的运算能力 = 2FMA x 2MA x (512bit/32bit) = 64FLOPS/Cycle
  • 2 FMA(Fused Multiply-Add,融合乘加):每个 CPU 时钟周期可执行 2 次 FMA 操作,FMA 是一种将乘法和加法操作合并为单一指令的硬件加速技术,即:a=b×c+d,通过减少指令数目、降低延迟和误差提升计算效率。其核心应用场景包括:矩阵乘法、线性方程组求解、神经网络训练与推理中的乘加操作等。
  • 2 MA(Multiply-Add,乘加):每次 FMA 操作完成一次乘法(1 FLOP)和一次加法(1 FLOP),每个 FMA 贡献 2 次 FLOP 运算。
  • 512bit:AVX512 指令每次处理 512bit 的数据,是 AVX512 向量寄存器的宽度。
  • 512bit/32bit:一次 AVX512 能够处理 16 个 FP32 数据。

计算含义是:单个时钟周期内,单个 CPU 核心通过 AVX512 并行处理 16 个 FP32 数据,执行 2 次 FMA 操作,每次 FMA 执行 2 次 FP32 运算。即:每个时钟周期执行 64 个 FP32 运行

  1. 计算出单个 CPU 核心每秒的峰值 FP32 运算能力 = 单时钟周期内 FP32 的运算能力 x 单核主频 = 64FLOPS/Cycle x 2.7GHz = 64FLOPS/Cycle x (2.7 x 10^9)Cycle = 172800000000FLOPS

  2. 计算单颗 CPU 每秒的峰值 FP32 运算能力 = 28 x 172800000000FLOPS = 4838400000000FLOPS / 10^12 = 4.8Tera-FLOPS

最终我们根据公式得到,单颗 CPU 的 FP32 算力的理论数值 = CPU 核数 x 单核主频 x 单周期内 FP32 的运算能力 = [28 x (2.7 x 109) x 64] / 1012 = 4.8Tera-FLOPS

GPU FP32

同理,以 NVIDIA V100 GPU 为例,5120 个 CUDA 核心(内含 FP32),主频 1.53GHz,执行 FP32 FFMA 指令运算,向量寄存器宽度为 32bit。

  1. 计算出单时钟周期内 FP32 的运算能力 = 1FMA x 2MA x (32bit/32bit) = 2FLOPS/Cycle
  2. 计算出单个 CUDA 核心每秒的峰值 FP32 运算能力 = 单时钟周期内 FP32 的运算能力 x 单核主频 = 2FLOPS/Cycle x 1.53GHz = 2FLOPS/Cycle x (1.53 x 10^9)Cycle = 3060000000FLOPS
  3. 计算单颗 GPU 每秒的峰值 FP32 运算能力 = 5120 x 3060000000FLOPS = 15667200000000FLOPS / 10^12 = 15.7Tera-FLOPS

根据公式得到,单颗 V100 GPU 的 FP32 算力的理论数值 = CUDA 核数 x 单核主频 x 单周期内 FP32 的运算能力 = [5120 x (1.53 x 109) x 2] / 1012 = 15.7Tera-FLOPS

在这里插入图片描述

可见,作为同期发布的 Intel Xeon Platinum 8280 CPU 和 NVIDIA V100 GPU 产品(2017~18 年间),两者之间的 FP32 算力分别是 4.8Tera-FLOPS 和 15.7Tera-FLOPS,具有一定的差距,它们有着不同的应用场景。

参考文档

  • https://www.intel.cn/content/www/cn/zh/products/details/processors/xeon/xeon6-p-cores.html
  • https://www.intel.cn/content/www/cn/zh/products/docs/accelerator-engines/what-is-intel-amx.html
  • https://mp.weixin.qq.com/s/0PSYQOV0kVC1b9I_hlpUXg