资讯动态

RDU深度解析:AI加速器竞争的下半场是数据搬运

发布时间:2026/8/30 16:29:10 来源:尧图企业网站定制
去年我在优化一个文本生成服务时遇到一个很反常的现象GPU 利用率已经跑到了 85%但每次请求的延迟仍然在 800 毫秒上下。最开始我怀疑是推理框架不够高效于是把算子逐个做 profile最后才发现真正的问题根本不在计算本身而在数据搬运——权重从显存搬到计算单元中间结果又被搬来搬去整个流程里有将近一半时间都耗在了数据移动上。这个经历让我开始认真研究一个经常被算法工程师忽略的架构词可重构数据流单元Reconfigurable Dataflow Unit简称 RDU。它是 SambaNova Systems 提出的 AI 加速器核心最大特点是它不是按指令去执行操作而是直接在硬件里重建一张数据流图让数据沿着提前配置好的路径流动每经过一个计算节点就完成一次运算。这篇文章想说的不只是 RDU 的硬件有多特殊而是它能带给我们一个很重要的判断AI 加速器的竞争已经从“让计算更快”进入“让数据搬运更少”的阶段。如果理解不了这一点可能连编译器报错都不知道该从哪里查起。1. 先搞清 RDU 解决的是什么问题它到底改变了什么1.1 传统芯片的默认模型是“把数据取过来算”无论是 CPU 还是 GPU底层大多数还是冯诺依曼体系的延伸指令一条条取出来数据从内存取到寄存器计算单元完成运算结果再写回去。这套机制的优点是通用几乎所有算法都能用一条条指令拼出来。但缺点是数据搬运的成本被算法的不可预测性掩盖了。到了大模型阶段这个问题变得格外刺眼。一个模型动辄几十亿甚至上千亿参数权重本身就有几十 GB 到 TB 级。就算计算单元的速度不断提升数据总线的带宽和内存访问延迟依然像是脖子上的绳子。做系统优化的人常说一句话计算贵但数据移动更贵。回到我们熟悉的 GPU 场景你用 CUDA 或 PyTorch 写一个算子框架会把它编译成 kernel运行时再把输入数据从显存拷贝到计算单元。每个算子都像一个小工厂接收原料、处理、打包、送回仓库。下一次运算再重新取货。问题是不同的算子可能使用不同的仓库数据一进一出时间就悄悄被吞掉了。1.2 数据流计算把“数据去找算力”改成“算力等在数据路径上”RDU 走的是另一条路线。它不再执行“取指—解码—执行”的循环而是先把模型的计算图完整映射到硬件网格上。这个网格里有一批计算节点和存储节点节点之间用可配置的数据通路相连。你给它一段输入数据后数据会像水流经过河道一样沿着提前搭好的路径流动每经过一个节点就完成一次运算。不需要一个全局指挥来反复迁就数据的临时需求。这种架构在计算机体系结构里叫做数据流计算概念并不新。早在几十年前就有人研究过但真正落到 AI 芯片上、能跑到商用规模是近几年才有的事。为什么因为过去模型的尺寸和结构还不够固定编译器很难把一整张计算图高效地铺到硬件上。而现在的 Transformer 模型结构高度规律一堆矩阵乘、LayerNorm、Softmax、残差连接反复堆叠。这种规律性正好适合数据流映射。你可以做一个类比传统计算像一辆货车在复杂的城市路网里一次次到仓库取货再到加工厂加工。RDU 更像把这个任务涉及的仓库和加工车间直接搬到同一条流水线上只要流水线搭好批量货物就能连续通过不必反复装卸。1.3 可重构而不是专用这里很容易产生一个误解RDU 是不是类似 ASIC 的专用芯片只认某一种模型不是。RDU 的可重构是指数据通路本身可以在编译期改变。这有点像 FPGA 和 ASIC 的混合体它的配置单元不是单个逻辑门而是一批粗粒度的功能单元和互连接口比 FPGA 的底层门级重构高效得多又比 ASIC 灵活得多。但要注意这种灵活不是 GPU 那种每一刻都能随机切换 kernel 的灵活。部署前你需要把整个模型图固定下来由编译器把数据流图变成物理路径模型结构一旦变了路径就要重新编译。所以 RDU 真正适合的场景是模型结构相对稳定、输入形状相对固定、需要反复执行。2. 为什么生成式模型爆发后RDU 这类架构重新被看到2.1 Transformer 不是计算密集而是数据搬运密集生成式模型的基石是 Transformer。你把一个 Transformer 层拆开注意力计算本身是一系列矩阵乘和 softmax。但真正消耗资源的地方往往不在矩阵乘本身而在自回归生成时的 KV Cache——每一步都在生成新 token同时所有历史 token 的 KV 都要被载入和更新。这个过程里显存带宽和内存访问模式比峰值算力更直接地影响首 token 延迟和后续生成速度。在很多推理场景里算力利用率不高并不是芯片不会算而是权重和激活的搬运把时间吃掉了。RDU 的思路是把计算节点和存储节点重新排布让权重尽可能停留在离计算近的位置中间激活也不反复写回全局内存。这样数据路径被压缩了延迟和功耗自然跟着下降。这并不是说 GPU 做不到。事实上GPU 可以通过 kernel 融合、算子融合、持续批处理等方式优化数据搬运只是这些需要大量手写优化。RDU 的编译器可以在部署前知道整个计算图因此能把很多“运行时优化”变成“部署时优化”。2.2 GPU 的通用性反而成了额外开销GPU 今天的成功建立在大规模并行和通用编程模型之上。但通用是一项昂贵的能力。它意味着运行时不仅要处理分支、调度、缓存同步还要允许不同的 kernel 随时被调度到任意计算单元上。一旦模型计算图固定下来这些通用机制依然会消耗晶体管和功耗无法被精确裁减。RDU 的编译器既然提前看到了完整计算图就可以把许多运行时判断交给编译器。比如哪几个算子可以放在流水线的同一级中间结果要不要落到全局存储某个数据通路宽度应该给多大。这些决策到运行时就不再需要硬件去猜。当然这不是说 GPU 已经落后了。GPU 生态成熟能适配几乎任何模型。而 RDU 面对的是“模型结构相对固化”的场景在这种场景里把通用性降下来本来就是一种高效策略。2.3 可重构的粒度粗粒度与细粒度之间的价值区间FPGA 在门级可重构什么问题都能实现但编译布局布线时间长设计复杂度高。ASIC 针对固定算法最高效但算法一变就废。RDU 选择的是粗粒度可重构计算阵列它的重构单元是功能单元和互连接口而不是单个逻辑门。这样既保留了比较高的执行效率又能适应不同 AI 算子在灵活性和效率之间找到了一个工程上更实用的落点。这也是 RDU 与普通神经网络处理器NPU不同的地方。很多 NPU 只是把矩阵乘做成固定硬件遇到非标准算子就容易走回 CPU 或 GPU。RDU 的芯片结构和数据流布局可以通过编译器重排面对新网络结构时不需要重新流片。3. 把一个模型真正放到 RDU 上不是调用 API而是重构计算图3.1 软件栈编译器才是灵魂RDU 的难点和上限都压在编译器和运行时上。把 PyTorch 模型转成 RDU 可执行的程序不是简单跑一次导出工具。它通常需要做下面几件事解析计算图把动态图转成静态图表示对算子做拆分或融合使它们能匹配硬件资源把张量映射到片上的计算单元和存储决定数据流的通道宽度和时序生成运行时的控制信息和调度参数。这个过程本质上是在把一个通用编程模型编译成一套定制硬件的配置。从公开资料看SambaNova 的软件栈如 SambaFlow 或 SambaStudio就是用来做这件事的。具体接口和功能会随版本快速更新下面给出的只是一个通用处理思路真正落地时一定要以你手里 SDK 文档为准。3.2 工作流的四层抽象为了便于理解你可以把 RDU 的部署过程拆成四层模型层你写的 PyTorch、TensorFlow 模型或权重文件。中间表示层编译器把模型解析成与框架无关的计算图。布局层编译器决定每个算子和张量放在 RDU 的哪个位置使用哪条数据流连接。运行时层把编译结果加载到硬件处理输入输出流和调度。这四层不是官方定义只是一个理解框架。它能帮你定位问题编译报错大概率在中间表示层或布局层运行时报错大概率在运行时层。3.3 最小可运行流程跑通一个推理任务的五个阶段从工程实践来看把一个模型部署到 RDU 上一般会经历五个阶段准备模型选择一个支持范围内的模型导出成计算图文件。定义静态输入RDU 编译时通常要求固定 batch 和输入长度至少在第一个版本里要固定。编译调用编译器生成一个可执行目标。加载运行执行推理读取输出。检查精度和性能。下面是一个简单的流程示意。注意这里的命令完全是用来展示流程结构的不是可直接复制的指令。# 示例结构实际命令请根据SDK版本调整 # 阶段1导出模型 python export_model.py --model bert-base-uncased --output model.onnx # 阶段2编译到RDU samba-compile --input model.onnx \ --input-shape input_ids:1,128 \ --output compiled_model.samba \ --device rdu # 阶段3加载并运行推理 samba-infer --binary compiled_model.samba \ --input sample_input.json \ --output result.json你会发现这个流程比“在 GPU 上跑一个 model.forward”要重得多。原因在于RDU 需要把计算图真正落到物理路径上编译不是一次简单翻译而是一次资源分配和线路规划。3.4 关键参数静态形状、精度、资源分配RDU 的部署往往比 GPU 更讲究静态形状。编译时会把输入长度、batch 大小显式写进数据流布局。你上来就把 batch 设成 64后面又改成 1通常不能靠参数覆盖而需要重新编译。这看起来是限制但也是效率来源。因为知道了 batch 大小编译器才能决定用多少条数据通道路径才能把流水线填满。精度方面很多加速器支持 FP16、BF16、INT8。RDU 在选择精度时也可能影响算子映射和带宽。并不是所有算子都能无痛转换建议先用小数据集逐层验证不要一上来就全模型 INT8。下面是一个常见的参数理解表格可参考具体命名以 SDK 文档为准参数维度含义建议input_shape每一路输入的形状第一版尽量固定不要用动态 shapebatch_size同时处理样本数先小后大观察性能和精度变化precision模型精度表达先跑 FP32/FP16 基线再尝试 INT8placement设备/芯片分配单卡验证后再做多卡多卡映射更复杂compiler_cache编译器缓存保存编译过程文件方便定位问题4. 性能不达标时的排查链路先怀疑计算图映射别急着加并发4.1 四类常见现象和排查顺序碰到问题不要先怀疑是硬件慢。从我自己的经验看RDU 一类数据流架构的很多性能问题根因都在计算图映射和编译器表现上而不是运行时的并发参数。这里给你一个实用的排查顺序编译失败先看算子支持清单再查输入形状和类型。精度异常先看是否混了精度再查算子是否被回退到 CPU 或其他实现。单请求延迟高先看整图有没有回退段再看数据流路径上有没有瓶颈节点。系统吞吐上不去先看 batch 和输入长度是否匹配硬件布局再看并发流和资源分配。这四条顺序本质上是“先检查上游再检查下游”。编译失败是上游问题精度和延迟是下游现象。不要在一个阶段还没确认时就跳到另一个阶段去调整并发参数。4.2 单一算子的速度不等于整图速度在 GPU 上你可以分别测量每个 kernel 的耗时然后对症优化。但在 RDU 上计算图被铺成数据流网络整体吞吐取决于整条路径上的持续流动。如果某个算子被编译器拆成多个子步骤或者数据路径上出现需要等待全局同步的节点局部快也没有用。所以当 profile 报告显示某个节点耗时很高时不一定是这个节点慢而可能是它的上游数据没有及时到达或者它的输出必须等待其他分支汇合。这种因果关系在数据流架构里非常常见。排查性能时最好把注意力放在“整条关键路径”上而不是单个算子。4.3 容易被忽略的三个边界条件除了上面的排查顺序还有三个边界条件容易被忽略动态 shape模型里出现隐式动态张量比如 Python 循环依赖某个输入值编译期会卡住或插入低速告警。输入未对齐很多硬件对通道宽度和内存对齐有额外要求不是简单的 padding 能解决。编译缓存与环境差异在开发环境编译好到生产环境重新部署时二进制与驱动不匹配性能可能下降很多。下面这张表可以贴在工位上现象优先检查项可能原因示例编译失败算子支持清单、输入 shape、精度某个自定义算子没有被映射到 RDU精度偏差大精度转换、随机种子、算子回退注意力用 FP16但 softmax 缺少数值修正单 token 延迟高整图回退段、数据路径长度图中间被插入了 host 同步点整体吞吐上不去batch 大小、并行流、设备映射batch 设太小流水线没有填满结果正常但慢编译优化级别、内存布局数据访问走了全局存储缓存命中率低不要把一个 RDU 编译产物当成普通权重文件随便分发。它依赖具体硬件拓扑和驱动版本换环境后必须重新验证。5. 什么样的项目和团队真正适合 RDU5.1 更适合的场景如果只允许我用一句话下判断RDU 更适合那些把 AI 推理当成持久服务而不是原型验证的团队。它的最大优势是一旦模型编译完成执行路径非常稳定非常适合大规模并发和固定输入场景。适合它的情况包括固定模型骨架比如稳定的 Bert、GPT 风格、或者 MoE 结构不会频繁改分支高并发推理服务对延迟方差敏感希望每次请求的延迟尽量稳定可以接受较长编译时间几分钟到几十分钟而不是每次启动模型都要“即时编译”团队有模型压缩、算子支持判断、编译器调试能力。5.2 不太适合的场景同样也有一些场景RDU 的性价比不高快速实验今天改一下网络结构明天换一个 attention 实现编译一次的时间比训练一轮还长动态控制流密集比如依赖输入任意长度的 while 循环、复杂分支选择依赖大量小众算子PyTorch 社区很多新发展算子RDU 编译器可能没有第一时间支持需要在一个硬件上动态切换很多模型模型切换的成本偏高如果负载很碎片化优势会被掩盖。“不太适合”不是“不能用”而是“当前阶段不一定划算”。技术选型最怕拿一个优势场景去套所有问题。5.3 长期使用前要补的三块工程能力从工程经验看用 RDU 这类数据流加速器最怕的不是硬件本身而是部署链路变成黑盒。长期使用至少要补三块第一可观测性。要能拿到编译报告、运行日志、带宽和利用率指标否则出了问题只能在黑暗里猜。第二模型版本管理。RDU 二进制和模型结构强绑定最好把模型、编译时间、SDK 版本、芯片型号都记录清楚否则几个月后性能下降你很难知道是哪一层变了。第三编译 CI。如果经常更新模型把编译过程纳入持续集成每次提交都重新编译并跑精度回归比人工在笔记本上操作可靠得多。6. 回到主线RDU 真正改变的是计算与数据的亲缘性6.1 核心判断回到开头那个让我困惑的问题为什么 GPU 利用率已经很高了延迟还是下不来因为利用率高只说明计算单元在忙不代表数据搬运的路径短。RDU 的工程出发点恰恰相反——它不是想办法让计算单元更忙而是想办法让数据走更少的路。这正是写这篇文章最想分享的核心判断RDU 的价值不在于又一个更大算力的芯片而在于把“计算图到硬件的数据流映射”变成了第一等公民。它让一批开发者和架构师开始重新思考数据移动在 AI 加速中到底占了多高的成本。6.2 对开发者意味着什么对想尝试 RDU 的开发者建议先忘掉“像写 CUDA 一样调并行度”的思维。你要做的第一件事是理解模型计算图的数据流结构哪些算子依赖前一个算子的全部输出哪些分支会汇合哪些地方有跨节点通信只有当你想清楚这些才能看懂编译器的报错和优化建议。也不用过度恐慌。编译器正在把许多底层配置抽象掉你不需要手画数据流但需要具备阅读理解底层抽象的能力至少要会读编译报告和性能日志。6.3 下一步建议如果你对 RDU 产生了兴趣下一步不是急着找很贵的硬件而是先做三件成本很低的事。第一找一个结构简单、算子常见的模型比如一个小型 Transformer第二人为规定输入 shape 和 batch size把它导出成标准的计算图文件第三在能获取的模拟器、云上试用环境或开发套件上走一遍编译、推理、精度对比。跑通之后再尝试更大的模型。一旦你体会过“编译一次部署成百上千次”的流程你就能理解什么叫真正的部署期优化。这不是把模型从 GPU 迁移到另一个加速器那么简单而是从“按指令执行”的思维真正走到“按数据流执行”的思路上来。这篇文章不是想把 RDU 吹成 GPU 的替代答案。它只是 AI 加速器中的一条重要路线有适用边界也需要大量工程配套。但它的核心思想——可重构的数据通路——值得每一个做 AI 基础设施的人认真想一想。因为计算从“按指令执行”走向“按数据流执行”不是某一家公司的独有发明而是 AI 负载越来越重之后硬件设计必然要面对的方向之一。现在理解得早一点后面就能少一些重新调整架构的成本。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价