K-Veritas:无需重跑实验即可证明代码与结果一致的开源验证工具
在科学研究和机器学习领域,结果的可复现性始终是一个核心问题。当一位研究者在论文中报告某个模型达到了百分之九十五的准确率时,审稿人、读者甚至其他研究者往往难以判断这一结果是否真的由论文描述的代码在描述的硬件上运行产生。传统的方法是让审稿人重新运行代码,但这既耗时又对硬件环境敏感,很多情况下并不现实。开源工具 K-Veritas 的出现正是为了解决这一痛点,它通过密码学签名的 PDF 报告,将代码、硬件、时间和计算结果绑定在一起,任何人都可以在不重新运行实验的情况下验证结果的真实性。 K-Veritas 的核心理念是"防篡改的验证"。它不仅仅记录最终的结果,还记录产生该结果的完整上下文:源代码在运行开始时的状态、每个阶段的变化、使用的硬件配置、运行时间,以及通过 HMCA 执行一致性分析得出的行为特征。
最终,所有这些信息被打包进一个经过 RSA-PSS-SHA256 签名的 PDF 文件中。任何人拿到这份 PDF,都可以本地验证签名的有效性,确认报告内容未被篡改,同时还可以将 PDF 上传到 kveritas.org/verify 网站进行更深入的可视化验证,包括执行一致性遥测图谱、来源追溯、指标对比以及 AI 代码审计。 对于使用 K-Veritas 的研究者而言,整个工作流程非常简洁。首先通过 kveritas init 命令启动一个会话,会话默认处于"编辑"状态,这意味着报告中只会显示化名,不会泄露任何敏感的代码或数据内容。然后,研究者可以使用 kveritas run 命令运行他们的训练或评估脚本,例如 python train.py --epochs 90。K-Veritas 会在后台以约十赫兹的频率采样每个进程的遥测数据,包括 CPU 使用率、内存占用、上下文切换、页面错误、CPU 频率、I/O 活动,以及在使用 GPU 时的 GPU 利用率、显存、功耗和温度。
在运行过程中,研究者还可以通过特定的协议行输出结构化信息,例如 KVERITAS_METRIC 记录指标,KVERITAS_CLAIM 提交标题声明,KVERITAS_MODEL 声明模型架构等。当然,K-Veritas 也会自动检测常见的指标输出,包括 Keras 的训练历史、scikit-learn 的交叉验证结果以及类似指标的局部变量,因此简单的运行甚至不需要额外的协议行。 当所有运行完成后,研究者执行 kveritas seal --output report.pdf 命令即可生成签名报告。如果在初始化时使用了 --disclosure open 参数,K-Veritas 还会同时生成一个 checkout 包,其中包含源代码的内容寻址快照,以便后续重建完整的运行环境。生成的 PDF 文件末尾会嵌入所有验证所需的数据,包括公钥、规范化的 JSON 字节以及视觉 PDF 的哈希值,范围在 KVERITAS_SEAL_BEGIN 和 KVERITAS_SEAL_END 标记之间。验证者直接对存储的规范化 JSON 进行哈希运算,因此即使未来协议增加了新字段,也不会影响验证的有效性。
K-Veritas 最具创新性的功能之一是 HMCA,即执行一致性分析。这是一种与指标无关的判断机制,它从不查看报告的结果本身,而是分析遥测数据中各个通道是否协同波动。在一次真实的计算过程中,CPU 使用率、内存占用、I/O 活动等指标应该像同一活动的影子一样共同起伏;而在伪造或重放的痕迹中,这些通道之间往往缺乏这种协同性。HMCA 会给出 PASS、WARN、FAIL 或 N/A 四种判断结果,其中 PASS 表示一致性良好,FAIL 表示明显不一致,N/A 表示遥测数据不足以做出判断。重要的是,HMCA 不会因为运行规模小而惩罚用户,它只根据实际存在的行为数据做出判断。 另一个值得关注的功能是计算成本证明。
当研究者通过 KVERITAS_MODEL 声明了模型卡时,K-Veritas 会在封存阶段生成一份证书,检查所声明的 FLOPs 是否在硬件物理能力范围内。具体而言有三个边界:时间边界检查所声明的 FLOPs 是否超过 GPU 峰值算力乘以 GPU 活跃秒数与 CPU 峰值算力乘以 CPU 核心秒数之和;能量边界检查所声明的 FLOPs 是否超过测得的 GPU 焦耳数除以每 FLOP 最小能耗;内存边界则以软约束的形式检查所声明的权重是否超过观察到的 GPU 显存。这些边界相当宽松,诚实的运行通常都能通过;如果出现硬性违规,则会标注为 FABRICATION-IMPOSSIBLE 并绑定到签名中。例如,一个声称在空闲 CPU 上训练了一千七百五十亿参数模型的声明就会被立刻识破。 在数据保密性方面,K-Veritas 设计了三个披露级别。默认的"编辑"级别只显示化名,不暴露任何名称或内容;"名称"级别会显示真实的文件名但不暴露内容;"开放"级别则会同时显示真实名称和代码内容,并生成 checkout 包。
无论选择哪个级别,完整性始终是承诺的。即使是编辑级别的报告,服务器也只会接收到数据的哈希值,不会接触到任何原始信息。通过 .kveritasignore 文件,研究者可以指定哪些文件不进入任何包,但即使是被扣留的文件,其哈希值仍会作为叶子节点提交并在报告中标注为扣留,从而避免被静默删除。 选择性披露证明功能允许在不暴露其他文件的情况下证明某个特定文件包含在已签名的快照中。例如,研究者可以证明 src/train.py 文件参与了实验,但不必公开其他源文件。对于使用 AI 代理的场景,K-Veritas 还提供了 kveritas harness-prove 命令,可以针对代理会话中的特定提示或输出生成证明,例如证明某次提示确实被发送给某个代理,或某次响应确实来自该代理。
其他所有条目则保持为哈希形式,确保敏感信息不被泄露。 K-Veritas 的架构相当简洁。整个项目使用 Go 语言编写,依赖极少,仅使用 spf13/cobra 作为命令行框架和 google/uuid 生成标识符,其余功能均依赖 Go 标准库实现。代码组织清晰,cmd/kveritas 负责命令行入口,server 提供证明服务,internal 目录下则包含了会话管理、子进程包装与遥测采样、加密签名、PDF 生成、客户端通信、硬件快照、来源追溯与 Merkle 快照、文件与子进程活动映射、代理会话与哈希链、计算成本证明、执行一致性分析以及源代码收集与哈希等模块。这种清晰的架构使得项目既易于维护,也方便研究者理解其工作原理。 在协议层面,K-Veritas 采用了规范的密码学流程。
首先将签名数据序列化为规范化 JSON,即按键名排序的紧凑 JSON 格式;然后计算其 SHA-256 哈希;将哈希值、随机数和签名时间组合成有效负载;最后使用 4096 位的 RSA-PSS-SHA256 算法对有效负载进行签名。视觉 PDF 哈希则是计算封存标记之前的所有 PDF 页面的 SHA-256 值,而封存块哈希则是计算封存 JSON 在插入自身哈希之前的 SHA-256 值。这些层层嵌套的哈希与签名机制确保了报告的任何修改都会被立即检测出来。 从应用场景来看,K-Veritas 适用于多种情况。在学术论文投稿中,作者可以用它生成附带的验证报告,让审稿人快速确认实验的真实性和完整性;在开源项目发布中,维护者可以用它证明某个发布版本确实由特定的代码产生;在 AI 代理审计中,组织可以用它记录和验证代理的操作记录,确保代理的行为可追溯且未被篡改;在计算基准评测中,参与者可以用它证明提交的分数确实来自实际运行而非伪造结果。 项目的许可证结构也值得注意。
CLI、协议和验证库采用 Apache-2.0 许可证,而证明服务器则采用 AGPL-3.0 许可证。这意味着如果有人修改了服务器并将其作为网络服务运行,必须在相同许可证下发布源代码,或者获取商业许可证。此外,"K-Veritas" 及其徽标是注册商标,许可证并未授予使用该名称或徽标运营暗示官方认证服务的权利。这种许可证设计既保护了开源精神,也为商业化使用提供了清晰的路径。 对于想要尝试 K-Veritas 的用户,安装过程非常便捷。预编译的二进制文件可以从 kveritas-releases 仓库下载,支持 Linux、macOS 和 Windows 的 amd64 与 arm64 架构。
下载后只需赋予执行权限并移动到系统路径即可。如果偏好从源代码构建,只需确保系统安装了 Go 1.22 或更高版本,然后执行 make build 命令即可。整个工具是单个静态二进制文件,零运行时依赖,使用起来非常方便。 总的来说,K-Veritas 代表了计算可验证性领域的一次重要进步。它不要求审稿人或读者重跑实验,而是通过密码学和遥测分析直接证明结果的真实性。这种方法不仅节省了大量时间和计算资源,还为学术诚信、开源透明度和 AI 治理提供了强有力的技术支撑。
随着科学研究和人工智能应用的快速发展,像 K-Veritas 这样的工具将变得越来越重要,它帮助建立信任,降低验证门槛,让真正的创新成果得以脱颖而出。对于关注研究可复现性、开源治理或 AI 安全的研究者和开发者而言,深入了解并尝试使用 K-Veritas 无疑是一个值得投入时间的选择。 。