Security
Verifiable inference
Teacher-forced logprob spot-checks catch model substitution (serving a smaller model or a more aggressive quant while billing for the listed artifact) and logit biasing. They are not a TEE, not a bit-exact replay, and not a proof that the host never saw the prompt.
What is proven
On a sampled slice of public jobs (~2 %):
- The serving host returned per-token logprobs (top-1 + chosen-token logprob) with
POST /v1/host/jobs/:id/complete. - A different verifier host (not the same account, not a shared pool) re-scored the produced token ids with a teacher-forced prefill (
n_predict: 0+logprobs/n_probs). - At K random positions, KL / top-1 agreement / chosen-token |Δ| sit inside the published tolerance for
(artifact, quant, backend)inworkers/src/verify-tolerance.json. - Same-backend top-1 agreement is calibrated to ≥ 99 %. A substituted model or a biased sampler fails those tolerances (see fixtures in
workers/src/verify.test.ts).
A pass means: this job is statistically consistent with the listed artifact on that backend, not that every token was honest.
What is not proven
- Bit-exact match across Metal / CUDA / ROCm / Vulkan / CPU. Numerical kernels differ; tolerances are statistical and published.
- Jobs that never returned logprobs. Those are marked
unverifiableand the host is dropped from the public tier (pool and self traffic keep working). - Prompt or response contents. Logprobs are sealed like job payloads (R2 key
logprobs/{job_id}). Coordinators never log prompt/response text; verifiers receive token ids only. - That the host cannot cheat only when unobserved. T103 (commit-reveal) closes that gap; T102 samples after completion.
- Private-pool jobs. Sampling is public-only so tenant isolation is unchanged.
- Hardware attestation or a confidential VM. EDR / blessed-build trust is a separate tier (T20 / T94).
Pipeline
- Host
completeincludeslogprobs[]. Missing or wrong-length arrays mark the jobunverifiableand sethosts.unverifiable(public-ineligible via the existing T25isPublicEligiblegate). Completion never crashes. - Cron samples ~2 % of eligible public jobs with a sealed blob.
neuronpool serve --verifierregisters atPOST /v1/host/verifierand pullsPOST /v1/host/verify/lease.- Comparison uses
applyEvent(..., "mismatch")twice (−20) on fail; a second mismatch quarantines (T25 math is unchanged). Verifiers are paidverify_payat the prefill (input) token rate, capped byVERIFY_BUDGET_BPS(default 50 = 0.5 % of gross). - Ops:
GET /ops/verifyandGET /v1/ops/verify(OPS_KEY). Counts only.
Calibrate with npx tsx scripts/calibrate-verify.ts.