Google Colab offre des GPUs (A100, V100, T4) gratuitement dans le navigateur. Ce tutoriel montre comment l'utiliser efficacement : monter Drive pour persister les données, utiliser le GPU, sauvegarder les modèles et éviter les pièges courants.
Dans Colab : Runtime → Change runtime type → Hardware accelerator → GPU (T4)
Définition : Un GPU (Graphics Processing Unit) est un processeur spécialisé pour les calculs parallèles massifs. Un CPU (Central Processing Unit) est le processeur généraliste de l'ordinateur, meilleur pour les tâches séquentielles.
But : Les GPUs accélèrent drastiquement les opérations matricielles (multiply, dot product, convolution) qui dominent le deep learning.
Pourquoi ici : Entraîner un CNN sur CIFAR-10 avec un T4 GPU prend ~10 min, sur un CPU sans GPU ~1h. C'est une différence de 6x. Les GPUs A100/V100 sont encore plus rapides. Sur de gros modèles (ResNets, Transformers), la différence est 10-50x.
import torch
import tensorflow as tf
# Vérifier le GPU PyTorch
print(f"PyTorch — GPU disponible : {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"GPU : {torch.cuda.get_device_name(0)}")
print(f"Mémoire GPU : {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB")
# Vérifier le GPU TensorFlow
gpus = tf.config.list_physical_devices('GPU')
print(f"TensorFlow — GPUs : {gpus}")
# Infos système
import subprocess
result = subprocess.run(['nvidia-smi'], capture_output=True, text=True)
print(result.stdout)
Définition : Montage = accès fichier système au stockage Google Drive depuis Colab. Sans montage, tout fichier créé dans Colab est perdu à la déconnexion (session limitée à 12h).
But : Persister les données, modèles et résultats au-delà de la session Colab.
Pourquoi ici : Colab is stateless — il y a pas de "disque dur" persistant pour vous. Drive mount est la seule façon de sauvegarder l'entraînement et les checkpoints.
from google.colab import drive
import os
# Monter Google Drive (demande une autorisation)
drive.mount('/content/drive')
# Créer le dossier de travail sur Drive
PROJECT_DIR = '/content/drive/MyDrive/ML_Projects/classification_cifar10'
os.makedirs(PROJECT_DIR, exist_ok=True)
MODELS_DIR = f'{PROJECT_DIR}/models'
DATA_DIR = f'{PROJECT_DIR}/data'
os.makedirs(MODELS_DIR, exist_ok=True)
os.makedirs(DATA_DIR, exist_ok=True)
print(f"Projet : {PROJECT_DIR}")
print(f"Contenu : {os.listdir(PROJECT_DIR)}")
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
# ── Données ──
(X_train, y_train), (X_test, y_test) = keras.datasets.cifar10.load_data()
X_train, X_test = X_train / 255.0, X_test / 255.0
y_train = keras.utils.to_categorical(y_train)
y_test = keras.utils.to_categorical(y_test)
# ── Modèle ──
def create_model():
return keras.Sequential([
keras.Input(shape=(32, 32, 3)),
layers.RandomFlip('horizontal'),
layers.RandomRotation(0.1),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.BatchNormalization(),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Dropout(0.3),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Dropout(0.3),
layers.GlobalAveragePooling2D(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
model = create_model()
model.compile(
optimizer=keras.optimizers.Adam(0.001),
loss='categorical_crossentropy',
metrics=['accuracy']
)
model.summary()
import time
MODEL_PATH = f'{MODELS_DIR}/cifar10_best.keras'
CHECKPOINT_PATH = f'{MODELS_DIR}/cifar10_checkpoint.keras'
callbacks = [
# Sauvegarder le meilleur modèle sur Drive
keras.callbacks.ModelCheckpoint(
MODEL_PATH,
monitor='val_accuracy',
save_best_only=True,
verbose=1
),
# Sauvegarder régulièrement chaque epoch (protection contre les déconnexions)
keras.callbacks.ModelCheckpoint(
CHECKPOINT_PATH,
save_freq='epoch',
verbose=0
),
keras.callbacks.EarlyStopping(patience=15, restore_best_weights=True),
keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=7, min_lr=1e-7),
]
start = time.time()
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=128,
validation_split=0.15,
callbacks=callbacks,
verbose=1
)
elapsed = time.time() - start
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"\nEntraînement terminé en {elapsed/60:.1f} min")
print(f"Précision test : {test_acc*100:.2f}%")
print(f"Modèle sauvegardé sur Drive : {MODEL_PATH}")
Définition : Callback Keras qui sauvegarde le modèle sur disque (Drive, dans notre cas) régulièrement pendant l'entraînement. Avec save_best_only=True et monitor='val_accuracy', on ne sauvegarde que si val_accuracy s'améliore.
But : Protéger contre les déconnexions Colab et persister le meilleur modèle en cas d'interruption.
Pourquoi ici : Sans ModelCheckpoint, si votre session Colab crash ou déconnecte après 30 min d'entraînement, tout est perdu. Avec deux checkpoints (best + last), vous pouvez reprendre l'entraînement au epoch courant.
import os
# Remonter Drive après déconnexion
from google.colab import drive
drive.mount('/content/drive')
# Charger le dernier checkpoint
if os.path.exists(CHECKPOINT_PATH):
model = keras.models.load_model(CHECKPOINT_PATH)
print(f"✅ Modèle chargé depuis : {CHECKPOINT_PATH}")
# Reprendre l'entraînement à partir de là
history2 = model.fit(
X_train, y_train,
epochs=50,
initial_epoch=len(history.history['loss']), # Reprendre au bon epoch
batch_size=128,
validation_split=0.15,
callbacks=callbacks
)
else:
print("❌ Pas de checkpoint trouvé — relancer l'entraînement")
# ── Éviter la déconnexion automatique ──
# Colab se déconnecte après 90 min d'inactivité (pas de sortie de code)
# Solution : ouvrir la console JavaScript du navigateur et exécuter :
# function KeepAlive() { document.querySelector("colab-connect-button").click(); setTimeout(KeepAlive, 60000); } KeepAlive();
# ── Vérifier l'espace disque ──
import shutil
total, used, free = shutil.disk_usage("/")
print(f"Disque : {used/1e9:.1f}GB / {total/1e9:.1f}GB utilisés")
# ── Télécharger les fichiers générés ──
from google.colab import files
# Télécharger un modèle sur votre ordinateur
files.download('/content/mon_modele.pkl')
# ── Uploader des fichiers depuis votre ordinateur ──
uploaded = files.upload() # Ouvre un sélecteur de fichiers
for name, data in uploaded.items():
print(f"Fichier reçu : {name} ({len(data)} bytes)")
# ── Installer des packages ──
import subprocess
subprocess.run(['pip', 'install', 'transformers', 'datasets', '-q'])
Définition : VRAM (Video RAM) est la mémoire rapide sur le GPU. Contrairement à la RAM système (qui est pour CPU), la VRAM est dédiée aux tensors et calculs GPU. Les GPUs T4 ont 16 GB VRAM, A100 80 GB.
But : Limiter la taille des batches à ce qui tient en VRAM. Si batch_size est trop grand, OutOfMemory error.
Pourquoi ici : Sur T4 (16GB VRAM), batch_size=128 fonctionne pour CIFAR-10 CNN. batch_size=1024 causerait OutOfMemory. Pour de gros modèles (ResNets, Transformers), batch_size doit être bien plus petit.