百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

DeepSeek第五天开源,3FS并行文件系统榨干SSD!6.6 TiB/s吞吐量

qiyuwang 2025-03-06 19:13 10 浏览 0 评论

编辑:编辑部 JHY

【新智元导读】DeepSeek最后一天,送上了3FS文件并行系统,以及数据处理框架Smallpond。五天开源连更,终于画上了完美的句号。


最后一天,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竟自己编写了分布式文件系统。

它的成功背后强大得理念,便是将小事做到极致。这种精神,体现了车库黑客的精髓。

左右滑动查看

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 3fs

git 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=ON
cmake --build build -j 32


Smallpond:基于3FS的数据处理框架


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

快速入门

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

pip install smallpond


使用下列命令获取示例数据:

# Download example data
wget https://duckdb.org/data/prices.parquet

轻松上手:

import smallpond
sp = 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 docs

make html

python -m http.server --directory build/html

性能

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

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

pip install .[dev]

# run unit tests
pytest -v tests/test*.py

# build documentation
pip install .[docs]
cd docs
make html
python -m http.server --directory build/html


连更五天,最新汇总


DeepSeek开源周,这么快就过去了。连更5天,次次都是小惊喜。

接下来,我们汇总了过去四天所有的开源项目,参见:

第一天:为英伟达Hopper GPU打造的高效MLA解码内核FlashMLA,5天项目GitHub星标唯一过10k的。

第二天:支持MoE训推的EP通信库DeepEP,GitHub斩获6.4k星。

第三天:支持稠密和MoE模型的FP8 GEMM计算库DeepGEMM,GitHub已达4.2k星。

第四天:优化并行策略——DualPipe、EPLB、V3/R1模型中的计算与通信重叠机制

相关推荐

在Word中分栏设置页码一页两个页码的技巧!

施老师:在正常情况下,Word文档中一页只会出现一个页码。但在某种情况下,比如说:用了分栏后,我们希望一页中出现两个页码,那应该如何实现呢?今天,就由宁双学好网施老师来为大家讲一下,利用域来实现一页两...

如何在关键时刻向上自荐(如何在关键时刻做出正确选择)

抓住机会,挺身而出有种时刻叫“关键时刻”,关键时刻,作为一个认为自己有能力的、训练有素的人,应该考虑挺身而出,甚至应该不考虑就挺身而出。...

WPS Word:跨页的文档表格,快速调整为一页。#Excel

如何快速将跨页的文档表格调整为一页?需要根据两种情况分别处理。如果表格所有行的行高相同,调整为一页的方法有两种。第一种方法是将光标移动到表格内,然后将鼠标移动到表格右下角的方框处,按住鼠标左键向上拖动...

word文档插入下一页分节符(word下一页分页符)

在word文档中,对文档页面进行分页是特别常见的操作,其中的下一页分节符也是用得比较多的,但是一些人不太清楚在哪里设置,也不知道它具体能实现的功能是什么。接下来看看如何在word文档中插入下一页分节符...

word文档如何设置某一页纸张的方向

word文档页面方向有横向和纵向,纵向是默认的纸张方向,有时我们需要将页面设置为横向,或只设置其中某一页方向,应该怎么操作呢?一起来看看下面的详细介绍第一步:...

word怎么单独设置一页为横向(word2019怎样设置单独一页为横向)

word里面其中一页可以改为横向的吗?经过实际操作发现是完全可以的。...

Word如何设置分栏,如何一页内容同时显示一栏和两栏

我们使用Word文档,有时需要用到两栏的排版,甚至一页内容同时包含一栏和两栏的排版,这种格式怎么设置呢?具体步骤如下:首先是两栏排版的设置,直接点击Word文件上方工具栏【布局】,选择【分栏】下面的【...

Word怎么分页?这三个方法可以帮到你

我们不仅可以利用Word编辑文档,还可以编辑文集呢。但是有时候会出现两个部分的文章长短不一,我们需要对文档进行分页处理。这样可以方便我们对文档进行其他操作。那么Word怎么分页呢?大家可以采用下面这...

Word内容稍超一页,如何优化至单页打印?

如何将两页纸的内容,缩到一页打印呢?有时候一页纸多一点内容,我们完全可以缩一下,放到一页来打印。...

[word] word 表格如何跨行显示表头、标题

word表格如何跨行显示表头、标题在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是,教你简单的方法操作设置Wo...

Word表格跨页如何续上表?(word如何让表格跨页不断掉)

长文档的表格跨页时,你会发现页末空白太多了,这时要怎么调整?选中整张表格,右击【表格属性】,点击【行】选项,之后勾选【允许跨页断行】,点击确定即可解决空白问题。...

Word怎么连续自动生成页码,操作步骤来了!

Word怎么连续自动生成页码,操作步骤来了!...

word文档怎么把两页合并成一页内容?教你4种方法

word怎么把两页合并成一页?word怎么把两页合并成一页?用四种方法演示一下。·方法一:把这一个文档合并成一页,按ctrl加a全选文档,然后右键点击段落,弹出的界面行距改成固定值,磅值可以改小一点,...

如何将Word中的一页的纸张方向设置为横向?这里提供详细步骤

默认情况下,MicrosoftWord将页面定向为纵向视图。虽然这在大多数情况下都很好,但你可能拥有在横向视图中看起来更好的页面或页面组。以下是实现这一目标的两种方法。无论使用哪种方法,请注意,如果...

Word横竖混排你会玩吗?(word横排竖排混合)

我们在用Word排版的时候,一般都是竖版格式,但偶尔会需要到一些特殊的版式要求,比如文档中插入的一个表格,横向的内容比较多,这时就需要用到横版,否则表格显示不全。这种横竖版混排的要求,在Word20...

取消回复欢迎 发表评论: