☁️ Google Colab · Débutant

Entraîner un modèle ML sans GPU local

⏱ 30 minutes☁️ Google Colab🆓 GPU gratuit💾 Google Drive

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.

1. Activer le GPU

Dans Colab : Runtime → Change runtime type → Hardware accelerator → GPU (T4)

📖 Terme : GPU vs CPU pour le ML

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.

Les GPUs ont des milliers de petits cores qui font des multiplications en parallèle. Un forward pass CNN sur 128 images (batch) en parallèle sur GPU = très rapide. Sur CPU, c'est séquentiel ou faiblement parallèle = lent. Les frameworks (TensorFlow, PyTorch) détectent automatiquement le GPU et l'utilisent sans code spécial.
Cellule 1 — Vérifier le GPU
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)
Ce bloc vérifie que le GPU est bien accessible. torch.cuda.is_available() retourne True si CUDA (le runtime GPU pour PyTorch) fonctionne. Un T4 GPU a ~16GB de mémoire VRAM. nvidia-smi affiche l'utilisation actuelle du GPU en temps réel.

2. Monter Google Drive

📖 Terme : Google Drive dans Colab (montage)

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.

Cellule 2 — Monter Drive
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)}")
drive.mount() demande autorisation pour accéder à votre Drive. Après autorisation, /content/drive pointe vers votre Drive. On crée une structure de dossiers pour organiser les modèles, données et checkpoints. Si vous relancez le notebook (après une déconnexion), c'est le même dossier — vos fichiers anciens sont toujours là.

3. Entraîner un modèle complet sur Colab

Cellule 3 — Modèle et entraînement
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()
Cellule 4 — Entraîner avec sauvegarde automatique
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}")
📖 Terme : ModelCheckpoint (sauvegarde automatique)

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.

On utilise deux callbacks : MODEL_PATH (meilleur modèle selon val_accuracy) et CHECKPOINT_PATH (dernière checkpoint de chaque epoch). Si Colab déconnecte après l'epoch 40, on peut reprendre l'entraînement de l'epoch 40, pas depuis le début. Les fichiers Keras (.keras) incluent l'architecture + les poids + l'optimizer state.

4. Reprendre après une déconnexion

Cellule 5 — Reprendre l'entraînement
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")
Après une déconnexion, on remonté Drive, charge le checkpoint (le modèle sauvegardé au dernier epoch), puis reprend l'entraînement avec initial_epoch = nombre d'epochs complétés. Cela évite de rejouer les epochs déjà complétés.

5. Bonnes pratiques Colab

Tips Colab
# ── É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'])
📖 Terme : VRAM (Mémoire GPU)

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.

Les sessions Colab gratuites ont une limite de 12h de runtime et le GPU peut être révoqué à tout moment si Google le juge nécessaire (ex: si vous utilisez trop de ressources). Pour des entraînements longs (>12h) ou des modèles massifs, utilisez Colab Pro ($10/mois) ou une infrastructure cloud (AWS, GCP).