知乎上看到方佳瑞博士的一篇文章《LLM分离式推理可能带来的软硬件变革的迷思》
恰逢这周工作上有一些和HugeCTR相关的事情, 那么就从软硬件一体化的视角来阐述一下整个架构的演进, 特别是在分离式推理架构上.
1. 推理系统和训练系统的区别
最简单的一句话是: 推理系统没有所谓的DP并行. 背后隐藏的一个含义是两个系统的Workload是完全不一样的.
1.1 训练系统
到达速率和服务速率为确定性分布
在训练系统中数据以Batch的方式到达, 然后计算时间也相对确定, 一方面是因为backward过程的同步需求, 另一方面是训练语料本身有长短的分布但也做了Padding, 当然可以通过一些技术对Padding进行优化提升计算效率.
1.2 推理系统
到达速率假设为泊松分布, 服务速率受实现方式和服务策略影响
推荐系统请求到达的分布假设是一个泊松分布, 另一方面input token和output token的分布则会带来服务时间有一个特定的分布, 简单的来看按泊松分布算, 或者有长尾的情况,例如Pareto分布.而Prefill-Decoder的方式也会影响这个分布, 因此在调度系统上该如何考虑是一个更值得深思的问题. 这些问题也是最近一段时间工作的一个方向.
1.3 推理系统SLO
对于不同的用户而言(例如按照充值程度分金/银/铜)SLO是不同的, 针对不同的SLO下的TTFT/TBT的整个推理系统的优先级调度和延迟隐藏也有很多可以去做的事情. 另一个非常重要的工作是对用户请求的服务时间的预测
推理系统的请求和服务时间分布相对于训练系统更加有不确定性, 因此在各个子系统内的调度编排和Locality的利用上以及时间/空间折中处理上有着巨大的创新空间.其实这也是Prefill-Decode/KV-Cache Centric Sched有收益的本质原因.
接下来我们分别从软件系统和硬件系统来谈谈.
2. 软件架构
从软件架构来看, 数据和控制平面的分离是一个非常经典的设计模式.
2.1 控制面
控制平面主要负责一些用户请求服务时间预测/调度/集群管理和高可靠/Cache及相关的分离式内存池管理的任务, 这些任务从架构上来看应该用通用的CPU进行处理.
2.2 数据面
数据面主要是用于计算的Prefill Node和Decode Node以及一些弹性内存池相关的数据搬移的工作. 从数据面来看, 其缓存结构在推荐系统中已经有很好的借鉴, 那就是HugeCTR一类的框架中的Hierarchical Parameter Server
从Embedding Cache变成了需要在LLM处理KVCache, 但是相应的软件栈和结构还是有区别的. Embedding TableLookup更多的是Hash Lookup ExatclyMatch. 而在LLM中KVCache的处理是一个Longest Prefix Match. 因此CPU Memory和SSD的软件架构还需要一些调整.
2.3 存储设计和内存缓冲池
当然系统也会面临DRAM不够的问题需要落盘. 然后既要SSD容量大又要高I/O,同时还要考虑低成本和可运维. 因此在SSD前面构建一个分布式的弹性内存池应该是必须要做的了, 这里有一篇华为《MemServe: Context Caching for Disaggregated LLM Serving with Elastic Memory Pool》[2]
另一个业务场景是DeepSeek会将用户的上下文落盘到SSD中并保存24小时. 那么相应的软件架构应该就很好构建了.
我们可以通过Trie树或者TreeBitMap的算法来构建整个查询树.
当访问到一个叶子后, 即记录该叶子对应的KVCache所在的内存的节点ID和指针并放入处理List, 以便以后进行异步的DMA/RDMA. 这些在用户请求到达后即可进行异步执行处理并在队列适当的时候由调度器控制执行相应Prefill Node GPU VRAM的Prefetch.
Trie树也可以根据input token做一些并行化的处理方式, 例如通过一致性Hash针对前几个Token将workload分散到不同的CPU服务器上. 而这些服务器又可以构建成一个很大规模的弹性内存池.
对于弹性内存层的Cache Evict可以按照LRU的方式进行, 落盘的时候还需要考虑一些KVCache生命周期的问题. 落盘后也需要对Trie树进行更新将其相应的叶子节点指针更新到指向某个文件的特定的块.
谈到落盘,可以借鉴类似于LSM的方式合并压缩后落入磁盘, 并且还可以根据实际情况进行冷温热分层. 因此对于存储落盘到SSD的场景, 个人并不是很喜欢在GPU实例上的本地SSD, 损坏后维修带来的业务影响还是有的, 另一方面可能还会带来一些workload偏斜的影响, 因此可能更倾向于一种分布式并行存储的方式.
当然这里还有一个不同的地方是对于长时间没有更新的block也需要定期的进行GC, 例如按照DeepSeek保留24h的做法, 可以对超过24h的数据删除并在Trie树上剪枝更新.
3. 硬件架构
3.1 三网融合的推理系统
黄大年茶思屋最近也有一篇《英伟达、谷歌、Meta等5大巨头Scale-up超节点规模大比拼,揭示未来AI网络最优解》[3]. 个人对这种不根据workload来谈互联的分析持怀疑态度, 但是有些结论是正确的. 其中最重要的一点就是“三网合一”即文章中的观点
当前的AI网络是三个独立网:前端存储网VPC(以太)、后端参数面(IB、RoCE2)和超节点(NVLink,HCCS)。三个网长期共存不合理的,一定会融合。
当然这个问题在方博士的文章中也有提及:
现在分离式架构都是用GPU训练集群做推理,节点内NVLink互联,节点间用IB或ROCE的RDMA互联。这种配置分离式架构完全是浪费,好比李云龙攻打平安县城,章明星称之为富裕仗。
有几个难题:
3.2 FrontEnd: CPU实例和GPU实例耦合
在这样的一个推理系统中, NVL72-GB200是一个非常不错的方案, ScaleUP规模大, 而CPU又直接和GPU有C2C的带宽, 这样控制面和弹性内存池的设计难度会小不少.另一个问题是泊松分布到达下GPU的调度的问题,这个涉及一些GPU本身SIMT硬件架构的缺陷, 就不展开了.
而对于国内非Grace-B/H的大概只能通过RDMA将弹性内存池和GPU连接了, 因此需要VPC上跑超大规模RDMA并且完全商用的, 现阶段全球能做的大概也就只有AWS SRD/Google Falcon和阿里云eRDMA. 而同时在这个网络上又要兼顾Prefill Node之间的SP并行带来的alltoall incast的影响, 对于其它很多客户而言, 包括英伟达自己都是有很大挑战的.
为什么需要呢, 从另一个角度来看,现在的Prefill/Decoder的转移其实都是在8卡PCIe连接的同服务器的CPU上,然后再通过Messenger转发到另一个Decoder实例, 并通过Async Load加载. 也就是说CPU的算力和内存空间和GPU是绑定的, 外置的CPU服务器如果可以直接GDR访问GPU显存来做异步的调度和prefix lookup整个的性价比还应该有所提升.
我们注意到Google Vertex AI很早就通过一些闲置的CPU实例和GPU混布来构建, 并且通过CPU实例来做参数服务器,当然还有一个是Cerebas的Swarm-X/Memory-X架构
另外Enfabrica也有一些机会,难怪NV也投资了.
3.3 ScaleOut: Prefill-Decode M:N的部署
即章明星老师提到的异构分离式架构, 需要在H800/A800和H20之间构建很高的Bi-Section带宽, 同时考虑到组网规模的问题还需要避免网络上hash冲突带来的利用率降低的问题.
3.4 ScaleUP: 是否还需要Load/Store ?
针对推理系统来看, ScaleUP主要用于TP/SP并行,例如模型规模大了或者算力无法满足SLO时或负载均衡的考虑带来的并行策略. 细粒度的Load/Store访存似乎并不需要,因此Eth-X这样的方案或许也就够用了.当然还有一些优化方式,例如英伟达的GPS/PROACT/Fine-PACK的处理方式等. 当然另一方面有现成的NVLink用用也挺好的. 等待UALink似乎又要考虑一些问题, 例如BRCM Altas4的single vendor供应的问题和InfityFabric这些IP的成熟度, 当前的国产GPU厂商可能面临二选一的决策, 但是还是请先考虑是否还需要Load/Store over Scale-UP Link.
这个问题的答案取决于业务部署模式的考虑,成本的衡量,弹性的重要程度,是否训推一体,生态的兼容程度等. 未来多模态的业务场景也是一个变数.
3.5 弹性和成本视角
方博士也提到了一个问题Prefill和Decode Instance弹性扩缩容
因为Prefill和Decode各自子集群网络互联可以用以太网,没准也可以根据负载弹性扩容Memory Pool和计算设备和存储。
其实最终都是在成本上打算盘, 以后的服务就是按照Token印钱, 印刷机的成本, 推理流量的峰谷带来的弹性供给, 都是值得考虑的问题.
当然具体的方案就不展开写了…几年前就探索过的工作
本质的难题当时也讲清楚了,内存的两个墙
这样不就好了?
当然还有一些随路计算的东西,BRCM INCA/ NV SHARP也行, 网卡做Reduction/all-gather也行, 都是几年前全做好的
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。