大模型缘起
2022 年 11 月底,OpenAI 发布了 ChatGPT,2023 年 1 月注册用户超过一亿,成为历史上增长最快的应用,上一个纪录保持者是 TikTok,注册用户超过一亿用时 9 个月。
随着 ChatGPT 的火爆,国内互联网公司也在纷纷跟进。2023 年 3 月开始,随着百度文心一言和清华智谱的chatGLM的发布,打响了国内大模型的第一枪,各大厂短时间内相继发布了一系列大模型产品。
同时,大模型从chatGPT的语言模型到图像、多模态、空间计算,面向物理世界快速演进。
国内各大小公司垂类大模型涌现,开始寻找解决大模型现实场景问题的路径。
距离上次大众对AI印象深刻还在 2016 年,AlphaGo以 4 比 1 的绝对优势战胜了围棋世界冠军李世石。与1997年超级计算机深蓝战胜国际象棋世界冠军卡斯帕罗夫采用的专家系统不同的是,围棋采用的数学模型是通过机器学习实现的。
机器学习
排名前10的机器学习算法
以最简单的一元线性回归方程为例子,帮助理解机器学习
表达式:y=ax+b
一元线性回归算法使用的核心是最小二乘法,如下图,在有n个点的情况下,需要进行4n次乘加运算 (乘法运算与加法运算的组合,将乘法运算结果累加)。而得出参数a、b以后计算y值只需要进行一次乘加运算 。
那么通过用机器学习算法相关术语描述上述一元线性回归方程可以得出:
将一元线性回归算法推广到多元非线性函数,实际上就是用线性多项式函数无限逼近无理函数(非整数次幂函数)和超越函数(指数/对数函数、 三角/反三角函数、双曲/反双曲函数),基于深度学习算法计算出的结果,就是多项式中各项的系数,即模型的权重参数。
机器学习 指的是,先构建一个参数待定的高次线性方程模型,再输入大量的训练样本(也就是方程模型中自变量及因变量的值),让计算机算出方程模型的参数。该参数被称为权重 ,该步骤被称为训练 。而基于机器学习得到的方程模型。通过输入自变量得到因变量的过程,被称为推理 。
AI大模型对计算机硬件的需求
乘加运算在计算机领域一般称为“向量点积”或者“向量卷积”。绝大多数机器学习算法的核心运算都是向量卷积运算。简单来说,AI大模型对计算机硬件的需求就是能够并行批量的进行乘加运算。
CPU
中央处理器(central processing unit),作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。
约25%的ALU(算术逻辑单元) :负责执行基本的算术运算(如加法、减法)和逻辑运算(如与、或、非)。
约25%的Control(控制单元) :负责指令的解码、执行顺序的控制以及数据路径的选择,处理复杂的逻辑控制。
约50%的Cache(缓存单元) :用于存储频繁访问的数据,以减少访问主内存的时间延迟。
复杂的控制逻辑 :需要处理复杂的指令集,并协调多个运算单元的工作。
多层次的缓存 :用于存储频繁访问的数据,提高数据访问效率。
一个CPU core 包含一个或多个ALU。
Intel x86 架构(如 Intel Core 系列)
现代 Intel Core 系列处理器通常具有多个 ALU。以 Intel Skylake 微架构为例,一个核心包含 4 个整数 ALU 和 2 个浮点 ALU。
ARM 架构(如 ARM Cortex-A 系列)
ARM Cortex-A 系列处理器中的核心包含多个 ALU。例如,Cortex-A72 核心有 2 个整数 ALU 和 2 个浮点/矢量 ALU。
虽然CPU的ALU肯定是支持乘法指令和加法指令的(乘加向量卷积),但由于数量远少于GPU,所以运算效率会很低。虽然Intel和AMD等厂商在ALU中增加SIMD运算单元 ,在一条指令中计算多个数据,并且引入了MMX(0-7)寄存器 ,但受限于CPU的设计实现,这些加速计算的措施并不能显著提高并行计算的效率 (例如128bit寄存器只能存储16个打包的8bit数据),即使现代 CPU 支持更大位宽的寄存器,如 AVX-512
GPU
图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。
约90%的ALU(算术逻辑单元) :负责执行大量的简单运算,如矩阵乘法、向量卷积等。
约5%的Control(控制单元) :负责基本的数据控制和数据转发。
约5%的Cache(缓存单元) :用于存储频繁访问的数据,但规模相对较小。
较小规模的缓存:主要用于存储频繁访问的数据,减少数据传输延迟。
在 CPU 中,缓存的主要目的是存储频繁访问的数据,以减少访问主内存(DRAM)的时间延迟。缓存通常包含最近使用过或即将使用的数据,这样可以快速访问这些数据,提高整体性能。
在 GPU 中,缓存的设计和用途有所不同。GPU 的缓存主要用于服务于线程(thread),而不是简单地存储频繁访问的数据。
如果有很多线程需要访问相同的内存位置(例如,同一张纹理图中的一个像素值),GPU 的缓存会合并这些访问请求。
这意味着缓存不仅仅是为了存储数据,更重要的是为了合并来自多个线程的重复访问请求。
当多个线程需要访问相同的内存位置时,GPU 的缓存会先检查是否有缓存命中(hit)。
如果命中,则直接返回缓存中的数据;如果没有命中,则缓存会从 DRAM 中读取数据,并将结果返回给所有需要的线程。
这种合并访问的方式可以显著减少 DRAM 的访问次数,从而提高整体性能。
虽然GPU是为了图像处理而生的,但是通过前面的介绍可以发现,它在结构上并没有专门为图像服务的部件,只是对CPU的结构进行了优化与调整(将CPU结构修改,牺牲执行复杂计算的能力,增强并行简单计算的能力) 。所以现在GPU不仅被运用到图像处理领域,还被用来科学计算、密码破解、数值分析,海量数据处理(排序,Map-Reduce等),金融分析等需要大规模并行计算的领域。
CPU和GPU都是较为通用的芯片。
TPU
张量处理器(Tensor Processing Unit):是谷歌专门为加速深度神经网络运算能力而设计的一种定制化硬件加速处理器(张量专用,专为 TensorFlow 框架设计)。向量是一个一维张量。
专为处理大规模的并行计算任务而设计,擅长计算矩阵和向量,精简了其他计算功能。
TPU 的 ALU 数量远多于 CPU 和 GPU,以支持高效的并行处理(数万个)。
TPU在芯片上使用了高达24MB的局部内存,6MB的累加器内存以及用于与主控处理器进行对接的内存,总共占芯片面积的37%。与同期的CPU和GPU相比,可以提供15-30倍的性能提升,以及30-80倍的效率(性能/瓦特)提升。主要有两个原因:
无论是CPU还是GPU,所有运算过程的中间结果都需要被保存在内存中,而TPU根本没有将中间结果保存到内存中,而是在执行完毕直接将中间结果传递给下一步骤。
片外内存访问是GPU能效比低的罪魁祸首 (2024年的今天,RAM的读取和写入时延一般在100ns的数量级,而100ns够GPU的每个cuda core都完成100次左右的运算),所以谷歌不惜成本的在芯片上放了巨大的内存。相比之下,英伟达同时期的K80只有8MB的片上内存,因此需要不断地去访问片外DRAM。
低精度运算带来的算法准确率损失很小,但是在硬件实现上却可以带来巨大的便利,包括功耗更低、速度更快、占芯片面积更小的运算单元、更小的内存带宽需求等,TPU采用了8比特的低精度运算。
举例:如果外面下雨了,你其实并不需要知道每秒到底有多少滴雨, 而只要知道雨是大还是小。与此类似,神经网络通常不需要 16/32bit 浮点数做精确计算,可能 8bit 整型预测的精度就足以满足需求了。
NPU
神经网络处理器(Neural Processing Unit)是专门用于加速神经网络计算的硬件单元
效率更高,功耗更小,响应更快,适合用在手机、边缘计算、物联网等等场景。
设计原因:
在神经网络中,每个神经元接收输入信号,然后通过突触权重(权重乘法)和偏置项(加法)计算出激活值,再通过激活函数(如ReLU、sigmoid等)得到输出。
突触权重通常是实数,可以正可以负,表示神经元之间的连接强度。这些权重是在训练过程中通过反向传播算法不断调整优化的。神经突触通常涉及乘法、加法、激活函数等几种运算。
传统的冯·诺伊曼架构(如 x86 和 ARM 处理器)在执行上述运算时效率较低,因为它们需要多次加载数据、执行乘法和加法,然后存储结果。这种存储和计算分离的结构导致了大量的数据搬运开销。
由于深度学习的基本操作是神经元和突触的处理,而传统的处理器指令集(包括x86和ARM等)是为了进行通用计算发展起来的,其基本操作为算术操作(加减乘除)和逻辑操作(与或非),往往需要数百甚至上千条指令才能完成一个神经元的处理,深度学习的处理效率不高。
突破经典的冯·诺伊曼结构!神经网络中存储和处理是一体化的------>集成在现代处理器中的神经网络加速单元
用途:
TPU 主要用于大规模的训练任务,适合云平台部署。
小结
大模型时代的AI算法,在本质上是通过多个线性幂函数的叠加来逼近现实世界中事物的数学模型。
计算这些线性幂函数的参数的过程,就是所谓的调参。这个计算过程中要进行大量的乘加运算。
因此随着AI算力需求的增长,按照需求领域专用化路线 演进,将针对AI算法不同需求的优化到了极致。