2作者: Shark1n4Suit7 天前原帖
PyTorch 和 ONNX Runtime 可以告诉你输出的结果,但无法告诉你实际执行了什么——哪些操作被执行、执行的顺序以及使用了哪些输入。 模型被打包成一个封闭的 .cnox 容器。在执行任何操作之前,会先验证 SHA-256。在推理过程中,会在一个最小的操作集上执行固定的计划。每次运行都可以生成每个操作的审计日志:操作类型、输出张量哈希、输出样本——这些都与生成它的确切容器和输入通过加密方式相链接。如果在生产中出现问题,你将有一条追踪记录。 当前的标量后端是参考实现,并在硬件加速不可用时作为永久的后备。所有后端的审计和验证是相同的。接下来是 SIMD,然后是 GPU。 下面的输入是合成的(全为1),与真实输入的管道是相同的。 审计示例: { "schema": 2, "run": { "run_id": "59144ede-5a27-4dff-bc25-94abade5b215", "started_at_unix_ms": 1776535116721, "container_path": "/home/shark/cnox/models/output/bert_base_uncased.cnox", "container_sha256_hex": "184c291595536e3ef69b9a6a324ad5ee4d0cef21cc95188e4cfdedb7f1f82740", "backend": "scalar" }, "input": { "len": 98304, "sha256_hex": "54ac99d2a36ac55b4619119ee26c36ec2868552933d27d519e0f9fd128b7319f", "sample_head": [ 1.0, 1.0, 1.0, 1.0 ] }, "ops": [ { "op_index": 0, "op_type": "Add", "out_len": 98304, "out_sample_head": [ 0.12242669, -4.970478, 2.8673656, 5.450008 ], "out_sha256_hex": "19f8aa0a618e5513aed4603a7aae2a333c3287368050e76d4aca0f83fb220e78" }, { "op_index": 1, "op_type": "Add", "out_len": 98304, "out_sample_head": [ 0.9650015, 0.23414998, 1.539839, 0.30231553 ], "out_sha256_hex": "7ae2f025c8acf67b8232e694dd43caf3b479eb078366787e4fdc16d651450ad4" }, { "op_index": 2, "op_type": "MatMul", "out_len": 98304, "out_sample_head": [ 1.0307425, 0.19207191, 1.5278282, 0.3000223 ], "out_sha256_hex": "44c28e64441987b8f0516d77f45ad892750b3e5b3916770d3baa5f2289e41bdd" }, { "op_index": 3, "op_type": "Gelu", "out_len": 393216, "out_sample_head": [ 0.68828076, -0.0033473556, 1.591219, -0.16837223 ], "audit_elided": "hash_skipped: len 393216 > max 262144" } ] }