DeepSeek 的3FS

362 阅读8分钟

第 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 的架构可以大致分为以下几个部分:

  1. 集群管理器(Cluster Manager)

    • 作用:管理集群的节点变动(比如有新节点加入或退出),并把配置信息分发给其他服务和客户端。
    • 特点:支持多个集群管理器部署,实现高可用性,其中一个是主节点。
  2. 元数据服务(Metadata Services)

    • 作用:管理文件系统的元数据,比如文件名、目录结构、权限等。
    • 特点:这些服务是无状态的,背后依赖一个事务型的键值存储(比如 FoundationDB),保证元数据操作的一致性和可靠性。
  3. 存储服务(Storage Services)

    • 作用:存储实际的文件数据。
    • 特点:文件会被分成固定大小的块(chunks),这些块会复制到多个 SSD 上,既保证可靠性(防止数据丢失),又提升性能(支持并行读取)。
  4. 客户端(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),实现冗余和高可用。
性能优化点
  1. 随机访问效率
    AI 训练中,数据访问往往是随机的(比如取一个批次的样本)。3FS 针对这种模式做了优化,确保即使是跳跃式访问也能保持高性能。
  2. 无需预取或洗牌
    传统 AI 训练中,数据加载器可能需要预取(prefetch)或洗牌(shuffle)数据来优化性能。3FS 的随机访问能力强到可以让应用直接访问所需数据,省去这些额外步骤。
  3. 高吞吐量检查点
    大模型训练需要定期保存检查点(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 提供了两种客户端,让应用可以方便接入:
  1. FUSE 客户端

    • 用 FUSE(用户空间文件系统)实现,应用可以像挂载普通文件系统一样使用 3FS。
    • 优点:简单易用;缺点:用户空间有一定性能开销。
  2. 原生客户端

    • 为性能敏感的应用设计,直接与 3FS 交互,效率更高。

小结:FUSE 客户端适合快速上手,原生客户端适合追求极致性能的应用。


第 8 步:代码探索建议

如果看源码,这里是一些入手点:
  • 元数据服务:看看它怎么和键值存储交互,理解文件系统语义的实现。
  • 存储服务:研究数据分块和复制的逻辑,找到 chunks 是怎么分布的。
  • 客户端代码:对比 FUSE 和原生客户端的实现,看看性能优化的差异。

建议:从集群管理器或元数据服务入手,逐步深入到存储和客户端部分。