讲的是端侧推理性能基准测试方法,涵盖延迟吞吐量内存和功耗等关键指标的测量方案。你会学到延迟和吞吐量怎么测、内存峰值怎么监控、功耗怎么测量、不同硬件平台的性能对比方法,以及基准报告怎么写,适用场景包括需要科学评估端侧推理性能做硬件选型或优化的场景。面向需要做端侧推理性能基准测试的工程师和研究员,帮你快速掌握核心要点并应用到实际项目中实现高效落地。
需要学习端侧推理性能基准,大模型是当前最热门话题,通识讲师必须紧跟前沿。本篇涵盖Transformer架构、预训练/微调/RLHF、Prompt工程,帮助你掌握大模型原理与应用。
可视化演示
讲的是端侧推理性能基准测试方法,涵盖延迟吞吐量内存和功耗等关键指标的测量方案。你会学到延迟和吞吐量怎么测、内存峰值怎么监控、功耗怎么测量、不同硬件平台的性能对比方法,以及基准报告怎么写,适用场景包括需要科学评估端侧推理性...
测试准备规划
办咖啡师测评前不能直接开赛。如果A门店用精品豆,B门店用速溶粉,即使同一双手,结果也不公平。所以测评要先制定“同一份菜单、同一批原料、同一台设备状态”,再决定谁去测试。端侧推理性能基准测试也一样。先固定输入集,把问题长度和难度统一;再固定运行环境,包括操作系统版本、CPU/GPU频率、是否关闭后台App;最后建立预热机制,让模型和硬件进入稳定工作状态,而不是冷启动时手忙脚乱的样子。
输入集要覆盖真实场景,不能只用一条短文本。推荐混合短、中、长三种输入长度,让结果有代表性。正式测试前先跑10到20轮预热,让缓存和芯片频率稳定下来;正式轮次建议不少于30次,这样统计才有意义。测试时关闭自动更新、消息推送等后台任务,记录芯片是否降频,因为降频会直接影响延迟和功耗。
这就像统一了咖啡豆、水温和杯型之后,测出来的出杯速度才真正属于咖啡师,而不是属于某家门店的高级设备。
延迟测量方法
顾客开口点单到拿到咖啡,中间要经历确认订单、压粉、萃取、打奶泡多个环节。用户最关心的是“从开口到第一口”的等待时间,而不是后厨里某个单一环节。在生成式AI里,这个概念被拆成两个关键延迟:端到端延迟是从用户提交输入到完整回答结束的时间;首Token延迟则只统计模型生成第一个输出Token的时间,它决定了用户等待第一屏文字出现的体感。
测量延迟并不复杂:给推理调用包一层高精度计时器,按相同流程反复运行,记录每次的耗时。但只看平均数是危险的,因为偶发卡顿会形成长长的尾部。我们需要用百分位数来观察分布,尤其是P95和P99。P95延迟的含义是:在100次请求里,有95次比这个值更快。
把N次延迟从小到大排序,第p个百分点位置上的延迟值,就是Pp延迟。
- 记录N次延迟收集至少30次成功的推理延迟样本,作为整体性能的观察值。
- 从小到大排序将这些样本按耗时从短到长排列,得到有序序列。
- 计算索引位置用百分位数乘以总样本数并向上取整,得到目标位置k。
- 读取目标值有序序列中第k个值就是Pp延迟,例如P95代表95%的请求比它快。 用延迟百分位数来看咖啡师表现,就像重点观察“高峰期最忙的那5%订单等待多久”,而不是只报一个总平均出杯时间。这样才不至于被偶发的幸运数字骗过。
吞吐量评估
测完单杯出杯速度,还要看咖啡师一整天的出品能力。有的咖啡师一杯杯做很稳,但一次同时做四杯时会更快;可是如果同时涌入八个客人,柜台又会变得混乱。端侧AI也有同样问题:模型的吞吐量通常用每秒生成的Token数来表示,缩写为token/s。吞吐量高的模型,单位时间能服务更多请求,在多用户并发或批处理场景中尤其重要。
测试吞吐量时要固定总的测试任务量。比如一次连续向模型发送大量输入,统计一共生成了多少个Token,再除以总耗时。批处理大小会影响结果:批处理越大,硬件利用率越高,吞吐量通常也越高,但代价是内存占用和单次响应延迟都会上升。所以基准测试要分别记录不同批处理下的吞吐量。
吞吐量等于一定测试时间内完成的Token总数除以总耗时。
- 累计生成Token数统计完整测试过程中模型输出的所有Token数量。
- 统计总耗时记录从第一个请求开始到最后一个请求结束的墙钟时间。
- 相除得到吞吐量Token总数除以总秒数,得到每秒处理能力。 咖啡店老板用“杯/小时”评价员工,AI工程师用“token/s”评价模型。吞吐量测试告诉我们,这位AI咖啡师不只是单品做得快,还是能扛得住一整天的连续出杯。
内存监控手段
工作台空间决定咖啡师能同时展开多少杯和工具。如果台面被豆子、牛奶、杯具占满,一来新的订单就会手忙脚乱,甚至打翻杯子。手机上的推理同样受内存约束:模型权重加载后占据的空间是静态内存;推理过程中产生的中间激活值、特征图则属于动态内存。运行到某一步时,两者叠加达到最高点,就是峰值内存。
内存监控通常借助系统工具或内存分析库去读取进程占用,例如查看最高地址、RSS或专用内存接口。测试时要故意使用最大输入长度和最大批处理,把峰值逼出来;还要连续跑多轮,观察内存是否一轮比一轮高。如果持续上涨而从不回落,就说明可能存在内存泄漏。
如果峰值内存超出设备可用内存,再快的模型也会被系统杀掉。就像咖啡师技术再好,台面不够,也会在高峰期把柜台炸掉,所以内存峰值是端侧模型能否落地的硬门槛。
功耗测量方案
咖啡师连续工作八小时会腿软、冒汗、心跳加快;手机持续跑模型也会发热、电量下降、触发降频。在端侧AI场景里,功耗不是可有可无的辅助指标,而是决定设备能用多久、会不会烫手的关键。功耗测量通常通过电流电压采集工具或设备电池监控接口完成,记录平均功耗、峰值功耗,再换算成能效比。
平均功耗反映整个测试周期的耗电水平;峰值功耗反映瞬时高负载对供电和散热的压力。更常用的是“每Token能耗”,它把速度和功耗统一到一个数字上:能耗越低,说明模型在省电的同时还不耽误干活。
每Token能耗等于测试期间平均功耗乘以总时长,再除以生成的Token总数。
- 记录平均功耗统计整个测试过程中的平均功率,单位是瓦特。
- 统计总时长记录从任务开始到结束的完整时间,单位是秒。
- 计算总能耗平均功耗乘以总时长,得到测试消耗的总能量,单位是焦耳。
- 除以Token总数总能耗除以生成的Token数量,得到每个Token的平均能量成本。 体力消耗决定咖啡师能不能值满一个班次;能量消耗决定手机能不能坚持到晚上回家。功耗指标把“能干多少活”和“吃多少饭”统一在一起,是端侧模型选型时非常重要的体检项。
平台对比策略
比较两个门店的咖啡师,一个用商用咖啡机,一个用家用小机器。如果菜单、杯子、流程都不一样,测出来的差距是人的还是设备的,根本说不清。因此必须让所有咖啡师用同一张试卷。端侧AI也面对同一个问题:不同手机SoC、不同内存带宽、不同系统调度策略,都会让同一个模型跑出完全不同的成绩。
公平对比的核心要求是:同一模型、同一量化精度、同一组输入、同一线程数、同一测试脚本。还要记录每台设备的芯片型号、大核频率、内存余量和温度状态。设备是否降频直接影响结果,所以不能只看宣传跑分,必须实测。为了让不同量级的指标可以横向比较,可以把每个平台的延迟、吞吐、内存、功耗换算成归一化得分。
通过“同一张试卷”,赢的人才是真正的强者。否则你分不清到底是模型更优,还是仅仅因为那台手机芯片更贵、散热更好。
数据分析处理
多次比赛不能只看最好成绩。某一次豆子刚好在最佳状态,成绩特别高;另一次有人突然进来问路,咖啡师分心多花了五秒钟。这些偶然因素在基准测试里叫“抖动”。如果只看平均值,一次极端卡顿就可能把整体印象带偏。所以在延迟、吞吐、内存、功耗的原始记录出来后,要先看时序图和分布,再看中位数、均值、标准差和置信区间。
统计上常用的做法是给出样本均值和95%置信区间,说明“真实平均水平大概率落在哪个范围”。清理异常值时也要小心,不能没有理由地删数据。如果设备在测试中途降频,应当把降频前后的数据分开报告,因为它们的硬件状态不同,混在一起会掩盖真实规律。
置信区间用样本均值和标准差估算真实平均值的可能范围,z通常取1.96代表95%置信水平。
- 计算样本均值把所有延迟样本求和后除以样本数量n。
- 计算样本标准差衡量每个样本与均值的偏差程度,抖动越大,标准差越大。
- 计算标准误标准差除以样本量的平方根,表示均值的波动大小。
- 乘上z分数得到区间大约95%的置信区间是均值上下各1.96倍标准误。 测评结论不能靠“手感”。就像咖啡厅要在翻台率、好评率、返单率的稳定区间里做决策一样,AI工程师也要在置信区间里做判断。数据稳了,结论才可信。
基准报告编写
比赛结束后,老板需要一份总结:用的什么豆子、什么机器、测了多少轮、谁胜出、怎么复现。这份报告决定要不要录用这位AI咖啡师。如果只留下一句“A比B快”,下次换一台新手机就完全无法对照。因此,一份合格的端侧推理基准测试报告必须让别人能在相同条件下重新得到相近结果。
报告的标准结构应包括:测试目的、设备环境、系统版本、模型名称与量化配置、输入数据描述、预热轮次与重复次数、指标定义、原始统计结果、图表和最终结论。还要附上测试日期和使用的脚本版本,最好给出可复现的具体命令。这样任何接手的人都能按图索骥。
没有完整报告,测试数据就像用过就扔的塑料袋,无法沉淀价值。有了报告,每次测评都能变成可追溯的“星级档案”,帮助团队在后续版本里持续回看性能是否倒退。
AI 应用场景
端侧模型发布前回归验收
阶段:模型部署与验证
解决的问题:新量化模型能不能在旧手机上流畅运行?传统做法靠用户反馈“变卡了”才追查,此时损害已经发生。用基准测试,可以在发布前对高中低端手机统一跑一遍延迟、内存、功耗指标。
具体案例:某App团队在5台覆盖高中低端的手机上跑固定输入集20轮,发现低端机P95延迟从120ms涨到260ms,于是决定不全面铺开,只对高端机灰度发布,避免口碑崩盘。
相关角色:端侧AI算法工程师、性能优化工程师
智能硬件芯片选型
阶段:硬件选型与成本评估
解决的问题:面对多款候选SoC,哪一颗芯片跑视觉模型既快又省电还便宜?传统方法只对比纸面算力,很难反映真实推理体验。用统一基准协议在同一模型、同一输入条件下实测,数据直接支持决策。
具体案例:一家机器人公司测量了三款芯片运行同样视觉模型的延迟、峰值内存和每Token能耗,最终选择了功耗最低、性价比最高的方案。
相关角色:AI平台架构师、嵌入式AI工程师
Python 演示
import timeimport mathimport randomimport statisticsimport tracemalloc def mock_inference(steps=40000): ""“模拟端侧模型推理,做一段浮点运算以产生可测量的耗时”"" total = 0.0 for i in range(steps): total += math.sqrt(float((i % 997) + 1)) return total def main(): input_steps = 40000 warmup = 5 repeats = 30 print(“准备阶段:先加载模型并预热……”) for _ in range(warmup): mock_inference(input_steps) tracemalloc.start() latencies_ms = [] for _ in range(repeats): start = time.perf_counter() mock_inference(input_steps) cost = (time.perf_counter() - start) * 1000.0 latencies_ms.append(cost) current, peak = tracemalloc.get_traced_memory() tracemalloc.stop() avg_ms = statistics.mean(latencies_ms) med_ms = statistics.median(latencies_ms) sorted_ms = sorted(latencies_ms) p95 = sorted_ms[int(0.95 * len(sorted_ms)) - 1] mock_tokens = 16.0 throughput = mock_tokens / (avg_ms / 1000.0) avg_power_w = 2.0 total_time_s = repeats * (avg_ms / 1000.0) energy_per_token = (avg_power_w total_time_s) / (repeats mock_tokens) print(“平均延迟:%.2f ms” % avg_ms) print(“中位延迟:%.2f ms” % med_ms) print(“P95延迟:%.2f ms” % p95) print(“吞吐量:%.2f token/s” % throughput) print(“峰值内存:%.2f MiB” % (peak / 1024 / 1024)) print(“每token能耗:%.4f J” % energy_per_token) if name == "main": main()
常见误区
误区每次测试多跑几轮,最后把延迟加起来除以次数,平均值就代表真实性能。
正解平均值会被少数“幸运极快”或“突发卡顿”的样本拉偏。端侧用户感受到的往往是长尾卡顿,因此要重点看P95和P99延迟。就像咖啡师测评不能只看平均出杯速度,高峰期某个订单等五分钟才是用户真正记住的体验。
为何常见:平均值计算简单,符合日常直觉,但忽略了延迟分布中极其重要的长尾信息。
误区反正要测很多次,先跑十几轮热热身,最后只取正式轮次的数据就行,预热不影响结果。
正解合理预热能稳定缓存和频率,但预热太久可能让设备持续高温而提前降频,反而让正式数据失真。要记录预热轮数,并控制整体测试时长。
为何常见:人们只盯着模型本身,忽略硬件热状态也是一个动态变量。
误区如果测试过程中手机没有内存溢出,就说明模型内存占用没问题。
正解没有崩溃可能只是刚好在可用内存余量内,但内存峰值一旦逼近系统阈值,后台进程就会被杀,体验同样糟糕。还要观察多轮推理后内存是否持续上涨。
为何常见:崩溃是显性信号,内存逼近上限是隐性风险,往往被无意忽略。
误区同一个模型在A手机测出30ms,在B手机测出40ms,所以A一定比B快。
正解如果没有统一输入长度、线程数、量化精度、后台进程状态,数字毫无意义。A测的是浮点模型,B测的是量化模型,结果自然不可比。
为何常见:凭数字大小直接排序是人脑的直觉,但测试条件不统一会让对比失去基础。
误区测了30轮后,把平均延迟或P95算出来就完事,直接写进结论。
正解还需要报告中位数、标准差、置信区间和环境记录,否则换个时间重测可能差异很大。只报单点就像说咖啡师平均出杯快,却不提高峰期的方差有多大。
为何常见:写一个数字比列一堆统计图表容易,但可信度和复现性都会大打折扣。
面试题
Q1. 在端侧推理性能基准测试中,下列哪个指标最能反映用户可感知的卡顿?
- A.平均延迟
- B.P99延迟← 正确答案
- C.吞吐量
- D.内存峰值
答案:B。用户可感知的卡顿主要由罕见的长尾延迟决定,P99延迟能捕捉到最差情况。平均延迟会被大多数快请求拉低,吞吐量关注总量,内存峰值则是资源占用。
Q2. 下列哪项属于性能基准测试中“预热”的主要目的?
- A.让设备提前发热
- B.获得稳定运行状态← 正确答案
- C.提高测试总时长
- D.降低模型精度
答案:B。预热让模型权重进入缓存、芯片频率稳定,之后的测速才不被冷启动干扰。提前发热不是目的,提高时长和降低精度更是错误选项。
Q3. P95延迟的正确含义是什么?
- A.百分之九十五请求≤该延迟← 正确答案
- B.百分之九十五请求≥该延迟
- C.该延迟占全部时间的九十五
- D.延迟值最高的九十五次均值
答案:A。P95表示排序后第95百分位的值,有95%的请求延迟低于或等于它。它描述分布位置,不是时间占比,也不是最高95次的均值。
Q4. 吞吐量测试通常用什么单位表示?
- A.每秒生成Token数← 正确答案
- B.每次请求等待秒数
- C.每毫秒内存字节
- D.每瓦时模型参数量
答案:A。端侧推理吞吐量关注单位时间产出,常用token/s。B是延迟单位,C是内存速率,D混淆了功率与参数量。
Q5. 内存监控中需要重点观察的指标有哪些?
- A.推理运行时峰值内存← 正确答案
- B.模型加载后静态占用← 正确答案
- C.连续多轮内存增长← 正确答案
- D.电池当前剩余电量
答案:ABC。峰值内存反映最高风险点,静态占用决定能否加载,多轮增长用于发现泄漏。电量属于功耗范畴,不是内存监控指标。
Q6. 比较两台手机端侧AI性能时,哪些做法有助于公平对比?
- A.统一输入参数跑基准← 正确答案
- B.记录芯片降频状态← 正确答案
- C.使用相同量化精度← 正确答案
- D.只参考官方跑分网站
答案:ABC。公平对比需要控制输入、频率状态和量化配置。官方跑分无法替代自己业务场景下的实测,且测试环境未必透明。
Q7. 关于端侧能耗比,下列哪个计算方式正确?
- A.总能量除以生成Token数← 正确答案
- B.平均功耗乘以峰值内存
- C.总延迟乘以批量大小
- D.总帧率除以机型价格
答案:A。每Token能耗等于总能量除以Token总数,能综合反映速度和功耗。B把功率乘以内存没有物理意义,C和D更不符合能耗定义。
Q8. 一篇规范的基准报告必须包含哪些内容?
- A.设备与系统环境信息← 正确答案
- B.模型版本与输入描述← 正确答案
- C.预热轮次与重复次数← 正确答案
- D.测试工程师的工作证
答案:ABC。报告要能被复现,必须记录设备环境、模型输入和测试流程。个人身份信息与性能复现无关,不应纳入报告必需项。
Q9. 端到端延迟通常指的是
- A.从输入可传到输出完成
- B.仅模型在CPU上耗时← 正确答案
- C.内存初始化所用时间
- D.模型下载安装的时间
- E.删除降频时段数据
- F.记录频率并分阶段报告
- G.提高CPU占用率
- H.改用云服务器测试
答案:B。降频是端侧真实状态,删除数据会掩盖问题。正确做法是记录频率并分别报告降频前后结果。提高占用率会让降频更严重,改用云服务器则脱离端侧场景。