<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>陆吾</title>
  <subtitle>守昆仑 · 司九部</subtitle>
  <link href="https://liaosong.top/"/>
  <link rel="self" href="https://liaosong.top/feed.xml"/>
  <id>https://liaosong.top/</id>
  <updated>2026-10-12T00:00:00+08:00</updated>
  <entry>
    <title>AI 数据中心的带宽：GPU 算得快，数据跟得上吗？</title>
    <link href="https://liaosong.top/blog/ai-datacenter-bandwidth/"/>
    <id>https://liaosong.top/blog/ai-datacenter-bandwidth/</id>
    <updated>2026-10-12T00:00:00+08:00</updated>
    <summary>从 HBM、GPU 互连到机柜网络，沿着训练与推理的数据流，理解 GPU 的等待、MoE 的交换和长上下文的搬运成本。</summary>
    <content type="html">&lt;p&gt;一座 AI 数据中心装了上万张 GPU，算力很大，但一个训练任务能用上多少，要看这些 GPU 怎样协作。某张卡算完了自己的部分，下一步需要另一张卡的结果；如果结果还在路上，它就得等。&lt;/p&gt;
&lt;p&gt;推理也有类似的等待。用户看到模型逐字输出，GPU 背后却在读取权重、访问上下文缓存，有时还要把中间结果交给别的 GPU。输出的文字很少，内部搬运的数据可以很多。&lt;/p&gt;
&lt;p&gt;理解带宽，可以从一次计算需要的数据出发：字节在哪里，经过哪些连接，必须什么时候到达。扩容时，这几个问题能帮助我们找到该升级的路径。&lt;/p&gt;
&lt;h2&gt;先画出数据走的路&lt;/h2&gt;
&lt;p&gt;HBM 是封装在 GPU 附近的高带宽内存。权重、激活和 KV cache 等数据可以放在这里，计算单元需要不断读写它们。芯片内部还有寄存器和缓存，所以一次运算实际访问 HBM 的次数，也受数据复用方式影响。&lt;/p&gt;
&lt;p&gt;模型拆到多张 GPU 上以后，出现第二种搬运：GPU 之间交换数据。NVLink 和相应的交换系统，可以为一个紧密协作的 GPU 域提供连接。这类扩展通常称为 scale-up。域的边界由具体架构决定，既可能在服务器内，也可能跨多个计算托盘。&lt;/p&gt;
&lt;p&gt;再扩大到多个节点或机柜，通信通常需要网卡和交换网络，可以采用 InfiniBand，也可以采用面向 AI 配置的以太网。这通常称为 scale-out。计算通信、存储访问和管理流量，还可能使用不同的网络。&lt;a href=&quot;https://docs.nvidia.com/dgx/dgxgb200-user-guide/networking.html&quot;&gt;NVIDIA：机柜系统的网络分工&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;AI 数据中心中的本地读写、GPU 域内通信与跨域网络&quot; src=&quot;/articles/ai-datacenter-bandwidth/fig-paths.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图 1：这是数据路径的示意，具体产品的连接与域边界会不同。一次任务可以同时使用多条路径。&lt;/p&gt;
&lt;p&gt;Google 的 TPU v5p 规格也把这些能力分开列出：每芯片 HBM 带宽为 2765 GB/s，芯片间 ICI 互连为 1200 GB/s 双向合计，数据中心网络 DCN 为 50 Gb/s。它们服务于不同的数据路径，无法互相替代。&lt;a href=&quot;https://docs.cloud.google.com/tpu/docs/v5p&quot;&gt;Google Cloud：TPU v5p&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;升级本地内存，能改善 GPU 取数；升级域内互连，能改善多卡协作；升级外部网络，则可能改善跨域交换。收益取决于当前任务正在等待哪一项。&lt;/p&gt;
&lt;h2&gt;推理的第一处压力：从内存里反复取数&lt;/h2&gt;
&lt;p&gt;大模型生成一个 token，需要完成一轮前向计算。对密集模型，低批量解码时权重的复用机会有限，读取权重的成本可能很显眼。&lt;/p&gt;
&lt;p&gt;举一个只用于估算的例子：假设一个 700 亿参数的密集模型，每个参数占 2 字节，权重约为 140 GB；这组权重已装入足够容量的 GPU 内存。本次单请求解码需要从 HBM 读取全部权重一次，相关设备合计能提供 4 TB/s 的有效读取吞吐，而且分片工作均衡。&lt;/p&gt;
&lt;p&gt;仅搬运权重，就需要：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;140 GB ÷ 4000 GB/s = 35 ms&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;按这个简化模型，权重读取给出的速率上限约为每秒 28.6 个 token。这里还没计入 KV cache、计算、中间结果读写和多卡通信，不能把这个数当作某款硬件的实测性能。&lt;/p&gt;
&lt;p&gt;140 GB 的权重即使装得下，读取也要花时间。容量回答“能放多少”，带宽回答“每秒能搬多少”。&lt;/p&gt;
&lt;p&gt;批处理会改变这笔账。同一轮处理多个请求时，矩阵运算可以让一份权重服务更多 token，提高数据复用和计算量与搬运量之比。不过，总吞吐提升也要和排队时间、单请求延迟一起看。批量增大、上下文变长或模型结构变化后，瓶颈可能转向计算、缓存访问或通信。&lt;a href=&quot;https://www.nvidia.com/en-eu/glossary/disaggregated-serving/&quot;&gt;NVIDIA：推理阶段与资源特征&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;软件也能减少搬运。FlashAttention 使用分块计算，把更多工作留在片上存储中，减少 HBM 与 SRAM 之间的读写；它的收益来自算法对内存层次的利用。&lt;a href=&quot;https://arxiv.org/abs/2205.14135&quot;&gt;FlashAttention 原论文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;减少读写次数后，同样的内存带宽可以完成更多工作。分析 HBM 时，需要同时测量有效读取吞吐与实际访问量。&lt;/p&gt;
&lt;h2&gt;训练为什么需要 GPU 之间交换结果&lt;/h2&gt;
&lt;p&gt;多卡训练的通信，随模型分工方式变化。&lt;/p&gt;
&lt;p&gt;数据并行让不同 GPU 处理不同样本，再同步梯度或相关分片。张量并行把某些层的运算拆开，各卡要交换部分结果；流水线并行把不同层放到不同阶段，阶段之间传递激活和反向梯度。这些分工可以组合使用，通信的频率和消息大小也会随实现变化。&lt;a href=&quot;https://docs.nvidia.com/megatron-core/developer-guide/latest/user-guide/parallelism-guide.html&quot;&gt;Megatron Core：并行策略&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以 AllReduce 为例，它把参与者的数据逐元素归约，并让每个参与者得到结果。对理想的 ring AllReduce，若有 n 个参与者，每个参与者的输入大小为 S，每个参与者发送的总数据量约为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2 × (n−1) / n × S&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;8 个参与者、每个输入 1 GB，则每个参与者约发送 1.75 GB，并接收相应数据。若每个参与者的有效单向吞吐是 50 GB/s，大消息的搬运部分约需 35 ms。这忽略了启动、分轮依赖与拥塞，也没有计入计算重叠。&lt;a href=&quot;https://github.com/NVIDIA/nccl-tests/blob/master/doc/PERFORMANCE.md&quot;&gt;nccl-tests：AllReduce 的带宽模型&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;实际系统可以选择树形算法、分层归约或网络内计算，不能把 ring 模型套到所有配置。但它说明了为什么“同步一个 1 GB 张量”不能简单理解成每张卡只发送 1 GB。&lt;/p&gt;
&lt;p&gt;更快的互连能缩短这类交换。如果一次迭代原本用 80 ms 计算、20 ms 通信，两者完全不重叠，把通信时间减半，总时间从 100 ms 变成 90 ms，速度提高约 11.1%。若部分通信本来就被计算隐藏，收益还要看剩下多少等待落在关键路径上。&lt;a href=&quot;https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html#understanding-scaling&quot;&gt;CUDA：性能扩展与 Amdahl 法则&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;评估训练网络时，需要在任务时间线上找到这些未被计算隐藏的通信。&lt;/p&gt;
&lt;h2&gt;MoE 把通信变成了频繁的定向交换&lt;/h2&gt;
&lt;p&gt;混合专家模型（MoE）会为 token 选择部分专家。专家分散在不同 GPU 上时，系统需要把对应的激活送过去，再把结果合回来；这里搬运的是 token 的向量表示，数据量远大于 token 编号本身。&lt;/p&gt;
&lt;p&gt;这类专家并行常使用 All-to-All：不同参与者向不同目标发送不同数据。它与所有人求同一个和的 AllReduce，流量分布不同。&lt;a href=&quot;https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/usage/collectives.html&quot;&gt;NCCL：集合操作&lt;/a&gt; &lt;a href=&quot;https://docs.nvidia.com/megatron-core/developer-guide/0.15.0/api-guide/moe.html&quot;&gt;Megatron Core：MoE 的 token dispatcher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果路由把大量 token 送给同一批专家，那些 GPU 会承担更多接收和计算工作。即使其他路径还有空闲，热门专家仍可能排队。这时同时存在连接容量和负载分配问题。低批量解码还可能产生许多较小的交换，每次启动与完成同步的开销也会变得明显。&lt;a href=&quot;https://developer.nvidia.com/blog/ai-model-co-design-hardware-friendly-llm-design/&quot;&gt;NVIDIA：MoE 的通信与负载挑战&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NVIDIA 为 GB200 NVL72 列出 72 个 GPU 的 NVLink 域，以及约 130 TB/s 的域级带宽；另一份网络文档给出的每 GPU NVLink 5.0 带宽为 1.8 TB/s 双向合计。这描述了机柜内紧密协作的能力，但域级数字不能当作某张 GPU 向某个目标的单向吞吐。&lt;a href=&quot;https://www.nvidia.com/en-us/data-center/gb200-nvl72/&quot;&gt;GB200 NVL72 规格&lt;/a&gt; &lt;a href=&quot;https://docs.nvidia.com/dgx/dgxgb200-user-guide/networking.html&quot;&gt;NVLink 网络说明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;要判断一个 MoE 部署能否受益，还得看专家放置、热点、批量，以及交换能否与计算重叠。把经常互相交换数据的 GPU 放到快路径上，是部署时需要考虑的一件事。&lt;/p&gt;
&lt;h2&gt;长上下文增加的不只是内存占用&lt;/h2&gt;
&lt;p&gt;KV cache 保存先前 token 在注意力层产生的 key 和 value，避免生成后续 token 时重复计算它们。缓存会占用内存，解码时还需要访问相关缓存。对标准的全注意力层，上下文变长，缓存量也会增长；滑动窗口、压缩和其他注意力结构会改变增长方式。&lt;a href=&quot;https://huggingface.co/docs/transformers/cache_explanation&quot;&gt;Hugging Face：缓存机制&lt;/a&gt; &lt;a href=&quot;https://huggingface.co/docs/transformers/kv_cache&quot;&gt;缓存策略&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果把输入处理（prefill）和逐 token 生成（decode）分到不同 GPU 池，prefill 完成后，通常需要把 KV cache 交给 decode 池。这让两阶段能够分别配置资源，也增加了转移成本。&lt;a href=&quot;https://docs.nvidia.com/dynamo/dev/kubernetes/disaggregated-serving/overview&quot;&gt;NVIDIA Dynamo：分离式推理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以估一下这笔成本。假设一个教学模型有 80 层，每层 8 个 KV 头，每头维度 128，缓存每元素占 2 字节。单条请求含 32,768 个 token，所有层均采用标准全注意力，未做压缩或前缀复用，则 K 和 V 合计为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2 × 80 × 8 × 128 × 32768 × 2 B ≈ 10.74 GB&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;假设整个逻辑缓存必须穿过一条有效吞吐为 80 GB/s 的路径，仅数据搬运就约需 134 ms。若有多请求共享出口，还需要计入竞争。这是由缓存张量大小得到的估算；实际系统的分片、布局、复用与传输方式会改变每条路径上的负载。&lt;/p&gt;
&lt;p&gt;分离式推理是否划算，要比较两阶段各自提效的收益与转移成本。对短输入、低并发，或缺少快速缓存传输网络的配置，把两阶段留在一起可能更合适。Dynamo 文档也明确指出，分离部署不会自动更快。&lt;/p&gt;
&lt;h2&gt;网卡很快，网络内部仍可能堵&lt;/h2&gt;
&lt;p&gt;一张 800 Gb/s 网卡，按单位换算对应 100 GB/s；应用可以获得的有效吞吐还会受到协议和系统开销影响。更容易漏掉的是，许多网卡后面可能共用同一个出口。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;八个发送端共享出口的容量约束&quot; src=&quot;/articles/ai-datacenter-bandwidth/fig-shared-uplink.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图 2：假设八个发送端各有 100 GB/s 单向容量，却共同使用 400 GB/s 出口，入口合计与出口的容量比为 2:1。&lt;/p&gt;
&lt;p&gt;当这八个端点都向出口另一侧发送数据时，共享出口限制了总吞吐。理想均分下，每个发送端只有 50 GB/s。若目的地就在本地、流量不经过这个出口，则不受这处瓶颈限制。&lt;/p&gt;
&lt;p&gt;这就是拓扑和流量位置的作用。超订阅比描述入口与共享出口的容量关系；二分带宽则关注把网络近似等分后，跨分界的连接能提供多少容量。端口速率相同，两张网络在跨区域交换时仍可能表现不同。&lt;a href=&quot;https://www.nvidia.com/content/cudazone/cudau/courses/ucdavis/lectures/tlp6.pdf&quot;&gt;NVIDIA 互连网络课程：拓扑与二分带宽&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;跨机柜网络还要管理拥塞和突发流量。RDMA 可以减少传统数据搬运路径中的软件和 CPU 参与，但链路容量与共享出口仍然存在。NVIDIA 的 AI 网络参考架构把拥塞控制、路由和遥测列为网卡与网络设计的一部分。&lt;a href=&quot;https://docs.nvidia.com/enterprise-reference-architectures/nvl72-ai-factory/latest/components.html&quot;&gt;NVIDIA：网络组件与拥塞控制&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对同步任务，部分参与者晚完成可能拖住整个通信组。除了平均吞吐，还需要查看慢操作与尾部延迟。&lt;/p&gt;
&lt;h2&gt;铜线和光互连，解决哪一段搬运&lt;/h2&gt;
&lt;p&gt;规模扩大以后，连接需要同时满足距离、带宽密度、功耗和可维护性的要求。铜与光的选择取决于连接位置；不能仅凭“光更先进”决定方案。&lt;/p&gt;
&lt;p&gt;Broadcom 在光互连产品资料中同时提供面向短距离的高速铜连接和光连接。CPO（共封装光学）则把光引擎与芯片放到同一个封装基板上，缩短高速电信号到光转换之间的路径，目标包括改善带宽密度和功耗。&lt;a href=&quot;https://www.broadcom.com/company/news/product-releases/63021&quot;&gt;Broadcom：铜与光连接方案&lt;/a&gt; &lt;a href=&quot;https://www.broadcom.com/info/optics/cpo&quot;&gt;CPO 技术说明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这些技术改善的是物理连接。热门专家上的负载、共享出口的容量，以及软件的通信安排，仍要由相应的系统设计解决。分析一项互连升级时，需要先标出它作用于哪一段路径，再观察任务的等待是否随之减少。&lt;/p&gt;
&lt;h2&gt;给带宽升级选一个能验收的目标&lt;/h2&gt;
&lt;p&gt;对一座具体的数据中心，我会先拿到一次任务的时间线，再决定测什么：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;观察到的现象&lt;/th&gt;
&lt;th&gt;需要检查的路径或环节&lt;/th&gt;
&lt;th&gt;业务上验收什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;低批量解码慢&lt;/td&gt;
&lt;td&gt;权重与 KV cache 的 HBM 访问、计算耗时&lt;/td&gt;
&lt;td&gt;固定上下文下的单请求 token 延迟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多卡扩容后提升很小&lt;/td&gt;
&lt;td&gt;集合操作、拓扑和未隐藏的通信&lt;/td&gt;
&lt;td&gt;训练迭代耗时、扩容后的有效吞吐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE 个别 GPU 长时间繁忙&lt;/td&gt;
&lt;td&gt;专家路由、接收热点与计算不均衡&lt;/td&gt;
&lt;td&gt;负载分布及尾部完成时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长输入首 token 很慢&lt;/td&gt;
&lt;td&gt;prefill 计算、排队和缓存转移&lt;/td&gt;
&lt;td&gt;首 token 时间及其分项&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单机快、跨机柜慢&lt;/td&gt;
&lt;td&gt;网卡路径、共享出口、拥塞和放置&lt;/td&gt;
&lt;td&gt;真实流量下的操作耗时分布&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这些现象只能给出排查方向，不能单凭它们断定原因。一次有用的测量需要固定模型、精度、批量、上下文长度、并行策略和设备位置，才能比较升级前后。&lt;/p&gt;
&lt;p&gt;如果目标是降低训练成本，就看每次迭代少了多少等待；如果目标是让聊天响应更快，就同时看首 token 和后续 token 的延迟；如果目标是提高服务吞吐，就在既定延迟要求下比较能承载多少请求。带宽规格给出容量，任务时间线告诉我们这份容量有没有用上。&lt;/p&gt;
&lt;p&gt;资料核实日期：2026-10-12。算例采用十进制 GB、TB，明确标为假设的算例用于解释数据量与时间的关系，均非硬件实测。&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>你好，陆吾</title>
    <link href="https://liaosong.top/blog/hello-luwu/"/>
    <id>https://liaosong.top/blog/hello-luwu/</id>
    <updated>2026-09-19T00:00:00+08:00</updated>
    <summary>小站开张，先说说名字的由来和打算写些什么。</summary>
    <content type="html">&lt;p&gt;这个域名备案下来以后，首页一直只挂着一行站名和备案号。今天终于把它收拾成一个像样的小站：有首页、有「关于」，也有了这个博客。&lt;/p&gt;
&lt;h2&gt;名字&lt;/h2&gt;
&lt;p&gt;「陆吾」是《山海经》里守昆仑的神，虎身九尾，司天之九部。我那套个人助手从最早的 Jarvis 改名成陆吾，是因为它每天做的事越来越像「守山」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;夜里按时抓取、整理资料；&lt;/li&gt;
&lt;li&gt;盯着几台机器有没有掉线；&lt;/li&gt;
&lt;li&gt;早上把该看的东西摆在面前。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;打算写什么&lt;/h2&gt;
&lt;p&gt;大致三类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;折腾记录&lt;/strong&gt;：本地跑大模型、搭检索系统时踩过的坑，尽量写清楚现象、原因和解法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具与自动化&lt;/strong&gt;：一些让日常少点重复劳动的小做法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;读书与研究笔记&lt;/strong&gt;：看过的东西，用自己的话复述一遍。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更新不会很勤，但写下来的尽量有用。&lt;/p&gt;</content>
  </entry>
</feed>
