DeepSeeks Fire-Flyer File System
(github.com/deepseek-ai)- Fire-Flyer File System (3FS) ist ein leistungsstarkes verteiltes Dateisystem für KI-Trainings- und Inferenz-Workloads, das moderne SSDs und RDMA-Netzwerke nutzt, um eine gemeinsame Storage-Schicht bereitzustellen
- Die disaggregierte Architektur kombiniert den Durchsatz von Tausenden SSDs mit der Netzwerkbandbreite von Hunderten Storage-Nodes, sodass Anwendungen ohne Kenntnis des Speicherorts auf Storage-Ressourcen zugreifen können
- Das Konsistenzmodell bietet starke Konsistenz auf Basis von CRAQ (Chain Replication with Apportioned Queries); der Metadatenservice ist zustandslos aufgebaut und nutzt einen transaktionalen Key-Value-Store wie FoundationDB als Backend
- Zu den wichtigsten Workloads gehören Datenvorbereitung, Dataloader, Checkpointing und KVCache für Inferenz; in einem Lese-Stresstest eines großen Clusters wurde ein aggregierter Lesedurchsatz von etwa 6,6 TiB/s erzielt
- Wegen der früheren Verwendung von
std::shufflekann es beim Build zu Problemen mit der binären Kompatibilität zwischen Compiler-Versionen kommen; daher muss mit-DSHUFFLE_METHODexplizit die Varianteg++10oderg++11angegeben und nach der Cluster-Bereitstellung dieselbe Einstellung beibehalten werden
Welches Problem 3FS lösen will
- Fire-Flyer File System (3FS) ist ein leistungsstarkes verteiltes Dateisystem, das für die Anforderungen von KI-Trainings- und Inferenz-Workloads entwickelt wurde
- Es nutzt moderne SSDs und RDMA-Netzwerke, um eine gemeinsame Storage-Schicht bereitzustellen, die die Entwicklung verteilter Anwendungen vereinfacht
- Da es eine Dateischnittstelle bereitstellt, muss keine neue separate Storage-API erlernt werden
Architektur und Konsistenz
- Die disaggregierte Architektur kombiniert den Durchsatz von Tausenden SSDs mit der Netzwerkbandbreite von Hunderten Storage-Nodes
- Anwendungen können auf Storage-Ressourcen zugreifen, ohne deren Standort kennen zu müssen
- Starke Konsistenz wird über Chain Replication with Apportioned Queries (CRAQ) umgesetzt
- Ziel ist eine Struktur, die Anwendungscode vereinfacht und leichter nachvollziehbar macht
- Der Metadatenservice ist zustandslos konzipiert und nutzt einen transaktionalen Key-Value-Store wie FoundationDB als Backend
Unterstützte Workloads
-
Datenvorbereitung
- Die Ausgaben von Datenanalyse-Pipelines werden in einer hierarchischen Verzeichnisstruktur organisiert
- Große Mengen an Zwischenartefakten werden effizient verwaltet
-
Dataloader
- Ermöglicht zufälligen Zugriff auf Trainings-Samples über Compute-Nodes hinweg und macht Dataset-Prefetching oder Shuffling überflüssig
-
Checkpointing
- Unterstützt paralleles Checkpointing mit hohem Durchsatz für groß angelegtes Training
-
KVCache für Inferenz
- Bietet als kosteneffiziente Alternative zu DRAM-basiertem Caching größere Kapazität und hohen Durchsatz
Performance-Ergebnisse
-
Spitzendurchsatz
- In einem Lese-Stresstest eines großen 3FS-Clusters erreichte der aggregierte Lesedurchsatz etwa 6,6 TiB/s
- Der Testcluster bestand aus 180 Storage-Nodes
- Jeder Storage-Node war mit 2×200-Gbps-InfiniBand-NICs und 16 NVMe-SSDs mit 14 TiB ausgestattet
- Es wurden rund 500 oder mehr Client-Nodes verwendet
- Jeder Client-Node war mit 1×200-Gbps-InfiniBand-NIC ausgestattet
- Die Ergebnisse wurden bei vorhandenem Hintergrundtraffic durch Trainingsjobs gemessen
- Für 3FS-Benchmarks kann die USRBIO-Engine für
fioverwendet werden
-
GraySort
- smallpond wurde mit dem GraySort-Benchmark evaluiert
- Die Implementierung besteht aus zwei Phasen
- Shuffle-basierte Datenpartitionierung anhand der Prefix-Bits des Keys
- Sortierung innerhalb der Partitionen
- In beiden Phasen werden Daten aus 3FS gelesen und nach 3FS geschrieben
- Konfiguration des Testclusters:
- 25 Storage-Nodes
- 2 NUMA-Domänen pro Node
- 1 Storage-Service pro NUMA-Domäne
- 2×400-Gbps-NICs pro Node
- 50 Compute-Nodes
- Die Compute-Nodes bestanden aus 2 NUMA-Domänen, 192 physischen Kernen, 2,2 TiB RAM und 1×200-Gbps-NIC pro Node
- Eine Sortieraufgabe über 110,5 TiB Daten auf 8.192 Partitionen wurde in 30 Minuten 14 Sekunden abgeschlossen
- Der durchschnittliche Durchsatz betrug 3,66 TiB/min
-
KVCache
- KVCache ist eine Technik, die während der LLM-Inferenz die Key/Value-Vektoren früherer Tokens in Decoder-Layern zwischenspeichert, um redundante Berechnungen zu vermeiden
- KVCache-Clients verwenden 1×400-Gbps-NIC pro Node
- Der Lesedurchsatz erreichte in der Spitze 40 GiB/s
- Im selben Zeitraum wurden auch die IOPS der Löschvorgänge der GC gemessen
Dokumentation und Build
- Bereitgestellte Dokumente:
- Design Notes
- Setup Guide
- USRBIO API Reference
- P Specifications
- Der Quellcode wird von GitHub geklont; anschließend werden Submodule initialisiert und Patches angewendet
git submodule update --init --recursive./patches/apply.sh
- Beispiele zur Installation unterstützter Abhängigkeiten werden für folgende Umgebungen bereitgestellt
- Ubuntu 20.04
- Ubuntu 22.04
- openEuler 2403sp1
- OpenCloudOS 9
- TencentOS 4
- Weitere Build-Voraussetzungen:
- libfuse 3.16.1 oder höher
- FoundationDB 7.1 oder höher
- Rust-Toolchain mindestens 1.75.0, empfohlen 1.85.0 oder höher beziehungsweise die aktuelle stabile Version
- 3FS wird im Ordner
buildmit CMake gebaut- Beispiele für C/C++-Compiler sind
clang-14undclang++-14 - Als Build-Typ wird im Beispiel
RelWithDebInfoverwendet
- Beispiele für C/C++-Compiler sind
-
Kompatibilität des Shuffle-Algorithmus
- Wegen der früheren Verwendung von
std::shufflekönnen Binärdateien, die mit unterschiedlichen Compiler-Versionen wieg++10undg++11+gebaut wurden, inkompatibel sein - Beim Build muss
-DSHUFFLE_METHODangegeben werden, um einen konsistenten Shuffle-Algorithmus festzulegen - Bestehende Cluster müssen die Variante verwenden, die zur Compiler-Version der früheren Bereitstellung passt
- Neue Cluster können zwischen
g++10undg++11wählen, müssen nach der Bereitstellung aber bei allen künftigen Builds dieselbe Einstellung beibehalten - Docker-Build-Images werden für TencentOS-4 und OpenCloudOS-9 bereitgestellt
- Zum Ausführen eines Testclusters folgt man dem Setup Guide
- Issues werden über GitHub Issues gemeldet
- Wegen der früheren Verwendung von
Noch keine Kommentare.