关键词:同态加密 | FHE | 已知边界 | 未完成清单 | 精度 | 安全强度 | 可复现性 | 机制验证级 | 大模型密文推理
导读:这是全系列的收尾清单。前面十五篇的"未解问题"在这里收拢并按严重程度排序。一句话概括:这套同态加密推理引擎能跑、能复现、能被第三方独立验证,但它不安全,而且有几个已知缺口我们没堵。本文照实列出精度余量、超阈项与三个非安全事实。
项目仓库
Gitee 主仓:https://gitee.com/pei-xiaoguang/kestrel-llm
GitHub 镜像:https://github.com/m13253246268-ship-it/kestrel-llm
相关文档
术语与数据口径 |
性能与基准 |
构建与复现 |
快速上手 |
0. 一句话结论
这一篇不给结论,只给清单。前面十五篇里每一篇的"未解问题"都是零散的,这里把它们收拢到一处,并按严重程度排序。
如果你只想看一句话 :这套东西能跑、能复现、能被第三方独立验证 ;但它不安全 ,而且有几个已知缺口我们没堵。
1. 安全边界(本系列最终版)
本项目所述参数为机制验证级(n=2048、112 素数内层链、2100 素数自举链),
远低于 HE 参数标准的 128-bit 水平,不得用于保护真实数据。
本项目主张的是:机制可行性、可复现性、可独立验证、以及完整的工程量账本。
本项目不主张:安全强度、性能优越性、与任何其他方案的优劣对比。
三个具体的非安全事实:
1. 随机数源是原型级 xorshift(非密码学 RNG);
2. 私钥 sk.bin 与密文一起在接力包内流转(无密钥托管、无分段解密);
3. 为换取自举的数值可行性,私钥稀疏度 hw 被降到 8。
这三条不是"待改进项",是"当前状态"。 任何引用本项目的地方都请连带引用这三条。
2. 阻塞级(最关键的三条)
2.1 位级可复现性缺陷尚未修复
- 现象 :
T23_NT=4与T23_NT=8输出位级不同 - 根因 :
_Thread_localRNG 以固定常量播种,随机数消耗与调度绑定 - 方案 :按自同构指数
k播种(代码里已有按k的入口) - 状态 :❌ 未落地 。源码仍是
static _Thread_local uint64_t ckks_rng_state = 0x243F6A8885A308D3ull; - 影响 :所有位级复现声明必须绑定线程数
- 详见第 13 篇
2.2 精度余量不宽,链尾已有超阈项
| 对象 | 结果 |
|---|---|
u0 / u0r112 |
PASS 8/8(1.27e-03 量级) |
u26 / u26r112 |
PASS 8/8(4.47e-03 ~ 2.30e-02) |
u27 |
⚠️ 6/8 :t1h1=3.8216e-02、t3h1=7.9687e-02 超 3e-2 |
我们不调容差 把它变成通过。但"这两项算不算失败"我们还没有定论------详见第 14、15 篇。
2.3 密文 attention 的定标越界无兜底
softmax 用"预定标"替代了 max-sub(第 10 篇)。一旦真实输入让 score 跑出统计区间,拟合多项式在区间外的行为没有任何保证,而且不会报错。
这是整个系列里我最担心的一处:它是静默的,且随输入而定。
3. 重要的技术缺口
| # | 缺口 | 说明 | 篇 |
|---|---|---|---|
| 1 | 自举域变换未归因 | coeff_to_slot + slot_to_coeff 占自举 80%,但"为什么贵"只有推测(疑为内存带宽),没有微架构 profiling |
15 |
| 2 | 精度预算无闭环 | 逐层独立定标 + 事后整链验收,没有"从 28 层反推每层可用误差"的推导 | 9 |
| 3 | 无最小可用链长扫描 | boot 编到 2100,实际用多少、能压到多少,是拍的 |
5, 7 |
| 4 | "缺失即默认"模式未清理 | silu{L}.bin 只是其中一例;全树同类文件读取需逐一审查 |
8 |
| 5 | DIRECT_LAYERS 是固化调参 |
不是推导规则 → 换模型不能自动适配 | 8 |
| 6 | 协议无版本号、无输入指纹 | 参数一变旧包新包长得一样;下一棒无法验证"输入是不是上一棒声明的那个" | 11, 14 |
| 7 | 线程池无非重入断言、无 A/B 数据 | 非可重入是静默失败;"省了多少"没有同轮实测 | 12 |
| 8 | NTT 只做 radix-2 | 未 SIMD 化;两条模乘路径未做交叉验证;无形式化验证 | 3 |
| 9 | 预处理脚本未做完整性对拍 | 只验了权重(9/9)与 silu(26/26)、embed4、参考值;_full_layers.py / _tail_ref.py / 各拟合脚本的产出未逐字节对拍 |
2 |
| 10 | 换模型需整体重跑 + 人工判断 | 定标、拟合、SiLU 路径选择都依赖对明文参考的统计 | 9 |
4. 已知取舍(有意为之,不是 bug)
这些是我们主动选的,列出来是为了避免被当成疏漏:
| 取舍 | 我们换到了什么 |
|---|---|
hw = 8(私钥更稀疏、更不安全) |
自举折叠的混叠变小 → sin 逼近只需 9 次多项式 |
| 保留 BFV 那代实现不删 | 它是最简正确性自检(T1--T6),也是"为什么走不通"的原始证据 |
| 自研线程池不支持嵌套并行 | 更低的调度开销 + 确定的分块 |
| 数据包不随仓库分发(约 7 GB) | 仓库体积可控;代价是"必须能自助生成"(已验证逐字节一致) |
| 不追求链尾全项通过 | 照实记账,而不是调容差 |
接力包内含 sk.bin |
免去密钥分发协议;代价是没有隐私性质 |
5. 文档与一致性欠账
| # | 欠账 |
|---|---|
| 1 | vllm_ckks.h 顶部「架构」段仍写"4 个 60-bit 素数,支持深 3",而 CKKS_NPRIMES 默认已是 32 ------描述停留在最初原型(第 5 篇) |
| 2 | boot 日志中 out np=2083 与编译期 2100、落盘 112 的精确关系未核实,我们在文档里显式标注而不做断言(第 11 篇) |
| 3 | phase 2 (l1) 与 phase 6 (lay) 语义重叠,属开发阶段遗留(第 11 篇) |
| 4 | fin 阶段的判据与前面几层不同,描述不够显眼------我们自己复现时撞过(第 11 篇) |
| 5 | 各篇标注的"未核实项"会随代码演进过期,需要一次统一的审计 |
6. 如果你想接着做,从哪开始
按"收益 ÷ 难度"排序,我认为这是前三件:
-
落地 RNG 按
k播种 (第 2.1 条)结构现成、方案明确、影响面清晰。做完之后,"位级可复现"才能不带星号地讲。并且顺手在 CI 里加一条"不同线程数比字节"的回归检查。
-
给自举的域变换做一次真正的 profiling (第 3.1 条)
80% 的时间在那里。哪怕只是确认"瓶颈是带宽还是算力",就能把优化方向从"优化卷积"改成正确的那个。
-
让
DIRECT_LAYERS变成推导出来的规则 (第 3.5 条)判据(窄值域→直接拟合)原理上可以从明文参考统计自动生成。这一步做完,"换模型"才有自动适配的可能。
7. 一件我没能做到的事
本系列写到这里,有件事必须说清楚:
我们还没有让这套东西"陌生人可用"。 仓库、文档、Release 资产都准备好了,但还没走到能被外部独立复现那一步------因为公开访问的入口(仓库推送 + Release 上传)还没完成。
也就是说,本系列所有"可复现""可独立验证"的结论,目前都是我们自己在两套独立工作区里验证的 (一份含既有数据、一份全新克隆),还没有第三方跑过。
这正是最初那 21 跳待认领的原因,也是这套设计存在的意义。 如果你读到这里,并且手上有一台愿意跑 1.8 小时的机器------欢迎接手一跳。
系列完
全系列 16 篇。若发现任何与源码不符之处,以源码为准------本文档的每一处断言都标注了它的依据与不确定性。