Version 5, last updated by fsavard at April 19, 2010 15:05 UTC

 

Expérience avec Jobman

  • Si vous voulez avoir accès à vos données pendant que l'expérience s'exécute, vous pouvez lire sur "jobman cachesync" (faire "jobman help cachesync"). J'en ai parlé un peu en classe ce matin (10 mars). Rapidement, ça prend les données enregistrées dans le répertoire de travail sur la machine du cluster exécutant votre job, et ça synchronise ces données avec le répertoire de travail que vous avez donné à jobman. (J'ai écrit ça car j'étais un peu mêlé au début; je ne voyais pas mes résultats dans le répertoire.) -- fsavard
  • Pour l'insertion de combinaisons d'hyperparamètres (produit cartésien des learning rates possibles, nombres de couches possible, etc.), on peut utiliser les notations "{{1,2,3...}}" avec dbidispatch et jobman. Je préfère faire l'insertion avec Python (voir l'exemple dans jobman/doc/addition_exp_sql.txt). Si vous procédez comme ça, pour le produit cartésien, regardez dans deep/stacked_dae/nist_sda.py, j'ai une petite fonction/notation pour le faire. -- fsavard

Analyse des modèles

  • Pour la première couche d'un réseau de neurones, on a l'habitude de visualiser les poids qui correspondent à chaque unité cachée. Ces poids ont la même taille que les entrées (qui sont des images de 32x32 ou 28x28) et représentent un sorte de "filtre" qui est appliqué sur l'image. Parfois on peut avoir une compréhension plus approfondie d'une modèle en utilisant une telle visualisation. Par exemple, le niveau de bruit change assez significativement le genre de filtres qu'on obtient avec un auto-encodeur débruitant, quand on entraîne sur (M)NIST. On peut voir un exemple de ce genre de filtres dans de tutoriel deep learning: (en bas). Le code avec des explications est ici. -- dumitru

Sauver version des libraries utilisé

import theano,pylearn.version,ift6266

def experiment(state, channel):
...
pylearn.version.record_versions(state,[theano,ift6266,pylearn])
...

SVP ajouté cela dans tous vos scripts et ajouté les autres modules si vous en utiliser plus. Cela permet de savoir comment regénéré les expériences si nécessaire.

Copier le code pour pouvoir le figer pendant qu'une expérience roule

On a discuté un peu en classe de ce problème, mercredi matin (17 mars 2010). En gros, les expériences sont longues à rouler, donc pendant qu'elles roulent (et si on les relance etc.) on va vouloir faire des modifications dans le code, mais on voudrait conserver l'ancienne version disponible pour que les jobs en attente sur le cluster utilisent l'ancienne version lorsqu'elles partiront.

Une façon de faire simple consiste à copier tout le code "ift6266" dans un autre répertoire. Y'a cependant un problème avec les imports en Python. Y'a beaucoup d'endroits où on fait "import ift6266.qqch", notamment. Hors si on ne fait pas attention, ces imports vont utiliser le code original, pas la copie, contournant notre intention.

Vous pouvez voir la façon dont je procède pour régler le problème en regardant dans "ift6266/deep/stacked_dae/config.py.example". Y'a une section, au haut du fichier, qui modifie "sys.path" (qui hérite du contenu de la variable d'environnement $PYTHONPATH) pour inclure le path de la copie et rejeter l'ancien path d'import (le répertoire "dev_code", ie. le code de développement, "l'original"). Ça vérifie aussi, après l'import, que cet import a été fait du bon endroit (sinon ça lance une exception).

Pour complémenter aux explications là-dedans, voici comment faire la copie avant de lancer une expérience:

  • Faites un "commit" et un "push" de votre version courante de développement.
    • Si vous ne faites pas ça, votre copie ne pourra pas être faites avec la commande "clone" ci-bas.
  • Créez quelque part votre répertoire de copie. Pour correspondre au contenu dans config.py.example, disons qu'on l'appelle "ift6266_experiment10".
    • Vous devez ajouter le répertoire parent de "ift6266_experiment10" dans votre $PYTHONPATH, dans votre fichier /home/username/.bashrc.
  • Dans ce répertoire, créez un fichier nommé "__init__.py" (par exemple, faites la commande "touch __init__.py").
  • Toujours dans "ift6266_experiment10", roulez la commande "hg clone http://hg.assembla.com/ift6266 ift6266".
  • Copiez ensuite la section au haut de config.py.example (identifiée par les lignes) de façon à ce qu'elle roule très tôt, idéalement avant tous vos imports dans le fichier Python dans lequel se trouve votre fonction d'expérience (celle qui va être appelée par "jobman sql").
    • Si vous ne le faites pas en premier, il risquerait d'y avoir des imports du mauvais emplacement.
    • Une façon simple de faire consiste à copier config.py.example en tant que "config.py" dans le répertoire de votre script d'expérience et de faire "from config import *" dès le début de votre fichier contenant l'expérience.
  • Configurez cette section selon les instructions qui y sont contenues.

Vous pouvez faire autant de copies, pour autant d'expériences, que vous voulez, selon ce procédé.

Un autre truc, au passage: vous pouvez utiliser le répertoire de copie (ici "ift6266_experiment10") et y créer un sous-répertoire "results". Ensuite vous lancez jobman à partir de ce répertoire, et ça vous permet de grouper le code et les résultats de l'expérience en un seul endroit.

-- fsavard