Un checkpoint complet pour un modèle 70B inclut : les poids du modèle (~140 Go en FP16), les états de l'optimiseur (~280 Go pour Adam, qui stocke deux moyennes mobiles par paramètre), l'état du planificateur de taux d'apprentissage, les états des générateurs de nombres aléatoires et l'étape d'entraînement actuelle. Total : ~420 Go par checkpoint. Sauvegarder cela sur disque prend un temps et un espace significatifs, c'est pourquoi le checkpointing est fait périodiquement plutôt qu'à chaque étape.
Stratégies courantes : sauvegarder toutes les N étapes (simple mais utilise beaucoup de stockage), ne garder que les K checkpoints les plus récents (supprimer les anciens pour économiser de l'espace), sauvegarder selon les métriques d'évaluation (garder le checkpoint avec la meilleure perte de validation), et utiliser le checkpointing asynchrone (sauvegarder en arrière-plan pendant que l'entraînement continue sur le lot suivant). Les grands entraînements utilisent souvent toutes ces stratégies : des checkpoints locaux fréquents sur du stockage NVMe rapide plus des checkpoints périodiques distants sur du stockage réseau pour la reprise après sinistre.
Différents frameworks utilisent différents formats de checkpoint : le state_dict de PyTorch, les safetensors de Hugging Face, les checkpoints shardés de FSDP et les checkpoints ZeRO de DeepSpeed. Convertir entre les formats est une tâche courante — tu pourrais entraîner avec DeepSpeed (shardé à travers les GPU) mais avoir besoin d'un checkpoint consolidé unique pour l'inférence ou l'upload sur Hugging Face. Le format safetensors devient le standard pour le partage parce qu'il est rapide à charger et sûr en mémoire.