Intelligence artificielle et apprentissage machine

From CC Doc
Jump to navigation Jump to search
This site replaces the former Compute Canada documentation site, and is now being managed by the Digital Research Alliance of Canada.

Ce site remplace l'ancien site de documentation de Calcul Canada et est maintenant géré par l'Alliance de recherche numérique du Canada.

This page is a translated version of the page AI and Machine Learning and the translation is 100% complete.
Other languages:
English • ‎français

Pour tirer le maximum de vos applications d'apprentissage machine, il faut connaître certains aspects particuliers des grappes. Ces machines sont beaucoup plus complexes que l'ordinateur local avec lequel vous faites du prototypage. Entre autres, une grappe possède des systèmes de fichiers distribués qui vont d'un type de stockage à un autre de façon transparente. Bien que l'accès à un fichier dans /project donne l'impression de se faire de la même manière que s'il était situé dans le nœud courant, sous le capot les effets sur la performance sont bien différents. Il est donc important de prendre connaissance de la section Gérer vos ensembles de données ci-dessous.

Cette page contient les bonnes pratiques dans l'utilisation des grappes et des références à de l'information utile.

Tutoriels

Si votre programme est prêt à être exécuté sur nos grappes, consultez notre tutoriel.

Voyez aussi ce tutoriel préparé par un utilisateur, qui décrit les étapes pour configurer votre environnement et celui de Calcul Canada avec Python.

Python

Python est un logiciel populaire en apprentissage machine. Prenez connaissance de notre page wiki pour des renseignements importants sur les versions, les environnements virtuels, les nœuds de connexion et de calcul, le multiprocessing, Anaconda, Jupyter, etc.

Éviter Anaconda

Nous vous recommandons d'utiliser virtualenv pour éviter les problèmes suivants causés par Anaconda :

  • prend en charge la gestion des bibliothèques, ce qui devrait être réservé au personnel;
    • utilise des binaires qui ne sont pas adaptés à une architecture de CPU particulière;
  • reconnaît mal la localisation des bibliothèques;
  • s'installe par défaut dans /home et y conserve un grand nombre de fichiers, alors que des environnements virtuels sont installés sur les nœuds de calcul, autant que possible;
  • prend plus de temps à installer des paquets;
  • modifie bashrc, ce qui crée des conflits.

Dans la plupart des cas, il est facile de passer à virtualenv. Vous n'avez qu'à installer les mêmes paquets, à l'exception de CUDA, CuDNN et d'autres bibliothèques de bas niveau qui sont déjà sur nos grappes.

Information sur les paquets logiciels disponibles

Pour des renseignements sur l'installation et les problèmes fréquents, voyez la page wiki pour chacun des paquets suivants :

Gérer vos ensembles de données

Stockage et gestion de fichiers

Les besoins de nos utilisateurs sont diversifiés; nous offrons donc plusieurs solutions qui vont du stockage local temporaire haute vitesse au stockage à long terme sur différents supports. Pour plus d'information, voyez Stockage et gestion de fichiers.

Choisir le type de stockage selon la taille de votre ensemble de données

  • Si votre ensemble de données est d'environ 10Go ou moins, il entre probablement dans la mémoire, dépendant de la quantité de mémoire de votre tâche. Votre tâche d'apprentissage machine ne devrait pas lire de données sur disque.
  • Si votre ensemble de données est d'environ 100Go ou moins, il entre dans l'espace de stockage local du nœud de calcul; transférez-le dans cet espace au début de la tâche puisqu'il est beaucoup plus rapide et fiable que les espaces partagés que sont /home, /project et /scratch. Pour chaque tâche, un répertoire temporaire est disponible à $SLURM_TMPDIR; voyez l'exemple de notre tutoriel. Il faut toutefois savoir qu'une tâche d'un autre utilisateur peut occuper pleinement l'espace de stockage du nœud et ne vous laisser aucune place (nous cherchons une solution à ce problème); par contre, si c'est votre jour de chance, vous pourriez avoir un téraoctet juste pour vous.
  • Si votre ensemble de données est plus grand, vous pourriez devoir le laisser dans un espace partagé. Vous pouvez stocker des données de façon permanente dans votre espace /project; l'espace /scratch est parfois plus rapide, mais n'est pas conçu pour du stockage permanent. Tous les espaces de stockage partagés (/home, /project et /scratch) servent à lire et à stocker des données à faible fréquence (par exemple, 1 gros bloc par 10 secondes plutôt que 10 petits blocs par seconde).

Ensembles de données composés de plusieurs petits fichiers

En apprentissage machine, il est fréquent d'avoir des ensembles de données composés de centaines et même de milliers de fichiers, par exemple dans le cas des ensembles de données d'images. Chacun des fichiers peut être de petite taille, souvent en deçà de quelques centaines de kilo-octets et dans ces cas, certains problèmes peuvent survenir :

  • le système de fichiers impose un quota qui restreint le nombre de fichiers,
  • l'application est considérablement ralentie par le transfert des fichiers de /project ou /scratch vers un nœud de calcul.

Avec un système de fichiers distribué, les données devraient être rassemblées dans un seul fichier d'archive; voyez Travailler avec un grand nombre de fichiers.

Calculs de longue durée

Si vos calculs exigent beaucoup de temps, il est recommandé d'utiliser des points de contrôle (checkpoints); par exemple, plutôt que trois jours d'entraînement, vous pourriez avoir trois blocs de 24 heures chacun. De cette manière, votre travail ne serait pas perdu en cas de panne et vous pourriez bénéficier d'une meilleure priorisation de vos tâches puisqu'il y a plus de nœuds qui sont réservés pour les tâches courtes. Votre bibliothèque préférée supporte probablement les checkpoints; voyez le cas type présenté dans notre tutoriel. Si votre programme ne le permet pas, consultez la solution générique.

Voir les autres exemples dans

Points de contrôle PyTorch

Points de contrôle TensorFlow

Exécution de plusieurs tâches similaires

Dans un des cas suivants :

  • recherche d'hyperparamètres,
  • entraînement de plusieurs variantes d'une même méthode,
  • exécution de plusieurs processus d'optimisation de même durée,

vous devriez grouper plusieurs tâches pour n'en former qu'une avec un outil comme META, GLOST ou GNU Parallel.

Suivi de l'expérimentation et optimisation des hyperparamètres

Weights & Biases (wandb) et Comet.ml peuvent vous aider à optimiser votre allocation de calcul en

  • facilitant le suivi et l'analyse des processus d'apprentissage,
  • permettant une optimisation bayésienne d'hyperparamètres.

Comet et Wandb ne sont pas disponibles présentement sur Graham.

Apprentissage machine à grande échelle (mégadonnées)

Les paquets d'apprentissage profond modernes comme PyTorch et Tensorflow offrent des utilitaires pour les travaux natifs d’apprentissage à grande échelle et les tutoriels sont nombreux. Un sujet peu abordé par contre est la scalabilité des méthodes classiques d’apprentissage machine (et non d’apprentissage profond) pour le travail avec de grands ensembles de données; à ce sujet, voir la page wiki Apprentissage machine à grande échelle (mégadonnées).

Dépannage

Déterminisme dans les réseaux de neurones récurrents avec CUDA

Quand la bibliothèque cuDNN est présente dans CUDA Toolkit versions 10.2 et plus, il est possible de voir un comportement non déterministe dans les réseaux de neurones récurrents (RNN) et les appels à l’API d’auto-attention multitêtes. Pour éviter ce problème, vous pouvez configurer la variable d’environnement CUBLAS_WORKSPACE_CONFIG avec une seule taille pour la mémoire tampon, par exemple :16:8 ou :4096:2. Ainsi, cuBLAS fixe la mémoire GPU à 8 tampons de 16Ko chacun ou à 2 tampons de 4Mo chacun.