文档中心:每个模块怎么用,报告怎么验
从选择向量包到回传判定,从单算子 / 模型级 / 量化三个套件到报告下载与独立验真, 以及 HIL 设备证明、CI 徽章与全部 API。所有数字与限制均以当前生产版本为准。
当前为未登录状态:算子目录与格式说明可公开浏览; 下载向量包与提交判定需先登录官网。 登录 / 注册
文档中心
1. 平台概览与证据链
平台不接触任何厂商 SDK 或工具链,只通过一个 zip 包契约交换数据: 平台下发输入向量与清单,客户在被测芯片、仿真器或软件栈上本地计算, 再原样回传产物;平台用 float64 双精度金标准独立复算并判定。
1.1 四个验证套件
| 套件 | suite 参数 | 对象 | 当前规模 | 入口 |
|---|---|---|---|---|
| 单算子验证 | operator | 18 类算子:GEMM、Attention、归一化、激活、RoPE、KV Cache、MoE、Conv2D 等 | 201 条向量 | GET /package?suite=operator |
| 模型级验证 | graph | Conv-BN-ReLU 组合块、Transformer Block 组合块;也支持上传 ONNX 模型切片 | 20 条向量 + 任意 ONNX 子图 | POST /graph/package |
| 量化验证 | quant | INT8 PTQ(per-tensor / per-channel)、INT8 QAT(非对称)、FP8 E4M3 | 48 条向量 | GET /package?suite=quant |
| PIM 算法验证 | pim | 客户的 PIM 实现(算法 / 驱动 / 仿真器)在冻结器件参数下的 L1 算法契约 | 36 条向量 | GET /package?suite=pim |
1.2 四层证据链
- 一次性挑战码:所有盲测包(单算子、模型级组合块、量化方案、PIM 链路、ONNX 子图) 在下载时绑定账号与有效期(默认 30 分钟), 向量按挑战码现场派生;同一包只能成功提交一次,杜绝录答、转发与离线预计算。
- 服务端金标准:盲测包只含
inputs/,期望输出只保存在服务端 sidecar 中; 客户无法通过「把答案抄进 outputs」通过判定。 - Ed25519 签名 + 哈希链:报告使用 v2 信封签名,签名覆盖
data_hash / uid / report_id / prev_hash / signed_at / nonce / key_id; 每份报告链接到同一账号的前一份,形成不可静默删改的哈希链。 - RFC 3161 时间戳:配置可信 TSA 后,报告时间戳由第三方签名;
未配置时诚实标注为本地时间(
timestamp_trusted=false)。
1.3 账号、登录与配额
- 在官网登录后,验证页面会自动获得短期 Bearer Token;所有下载、提交、报告接口都需要
Authorization: Bearer <token>。 - 令牌内含账号标识、档位与每日配额,由官网 HMAC 签名,浏览器无法伪造。
- 默认配额:免费版 5 次/日,完整版 50 次/日;按本地自然日重置。
POST /check与POST /graph/package共用同一份配额; ONNX 解析(/graph/inspect)不计配额,但有频率限制。
2. 快速开始(单算子,5 步)
以下示例使用 curl 与 Python;任何能读写二进制文件的语言都可以完成同样流程。
步骤 1:确认身份与目录
export DBHOO_API="https://www.dbhoo.com/api/verify-suite" export DBHOO_TOKEN="<登录官网后获取的令牌>" curl -s "$DBHOO_API/catalog?task=operator" \ | python -c "import json,sys; d=json.load(sys.stdin); print(d['total_cases'], 'cases'); print([o['op'] for o in d['operators']])"
步骤 2:下载盲测向量包
curl -s -D headers.txt -o pack.zip \ -H "Authorization: Bearer $DBHOO_TOKEN" \ "$DBHOO_API/package?suite=operator&ops=gemm,softmax"
响应头包含本次挑战信息:
| 响应头 | 含义 |
|---|---|
X-Challenge-Nonce | 本次一次性挑战码(manifest 内 challenge.nonce 同值) |
X-Challenge-TTL-Seconds | 挑战码有效期,默认 1800 秒 |
X-Case-Count | 包内用例数 |
X-Suite | 套件类型(operator / graph / quant) |
X-Baseline-Version | 金标准版本,例如 golden-f64-1.1 |
步骤 3:解压并在本地计算
mkdir work && cd work unzip -q ../pack.zip -d pack cd pack ls # manifest.json inputs/ (盲测包没有 expected/)
读取 manifest.json 中每个 case 的输入规格,按名称与形状读取
inputs/<case_id>__<tensor>.bin(小端、行优先),
在你的硬件/仿真器上计算,再把结果写入 outputs/。
import json
import numpy as np
from pathlib import Path
m = json.loads(Path("manifest.json").read_text(encoding="utf-8"))
for case in m["cases"]:
x = np.fromfile(case["input_files"]["x"]["file"], dtype="<f8")
x = x.reshape(case["input_files"]["x"]["shape"])
y = your_operator(x) # ← 被测算法(硬件 / 仿真器)
out = case["outputs"][0] # 输出名以 manifest 为准
y.astype("<f8").tofile(
"outputs/" + case["case_id"] + "__" + out["name"] + ".bin")
步骤 4:原样回传判定
cd .. && (cd pack && zip -qr ../return.zip .) && cd .. curl -s -X POST "$DBHOO_API/check" \ -H "Authorization: Bearer $DBHOO_TOKEN" \ -H "Content-Type: application/zip" \ -H "X-Report-Title: GEMM+Softmax%20FPGA%20%E5%9B%9E%E5%BD%92" \ --data-binary @return.zip
返回 JSON,其中 summary 为汇总,cases 为逐用例明细,
report_id 为本次签名报告编号。
步骤 5:下载并验真报告
# HTML / PDF / JSON curl -o report.html "$DBHOO_API/report/$RID?format=html" curl -o report.json "$DBHOO_API/report/$RID?format=json" # 在线复验(需登录) curl -s -H "Authorization: Bearer $DBHOO_TOKEN" \ "$DBHOO_API/report/$RID/verify"
离线验真方法见 第 9 节。
3. 单算子验证
适合 IP 核、指令集模拟器、算子库或 NPU 单算子单元的精度验收。一次提交可以覆盖一个或多个算子。
3.1 支持的算子
| op | 说明 | op | 说明 |
|---|---|---|---|
gemm | FP32 矩阵乘法 | gemm_int8 | INT8 量化矩阵乘法 |
sdpa | 缩放点积注意力(因果) | gqa | 分组查询注意力 |
softmax | Softmax 归一化 | layernorm | LayerNorm |
rmsnorm | RMSNorm | rope / rope_glm | 旋转位置编码及其 GLM 变体 |
silu / gelu | 激活函数 | silu_gemm / swiglu | 融合算子 |
kvcache | KV Cache 追加与读取 | moe_gate | MoE 专家门控(Top-K) |
cross_entropy | 交叉熵损失 | quant_int8 | INT8 量化 / 反量化 |
conv2d | Conv2D(NCHW) | 合计 18 类算子 / 201 条向量;rope 与 rope_glm 为同一算子的两种变体 | |
3.2 选择与下载
- 页面 Step 1 勾选算子(可按「大模型推理 / 大模型训练 / 端侧视觉」筛选),
或直接调用
GET /package?suite=operator&ops=gemm,softmax。 - 下载必须登录;每个包都绑定一次性挑战码与当前账号。
- 下载动作本身不消耗配额;成功提交才计入配额。
3.3 回传与判定
- 保持目录结构原样打包;zip 根目录下应直接是
manifest.json、inputs/、outputs/。 - 同一个挑战包只能成功消费一次;判定失败(如格式错误)可以修正后用原包重试, 但报告一旦成功落库,挑战码即作废。
- 可选把同一输入重跑一次的结果写入
outputs_repeat/,平台据此检查确定性。 - 可选在包根目录提供
performance.json(耗时/周期/功耗), 满足条件时会进入排行榜,详见 第 11 节。 平台不测量时间、不复算 GFLOPS,报告与榜单只原样记录客户自报值。
3.4 反作弊检查
| 检查 | 行为 |
|---|---|
| 挑战码 | 缺失、过期、不属于当前账号或已被消费 → 400,不签发报告 |
| 答案回抄 | expected/、inputs/ 中的文件不会被当作客户产物;上传包内若出现 expected/ 成员,在线接口直接拒收 |
| 退化输出 | 全零、常量、结构上不可能的产物判 FAIL 并在报告中说明 |
| 批量复制 | 不同金标准的用例回传了完全相同的输出 → FAIL(复制粘贴特征) |
| 归档自报 | 在线接口拒绝 mode=archive 包(客户自报不构成独立证据) |
4. 模型级验证(ONNX 子图)
上传一个 ONNX 模型,平台在 float64 环境中执行指定子图,生成输入与金标准, 客户只需在硬件上跑同一段子图并回传输出。
4.1 流程
- 解析模型:
POST /graph/inspect?nodes=a,b,请求体为.onnx原始字节。 返回节点、算子类型、输入/输出形状、initializer 列表,以及是否全部受支持。 - 生成子图包:
POST /graph/package?nodes=a,b&name=my_model,同样上传 ONNX。 服务端执行子图生成金标准 sidecar,返回 zip(含一次性挑战码与graph_id)。 该接口消耗一次配额。 - 本地计算:按 manifest 在硬件上执行同一段子图。
- 回传:与单算子相同,
POST /check;manifest 中suite=graph, 挑战码自动绑定。
4.2 模型限制
| 项目 | 限制 |
|---|---|
| 文件大小 | ≤ 64 MB |
| opset | 7 – 21(ai.onnx 默认域) |
| 节点数 | ≤ 512 |
| 声明张量元素总数 | ≤ 32,000,000(输入 + initializer) |
| 执行墙钟预算 | 默认 20 秒(DBHOO_ONNX_MAX_SECONDS) |
| 频率限制 | inspect 30 次/分钟;package 10 次/分钟;同一账号同时只能有一个任务 |
4.3 支持的算子
Gemm、MatMul、Add、Sub、Mul、Div、Neg、Abs、Relu、Sigmoid、Tanh、Erf、Exp、Log、Sqrt、Pow、
Softmax、LogSoftmax、Cast、Identity、Constant、Concat、Reshape、Transpose、Flatten、Squeeze、Unsqueeze、
ReduceMean、ReduceSum、LayerNormalization、BatchNormalization、Conv、Gather、Shape、Slice、Where、Clip
supported=false / unsupported),
平台不会跳过节点给出「看似通过」的结果。4.4 组合块套件(不下发 ONNX)
也可以直接用 GET /package?suite=graph 下载内置的
Conv-BN-ReLU 与 Transformer Block 组合块,用法与单算子一致:
包同样按一次性挑战码派生,提交时需回传原包。
5. 量化验证
量化套件验证的是 量化方案本身:缩放因子、零点、per-channel 处理与累加位宽, 而不是只看反量化后的浮点结果。
5.1 四个方案
| op | 方案 | 关键语义 |
|---|---|---|
quant_gemm_ptq | INT8 PTQ,per-tensor | INT32 累加后统一反量化 |
quant_gemm_pc | INT8 PTQ,per-channel | 每个输出通道独立 scale,INT32 累加 |
quant_gemm_qat | INT8 QAT,非对称 per-channel | 反量化前先减 zero_point |
quant_gemm_fp8 | FP8 E4M3,per-tensor | E4M3 表示范围与舍入 |
5.2 使用方法
curl -s -o quant.zip -H "Authorization: Bearer $DBHOO_TOKEN" \ "$DBHOO_API/package?suite=quant&ops=quant_gemm_ptq,quant_gemm_pc"
包内输入通常包含 a_q、b_q(INT8 量化张量)以及
scale_a、scale_b、必要时 zero_point_b。
输出名与形状以 manifest 为准。提交同样走 POST /check。
5.3 判定重点
- 余弦相似度对幅度不敏感,因此量化套件同时校验 相对 L2 误差; 漏乘 scale 这类 1000 倍幅度错误会被识别。
- INT8 用例的 dtype 门限更宽(见 第 7 节),但累加通路必须是 INT32, 用 float 累加会在边界用例上暴露。
6. 向量包与回传契约
6.1 目录结构
<package>.zip ├── manifest.json ├── inputs/<case_id>__<tensor>.bin 小端、行优先,形状见 manifest ├── expected/<case_id>__<tensor>.bin 金标准(盲测包中没有此目录) ├── outputs/<case_id>__<tensor>.bin 客户产物,支持 .bin/.npy/.npz/.csv/.json ├── outputs_repeat/... 可选:确定性复测 ├── performance.json 可选:耗时/周期/功耗 └── device_attestation.json 可选:设备证明(HIL 自动生成)
6.2 manifest 关键字段
| 字段 | 说明 |
|---|---|
format | 固定 dbhoo-golden/1.0 |
suite | operator / graph / quant |
baseline_version | 金标准版本,必须与报告中的一致 |
byte_order / array_order | little / row-major |
blind / expected_withheld | 盲测包为 true |
cases[].case_id | 用例唯一 ID,输出文件必须以此开头 |
cases[].inputs | 逻辑张量名 → 规格(形状、dtype) |
cases[].input_files | 逻辑张量名 → 文件路径、sha256、shape、dtype |
cases[].outputs | 输出张量名、形状、dtype、顺序 |
cases[].tags | 分布、场景等标签,仅用于展示 |
challenge.nonce | 一次性挑战码(算子包 / ONNX 子图包) |
graph_id | 金标准 sidecar 键,提交时用于定位期望输出 |
6.3 输出文件命名
统一为 outputs/<case_id>__<输出名>.<扩展名>。例如
outputs/gemm_fp32_small_0001__output.bin。也允许直接放在 zip 根目录
(不带 outputs/),但推荐保持目录结构。
6.4 资源与体积限制
| 项目 | 上限 |
|---|---|
| HTTP 请求体 | 64 MB |
| zip 成员数 | 4096 |
| 单成员解压后 | 128 MB |
| 解压总量 | 256 MB(压缩比 ≤ 100) |
| 单张量元素数 | 8,000,000 |
| 单用例元素数 | 32,000,000 |
| 单次提交元素总数 | 128,000,000 |
| 用例数 | 1024 |
7. 判定口径与门限
每个用例输出四项指标:余弦相似度、相对 L2 误差、PSNR 与 最大绝对偏差。判定以余弦相似度(方向一致性)与相对 L2 误差(幅度相对偏差)为准, 启用 PSNR 门限时 PSNR 亦需达标;全部达标才算 PASS。最大绝对偏差用于定位离群点,不单独作为判定条件。
| dtype | cos ≥ PASS | cos ≥ WARN | rel-L2 ≤ PASS | rel-L2 ≤ WARN |
|---|---|---|---|---|
| fp32 | 0.9999 | 0.9995 | 0.01 | 0.05 |
| fp16 | 0.9995 | 0.999 | 0.03 | 0.10 |
| bf16 | 0.999 | 0.995 | 0.05 | 0.15 |
| fp8 | 0.9985 | 0.995 | 0.04 | 0.12 |
| int8 | 0.999 | 0.995 | 0.08 | 0.20 |
| int4 | 0.995 | 0.99 | 0.15 | 0.30 |
7.1 四种状态
- PASS 两项指标均达到 PASS 门限。
- WARN 至少一项落在 WARN 区间,且没有 FAIL。
- FAIL 任一项低于 FAIL 门限,或触发反作弊规则。
- UNTESTED 未找到该用例的合法产物;不计入通过率分母,也绝不判通过。
7.2 汇总字段
| 字段 | 定义 |
|---|---|
tested | PASS + WARN + FAIL 的用例数 |
pass_rate | PASS / tested(UNTESTED 不进分母) |
coverage | tested / total_cases |
load_error | 产物存在但无法解析的用例数 |
8. 报告中心
每次成功判定都会生成一份带签名的报告,保存在账号历史中,可下载 HTML 与 JSON(引擎生成 PDF 时另提供 PDF)。
8.1 历史与下载
| 接口 | 说明 |
|---|---|
GET /history | 当前账号的报告列表(标题、时间、PASS/WARN/FAIL、通过率、数据来源) |
GET /report/<id>?format=html | 可打印的 HTML 报告(默认格式) |
GET /report/<id>?format=pdf | PDF 报告;后端无 PDF 引擎时返回 404 |
GET /report/<id>?format=json | 完整 JSON,包含 integrity 签名块 |
报告 ID 形如 20261021_203015_001,
与账号绑定:使用其他账号的令牌读取会得到 404。
8.2 报告里的证据字段
| 字段 | 含义 |
|---|---|
integrity.sign_version | 签名信封版本,当前为 2 |
integrity.data_hash | 报告内容(去掉易变字段后)的规范化 SHA-256 |
integrity.signed_envelope | 被签名的信封:data_hash / uid / report_id / prev_hash / signed_at / nonce / key_id |
integrity.signature | Ed25519 签名(base64) |
integrity.prev_hash | 同一账号上一份报告的链锚点;首份为 64 个 0 |
integrity.chain_hash | SHA256(prev_hash + ":" + data_hash) |
integrity.timestamp_trusted | 时间戳是否由可信 TSA 签发并通过证书链校验 |
integrity,
因此也无法通过验真——这是设计上的 fail-closed,而不是缺陷。9. 报告如何验证
验真分两种场景:报告持有方可用账号令牌调用在线复验; 不持有账号的第三方用公开公钥与离线 CLI 验签,无需登录、也不接触平台内部数据。 注意:在线复验按账号隔离,未登录调用会返回 401。
9.1 在线复验(推荐给报告接收方)
curl -s -H "Authorization: Bearer $DBHOO_TOKEN" \ "$DBHOO_API/report/20261021_203015_001/verify"
返回字段:
| 字段 | 含义 |
|---|---|
hash_valid | 报告内容与 data_hash 是否一致 |
signature_valid | Ed25519 签名是否有效,且密钥在平台钥匙串中 |
chain_valid | chain_hash 是否由 prev_hash + data_hash 正确推导 |
chain_link_valid | 是否链接到该账号真实存在的上一份报告(防删改历史) |
valid | 以上全部通过才为 true |
legacy_signature | 旧版 v1 报告为 true(仅签 data_hash),仍可验真 |
official_key_id | 平台当前官方密钥 ID,可用于核对公钥 |
errors | 失败原因列表;通过时为空 |
9.2 离线 CLI 验真
平台提供独立工具 dbhoo-verify,只需 Python 与报告文件:
# 安装(在发布包内) pip install ./tools/dbhoo-verify # 验证 JSON / HTML / PDF dbhoo-verify report.json --public-key official_public.key dbhoo-verify report.html --public-key official_public.key dbhoo-verify report.pdf --public-key official_public.key --json # 只提取完整性信息,不验签 dbhoo-verify report.json --extracting
退出码:0 = 通过,1 = 失败。
公钥可从 GET $DBHOO_API/trust/public-key 获取,
或直接使用平台发布的 official_public.key。
9.3 手工复核(不依赖本平台工具)
- 从报告中取出除
integrity、badge_url、badge_markdown、has_pdf之外的全部字段; - 按 键名排序、UTF-8、紧凑分隔符 序列化为 JSON,计算 SHA-256,
应与
integrity.data_hash相同; - 按同一规则序列化
integrity.signed_envelope, 用平台公钥验证integrity.signature(Ed25519); - 核对
signed_envelope中的 uid、report_id、prev_hash、nonce 与报告其余字段一致; - 计算
SHA256(prev_hash + ":" + data_hash), 应与chain_hash相同; - 如需核对时间,使用
integrity.timestamp对应的 RFC 3161 token 与平台公布的 TSA 根证书验证。
9.4 常见失败原因
| 现象 | 原因 | 处理 |
|---|---|---|
| 数据哈希不匹配 | 报告 JSON 被编辑过(哪怕只改一个数字) | 以平台下载的原始文件为准 |
| 数字签名无效 | 公钥不对,或签名被替换 | 使用官方渠道公钥 / 在线复验 |
| 哈希链校验失败 | prev_hash 或 chain_hash 被改 | 重新从平台下载 |
| 与前一份报告未链接 | 账号历史被删除或替换 | 视为证据链断裂,联系平台核查 |
timestamp_trusted=false | 该报告签发时未配置可信 TSA,仅本地时间 | 仅影响时间证明,不影响内容与签名 |
报告中无 integrity | 自检 / 自报结果,本就不签发证据 | 不能作为第三方证明使用 |
10. 设备证明与 HIL 自动化
tools/dbhoo_hil.py 把「下载 → 板卡执行 → 回传」固化为一命令,
适合硬件在环回归与 CI。设备证明协议用于把输出哈希与本次挑战码绑定到设备私钥。
10.1 基本用法
python tools/dbhoo_hil.py run \
--api https://www.dbhoo.com/api/verify-suite \
--suite operator --ops gemm --runner fpga-lab-01 \
--cmd "python hw_runner.py {package} {outputs}"
--cmd 可用占位符:{package}(解压后的包目录)、
{outputs}(package/outputs)、{workdir}。
命令需返回 0,结果写入 {outputs}/<case_id>__<name>.bin。
10.2 模型级 HIL
python tools/dbhoo_hil.py run \
--api https://www.dbhoo.com/api/verify-suite \
--suite graph --onnx model.onnx --nodes gemm0,relu0 \
--runner fpga-lab-01 --cmd "python hw_runner.py {package} {outputs}"
10.3 设备证明
板卡需对平台约定的 canonical message 签名:
dbhoo-device-attestation-v1\n <nonce>\n <output_hashes 的紧凑、键名排序 JSON>
HIL 会把原始 message 写入 {workdir}/device_attestation.message,
签名命令应读取该文件并输出:
{"device_id": "board-01", "algorithm": "Ed25519", "signature_b64": "..."}
python tools/dbhoo_hil.py run ... \
--attest-cmd "python board_sign.py --in {message_file}" \
--attest-pubkey "<设备根公钥 base64>"
--attest-pubkey会在回传前本地自检;签错对象会立即失败,而不是到服务端才被拒。- 服务端配置设备根公钥后,会校验 nonce 绑定、重算输出哈希、验证签名;
任一不符则
verified=false,报告中保留失败原因。 --attest-unsigned只生成占位文件,用于联调,不构成设备证明。
10.4 退出码
0 全部通过;2 存在 FAIL 用例;1 运行、网络或解析错误。
11. CI、徽章与排行榜
11.1 把结果写入公开 CI 历史
仅持有共享密钥的自动化 Runner 可以写入公开历史。提交时需同时带:
| 请求头 | 要求 |
|---|---|
X-CI-Run | 1 / true / yes / on |
X-CI-Token | 与服务端 DBHOO_CI_TOKEN 完全一致 |
X-CI-Runner | Runner 名称(服务端会净化后入库) |
dbhoo_hil.py 会自动携带上述头。普通手动提交即使伪造
X-CI-Run 也不会进入公开历史。
11.2 查询历史
curl -s "$DBHOO_API/ci/history?suite=operator&limit=20" python tools/dbhoo_hil.py history --api "$DBHOO_API" --suite quant --limit 20
11.3 徽章
成功判定返回 badge_url 与 badge_markdown,
可嵌入 README 或官网。徽章查询参数带服务端签名,
手工改写 status/rate 会得到 403。

11.4 排行榜
- 完全自愿:提交包中需包含
submitter与performance.json, 且至少有 5 个已测用例。 - 只接受引擎验证结果;自报 / 自检结果没有资格。
- 排名顺序:通过率 → 自报 GFLOPS → 已测用例数;公开数据不含账号 ID。
性能值来自客户
performance.json,平台不测量、不复算。
12. API 参考
除公开接口外,均需 Authorization: Bearer <token>。
请求/响应均为 JSON,上传接口使用原始字节体。
12.1 端点
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /catalog?task=operator|graph|quant|pim | 公开 | 算子目录、用例数、门限、场景 |
| GET | /package?suite=&ops= | 需要 | 下载盲测包(四个套件均绑定一次性挑战码) |
| POST | /check | 需要 | 提交 zip 产物,返回判定结果与 report_id |
| POST | /graph/inspect?nodes= | 需要 | 解析 ONNX,返回子图与形状元数据,不执行 |
| POST | /graph/package?nodes=&name= | 需要 | 切子图、执行并生成金标准 sidecar,返回 zip(消耗配额) |
| GET | /quota | 需要 | 今日剩余次数、限额、档位 |
| GET | /history | 需要 | 当前账号报告列表 |
| GET | /report/<id>?format=html|pdf|json | 需要 | 下载报告 |
| GET | /report/<id>/verify | 需要 | 在线复验签名、哈希与链 |
| GET | /trust/public-key | 公开 | 平台官方公钥与 key_id |
| GET | /leaderboard?suite=&limit= | 公开 | 排行榜,按套件分组(operator / graph / quant / pim),默认 all |
| GET | /badge.svg?status=&rate=&cases=&sig= | 公开 | 签名徽章 |
| GET | /ci/history?suite=&limit= | 公开 | CI 公开回归历史 |
| GET | /health | 公开 | 引擎根路径健康检查(不在 /api/verify-suite 前缀下;公网由 Nginx 单独响应) |
12.2 请求头
| 请求头 | 用于 | 说明 |
|---|---|---|
X-Report-Title | /check | 报告标题;非 ASCII 需 percent-encode |
X-CI-Run / X-CI-Token / X-CI-Runner | /check | CI 记录,见第 11 节 |
Content-Type: application/zip | /check | 原始 zip 体 |
Content-Type: application/octet-stream | /graph/* | 原始 ONNX 体 |
12.3 状态码
| 状态码 | 含义 |
|---|---|
| 200 | 成功 |
| 400 | 参数/包契约错误、挑战码无效、归档模式被拒 |
| 401 | 未登录或令牌无效 |
| 403 | 今日配额已用完;徽章签名不符 |
| 404 | 报告不存在或不属于当前账号 |
| 413 | 请求体超过上限 |
| 429 | 同一账号已有任务在处理,或频率超限 |
| 500 | 服务端判定或持久化失败(本次不计配额) |
| 503 | 验证引擎未加载 |
13. 错误码与常见问题
13.1 常见错误
| 提示 | 原因与处理 |
|---|---|
| 「该向量包缺少一次性挑战码」 | 使用了旧包或固定盲包;重新从平台下载当前挑战包 |
| 「挑战码已被使用」 | 同一包已成功提交过;重新下载新包 |
| 「挑战码无效: 已过期」 | 下载超过 30 分钟;重新下载 |
| 「产物不符合契约: 元素数 ... 不符」 | 输出形状/元素数与 manifest 不一致;按 manifest 形状重塑 |
| 「无法解析的 zip 产物」 | 文件损坏或被二次压缩;在包目录内重新打包 |
| 「产物超过 64MB 上限」 | 减少用例或改用 .bin 紧凑格式 |
| 「您已有一个验证任务在处理中」 | 同一账号并发提交;等待上一次完成 |
| 「今日验证配额已用完」 | 次日重置或升级完整版 |
| 「在线验证不接受 archive 自报模式」 | 归档模式只用于离线 CLI;在线请提交盲测包的 outputs |
13.2 为什么盲测包没有 expected/?
期望输出是判定依据。下发答案等于允许「把答案抄进 outputs」, 硬件完全不在环。金标准只保存在服务端,判定时现场计算。
13.3 一份报告能证明什么、不能证明什么?
- 能:在报告生成时刻,提交的产物由该账号上传;平台用对应版本的金标准独立计算, 给出的指标与结论未被篡改;报告属于该账号的证据链。
- 不能:不能证明产物一定来自声称的硬件(除非同时有已验签的设备证明), 也不能证明未提交的用例也正确(看覆盖率)。
13.4 如何复现一次历史判定?
下载该报告的 JSON 与对应版本的向量包(baseline_version 必须一致),
按 manifest 重新计算并比对用例指标;报告的 data_hash 同时锁定了当时的内容。
13.5 报告时间戳为什么显示本地时间?
平台只在配置了可信 TSA 时才请求第三方时间戳;未配置或 TSA 不可达时会诚实降级为本地时间,
并在 timestamp_trusted 标记为 false。这不会影响签名与哈希链的有效性。
14. PIM 算法验证(L1 契约)
PIM 套件验证的是客户的 PIM 实现(算法模型、驱动或仿真器)在冻结器件参数下的 数值一致性,不是芯片实测。期望值由服务端在 float64 中按同一契约复算,器件参数 锁死在服务端金标准内,客户端修改 manifest 不生效。首期只做 L1 算法级契约; PRO 闭源特性(INT4 GPTQ / LLM 专用算子)不在 L1 范围内。
14.1 冻结器件基准
| 参数 | 取值 |
|---|---|
| 阵列规模 | 256 × 256 |
| ADC | 6-bit,满量程 32,LSB = range / 2^bits = 0.5,严格 mid-tread |
| 饱和钳位 | 先 clip 到 ±16,再按对称码值 clamp 到 ±31 |
| 噪声 | 高斯 σ = 0.008;样本 z 随包下发,客户不复现 RNG |
| 温度 / 输入精度 | 45 ℃ / float32 |
14.2 三条链路
| op | 链路 | 定位的问题 |
|---|---|---|
pim_gemm_fp32 | 理想 FP32 GEMM | 计算单元本身 |
pim_gemm_adc6 | GEMM + 6-bit ADC | 量化口径 / LSB / 饱和钳位 |
pim_gemm_noise | GEMM + 高斯噪声 | 噪声注入时机与幅度 |
默认全选 36 条:3 条链路 × 4 种形状(64³ / 128³ / 128×256×64 非方阵 / 256³)
× 3 种激励分布(int8uniform 覆盖满量程与 ADC 截断边界、
normal σ = 0.5、int8sparse 约 3 成零,覆盖稀疏累加与零跳过)。
在页面上按链路筛选下载时,包内用例按选中的链路线性递减(每条链路 12 条)。
形状从「ADC 基本不饱和」到「K 撑满阵列、深度饱和」,非方阵用例同时覆盖
M/N/K 不对称与分块边界。
输入张量为 a、b,噪声用例额外带 noise_z,
全部 float32;输出名固定为 output。
同一形状、同一分布的三条链路共用同一组 a / b,但 noise_z
按形状 + 分布各自派生:36 条用例对应 12 组独立 GEMM 激励和 12 组独立噪声样本,
差异全部来自链路本身,便于把问题定位到 ADC 还是噪声环节。回传时仍须
按用例逐条计算——跨用例复用同一份产物会被输出重复检测判 FAIL。
14.3 契约公式
C0 = A · B # fp32,行主序,alpha=1 / beta=0 q = clamp(round_half_away(C0 / LSB), ±(2^(b-1)-1)) # 严格 mid-tread C = q · LSB # 仅 pim_gemm_adc6 C = C0 + σ · z # 仅 pim_gemm_noise,z 来自 inputs/<case>__noise_z.bin
14.4 判定:精度门限 + 器件契约检查
除通用 cos / rel-L2 门限(见 第 7 节)外,平台对 PIM 用例追加 结构性二值检查;它们不会被宽松的 rel-L2 门限掩盖(σ = 0.008 时漏加噪声的 rel-L2 仅约 1e-3,仍可能落在门限内):
adc_lsb_grid:输出必须落在 LSB = 0.5 的量化网格上(码值偏差 ≤ 1e-3); 使用 range/(2^bits−1) 这类错误 LSB 会被直接判 FAIL。adc_code_range:输出峰值不得超过 15.5(对称码值上限 31 × LSB), 缺少饱和钳位会被识别。noise_residual:‖(C − A·B) − σ·z‖ / ‖σ·z‖ ≤ 0.05; 漏加、时机错误或幅度错误都会被识别。
14.5 下载与提交
curl -s -o pim.zip -H "Authorization: Bearer $DBHOO_TOKEN" \ "$DBHOO_API/package?suite=pim&ops=pim_gemm_adc6,pim_gemm_noise"
与其他套件一致:按次派生(a / b / noise_z 随
一次性挑战码重新生成)、盲测包不含 expected/、提交同样走
POST /check。报告会额外渲染只读的器件参数卡片与逐用例器件契约检查结果。