DeepSeek开源周第五天:3FS并行文件系统,榨干SSD带宽

文章转载自「新智元」
最后一天,DeepSeek开源了全生命周期数据访问引擎Fire-Flyer File System(3FS),以及基于3FS的数据处理框架Smallpond。

3FS(萤火虫文件系统)是一个充分利用现代SSD和RDMA网络带宽的并行文件系统,其特点是:

  • 在180节点集群中实现了6.6 TiB/s的总读取吞吐量
  • 在25节点集群的GraySort基准测试中达到了3.66 TiB/min 的吞吐量
  • 每个客户端节点的KVCache查询峰值吞吐量超过40+ GiB/s
  • 采用分离式架构,确保了强一致性
  • 全面支持V3/R1的训练数据预处理、数据集加载、检查点保存/重载、嵌入向量搜索和KVCache查询推理

Smallpond是轻量级的数据处理框架,其特点是:

  • 基于DuckDB的高性能数据处理
  • 可扩展性,能够处理PB级别数据集
  • 无需持续运行的服务,操作简便

3FS和Smallpond两大开源项目,正在为AI数据处理设立新的标准——超快的处理速度和无缝集成。

让许多人惊叹不已的是,DeepSeek竟自己编写了分布式文件系统。
它的成功背后强大得理念,便是将小事做到极致。这种精神,体现了车库黑客的精髓。
Founder Park 正在搭建开发者社群,邀请积极尝试、测试新模型、新技术的开发者、创业者们加入,请扫码详细填写你的产品/项目信息,通过审核后工作人员会拉你入群~
进群之后,你有机会得到:
  • 高浓度的主流模型(如 DeepSeek 等)开发交流;

  • 资源对接,与 API、云厂商、模型厂商直接交流反馈的机会;

  • 好用、有趣的产品/案例,Founder Park 会主动做宣传。


01 

3FS文件系统

The Fire-Flyer File System(3FS)专为应对人工智能训练和推理任务挑战而设计的高性能分布式文件系统。

项目链接:https://github.com/deepseek-ai/3FS

它采用现代固态硬盘(SSD)和远程直接内存访问(RDMA)网络技术,构建了共享存储层,极大简化了分布式应用的开发过程。

核心优势

  • 性能与易用性
    • 分布式架构:该系统整合了数千个SSD的高吞吐量和数百个存储节点的网络带宽,使得应用程序能够无视位置差异,高效访问存储资源。
    • 强一致性保证:通过采用链式复制与分配查询(CRAQ)技术,确保了数据的一致性,使得应用程序代码更加简洁易懂。
    • 标准文件接口:系统提供了基于事务性键值存储(如FoundationDB)的无状态元数据服务,使用的文件接口通用且易于上手,无需学习新的存储API。
  • 多样化工作负载支持
    • 数据准备:系统有效地将数据分析管道的输出组织成分层目录结构,并高效管理大量的中间数据。
    • 数据加载优化:通过支持计算节点间对训练样本的随机访问,无需进行数据预取或洗牌操作,提升了数据处理效率。
    • 高效检查点支持:为大规模训练任务提供高吞吐量的并行检查点功能。
    • KVCache推理加速:提供了一种成本效益高的DRAM缓存替代方案,具有高吞吐量和更大的存储容量,适用于推理任务。

性能

1. 最大吞吐量

下图展示了一个大型3FS集群在执行读压力测试时的吞吐量表现。

该集群包含180个存储节点,每个节点均配置有2张200Gbps的IB网卡和16块14TiB的NVMe固态硬盘。

测试中使用了约500个客户端节点,每个节点配备1张200Gbps的IB网卡。

在存在训练任务背景流量的情况下,集群的总读取吞吐量达到了约6.6TiB/s。

2. GraySort

采用GraySort基准测试,评估smallpond在处理大规模数据集时的排序能力。

实现采用了两阶段的处理方法:(1) 首先通过键的前缀位进行数据重排来分区数据,(2) 然后在各个分区内部进行排序。这两个阶段的数据读写都依赖于3FS。

测试所用的集群包括25个存储节点(每个节点有2个NUMA域,每个NUMA域运行1个存储服务,每个节点配备2×400Gbps网卡)和50个计算节点(每个节点有2个NUMA域,192个物理核心,2.2 TiB内存,每个节点配备1×200 Gbps网卡)。

在8,192个分区中排序110.5 TiB的数据,整个过程耗时30分钟14秒,平均吞吐量达到3.66TiB/min。

3. KVCache

KVCache是一种用于提升大型语言模型(LLM)推理效率的技术。

它通过缓存解码器层中先前token的键和值向量,避免了重复的计算过程。

顶部图表展示了所有KVCache客户端的读取吞吐量,其中既包括了峰值也包括了平均值,峰值吞吐量可达40GiB/s。

底部图表则展示了在同一时间段内,垃圾收集(GC)过程中操作次数的变化情况。

设计与实现

3FS系统由四个主要部分组成:集群管理器、元数据服务、存储服务和客户端。这些组件通过RDMA网络(InfiniBand或RoCE)相互连接。

元数据和存储服务定期向集群管理器发送心跳信号,以报告其状态。集群管理器负责处理集群成员的变更,并将集群的配置信息分发到其他服务和客户端。

系统中部署了多个集群管理器,其中一个被选为主管理器。当主管理器发生故障时,另一个管理器会被提升为主管理器。

集群配置信息通常存储在一个可靠的分布式协调服务中,例如ZooKeeper或etcd。在生产环境中,为了减少依赖性,我们使用与文件元数据相同的键值存储来保存集群配置。

文件元数据操作(如打开或创建文件/目录)被发送到元数据服务,由其实现文件系统的语义。由于文件元数据是存储在一个事务性键值存储(例如FoundationDB)中的,因此元数据服务是无状态的,客户端可以连接到任何元数据服务。

每个存储服务管理一些本地SSD,并提供一个块存储接口。

为了确保强一致性,存储服务实现了链式复制与分配查询(CRAQ)机制。CRAQ的写入全部读取任意的方法有助于充分利用SSD和RDMA网络的高吞吐量。在3FS中,一个文件被分割成相等大小的数据块,并在多个SSD上复制。

使用

使用以下命令从GitHub克隆3FS仓库到本地文件系统:

git clone https://github.com/deepseek-ai/3fs
克隆完成后,进入3FS目录,运行以下命令来更新并初始化所有子模块:
cd 3fsgit submodule update --init --recursive./patches/apply.sh
根据Ubuntu版本安装所需的依赖项:
# for Ubuntu 20.04.apt install cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libprocps-dev libdwarf-dev libunwind-dev \  libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev clang-format-14 clang-14 clang-tidy-14 lld-14 \  libgoogle-perftools-dev google-perftools libssl-dev ccache libclang-rt-14-dev gcc-10 g++-10 libboost1.71-all-dev
# for Ubuntu 22.04.apt install cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libprocps-dev libdwarf-dev libunwind-dev \ libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev clang-format-14 clang-14 clang-tidy-14 lld-14 \ libgoogle-perftools-dev google-perftools libssl-dev ccache gcc-12 g++-12 libboost-all-dev
确保安装了libfuse 3.16.1或更新版本,FoundationDB 7.1或更新版本,以及Rust工具链。

在构建目录中构建3FS:

cmake -S . -B build -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_C_COMPILER=clang-14 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=ONcmake --build build -j 32


02 

Smallpond:

基于3FS的数据处理框架

项目链接:https://github.com/deepseek-ai/smallpond


快速入门

目前smallpond支持从3.8到3.12的Python版本。

pip install smallpond

使用下列命令获取示例数据:
# Download example datawget https://duckdb.org/data/prices.parquet

轻松上手:

import smallpondsp = smallpond.init()
#加载数据df = sp.read_parquet("prices.parquet")
#数据处理df = df.repartition(3, hash_by="ticker")df = sp.partial_sql("SELECT ticker, min(price), max(price) FROM {0} GROUP BY ticker", df)
#保存结果df.write_parquet("output/")
#显示结果print(df.to_pandas())

文档

mallpond同时提供了高级和低级API。

注意:目前,smallpond提供了两种不同的API,分别用于数据流图的动态和静态构建。由于历史原因,这两种API使用了不同的调度器后端,并支持不同的配置选项。

  1. 高级API:目前使用Ray框架作为后端,支持数据流图的动态构建和执行。
  2. 低级API:使用内置调度器,仅支持静态数据流图的一次性执行。然而,它提供了更多的性能优化和更丰富的配置选项。正在努力将这两种API合并,以便在未来,可以使用统一的高级API,并在Ray框架和内置调度器之间自由选择。

下列链接提供入门教程、API参考、性能评估等更多内容。

链接:https://github.com/deepseek-ai/smallpond/blob/main/docs/source/api.rst

开发

pip install .[dev]
# run unit tests,单元测试pytest -v tests/test*.py
# build documentation,构建文档pip install .[docs]cd docsmake htmlpython -m http.server --directory build/html

性能

采用GraySort基准测试脚本,在一个由50个计算节点和25个运行3FS的存储节点组成的集群上,对smallpond进行了评估。

该基准测试在短短30分钟14秒内完成了对110.5TiB数据的排序,平均吞吐量达到了3.66 TiB/min。

pip install .[dev]
# run unit testspytest -v tests/test*.py
# build documentationpip install .[docs]cd docsmake htmlpython -m http.server --directory build/html
前几天的发布汇总:

DeepSeek开源周第四天:一口气开源3个项目,训练速度,GPU利用,优化经验

DeepSeek开源周第三天:DeepGEMM,通用矩阵乘法库,仅300行代码

DeepSeek开源周第二天:DeepEP通信库,解锁MoE模型通信瓶颈

DeepSeek开源周第一天:FlashMLA开源,解锁H800性能上限,提升存量GPU算力


图片

(文:Founder Park)

欢迎分享

发表评论