Gestion et fragmentation de la mémoire GPU
Comment les frameworks d'IA allouent, réutilisent et récupèrent la mémoire limitée d'un GPU, et pourquoi les lacunes restantes (fragmentation) peuvent provoquer des erreurs de mémoire insuffisante, même s'il reste techniquement beaucoup de mémoire.
Aperçu
Understanding it is key to fitting big models and avoiding mysterious crashes.
Plongée profonde
La mémoire GPU est fixe et précieuse : une carte peut avoir un total de 24, 80 ou 192 Go, partagés par poids de modèle, activations, dégradés, états d'optimisation et tampons temporaires. Appeler le pilote pour allouer de la mémoire à chaque opération serait lent, c'est pourquoi des frameworks comme PyTorch utilisent un allocateur de mise en cache qui récupère les gros blocs à l'avance et distribue les sous-éléments, puis conserve les éléments libérés dans un pool pour les réutiliser. Le problème est la fragmentation : à mesure que des tenseurs de différentes tailles sont alloués et libérés, l'espace libre se divise en morceaux dispersés. Vous pouvez disposer de 5 Go d'espace libre au total sans toutefois parvenir à allouer un tenseur contigu de 2 Go, car aucun espace n'est assez grand. C'est pourquoi la formation peut planter en cas d'erreurs de mémoire insuffisante malgré la marge apparemment disponible.
Aperçu technique
L'allocateur de mise en cache CUDA de PyTorch divise la mémoire en flux de blocs et réutilise les blocs libérés qui correspondent aux tailles demandées, évitant ainsi les appels cudaMalloc/cudaFree coûteux. La fragmentation survient lorsque les blocs divisés ne peuvent pas être recombinés. Des outils tels que torch.cuda.empty_cache, l'option PYTORCH_CUDA_ALLOC_CONF expandable_segments et les instantanés de mémoire aident. Des approches plus récentes empruntent des idées de mémoire virtuelle, mappant des pages physiques non contiguës dans une plage virtuelle contiguë afin que les requêtes volumineuses aboutissent malgré la fragmentation.
Impact stratégique
Coût et budget
Les décisions en matière d'architecture déterminent les performances et les coûts d'exploitation pendant des années.
Décisions plus claires
La formation technique aide les équipes à choisir la bonne pile, pas seulement la plus récente.
Contrôle qualité
De meilleurs choix d’ingénierie réduisent les incidents de fiabilité en production.
L'avenir de la gestion et de la fragmentation de la mémoire GPU
La gestion de la mémoire devient plus intelligente et plus paginée, inspirée des systèmes d'exploitation. Des techniques telles que les répartiteurs de type mémoire virtuelle et l'attention paginée (utilisées pour gérer le cache KV pendant l'inférence) réduisent considérablement le gaspillage et la fragmentation. Attendez-vous à ce que les frameworks soient par défaut des allocateurs extensibles et défragmentés, une meilleure visibilité grâce aux profileurs intégrés et un couplage plus étroit avec le déchargement et le recalcul afin que le système jongle automatiquement avec le GPU, le CPU et la mémoire disque pour maintenir une utilisation élevée et des plantages rares.
Mise en œuvre dans le monde réel
Une exécution de formation qui plante avec « CUDA hors de mémoire » malgré la mémoire réservée affichant de l'espace libre, corrigée en définissant PYTORCH_CUDA_ALLOC_CONF pour activer les segments extensibles.
Utilisation de torch.cuda.memory_summary ou d'un instantané de mémoire pour diagnostiquer quels tenseurs et fragmentations consomment les 80 Go d'un GPU.
PagedAttention de vLLM gérant le cache KV d'attention dans des pages de taille fixe pour répondre à de nombreuses demandes de discussion simultanées sans gaspiller de mémoire.
Réduire la taille du lot ou activer les points de contrôle de gradient pour réduire la mémoire d'activation et éviter les pannes de mémoire insuffisantes dues à la fragmentation.
Risques et garde-fous
L’optimisation d’un benchmark peut masquer des faiblesses plus larges du système.
Les coûts d’infrastructure et de maintenance sont souvent sous-estimés.
Les lacunes en matière de sécurité et d’observabilité peuvent se creuser à mesure que les systèmes deviennent plus complexes.
Feuille de route de mise en œuvre
Définissez les objectifs de latence, de qualité et de coût avant la mise en œuvre.
Benchmark dans des conditions de charge et de données réalistes.
Surveillance des instruments pour détecter les erreurs, la dérive et l'impact sur l'utilisateur.
Préparez les chemins de restauration et de réponse aux incidents avant la mise à l’échelle.
Continuez à explorer
Free newsletter
Get the daily AI briefing
Three verified AI stories every weekday morning, written in plain English. Free forever, no ads.
One email each weekday. Unsubscribe in one click. We never sell or share your address.
Test yourself
Take the GPU Memory Management and Fragmentation quiz
Instant feedback on every answer, and a shareable certificate with a verifiable ID once you pass a course.
Support free AI education. AI Understanding is a 501(c)(3) nonprofit — no ads, no paywall, ever. Make a donation
Guide suivant
Planification GPU et orchestration de cluster
Questions fréquemment posées
What is GPU Memory Management and Fragmentation?
Comment les frameworks d'IA allouent, réutilisent et récupèrent la mémoire limitée d'un GPU, et pourquoi les lacunes restantes (fragmentation) peuvent provoquer des erreurs de mémoire insuffisante, même s'il reste techniquement beaucoup de mémoire. Le comprendre est essentiel pour installer de gros modèles et éviter des accidents mystérieux.
Qu’est-ce que la fragmentation de la mémoire GPU ?
La fragmentation signifie que la mémoire totale libre est suffisante, mais elle est divisée en morceaux, donc aucun espace n'est assez grand pour un gros tenseur.
Pourquoi les frameworks comme PyTorch utilisent-ils un allocateur de mémoire en cache ?
L'appel de cudaMalloc/cudaFree pour chaque opération est lent, donc l'allocateur de mise en cache récupère les gros blocs et réutilise ceux libérés d'un pool.
Vous voyez 5 Go d'espace libre mais vous ne pouvez pas allouer un tenseur de 2 Go. Quelle est la cause probable ?
Ce symptôme classique de fragmentation se produit lorsqu'il existe de la mémoire libre, mais pas sous la forme d'un bloc contigu suffisamment grand pour la requête.
Quel paramètre PyTorch permet de réduire la fragmentation en permettant aux segments de mémoire de croître de manière flexible ?
La configuration de PYTORCH_CUDA_ALLOC_CONF pour activer expandable_segments permet à l'allocateur de développer des segments et de réduire les échecs liés à la fragmentation.
Qu'est-ce que PagedAttention de vLLM parvient à réduire le gaspillage de mémoire lors de l'inférence ?
PagedAttention stocke le cache KV dans des pages de taille fixe comme la mémoire virtuelle du système d'exploitation, réduisant ainsi la fragmentation et répondant efficacement à de nombreuses requêtes.