本文整理自 2023 年 9 月 3 日 QCon 全球软件开发大会 2023 · 北京站主论坛,百度智能云技术委员会主席王耀的同名主题演讲《云计算进入 AI 原生时代》。AI 原生时代,云计算有哪些变化,其中的本质又是什么?
大家上午好,在过去十几年我一直在百度从事云计算相关的工作,今天很高兴可以在这里和大家分享交流。作为云计算从业人员,最近也深刻感受到了大模型对云计算的影响。接下来我将向大家分享一下百度智能云在 AI 原生时代关于云计算的一些思考和实践。
AI 原生时代,云计算有哪些变化,其中的本质又是什么?带着这个问题,首先我们从应用、AI 技术和 IT 基础设施几个线条回顾一下过去几十年的技术发展。
- 应用的开发经历了桌面应用到 2010 年之后的移动应用,再到 2014 年之后的移动原生应用开发的变迁。
- AI 技术从 2012 年 AlexNet 在 ImageNet 大赛中一举夺冠开始,深度学习开始逐步取代传统基于统计学的机器学习方法,成为人工智能的主流算法。同时深度学习也在移动应用上大放异彩,成为很多移动互联网应用的核心竞争力。
- 2006 年 AWS 正式发布了首批云产品(S3 和 EC2),开启了经典云计算时代。2017 年之后云原生催生了新的应用架构和开发方式,大幅提升了移动应用的开发迭代效率,一定程度助力了移动应用市场的繁荣。
我们可以发现,移动应用、深度学习和云计算三个时代在时间上虽然有些重叠,但是各自平行发展,移动应用市场的蓬勃也受益于深度学习和云计算的发展。2022 年大模型兴起,让应用、AI技术和 IT 基础设施产生了交汇,开启了新的 AI 原生时代。AI 原生时代下云计算迎来了产品和技术变革。我们观察到 AI 原生时代云计算的几个显著的变化:- 计算的负载逐步从通用计算向异构计算迁移,通用计算与异构计算都在进行体系结构创新。
- 企业数字化转型与智能化升级加速,推动应用更敏捷更创新。
通用计算我们以云计算最核心的虚拟化为例,KVM 合入 Linux 内核是在 2007 年,OpenStack 第一个版本发布是在 2010 年,Open vSwitch 第一个版本是 2012 年合入 Linux 内核的,LSM 分布式存储的鼻祖 BigTable 论文是 2006 发表的。异构计算是从 2012 年 AlexNet 兴起,再到 2017 年 Transformer 论文发布进入快车道。这些云计算和 AI 领域的核心技术在行业内已经存在了很多年,短期内很难有革命性的创新出来,这意味着计算进入稳态。现在上层的算法和软件研发工作,更多的是在这些成果的基础上进行微创新。同时,在上层的算法和软件进入稳态之后,出于对效率的追求就会催生底层体系结构的创新,来提升计算性能降低计算成本。通用计算和异构计算的体系结构创新是从 2017 年开始的。通用计算方面 2017 年AWS ReInvent 上发布了 Nitro System,用硬件卸载来降低虚拟化开销提升性能。异构计算方面 NIVIDIA 在 2017 年发布了 Volta 架构 GPU V100 支持第一代 Tensor Core,加速深度学习的矩阵运算。Nitro 和 V100 标志着云计算开始从软件定义开始走向软硬协同的新阶段,并越走越远。
这两年大模型横空出世,就像引爆了一颗核弹,通用智能突然就离我们很近了,这背后除了算法的进步更多的是数据和算力的增长。我们来看一下模型训练的计算需求,在 Transformer 之前的模型计算需求每两年增长 8 倍,Transformer 之后计算需求每两年增长 215 倍。
算力增长的背后是大模型的快速发展,这里存在一个大模型 Scaling Laws,更大参数量的模型拥有更好的性能。GPT3 的参数规模是 1750 亿,后面 Google 推出的 PaLM 是 5400 亿,GPT4 没有公布,之前有些材料说是 1.8 万亿。DeepMind 的计算优化语言模型研究也表明,通过加大数据量让模型充分训练可以提升小参数量模型的性能,他们给出的是 D = 20*P,最近国内涌现的大模型训练数据量与模型参数的比例都超过 20 甚至 100。模型训练的计算量为 6*P*D,考虑重计算就是 8*P*D,参数规模 Scale,数据 Scale,算力就会呈二次方 Scale。以 GPT3 为例,175B 的参数和 300B 的训练语料使用了 314 ZFLOPs 的算力,用单卡 A100 312 TFLOPS 来计算需要 32 年。LLaMA 65B 训练了 1.4 万亿Token,在 2048 张卡上训练了 21 天。Scaling Law 的终点在哪里,现在还没有结论,类比人脑的话人脑大概有 60 万亿参数规模,是 GPT-3 参数的 300 多倍,Scaling Law 还将持续多年。
为了支持大模型 Scaling 需要的算力需求,大家开始构建大规模的高速互联集群,在集群上进行分布式混合精度训练。不同于传统应用,AI 原生应用是由代码、数据和模型组成的。- 针对 Code,云原生时代已经有了成熟的 DevOps 解决方案,通过容器和微服务提升开发效率。
- 针对 Data,在传统 Hadoop 生态之外也涌现了一批优秀的开源数据管理软件来做 DataOps 提效。
- 针对 Model,深度学习兴起之后企业都会构建围绕 MLOps 的 AI 中台来加速模型生产效率。
这些工具链虽然能帮助开发者提升开发应用的效率,但是学习和维护这些工具链对开发者有一定成本,无形之中增加了开发者的心智负担。
针对怎么降低开发者在基础设施管理、服务运维和服务扩展性等方面的心智负担这个问题,云计算给出了自己的答案。就是为这些开发工具链提供全面 Serverless 化的云基础设施作为运行层,让开发者把精力都放在代码开发、数据开发和模型开发上,支持应用敏捷创新。通过对上面三个发展趋势的展开分析,我们分析出 AI 原生时代云计算的三个关键技术:- 计算模式进入稳态后,通过软硬协同体系结构创新,实现算力的 Scale-up。
- 通过高速互联通信,进行分布式计算实现算力的 Scale-out,满足算力爆炸式增长需求。
- 通过云产品全面 Serverless 化,实现极致弹性、开箱即用的体验,降低用户开发心智负担,满足应用敏捷创新。
Scale-up 和 Scale-out 实现了算力的弹性,弹性算力又是 Serverless 的基础,全面 Serverless 是云计算的终局,是云计算加速应用创新的根本。2017 年图灵奖颁奖典礼上计算机体系结构领域的泰山北斗 John
Hennessy 与 David
Patterson 对计算机体系结构发展进行了回顾,提出通过 DSA 领域定制架构、开放指令集和敏捷芯片开发模式的创新,预测未来 10 年将会是计算机体系结构的黄金时代。
其中,DSA 三要素:领域独特的并行计算、更有效的内存层次利用、领域专用语言(P4、TensorFlow、Halide)。回到当下云计算主要的通用计算上来,上面提到通用计算的核心是虚拟化。软件定义时代是内核实现虚拟化,性能较差,之后为了提升性能使用用户态 Pulling 提升性能。软件的极致优化下,虚拟化 I/O 性能依然不能匹配算力增长,而且付出了更多的 CPU 资源带来更多的成本。这些虚拟化税,一方面减少了可以售卖的资源量,另一方面也会影响调度的分配率,导致一些碎片。为了解决这些问题,云厂商开始使用 DPU 进行虚拟化的硬件卸载。DPU 对于服务器是一个 PCIe 的设备板卡,但是它上面五脏俱全可以认为是一台小型的服务器。在 DPU 上会有硬件实现的硬件卸载引擎,也有软件实现的管控和卸载引擎,通过软件和硬件协同实现快速的数据处理和转发。软硬协同的核心思想是:数控分离和快慢结合,慢速灵活的控制面和快速固定的数据面。
通过 DPU 硬件卸载虚拟化,可以实现零损耗,也就消除了服务器上的虚拟化税。通过硬件加速虚拟化 I/O 性能,消除虚拟设备和物理设备之间的性能鸿沟。从管控层面也可以统一裸金属、虚拟机和容器的架构,方便统一资源调度。
看完通用计算的 DSA 加速,我们再看下异构计算这部分。GPU 其实从一开始就是DSA 加速。我们看一下最近几年 NVIDIA GPU 架构的演进:- V100 是 Volta 架构,2017 年发布,第一次引入了 Tensor Core,通过低精度加速矩阵运算。
- A100是 Ampere 架构,显存容量和吞吐都有提升,同时引入第三代 Tensor Core,相比 V100 算力增长 1 倍多,并支持 BF16。BF16 和 FP16 虽然都是半精度,但是 BF16 的数值表示范围更大,能够规避一些数值上溢和下溢,使得训练更稳定。A100 这一代还首次引入了 Multi-Instance GPU 来对 GPU 设备进行硬件虚拟化,满足云上灵活的算力分配需求。
- H100 是 Hopper 架构,显存容量虽然没有变大但是吞吐提升 65%,互联带宽提升 50%,CUDA Core 也增加了 1.5 倍,算力提升到 3 倍。在 BF16 的基础上支持了 FP8 数值类型。相比 BF16/FP16 ,这样的半精度进一步计算性能翻倍。FP8 还将尾数和指数长度细分了两类,配合软件的 Transformer Engine 让芯片层自动根据数值区间选择合适的 FP8 格式,在速度和精度上做折中。根据 NVIDIA 的测试结果,FP8 可以基本达到 FP16/BF16 的精度。H100 将 NVLink 升级到第三代,支持 SHARP 层级聚合规约协议,可以实现网络内聚合计算,实测下来能够有 30% 的有效通信带宽提升,对突破通信墙还是有一些价值的。
通过对几代 GPU 架构的分析,可以看到 GPU 的演进理念:- 从算力上来看:通用核数量更多(通用核跟 CPU 一样单核能力提升只能靠主频,提升整体算力得靠增加核数)。从通用核到 DSA(Tensor Core),低精度/混合精度的支持(如 BF16,FP8,INT8,INT4),开始尝试 Transformer
Engine + FP8 这样的软硬结合方案来提升计算能力。
- 从存储上来看:通过升级 HBM,持续提升内存容量与带宽,尝试打破内存墙,方便运算更大参数的模型。
- 从通信上来看,通过升级 NVLink,持续提升通信带宽,并开始支持网络内计算进一步提升有效带宽。
底层体系结构的创新提高了上层通用计算和异构计算的效率。
在 AI 原生时代最重要的工作负载就是大模型。在已经有了 GPU 这样的硬件创新之后,针对大模型在软件层面去做训推优化就成为云计算需要去解决的重要问题之一。我们先从大模型的推理说起,当前的生成式大模型的推理可以分为两个阶段:Context 阶段和 Generation 阶段。Context 阶段是批量计算输入的 Prompt,属于计算密集型。Generation 阶段是逐字生成下一个 Token,属于访存密集型,虽然每一轮 Generation 的计算量小于 Context 阶段,但是访存量相当。大模型推理主要面临三个挑战:显输入输出变长、计算规模大、显存占用大,针对这些挑战当前有多种优化手段进行优化:- 服务层面,打破之前的 Batch 只能同时返回结果的限制,允许部分请求结束后插入新的请求。
- 计算方面,也有一些算子融合,KV Cache 这样的无损加速方案,也有模型量化加速方案,比如 Smooth Quant 量化方案将激活和权重的分布进行平衡来降低模型精度损失。
- 显存方面,Generation 计算的访存密集型可以通过 Flash Attention 优化访存,也可以通过 Paged Attention 方法优化推理过程显存占用从而支持更大的吞吐。
通过这一系列的推理优化,截止到 9 月,文心一言大模型推理性能相比 3 月份上线时提升了 30 多倍。针对模型训练的加速,我们先看一下大模型训练的流程:加载 CheckPoint -> 加载数据 -> 前向计算 -> 反向计算 -> 梯度同步 -> 梯度更新 -> CheckPoint 保存。CheckPoint 和 Data 的读写阶段,对读取的数据进行预读,对 CheckPoint 写入进行异步写入。前向和反向计算阶段,可以采用跟推理阶段相同的计算优化方法,同时针对显存也有一些重计算和分组参数切片的方式来降低模型对显存容量的要求。梯度同步阶段,可以通过降低通信频率,让计算和通信 Overlap 来进行通信优化。前面一部分我们讨论了 AI 原生时代下体系结构的创新,以及针对大模型工作负载在这些体系结构创新上的单机软硬协同优化。
算力优化的方向除了单机 Scale-up 之外,还有一条路是通过网络互联横向扩展 Scale-out。
原 Sun Microsystems 的首席研究员 John Gage 在 1984 年首次提出了「The Network
is the Computer」的论断,预言了分布式计算的未来,通过互联来扩展计算能力。
说到网络互联进行计算的 Scale,我们可以看到最近几年数据中心网络最大的一个变化就是 RDMA 开始普及,并且从商用 RMDA 开始走向自研 RDMA。
- 当前 RDMA 依赖特定网卡硬件,并且要求两端实现一致。不同厂商的网卡乃至同一厂商不同代的网卡也不能很好的 RDMA 互通。
- 海量的连接导致性能退化。网卡片上缓存容量有限当连接元信息超过容量就会跟内存进行 Swap,导致性能退化。
- 互联规模有限制。现有基于反馈的拥塞控制算法在大规模高速网络下不能及时发现和处理网络拥塞,从而限制了网络规模。
针对这三个问题,云厂商都会自研 RDMA 协议,并且将 RDMA 协议也进行 DPU 硬件卸载。设计增强型拥塞控制算法,解决 RDMA 的扩展性问题,支持多条路径传输和乱序完成,这样规避单条路径的拥塞导致的通信的长尾。借助于自研的 RDMA 协议可以实现云基础设施的全面池化,将虚拟机和裸金属实例进行 RDMA 互联,将计算与后端存储资源池进行 RDMA 互联。
RDMA 除了将计算和存储池化,也是构建 AI 高性能网络的核心。AI 高速网络相比 VPC 高速互联有更高的规模和吞吐。针对这些要求我们设计了三级无阻塞 CLOS 网络来支持:- 8 通道架构,面向 AllReduce 优化。8 个 GPU 分别接入 8 条不同通道。每条通道采用 2 级全互联 CLOS。不同通道通过第三级交换机互联。
- 拓扑感知 K8s 调度感知网络拓扑。NCCL 通信感知网络拓扑(LLDP 探测 + PaddlePaddle 适配)。通过机内 NVLink 加速 All2All 异号卡通信。
- 自适应路由。网卡根据数据类型选择性设置标记。交换机针对标记报文逐包动态负载均衡。网卡根据标记处理乱序重排。
- SHARP 网内计算。InfiniBand 和 H800 的 NVSwitch 中支持。发送 2N 接收 2N 降为发送 N+1 接收 N+1 次,IB 上基本可以实现带宽翻倍。由于 NVSwitch 上 N 比较小,同时 SHARP 协议相比 Raw NVLink 有开销,实测下来有 30% 的提升。
除了 GPU 硬件和高速网络之外,大模型的训练还需要强大的分布式计算软件和并行策略。
大模型参数量巨大,无法在单卡和单机上进行训练,就需要进行各种切分来做混合并行。- 竖切:将不同的层分到不同的设备上,称为流水线并行。
- 横切:将同一个层的矩阵乘切分到不同设备上,称为张量并行,也叫模型并行。
- 纵向扩展:将数据切分多组进行并行训练,称为数据并行。数据并行是大模型之前常用的分布式训练策略。
- 模型切分:将模型的参数和优化器状态进行分组,减少显存占用。
- 数据并行:多机组成一个单元,通信量是 GB 量级,单元间进行高效 AllReduce 通信,我们的三层 CLOS 网络架构是面向 AllReduce 优化。
- 流水线并行:多机一组,通信量在 MB 量级,机间同号卡进行 P2P 通信。
- 张量并行:考虑到通信量数百 GB,在单机内并行,借助单机内 NVLink 这样的高速互联通信能力。
结合底层拓扑可以选择出最优的并行策略,把集群计算利用率发挥到最大。有了 GPU、有了高速网络,有了框架 + 并行策略,大模型的训练任务就能跑起来。但是在大规模集群上任务运行过程中,会面临各种硬件和软件故障,而且每天都会发生多次。
比如相比 CPU, GPU 硬件故障率会高很多,另外网络规模大了之后端口和线缆也会有故障的可能。除了各种硬件故障之外还有一些软件故障,以及 Loss 尖峰进行回滚重算,这些都会导致计算任务终止。由于大模型训练中梯度需要同步,整个计算过程是同步的,任何一个故障都会造成整个集群不可用,因此提升整个 GPU 计算集群的有效运行时间成为大模型训练的关键。我们对任务无效训练时间进行分析,它等于故障中断次数 * (任务故障恢复时长 + 任务故障重算时长) + 任务常态写 CheckPoint 总时长。- 通过硬件层面的预检查,避免故障机器上线。提升硬件和网络的故障感知能力,再通过节点热维修或备机替换进行快速容错。
- 任务异常快速感知,进行重调度,并对任务恢复过程中的数据 I/O进行加速。
- 框架层优化 CheckPoint 加载、异步写入以及优化分布式写入。
通过这些优化手段,我们把集群有效训练时间提升到了 95%。最后我们把刚才的分析做个归纳,看怎么在大规模异构计算集群上做端到端的分布式并行训练。- 启动任务之前,先根据模型的计算和通信 Cost Model,同时结合集群物理拓扑,生成最优任务放置策略。
- 任务进行 TP、PP、PP、分组参数切片 4D 混合并行。
2018 年 AWS ReInvent 大会上 AWS CTO Werner Volgels 提出的 21 世纪架构中 20 个有趣的事情中最后一个观点:All The Code You Ever Write Will Be Business Logic。
开发者只应该关心业务逻辑,不用关心基础设施,不用关心开发工具链。Serverless 是实现开发者只需关注业务逻辑的关键,Serverless 具备低基础设施成本、无需运维、高度扩展的特点。
我们讨论 Serverless 的时候,最开始是在云基础设施上的计算和存储 serverless,比如基于安全容器构建的容器实例、函数计算和对象存储等基础设施,但是这些不能满足应用开发者对开发基础设施 Serverless 的需求。于是最近几年云产品开始有全面 Serverless 化的趋势,涉及应用部署,比如 API 网关和日志监控服务等。也有一些 Serverless 化的数据服务,比如数据库和数据仓库。最近新的趋势是人工智能服务也开始全面 Serverless 化,尤其是大模型之后越发明显。
这些全面 Serverless 化的产品,基本上覆盖了 AI 原生应用 DevOps、DataOps 和 MLOps 工具链的全部开发基础设施,降低开发者对应用逻辑之下的基础设施的心智负担。应用类的 Serverless 相对比较容易理解,这里针对数据类服务的 Serverless 展开聊聊。云上的数据库和大数据产品在逐步的从托管的存算一体到云原生的存算分离进行演进,这种存算分离架构的数据栈业界称之为 Cloud-Native Modern Data Stack,典型的代表就是 Snowflake 数仓和 Aurora 数据库。
- 首先是日志即数据或者是数据库,将逻辑变更通过 WAL 持久化并进行复制。WAL 的 Log Stream 可以支持 Time Travel 访问任意时间点的数据状态。
- 使用共享存储进行存算分离,这样可以支持上层计算无状态,计算存储比例不同的场景也可以灵活配比计算和存储。底层共享存储也方便实现不同实例间的数据共享
- 存算分离依赖通过网络读取数据来进行计算,会一定程度造成计算性能下降,这是存算分离相比存算一体架构的主要劣势。针对这个劣势,可以通过上面提到的 RDMA 来加速网络,再就是通过本地 SSD 高速缓存来加速 I/O。
- 存算分离之后的计算负载,由于是无状态可以进行多计算集群的负载隔离避免互相影响,也可以进一步将读写的负载进行分离,避免写入时候的索引构建等工作影响查询的性能,让读写分开按需进行扩展。
有了上面的这些工作之后就可以实现极致的弹性伸缩,在保证性能的情况下获得更低的成本。AI 原生应用的开发技术栈也发生了一些变化,主要特点有三个:自然语言编程、模型即服务、数据驱动。- Data 层:高质量特定领域的数据是模型效果的关键,也是 AI 原生应用竞争力的基础。
- Model 层:有了高质量的数据,在一个优质的基础大模型上进行再训练或微调后得到应用专有的模型,模型开发工具链是整个技术栈的关键。
- Prompt 层:针对公开的大模型或者是微调后的大模型,进行 Prompt 开发和调试找到解决应用需求的最佳 Prompt。
- Chain 层:利用 Prompt 模板 + 编排创建一系列的大模型调用,每个调用的输入与上一个调用的输出相关,搭配向量数据库等记忆组件可以构建特定场景 AI 应用。
- Agents 层:Agent 可以看成是一种更高级的 Chain,借助大模型对某一个任务进行规划,自行创建出模型调用和工具调用的 Chain。甚至可以多个 Agent 协同实现更复杂的任务,比如 MetaGPT 示例中的软件公司有 PM、架构师、RD 等几个角色的 Agent,自动协同完成一个软件开发目标。
针对 AI 原生应用的开发需求,百度智能云推出了千帆大模型平台,集成了百度在大模型方面几乎所有工作。
基础设施层面,包括前面几个部分讲到的大规模集群和训推性能优化的工作。- 数据管理:内置知名公开数据集和清洗组件,支持数据标注、数据增强和数据回流。
- 模型训练:支持 Post-Pretrain、Fine Tunning 和 RLHF。
- 模型评估:对训练后的模型进行自动评估和压缩、加密。
- 模型部署:支持公共 API 共享资源池和 Foundry 独享资源池。
- 插件与应用:内置 AI 原生应用开发的一些中间件,比如 Chain 编排、向量数据库等,以及一些常用工具比如 Search 等。
在基础大模型方面,千帆上不仅包括一方的文心大模型,也包括一些三方商用和开源大模型。千帆大模型平台希望构筑一个繁荣的模型平台,做好模型供应和需求的桥梁,做开发者的开发助手和算力平台。在这个平台上开发者总能找到满足自己需求的模型,不管是直接推理调用还是微调再调用。有很多人讲云计算的本质是弹性,因为云产品都是以弹性 XXX 来命名的。没错,弹性对云计算很重要,除了弹性之外还有安全、性能、成本、可用性。站在一个云计算从业者的角度来,这些都是云计算的基础技术理念,但不是最最核心的本质。弹性是用户看到的云计算的本质,但是从云厂商来看云计算的本质是 Scale。
云计算的 Scale 解决大模型的 Scale,云计算的 Scale 让大模型平台 Serverless 化,助力应用更加敏捷创新!
- - - - - - - - - - END - - - - - - - - - - 百度智能云技术委员会主席王耀受邀担任 QCon 联席主席并将发表主题演讲
大模型时代的 AI 原生云
大模型驱动云计算创新变革
LMOps 工具链与千帆大模型平台
大模型时代的异构计算平台
打造高性能 IaaS 计算架构,百度智能云 DPU 落地实践
大规模 AI 高性能网络的设计与实践
高性能网络建设指南,《智算中心网络架构白皮书》开放下载
面向大数据存算分离场景的数据湖加速方案
数据湖系列之一 | 你一定爱读的极简数据平台史,从数据仓库、数据湖到湖仓一体