<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Junyi's Lab</title><link>https://www.junyi.dev/</link><description>Recent blog posts on Junyi's Lab</description><generator>Hugo (https://gohugo.io)</generator><language>zh-cn</language><managingEditor>junyi.h@comp.nus.edu.sg (Junyi Hou)</managingEditor><webMaster>junyi.h@comp.nus.edu.sg (Junyi Hou)</webMaster><lastBuildDate>Thu, 15 Oct 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://www.junyi.dev/tags/inference/index.xml" rel="self" type="application/rss+xml"/><item><title>deciax：用 JAX 和 Pallas 在 TPU 上运行 Decision Model</title><link>https://www.junyi.dev/posts/deciax/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0800</pubDate><author>junyi.h@comp.nus.edu.sg (Junyi Hou)</author><description>
给一条工单选部门、判断是否需要退款、给紧急程度打分，这些任务需要的是几个结构化判断。模型可以直接输出选项和概率，不必逐 token 生成一段回答。
Laya 就是这样一个 Decision Model：用一次前向计算处理选择、评分和是非问题。我把它的推理路径移植到了 JAX，做成了 deciax，让这类模型可以在 TPU 上运行，再用 Pallas 优化其中的计算。
这次测试里1，单芯片 TPU v6e 的英文模型单问题调用 p50 是 2.18 ms，多语言模型是 1.55 ms。作为对比，A100 SXM4、H100 PCIe、H200 NVL 的最快实测结果分别是 6.4 / 4.0 ms、4.8 / 3.2 ms、5.8 / 4.1 ms（英文 / 多语言）。
每次 50 个问题时，v6e Pallas 的 p50 是 33.69 / 17.83 ms，相较普通 JAX 实现提速约 2.3 倍；A100、H100、H200 的最快实测结果分别是 68.8 / 36.2 ms、44.0 / 23.2 ms、39.8 / 21.2 ms。</description><content:encoded>&lt;p&gt;给一条工单选部门、判断是否需要退款、给紧急程度打分，这些任务需要的是几个结构化判断。模型可以直接输出选项和概率，不必逐 token 生成一段回答。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/NandhaKishorM/laya" target="_blank" rel="noopener noreferrer"&gt;Laya&lt;/a&gt; 就是这样一个 Decision Model：用一次前向计算处理选择、评分和是非问题。我把它的推理路径移植到了 JAX，做成了 &lt;strong&gt;&lt;a href="https://pypi.org/project/deciax/" target="_blank" rel="noopener noreferrer"&gt;deciax&lt;/a&gt;&lt;/strong&gt;，让这类模型可以在 TPU 上运行，再用 Pallas 优化其中的计算。&lt;/p&gt;
&lt;p&gt;这次测试里&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;，单芯片 TPU v6e 的英文模型单问题调用 p50 是 &lt;strong&gt;2.18 ms&lt;/strong&gt;，多语言模型是 &lt;strong&gt;1.55 ms&lt;/strong&gt;。作为对比，A100 SXM4、H100 PCIe、H200 NVL 的最快实测结果分别是 &lt;strong&gt;6.4 / 4.0 ms、4.8 / 3.2 ms、5.8 / 4.1 ms&lt;/strong&gt;（英文 / 多语言）。&lt;/p&gt;
&lt;p&gt;每次 50 个问题时，v6e Pallas 的 p50 是 &lt;strong&gt;33.69 / 17.83 ms&lt;/strong&gt;，相较普通 JAX 实现提速约 &lt;strong&gt;2.3 倍&lt;/strong&gt;；A100、H100、H200 的最快实测结果分别是 &lt;strong&gt;68.8 / 36.2 ms、44.0 / 23.2 ms、39.8 / 21.2 ms&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="一条输入几个判断" &gt;
&lt;div&gt;
&lt;a href="#%e4%b8%80%e6%9d%a1%e8%be%93%e5%85%a5%e5%87%a0%e4%b8%aa%e5%88%a4%e6%96%ad"&gt;
#
&lt;/a&gt;
一条输入，几个判断
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;deciax 接收输入和一组问题，返回结构化结果。以一条重复扣款的工单为例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; deciax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;decider &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; deciax&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;load(&lt;span style="color:#5af78e"&gt;&amp;#34;laya&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; decider&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;decide(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#5af78e"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;I was charged twice this month. Please refund the duplicate.&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;department&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;choice&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;instructions&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;Which department should handle this?&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;criteria&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;billing&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;payments, invoices, refunds&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;technical&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;bugs, outages, system errors&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;other&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;everything else&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;urgency&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;score&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;instructions&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;How urgent is this?&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;criteria&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;not urgent&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;soon&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;blocking&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;refund_requested&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;noul&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;instructions&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;Does the user ask for a refund?&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(result)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="把推理路径移到-jax" &gt;
&lt;div&gt;
&lt;a href="#%e6%8a%8a%e6%8e%a8%e7%90%86%e8%b7%af%e5%be%84%e7%a7%bb%e5%88%b0-jax"&gt;
#
&lt;/a&gt;
把推理路径移到 JAX
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;deciax 保留了 Laya 的输入构造、ModernBERT encoder 和决策 head，把推理计算换成 JAX。运行时不需要安装 PyTorch、Transformers 或 Laya；checkpoint 和 tokenizer 仍沿用原项目的模型。项目也提供 &lt;code&gt;/v1/systemone&lt;/code&gt; HTTP 接口。&lt;a href="https://github.com/Junyi-99/deciax" target="_blank" rel="noopener noreferrer"&gt;项目说明&lt;/a&gt;列出了当前支持范围。&lt;/p&gt;
&lt;h2 id="先看未优化基线pytorch-eager-与-jax" &gt;
&lt;div&gt;
&lt;a href="#%e5%85%88%e7%9c%8b%e6%9c%aa%e4%bc%98%e5%8c%96%e5%9f%ba%e7%ba%bfpytorch-eager-%e4%b8%8e-jax"&gt;
#
&lt;/a&gt;
先看未优化基线：PyTorch eager 与 JAX
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;测试在 Oct 12, 2026 进行，覆盖 RTX 3090、A100 SXM4、RTX A6000、H100 PCIe 和 H200 NVL，以及各用一颗芯片的 TPU v5e、v6e。&lt;/p&gt;
&lt;p&gt;延迟图展示&lt;strong&gt;进程内调用的稳态 p50&lt;/strong&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;，包含输入编码、推理和结果处理。实心柱是 p50，虚线标记 p95。&lt;/p&gt;
&lt;p&gt;先只看 GPU 的 PyTorch eager 和 TPU 的普通 JAX 实现：&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.junyi.dev/posts/deciax/figures/baseline-latency.png" alt="未优化基线：PyTorch eager 与普通 JAX 在英文和多语言模型上每次 1 个及 50 个问题的 p50、p95 延迟" loading="lazy"&gt;
&lt;figcaption&gt;未优化基线，单位 ms，越低越好。实心柱表示 p50，虚线表示 p95，标注为 p50 / p95。星号表示共享主机。&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;英文模型单问题调用，GPU eager 的 p50 是 13.3–25.8 ms，v6e JAX 是 2.27 ms。但每次 50 个问题时，v6e JAX 需要 76.79 ms，GPU eager 的最低值是 H200 NVL 的 57.5 ms。多语言模型也有类似变化：v6e JAX 从单问题的 1.61 ms 增长到 50 问题的 41.24 ms，H200 eager 的 50 问题结果是 34.0 ms。&lt;/p&gt;
&lt;h2 id="观察耗时调度开销和模型计算" &gt;
&lt;div&gt;
&lt;a href="#%e8%a7%82%e5%af%9f%e8%80%97%e6%97%b6%e8%b0%83%e5%ba%a6%e5%bc%80%e9%94%80%e5%92%8c%e6%a8%a1%e5%9e%8b%e8%ae%a1%e7%ae%97"&gt;
#
&lt;/a&gt;
观察耗时：调度开销和模型计算
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;接着拆开基线调用的耗时，以英文模型为例&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;：&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.junyi.dev/posts/deciax/figures/baseline-breakdown.png" alt="英文模型基线耗时拆解：单问题时调度与其余处理占比较大，50 问题时设备计算占比上升" loading="lazy"&gt;
&lt;figcaption&gt;蓝色为 profiler 记录的设备忙碌时间，斜线部分为总延迟减去设备时间的余量，标注是独立计时的 p50。两部分来自不同测量序列，是近似拆分；余量包含调度、Python、输入输出处理及设备空闲等开销，不是精确 CPU 耗时。&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;单问题的 GPU eager 调用包含大量小 kernel：英文模型一次调用就有 &lt;strong&gt;1090–1213 次 &lt;code&gt;cudaLaunchKernel&lt;/code&gt;&lt;/strong&gt;。设备执行之外的余量很大，优化需要同时考虑 kernel 融合和调用开销。&lt;/p&gt;
&lt;p&gt;每次 50 个问题时，计算本身开始占主要时间。v6e JAX 的英文模型总延迟为 76.79 ms，其中单独测量的 forward-only 是 71.27 ms，输入编码约 3 ms。XProf 中，&lt;code&gt;dot_general&lt;/code&gt; 和 &lt;code&gt;sub&lt;/code&gt; 分别占这组设备时间的约 38% 和 21%，提示我们关注矩阵计算和逐元素操作的数据搬运。&lt;/p&gt;
&lt;p&gt;移植以后，以 JAX 算子作为基线，看 TPU 上的计算如何融合。在本次测试形状下，Pallas 把每层的多项计算融合到同一个 kernel 中&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;h2 id="优化后对比各平台最快的实现" &gt;
&lt;div&gt;
&lt;a href="#%e4%bc%98%e5%8c%96%e5%90%8e%e5%af%b9%e6%af%94%e5%90%84%e5%b9%b3%e5%8f%b0%e6%9c%80%e5%bf%ab%e7%9a%84%e5%ae%9e%e7%8e%b0"&gt;
#
&lt;/a&gt;
优化后：对比各平台最快的实现
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;GPU 侧测试覆盖 TileLang、CUDA Graph 和 torch.compile，选取每台主机、每个模型与问题数下&lt;strong&gt;实测最快的实现&lt;/strong&gt;，以尽可能保证公平。TPU 侧使用 v6e Pallas。&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.junyi.dev/posts/deciax/figures/latency-1q.png" alt="优化后的单问题调用：各 GPU 的实测最快实现与 v6e Pallas 对比，实心柱为 p50、虚线为 p95" loading="lazy"&gt;
&lt;figcaption&gt;每次一个问题，单位 ms，越低越好。实心柱表示 p50，虚线表示 p95，标注为 p50 / p95。星号表示共享主机。GPU 测试覆盖 TileLang、CUDA Graph 和 torch.compile，选择各卡实测最快的实现，以尽可能保证公平。&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;单问题调用，v6e Pallas 的英文模型 p50 是 &lt;strong&gt;2.18 ms&lt;/strong&gt;，多语言模型是 &lt;strong&gt;1.55 ms&lt;/strong&gt;。GPU 的英文模型最低值是 H100 PCIe 上 torch.compile with cudagraph 的 4.8 ms，多语言模型最低值是 3.2 ms。这个形状下，Pallas 相比普通 JAX 的改善很小。&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.junyi.dev/posts/deciax/figures/latency-50q.png" alt="优化后的 50 问题调用：各 GPU 的实测最快实现与 v6e Pallas 对比，英文模型 Pallas p50 为 33.69 ms、多语言为 17.83 ms" loading="lazy"&gt;
&lt;figcaption&gt;每次 50 个问题，实心柱为 p50，虚线为 p95，标注为 p50 / p95。所有 GPU 项的最快实现均为 torch.compile with cudagraph；v6e Pallas 的 p50 是 33.69 ms / 17.83 ms，最快 GPU 是 39.8 ms / 21.2 ms（英文 / 多语言）。&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;每次 50 个问题，v6e 的英文模型从 JAX 的 76.79 ms 降到 Pallas 的 &lt;strong&gt;33.69 ms&lt;/strong&gt;，多语言模型从 41.24 ms 降到 &lt;strong&gt;17.83 ms&lt;/strong&gt;，分别提速 &lt;strong&gt;2.28 倍、2.31 倍&lt;/strong&gt;。英文模型的 forward-only 从 71.27 ms 降到 28.25 ms，多语言模型从 36.54 ms 降到 13.36 ms。&lt;/p&gt;
&lt;h2 id="延迟如何随问题数变化" &gt;
&lt;div&gt;
&lt;a href="#%e5%bb%b6%e8%bf%9f%e5%a6%82%e4%bd%95%e9%9a%8f%e9%97%ae%e9%a2%98%e6%95%b0%e5%8f%98%e5%8c%96"&gt;
#
&lt;/a&gt;
延迟如何随问题数变化
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;把每次 1、5、10、50 个问题连起来，对比 H100、H200 与 v6e Pallas 的延迟变化：&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.junyi.dev/posts/deciax/figures/latency-curve.png" alt="延迟曲线：每次 1、5、10、50 个问题下，H100 PCIe、H200 NVL 与 v6e Pallas 的 p50" loading="lazy"&gt;
&lt;figcaption&gt;横轴为每次调用的问题数，纵轴为 p50 ms，两轴均为对数刻度。分别展示 H100 PCIe、H200 NVL 各问题数下实测最快的实现，以及 v6e Pallas。每条 GPU 曲线固定对应同一张卡。&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="http-服务与安装" &gt;
&lt;div&gt;
&lt;a href="#http-%e6%9c%8d%e5%8a%a1%e4%b8%8e%e5%ae%89%e8%a3%85"&gt;
#
&lt;/a&gt;
HTTP 服务与安装
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;我们也测了 &lt;code&gt;deciax.serve&lt;/code&gt;。单问题、loopback、keep-alive 条件下，v6e Pallas 的 HTTP p50 是英文 &lt;strong&gt;3.0 ms&lt;/strong&gt;、多语言 &lt;strong&gt;2.4 ms&lt;/strong&gt;。这包含本机 HTTP 往返，但没有外部网络延迟，也没有并发负载测试。&lt;/p&gt;
&lt;p&gt;使用 Python 3.14 或更高版本。在 TPU 环境中安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m pip install &lt;span style="color:#5af78e"&gt;&amp;#34;deciax[tpu]==0.1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个版本可以用于上面的 Python 接口示例。要检查本次 Pallas 实现，可以从&lt;a href="https://github.com/Junyi-99/deciax" target="_blank" rel="noopener noreferrer"&gt;项目仓库&lt;/a&gt;检出报告对应的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/Junyi-99/deciax.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;cd&lt;/span&gt; deciax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout 6f3a930
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv sync --extra tpu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="costmillion-model-input-tokens-per-us-dollar" &gt;
&lt;div&gt;
&lt;a href="#costmillion-model-input-tokens-per-us-dollar"&gt;
#
&lt;/a&gt;
Cost：Million model input tokens per US dollar
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;成本只比较 &lt;strong&gt;English model 的优化版本&lt;/strong&gt;：GPU 取前面的实测最快实现，TPU 只放 v6e Pallas。分别按 on-demand 与 preemptible / spot 两种小时价格计算。&lt;/p&gt;
&lt;p&gt;性能数据和价格数据采集于 Oct 12, 2026。&lt;/p&gt;
&lt;p&gt;价格单位：&lt;strong&gt;USD / GPU-hour 或 TPU chip-hour&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;硬件&lt;/th&gt;
&lt;th&gt;供应商&lt;/th&gt;
&lt;th style="text-align: right"&gt;On-demand&lt;/th&gt;
&lt;th style="text-align: right"&gt;Preemptible / Spot&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A100 SXM4 80GB&lt;/td&gt;
&lt;td&gt;&lt;a href="https://vast.ai/pricing" target="_blank" rel="noopener noreferrer"&gt;Vast.ai&lt;/a&gt;&lt;/td&gt;
&lt;td style="text-align: right"&gt;$1.176&lt;/td&gt;
&lt;td style="text-align: right"&gt;$0.727&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H100（SXM 报价）&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nebius.com/prices" target="_blank" rel="noopener noreferrer"&gt;Nebius&lt;/a&gt;&lt;/td&gt;
&lt;td style="text-align: right"&gt;$4.500&lt;/td&gt;
&lt;td style="text-align: right"&gt;$0.790&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H200（SXM 报价）&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nebius.com/prices" target="_blank" rel="noopener noreferrer"&gt;Nebius&lt;/a&gt;&lt;/td&gt;
&lt;td style="text-align: right"&gt;$5.400&lt;/td&gt;
&lt;td style="text-align: right"&gt;$0.790&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPU v6e&lt;/td&gt;
&lt;td&gt;&lt;a href="https://cloud.google.com/tpu/pricing" target="_blank" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt;&lt;/td&gt;
&lt;td style="text-align: right"&gt;$2.700&lt;/td&gt;
&lt;td style="text-align: right"&gt;$0.970&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;计算公式是&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Million model input tokens per US dollar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; = model input tokens per second × 3600 / hourly price / 1,000,000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的 model input tokens 包含各问题重复的工单文本。&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.junyi.dev/posts/deciax/figures/cost-english.png" alt="English model 优化版本的 Million model input tokens per US dollar：A100、H100 与 TPU v6e Pallas，分别采用 on-demand 和 preemptible/spot 价格" loading="lazy"&gt;
&lt;figcaption&gt;每美元可处理的百万 model input tokens，越高越好。仅 English model，对比 A100、H100 的实测最快实现与 TPU v6e Pallas。上图每次一个问题，下图每次 50 个问题。价格、日期和供应商见上文；preemptible / spot 沿用报告的价格假设。&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="总结" &gt;
&lt;div&gt;
&lt;a href="#%e6%80%bb%e7%bb%93"&gt;
#
&lt;/a&gt;
总结
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;deciax 把 Laya 的结构化决策能力带到了 TPU 上。这次实验中，普通 JAX 已经能把单问题调用做到约 2 ms，Pallas 在这个形状下的额外收益很小；当每次调用增加到 50 个问题，融合后的 Pallas 路径相较普通 JAX 提速约 &lt;strong&gt;2.3 倍&lt;/strong&gt;。问题数改变了主要开销，也改变了优化的收益。&lt;/p&gt;
&lt;p&gt;在本文测试的输入、模型和实现范围内，v6e Pallas 的单问题和 50 问题延迟都低于参与对比的 GPU 实现。&lt;/p&gt;
&lt;p&gt;如果你想试试 deciax，可以在 &lt;a href="https://colab.research.google.com/drive/1sY_4BeRq_em4tzePW3poPyl-lGXyxO1g?usp=sharing" target="_blank" rel="noopener noreferrer"&gt;Colab&lt;/a&gt; 中体验，也可以到 &lt;a href="https://github.com/Junyi-99/deciax" target="_blank" rel="noopener noreferrer"&gt;GitHub 仓库&lt;/a&gt;查看代码。&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;本文性能数据来自开发版本 &lt;a href="https://github.com/Junyi-99/deciax/commit/6f3a930" target="_blank" rel="noopener noreferrer"&gt;6f3a930&lt;/a&gt;。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;输入采用上游的 &lt;em&gt;Payout failing&lt;/em&gt; 工单，问题交替使用 &lt;code&gt;noul&lt;/code&gt; 和 &lt;code&gt;choice&lt;/code&gt;。每组先预热 20 次，再计时 20 次，并等待设备计算完成。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;耗时拆解图中的 GPU p50 来自 profiling 配套的独立计时，与前一张基线图的测试序列不同。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;本次报告中的 Pallas 路径融合了 norm、QKV 投影、RoPE、attention、输出投影和 MLP。对于序列长度不超过 512 的路径，每层使用一次 &lt;code&gt;pallas_call&lt;/code&gt;。&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Nebius Spot 使用起始价；TPU preemptible 使用报告快照。&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;English model 每次单问题调用有 194 个 model input tokens，每次 50 问题有 9975 个。吞吐采用报告记录的 input tokens/s，由输入 token 数除以原始 p50 延迟得到。&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content:encoded><category>TPU</category><category>JAX</category><category>Pallas</category><category>Inference</category><category>Tech</category><guid isPermaLink="true">https://www.junyi.dev/posts/deciax/</guid></item></channel></rss>