Exercice candidature spontanée au sein de ZML
Ce projet implémente un loader SafeTensors en Zig 0.15 basé sur std.Io.Reader, qui expose lui-même un std.Io.Reader capable de déquantifier à la volée les formats FP4 + block vers f32 (ou bf16).
Bonus :Implémentation SIMD pour optimiser les performances de déquantification.
├── src/
│ ├── main.zig # Point d'entrée principal
│ ├── safetensor_reader.zig # Implémentation du loader SafeTensors
│ ├── utils.zig # Utilitaires (décodeurs FP4, structures de données)
│ ├── experimental_safetensor_reader.zig # Versions expérimentales (traces du raisonnement)
│ └── root.zig # Module racine
├── build.zig # Configuration de build
├── build.zig.zon # Dépendances du projet
├── *.safetensors # Fichiers de test (modèles quantifiés)
└── dequantized_output_*/ # Dossiers de sortie des déquantifications
Point d'entrée du programme qui :
- Ouvre un fichier SafeTensors FP4
- Initialise un reader buffered avec
std.Io.Reader - Lance la déquantification SIMD
- Affiche les résultats et les premiers poids déquantifiés
Cœur du projet - Implémente SafeTensorReader avec :
readHeader(): Parse l'en-tête JSON des SafeTensorsstreamDequantizeNVFP4(): Déquantification NVFP4 streamingstreamDequantizeMXFP4(): Déquantification MXFP4 streamingstreamSIMDDequantizeMXFP4(): Version SIMD optimisée
- Buffering intelligent : Buffer pour réduire les appels système
- SIMD vectoriel : Traitement de 8 valeurs FP4 simultanément
- Streaming : Pas de chargement complet en mémoire
Utilitaires et structures de données :
decodeFp4E2M1(): Décodeur FP4 (exposant 2 bits, mantisse 1 bit)DequantizedLayers: Structure pour gérer les couches déquantifiées- Fonctions de debug
- Phase 1 : Apprentissage de Zig
- Phase 2 : Compréhension du format Safetensor
- Phase 3 : Lecture séquentielle simple avec Io.Reader
- Phase 4 : Récupération des poids en fp4 (Je me suis appliqué la contrainte d'utiliser seulement std.Io.Reader et pas std.fs.File)
- Phase 5 : Compréhension de la déquantification (NVFP4 puis rapidement MXFP4 par manque de doc sur le premier)
- Phase 6 : Déquantification à la volée (+2h30 pour traiter safetensor de 5GB)
- Phase 7 : Implémentation du SIMD (1h pour traiter safetensor de 5GB)
- Phase 8 : Bufferisation de l'écriture (moins de 10 minutes pour traiter safetensor de 5GB)
- Loader SafeTensors complet avec
std.Io.Reader - Déquantification MXFP4 streaming (NVFP4 reste expérimentale)
- Optimisations SIMD avec vectorisation
- Sortie au format fp32
- Zig 0.15.1
- Fichiers SafeTensors : Placez vos fichiers
.safetensorsdans le répertoire racine
# Compilation
zig build
# Exécution directe
zig run src/main.zig- Rendre flexible pour tout type de safetensor MXFP4 (actuellement fonctionne bien pour openai/gpt-oss-20b)
- Multithreading pour traiter simultanèment plusieurs couches