AI Infra 和传统 Infra 有什么区别?程序员积累的技术栈和方法论✿◈ღღ,如何复用到 AI 系统架构设计上?

  随着大模型技术的爆发✿◈ღღ,AI Infra 已成为基础设施领域的核心战场✿◈ღღ。过去1年多的时间✿◈ღღ,我们QQ基础架构算法工程团队落地了多个大模型应用✿◈ღღ,包括语音合成大模型✿◈ღღ、内容理解多模态大模型✿◈ღღ、生成式推荐大模型✿◈ღღ,跑通大模型训练到推理的全链路✿◈ღღ。踩了很多坑人生就是博✿◈ღღ,也积累了不少经验✿◈ღღ。本文将分享传统后台工程师积累的技术栈和方法论✿◈ღღ,如何延续并迁移到 AI 系统✿◈ღღ,并系统性拆解 AI Infra 的硬件✿◈ღღ、软件✿◈ღღ、训练和推理挑战✿◈ღღ。

  经济基础决定上层建筑✿◈ღღ。软件层面的架构设计✿◈ღღ,无法脱离硬件约束✿◈ღღ。了解现代 AI 硬件特性非常有必要✿◈ღღ。

  传统基础设施以 CPU 为核心✿◈ღღ,通过多线程和微服务构建分布式系统✿◈ღღ,处理高并发请求(如 Web 服务)✿◈ღღ。这些都有成熟的方法论了(如海量服务之道)✿◈ღღ。主要工作是逻辑事务的处理✿◈ღღ,瓶颈在网络 I/O 和 CPU 核心数量✿◈ღღ。发展到今天✿◈ღღ,硬件已经很少是制约 CPU 系统设计的瓶颈✿◈ღღ。

  而 AI Infra 以 GPU 为核心人生就是博✿◈ღღ,其设计目标从逻辑事务处理转向高吞吐浮点计算✿◈ღღ。此时CPU 多线程被 GPU 并行计算替代✿◈ღღ,内存被显存替代✿◈ღღ。如下图所示✿◈ღღ,H20单卡96GB显存✿◈ღღ,可以提供44TFlops的单精度浮点运算✿◈ღღ,算力和访存带宽是主流CPU数十倍甚至数百倍✿◈ღღ。每台机器安装8卡=768GB显存✿◈ღღ,另外还有 CPU 192核384线TB 内存✿◈ღღ。

  为什么 GPU 会成为核心?是因为 LLM 大模型每次生成一个 token✿◈ღღ,都需要读取全量的模型参数✿◈ღღ。传统的 CPU + 内存的算力和带宽无法满足如此恐怖的计算密度✿◈ღღ,计算和通信都必须转移(offload)到 GPU 内完成✿◈ღღ。CPU 成为数据搬运工和“辅助处理器”✿◈ღღ。

  为了更直观地理解这个计算密度✿◈ღღ,我们做一个简单的计算✿◈ღღ。不考虑计算的延时✿◈ღღ,LLM 大模型生成一个 token 的耗时公式计算为

  显而易见✿◈ღღ,我们的现在身处新的一轮烈火烹油的硬件革命的历史进程中✿◈ღღ,各种专用硬件✿◈ღღ、专用网络层出不穷✿◈ღღ。DeepSeek-R1 和 QWen3-235B 千亿级参数训练需千卡 GPU 集群协同✿◈ღღ,通过专用网络互联构建“AI超算”✿◈ღღ,其设计逻辑与以前的 IBM 大型机惊人相似——以硬件集中化换取极致性能与可靠性✿◈ღღ。

  传统 Infra 的分布式理念貌似在 AI 时代失效了✿◈ღღ。传统 Infra 追求横向扩展✿◈ღღ,而 AI Infra 呈现 “AI 大型机”特性✿◈ღღ,是因为传统后台服务的可以容忍毫秒级延迟✿◈ღღ,但 AI 集群不行✿◈ღღ,GPU 的算力是 CPU 的数百倍✿◈ღღ,微秒级的延时等待也会造成很大的算力损耗✿◈ღღ,需要硬件的高度集成✿◈ღღ。在可预见的1-3年的未来✿◈ღღ,这样的专用硬件+网络的集中式架构很难发生比较大的改变✿◈ღღ。

  回顾历史✿◈ღღ,我们总是在寻求科技平权✿◈ღღ。前人推动“去IOE”(IBM小型机✿◈ღღ、Oracle数据库✿◈ღღ、EMC存储)✿◈ღღ,用分布式廉价x86 pc机替代集中式高端硬件✿◈ღღ,本质上是利用软件创新重构一个高可用+低成本的互联网基础设施✿◈ღღ。AI大型机是技术发展必由之路✿◈ღღ,但不是终极形态✿◈ღღ。长期(5年)来看人生就是博✿◈ღღ,必然会出现 AI 去 NVIDIA 化✿◈ღღ,重演“去 IOE”的历史✿◈ღღ。

  相比传统后台应用的增删查改✿◈ღღ,AI 应用的新范式是模型训练和推理✿◈ღღ。模型训练是指通过海量数据拟合出一个复杂的神经网络模型✿◈ღღ,推理就是利用训练好的神经网络模型进行运算✿◈ღღ,输入的新数据来获得新的结论✿◈ღღ。

  举个例子✿◈ღღ,训练就是根据 年龄, 身高 的分布使用最小二乘法拟合模型 y = ax + b✿◈ღღ,推理就是利用这个模型 y = ax + b✿◈ღღ,输入一个新的年龄✿◈ღღ,预测身高✿◈ღღ。

  工欲善其事✿◈ღღ,必先利其器✿◈ღღ。传统后台应用依赖 tRPC 或 Spring 等微服务框架✿◈ღღ,帮助我们屏蔽负载均衡✿◈ღღ、网络通信等底层细节麻美✿◈ღღ,我们可以把精力放在业务实现上✿◈ღღ。

  与之相似麻美✿◈ღღ,AI 应用则依赖深度学习框架✿◈ღღ。如果没有深度学习框架✿◈ღღ,我们就可能陷入在茫茫的数学深渊中✿◈ღღ,挣扎于痛苦的 GPU 编程泥潭里✿◈ღღ。有了深度学习框架✿◈ღღ,我们才可以把所有精力花在设计模型和创新本身上✿◈ღღ,而不用关注底层的实现细节✿◈ღღ,极大降低了 AI 应用的门槛✿◈ღღ。

  大家可能听说过不同的深度学习框架——Tensorflow✿◈ღღ,PyTorch✿◈ღღ。现在是2025年✿◈ღღ,不用纠结选哪个✿◈ღღ,因为 PyTorch 就是 AI 模型训练✿◈ღღ、推理的深度学习框架的事实标准✿◈ღღ。开源模型和代码都是 PyTorch 一边倒✿◈ღღ。

  得益于动态计算图✿◈ღღ、自动微分和丰富的 Tensor操作算子✿◈ღღ,PyTorch 能帮助我们快速实现模型设计✿◈ღღ。如下图所示✿◈ღღ,只需要描述模型结构+待学习的网络参数✿◈ღღ,不需要关心数学计算和 GPU 编程的细节✿◈ღღ。

  绝大部分的 AI 应用✿◈ღღ,的确不需要我们手写数学计算的 GPU 代码麻美✿◈ღღ。但为了满足模型创新的需求✿◈ღღ,有必要学习 GPU 编程✿◈ღღ。例如 Meta 发布的 HSTU 生成式推荐模型✿◈ღღ,核心的 hstu_attn 计算✿◈ღღ,如果直接用 PyTorch 框架算子组合实现✿◈ღღ,则时间复杂度为 O(M * N²) ✿◈ღღ,其中 M 和 N 是一个数量级✿◈ღღ,相当于O(N³) ✿◈ღღ。但是通过自定义内核✿◈ღღ,可以优化到 O(N²)✿◈ღღ。

  在 GPU 核心上运行的代码片段称为内核(kernel)✿◈ღღ。编写高性能的 CUDA 内核需要丰富的经验✿◈ღღ,并且学习曲线陡峭✿◈ღღ。因为我们习惯于传统 CPU 编程处理串行的计算任务✿◈ღღ,通过多线程提高并发度✿◈ღღ。而 GPU 采用 SIMT 架构✿◈ღღ,有大量计算单元(CUDA Cores)和数万个线程✿◈ღღ,但是被分组后的线程同一时刻只能执行相同的指令✿◈ღღ。这与传统CPU的串行思维✿◈ღღ、不同线程处理不同任务✿◈ღღ,存在根本性冲突✿◈ღღ,导致 GPU 编程学习难度大✿◈ღღ。

  现在推荐使用 Triton 编程语言完成 GPU kernel 的开发人生就是博✿◈ღღ,它提供类似 Python 的语法✿◈ღღ,无需深入理解 GPU 硬件细节(如线程调度✿◈ღღ、共享内存管理)✿◈ღღ,而且和 PyTorch 深度学习框架的生态结合更好✿◈ღღ。推荐这个 Triton-Puzzles-Lite 项目用作 Triton 的入门学习✿◈ღღ。

  以前大部分模型还可以轻松导出 ONNX✿◈ღღ、TorchScript 等用 C++ 部署✿◈ღღ,现在随着对模型的细粒度优化和控制越来越多✿◈ღღ,比如 KV Cache✿◈ღღ、MoE/模型并行✿◈ღღ、复杂的if/for控制流✿◈ღღ、自定义 Triton 算子等✿◈ღღ,模型越来越难以脱离 Python 的控制部署✿◈ღღ。笔者也从“C++ Boy”变成“Python Boy”✿◈ღღ。

  我们一直追求更大的模型✿◈ღღ,DeepSeek-R1 有数千亿参数✿◈ღღ,使用了数十万亿 token 的训练数据✿◈ღღ,涉及算力✿◈ღღ、存储✿◈ღღ、通信等多维度的工程挑战✿◈ღღ。有了 PyTorch 深度学习框架✿◈ღღ,只是 AI 应用落地的万里长征第一步✿◈ღღ。接下来我们将讨论深度学习框架之上的模型训练的挑战麻美✿◈ღღ。

  DeepSeek-R1 模型大小=670GB✿◈ღღ,而一台 GPU 服务器有8张H20卡✿◈ღღ,提供768GB显存✿◈ღღ,足够存下一个完整的 DeepSeek 模型✿◈ღღ。那整个行业为什么还投入大量的人力物力✿◈ღღ,顶着通信延时造成的算力损耗✿◈ღღ,也要建设分布式 GPU 集群?核心原因是单台 GPU 服务器“存不下”✿◈ღღ。

  如下图所示的模型✿◈ღღ,x1/x2/x3/x4 这些中间变量就是中间激活✿◈ღღ。它们是神经网络前向传播(Forward)的“堆栈帧(Stack Frame)”——记录每一层处理后的数据快照✿◈ღღ,确保反向传播(Backward)可回溯梯度人生就是博✿◈ღღ,根据预测误差调整模型权重✿◈ღღ,最小化损失函数麻美✿◈ღღ。

  这些中间激活为什么会成为显存刺客?是因为中间激活的空间复杂度是和输入数据长度正相关的✿◈ღღ,特别的✿◈ღღ,对于 LLM 来说是O(N²)正比于输入数据长度的平方✿◈ღღ,这是一个指数爆炸式增长的数字✿◈ღღ。类似函数递归不断增长的“堆栈帧”导致的内存溢出✿◈ღღ,我们遇到了AI Infra 的 OOM(Out of Memory)挑战✿◈ღღ。

  借助 PyTorch 的 profiler 工具✿◈ღღ,我们可以直观地看到这个OOM✿◈ღღ。下图是训练过程中不同阶段的显存分配✿◈ღღ,包括模型参数(Parameter)✿◈ღღ、优化器状态(Optimizer state)✿◈ღღ、中间激活(Activation)✿◈ღღ、梯度(Gradient)✿◈ღღ。在前向传播结束后出现一个显存占用(中间激活)的尖峰✿◈ღღ,远大于模型参数本身✿◈ღღ。

  传统后台服务使用分片(Sharding)策略解决单机存不下的问题✿◈ღღ。与之相似✿◈ღღ,AI Infra 提出“模型并行”✿◈ღღ,就是将单个大模型拆分为多个子模块✿◈ღღ,并分布到不同 GPU 上协同工作✿◈ღღ,通过通信来共享数据✿◈ღღ。有不同的“拆分模型”策略✿◈ღღ,例如按模型模块划分✿◈ღღ,按张量(Tensor)划分的✿◈ღღ,也可以将多种拆分方法结合起来一起使用✿◈ღღ。PyTorch 深度学习框架和开源方案 Megatron 都能帮助我们高效地实现模型并行✿◈ღღ。

  建设分布式 GPU 集群的原因✿◈ღღ,一个是因为“单机存不下”✿◈ღღ,另外一个是提升训练速度✿◈ღღ。但简单的机器堆叠✿◈ღღ,算力不一定有线性的增长✿◈ღღ。因为分布式训练并不是简单地把原来一个 GPU 做的事情分给多个 GPU 各自做✿◈ღღ。需要协调多个 GPU 机器计算任务分配✿◈ღღ,GPU 机器之间的数据传输会引入网络IO和通信开销✿◈ღღ,降低训练速度✿◈ღღ。

  如下图所示的常规训练时序是串联式的✿◈ღღ,存在许多网络 IO✿◈ღღ,GPU 利用率低✿◈ღღ,训练速度慢✿◈ღღ。我们希望 GPU 大部分时间都在计算✿◈ღღ,而不是花在数据传输或等待其他 GPU 的工作上✿◈ღღ。

  传统后台服务我们通过多线程或异步 IO 避免阻塞 CPU 主线程✿◈ღღ,与之相似✿◈ღღ,AI Infra 提出通信计算重叠的方法论✿◈ღღ。GPU 编程模型中有流(stream)的概念✿◈ღღ,一个流表示一个 GPU 操作队列✿◈ღღ,该队列中的操作将以添加到流中的先后顺序而依次执行✿◈ღღ。不同流之间可以并行执行✿◈ღღ。那么通过令计算和通信操作加入不同的流中✿◈ღღ,可以做到二者的执行在时间上重叠人生就是博✿◈ღღ。例如 TorchRec 的 训练流水线 能帮助我们实现高效的通信计算重叠✿◈ღღ。

  AI 模型训练成本很高✿◈ღღ,优秀如 DeepSeek 也要烧掉500万美金✿◈ღღ,但再贵也只是一次性的麻美✿◈ღღ。而模型推理的成本更高✿◈ღღ,因为用户越多✿◈ღღ,AI 模型推理次数越多✿◈ღღ,总成本越高✿◈ღღ。模型推理面对的挑战和传统 Infra 非常相似✿◈ღღ,主要是2个挑战✿◈ღღ:高吞吐(降本)✿◈ღღ,低延时(增效)✿◈ღღ。

  现在的 AI 模型越来越多地直面终端用户✿◈ღღ,需要和用户进行实时的交互✿◈ღღ,例如文本对话和语音合成✿◈ღღ。模型推理耗时过高✿◈ღღ,会直接造成用户体验受损✿◈ღღ,用户流失与转化率下降✿◈ღღ。

  传统后台服务我们使用链接复用✿◈ღღ、缓存✿◈ღღ、柔性等技术降低系统响应时间✿◈ღღ。AI Infra 也有相似的做法✿◈ღღ。

  在 GPU 编程模型中✿◈ღღ,CPU 和 GPU 是异构的✿◈ღღ,CPU 通过 API(例如 CUDA API) 向 GPU 提交任务✿◈ღღ,然后异步等待 GPU 的计算结果返回✿◈ღღ。GPU 收到任务后✿◈ღღ,会执行内核启动✿◈ღღ、内存拷贝✿◈ღღ、计算等操作✿◈ღღ。这个过程中✿◈ღღ,涉及到 CPU 与 GPU 之间的通信✿◈ღღ、驱动程序的处理以及 GPU 任务的调度等环节✿◈ღღ,会产生一定的延迟✿◈ღღ。模型推理需要执行大量重复的 GPU 操作✿◈ღღ,每个的 GPU 操作都要重复执行上述环节✿◈ღღ,这些非核心的 GPU 开销会成倍数地放大✿◈ღღ,影响最终响应时间✿◈ღღ。

  在传统后台服务✿◈ღღ,我们使用 Redis 的 Lua 脚本封装多个 Redis 操作和计算逻辑✿◈ღღ,一次提交✿◈ღღ,减少网络开销✿◈ღღ。与之相似✿◈ღღ,AI Infra 利用 CUDA Graph 技术将多个 GPU 操作转化为一个有向无环图(DAG)✿◈ღღ,然后一次性提交整个 DAG 提交到 GPU 执行麻美✿◈ღღ,由GPU自身来管理这些操作的依赖关系和执行顺序✿◈ღღ,从而减少 CPU 与 GPU 之间的交互开销✿◈ღღ。

  LLM 大模型推理存在大量矩阵乘法运算✿◈ღღ,且高度依赖上下文信息✿◈ღღ。每次推理都需要将之前生成过的词重新输入模型进行计算✿◈ღღ。这种计算方式使得复杂度达到了 O(N²)✿◈ღღ,其中必然存在大量的重复计算✿◈ღღ。

  观察到✿◈ღღ,经过多次预测后✿◈ღღ,X @ W_K和X @ W_V的结果上半部分都是相同的✿◈ღღ。这是由于 LLM 模型结构的特殊设计导致的✿◈ღღ。这些重复计算的结果可以缓存(即 KV Cache)下来✿◈ღღ,空间换时间✿◈ღღ,减少计算量✿◈ღღ。几乎所有的 LLM 推理框架都支持了 KV Cache✿◈ღღ,例如vLLM ✿◈ღღ。

  有时候模型推理延时实在避免不了✿◈ღღ,可以从工程交互上想办法✿◈ღღ。传统后台服务的 RPC 通信是一问一答方式✿◈ღღ,这种方式不太适合语音合成或者文本对话的场景✿◈ღღ。因为大模型推理需要几秒-几十秒✿◈ღღ,如果等待模型推理结束才展示结果✿◈ღღ,用户会等待较长的时间✿◈ღღ,体验很差✿◈ღღ。

  流式响应就是当模型推理计算得到第一个token或者第一个音频帧的时候✿◈ღღ,立马展示或者播放给用户✿◈ღღ,同时后续的模型推理结果在已经建立的 TCP 流上继续顺序传输人生就是博✿◈ღღ。工程上从关注模型推理的整体耗时✿◈ღღ,改为关注首token或首个音频帧的耗时✿◈ღღ。几乎所有的 LLM 推理框架都支持了流式响应✿◈ღღ。

  提高吞吐量是程序员在传统 Infra 领域孜孜不倦的追求✿◈ღღ,因为更高的吞吐量意味着更低的机器成本✿◈ღღ。实现 AI 应用的高吞吐本质上就是提高昂贵的 GPU 的利用率✿◈ღღ,让 GPU 单位时间能完成更多的任务✿◈ღღ。

  尽管模型推理需要执行万亿次浮点运算✿◈ღღ,但GPU 有大量的计算单元(CUDA Cores)✿◈ღღ,单个请求的模型推理很难令 GPU 利用率达到饱和✿◈ღღ。提高 GPU 利用率有2个方法✿◈ღღ:传统批处理和连续批处理✿◈ღღ。这里的“传统批处理”是相对于“连续批处理”这样的新型批处理方式而言的✿◈ღღ。

  其实传统后台服务也大量使用了批处理✿◈ღღ,例如 Redis 的 MGet 命令✿◈ღღ,单次请求就完成所有 key 的获取✿◈ღღ,将 N 次网络往返(RTT)压缩为1次✿◈ღღ。与之相似✿◈ღღ,模型推理的批处理就是将多个输入样本打包(batch)✿◈ღღ,将原本串行的 N 次轻量的推理计算✿◈ღღ,合并为 1 次重量的计算✿◈ღღ,实现单位时间内处理更多的请求✿◈ღღ,提高了 GPU 利用率✿◈ღღ。

  传统批处理类似 “固定班次的公交车”✿◈ღღ:乘客(请求)必须等待发车时间(组建一个batch)✿◈ღღ,发车后所有乘客同步前进✿◈ღღ。即使有乘客提前下车(短请求完成)✿◈ღღ,车辆仍需等待所有乘客到达终点(长请求完成)才能返程接新乘客✿◈ღღ。传统批处理存在着资源浪费✿◈ღღ:GPU 要等待长请求处理完✿◈ღღ,不能处理新的请求而空闲✿◈ღღ。

  这个问题在 LLM 应用领域显得特别突出✿◈ღღ,因为不同用户请求 Prompt人生就是博✿◈ღღ,模型的回答结果长度差异巨大✿◈ღღ,如果使用传统批处理✿◈ღღ,GPU 空闲率很高麻美✿◈ღღ。这个本质上是个任务调度问题✿◈ღღ,传统后台服务我们使用工作窃取算法(work stealing)解决线程空闲问题✿◈ღღ,与之相似✿◈ღღ,AI Infra 提出“连续批处理”解决这个问题✿◈ღღ。

  连续批处理类似“随时随地拼车的顺风车”✿◈ღღ,每辆车(GPU)在行程中可随时上/下客✿◈ღღ。新乘客(请求)直接加入当前车辆的空位(空闲计算单元)✿◈ღღ,已完成的乘客立即下车(释放资源)✿◈ღღ。几乎所有的 LLM 推理框架都支持了连续批处理能力✿◈ღღ,例如 vLLM 的 Continuous Batching

  AI Infra 面对的工程挑战✿◈ღღ,例如计算✿◈ღღ、存储✿◈ღღ、通信✿◈ღღ,大部分是新时代的老问题✿◈ღღ,我们在传统 Infra 领域都能找到对应的场景和解决思路✿◈ღღ。差异只在于战场从 CPU 转移到 GPU✿◈ღღ,传统后台工程师积累的方法论✿◈ღღ,依然可以无缝衔接到 AI Infra✿◈ღღ。尊龙✿◈ღღ!人生就是博·(中国)z6mg✿◈ღღ!AG·尊时凯龙(中国区)人生就是搏!✿◈ღღ,人生就是博(中国区)集团官方网站✿◈ღღ。人生就是博✿◈ღღ,尊龙凯时人生就是博✿◈ღღ。


上一篇 : 尊时凯龙|大石彩香|破局传统养老!全国首套AI多模态照护系统在盐城投用
下一篇: 没有了


尊时凯龙·(中国区)人生就是搏!| http://www.8jj7.com