Keras 3 与 PyTorch 性能飞跃:通过引擎级重构实现文本生成速度提升 11.6倍
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
近期 Keras 仓库针对 #22561 问题的持续更新彻底改变了编译模型在后端框架上的执行效率,尤其是在 PyTorch 后端上表现尤为显著。在 2026年7月至 10月期间,通过合并 15个精心设计的 Pull Request,推理吞吐量得到了颠覆性的提升。在一个标准的 210 万参数测试语言模型上,编译后的 Keras[torch] 的文本生成速度比之前快了 11.6倍。
这一性能飞跃并非依靠硬件升级或更换框架版本——在整个基准测试过程中,测试平台始终保持为同一台 NVIDIA RTX PRO 6000 Blackwell GPU、相同的 PyTorch 构建版本以及一致的 JAX 版本。性能的大幅提升完全归功于持续深入的代码剖析、Python 层面开销的削减,以及那些曾经严重拖累 torch.compile 执行效率的图中断(Graph Breaks)的彻底消除。
无论您是在部署海量 Transformer 架构,还是在使用诸如 n1n.ai 这样高效稳定的大模型 API 聚合平台来管理分布式推理集群,深刻理解这些底层优化原理对于最大化硬件算力都至关重要。
性能变革:优化前后的鲜明对比
在 2026年7月时,编译一个基于 PyTorch 后端的 Keras 模型往往会适得其反。torch.compile 非但没有加速执行,反而引入了沉重的编译开销与图中断,导致贪婪执行模式(Eager Mode)的性能甚至超越了编译模式。
- 2026年7月: 编译后的 Keras[torch] 运行速度仅为 1,458 tokens/秒,而贪婪执行的 Keras 则达到了 2,139 tokens/秒。
- 2026年10月: 编译后的模型运行速度飙升至 16,975 tokens/秒,实现了较贪婪执行 Keras 快 6.56倍的惊人成效,并且无限逼近纯 PyTorch 编译版本的性能水平。
配置性能对照表
下表展示了在 12 种不同配置与工作负载下每次调用的耗时(毫秒),清晰记录了从 7月基准到 10月里程碑的演进过程。
| Keras 配置 | 工作负载 | 原生框架 (ms) | 7月18日 (ms) | 10月15日 (ms) | 变化倍数 | + #23336 (ms) | A/B 校验 |
|---|---|---|---|---|---|---|---|
| Keras[torch] · eager | CNN 前向传播 | 0.064 | 0.668 | 0.477 | 1.40x | 0.466 | 1.39x |
| Keras[torch] · eager | LLM 前向传播 | 0.189 | 1.88 | 1.55 | 1.22x | 1.48 | 1.20x |
| Keras[torch] · eager | LLM generate-32 | 5.85 | 59.8 | 49.5 | 1.21x | 47.2 | 1.20x |
| Keras[torch] · torch.compile | CNN 前向传播 | 0.076 | 1.28 | 0.160 | 8.03x | 0.161 | 8.41x |
| Keras[torch] · torch.compile | LLM 前向传播 | 0.160 | 2.69 | 0.302 | 8.93x | 0.299 | 9.60x |
| Keras[torch] · torch.compile | LLM generate-32 | 4.92 | 87.8 | 7.54 | 11.6x | 7.66 | 12.4x |
| Keras[jax] · eager | CNN 前向传播 | 0.508 | 1.34 | 1.23 | 1.08x | 1.18 | 1.15x |
| Keras[jax] · eager | LLM 前向传播 | 2.79 | 8.46 | 8.38 | 1.01x | 7.90 | 1.12x |
| Keras[jax] · eager | LLM generate-32 | 89.0 | 293 | 267 | 1.10x | 269 | 1.08x |
| Keras[jax] · jax.jit | CNN 前向传播 | 0.077 | 0.079 | 0.081 | 0.97x | 0.080 | 1.02x |
| Keras[jax] · jax.jit | LLM 前向传播 | 0.120 | 0.131 | 0.135 | 0.97x | 0.130 | 1.05x |
| Keras[jax] · jax.jit | LLM generate-32 | 2.22 | 2.30 | 2.45 | 0.94x | 2.27 | 1.05x |
注:A/B 校验通过三次独立的背靠背测试对 7月与 10月的数据进行了比对。
优化深度剖析:核心 Pull Request 解析
工程团队并未对代码库进行盲目的全面重写,而是精准聚焦于各个后端共享的底层执行路径(例如 Layer.call、算子回溯信息、数据类型处理以及输入合法性检查)。由于这些模块由所有后端共同调用,因此性能红利不仅限于 PyTorch,同样有效降低了 JAX、TensorFlow 以及 NumPy 在 Python 层面的函数调用开销。
下表详细列出了部分关键 PR 对调用开销以及生成延迟的具体影响:
| PR 编号 | 合并日期 | 修改内容 | PyTorch 调用次数变化 | JAX | TF | NumPy | 贪婪生成延迟变化 (ms) | 编译生成延迟变化 (ms) | 图中断变化 |
|---|---|---|---|---|---|---|---|---|---|
| #23183 | 07-28 | 仅在算子报错时才构建回溯详情 | −598 | −586 | −622 | −546 | −2.9 | −5.2 | · |
| #23327 | 08-30 | 移除了 dot_product_attention 中的 torch.compile 图中断 | +6 | 0 | 0 | 0 | +0.40 | −12.3 | LLM 11 → 0 |
| #23200 | 09-05 | 避免在每次调用时重复重置 built/_called 状态 | −1,848 | −1,098 | −1,188 | −1,100 | −4.9 | −10.5 | · |
| #23201 | 09-11 | 树状代码支持可追踪:规范化字典键顺序 | −142 | +8 | 0 | 0 | +0.55 | −5.2 | CNN 9 → 0 |
| #23647 | 09-30 | 树状代码停止使用 id() 进行比较 | 0 | −8 | 0 | 0 | −0.58 | −49.4 | · |
对于希望通过 n1n.ai 聚合网关将提示词智能分发至多样化基础模型的企业开发者而言,这些延迟的缩减将直接转化为更低的算力成本和更顺畅的用户交互体验。
LLM 前向传播中的热点函数剖析
通过对 cProfile 数据进行细致分析,我们可以清晰地看到在单次 Keras[torch] LLM 前向传播中,Python 执行时间究竟是如何被一点点夺回的:
| 函数名称 | 7月18日 | 10月15日 | 变化幅度 | + #23336 |
|---|---|---|---|---|
isinstance | 2,600 | 1,740 | −33% | 1,680 |
| traceback 错误包装器 | 74 | 48 | −35% | 48 |
| 线程本地配置查找 | 624 | 513 | −18% | 513 |
standardize_dtype | 177 | 244 | +38% | 184 |
tree.flatten | 93 | 67 | −28% | 67 |
tree.map_structure | 102 | 62 | −39% | 62 |
通过优化对象类型检查、缓存数据类型转换以及精简树结构遍历,框架在每次前向传播中成功消除了数千次冗余的解释器指令。
面向 PyTorch 与大模型 API 集成的专业建议
- 彻底消除动态图中断: 务必经常使用
torch._dynamo.explain()检查编译边界。任何未被捕获的 Python 原生结构或字典顺序紊乱都可能在无形中触发退回到贪婪执行模式。 - 善用高性能聚合端点: 在编排多模型并行管道或容灾降级链时,建议借助 n1n.ai 这样具备高可用性的 API 聚合平台,无缝处理速率限制与延迟路由。
- 时刻保持工具链更新: 确保生产运行环境与编译目标保持高度一致;PyTorch 的微小版本更迭有时也会改变底层图捕获的实际表现。
Get a free API key at n1n.ai