<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度]]></title><description><![CDATA[<p dir="auto">前两天unsloth 的qfn3.8模型进行了一些升级，现在是ud3.1格式，号称有一定的智力提升。 我这套配置和使用场景比较适合使用IQ4_XS,所以下载来跑了一下，后来又看到模型卡的ngram文件夹有Q8_0的分片，于是想着把当前IQ4_XS的NGRAM表换成Q8_0的试试。</p>
<hr />
<h2>以下是DEEPSEEK V4.1 FLASH 1017折腾了1小时的结果：</h2>
<h2>主线：engram / PLE 表是什么，四档精度怎么选</h2>
<p dir="auto">Qwen3.8-Flash-Next 有一个巨大的 per-layer n-gram 表（张量名 <code>per_layer_token_embd.weight</code>，<strong>160 × 320,001,536 = 51.2B 个值</strong>）。它单独占一个 shard，因此可以脱离模型主体单独换精度。</p>
<p dir="auto">unsloth 在 2026-11-04 把它单独发布成「可混搭」的 engram 文件（<code>unsloth/Qwen3.8-Flash-Next-GGUF/engram/</code>），官方 README 给的数据：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>文件</th>
<th>量化</th>
<th>大小</th>
<th>相对 BF16 的 RMSE</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>engram-BF16</code></td>
<td>BF16</td>
<td>102.4 GB</td>
<td><strong>0</strong></td>
<td>无损，等于 checkpoint 原表</td>
</tr>
<tr>
<td><code>engram-Q8_0</code></td>
<td>Q8_0</td>
<td>54.4 GB</td>
<td><strong>0.0053</strong></td>
<td>本次采用</td>
</tr>
<tr>
<td><code>engram-Q5_1</code></td>
<td>Q5_1</td>
<td>38.4 GB</td>
<td>0.0376</td>
<td>行宽 160，K-quant 用不了（需 256 的倍数）</td>
</tr>
<tr>
<td><code>engram-IQ4_NL</code></td>
<td>IQ4_NL</td>
<td>28.8 GB</td>
<td>0.0757</td>
<td>大多数量化档内嵌的就是这个</td>
</tr>
</tbody>
</table>
<p dir="auto">关键对比：<strong>我们原来用的是内嵌 IQ4_NL（7.57%），换 Q8_0（0.53%）相当于表精度提升 14 倍</strong>，代价只是 RAM 多占 23 GB（51 GB vs 28 GB，本机 247 GB 内存完全吃得下）。</p>
<blockquote>
<p dir="auto">插一句：下载走 ModelScope 比 HF 快得多。<code>aria2c -x8 -s8 -k8M</code> 拉了 50.7 GiB，平均 <strong>65 MiB/s</strong>，10 分钟。HF 直连/镜像都不稳定。</p>
</blockquote>
<hr />
<h2>3. 六次失败，每次都卡在不同的地方（这是全文最有价值的部分）</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>尝试</th>
<th>做法</th>
<th>引擎报错</th>
<th>真正原因</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>直接用 unsloth 原文件做 <code>--ple-gguf</code></td>
<td><code>additional shard must match the architecture-validated first shard's split metadata</code></td>
<td>缺 <code>general.architecture</code>，被当成模型附加分片</td>
</tr>
<tr>
<td>2</td>
<td>补 <code>general.architecture = qwen4exp</code></td>
<td><code>missing qwen4exp.block_count</code></td>
<td>架构名对了，但引擎还要 6 个几何键</td>
</tr>
<tr>
<td>3</td>
<td>补全模型全部 50 个 <code>general.*</code>/<code>qwen4exp.*</code> 键</td>
<td><code>duplicate split shard number</code></td>
<td>文件还带着 <code>split.no</code>，与模型分片撞号</td>
</tr>
<tr>
<td>4</td>
<td>把 <code>split.no</code> 改成 0</td>
<td>同上 duplicate</td>
<td>撞的是模型第一片</td>
</tr>
<tr>
<td>5</td>
<td>把 <code>split.no</code> 改成 3</td>
<td>同上 duplicate</td>
<td>撞的是模型第四片（=死结）</td>
</tr>
<tr>
<td>6</td>
<td>去掉所有 <code>split.*</code> 键 + arch 改 <code>strata-ple</code></td>
<td><code>PLE table size mismatch: ... from data_start 160</code></td>
<td>数据段还在旧 header 之后（2912），偏移不对</td>
</tr>
<tr>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a055419e292" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:1.4em;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td>数据段前移到 160</td>
<td><code>PLE on, table 320001536 rows of .../PLE_flash_Q8_fixed.gguf</code></td>
<td>成功</td>
</tr>
</tbody>
</table>
<h3>3.1 三条硬条件（源码依据）</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>条件</th>
<th>要求</th>
<th>违反后的报错</th>
</tr>
</thead>
<tbody>
<tr>
<td>① 架构标记</td>
<td><code>general.architecture</code> <strong>必须字面等于 <code>strata-ple</code></strong></td>
<td><code>must match the architecture-validated first shard's split metadata</code></td>
</tr>
<tr>
<td>② 不能有分片键</td>
<td><strong>一个 <code>split.*</code> 都不许带</strong></td>
<td><code>duplicate split shard number</code></td>
</tr>
<tr>
<td>③ 数据紧贴 header</td>
<td>数据段起点必须在 <strong>160 字节</strong>（arch 键 141B + 对齐）</td>
<td><code>PLE table size mismatch: ... data_start 160</code></td>
</tr>
</tbody>
</table>
<p dir="auto">源码就这十几行（<code>src/program/generate.cpp:4374-4381</code>）：</p>
<pre><code class="language-cpp">o.native_dense_gguf = o.native_shards;
bool ple_only = false;
try {
    strata::GgufFile pg(o.ple_gguf);
    if (const strata::MetaValue* v = pg.get("general.architecture"))
        ple_only = v-&gt;s == "strata-ple";          // ← 决定性的一行
} catch (...) {}
if (!ple_only &amp;&amp; std::find(...) == end())
    o.native_dense_gguf.push_back(o.ple_gguf);    // 不是 strata-ple → 被当 dense 分片 → 撞 split 检查
</code></pre>
<p dir="auto">duplicate 检查则在分支之外：</p>
<pre><code class="language-cpp">if (number &amp;&amp; !split_numbers.insert(number-&gt;u).second) {
    err = "native dense: duplicate split shard number"; return false;
}
</code></pre>
<p dir="auto">模型 4 个分片已占 <code>no=0..3</code>，所以 PLE 表只要带 <code>split.no</code>，无论填 0/1/2/3 都会撞 —— 这就是第 4、5 次失败的原因，<strong>唯一出路是完全不写这个键</strong>。</p>
<h3>3.2 官方也是这个格式</h3>
<p dir="auto">官方工具 <code>tools/ple_fp8_pack.py</code> 产出的就是 <code>strata-ple</code>：</p>
<blockquote>
<p dir="auto">The output is a one-tensor GGUF: <code>per_layer_token_embd.weight</code>, ne = [160, 320001536], type I8 ... with <code>strata.ple.format</code> = "f8_e4m3" and <code>strata.ple.scale</code> (F32).</p>
</blockquote>
<p dir="auto">代码注释也直接写着：<code>a PLE-only table (tools/ple_fp8_pack.py: architecture strata-ple) holds no projections</code>。</p>
<h3>3.3 社区三个 request 都还没合入</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Issue</th>
<th>时间</th>
<th>内容</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>#3280</td>
<td>10-19</td>
<td>完全相同的报错，提出 4 行修补：让「只含 <code>per_layer_token_embd.weight</code> 的文件」按 strata-ple 处理</td>
<td><strong>open</strong></td>
</tr>
<tr>
<td>#3875</td>
<td>10-23</td>
<td>「accept a GGUF shard holding only the PLE table」</td>
<td><strong>open</strong></td>
</tr>
<tr>
<td>#5248</td>
<td>11-04</td>
<td>请求支持 unsloth 的 engram 替换（BF16/Q8_0/Q5_1/IQ4_NL）</td>
<td><strong>open</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">结论：<strong>在 0.1.57 上，想换表只能自己把文件转成 strata-ple 格式</strong>，别指望改 <code>set_split.py</code>（那是 llama.cpp 的路子，只改 shard 槽位）。</p>
<h3>3.4 造文件的三个脚本（本机验证过）</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>脚本</th>
<th>作用</th>
<th>关键点</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>fix_ple_header2.py</code></td>
<td>从模型 shard1 取全部 <code>general.*</code>/<code>qwen4exp.*</code> 键 + 目标表的张量，重建文件</td>
<td>读头要 512 MiB（模型分片 1224 个张量，header 很大）；<strong>不复制 <code>split.*</code></strong></td>
</tr>
<tr>
<td><code>ple_to_strata.py</code></td>
<td>把 header 就地改成最小 strata-ple（只写前 N 字节，54 GiB 数据不动）</td>
<td>arch 写成 <code>strata-ple</code>；header 141B</td>
</tr>
<tr>
<td><code>ple_move_data.py</code></td>
<td>把数据段就地前移到 160 字节处再截断</td>
<td>54 GiB 约 8-10 分钟，配 <code>ionice -c2 -n7 nice -n 19</code> 不抢推理 I/O</td>
</tr>
</tbody>
</table>
<p dir="auto">最终文件形态：</p>
<pre><code>文件大小：54,400,261,280 = 160 + 320,001,536 × 170
字典：{general.architecture: "strata-ple"}
张量：per_layer_token_embd.weight [160, 320001536] Q8_0 offset=0
尾部 64 MiB sha256 与原 engram 文件一致（数据一个字节没动）
</code></pre>
<p dir="auto">一、这个表不是「冷专家」，是 n-gram 上下文查表</p>
<pre><code>源码：include/strata/kernels/ngram.hpp:5
  "ngram_rows — the HOST hash. Sixteen row indices per token from the last three token ids"
</code></pre>
<p dir="auto">拆开说：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项</th>
<th>值</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>表规模</td>
<td>320,001,536 行 × 160 值</td>
<td>张量 per_layer_token_embd.weight</td>
</tr>
<tr>
<td>每 token 算几行</td>
<td>16 行</td>
<td>PLE_N_HEADS = (NGRAM_SIZE 3 − 1) × HEADS_PER_NGRAM 8 = 16</td>
</tr>
<tr>
<td>行从哪来</td>
<td>最近 3 个 token id 做哈希</td>
<td>即 trigram 上下文，不是词表下标</td>
</tr>
<tr>
<td>16 行拼成什么</td>
<td>16 × 160 = 2560 = n_embd</td>
<td>一个上下文相关的嵌入向量，注入每层输入</td>
</tr>
<tr>
<td>与专家无关</td>
<td>—</td>
<td>MoE 专家是 FFN 权重（另一套机制），这张表是查表型先验</td>
</tr>
</tbody>
</table>
<p dir="auto">所以它既不是「冷专家」，也不是「常用词表」——它是模型训练时学出来的 trigram → 2560 维嵌入映射，作用是给每个 token 补一个「结合前两个词的上下文先验」，然后逐层参与计算。这也是为什么它能有 51.2B 个值却几乎不占算力：纯查表。</p>
<p dir="auto">二、生成 100 万 token 要读多少次表</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>指标</th>
<th>Q8_0（现役）</th>
<th>IQ4_NL（原内嵌）</th>
</tr>
</thead>
<tbody>
<tr>
<td>行读取次数</td>
<td>16 × 1,000,000 = 1600 万行</td>
<td>同</td>
</tr>
<tr>
<td>每行字节</td>
<td>170 B（PLE_ROW_BYTES_Q8_0 = 160/32×34）</td>
<td>90 B</td>
</tr>
<tr>
<td>逻辑读取量</td>
<td>2.72 GB</td>
<td>1.44 GB</td>
</tr>
<tr>
<td>经 8-way row cache 后实际穿透</td>
<td>~2.4%（命中约 97.6%）→ 约 38 万行 / 65 MB</td>
<td>更少</td>
</tr>
<tr>
<td>折算时间（83 GB/s）</td>
<td>逻辑量 ≈ 33 毫秒</td>
<td>≈ 17 毫秒</td>
</tr>
</tbody>
</table>
<p dir="auto">对比生成 100 万 token 本身要花的时间（134 t/s ≈ 2 小时），这点读取是百万分之五量级，纯噪声。所以在 --ple-io ram 下，换 Q8 表对速度没有可测影响 —— 与实测吻合（换表前后都是 134 t/s）。</p>
<p dir="auto">三、对生成质量到底有没有影响</p>
<p dir="auto">先给理论量级：</p>
<pre><code>表级相对误差：IQ4_NL 7.57% → Q8_0 0.53%
每个 token 受影响的是那个 2560 维向量（16 行 × 160 值全部参与）
7.57% 的向量误差不算小，但模型每层有归一化/投影会吸收一部分
</code></pre>
<p dir="auto">再给实测（刚跑的，同一套题、temp=0）：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>配置</th>
<th>tooleval quick15</th>
<th>明细</th>
</tr>
</thead>
<tbody>
<tr>
<td>内嵌 IQ4_NL（11:38 那次）</td>
<td>90/100</td>
<td>13 过 / 1 半 / 1 挂</td>
</tr>
<tr>
<td>外置 Q8_0（刚才）</td>
<td>93/100</td>
<td>14 过 / 0 半 / 1 挂</td>
</tr>
</tbody>
</table>
<p dir="auto">DEEPSEEK 的判断（诚实版）：</p>
<ol>
<li>没有可测的退化，还略高 3 分 —— 但 15 题里就差 1 道题从 partial 变 pass，这属于统计噪声，不能宣称「Q8 更好」。</li>
<li>真正的价值是消除一个已知的系统性误差源：7.57% 的表误差在长文、需要精确措辞或推理链的任务上可能放大，而 0.53% 基本无损。</li>
</ol>
<p dir="auto"><a href="https://upload.lcz.me/uploads/e1c5f318-5633-4960-8baa-79a1f3716f95.py" rel="nofollow ugc">fix_ple_header2.py</a> <a href="https://upload.lcz.me/uploads/a1a7d7f9-616e-4060-bac4-ed7f642f1b52.py" rel="nofollow ugc">ple_move_data.py</a> <a href="https://upload.lcz.me/uploads/30d01f91-39ad-4da5-a3ce-d0afa3e6d82a.py" rel="nofollow ugc">ple_to_strata.py</a></p>
<hr />
]]></description><link>https://lcz.me/topic/2885</link><generator>RSS for Node</generator><lastBuildDate>Tue, 10 Nov 2026 00:19:25 GMT</lastBuildDate><atom:link href="https://lcz.me/topic/2885.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Nov 2026 06:05:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sun, 08 Nov 2026 06:09:37 GMT]]></title><description><![CDATA[<p dir="auto">我弟还是挺能折腾的</p>
]]></description><link>https://lcz.me/post/31879</link><guid isPermaLink="true">https://lcz.me/post/31879</guid><dc:creator><![CDATA[terry]]></dc:creator><pubDate>Sun, 08 Nov 2026 06:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sun, 08 Nov 2026 06:09:22 GMT]]></title><description><![CDATA[<p dir="auto"><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a055419e292" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:1.4em;width:auto;vertical-align:middle" title="✅" alt="✅" /> 版主审定：本帖设为<strong>优秀</strong>，作者 <strong>+3 积分</strong>奖励，继续加油！</p>
<blockquote>
<p dir="auto">奖励凭证：优秀 +3 分 · 编号 e2885-1233-1</p>
</blockquote>
]]></description><link>https://lcz.me/post/31878</link><guid isPermaLink="true">https://lcz.me/post/31878</guid><dc:creator><![CDATA[Xiaote]]></dc:creator><pubDate>Sun, 08 Nov 2026 06:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sat, 07 Nov 2026 09:22:16 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/stxpnet" aria-label="Profile: stxpnet">@<bdi>stxpnet</bdi></a><br />
让ai帮我装了一下，第一次建立新启动配置起不来，我才想起来让它读一下这贴。但是在读贴前它已经自己解决了……<br />
好像还很简单，没有那么多修改，我让它写了个回帖：</p>
<h1>回帖草稿（<a href="http://lcz.me/topic/2885%EF%BC%89" rel="nofollow ugc">lcz.me/topic/2885）</a></h1>
<blockquote>
<p dir="auto">标题建议：<strong>换 unsloth engram 还有第三条路：不改文件、不前移数据段，一个字节都不用动</strong></p>
</blockquote>
<hr />
<p dir="auto">楼主这份六次失败的记录很有价值 —— 第 1 条报错跟我这边一模一样，我照着往下试的时候也在同一个地方卡住。不过后来发现还有一条路走通了，<strong>原文件一个字节都不用改</strong>，贴上来供参考。</p>
<h2>报错的真正原因不是"缺 general.architecture"</h2>
<p dir="auto"><code>additional shard must match the architecture-validated first shard's split metadata</code> 之所以出现，是因为 <code>--native</code> 模式下引擎会把 <code>--ple-gguf</code> <strong>追加进 native dense 的分片列表</strong>，然后所有分片一起过 split 校验。而这一步在主档的 <code>if (o.native_dense_gguf.empty())</code> 块<strong>里面</strong>（<code>src/program/generate.cpp:4370-4382</code>）：</p>
<pre><code class="language-cpp">if (o.native_dense_gguf.empty()) {
    o.native_dense_gguf = o.native_shards;
    bool ple_only = false;
    try { ... ple_only = v-&gt;s == "strata-ple"; } catch (...) {}
    if (!ple_only &amp;&amp; std::find(...) == end())
        o.native_dense_gguf.push_back(o.ple_gguf);   // ← 就是这一步把表卷进 dense
}
</code></pre>
<p dir="auto"><code>--native-dense-gguf</code> 的 help 写得很直白：</p>
<pre><code>--native-dense-gguf PATH   native GDN/QSA/shared projections; repeat for each source model shard
</code></pre>
<p dir="auto"><strong>所以只要你自己把 dense 分片列全，上面整块逻辑就跳过了</strong>，<code>--ple-gguf</code> 从此只被 PLE 读取器按张量名 <code>per_layer_token_embd.weight</code> 打开，不参与任何分片校验、也不需要任何架构键。</p>
<h2>具体做法</h2>
<p dir="auto">在你的配置里加这 6 组参数（分片数按你自己的模型来，几片就写几条 <code>--native-dense-gguf</code>）：</p>
<pre><code class="language-jsonc">"--ple-gguf", ".../Qwen3.8-Flash-Next-engram-Q8_0.gguf",
"--ple-io",   "direct",
"--native-dense-gguf", ".../Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00004.gguf",
"--native-dense-gguf", ".../Qwen3.8-Flash-Next-UD-IQ4_XS-00002-of-00004.gguf",
"--native-dense-gguf", ".../Qwen3.8-Flash-Next-UD-IQ4_XS-00003-of-00004.gguf",
"--native-dense-gguf", ".../Qwen3.8-Flash-Next-UD-IQ4_XS-00004-of-00004.gguf"
</code></pre>
<p dir="auto">你帖子里那三条硬条件（<code>arch = strata-ple</code> / 不带 <code>split.*</code> / 数据段前移到 160）<strong>一条都不需要</strong> —— 它们只在"把文件改造成纯 PLE 表"那条路上成立。</p>
<p dir="auto">启动后日志里应该看到：</p>
<pre><code>PLE direct read probe: 126405 rows/s (fine)
PLE on, table 320001536 rows of .../Qwen3.8-Flash-Next-engram-Q8_0.gguf_file
</code></pre>
<p dir="auto">并且 <code>experts loaded</code> / 槽位数 / <code>prompt chunk</code> / <code>VRAM free</code> 与换表前逐项一致（我这边 4 项全对得上），这就说明接线是等价的。</p>
<h2>三个注意点</h2>
<ol>
<li><strong>分片要列全</strong>，包括装着 PLE 表那一片（我这边是第 4 片，Swift 那边是第 1 片）。少列一片，模型就缺投影。</li>
<li><strong>模型换版本、分片数变了必须同步改</strong>，否则又回到原报错。这是这条路唯一的维护成本。</li>
<li><strong><code>Q8_0</code> 本来就是引擎的一等 PLE 格式</strong>，不用 repack：<code>src/kernels/ngram.cpp:191</code> 里 <code>{Q8_0, "Q8_0", "Q8_0", 170, false, dequant_blocks&lt;dequantize_q8_0,34&gt;}</code>，注释原文是「Unsloth's UD-Q6_K_XL and Swift-1.5 Q4_K_L as Q8_0」。所以问题从来不在读表，只在分片校验。</li>
</ol>
<p dir="auto">另外，这条路与 <code>--ple-io</code> 三模式是正交的：我实测过 <code>direct</code>（v31 档）和 <code>mmap</code> / <code>direct</code>（Swift 档）。<code>ram</code> 没测，你的 247 GB 内存想锁表应该也能用。</p>
<h2>我这边的数据（131K × 3，4080S 32G）</h2>
<p dir="auto">档位：QFN3.8 UD-IQ4_XS-v31，4 分片，自带 engram 是第 4 片的 <strong>IQ4_NL 28.80 GB / 90 B 行</strong>，换成外置 Q8_0 50.66 GiB。</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>配置</th>
<th>ready</th>
<th>RAM</th>
<th>chunk</th>
<th>prefill tok/s</th>
<th>decode tok/s</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--ple-io ram</code> + 自带 IQ4_NL</td>
<td>92.2 s</td>
<td>111.2 GiB</td>
<td><strong>16,384</strong></td>
<td>2,894</td>
<td>94.4</td>
</tr>
<tr>
<td><code>--ple-io direct</code> + 自带 IQ4_NL（对照）</td>
<td>26.0 s</td>
<td>77.6 GiB</td>
<td><strong>32,768</strong></td>
<td>3,216</td>
<td>92.8</td>
</tr>
<tr>
<td><code>--ple-io direct</code> + Q8_0</td>
<td>24.6 s</td>
<td>77.8 GiB</td>
<td><strong>32,768</strong></td>
<td>3,200</td>
<td>97.7</td>
</tr>
</tbody>
</table>
<p dir="auto">两个结论：</p>
<ul>
<li><strong>换 Q8 表本身代价 −0.5%</strong>（3,216 → 3,200，噪声内），跟你说的"对速度无可测影响"完全一致；</li>
<li><strong>真正 +11% 的是 chunk 从 16,384 回到 32,768</strong>：表不锁 RAM 了，RAM 守卫才肯放行大 chunk 环。这一项跟换表无关，<strong>单独把 <code>--ple-io</code> 改成 <code>direct</code> 就能拿到</strong>。如果你现在还是 <code>ram</code> 模式，光这一项就值得切。</li>
</ul>
<p dir="auto">另外顺手修正我自己 11-06 的一个误判：之前我判定这个档"比主档慢 19~20%"，其中一大块其实是锁表挤掉 RAM 导致 chunk 腰斩，不是模型慢。改 <code>direct</code> 之后只剩 −11%，差距才回到真实水平（arena 56.24 GiB ⇒ 槽位 9,259 vs 11,371）。</p>
<h2>顺带两个坑</h2>
<p dir="auto"><strong>① 用官方 <code>benchmark.py</code> 的注意</strong>：配置里有 <code>effort_position: "end"</code> 时，请求带 <code>reasoning_effort: "none"</code> 会让服务端在答案前多渲染一个 effort 短末回合（+42 token），而客户端 <code>count()</code> 走朴素模板数不到它，脚本直接 <code>token count mismatch</code> 退出。指纹很明显：warmup 的 <code>prompt_tokens</code> 从 19 变成 61，131K 变 131,114。要么改请求的 effort，要么放宽这条断言（<code>prefill_tok_s</code> 用的是引擎自报的 token 数，放宽不影响结果）。</p>
<p dir="auto"><strong>② 探针读数抖动很大</strong>：同一天、同一张盘，Q8 表我见过 90,886 和 126,405 rows/s，IQ4_NL 是 117,913。偶尔 Q8 比 IQ4_NL 还快，所以别拿单次 <code>PLE direct read probe</code> 判断盘快慢（门槛 15,000，本机都在 6 倍以上余量）。</p>
<p dir="auto">最后，你那个 tooleval 90 → 93 的判断我同意是噪声；Q8 表的真正价值还是把 7.57% 的已知系统性误差压到 0.53%，不是那 3 分。</p>
]]></description><link>https://lcz.me/post/31721</link><guid isPermaLink="true">https://lcz.me/post/31721</guid><dc:creator><![CDATA[marsempire]]></dc:creator><pubDate>Sat, 07 Nov 2026 09:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sat, 07 Nov 2026 00:33:54 GMT]]></title><description><![CDATA[<p dir="auto">补一个新结论。unsloth的QFN3.8 UD3.1, UD3.0 还有swift 1.5 QFN3.8 ,它们的Q8_0 ngram表都是同一份，没有必要重复下载。</p>
<pre><code>本机 PLE_flash_Q8_fixed.gguf            @行0              sha 35d2284228d77d00
                                        @行160,000,768    sha cbee976b5c9f8170
                                        @行319,995,367    sha 680ee28fd267373e

unsloth 基座 engram/Q8_0.gguf_file      @三处            同 同 同  ✅（数据起点 192）
ukisai Swift Q8_0 shard2                @三处            同 同 同  ✅（数据起点 192）


三处采样（开头 / 中间 / 结尾各 1 MiB）sha256 全部一致。

这里要澄清一个概念，因为它解释了"为什么必然相同"：

engram/ 里的 PLE 表不属于"量化档"，它属于基座权重。 Swift 1.5 那次重训的目标是"省思考 token"（thinking -63.4%），动的是 attention/专家/输出头这些参与推理路径的权重，PLE 表（per_layer_token_embd.weight，51.2B 个值 n-gram 查表）根本没被碰。所以：

- unsloth UD 各版本（v3.1 的 Q2_0/IQ2_XS/IQ3_XXS/Q3_K_XL/IQ4_XS…）共用同一张 engram/Q8_0
- Swift 1.5 微调版共用同一张
- huihui abliterated、OrcaRouter、SC117 这些第三方改版也一样（1104/1020 的 byte-identical 结论现在彻底确立了）

也就是说：整个 Qwen3.8-Flash-Next 生态里，那 51.2B 的 n-gram 表只有一份，永远只有"用哪个精度档"的问题，没有"用哪个模型的表"的问题。

顺带纠正我自己一条旧记录（1106 留的）：unsloth engram 原文件的数据段起点是 192，不是 2912。我第一次比对用了 2912，结果三块全"不同"——纯错位假象，改成 192 后立刻全同。这个坑已经写进 skill，免得下次又白折腾一轮。数值上也自洽：


原文件  = 192 + 320001536×170 = 54,400,261,312 字节
strata-ple 版 = 160 + 同一数据段 = 54,400,261,280 字节   （只差 32 字节 header 对齐）


所以对你现在的部署，结论没变、还更强了：

1. Q4_K_XL 那档挂的 Q8 表，就是官方（任何来源）唯一的那张 Q8 表 —— 不用换、不用下、不会有"更正确的版本"。
2. 唯一还剩的升级空间就是精度档：Q8_0（0.53% 残余误差）→ BF16（102.4 GB，RMSE 0）。这笔账不划算（/n2 只剩 49 G，锁页要 ~96 GiB 内存），除非哪天你把 /n1 腾出 100 G 并且愿意用 45 分钟等数据前移，收益是抹掉 0.53% —— 官方数据也说不感知。
3. 将来若要下 engram/ 其它档（Q5_1 38.4 G / IQ4_NL 28.8 G），记住都是同一份权重换精度，Strata 侧必须转 strata-ple（改 arch、去 split.*、数据前移到 160），工具和三条硬条件都在 ~/docs/strata-upgrade-1106/。
</code></pre>
]]></description><link>https://lcz.me/post/31641</link><guid isPermaLink="true">https://lcz.me/post/31641</guid><dc:creator><![CDATA[stxpnet]]></dc:creator><pubDate>Sat, 07 Nov 2026 00:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sat, 07 Nov 2026 00:34:47 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/j-z-0" aria-label="Profile: J-Z-0">@<bdi>J-Z-0</bdi></a> <a href="/post/31639">说</a>:</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/stxpnet" aria-label="Profile: stxpnet">@<bdi>stxpnet</bdi></a> 能请教下，iq4xs + 你的新表，一共占多少vram+ram？ 不知道7900xtx+ 128g能不能塞下</p>
</blockquote>
<p dir="auto">这个表，如果你的NVME速度足够快，可以不放RAM里面的，这个表在STRATA的设计 里面就是放NVME的。 对速度影响也挺小的。 我只是RAM空闲较多才放RAM的，以后我可能也要改回直接放在NVME。</p>
]]></description><link>https://lcz.me/post/31640</link><guid isPermaLink="true">https://lcz.me/post/31640</guid><dc:creator><![CDATA[stxpnet]]></dc:creator><pubDate>Sat, 07 Nov 2026 00:34:47 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sat, 07 Nov 2026 00:14:58 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/stxpnet" aria-label="Profile: stxpnet">@<bdi>stxpnet</bdi></a> 能请教下，iq4xs + 你的新表，一共占多少vram+ram？ 不知道7900xtx+ 128g能不能塞下</p>
]]></description><link>https://lcz.me/post/31639</link><guid isPermaLink="true">https://lcz.me/post/31639</guid><dc:creator><![CDATA[J Z 0]]></dc:creator><pubDate>Sat, 07 Nov 2026 00:14:58 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Sat, 07 Nov 2026 00:03:16 GMT]]></title><description><![CDATA[<p dir="auto">换 engram 表这个方向是对的，但 15 题的结论只能当噪声看，别急着定档。</p>
<ul>
<li>这张 per_layer_token_embd 是纯查表，量化误差会以固定偏置进入每层输入；RMSE 7.57% → 0.53% 是实打实的系统性误差源消除，不是随机波动，这点你的判断没问题。</li>
<li>但 15 题里 1 题 partial→pass 就是 6.7 个百分点，二项分布的 95% 区间大约 ±20 个百分点，判不了优劣。要证明 Q8_0 更好，至少：同一批 prompt 配对跑（温度 0、固定 seed）、题量 100+、报 pass 率差的 bootstrap 置信区间；再补两类更能暴露表误差的任务——长文精确引用/复制专有名词，以及含大量生僻 token 的检索问答。</li>
<li>成本侧：Q8_0 表 54.4G vs 内嵌 IQ4_NL 28.8G，多占约 25.6G 内存/磁盘；速度几乎不受影响（每 token 每层只读一行，带宽可忽略），但 mmap 加载和 page cache 压力会变大，内存紧的机器要算这笔账。</li>
<li>主体仍是 IQ4_XS，换表只消掉一个误差源，别把整体精度提升都归给它；建议固定主体，做 IQ4_NL / Q5_1 / Q8_0 三档表的同题对照，再决定长期用哪档。</li>
</ul>
]]></description><link>https://lcz.me/post/31637</link><guid isPermaLink="true">https://lcz.me/post/31637</guid><dc:creator><![CDATA[Xiaote]]></dc:creator><pubDate>Sat, 07 Nov 2026 00:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Fri, 06 Nov 2026 16:38:03 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/stxpnet" aria-label="Profile: stxpnet">@<bdi>stxpnet</bdi></a> <a href="/post/31528">said</a>:</p>
<p dir="auto">DEEPSEEK 的判断（诚实版）：</p>
<p dir="auto">没有可测的退化，还略高 3 分 —— 但 15 题里就差 1 道题从 partial 变 pass，这属于统计噪声，不能宣称「Q8 更好」。<br />
真正的价值是消除一个已知的系统性误差源：7.57% 的表误差在长文、需要精确措辞或推理链的任务上可能放大，而 0.53% 基本无损。</p>
</blockquote>
<p dir="auto">可能要高難度的考題 才能測出差距</p>
]]></description><link>https://lcz.me/post/31610</link><guid isPermaLink="true">https://lcz.me/post/31610</guid><dc:creator><![CDATA[kos or]]></dc:creator><pubDate>Fri, 06 Nov 2026 16:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Strata 跑QFN3.8 UD3.1格式- 换ngram表 提升一定的精度 on Fri, 06 Nov 2026 07:42:34 GMT]]></title><description><![CDATA[<p dir="auto"><img src="https://upload.lcz.me/uploads/1b5e1342-8706-4c5c-b12f-643914cafd8a.jpeg" alt="{A2F5629A-2033-4181-BF2A-C143BF864306}.jpeg" class="img-markdown  img-fluid" /></p>
<p dir="auto">原版编程非常久。 32分钟还没写完，中途截图。</p>
]]></description><link>https://lcz.me/post/31555</link><guid isPermaLink="true">https://lcz.me/post/31555</guid><dc:creator><![CDATA[stxpnet]]></dc:creator><pubDate>Fri, 06 Nov 2026 07:42:34 GMT</pubDate></item></channel></rss>