ik_llama.cpp sweep-bench 基准测试的 batch warmup:消除 CUDA 首轮 PP 性能偏差
ik_llama.cpp sweep-bench 基准测试的 batch warmup消除 CUDA 首轮 PP 性能偏差【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp导读llama-sweep-bench是 ik_llama.cpp 提供的性能扫描基准工具它沿着整个上下文长度逐窗口测量 prompt processingPP与 token generationTG性能。在 CUDA 后端上运行时一个常见现象是N_KV 0即第一次 PP 测量的吞吐明显低于后续N_KV 0的测量值导致基准结果出现误导性的首个数据点凹陷。本文以 PR #375 引入的--warmup-batch-wb批处理预热机制为主线结合仓库源码解析该问题的成因、参数实现细节与实测效果帮助读者正确配置 sweep-bench获得稳定、可复现的 GPU 性能曲线。sweep-bench 基准工具与首个数据点问题llama-sweep-bench的目标是可视化性能随上下文大小变化的曲线而不是像llama-bench那样对固定规模求平均。其核心逻辑位于 examples/sweep-bench/sweep-bench.cpp主循环以n_ubatch为步长遍历整个上下文const unsigned int pp params.n_ubatch; const unsigned int tg params.n_predict 0 ? params.n_predict : params.n_ubatch / 4; ... for (unsigned int n_kv 0; n_kv n_kv_max; n_kv params.n_ubatch) {每个窗口内先测 TG生成tg个 token再清理 KV cache 后测 PP处理一个pp大小的随机 token 批次输出PP / TG / N_KV / T_PP / S_PP / T_TG / S_TG七列指标其中S_PP与S_TG分别是 PP 与 TG 的吞吐tokens/s。问题出在 CUDA 后端当N_KV 0时这是进程内第一次实际执行llama_decode的 PP 批次。ikawrakow 在 PR 描述中给出的判断是GPU 需要从预编译内核缓存pre-compiled kernel cache中查找并加载本次计算所需的 CUDA kernel这一开销与计算一个 batch 本身的时间相比不可忽略于是第一次 PP 测量值被拖低随后相同负载的测量反而更高。这一猜测指向的是 CUDA 运行时的 JIT/缓存加载延迟而非模型本身的计算特性。PR #374 的曲线图直接呈现了这一凹陷N_KV 0的S_PP明显低于相邻的N_KV 512数据点整条曲线在起点处异常下弯。如果用户在分析 PP 性能随上下文长度的变化趋势这个假象会被误读为上下文为空时 PP 更慢。解决方案--warmup-batch 批处理预热为防止这个误导性结果PR #375 为 sweep-bench 增加了**批处理预热batch warmup**能力在正式测量之前先用一个大小为n_ubatch的 token 批次跑一次完整解码把内核加载、显存分配等一次性开销提前消费掉再进行计时测量。启用方式./bin/llama-sweep-bench --warmup-batch other_arguments # 等价短选项 ./bin/llama-sweep-bench -wb other_arguments该选项默认关闭。原因在 PR 描述中写得很清楚对一个规模很大的模型即使只计算一个 CPU batch 也可能耗费可观的时间因此默认不开启以免拖慢单次基准运行但做过一次 batch warmup 并不会影响后续测量的性能数值。参数解析与实现位置参数解析在公共参数层完成见 common/common.cppif (arg -wb || arg --warmup-batch) { params.batch_warmup true; return true; }对应的参数成员定义在 common/common.hbool warmup true; // warmup run bool batch_warmup false; // batch warmup run帮助文本注册在 common/common.cpp 的 bench 分组-wb, --warmup-batch run a warmup batch before measurement而 sweep-bench 自身的使用说明也在 examples/sweep-bench/sweep-bench.cpp 中重复声明-wb, --warmup-batch run a warmup batch before measurement注意这里的层次关系命令行选项注册在commongpt_params因此理论上所有链接 common 库的示例程序都能解析该参数但实际执行逻辑batch 的构造与解码只实现在 sweep-bench.cpp 中。这正是 PR 讨论中 saood06 指出的实现未下沉到 common的问题——ikawrakow 的回应是统一 warmup 方案尚不明确先不动 common 的现有 warmup避免影响所有示例后续可用单独 PR 完善。源码级的预热执行流程预热逻辑位于 examples/sweep-bench/sweep-bench.cpp紧跟在常规 warmup 之后、llama_reset_timings(ctx)之前// warm up if (params.warmup) { common_batch_add(batch, bos, 0, { 0 }, false); if (!decode_helper(ctx, batch, ctx_params.n_batch)) { LOG_TEE(%s: llama_decode() failed\n, __func__); return 1; } } if (params.batch_warmup) { // clean up KV cache after generation llama_kv_cache_seq_rm(ctx, 0, params.n_ubatch, -1); // prepare batch of pp size for prompt processing performance measurement common_batch_clear(batch); for (unsigned int i 0; i params.n_ubatch; i) { common_batch_add(batch, std::rand() % n_vocab, i, { 0 }, false); } if (!decode_helper(ctx, batch, ctx_params.n_ubatch)) { LOG_TEE(%s: llama_decode() failed\n, __func__); return 1; } } common_batch_clear(batch); llama_kv_cache_clear(ctx); llama_reset_timings(ctx);三段代码各司其职常规 warmupparams.warmup默认开启向 batch 中加入一个 BOS token 后解码一次。这一机制源于 common 层的统一实现对应 common/common.cpp用单个 BOS若模型无 BOS 则用 EOS做一次空跑随后llama_kv_cache_clearllama_synchronizellama_reset_timings。它只预热了最基础的 kernel 路径规模与正式 PP 测量一个 ubatch 的随机 token不匹配因此不足以消除 CUDA 首批加载延迟。batch warmupparams.batch_warmupPR 新增先通过llama_kv_cache_seq_rm(ctx, 0, params.n_ubatch, -1)清理上一阶段留下的 KV cache再构造一个与正式测量完全相同规模n_ubatch个随机 token、logits 标记、位置从 0 开始的 batch并以ctx_params.n_ubatch为解码步长执行decode_helper。它精确复刻了pp_helper的负载形态examples/sweep-bench/sweep-bench.cpp从而触发与正式 PP 测量一致的内核集合与显存分配路径。收尾复位llama_kv_cache_clear(ctx)清空 KV cachellama_reset_timings(ctx)将计时归零确保 warmup 产生的 token 与时间不会计入任何测量窗口——这也解释了 PR 中测量性能不受 batch warmup 影响的结论。负载形态的关键pp 与 tg 的取值从 examples/sweep-bench/sweep-bench.cpp 可以看到const unsigned int pp params.n_ubatch; const unsigned int tg params.n_predict 0 ? params.n_predict : params.n_ubatch / 4;PP 批次大小固定等于n_ubatch这正是 batch warmup 选择用n_ubatch个 token 的原因只有让预热负载与测量负载规模一致才能把内核查找 加载 首次分配的延迟完整地复现并排除。而 TG 默认是n_ubatch / 4对应 README 中每次生成 ubatch/4 个 token不生成整个窗口以节省时间的说明examples/sweep-bench/README.md。实测效果对比PR 讨论区中 ubergarm 在Qwen3-30B-A3B的IQ4_KGGUF 模型上做了同一台机器的对照实验命令完全一致仅差一个--warmup-batchCUDA_VISIBLE_DEVICES0 \ ./build/bin/llama-sweep-bench \ --model $model \ -fmoe \ -fa \ -ctk f16 -ctv f16 \ -c 32768 \ -ngl 99 \ --threads 1 \ --warmup-batch # 仅 PR 分支追加此行main 基线无 batch warmupPPTGN_KVT_PP sS_PP t/sT_TG sS_TG t/s51212800.3331538.111.228104.215121285120.3031691.861.253102.1951212810240.3081661.261.247102.6751212815360.3091658.421.257101.8551212820480.3221591.581.29099.2651212825600.3131637.871.28999.2751212830720.3211596.371.29498.9051212835840.3191606.051.30198.41PR #375启用 batch warmupPPTGN_KVT_PP sS_PP t/sT_TG sS_TG t/s51212800.3131635.741.235103.675121285120.3061674.181.259101.6451212810240.3061673.911.253102.1551212815360.3171615.141.270100.8151212820480.3101653.471.28799.4851212825600.3141630.521.28799.4551212830720.3161619.711.29199.1651212835840.3181608.001.30298.32对照结论很直观无 warmup 时N_KV 0的S_PP为 1538.11 t/s比N_KV 512的 1691.86 t/s 低约9%呈现出明显的首点凹陷启用--warmup-batch后N_KV 0的S_PP提升到 1635.74 t/s与相邻窗口1674.18 / 1673.91 t/s基本齐平曲线起点恢复平滑后续各窗口的数值在两次运行间高度一致进一步印证了batch warmup 不干扰正式测量。需要说明以上为 ubergarm 在特定硬件、特定模型与-fmoe -fa -ctk f16 -ctv f16 -ngl 99配置下的实测数据属于该 PR 讨论中的真实记录具体改善幅度取决于 GPU、模型规模与量化类型不能外推为普适结论。与 common 统一 warmup 的边界讨论PR 讨论中涉及两个值得记录的设计决策为什么不把实现下沉到 commonsaood06 提议把 batch warmup 做成所有使用 common 的示例如全量 offload 的llama-server都可用的全局选项。ikawrakow 的回应是命令行选项已注册在common参数理论上全局可用但统一 warmup 的实现形态尚未确定可能是独立的batch_warmup也可能与现有warmup合并此时贸然改动 common 的 warmup 会波及所有示例程序因此实现先留在 sweep-bench.cpp等方案定型后再复用。这与当前仓库代码一致common层只保存开关与解析执行逻辑只在 sweep-bench 内。为什么llama-bench不采用同一方案ikawrakow 说明llama-bench是另一种动物它的 warmup 依赖被测负载类型PP 跑一个 batch、TG 跑单个 token且依赖重复测量而非单次采样——即使不做专门的 batch warmup也可以通过llama-bench -p 512,512跑两遍并丢弃第一个结果来获得等效效果。而 sweep-bench 对每个N_KV窗口默认只测一次-nrep默认 1没有冗余测量来吸收首次加载开销因此需要显式的 batch warmup。-nrep与重复测量sweep-bench 支持-nrep, --n-repetitions N默认 1对每个上下文窗口重复测量以及--sweep-stride N默认 1每 N 行测一次见 examples/sweep-bench/sweep-bench.cpp。saood06 提到的给 sweep-bench 加-r重复最终以-nrep形式落地。在追求更高置信度时可将--warmup-batch与-nrep组合使用。使用建议与配套工具典型用法组合# 最小示例参见 README ./llama-sweep-bench -c 8704 -ub 512 -m models/Meta-Llama-3.2-3B-Instruct-Q8_0.gguf # CUDA 上消除首点偏差的推荐形态 ./llama-sweep-bench -m model.gguf -c 32768 -ub 512 -ngl 99 -fa -wb # 更高置信度warmup 每窗口多次重复 ./llama-sweep-bench -m model.gguf -c 32768 -ub 512 -wb -nrep 3输出与可视化默认输出 Markdown 表格传--output-format jsonl可输出逐窗口 JSON 记录每行包含n_kv_max / n_batch / n_ubatch / flash_attn / n_gpu_layers / n_threads / pp / tg / n_kv / t_pp / speed_pp / t_tg / speed_tg等字段见 examples/sweep-bench/README.md 的 JSONL 示例仓库附带 examples/sweep-bench/sweep-bench-plot.py可读取 Markdown 表格或 JSONL 生成speed_pp/speed_tg随n_kv变化的均值与标准差曲线适合直接对比开/关 warmup或不同模型/量化方案的曲线形态内存观测可加--sweep-memory表格会额外输出RSS HWMLinux/macOS 下通过getrusage读取Windows 返回 n/a与 CUDA VRAM 增量列。小结sweep-bench的--warmup-batch解决的是一个具体而隐蔽的基准测试问题CUDA 首次 PP 批次的 kernel 缓存加载延迟会让N_KV 0数据点系统性偏低。通过在正式计时前执行一次与测量同规模的n_ubatchtoken 解码并在llama_reset_timings前清空 KV cache该开销被完全隔离在测量窗口之外。该选项默认关闭、实现局限于 sweep-bench 本身的设计取舍保证了 common 层现有 warmup 行为不受影响配合-nrep、--sweep-stride与 JSONL 输出即可在 CUDA 上获得平滑、可信、可复现的性能—上下文长度曲线。延伸阅读sweep-bench 完整用法与字段含义examples/sweep-bench/README.md预热实现源码examples/sweep-bench/sweep-bench.cpp参数定义与解析common/common.h、common/common.cpp绘图脚本examples/sweep-bench/sweep-bench-plot.py【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TiXL 默认音频输入设备指南:让实时动效项目跨机器可移植的 WASAPI 输入选择机制

TiXL 默认音频输入设备指南:让实时动效项目跨机器可移植的 WASAPI 输入选择机制

TiXL 默认音频输入设备指南:让实时动效项目跨机器可移植的 WASAPI 输入选择机制 【免费下载链接】t3 TiXL is an open source software to create realtime motion graphics. 项目地址: https://gitcode.com/GitHub_Trending/t3/t3 导读 TiXL(to…

2026/9/19 21:56:51 阅读更多 →
LibreHardwareMonitor 电脑硬件监控完整指南:5 分钟看明白 CPU 温度、风扇与电压

LibreHardwareMonitor 电脑硬件监控完整指南:5 分钟看明白 CPU 温度、风扇与电压

LibreHardwareMonitor 电脑硬件监控完整指南:5 分钟看明白 CPU 温度、风扇与电压 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of you…

2026/9/19 21:56:51 阅读更多 →
EtherCAT HotConnect配置与故障隔离:从状态字到4132处理

EtherCAT HotConnect配置与故障隔离:从状态字到4132处理

简介:倍福EtherCAT HotConnect功能设置指南PDF,专注解决工业现场中EtherCAT设备带电插拔导致的网络中断问题,适用对象为使用倍福控制器的自动化工程师与系统集成商。内容以CX9010作为EtherCAT Master、EK1122网关与多台EK1100从站构建的星型/…

2026/9/19 21:55:51 阅读更多 →

最新新闻

应变片压力传感器原理及现场应用要点

应变片压力传感器原理及现场应用要点

简介:围绕应变片压力传感器原理及应用,文档系统介绍了电阻应变片、瓷压力传感器、扩散硅压力传感器和蓝宝石压力传感器等常见类型。内容先以金属丝应变电阻的阻值变化公式入手,解释电阻应变效应,再结合应变电桥与信号放大流程&…

2026/9/19 22:38:12 阅读更多 →
Leaflet WMS Gutter:用 Gutter 渲染彻底解决 WMS 瓦片边界图标截断问题

Leaflet WMS Gutter:用 Gutter 渲染彻底解决 WMS 瓦片边界图标截断问题

Leaflet WMS Gutter:用 Gutter 渲染彻底解决 WMS 瓦片边界图标截断问题 【免费下载链接】Leaflet 🍃 JavaScript library for mobile-friendly interactive maps 🇺🇦 项目地址: https://gitcode.com/gh_mirrors/le/Leaflet …

2026/9/19 22:38:12 阅读更多 →
CMW100 SCDMA终端射频测试:SCPI指令与自动化脚本实践

CMW100 SCDMA终端射频测试:SCPI指令与自动化脚本实践

简介:面向使用Rohde & Schwarz CMW100测试设备进行TD-SCDMA测量的工程师,这份PDF指令手册系统梳理了KM750、KM751、KM012、KS750、KS751、KS760以及KE100/KE750等关键R&S CMW选项的功能定位与应用场景,分别覆盖上行链路发射测量、多评…

2026/9/19 22:38:12 阅读更多 →
校园二手交易平台技术方案:从数据模型到风控落地

校园二手交易平台技术方案:从数据模型到风控落地

简介:一份完整的校园二手交易平台创业项目计划书,适合正在准备创新创业大赛、编写商业计划书或关注大学生闲置物品交易方向的学生与创业团队使用。计划书以线下为主、线上为辅的运营思路为切入点,系统梳理了市场背景、竞争分析、SWOT分析、业…

2026/9/19 22:38:12 阅读更多 →
Noi浏览器指南:多AI助手接入、扩展与提示词模板如何配置

Noi浏览器指南:多AI助手接入、扩展与提示词模板如何配置

Noi浏览器指南:多AI助手接入、扩展与提示词模板如何配置 【免费下载链接】Noi 🚀 Less chaos. More flow. 项目地址: https://gitcode.com/GitHub_Trending/no/Noi 写文章时问一个AI,写代码又想换另一个。几个窗口来回切,确…

2026/9/19 22:38:12 阅读更多 →
同一把 TaoToken Key,Cursor 从 GPT-4 切到 Claude

同一把 TaoToken Key,Cursor 从 GPT-4 切到 Claude

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 22:37:12 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →