验证ML节点部署
仓库gonka附带一个名为mlnode-validate的代理技能,用于将已部署的ML节点与特定模型的预计算诚实PoC向量进行验证。该技能完全内置于仓库中(无外部代码,无回调接收器)。
该技能即为契约;本页仅为指引。唯一真实来源是skills/mlnode-validate/SKILL.md——包含必需/可选输入、部署配置规则、黄金参考列表、通过标准、失败模式及报告模板。
该技能由mlnode/packages/benchmarks/scripts/poc_validation/下的两个Python脚本实现:
validate.py——主入口点(下载→部署→吞吐量→验证)。make_artifact.py——从已服务目标模型的可信MLNode中生成新工件。当请求的模型无已提交的黄金参考时使用。
脚本的作用
validate.py对运行中的ML节点执行四个阶段,并在进展过程中打印[i/4]标题:
[1/4] download——确保请求的HuggingFace仓库已缓存在ML节点上。使用POST /api/v1/models/status,然后POST /api/v1/models/download并轮询/models/status直至DOWNLOADED。[2/4] deploy——若vLLM尚未运行则启动它。POST /api/v1/inference/up/async {model, dtype, additional_args},轮询GET /api/v1/inference/up/status直至is_running == true。[3/4] throughput——测量全系统PoC吞吐量。POST /api/v1/inference/pow/init/generate(来自参考的参数);代理将请求分发至每个健康的vLLM副本,使用不同的group_id。每--sample-interval采样GET /api/v1/inference/pow/status持续--measure-seconds。报告每个副本的nonces_per_second及副本总和,然后POST /api/v1/inference/pow/stop。[4/4] validate——使用POST /api/v1/inference/pow/generate、wait=true、nonces=[...]、validation.artifacts=<artifact>及完整的stat_test块(dist_threshold、p_mismatch、fraud_threshold)。ML节点重新计算相同的nonce,执行每nonce的L2不匹配测试,然后执行二项式欺诈测试。返回{n_total, n_mismatch, mismatch_nonces, p_value, fraud_detected}。
每个阶段均可通过--skip-download、--skip-deploy、--skip-throughput、--skip-validate跳过。
四个阶段完成后,脚本将三个文件写入mlnode/packages/benchmarks/data/experiments/<exp_name>_<ts>/:
validate_config.json——仅包含解析后的输入(ML节点URL、模型、参考路径+元数据、部署配置、PoC参数、带出处的stat_test、原始CLI参数)。validate_report.json——完整结构化报告(配置+各阶段结果+结论)。这是审计追踪。validate_report.txt——简明易读的摘要;横幅后第一行是verdict: <PASS|FAIL|...>。
必需输入
根据SKILL.md → 必需输入,调用方必须提供以下两项:
MLNODE_URL——待测ML节点的基础URL(例如http://1.2.3.4:8080)。无默认值。MODEL——目标HuggingFace模型ID,采用完整org/repo格式(例如MiniMaxAI/MiniMax-M2.7、deepseek-ai/DeepSeek-V4-Flash-0731、zai-org/GLM-5.3-Flash)。无默认值。
部署配置:来自调用方,而非黄金参考
这是来自SKILL.md → 部署配置:来自调用方,而非黄金参考的关键规则:
黄金工件仅提供向量、PoC参数和stat_test——除此之外无其他内容。其additional_args字段记录生成向量的服务器所使用的标志,仅作参考。不得将其用作不同服务器的部署默认值。
调用方传递与待测服务器GPU类别匹配的部署配置(通常为deploy/join/node-config-<model>-<gpu>.json)。标准流程是生成一个自定义参考,结合黄金的向量+参数+stat_test与调用方的args,然后通过--reference传递:
import json, pathlib
src = pathlib.Path('mlnode/packages/benchmarks/scripts/poc_validation/artifacts/<golden>.json')
node_cfg = json.loads(pathlib.Path('deploy/join/node-config-<model>-<gpu>.json').read_text())
d = json.loads(src.read_text())
d['additional_args'] = list(node_cfg[0]['models']['<HF model id>']['args'])
d['source'] = f"vectors from {src.name}; additional_args from deploy/join/node-config-<model>-<gpu>.json"
dst = src.with_name(src.stem + '-<gpu>.json')
dst.write_text(json.dumps(d, indent=2))
python3 mlnode/packages/benchmarks/scripts/poc_validation/validate.py \
--mlnode-url "$MLNODE_URL" --model "$MODEL" --reference <dst>
该自定义参考是按部署生成的,不提交。仅当待测服务器与黄金参考的记录服务器属于相同硬件类别时,才可直接传递黄金参考(无需生成)——这是例外,而非默认。
CLI标志--tp-size、--max-model-len、--extra-arg、--dtype用于在参考基础上进行小范围临时调整,但无法移除参考已包含的标志——因此当部署形态与黄金参考不同时,它们不能替代生成自定义参考。
可用的黄金参考
根据SKILL.md → 可用黄金参考,仓库在mlnode/packages/benchmarks/scripts/poc_validation/artifacts/下提供以下内容。自动查找<sanitized model>.json会为每个模型选择默认文件名;超出默认的变体需显式指定--reference <path>。
"记录上下文"列描述了生成向量的服务器(仅作参考——这些标志不作为您验证的部署默认值;参见上文部署配置:来自调用方,而非黄金参考)。
Note
Qwen/Qwen3-0.6B是本地开发测试用例。Qwen/Qwen3-235B-A22B-Instruct-2507-FP8已在提案78(第308个周期)中从主网移除。这些工件保留在仓库中用于历史或本地检查。加入主网的主机应验证其实际部署的模型。
| 模型 | 文件名 | 向量 | 记录上下文 |
|---|---|---|---|
Qwen/Qwen3-0.6B |
qwen-qwen3-0.6b.json |
32 | 本地开发/单GPU |
Qwen/Qwen3-235B-A22B-Instruct-2507-FP8(默认查找) |
qwen-qwen3-235b-a22b-instruct-2507-fp8.json |
32 | tp=4, FlashInfer baseline. Quick smoke test. |
Qwen/Qwen3-235B-A22B-Instruct-2507-FP8 (extended) |
qwen-qwen3-235b-a22b-instruct-2507-fp8-deepgemm.json |
2000 | tp=2, DeepGEMM MoE backend (VLLM_USE_DEEP_GEMM=1, VLLM_MOE_USE_DEEP_GEMM=1), recorded on 4xB200. Pass with --reference. |
moonshotai/Kimi-K2.6 (default lookup) |
moonshotai-kimi-k2.6.json |
200 | Historical. tp=4 + expert-parallel, FLASHINFER_MLA attention, gpu-mem 0.95, max-model-len 240000, kimi_k2 tool/reasoning parsers, --disable-custom-all-reduce, --trust-remote-code. Recorded on 4xB200. Kimi is not a PoC model after proposal 101. |
deepseek-ai/DeepSeek-V4-Flash-0731 (default lookup) |
deepseek-ai-deepseek-v4-flash-0731.json |
1000 | tp=1, fp8 kv-cache, max-model-len 400000, --tokenizer-mode deepseek_v4, deepseek_v4 tool/reasoning parsers, --trust-remote-code. Recorded on 1xB300 (vLLM 0.25.1). On the vllm-0.25.1-upgrade branch. |
zai-org/GLM-5.3-Flash (default lookup) |
zai-org-glm-5.3-flash.json |
— | tp=4, fp8 kv-cache, --block-size 2304, glm47 / glm45 parsers, --trust-remote-code. Recorded on 4×H200 (vLLM 0.28 / MLNode 3.1.0). On the feat/glm-5-3-flash-release branch (gonka-ai/gonka#1734). |
For Qwen3-235B the same model id has multiple references, exercising different code paths (tp-size, MoE backend) — see SKILL.md for the recommended multi-run pattern. That model is not on mainnet; use this only if you are reproducing a historical or local validation.
Ready-made deploy configs in deploy/join/
The repo ships node-config-*.json files matching common GPU classes. DeepSeek configs and MLNode 3.0.16 are on the vllm-0.25.1-upgrade branch:
deploy/join/node-config-qwen235B-B200.json(historical Qwen3-235B layout; that model is not on mainnet)deploy/join/node-config-kimik26-B200.json(Kimi K2.6)deploy/join/node-config-kimik26-H200.json(Kimi K2.6)deploy/join/node-config-minimaxm27-A100.jsondeploy/join/node-config-minimaxm27-H100.jsondeploy/join/node-config-minimaxm27-H200.jsondeploy/join/node-config-minimaxm27-B200.jsondeploy/join/node-config-minimaxm27-B300.jsondeploy/join/node-config-deepseekv4flash0731-H100.jsondeploy/join/node-config-deepseekv4flash0731-H200.jsondeploy/join/node-config-deepseekv4flash0731-B200.jsondeploy/join/node-config-deepseekv4flash0731-B300.jsondeploy/join/node-config-deepseekv4flash0731-B200-nvfp4.jsondeploy/join/node-config-deepseekv4flash0731-B300-nvfp4.jsondeploy/join/node-config-glm53flash-H100.jsondeploy/join/node-config-glm53flash-H200.jsondeploy/join/node-config-glm53flash-8xH200.jsondeploy/join/node-config-glm53flash-B200.jsondeploy/join/node-config-glm53flash-B300.json
GLM configs and MLNode 3.1.0 are on the feat/glm-5-3-flash-release branch.
These configs are also reproduced inline in the Host Quickstart.
Pass criteria
- Clean PASS —
validation.passed == true,validation.has_mismatches == false,n_mismatch == 0,fraud_detected == false. - PASS,差异在统计测试容差范围内 —
validation.passed == true,validation.has_mismatches == true,n_mismatch > 0,fraud_detected == false。欺诈测试允许每个p_mismatch最多出现几个差异。这仍然是 PASS。 - FAIL —
validation.passed == false,fraud_detected == true.
退出码:
0— PASS(无论是否有容差内的差异),或验证阶段被跳过。2— 验证已运行且欺诈测试触发。1— 验证运行前发生严重错误(下载失败、部署超时等)。
当请求的模型不存在工件时
validate.py 在 mlnode/packages/benchmarks/scripts/poc_validation/artifacts/ 下查找工件。如果 MODEL 的文件缺失,脚本将退出 1 并打印预期的文件名以及用于针对已服务该模型的可信 MLNode 生成该文件的精确 make_artifact.py 命令。代理不得生成向量或替换为其他模型 — 请参阅 SKILL.md → 当请求的模型不存在工件时。
相关指南
- 主机快速入门 — 每种支持的模型和 GPU 类型的初始部署和
node-config.json示例。 - ML 节点管理 — 通过管理 API 添加/更新/启用/禁用 ML 节点。
- 基准测试以选择 LLM 的最优部署配置 — 通过
compressa-perf进行性能调优(TP / PP)。 - Kimi K2.6 启动 / MiniMax-M2.7 启动 / DeepSeek V4 Flash 启动 / GLM-5.3-Flash 启动 — 链上启动时间线和
PoCIntent/ 委托交易。