DeepSeek 开源记-第5天-Fire-Flyer-File System(3FS)

DeepSeek 开源工作第5天

🚀 Day 5 of #OpenSourceWeek: 3FS, Thruster for All DeepSeek Data Access

Fire-Flyer File System (3FS) - a parallel file system that utilizes the full bandwidth of modern SSDs and RDMA networks.

⚡ 6.6 TiB/s aggregate read throughput in a 180-node cluster
⚡ 3.66 TiB/min throughput on GraySort benchmark in a 25-node cluster
⚡ 40+ GiB/s peak throughput per client node for KVCache lookup
🧬 Disaggregated architecture with strong consistency semantics
✅ Training data preprocessing, dataset loading, checkpoint saving/reloading, embedding vector search & KVCache lookups for inference in V3/R1

📥 3FS → https://github.com/deepseek-ai/3FS
⛲ Smallpond - data processing framework on 3FS → https://github.com/deepseek-ai/smallpond


🚀 第5天 #OpenSourceWeek:3FS,面向所有DeepSeek数据访问的推进器

Fire-Flyer文件系统(3FS)-一种并行文件系统,利用现代SSD和RDMA网络的全部带宽。

⚡ 6.6 TiB/s聚合180节点集群中的读取吞吐量
⚡ 25节点集群中GraySort基准测试的3.66 TiB/min吞吐量
⚡ 用于KVCache查找的每个客户端节点的峰值吞吐量超过40 GiB/s
🧬 具有强一致性语义学的分解架构
✅ 在V3/R1中训练数据预处理、数据集加载、检查点保存/重新加载、嵌入向量搜索和KVCache查找以进行推理

📥 3FS→github.com/deepseek-ai/3FS
⛲ Smallpod-3FS上的数据处理框架→github.com/deepseek-ai/sm

Fire-Flyer文件系统(3FS) 开源项目解析

项目概述

Fire-Flyer文件系统(3FS)是一个高性能分布式文件系统,专为AI训练和推理工作负载设计。它利用现代SSD和RDMA网络技术,提供共享存储层,简化分布式应用程序的开发。该系统能够聚合数千个SSD和数百个存储节点的网络带宽,使应用程序能够以位置无关的方式访问存储资源。

代码结构

从仓库结构来看,3FS项目组织如下:

  1. src/ - 主要源代码目录

    • client/ - 客户端相关代码
    • common/ - 通用工具和基础设施
    • fbs/ - 扁平缓冲区(FlatBuffers)定义
    • fuse/ - FUSE接口实现
    • lib/ - 核心库
    • mgmtd/ - 管理守护进程
    • migration/ - 数据迁移相关
    • storage/ - 存储层实现,包含chunk_engine
  2. third_party/ - 第三方依赖

    • folly/ - Facebook的开源C++库
    • rocksdb/ - 持久化KV存储
    • leveldb/ - 另一种KV存储选项
    • googletest/ - 测试框架
    • 其他依赖库
  3. tests/ - 测试代码

    • 包含存储、客户端等各模块的测试
  4. docs/ - 文档

    • 设计说明、API参考等
  5. deploy/ - 部署相关脚本和配置

  6. benchmarks/ - 性能基准测试

核心组件

1. 存储层 (Storage)

从代码中可以看出,存储层是3FS的核心,主要包括:

  • ChunkEngine: 负责数据块的管理,是一个高性能的数据块存储引擎,支持更新、提交等操作
  • StorageTarget: 存储目标抽象,管理物理存储资源
  • KV存储: 使用RocksDB或LevelDB作为元数据存储
Result<uint32_t> ChunkEngine::update(chunk_engine::Engine &engine, UpdateJob &job) {
  auto recordGuard = storageUpdateRecorder.record();

  // 1. prepare.
  const auto &updateIO = job.updateIO();
  const auto &chunkId = updateIO.key.chunkId;
  const auto &options = job.options();
  const auto &state = job.state();
  auto &result = job.result();
  
  // ... 更多代码 ...
}

2. 客户端和FUSE接口

  • FuseClients: 实现FUSE接口,允许将3FS挂载为本地文件系统
  • USRBIO API: 用户空间环形缓冲区IO,提供高速I/O函数,绕过FUSE限制
Result<Void> FuseClients::init(const flat::AppInfo &appInfo,
                               const String &mountPoint,
                               const String &tokenFile,
                               FuseConfig &fuseConfig) {
  // ... 初始化代码 ...
  
  iovs.init(fuseRemountPref.value_or(fuseMountpoint), fuseConfig.iov_limit());
  iors.init(fuseConfig.iov_limit());
  userConfig.init(fuseConfig);
  
  // ... 更多初始化代码 ...
}

3. 管理层 (Management)

  • MgmtdClient: 管理客户端,处理配置更新、路由信息等
  • ClientSession: 客户端会话管理,支持会话扩展、版本控制
CoTryTask<ExtendClientSessionRsp> ExtendClientSessionOperation::handle(MgmtdState &state) {
  // ... 会话扩展处理逻辑 ...
}

4. 并发和异步处理

  • 使用folly库的协程和线程池进行高效的并发处理
  • 实现了异步I/O操作,提高性能
// 异步I/O示例
folly::coro::blockingWait(aioReadWorker.enqueue(AioReadJobIterator(job.get())));
folly::coro::blockingWait(job->complete());

技术亮点

1. 高性能设计

  • 零拷贝I/O: 通过共享内存区域(Iov)实现用户和FUSE进程间的零拷贝数据交换
  • RDMA网络: 利用RDMA(远程直接内存访问)技术实现高速网络传输
  • 批处理I/O: 支持批量读写操作,减少系统调用开销

2. 分布式架构

  • 分离式架构: 将计算和存储分离,实现资源的独立扩展
  • 强一致性: 实现CRAQ(Chain Replication with Apportioned Queries)确保数据一致性
  • 动态路由: 支持动态路由信息刷新,确保客户端能找到正确的存储节点

3. AI工作负载优化

  • 大块读写: 针对AI训练的大数据块读写进行优化
  • 检查点支持: 支持大规模训练的高吞吐并行检查点
  • KV缓存: 为推理提供成本效益高的缓存方案

4. 可靠性设计

  • 版本控制: 实现配置和数据的版本控制机制
  • 定期同步: 通过后台运行的定期同步工作器确保数据一致性
  • 错误处理: 完善的错误处理和恢复机制

性能数据

根据README中的性能数据,3FS在大规模集群上表现出色:

  • 在由180个存储节点组成的集群上(每个节点配备2×200Gbps InfiniBand NIC和16个14TiB NVMe SSD),使用500多个客户端节点进行读取压力测试,最终聚合读取吞吐量达到约6.6 TiB/s。

独特价值

  1. 专为AI优化: 针对AI训练和推理的特定存储需求进行了优化
  2. 高性能: 通过现代硬件(SSD、RDMA)和优化的软件设计实现极高吞吐量
  3. 易用性: 提供标准文件接口,降低学习成本
  4. 灵活性: 支持多种工作负载模式,从数据准备到模型训练再到推理
  5. 开源: 采用MIT许可证,允许广泛使用和贡献

技术创新点

  1. ChunkEngine: 高效的数据块管理引擎,支持快速读写和版本控制
  2. USRBIO API: 绕过FUSE限制的高性能I/O接口
  3. 分布式元数据服务: 基于事务性KV存储的无状态元数据服务
  4. 智能缓存策略: 针对不同工作负载优化的多级缓存设计

总的来说,Fire-Flyer文件系统(3FS)是一个为AI工作负载专门设计的高性能分布式存储系统,通过创新的架构设计和优化的实现,解决了大规模AI训练和推理中的存储挑战。其代码结构清晰,模块化设计使其易于维护和扩展,而专注于性能优化的各种技术使其在AI领域具有独特价值。

SmallPond 开源项目解析

项目概述

SmallPond 是一个轻量级的数据处理框架,构建在 DuckDB3FS 之上。它提供了一个分布式计算环境,用于高效处理大规模数据集。从代码结构来看,SmallPond 采用了类似于 Apache Spark 的编程模型,但更加轻量和灵活。

代码结构

SmallPond 的代码结构主要包括以下几个部分:

  1. 逻辑层 (logical)

    • node.py:定义了计算图中的各种节点类型,如 SqlEngineNodeHashPartitionNode
    • dataset.py:定义了各种数据集类型,如 ParquetDataSetCsvDataSet
    • optimizer.py:优化逻辑计划,如合并连续的 SQL 查询节点
    • planner.py:将逻辑计划转换为执行计划
  2. 执行层 (execution)

    • task.py:定义了各种任务类型,如 SqlEngineTaskHashPartitionTask
    • scheduler.py:负责调度任务的执行
    • executor.py:负责执行任务
    • driver.py:提供命令行接口,用于启动作业
    • workqueue.py:实现工作队列,用于任务分发
  3. IO 层 (io)

    • arrow.py:处理 Arrow 格式数据
    • filesystem.py:文件系统操作
  4. 高层 API

    • dataframe.py:提供类似 Pandas 的 DataFrame API
    • session.py:管理计算会话
  5. 平台层 (platform)

    • mpi.py:支持 MPI 分布式计算

核心概念

  1. 逻辑计划 (LogicalPlan)

    • 定义了数据处理的有向无环图 (DAG)
    • 由各种节点 (Node) 组成,如数据源节点、SQL 查询节点、分区节点等
  2. 执行计划 (ExecutionPlan)

    • 由逻辑计划转换而来
    • 包含具体的任务 (Task) 执行细节
  3. 任务 (Task)

    • 执行计划中的最小执行单元
    • 有不同类型,如 SQL 执行任务、哈希分区任务等
  4. 调度器 (Scheduler)

    • 负责分配任务给执行器
    • 处理任务失败、重试等情况
  5. 执行器 (Executor)

    • 负责实际执行任务
    • 可以分布在多个节点上

项目亮点

  1. 基于 DuckDB 的高效查询

    • 利用 DuckDB 的列式存储和向量化执行引擎,提供高效的 SQL 查询能力
    • 支持 UDF (用户自定义函数),增强了数据处理的灵活性
  2. 优化的逻辑计划

    • 实现了 SQL 查询节点的自动合并优化
    • 支持推测执行 (speculative execution),提高容错性
  3. 灵活的分区策略

    • 支持哈希分区 (HashPartition)
    • 支持均匀分布分区 (EvenlyDistributedPartition)
    • 支持自定义分区
  4. 容错机制

    • 任务失败自动重试
    • 支持推测执行,减少长尾任务的影响
    • 支持调度器状态保存和恢复
  5. 资源管理

    • 支持 CPU、内存和 GPU 资源限制
    • 支持 NUMA 节点绑定,优化多核系统性能
  6. 易用的 API

    • 提供类似 Pandas 的 DataFrame API
    • 支持链式操作,如 df.filter(...).select(...).write_parquet(...)
  7. 多种数据源和格式支持

    • 支持 Parquet、CSV、JSON 等格式
    • 支持从本地文件系统、HDFS 等读取数据
  8. 分布式执行

    • 支持多节点并行执行
    • 支持 MPI 分布式计算

有价值的设计模式

  1. 延迟计算 (Lazy Evaluation)

    • 构建逻辑计划时不立即执行,而是等到需要结果时才执行
    • 有利于全局优化
  2. 访问者模式 (Visitor Pattern)

    • 用于遍历和转换逻辑计划
    • OptimizerPlanner
  3. 工厂方法模式

    • 用于创建不同类型的任务
    • Node.task_factory 装饰器
  4. 观察者模式

    • 用于监控调度器状态
    • Scheduler.StateObserver
  5. 命令模式

    • 用于封装任务执行
    • WorkItem 类及其子类

总结

SmallPond 是一个设计精良的分布式数据处理框架,它结合了 DuckDB 的高效查询能力和分布式计算的可扩展性。它的设计理念是轻量、高效、易用,适合处理中等规模到大规模的数据集。与 Spark 等重量级框架相比,SmallPond 更加轻量,启动更快,更适合中小规模的数据处理任务。同时,它的容错机制和资源管理能力也使其在生产环境中具有较高的可靠性。

DeepSeek 开源组织及X账号

posted @   bingohuang  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示