BDN 密封卷之于模型数据,正如容器镜像之于代码:一次发布,获得摘要,随处挂载。挂载只需数秒。
作者
Stephen DayGregory KofmanYun ZouRajesh Malireddy发布
2026年10月26日
分享
发布
2026年10月26日
BDN 旨在将任何内容(权重、容器镜像、训练检查点)分发到模型服务基础设施中。现在,BDN Sealed Volumes 让你可以一次发布任何只读数据,并在任意部署中挂载它。Sealed Volumes 现已随 Baseten CLI 1.1.0 或更新版本提供。
当模型文件没有单一可信来源时,数据就会偏离其源头。
假设你微调了一个模型,然后把检查点保存到云存储。接着有人下载一份副本到自己的笔记本电脑上测试,又把它上传到别处以便提供服务,而每个部署——例如预发布、生产环境和测试环境——都有各自的配置文件指向该检查点。当一个人把版本固定到另一个修订版时,没人会注意到,直到输出出现差异。
同样的问题也适用于 LoRA 适配器、向量索引、分词器、嵌入索引、查找表,以及任何模型或部署产物。容器镜像在十年前就为代码解决了这个问题:你构建一次,得到一个摘要,然后在任何地方运行该摘要。我们现在发布 BDN Sealed Volumes,为模型数据做同样的事,并帮助客户在多次迭代中保持数据一致。
什么是密封卷?
密封卷让你可以一次发布任何只读数据,并将其挂载到任何部署中。推送一个目录,或同步 Hugging Face 仓库、存储桶或训练检查点,BDN 就会将结果封存为一个带摘要的不可变版本。在你的 config.yaml中引用该摘要,每个副本都会流式接收完全相同的数据,无需手动下载任何内容。
卷具体来说是一组有名称、有版本的文件,由 Baseten Delivery Network (BDN) 交付到你的部署中。卷存在于命名空间中,例如 weights,并持有一系列版本。当 baseten volume push 或 baseten volume sync 完成后,BDN 会将文件提交为新版本并将其封存。已封存的版本永不改变,BDN 通过其内容的摘要来标识它:
bdn:weights/qwen3-8b@b3:9f3c…推送时可以使用 --tag 参数,为特定版本赋予一个可变名称(这是唯一可变的部分)。例如,使用 --tag prod 推送会将 prod 指向新版本;因此,虽然 bdn:weights/qwen3-8b:prod 是人们可以读取的名称,但部署应固定使用摘要。如果你用过容器镜像仓库,这与标签和镜像摘要之间的区分相同,存在的原因也相同。
由于你的摘要位于配置文件中,版本之间的不匹配会体现在 diff 中。
✕
一个卷,包含三个已封存的版本。“prod”标签指向版本二,通过推送或标签命令将其移到那里,两个部署都固定其摘要。为什么使用密封卷?
封存卷是在其基础上构建时保持数据一致性的关键。因为它们是密封的:
每个副本提供相同的字节: 已封存的版本永不改变,每个引用它的部署都以只读方式挂载相同的文件,因此每个副本流式传输相同的字节。固定摘要意味着后续推送无法改变此部署挂载的内容。要回滚,只需将
config.yaml指向更早的摘要。更新仅上传发生变化的内容: BDN 将文件拆分为块,并按内容哈希将每个块只存储一次,因此与上一个检查点共享大部分字节的新检查点只上传发生变化的块。文件以哈希为键,因此 BDN 从不传输它已持有的文件。这使得迭代上传(例如微调基础模型)变得快速。
部署启动时无需下载步骤: 由于密封卷会挂载到你选择的路径,
config.yaml因此容器一启动文件即可用。当你的模型读取这些文件时,字节会从 BDN 缓存层级 流式传入。启动时间不再取决于卷的大小。
如何用两条命令发布密封卷
对于 Hugging Face 上的模型,同步会作为 Baseten 上的持久后台任务运行;不会向你的机器下载任何内容。整个流程就是:
baseten volume sync start \
--source hf://Qwen/Qwen3-8B \
--dest bdn:weights/qwen3-8b:prod \
--include "*.safetensors" --include "*.json" \
--wait当任务报告 READY,它会打印密封版本的引用。将该引用复制到部署中:
model_name: qwen3-8b
resources:
accelerator: H100
bdn:
mounts:
- source: bdn:weights/qwen3-8b@b3:<digest>
path: /mnt/weights/qwen3-8b将你的服务器指向 /mnt/weights/qwen3-8b 并使用以下命令部署 baseten model push.
无需维护 weights 块,部署中也没有凭据。后续引用已镜像内容的部署只需进行元数据检查即可解析,而无需传输数据。
sync 对 Hugging Face、S3、GCS、Azure Blob、Cloudflare R2 和 CoreWeave 桶的工作方式相同。私有源需要 Baseten 密钥,而对于 S3 和 GCS,你可以完全跳过存储凭据,改用 OIDC 授予访问权限。若要改为发布本地目录,请使用:
baseten volume push ./dir bdn:weights/qwen3-8b --tag prodpush 并行上传分块,并跳过 BDN 已持有的任何分块。
更新版本与回滚
推送时使用 --tag prod 会将标签移动到新版本,而不发布任何内容:
baseten volume tag set --volume-ref bdn:weights/qwen3-8b@b3:<digest> --tag prod固定摘要的部署会继续提供旧版本,直到你更改 source 并重新部署。之后移动标签不会改变正在运行的副本所提供的内容,但新建和扩容的副本会挂载该标签的新目标。因此,挂载标签的部署在推送后可能同时提供两个版本。
要回滚,请从 baseten volume versions中选择更早的摘要,将其设置为 source,然后重新部署。已删除的版本可在 7 天内通过 baseten volume restore.
BDN 密封卷的用途不止于模型权重
模型读取但不会写入的任何内容都应放在卷中。部署在运行时读取的、应放入卷的常见文件包括:
适配器和子模型。 在单个基础模型上部署多个 LoRA 适配器,并在推理时在它们之间切换。每个适配器可以是自己的卷,而新适配器无需新镜像。
预构建引擎。 TensorRT-LLM 引擎或编译后的计算图体积大、特定于 GPU 且不可变。按 GPU 类型发布一次,并按摘要挂载,这样重新部署时无需重新构建。
索引和表。 这包括嵌入索引、词汇表文件、分词器配置、查找表和安全分类器。目前这些内容会被下载到
load(),或被内置到镜像中,但有了卷之后,它们会被版本化、在多个部署之间共享,并在启动时可用。评估与参考数据。 例如,部署用于自我评分的黄金集,或服务层渲染所用的提示模板。
编译缓存。 BDN 启动缓存是我们在卷上构建的第一个功能,它将副本编译后的内核和捕获的计算图发布为密封卷,并在该部署后续的每个副本中恢复它。它会显示在
baseten volume ls中,与你自行发布的卷并列。
其中每一项都是一个目录和一个单独的 baseten volume push。挂载多个卷就是在 bdn.mounts下增加更多条目,而挂载相同摘要的两个部署在每个缓存层级上共享完全相同的字节。
将一致性构建到从训练到部署的循环中
“复制问题”在模型训练方面最为严重:一个任务将检查点写入存储,然后为了提供服务,你需要下载权重、将它们上传到别处,并为每次部署编辑配置文件。
卷有助于阻止从训练到部署循环中的数据漂移。如果你在自己的集群上训练,一个带有 CLI 和 API 密钥的任务会在完成时发布自己的输出:
baseten volume push ./checkpoints/step-4000 bdn:weights/my-model --tag candidate另一方面,如果你在 Baseten 上训练,该任务的检查点已经同步到 Baseten 存储,然后检查点会从那里同步到卷中(无需管理凭据):
baseten volume sync start \
--source bt://my-project@job123/checkpoint-1 \
--dest bdn:weights/my-model:candidate \
--wait你自己存储桶中的检查点会从那里通过 s3://, gs://同步,或使用上述其他来源。
因为 push 和 sync 每次只上传发生变化的块,一个每几百步发布一次检查点的训练任务每次只移动模型的一小部分,而且每个版本都保持可寻址。对于这个循环中频率更高的版本——训练器每隔几分钟发布一次增量,rollout 集群实时应用这些增量——请参阅 我们如何为托管式 RL rollout 同步增量权重 (两种情况下 BDN 都是传输层)。
BDN Sealed Volumes 有多快?
Sealed Volumes 与 BDN 权重一样,通过相同的三层缓存读取:节点磁盘、集群内缓存和镜像源。区别在于, weights 块会在容器启动前拉取每个文件,因此启动时间会随模型大小增长。
相比之下,BDN Sealed Volume 可在数秒内挂载,模型从中读取的速度与从 weights 挂载读取的速度相同。这意味着拉取阶段从启动时间中消失了(其他一切不变)。数据以网络和磁盘允许的最快速度提供,并在技术栈的每一层避免不必要的获取。
同一个模型,既可以使用“weights”块,也可以使用 BDN Sealed Volume。拉取阶段变成了挂载,而加载模型阶段在两者中是相同的工作。惰性读取路径还使卷可以大于节点磁盘,因为节点只保留模型访问过的块,并驱逐那些可以再次获取的块。当模型读取一个已被驱逐的块时,集群内缓存(也就是帮助“让 BDN 冷启动变快”的同一层)会以网络线速将其返回。 块与 Sealed Volume 的未来如果你今天使用块进行部署,则无需更改任何内容。我们将自动把
部署迁移到 Sealed Volume,迁移会逐步推出,你这边无需更改配置。对于新的权重,我们鼓励你直接使用 Sealed Volume:将源同步到卷中并挂载它。以下是块和卷目前的对比:要迁移,请对 中的源运行同步,然后将结果挂载到相同的 。你的模型代码不会有任何变化。挂载是只读的;对于模型在运行时写入的文件,请使用 b10cache。开始使用要开始使用 BDN Sealed Volume,请升级 weights 块与 Sealed Volumes
如果你使用 weights 块进行部署,则无需更改任何内容。我们将自动把 weights 随着迁移逐步推出,部署将迁移到 Sealed Volumes,你这边无需更改任何配置。
对于新的权重,我们鼓励你直接使用 Sealed Volumes:将源同步到卷中并挂载它。
以下就是 weight 块与卷在今天的对比:
要迁移,请对源中的 运行同步, weights,然后将结果挂载到相同的 mount_location你的模型代码不会有任何变化。
挂载是只读的;对于模型在运行时写入的文件,请使用 b10cache.
开始使用
要开始使用 BDN Sealed Volumes,请将 Baseten CLI 升级到 1.1.0 或更新版本(brew upgrade baseten),如果你使用 Truss 部署,则将 Truss 升级到 0.18.30 或更新版本。 使用 Truss 部署然后运行“ 快速开始它会在约五分钟内发布一个目录、挂载它并部署一个模型。 管理 以及 同步 页面涵盖版本、回滚以及所有源类型。
Sealed Volumes 是 BDN Fabric(下一代 Baseten Delivery Network)首个面向用户的基础功能。如果你想详细讨论你的权重流水线,请联系 我们的工程师.
注意:截至本文最后更新日期,T4 或 L4 实例上不支持卷挂载。
致谢
非常感谢参与实现 BDN Sealed Volumes 的众多人员:Angie Montemayor、Xiaoqian Liu、Kamal Haddad、Ahmet Balkan、Amy Hu、Christine Wang、Shreya Ravi、Brian Broll、Sid Gupta、Chad Retz 和 Patrick R。
订阅我们的新闻通讯
及时了解模型性能、推理基础设施等最新动态。
$?/$