Baseten 推出 BDN Sealed Volumes:模型数据一次发布,随处挂载
Baseten 发布 BDN Sealed Volumes,可将只读模型数据发布一次并以 digest 固定版本,在任意部署中挂载。它支持从 Hugging Face、S3、GCS 等源同步,按内容哈希分块上传,仅传输变更部分,部署启动无需下载步骤。适用于模型权重、LoRA 适配器、TensorRT-LLM 引擎和嵌入索引等运行时只读文件。
Baseten 工程博客·2026-10-27 05:23· 1 小时前AI 评分47
BDN Sealed Volumes:发布一次,随处挂载
AI 导读
Baseten 发布 BDN Sealed Volumes,可将只读模型数据发布一次并以 digest 固定版本,在任意部署中挂载。它支持从 Hugging Face、S3、GCS 等源同步,按内容哈希分块上传,仅传输变更部分,部署启动无需下载步骤。适用于模型权重、LoRA 适配器、TensorRT-LLM 引擎和嵌入索引等运行时只读文件。
正文 · 原文
当模型文件没有单一可信来源时,数据就会偏离其源头。
假设你微调了一个模型,然后把检查点保存到云存储。接着有人把副本下载到自己的笔记本上测试,又把它上传到别处以便提供服务,而每个部署——例如预发布、生产、测试——都有自己的配置文件指向这个检查点。当有人固定到另一个修订版本时,直到输出出现差异才会有人注意到。
同样的问题也适用于 LoRA 适配器、向量索引、分词器、嵌入索引、查找表,以及任何模型或部署产物。十年前,容器镜像为代码解决了这个问题:构建一次,得到一个 digest,然后在任何地方运行该 digest。我们发布 BDN Sealed Volumes,正是要为模型数据做同样的事,帮助客户在迭代过程中保持数据一致。
什么是 Sealed Volume?
Sealed Volumes 让你将任意只读数据发布一次,并挂载到任意部署中。推送一个目录,或同步 Hugging Face 仓库、存储桶或训练检查点,BDN 就会将结果封存为一个带 digest 的不可变版本。在你的 config.yaml 中引用该 digest,每个副本都会流式读取完全相同的数据,无需手动下载任何内容。
卷具体来说是一组有名称、有版本的文件,由 Baseten Delivery Network (BDN) 交付给你的部署。卷存在于命名空间中,例如 weights,并包含一系列版本。当 baseten volume push 或 baseten volume sync 完成时,BDN 会将文件提交为新版本并封存。封存的版本永不改变,BDN 通过其内容的 digest 来标识它:
bdn:weights/qwen3-8b@b3:9f3c…推送时可以使用 --tag 参数,为特定版本指定一个可变名称(这是唯一可变的部分)。例如,使用 --tag prod 推送会将 prod 指向新版本;因此,虽然 bdn:weights/qwen3-8b:prod 是人们可读的名称,但部署应固定的是 digest。如果你用过容器镜像仓库,这与标签和镜像 digest 之间的区分相同,存在的原因也相同。
由于 digest 位于你的配置文件中,版本之间的不匹配会出现在 diff 中。
✕
一个卷包含三个封存版本。“prod”标签指向第二个版本,通过推送或标签命令移动到这里,两个部署都固定了它的 digest。
为什么使用 Sealed Volumes?
封存卷是在其之上构建时保持数据一致的关键。因为它们是封存的:
每个副本提供相同的字节:封存的版本永不改变,引用它的每个部署都以只读方式挂载相同的文件,因此每个副本流式读取相同的字节。固定 digest 意味着后续推送无法改变此部署挂载的内容。要回滚,只需将
config.yaml指向更早的 digest。更新只上传变更部分: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 secret,对于 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 快速冷启动的同一层)会以网络线速将其返回。
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 或更高版本。然后运行快速入门,它会在约五分钟内发布一个目录、挂载它并部署一个模型。管理和同步页面涵盖了版本、回滚和所有源类型。
Sealed Volumes 是 BDN Fabric 的第一个面向用户的原语,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。
来源:Baseten 工程博客 · baseten.co
来源:RadarAI · aihot.news