ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

全栈Token生产效率优化:从芯片选型到集群调度的工程实践

全栈Token生产效率优化:从芯片选型到集群调度的工程实践 1. 从一颗芯片到一行Token全栈效率优化的底层逻辑聊Token生产效率这件事得先把视角拉到足够高。很多人一听到“Token”就只想到大模型计费的那个Token其实在工程语境里Token的含义要宽得多——它可以是推理引擎里的一次词元生成可以是鉴权链路里的一串凭证也可以是芯片之间通信的一个数据单元。而“生产效率”这四个字落到全栈上就是一条从硅片到业务运营的完整链路芯片怎么选、推理引擎怎么调、集群怎么调度、供电散热怎么扛住、运营侧怎么把每一分算力换成实打实的吞吐。我做过几个从零搭推理集群的项目也踩过不少“芯片选型看着参数漂亮、实际跑起来拉胯”的坑。这篇文章想干的事就是把这条链路拆开揉碎讲清楚每个环节的效率瓶颈在哪、优化手段是什么、参数怎么算、坑怎么避。不管你是刚接触推理部署的工程师还是已经在做集群运维的老手都能从里面找到能直接抄作业的东西。核心关键词先摆出来Token、芯片、推理引擎、集群调度、供电散热。这五个词基本覆盖了从硬件到软件、从单机到集群、从计算到运营的全部关键节点。下面我按“整体设计思路—核心细节—实操过程—问题排查”的顺序展开中间会穿插大量实测数据和参数计算尽量让每个结论都有据可循。2. 全栈效率优化的整体设计与思路拆解2.1 为什么不能只盯着单点优化很多人优化Token生产效率第一反应是换个更快的推理引擎或者买张更强的卡。单点优化确实能带来立竿见影的效果但很快就会撞到天花板。我见过一个典型场景团队把推理引擎从通用框架换成了针对特定模型优化的引擎单卡吞吐提升了40%结果上线后发现整体吞吐只涨了15%。原因很简单——瓶颈转移到了集群调度和供电散热上卡跑满的时候降频了调度器又没能把请求均匀打散单卡的优势被系统性问题吃掉了。这就是全栈视角的价值。Token生产效率不是一个点的问题而是一条链的问题。链路的整体效率取决于最慢的那一环而不是最快的那一环。所以优化的第一步永远是定位瓶颈而不是盲目堆资源。2.2 全栈链路的五个关键层级我把这条链路拆成五层每一层都有明确的效率指标和优化手段层级核心对象关键效率指标主要优化手段芯片层GPU/NPU/ASIC算力利用率、能效比选型匹配、频率调优推理引擎层推理框架单卡吞吐、首Token延迟批处理、量化、算子融合集群调度层调度器集群利用率、请求均衡度拓扑感知、动态批处理供电散热层电源/散热系统稳定频率、PUE供电冗余、液冷/风冷选型运营层业务系统单位Token成本、SLA达成率配额管理、弹性扩缩容这五层不是孤立的而是相互制约的。比如芯片层选了高功耗的卡供电散热层就得跟着升级否则频率稳不住推理引擎层的吞吐指标就是空中楼阁。再比如调度层如果做不好拓扑感知跨NUMA节点的通信开销会把芯片层的算力优势吃掉一大半。2.3 方案选型的核心考量选型这件事我的经验是先看场景再看参数。同样是推理在线服务和离线批处理的诉求完全不同。在线服务看重首Token延迟和尾延迟离线批处理看重吞吐和成本。这两种场景对芯片、引擎、调度的要求差异很大。举个具体的例子。在线对话场景用户等不了太久首Token延迟最好控制在200ms以内。这时候芯片的单核性能比多核吞吐更重要推理引擎要优先保证低延迟而不是高吞吐调度器要能把请求快速分发而不是攒大批次。反过来离线批量生成场景首Token延迟无所谓关键是单位时间能出多少Token这时候大batch、高吞吐的配置才划算。所以我在做方案设计时会先画一张场景-指标对照表把业务诉求翻译成技术指标再倒推每一层该怎么选。这个习惯帮我避开了很多“参数好看但不适用”的坑。3. 芯片层算力利用率的真正瓶颈在哪3.1 芯片选型的三个硬指标选芯片不能只看峰值算力那个数字在实际推理场景里参考价值有限。我一般看三个指标有效算力、显存带宽、能效比。有效算力指的是在目标模型和目标精度下芯片实际能跑出来的算力。厂商标称的峰值算力通常是FP16甚至INT8的理想值实际推理时受限于显存带宽、算子支持度、调度开销能跑到60%就算不错了。显存带宽决定了数据搬运的速度大模型推理时经常是带宽瓶颈而不是算力瓶颈。能效比则是长期运营成本的关键同样跑一个模型能效比高的芯片电费能省一大截。我做过一个对比测试同样是70B级别的模型两张不同架构的卡在相同推理引擎下的表现指标芯片A芯片B标称峰值算力1000 TFLOPS800 TFLOPS实测有效算力520 TFLOPS610 TFLOPS显存带宽2.0 TB/s3.2 TB/s单卡吞吐1800 Token/s2400 Token/s整卡功耗700W550W能效比2.57 Token/s/W4.36 Token/s/W芯片B标称算力低但显存带宽高、能效比好实际推理吞吐反而更高。这个案例说明推理场景下显存带宽往往比峰值算力更关键尤其是大模型场景权重加载和KV Cache的读写对带宽压力很大。3.2 算力利用率的计算与提升算力利用率怎么算公式很简单算力利用率 实际有效算力 / 标称峰值算力 × 100%但实际有效算力怎么测这里面有讲究。我一般用目标模型在目标精度下跑一个标准batch测出吞吐再反推算力。比如一个模型单次前向需要2×参数量×序列长度的浮点运算用实测吞吐乘以这个数就是有效算力。提升算力利用率的手段主要有三个算子融合、精度量化、内存复用。算子融合把多个小算子合并成一个大算子减少kernel launch开销精度量化把FP16降到INT8甚至INT4算力直接翻倍内存复用则是减少显存分配释放的开销让数据搬运更连续。实测下来算子融合能提升15%到25%的利用率INT8量化能提升50%到80%内存复用视模型结构而定一般也有10%左右的提升。这三个手段叠加算力利用率从40%提到70%以上是可行的。3.3 芯片层的常见误区第一个误区是唯峰值算力论。前面已经说了峰值算力参考价值有限实际推理更看带宽和能效。第二个误区是忽视芯片的软件生态。有些芯片硬件参数很漂亮但推理引擎支持度差算子覆盖不全实际部署时要么跑不起来要么性能大打折扣。选型时一定要确认目标推理引擎对芯片的支持情况最好能拿到实测数据。第三个误区是不考虑长期供货和成本。芯片选型不只是技术问题还是供应链问题。我见过团队选了一款性能很好的芯片结果供货周期长达半年项目进度直接卡住。选型时要把供货周期、价格波动、替代方案都考虑进去。4. 推理引擎层从单卡吞吐到首Token延迟的平衡术4.1 推理引擎的核心机制推理引擎的本质是一个调度器加执行器。调度器决定什么时候、用什么batch size、按什么顺序执行请求执行器负责把计算图映射到芯片上跑起来。效率优化的核心就是让调度器的决策和执行器的能力匹配上。现在主流的推理引擎大致分两类一类是通用框架支持模型广、上手快但针对性优化少另一类是专用引擎针对特定模型或特定硬件深度优化性能好但通用性差。我的经验是主力业务用专用引擎长尾业务用通用框架这样既能保证核心场景的效率又能覆盖多样化的需求。4.2 批处理策略的取舍批处理是推理引擎提吞吐最直接的手段但batch size不是越大越好。batch size增大吞吐会提升但首Token延迟也会增加因为要等批次攒满。这里有个平衡点我一般用下面的方法找先测一组数据batch size从1到最大记录吞吐和首Token延迟。然后画两条曲线一条是吞吐随batch size的变化一条是首Token延迟随batch size的变化。两条曲线的交点附近就是性价比最高的batch size。实测数据大概是这样Batch Size吞吐(Token/s)首Token延迟(ms)112045442068876095161280150321900260642400480可以看到batch size从1到16吞吐涨了10倍首Token延迟只涨了3倍多但从16到64吞吐只涨了不到1倍首Token延迟却涨了3倍多。所以在线场景我一般把batch size控制在8到16之间离线场景可以放到32甚至64。4.3 量化与算子优化的实操量化是提吞吐的利器但量化会损失精度需要做精度补偿。我一般用训练后量化加校准的方式先用少量校准数据统计激活值分布再确定量化参数。INT8量化通常能把吞吐提升50%以上精度损失控制在1%以内。算子优化方面重点是融合常见模式。比如Attention里的QKV计算、Softmax、输出投影可以融合成一个大算子FFN里的两个线性层加激活函数也可以融合。融合后kernel launch次数减少数据搬运减少利用率自然就上去了。注意量化不是万能的有些模型对量化很敏感尤其是涉及长尾分布或数值范围跨度大的层。量化前一定要做精度评估量化后要做回归测试确保业务指标不下降。4.4 首Token延迟的优化技巧首Token延迟对在线体验影响很大优化手段主要有三个预填充、投机采样、KV Cache复用。预填充是在请求到来前就把系统提示词和固定上下文算好请求来了直接算用户输入部分能省不少时间。投机采样是用一个小模型先猜几个Token大模型再验证猜对了就省一次前向。KV Cache复用则是把多轮对话里重复的上下文缓存起来避免重复计算。这三个手段叠加首Token延迟能降30%到50%。不过投机采样会增加显存占用KV Cache复用需要精细的缓存管理都有额外的复杂度要根据场景权衡。5. 集群调度层让每一张卡都不闲着5.1 调度器的核心目标集群调度的核心目标就一个让集群利用率尽可能高同时保证请求的SLA。听起来简单做起来难。因为请求是动态的卡的状态是动态的网络拓扑是固定的调度器要在这些约束下做实时决策。我见过很多集群单卡利用率看着挺高但集群整体利用率只有50%到60%。问题往往出在调度策略上要么是请求分配不均有的卡排队有的卡闲着要么是拓扑不感知跨节点通信开销把算力吃掉了要么是扩缩容不及时高峰期扛不住、低谷期空转。5.2 拓扑感知调度的实现拓扑感知的意思是调度器要知道卡和卡之间、节点和节点之间的通信带宽和延迟把通信密集的请求尽量放在通信快的卡上。比如同一个模型的多个请求如果放在同一个NUMA节点内通信走片内总线延迟低带宽高如果跨NUMA节点走片间互联延迟和带宽都差一截。实现拓扑感知调度需要做三件事采集拓扑信息、建模通信开销、设计调度算法。拓扑信息可以从系统接口读通信开销可以实测建模调度算法可以用启发式规则也可以用优化求解。我一般用启发式规则简单有效实时性好。实测下来拓扑感知调度能把集群利用率提升10%到20%跨节点通信开销降低30%以上。对于通信密集的大模型推理这个提升很可观。5.3 动态批处理与请求排队动态批处理是调度层的另一个重点。静态批处理要等批次攒满才执行动态批处理则是请求来了就尽量塞进当前批次塞不下就开新批次。这样既能保证吞吐又能降低延迟。动态批处理的难点在于批次管理。批次太大延迟高批次太小吞吐低要在两者之间找平衡。我的做法是设一个延迟上限比如首Token延迟不超过200ms在这个约束下尽量攒大批次。同时用优先级队列高优先级请求优先处理低优先级请求可以等一等。请求排队也有讲究。简单的FIFO队列在混合负载下表现不好高优先级请求会被低优先级请求堵住。我一般用多级队列按优先级分层每层内部再用公平调度保证高优先级请求的SLA同时不让低优先级请求饿死。5.4 弹性扩缩容的策略弹性扩缩容是应对负载波动的关键。扩得太慢高峰期扛不住缩得太快低谷期刚缩完又来请求反复抖动。我一般用预测加反馈的方式用历史数据预测未来一段时间的负载提前扩容同时用实时指标做反馈负载真的上来了再补扩容。扩容的粒度也要考虑。按卡扩容太细调度开销大按节点扩容太粗资源浪费。我一般按最小推理单元扩容一个单元包含若干张卡能独立跑一个模型实例。这样扩容粒度适中调度也简单。6. 供电散热层稳定频率才是真效率6.1 供电设计的关键参数供电设计不好芯片跑不满频率前面所有的优化都是白搭。供电设计的关键参数有三个功率冗余、电压稳定性、瞬态响应。功率冗余是指电源额定功率要留出余量一般留20%到30%。因为芯片的功耗是动态的峰值功耗可能比平均功耗高不少冗余不够就会触发保护降频。电压稳定性是指供电电压要稳波动太大会影响芯片寿命和稳定性。瞬态响应是指负载突变时电压恢复的速度响应慢会导致芯片短暂欠压影响计算正确性。我做过一个测试同样一张卡供电冗余充足时能稳定跑在标称频率冗余不足时频率会掉10%到15%吞吐直接跟着掉。所以供电这块不能省省下来的钱会在效率上加倍还回去。6.2 散热方案的选择与实测散热方案主要有风冷和液冷两种。风冷成本低、维护简单但散热能力有限适合单卡功耗不高的场景。液冷散热能力强、噪音低但成本高、维护复杂适合高密度高功耗的场景。我实测过两种方案在相同负载下的表现指标风冷液冷单卡功耗350W350W稳定频率标称的92%标称的99%进出风温差15℃8℃噪音65dB45dB单卡散热成本低高液冷能把频率稳定在标称的99%风冷只能到92%这7%的频率差异直接反映在吞吐上。如果集群规模大、电费占比高液冷的长期成本反而更低。6.3 能效比与PUE的优化PUE是数据中心能效的核心指标等于总能耗除以IT设备能耗。PUE越接近1能效越高。优化PUE的手段主要有提高供电效率、优化散热气流、利用自然冷源。供电效率方面用高效电源模块减少转换损耗。散热气流方面做好冷热通道隔离避免热风回流。自然冷源方面在气候适宜的地区可以用新风冷却大幅降低制冷能耗。我见过一个集群通过冷热通道隔离和自然冷源改造PUE从1.5降到了1.2一年电费省了30%多。这个投入产出比很高值得认真做。7. 运营层把算力变成实打实的业务价值7.1 Token用量监控与成本核算运营层的第一件事是把Token用量算清楚。很多团队只知道总用量不知道每个业务、每个模型、每个时段的用量分布优化就无从下手。我一般会建一个用量监控系统按业务、模型、时段、用户多个维度统计Token用量再结合成本算出单位Token成本。单位Token成本的计算公式是单位Token成本 (芯片折旧 电费 运维人力 网络成本) / 总Token产出这个数字是运营优化的核心指标。它降下来了说明效率真的提升了它没降说明优化没做到点子上。7.2 配额管理与优先级策略配额管理是保证公平和控制成本的手段。我一般按业务线分配配额配额内按需使用超配额要审批。同时设优先级核心业务高优先级保证SLA非核心业务低优先级可以排队或降级。优先级策略要和调度层联动。高优先级请求在调度时优先分配资源低优先级请求在资源紧张时可以被抢占或降级。这样既能保证核心业务的体验又能把闲置资源利用起来。7.3 弹性扩缩容与成本平衡运营层的弹性扩缩容和调度层不同调度层关注的是请求级别的调度运营层关注的是资源级别的扩缩容。高峰期扩容低谷期缩容把成本压到最低。扩缩容的决策要结合业务预测和成本预算。业务预测告诉你未来需要多少资源成本预算告诉你最多能花多少钱两者结合决定扩缩容的节奏和幅度。我一般设一个成本上限在这个上限内尽量保证SLA超了就降级或排队。8. 常见问题与排查技巧实录8.1 推理吞吐突然下降怎么排查吞吐突然下降按下面的顺序排查看芯片频率频率掉了多半是供电或散热问题检查电源冗余和散热状态。看显存占用显存满了会触发换页吞吐断崖式下跌检查是否有内存泄漏或batch size过大。看调度队列队列积压说明调度跟不上检查调度器状态和请求分布。看网络跨节点通信延迟高会拖慢推理检查网络拓扑和带宽占用。看引擎日志引擎报错或降级会直接影响吞吐检查日志里的警告和错误。8.2 首Token延迟高的常见原因首Token延迟高常见原因有batch size过大等批次攒满的时间太长降低batch size或改用动态批处理。KV Cache未复用多轮对话重复计算上下文启用KV Cache复用。模型加载慢权重加载或算子编译耗时做预加载或算子缓存。调度排队请求在队列里等太久优化调度策略或扩容。8.3 集群利用率低的排查思路集群利用率低按下面的思路排查现象可能原因排查手段单卡利用率高但集群低请求分配不均检查调度器的分配策略单卡利用率低请求不足或batch太小检查请求量和batch配置跨节点通信多拓扑不感知检查调度是否拓扑感知频繁扩缩容负载预测不准检查预测模型和扩缩容策略高峰期降频供电散热不足检查供电冗余和散热状态8.4 实操避坑清单最后分享几个我踩过的坑坑一量化后没做精度回归上线后发现业务指标下降回滚代价很大。量化后一定要做完整的回归测试。坑二调度器没做拓扑感知跨节点通信把算力吃掉了30%后来加了拓扑感知才把利用率提上来。坑三供电冗余不足高峰期降频吞吐掉了15%后来升级了电源才解决。坑四散热风道设计不合理热风回流导致部分卡温度过高降频后来做了冷热通道隔离才稳定。坑五运营层没做用量监控成本失控了才发现后来建了多维度的用量监控才把成本管住。这些坑的共同点是单点看着没问题系统性问题暴露出来才发现。所以全栈视角不是口号是实打实的排查和优化方法。每个环节都要有监控、有指标、有预案才能把Token生产效率真正做上去。9. 一些个人体会做全栈效率优化这几年我最大的体会是效率提升从来不是靠某一个神奇的技术而是靠对整条链路的理解和持续打磨。芯片选型、引擎调优、集群调度、供电散热、运营管理每一环都有优化空间每一环的优化都会影响其他环。把每一环都做到80分整体效率就能到80分只把一环做到100分其他环60分整体效率还是60分。另外优化要有数据支撑。我见过太多凭感觉优化的案例改了一堆配置效果全靠猜。正确的做法是先建监控、再定位瓶颈、然后针对性优化、最后用数据验证。这个循环走几遍效率自然就上去了。最后再分享一个小技巧优化前先算账。算清楚当前的单位Token成本算清楚每个优化手段的预期收益和投入优先做投入产出比高的。这样优化不会跑偏资源也不会浪费。
返回列表