TTFT/TPOT 基准脚本,把 Codex 的 Base URL 改到 TaoToken 后对照
发布时间:2026/9/20 21:37:38 锦皓数字建站

1. 为什么你的 TTFT/TPOT 对照表总是看反如果你正在做 LLM 推理延迟优化大概率写过或见过类似MockInferenceEngineBenchmarkRunner的基准脚本模拟 chat/rag/code 三种流量跑出 P50/P95/P99再算一个speedup_vs_baseline。脚本能跑报告能出但真正让人头大的是读报告——P99 和 TTFT、TPOT 混在一张表里加速比又是相对基线算的稍不留神就把「谁比谁快」看反了。我自己第一次拿到这种报告时盯着INT8_QUANT的 P99 比 baseline 低、但speedup_vs_baseline却小于 1愣了半天才反应过来加速比是baseline_p99 / strategy_p99分母是策略自己的 P99不是反过来。这种「读法陷阱」在原文的_generate_report里埋得很深光看代码注释根本不够。这篇就按「接入配置」的视角来写先把 Codex 的 Base URL 改到 TaoToken让 Codex 能真正请求模型然后拿它当「逐段解释器」对照原文的percentile函数、INT8_QUANT/SPECULATIVE_DECODE策略表和speedup_vs_baseline字段一段一段把分位值计算和流量模型参数讲清楚。适合已经在跑基准脚本、但报告读不准的工程师也适合想用 Codex 辅助读代码的新手。2. 前置准备把 Codex 的通道接到 TaoToken原文的基准脚本本身不依赖外部模型但你要让 Codex 帮你逐段解释MockInferenceEngine的时间估算模型、RequestGenerator的权重采样、_generate_report的分位值逻辑就得先让 Codex 能请求到模型。这一步的核心就是把 Codex 的 Base URL 指向 TaoToken。先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建账号并生成 Key。拿到 Key 之后Codex 的通道配置里 Base URL 填https://taotoken.net/api注意两点不带/v1后缀也不加任何 UTM 参数。Key 放在对应的 API Key 字段里模型名按你实际要用的填。配完之后别急着让它读长脚本先跑一个最小请求确认通道通。最小请求的作用是排除「Key 错、Base URL 多写了 /v1、网络没通」这类低级问题否则后面 Codex 报错你分不清是通道问题还是脚本问题。2.1 最小验证请求在 Codex 里发一句最简单的请回复channel ok如果返回正常文本说明通道通了。如果报 401检查 Key 是否复制完整如果报 404八成是 Base URL 多带了/v1如果超时先确认https://taotoken.net/api能正常访问。这一步过了再进入逐段解释环节。3. 可复制配置让 Codex 对照原文逐段解释通道通了之后把原文脚本贴给 Codex但别一次性让它「解释整个文件」——那样它只会给你一段泛泛的概述。正确做法是按函数切块一块一块问尤其是下面这三个最容易读反的地方。3.1 先锁定 percentile 函数的边界行为原文的percentile实现是这样的def percentile(sorted_data, p): if not sorted_data: return 0 idx int(len(sorted_data) * p / 100) idx min(idx, len(sorted_data) - 1) return sorted_data[idx]让 Codex 帮你确认当len300、p99时idx int(300 * 99 / 100) 297取的是排序后第 297 个元素0 基也就是第 298 个请求的延迟。这里没有做线性插值是「最近秩」取法。你可以直接问 Codex这段 percentile 在 len300、p99 时返回第几个元素 它和 numpy.percentile 的默认线性插值结果会差多少实测下来Codex 会明确告诉你这是「下取整最近秩」和 numpy 默认的插值法在样本量小时会有可见差异。这个差异直接影响你读 P99——如果你拿这份报告和用 numpy 算的报告对比数字对不上是正常的不是脚本错了。3.2 再核对 speedup_vs_baseline 的分子分母原文里加速比是这样算的baseline_p99 baseline[total_latency][P99] strategy_p99 summary[total_latency][P99] if baseline_p99 0: speedup baseline_p99 / strategy_p99 summary[speedup_vs_baseline] round(speedup, 2)让 Codex 帮你把这句话翻译成自然语言并追问一个反例如果 baseline_p998000msINT8_QUANT 的 P995300ms speedup_vs_baseline 是多少这个值大于 1 说明什么 如果某个策略的 speedup 是 0.8说明它比基线快还是慢Codex 会算出8000/5300 ≈ 1.51并说明大于 1 表示该策略 P99 更低、更快0.8 表示比基线慢。这就是最容易看反的点——很多人下意识觉得「加速比小于 1 是快」其实正好相反。3.3 对照策略表检查加速比字段原文的speedup_factors字典里INT8_QUANT是 1.5SPECULATIVE_DECODE是 1.8。让 Codex 对照这张表检查报告里的speedup_vs_baseline是否和预期方向一致原文 speedup_factors 里 INT8_QUANT1.5、SPECULATIVE_DECODE1.8 但报告里 SPECULATIVE_DECODE 的 speedup_vs_baseline 只有 1.2 可能是什么原因是分位值取法、并发拥塞因子还是输出 token 数随机性导致的Codex 通常会指出speedup_factors只作用于prompt_encode_ms和decode_ms而preprocess_ms不受策略影响再加上concurrency_penalty和输出 token 的随机早停最终 P99 的加速比会被稀释不会精确等于字典里的系数。这个解释能帮你把「理论系数」和「实测加速比」分开看。4. 验证请求跑通基准脚本并核对报告字段配置和解释都到位后回到脚本本身验证。原文的入口是asyncio.run(main())跑的是 chat 流量、300 请求、三个策略对比。你可以先跑一遍原始脚本python benchmark.py跑完后报告里每个策略会有total_latency、ttft、tpot、gpu_memory和speedup_vs_baseline。这时候让 Codex 帮你做一次字段核对这是报告 summary 的 JSON请逐字段说明 1. total_latency.P99 和 ttft.P99 分别对应原文哪个阶段 2. speedup_vs_baseline 是拿哪个字段除以哪个字段 3. 为什么 tpot 只有 P50 和 P95没有 P99第三个问题很关键——原文tpot只算了 P50 和 P95没算 P99。Codex 会告诉你这是原文的字段设计不是漏算如果你需要 TPOT 的 P99得自己补一行percentile(tpot_values, 99)。这种「字段缺失」在真实报告里很常见读之前先确认有哪些分位值比事后猜要靠谱。4.1 三种流量模型的参数对照原文TRAFFIC_MODELS里 chat/rag/code 的权重和范围不同这直接影响你读报告时的预期。让 Codex 帮你列一张对照表流量模型prompt 权重短/中/长输出范围读报告时的预期chat0.70 / 0.20 / 0.1050–500TTFT 偏低P99 受长 prompt 尾部影响rag0.20 / 0.40 / 0.40100–800prompt 普遍长TTFT 的 P99 明显抬高code0.30 / 0.40 / 0.30200–2000输出 token 多TPOT 和总延迟更敏感这张表能帮你判断「某个策略在 rag 下加速比高、在 chat 下低」是不是合理——前缀缓存在 rag 场景收益大正是因为多个请求共享长 prompt 前缀命中率高。5. 本篇常见错排查5.1 Base URL 多写 /v1 导致 404Codex 通道配置里 Base URL 必须是https://taotoken.net/api不带/v1。如果你习惯性写成https://taotoken.net/api/v1请求会 404。排查方法把 Base URL 单独拿出来用最小请求测一次通了再贴脚本。5.2 把 speedup_vs_baseline 读成「越小越快」这是本篇最核心的坑。加速比 基线 P99 / 策略 P99大于 1 才是更快。看到 0.8 不要以为「快了 0.8 倍」那是比基线慢。让 Codex 用具体数字给你算一遍比看注释管用。5.3 percentile 取法和 numpy 不一致原文是下取整最近秩numpy 默认是线性插值。样本量 300 时P99 的差异可能有几十毫秒。如果你拿两份报告对比先确认分位值算法是否一致否则会把「算法差异」误判成「策略差异」。5.4 忽略并发拥塞因子原文concurrency_penalty 1.0 (self._concurrent_requests - 1) * 0.15并发越高每个请求分到的算力越少。如果你把max_concurrency从 8 调到 32P99 会明显上升这不是策略失效是拥塞加剧。读报告前先确认并发设置。5.5 TPOT 没有 P99 却硬找原文tpot只有 P50 和 P95。如果你在报告里找不到 TPOT 的 P99不是脚本出错是字段没设计。需要的话自己补percentile(tpot_values, 99)别在报告里反复找。6. 用 Codex TaoToken 把基准脚本读透把 Codex 的 Base URL 改到 TaoToken 之后它最大的价值不是替你写脚本而是当「逐段解释器」——你贴一段_generate_report它帮你把percentile的取法、speedup_vs_baseline的分子分母、tpot缺失的 P99 一条条讲清楚。通道配置本身很简单打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 KeyBase URL 填https://taotoken.net/api先跑最小请求确认通道通再让它对照原文的INT8_QUANT、SPECULATIVE_DECODE策略表检查加速比字段。如果你只是偶尔读一次报告用模型对话逐段问就够了如果你要长期跑基准、把延迟指标接进 CI/CD可以考虑 Coding Plan 把这类解释和核对固化下来。接入过程中遇到通道报错先查 API Keys 和接入文档想验证模型返回是否符合预期用模型对话快速试一句。把「读报告」这件事从「凭感觉」变成「按字段核对」P99、TTFT、TPOT 的对照就不会再看反了。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。