训练分片发布:内容摘要、集合完整性与原子切换
每个分片校验成功仍可能漏掉整个文件或让不同 worker 混读版本。本文用描述符、集合承诺、发布屏障和代际指针保证训练输入完整一致。
本文要点
- 主题聚焦:AI、大模型、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
一百个训练分片中有九十九个上传成功,每个成功文件的 hash 都正确,但前缀列表仍可能让任务直接开始;另一种失败是别名切换后,早启动的 worker 读旧 part-003,扩容 worker 却读到新文件。单文件 checksum 防不了集合缺失,也防不了一个 run 内混合两个 release。
浏览器模型资产完整性 保护 Wasm、权重与客户端缓存,RAG 索引签名发布 保护在线查询索引。本篇对象是 trainer 的输入分片:除了字节可信,还要证明样本集合、Schema、worker 屏障和断点恢复一致。
Descriptor 同时绑定存储字节与逻辑内容
每个 shard 采用 OCI descriptor 式的 mediaType + digest + size,并记录对象存储不可变 version。压缩文件的 digest 针对实际存储字节,解压后的 canonical record stream 另算 logicalDigest;否则重新压缩会被误判为同一对象,或压缩流正确但记录解码错误仍被放行。
{
"schema": "training.shard.release.v1",
"datasetSnapshot": "sha256:8a91...",
"tombstoneWatermark": 44192,
"benchmarkFence": 3908,
"recordSchema": "sha256:7d11...",
"shards": [{
"id": "shard-00017-of-00480",
"mediaType": "application/vnd.apache.parquet",
"digest": "sha256:31ef...",
"size": 8388192,
"objectVersion": "gen-9021",
"logicalDigest": "sha256:a41c...",
"records": 10000,
"tokens": 8194421,
"memberSetDigest": "sha256:51b0..."
}],
"totals": {"shards": 480, "records": 4800000},
"orderedMemberTupleRoot": "sha256:b88d..."
}
训练数据集快照 定义逻辑成员,shard release 必须证明所有成员恰好出现一次且内容未换。验证器解析每条记录,对 (sampleId, sourceId, sourceVersion, logicalContentDigest, split, schemaDigest) 规范化 tuple 建 multiset,与 snapshot 完整差分;根 manifest 的 orderedMemberTupleRoot 绑定该集合、tombstone 水位与 benchmark fence。missing、extra、duplicate、内容替换和 split 冲突均须为零。
Schema、序列化器、排序种子、分片函数、压缩参数和 key version 都进入根 manifest。训练数据 Schema 演进 的报告绑定同一 digest。验证端解密后检查逻辑摘要;key、AAD 或 reader 不匹配时拒绝发布。
写入 staging,验证后只切指针
writer 以摘要路径和 conditional create 写 staging,禁止覆盖。独立 verifier 从精确 object version 复算 size、存储/逻辑摘要、footer、计数和 tuple multiset。报告与 SLSA provenance 绑定根 digest,审批者不批准可变目录名。
发布、回滚、run 与 checkpoint 准入和 tombstone/benchmark fence 推进竞争同一线性 gate,同时比较当前与根的两类水位、零命中和 alias generation,再签发绑定 root/watermark/benchmark/generation 的 permit。任一 fence 推进立即关闭受影响 permit;CAS 重试同 digest 才幂等。不能靠复制文件模拟原子性。
协调器创建 run 时只解析一次活动指针,把精确根 digest 发给全部 worker。worker 验证对象并回报 (runId, rootDigest, shardDigest);所有 rank 同意同一 root 后才开始 step 0。扩缩容与恢复只改 assignment,不重读 alias。Kubernetes 模型权重分发 可借鉴缓存校验,但训练 shard 还需全局 tuple 证明。
主动制造半发布和串版
故障注入包括截断或交换 shard、同 ID 替换内容/sourceVersion/split、漏 descriptor、陈旧列表、旧缓存、Schema 混用、屏障超时和恢复误读新 alias。候选必须停在 STAGED/INVALID,或整个 run 在 step 0 前失败;替代 worker 不得读取另一版本。
指标按 release digest 汇总已验证 shard 比例、缺失/额外/重复成员、摘要失败、缓存损坏、屏障等待、worker root 不一致、读取吞吐和解压比。ready 探针只有在进程固定并验证根 manifest 后才成功,不把“对象存储可连接”当数据已就绪。训练日志保存 digest 和错误码,不记录样本文本。
上一份 release 保留到回滚窗结束。回滚以更高 generation 指向旧根;旧根的 tombstone 与 benchmark 水位都必须满足当前 gate,否则没有资格。已有 run 固定输入完成或取消新建,不能中途换 shard。原子发布要求字节、tuple 集合和所有 worker 指向同一受批 digest。
延伸阅读
Related