第 1 步:3FS 是什么?它的目标是什么?
3FS(Fire-Flyer File System)是 DeepSeek 开发的一个分布式文件系统,专门为人工智能(AI)工作负载设计,比如大模型的训练和推理。你可能用过像 ext4 这样的本地文件系统,或者像 HDFS 这样的分布式文件系统,但 3FS 不同,它的目标是解决 AI 任务中的独特挑战:
- 高吞吐量:AI 训练需要快速读写海量数据,比如动辄几百 TB 的数据集。
- 随机访问模式:不像视频流这种顺序读取,AI 训练中数据加载可能是跳跃式的(比如随机取样),这对文件系统性能要求很高。
- 分布式环境:大模型训练通常在几十甚至上百个节点上运行,文件系统必须支持这种规模。
- 一致性:多个节点同时读写数据时,不能出现数据不一致的情况。
传统的文件系统可能在这些场景下表现不佳,比如 HDFS 更适合顺序读写,而本地文件系统无法扩展到分布式集群。3FS 就是为了填补这个空白诞生的,它利用现代硬件(如 SSD 和 RDMA 网络)来提供高性能支持。
小结:3FS 是一个为 AI 量身定制的分布式文件系统,目标是让数据访问更快、更灵活、更可靠。你可以把它想象成 AI 训练和推理的“数据高速公路”。
第 2 步:3FS 的架构是怎么设计的?
它采用了一种叫做解耦架构(disaggregated architecture)的设计。简单来说,就是把存储和计算分开,而不是像传统系统那样紧密绑定(比如每个节点用本地磁盘)。
为什么解耦很重要?
在分布式 AI 训练中,计算节点(运行模型的地方)和存储节点(存数据的地方)可能不在同一个物理位置。如果强行要求数据和计算绑定(即数据局部性),会限制灵活性。3FS 的解耦设计让任何计算节点都可以高效访问存储资源,不用关心数据具体在哪里。
主要组件概览
3FS 的架构可以大致分为以下几个部分:
-
集群管理器(Cluster Manager)
- 作用:管理集群的节点变动(比如有新节点加入或退出),并把配置信息分发给其他服务和客户端。
- 特点:支持多个集群管理器部署,实现高可用性,其中一个是主节点。
-
元数据服务(Metadata Services)
- 作用:管理文件系统的元数据,比如文件名、目录结构、权限等。
- 特点:这些服务是无状态的,背后依赖一个事务型的键值存储(比如 FoundationDB),保证元数据操作的一致性和可靠性。
-
存储服务(Storage Services)
- 作用:存储实际的文件数据。
- 特点:文件会被分成固定大小的块(chunks),这些块会复制到多个 SSD 上,既保证可靠性(防止数据丢失),又提升性能(支持并行读取)。
-
客户端(Clients)
-
作用:应用程序通过客户端与 3FS 交互。
-
类型:
- FUSE 客户端:基于用户空间文件系统(FUSE),方便集成到现有应用。
- 原生客户端:为性能敏感的应用提供更直接的访问方式。
-
小结:3FS 的解耦架构让存储变成一个共享资源池,计算节点可以随时从中获取数据。这种设计非常适合分布式 AI 任务,因为它不强求数据局部性,同时保持了高扩展性。
第 3 步:一致性是怎么保证的?
在分布式系统中,多个节点同时读写数据时,保持数据一致性是个大问题。3FS 使用了一种叫做 CRAQ(Chain Replication with Apportioned Queries) 的技术来实现强一致性。
CRAQ 是什么?
- 链式复制(Chain Replication):数据会复制到一串存储节点上(像一个链条)。写操作从链的头部开始,逐步同步到尾部;读操作可以从链上的某个节点读取,具体取决于一致性需求。
- 分配查询(Apportioned Queries):读请求可以分散到链上的不同节点,提升读取性能,但不会破坏一致性。
为什么用 CRAQ?
AI 任务中,数据一致性非常重要。比如在训练时,所有节点必须基于同一版本的数据集,否则模型可能会学到错误的东西。CRAQ 保证了强一致性(即读到的永远是最新数据),同时尽量优化读取性能。
小结:通过 CRAQ,3FS 让开发者不用担心数据不一致的问题,这对分布式应用的开发是个巨大的简化。
第 4 步:文件系统接口和元数据管理
3FS 的一个亮点是它提供了一个文件系统接口,这对程序员来说很友好。你可以用类似 open、read、write 这样的标准操作来访问 3FS,就像操作本地文件系统一样。
元数据怎么处理?
- 存储位置:所有元数据(比如文件路径、属性)都存在一个事务型键值存储中(比如 FoundationDB)。
- 无状态设计:元数据服务本身不保存任何状态,所有的状态都在键值存储里。这样元数据服务可以随时扩展或重启,不影响系统运行。
为什么这样设计?
- 熟悉感:文件系统接口是程序员最熟悉的工具之一,无需学习新 API。
- 原子性:事务型键值存储保证元数据操作是原子的,避免并发问题。
小结:3FS 用文件系统接口降低了使用门槛,同时用键值存储保证了元数据的高效和一致性。
第 5 步:数据存储和性能优化初探
数据是怎么存储的?
- 文件被分成固定大小的块(chunks),比如 64MB 或 128MB。
- 每个块会复制到多个存储节点(通常是 SSD),实现冗余和高可用。
性能优化点
- 随机访问效率
AI 训练中,数据访问往往是随机的(比如取一个批次的样本)。3FS 针对这种模式做了优化,确保即使是跳跃式访问也能保持高性能。 - 无需预取或洗牌
传统 AI 训练中,数据加载器可能需要预取(prefetch)或洗牌(shuffle)数据来优化性能。3FS 的随机访问能力强到可以让应用直接访问所需数据,省去这些额外步骤。 - 高吞吐量检查点
大模型训练需要定期保存检查点(checkpoint),3FS 支持并行检查点写入,多个节点可以同时保存状态,不拖慢训练。
性能案例:在一个测试中,25 个存储节点和 50 个计算节点组成的集群,3FS 在排序 110.5 TiB 数据时达到了 3.66 TiB/min 的平均吞吐量。这说明它的性能非常强悍。
小结:3FS 通过分块存储、随机访问优化和并行处理,确保了 AI 任务中的数据访问既快又灵活。
第 6 步:利用现代硬件
3FS 的性能离不开它对现代硬件的支持:
- SSD:相比传统硬盘,SSD 的随机访问性能和吞吐量更高。3FS 充分利用 SSD 的带宽。
- RDMA 网络:RDMA(远程直接内存访问)可以在节点间高速传输数据,绕过 CPU,减少延迟。3FS 用它来加速数据移动。
性能案例:在一个有 180 个存储节点的集群中,3FS 的聚合读取吞吐量达到 6.6 TiB/s,这得益于硬件的支持。
小结:3FS 不只是软件层面的优化,它和硬件紧密结合,榨取出每一分性能。
第 7 步:客户端和应用集成
3FS 提供了两种客户端,让应用可以方便接入:
-
FUSE 客户端
- 用 FUSE(用户空间文件系统)实现,应用可以像挂载普通文件系统一样使用 3FS。
- 优点:简单易用;缺点:用户空间有一定性能开销。
-
原生客户端
- 为性能敏感的应用设计,直接与 3FS 交互,效率更高。
小结:FUSE 客户端适合快速上手,原生客户端适合追求极致性能的应用。
第 8 步:代码探索建议
如果看源码,这里是一些入手点:
- 元数据服务:看看它怎么和键值存储交互,理解文件系统语义的实现。
- 存储服务:研究数据分块和复制的逻辑,找到 chunks 是怎么分布的。
- 客户端代码:对比 FUSE 和原生客户端的实现,看看性能优化的差异。
建议:从集群管理器或元数据服务入手,逐步深入到存储和客户端部分。