Sessions multiples/longues

Dès que vos traitements dépassent 30 minutes, il ne vous sera plus possible de travailler comme avant. S’il semble acceptable d’attendre la fin d’un calcul prenant 5 à 10 minutes, il n’est plus pensable d’agir ainsi sur un traitement qui prend plusieurs heures ou plusieurs jours. Nous allons voir les différentes options fournis par Colab pour avoir une approche plus professionnelle.

Rappels

Allouer une machine virtuelle

Lorsque vous ouvrez un notebook dans Colab, son contenu est alors affiché dans votre navigateur. A ce niveau, il ne consomme aucune ressource, c’est un peu comme une page web ou un fichier texte que l’on consulte. Aucune ressource n’est associée à ce notebook. En haut à droite de la page, vous pouvez voir l’icône suivant :

../_images/connecter.png

Dès que vous lancez l’exécution d’une cellule, une machine virtuelle est instanciée pour exécuter votre traitement. Cette machine virtuelle reste active une fois le traitement terminé :

  • Les fichiers présents sur l’espace disque sont toujours disponibles.

  • La RAM n’est pas libérée, toutes les données sont conservées en mémoire.

Ainsi, lorsque vous exécutez une autre cellule, les données en RAM et les fichiers sur le disque restent disponibles. Une vignette en haut à droite du notebook vous résume les ressources consommées par la machine virtuelle :

../_images/info1.png

Vous pouvez cliquer sur le triangle ▼ et choisir Afficher les ressources pour obtenir un affichage plus complet :

../_images/info2.png

Fermer votre session

Ferme l’onglet de votre navigateur ou quitter le navigateur ne clôt pas votre session notebook pour autant. En effet, la machine virtuelle reste active sur le serveur Colab et continue à consommer des ressources. Est-ce important de savoir cela ? Oui car :

  • Si vous fermez votre onglet par erreur, vous n’avez rien perdu. Il suffit de vous connecter à Colab, de cliquer sur le triangle ▼ et de choisir Gérer les sessions. Cliquez alors sur le nom du notebook que vous aviez fermé par erreur pour le retrouver comme vous l’aviez laissé.

  • Si vous gérez plusieurs notebooks à la fois, il faut fermer ceux qui ne servent plus car vous êtes limité à 2/3 notebooks actifs.

Pour fermer une session proprement, cliquez sur le triangle ▼ et choisissez Déconnecter et supprimer l’environnement d’exécution. Si le titre peut sembler un peu inquiétant, il rappelle juste qu’en fermant la machine virtuelle associée à votre notebook, vous libérez la RAM et l’espace disque associée et donc toutes les données présentes sont perdues. C’est donc une perte définitive. Les autres machines virtuelles/notebooks ne sont pas impactées.

Sessions multiples

Testez le nombre de sessions disponibles

Malgré une interface assez simple, Colab permet de gérer plusieurs machines virtuelles. Vous avez ainsi droit à 2 ou 3 instances en parallèle. Pour tester cela, voici un code qui ne fait rien de spécial sinon lancer un traitement long :

!pip install -q keras-nightly
import os
import numpy as np
os.environ["KERAS_BACKEND"] = "torch"
import keras

FashionMNIST = keras.datasets.fashion_mnist.load_data()
(train_images, train_labels), (test_images, test_labels) = FashionMNIST
model = keras.Sequential()
model.add(keras.Input(shape=(28,28)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation="relu"))
model.add(keras.layers.Dense(10, activation="relu"))
model.compile(optimizer='adam', loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

model.fit(x=train_images, y=train_labels, epochs=10000)

Créez quatre notebooks dans Colab utilisant chacun le code ci-dessus. Nous vous recommandons de leur donner des noms différents afin de vous y retrouver plus facilement. Les noms Notebook1, Notebook2, … peuvent suffire !

Lancez ensuite successivement le traitement demandé dans chaque notebook. Au 4-ième essai, vous devriez obtenir le message d’erreur suivant :

../_images/tropsessions.png

Cliquez alors sur : Gérer les sessions. Vous allez voir apparaître la liste des notebooks actifs :

../_images/sessionsactives.png

Avertissement

Attention, à ce niveau, on peut facilement se mélanger. La liste présentée ici n’est pas une liste de notebooks actifs à proprement parler mais une liste de machines virtuelles. Comme ces machines ne portent pas de nom, elles sont identifiées par le notebook en cours d’exécution. C’est pour cela qu’il est intéressant d’avoir des noms de notebooks différents pour pouvoir distinguer les différentes machines virtuelles.

Avertissement

Attention, si un notebook n’effectue aucun traitement, du point de vue de Colab, une machine virtuelle lui est cependant attrivuée et il est donc comptabilisé comme actif car consommant 1 ressource, même si aucune cellule ne fait de calculs actuellement.

Cette interface permet d’identifier les notebooks actifs (associés à une VM) et ainsi de fermer les notebooks inutiles en cliquant sur l’icône poubelle.

Gérer les sessions multiples

Pour vérifier les sessions actives, depuis n’importe quel notebook, cliquez sur le triangle ▼ et de choisissez Gérer les sessions. Vous avez donc la liste des notebooks actifs et vous pouvez fermer ce que vous voulez.

Effectuer un traitement long

Comme on l’a vu précédemment, ferme la page web ne ferme pas la machine virtuelle. Cela a un énorme avantage car vous disposez de l’équivalent d’un serveur de calcul ! De plus, vous vous y connectez simplement à travers un notebook faisant office de telnet. De cette façon, vous pouvez lancer un traitement de plusieurs heures sans mobiliser votre machine personnelle.

Test

Si vous n’avez pas conservé un notebook de la section précédente, recréez un notebook effectuant un calcul assez long. Ensuite, fermez l’onglet de votre navigateur associé à ce notebook. Vous obtiendrez le message suivant :

../_images/msg.png

Ce message concerne en fait les cellules du notebook que vous n’avez peut être pas sauvegardées en quittant, cette information ne concerne en rien la machine virtuelle, ne pas en tenir compte. Ensuite, ouvrez un nouvel onglet et reconnectez vous à Colab. Cliquez sur le triangle ▼ et choisissez Gérer les sessions. Sélectionnez alors le notebook dont on vient de fermer l’onglet. Comme vous pouvez le constater le notebook est toujours actif :

../_images/epoch.png

Si vous n’êtes pas convaincu, fermez tous les onglets de votre navigateur, éteignez votre machine et allez faire un tour 10 minutes. Ensuite, reconnectez-vous à Colab. Cliquez sur le triangle ▼ et de choisissez Gérer les sessions, sélectionnez alors le même notebook. Comme vous pouvez le constater, en votre absence, votre instance a continué à travailler :

../_images/epoch2.png

Avertissement

Si vous laissez des machines virtuelles ouvertes, n’oubliez pas de les arrêter. En effet, fermer le navigateur ne ferme pas vos sessions ! Et utiliser inutilement trop de sessions pendant plusieurs heures consomment votre temps de calcul alloué gratuitement. Faîtes attention !

Avertissement

Fermez les sessions de calcul précédentes !!!

Note

Combien de temps les notebooks peuvent-ils s’exécuter dans Colab ? Voici la réponse officielle de Google : « En règle générale, la durée d’exécution maximale des notebooks est de 12 heures, selon la disponibilité et vos habitudes d’utilisation. »

Archiver la progression du réseau

Il ne faut pas rêver, il est difficile de garder une session Colab ouverte sur plusieurs jours. On peut citer plusieurs contraintes :

  • Vous disposez de ressources prêtées gratuitement par Google, il se peut qu’afin d’éviter certains abus, des sessions soient fermées automatiquement après une certaine durée de fonctionnement. Cela permet aussi de se prémunir des sessions zombies qui tournent alors que l’utilisateur les a oubliées.

  • Vous êtes non prioritaire par rapport aux utilisateurs payants (pro). En cas de forte demande, vous passez à la trappe. Ne vous sentez pas mal-traités, les utilisateurs pros sont aussi éjectés dans les périodes de forte demande afin de faire de la place aux autres !

  • Il y a des maintenances et aussi des plantages qui conduisent à la déconnexion ou à la perte de vos machines virtuelles.

Inutile de se poser trop de questions, il est impossible de connaître la raison de fermeture de votre session. Cependant, on peut et on doit dès qu’un traitement se déroule sur plusieurs heures gérer cet aspect.

Le principe des callbacks

Keras, à la fin de chaque epoch, peut appeler divers traitements supplémentaires, généralement pour effectuer du monitoring. Pour cela, sont passés en arguments de la fonction fit() les fonctions/objets à rappeler, d’où le terme de « callback ». Prenons un exemple simple, pour cela, démarrez une session Colab et créez le modèle suivant :

!pip install -q keras-nightly
import os
import numpy as np
os.environ["KERAS_BACKEND"] = "torch"
import keras

FashionMNIST = keras.datasets.fashion_mnist.load_data()
(train_images, train_labels), (test_images, test_labels) = FashionMNIST
model = keras.Sequential()
model.add(keras.Input(shape=(28,28)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation="relu"))
model.add(keras.layers.Dense(10, activation="relu"))
model.compile(optimizer='adam', loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

Dans le bandeau de gauche, cliquez sur l’icône de répertoire. Effectuez un clic droit dans la zone du disque et choisissez Nouveau dossier et créez un répertoire nommé test.

../_images/callback.png

Cette fois, nous lançons l’entraînement en donnant une liste de callbacks. Nous utilisons pour cela le callback ModelCheckpoint fourni par Keras permettant de sauvegarder le réseau sur le disque à chaque fin d’epoch.

callbacks = [ keras.callbacks.ModelCheckpoint("/content/test/save_at_{epoch}.keras", verbose = True) ]
model.fit(x=train_images, y=train_labels, epochs=3,callbacks=callbacks)

L’option verbose permet d’informer l’utilisateur des actions effectuées lors de chaque callback :

../_images/verbose.png

Une fois ce modèle exécuté, nous avons au bout de trois epochs les fichiers suivants dans le répertoire test :

../_images/callback2.png

Note

Nous n’allons pas conserver une sauvegarde par epoch car cela va générer un trop grand nombre de fichiers. Nous l’avons fait ici uniquement à titre d’exemple.

Garder une copie du réseau

En cas d’arrêt subi de votre session, nous avons vu que toutes les informations sur le disque étaient perdues. Il faut donc sauvegarder directement le réseau courant sur votre Google Drive dont les données sont persistantes. Pour cela, il faut d’abord monter le disque :

from google.colab import drive
drive.mount('/content/GoogleDrive/')

Ensuite, on utilise le callback habituel pour exporter l’état courant du réseau sur le drive :

destination = '/content/GoogleDrive/MyDrive/network.keras'
callbacks = [ keras.callbacks.ModelCheckpoint(destination, verbose = True) ]
model.fit(x=train_images, y=train_labels, epochs=3,callbacks=callbacks)

Ce qui donne comme résultat :

../_images/exemple.png

Archiver les métriques

Afin de tracer des courbes à la fin de plusieurs epochs, surtout si vous êtes interrompues par des arrêts de session, il peut être intéressant de sauvegarder les métriques dans un fichier.

folder = '/content/GoogleDrive/MyDrive/'
callbacks = [ keras.callbacks.ModelCheckpoint(folder+'network.keras', verbose = True),
              keras.callbacks.CSVLogger(folder+'model_history_log.csv', append=True) ]

model.fit(x=train_images, y=train_labels, epochs=3,callbacks=callbacks)