| name | gpu-training-management |
| description | Gestion multi-GPU pour l'entraînement ML/RL — libération de GPU, allocation, monitoring, et résolution des conflits avec les services (vLLM, Label Studio, etc.) |
| version | 1.0.0 |
| author | Eva |
Gestion Multi-GPU pour l'Entraînement ML
Guide pour gérer efficacement plusieurs GPUs (RTX 3090 ×2) entre les services permanents (vLLM, ComfyUI, Label Studio) et l'entraînement ML/RL.
Architecture GPU typique
| GPU | Usage permanent | Usage entraînement |
|---|
| GPU 0 | Label Studio (birefnet) | Entraînement principal |
| GPU 1 | vLLM (small) | Entraînement secondaire / validation |
Vérification de l'état GPU
nvidia-smi
nvidia-smi --query-compute-apps=pid,process_name,gpu_uuid,used_memory --format=csv
watch -n 1 nvidia-smi
Libération d'un GPU pour l'entraînement
Méthode 1 : Arrêt propre du service (recommandée)
nvidia-smi | grep python
docker stop vllm-small
nvidia-smi
Méthode 2 : Kill direct (si le service ne répond pas)
nvidia-smi --query-compute-apps=pid --format=csv,noheader
kill -9 <PID>
nvidia-smi
Méthode 3 : Redémarrage du service après entraînement
docker start vllm-small
nvidia-smi
Allocation GPU pour l'entraînement
PyTorch
import torch
print(f"GPUs disponibles: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f" GPU {i}: {torch.cuda.get_device_name(i)}")
print(f" Mémoire: {torch.cuda.get_device_properties(i).total_memory / 1e9:.1f} GB")
device = torch.device("cuda:1")
torch.cuda.set_device(1)
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
EVO-ARENA / ES
devices = ('cuda:0', 'cuda:1') if torch.cuda.device_count() >= 2 else \
('cuda:0',) if torch.cuda.device_count() == 1 else \
('cpu', 'cpu')
Conflits courants et solutions
1. GPU "occupé" mais 0% utilisation
Symptôme : nvidia-smi montre un processus avec 2-5 GB alloués mais 0% utilisation.
Cause : Le processus a réservé de la mémoire mais ne calcule pas (idle).
Solution : Le GPU est techniquement disponible. On peut soit :
- Le partager (si la mémoire totale suffit)
- Tuer le processus pour libérer complètement
nvidia-smi --query-compute-apps=pid,used_memory --format=csv
kill -9 <PID>
2. OOM (Out of Memory) malgré GPU libre
Symptôme : CUDA out of memory alors que nvidia-smi montre de la mémoire libre.
Cause : Fragmentation mémoire ou autre processus sur le même GPU.
Solution :
import torch
torch.cuda.empty_cache()
import gc
gc.collect()
torch.cuda.empty_cache()
for i in range(torch.cuda.device_count()):
print(f"GPU {i}: {torch.cuda.memory_allocated(i)/1e9:.1f} GB alloués, "
f"{torch.cuda.memory_reserved(i)/1e9:.1f} GB réservés")
3. Processus zombie sur GPU
Symptôme : Le processus est mort mais la mémoire GPU n'est pas libérée.
Solution :
nvidia-smi --query-compute-apps=pid --format=csv,noheader
sudo kill -9 $(nvidia-smi --query-compute-apps=pid --format=csv,noheader)
sudo fuser -v /dev/nvidia*
Scripts utiles
Script de libération GPU
#!/bin/bash
GPU_ID=${1:-1}
echo "Libération GPU $GPU_ID..."
PIDS=$(nvidia-smi --query-compute-apps=pid,gpu_uuid --format=csv,noheader | \
grep "$(nvidia-smi --query-gpu=uuid --format=csv,noheader -i $GPU_ID)" | \
cut -d',' -f1)
if [ -z "$PIDS" ]; then
echo "Aucun processus trouvé sur GPU $GPU_ID"
else
echo "Processus trouvés: $PIDS"
for PID in $PIDS; do
echo "Arrêt de $PID..."
kill -9 $PID 2>/dev/null || true
done
fi
sleep 2
echo "État GPU $GPU_ID:"
nvidia-smi -i $GPU_ID
Script de monitoring GPU
#!/bin/bash
while true; do
clear
echo "=== $(date) ==="
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.used,memory.total --format=csv,noheader
echo ""
echo "Processus:"
nvidia-smi --query-compute-apps=pid,process_name,gpu_uuid,used_memory --format=csv,noheader
sleep 5
done
Bonnes pratiques
Avant l'entraînement
-
Vérifier les GPUs disponibles :
python3 -c "import torch; print(torch.cuda.device_count())"
-
Libérer les GPUs nécessaires :
docker stop vllm-small label-studio
-
Vérifier la mémoire :
nvidia-smi
Pendant l'entraînement
-
Monitoring léger :
watch -n 5 'nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader'
-
Alertes OOM :
if torch.cuda.memory_allocated() > 0.9 * torch.cuda.get_device_properties(0).total_memory:
print("⚠️ Mémoire GPU > 90%")
torch.cuda.empty_cache()
Après l'entraînement
-
Nettoyer :
torch.cuda.empty_cache()
-
Redémarrer les services :
docker start vllm-small
Configuration recommandée The Hive
| Service | GPU par défaut | Mémoire | Priorité |
|---|
| Entraînement EVO-ARENA | GPU 0 + GPU 1 | 48 GB | Haute |
| vLLM (inférence) | GPU 1 | 5-10 GB | Moyenne |
| Label Studio | GPU 0 | 2-3 GB | Basse |
| ComfyUI | GPU 1 | 4-8 GB | Basse |
Stratégie : Arrêter vLLM et Label Studio pendant l'entraînement, les redémarrer après.
Références
references/gpu-conflict-resolution.md — Résolution des conflits GPU spécifiques
references/pytorch-multi-gpu.md — Patterns PyTorch DataParallel/DistributedDataParallel