2作者: Shark1n4Suit4 个月前
PyTorch 和 ONNX Runtime 告诉你输出了什么。但它们无法告诉你为了得到这个结果,实际运行了什么——执行了哪些操作,以什么顺序,以及使用了哪些输入。<p>一个模型被打包进一个密封的 .cnox 容器中。在执行任何操作之前,都会验证 SHA-256。推理过程会按照一个固定的计划,在一个最小化的算子集上进行。每次运行都可以生成一个针对每个算子的审计日志:算子类型、输出张量的哈希值、输出样本——这些都与生成它的确切容器和输入进行了密码学链接。如果在生产环境中出现问题,你就能追溯原因。<p>目前的标量后端——是参考实现,也是在无法使用硬件加速时的永久备用方案。审计和验证在所有后端都是相同的。接下来是 SIMD,然后是 GPU。<p>下面的输入是合成的(全为 1)——流程与真实输入完全相同。<p>github.com/Coelanox/CLF 审计示例: ```json { "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": "184c291595536e3ef69b9a6a324ad5ee4d0cefdedb7f1f82740", "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" } ] } ```