Tutoriel Apprentissage machine: Difference between revisions

From Alliance Doc
Jump to navigation Jump to search
(Marked this version for translation)
(Remplacer Calcul Canada par une formule neutre)
 
(23 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Draft}}
<languages />
<languages />
<translate>
<translate>


<!--T:32-->
<!--T:32-->
Cette page constitue un guide de démarrage servant à porter une tâche d'apprentissage automatique (Machine Learning, ML) sur une grappe Calcul Canada.
Cette page constitue un guide de démarrage servant à porter une tâche d'apprentissage automatique (Machine Learning) sur une de nos grappes.
 
== Étape 1: Enlever tout affichage graphique  == <!--T:63-->
 
<!--T:64-->
Modifiez votre programme afin qu'il n'utilise pas d'affichage graphique. Tout résultat graphique devra être écrit sur le disque dans un fichier, et visualisé sur votre ordinateur personnel, une fois la tâche terminée. Par exemple, si vous affichez des graphiques avec matplotlib, vous devez [https://stackoverflow.com/questions/4706451/how-to-save-a-figure-remotely-with-pylab enregistrer les graphiques sous forme de fichiers, au lieu de les afficher à l'écran].


== Étape 1: Archivage d'un ensemble de données == <!--T:33-->
== Étape 2: Archivage d'un ensemble de données == <!--T:33-->


<!--T:34-->
<!--T:34-->
Les systèmes de fichiers gérés par Calcul Canada sont conçus pour fonctionner avec une quantité limitée de gros fichiers. Assurez-vous que l'ensemble de données dont vous aurez besoin pour votre entraînement se trouve dans un fichier archive (tel que "tar"), que vous transférerez sur votre noeud de calcul au début de votre tâche. '''Si vous ne le faites pas, vous risquez de causer des lectures de fichiers à haute fréquence du noeud de stockage vers votre noeud de calcul, nuisant ainsi à la performance globale du système'''.
Les stockages partagés sur nos grappes ne sont pas optimisés pour gérer un grand nombre de petits fichiers (ils sont plutôt optimisés pour les très gros fichiers). Assurez-vous que l'ensemble de données dont vous aurez besoin pour votre entraînement se trouve dans un fichier archive (tel que "tar"), que vous transférerez sur votre nœud de calcul au début de votre tâche. '''Si vous ne le faites pas, vous risquez de causer des lectures de fichiers à haute fréquence du noeud de stockage vers votre nœud de calcul, nuisant ainsi à la performance globale du système'''. Si vous voulez apprendre davantage sur la gestion des grands ensembles de fichiers, on vous recommande la lecture de [https://docs.alliancecan.ca/wiki/Handling_large_collections_of_files/fr cette page].


<!--T:35-->
<!--T:35-->
Line 21: Line 24:
La commande ci-haut ne compresse pas les données. Si vous croyez que ce serait approprié, vous pouvez utiliser <tt>tar czf</tt>.
La commande ci-haut ne compresse pas les données. Si vous croyez que ce serait approprié, vous pouvez utiliser <tt>tar czf</tt>.


== Étape 2: Préparation de l'environnement virtuel == <!--T:38-->
== Étape 3: Préparation de l'environnement virtuel == <!--T:38-->
 
<!--T:65-->
[[Python/fr#Cr.C3.A9er_et_utiliser_un_environnement_virtuel|Créez un environnement virtuel]] dans votre espace home.
 
<!--T:66-->
Pour les détails d'installation et d'utilisation des différents frameworks d'apprentissage machine, référéz-vous à notre documentation:
 
<!--T:67-->
* [[PyTorch/fr|PyTorch]]
* [[TensorFlow/fr|TensorFlow]]
 
== Étape 4: Tâche interactive (salloc) == <!--T:68-->


<!--T:39-->
<!--T:39-->
Nous vous recommandons d'essayer votre tâche dans une [[Running_jobs/fr#T.C3.A2ches_interactives|tâche interactive]] avant de la soumettre avec un script (section suivante). Vous pourrez ainsi diagnostiquer plus rapidement les problèmes. Voici un exemple de demande de tâche interactive:
Nous vous recommandons d'essayer votre tâche dans une [[Running_jobs/fr#T.C3.A2ches_interactives|tâche interactive]] avant de la soumettre avec un script (section suivante). Vous pourrez ainsi diagnostiquer plus rapidement les problèmes. Voici un exemple de la commande pour soumettre une tâche interactive:
  $ salloc --account=def-someuser --gres=gpu:1 --cpus-per-task=6 --mem=32000M --time=1:00
</translate>
  $ salloc --account=def-someuser --gres=gpu:1 --cpus-per-task=3 --mem=32000M --time=1:00:00
<translate>
<!--T:69-->
Une fois dans la tâche:
Une fois dans la tâche:


<!--T:40-->
<!--T:40-->
* [[Python#Creating_and_using_a_virtual_environment|Créez et activez un environnement virtuel]] dans <tt>$SLURM_TMPDIR</tt> (cette variable pointe vers un dossier local, c'est-à-dire ''sur le noeud de calcul''). [[AI_and_Machine_Learning/fr#.C3.89viter_Anaconda|N'utilisez pas Anaconda]]. Par exemple:
* Activez votre environnement virtuel Python
$ virtualenv --no-download $SLURM_TMPDIR/env
* Installez les paquets dont vous avez besoin. Pour ''TensorFlow'', installez le paquet <tt>tensorflow_gpu</tt>; il s'agit d'une version optimisée pour nos systèmes.
* Tentez d'exécuter votre programme
* Tentez d'exécuter votre programme
* Installez les paquets manquants s'il y a lieu
* Installez les paquets manquants s'il y a lieu. Les noeuds de calcul n'ayant d'accès à Internet, vous devrez faire l'installation à partir d'un noeud de connexion. Référez-vous à notre [[Python/fr#Cr.C3.A9er_et_utiliser_un_environnement_virtuel|documentation sur les environnements virtuels Python]] pour plus de détails.
* Créez un fichier <tt>requirements.txt</tt> afin de pouvoir recréer l'environnement virtuel:
* Notez les étapes qui ont été nécessaires pour faire fonctionner le votre programme
(env) $ pip freeze > ~/requirements.txt


<!--T:41-->
<!--T:41-->
'''Maintenant est un bon moment pour vérifier que votre tâche lit et écrit le plus possible sur le noeud de calcul (<tt>$SLURM_TMPDIR</tt>), et le moins possible sur le noeud de stockage (home, scratch, project).'''
'''Maintenant est un bon moment pour vérifier que votre tâche lit et écrit le plus possible dans le stockage local au nœud de calcul (<tt>$SLURM_TMPDIR</tt>), et le moins possible sur les [[Storage_and_file_management/fr|systèmes de fichiers partagés (home, scratch, project)]].'''


== Étape 3: Préparation du script de soumission == <!--T:42-->
== Étape 5: Tâche scriptée (sbatch) == <!--T:42-->


<!--T:43-->
<!--T:43-->
Vous devez soumettre vos tâches à l'aide de scripts <tt>sbatch</tt>, afin qu'elles puissent être entièrement automatisées. Les tâches interactives servent uniquement à préparer et à déboguer des tâches.
Vous devez [[Running_jobs/fr#Soumettre_des_t.C3.A2ches_avec_sbatch|soumettre vos tâches]] à l'aide de scripts <tt>sbatch</tt>, afin qu'elles puissent être entièrement automatisées. Les tâches interactives servent uniquement à préparer et à déboguer des tâches qui seront ensuite exécutées entièrement et/ou à grande échelle en utilisant <tt>sbatch</tt>.


=== Éléments importants d'un script <tt>sbatch</tt> === <!--T:44-->
=== Éléments importants d'un script <tt>sbatch</tt> === <!--T:44-->
Line 61: Line 76:
=== Exemple de script === <!--T:46-->
=== Exemple de script === <!--T:46-->


<!--T:47-->
</translate>
 
{{File
{{File
   |name=ml-test.sh
   |name=ml-test.sh
Line 68: Line 84:
#!/bin/bash
#!/bin/bash
#SBATCH --gres=gpu:1      # Request GPU "generic resources"
#SBATCH --gres=gpu:1      # Request GPU "generic resources"
#SBATCH --cpus-per-task=6 # Cores proportional to GPUs: 6 on Cedar, 16 on Graham.
#SBATCH --cpus-per-task=3 # Refer to cluster's documentation for the right CPU/GPU ratio
#SBATCH --mem=32000M      # Memory proportional to GPUs: 32000 Cedar, 64000 Graham.
#SBATCH --mem=32000M      # Memory proportional to GPUs: 32000 Cedar, 47000 Béluga, 64000 Graham.
#SBATCH --time=0-03:00    # DD-HH:MM:SS
#SBATCH --time=0-03:00    # DD-HH:MM:SS
#SBATCH --output=%N-%j.out


<!--T:48-->
module load python/3.6 cuda cudnn
module load python/3.6 cuda cudnn


<!--T:49-->
SOURCEDIR=~/ml-test
SOURCEDIR=~/ml-test


<!--T:50-->
# Prepare virtualenv
# Prepare virtualenv
virtualenv --no-download $SLURM_TMPDIR/env
source ~/my_env/bin/activate
source $SLURM_TMPDIR/env/bin/activate
# You could also create your environment here, on the local storage ($SLURM_TMPDIR), for better performance. See our docs on virtual environments.
pip install --no-index -r $SOURCEDIR/requirements.txt


<!--T:51-->
# Prepare data
# Prepare data
mkdir $SLURM_TMPDIR/data
mkdir $SLURM_TMPDIR/data
tar xf ~/projects/def-xxxx/data.tar $SLURM_TMPDIR/data
tar xf ~/projects/def-xxxx/data.tar -C $SLURM_TMPDIR/data


<!--T:52-->
# Start training
# Start training
python $SOURCEDIR/train.py $SLURM_TMPDIR/data
python $SOURCEDIR/train.py $SLURM_TMPDIR/data
}}
}}
<translate>


=== Morcellement d'une longue tâche === <!--T:53-->
=== Morcellement d'une longue tâche === <!--T:53-->
Line 109: Line 120:
Le script de soumission ressemblera à ceci:
Le script de soumission ressemblera à ceci:


<!--T:57-->
</translate>
 
{{File
{{File
   |name=ml-test-chain.sh
   |name=ml-test-chain.sh
Line 118: Line 130:
#SBATCH ...
#SBATCH ...


<!--T:58-->
module load python/3.6 cuda cudnn
module load python/3.6 cuda cudnn


<!--T:59-->
# Prepare virtualenv
# Prepare virtualenv
...
...


<!--T:60-->
# Prepare data
# Prepare data
...
...


<!--T:61-->
# Get most recent checkpoint
# Get most recent checkpoint (this example is for PyTorch *.pth checkpoint files)
CHECKPOINT_EXT='*.h5'  # Replace by *.pt for PyTorch checkpoints
export CHECKPOINTS=~/scratch/checkpoints/ml-test
CHECKPOINTS=~/scratch/checkpoints/ml-test
LAST_CHECKPOINT=$(find . -maxdepth 1 -name "$CHECKPOINTS/*.pth" -print0 {{!}} xargs -r -0 ls -1 -t {{!}} head -1)
LAST_CHECKPOINT=$(find $CHECKPOINTS -maxdepth 1 -name "$CHECKPOINT_EXT" -print0 {{!}} xargs -r -0 ls -1 -t {{!}} head -1)


<!--T:62-->
# Start training
# Start training
if [ -n "$LAST_CHECKPOINT" ]; then
if [ -z "$LAST_CHECKPOINT" ]; then
     # $LAST_CHECKPOINT is null; start from scratch
     # $LAST_CHECKPOINT is null; start from scratch
     python $SOURCEDIR/train.py --write-checkpoints-to $CHECKPOINTS ...
     python $SOURCEDIR/train.py --write-checkpoints-to $CHECKPOINTS ...
else
else
     python $SOURCEDIR/train.py --load-checkpoint $CHECKPOINTS/$LAST_CHECKPOINT --write-checkpoints-to $CHECKPOINTS ...
     python $SOURCEDIR/train.py --load-checkpoint $LAST_CHECKPOINT --write-checkpoints-to $CHECKPOINTS ...
fi
fi
}}
}}
<translate>


</translate>
</translate>

Latest revision as of 17:16, 31 March 2023

Other languages:

Cette page constitue un guide de démarrage servant à porter une tâche d'apprentissage automatique (Machine Learning) sur une de nos grappes.

Étape 1: Enlever tout affichage graphique

Modifiez votre programme afin qu'il n'utilise pas d'affichage graphique. Tout résultat graphique devra être écrit sur le disque dans un fichier, et visualisé sur votre ordinateur personnel, une fois la tâche terminée. Par exemple, si vous affichez des graphiques avec matplotlib, vous devez enregistrer les graphiques sous forme de fichiers, au lieu de les afficher à l'écran.

Étape 2: Archivage d'un ensemble de données

Les stockages partagés sur nos grappes ne sont pas optimisés pour gérer un grand nombre de petits fichiers (ils sont plutôt optimisés pour les très gros fichiers). Assurez-vous que l'ensemble de données dont vous aurez besoin pour votre entraînement se trouve dans un fichier archive (tel que "tar"), que vous transférerez sur votre nœud de calcul au début de votre tâche. Si vous ne le faites pas, vous risquez de causer des lectures de fichiers à haute fréquence du noeud de stockage vers votre nœud de calcul, nuisant ainsi à la performance globale du système. Si vous voulez apprendre davantage sur la gestion des grands ensembles de fichiers, on vous recommande la lecture de cette page.

En supposant que les fichiers dont vous avez besoin sont dans le dossier mydataset:

$ tar cf mydataset.tar mydataset/*

La commande ci-haut ne compresse pas les données. Si vous croyez que ce serait approprié, vous pouvez utiliser tar czf.

Étape 3: Préparation de l'environnement virtuel

Créez un environnement virtuel dans votre espace home.

Pour les détails d'installation et d'utilisation des différents frameworks d'apprentissage machine, référéz-vous à notre documentation:

Étape 4: Tâche interactive (salloc)

Nous vous recommandons d'essayer votre tâche dans une tâche interactive avant de la soumettre avec un script (section suivante). Vous pourrez ainsi diagnostiquer plus rapidement les problèmes. Voici un exemple de la commande pour soumettre une tâche interactive:

$ salloc --account=def-someuser --gres=gpu:1 --cpus-per-task=3 --mem=32000M --time=1:00:00

Une fois dans la tâche:

  • Activez votre environnement virtuel Python
  • Tentez d'exécuter votre programme
  • Installez les paquets manquants s'il y a lieu. Les noeuds de calcul n'ayant d'accès à Internet, vous devrez faire l'installation à partir d'un noeud de connexion. Référez-vous à notre documentation sur les environnements virtuels Python pour plus de détails.
  • Notez les étapes qui ont été nécessaires pour faire fonctionner le votre programme

Maintenant est un bon moment pour vérifier que votre tâche lit et écrit le plus possible dans le stockage local au nœud de calcul ($SLURM_TMPDIR), et le moins possible sur les systèmes de fichiers partagés (home, scratch, project).

Étape 5: Tâche scriptée (sbatch)

Vous devez soumettre vos tâches à l'aide de scripts sbatch, afin qu'elles puissent être entièrement automatisées. Les tâches interactives servent uniquement à préparer et à déboguer des tâches qui seront ensuite exécutées entièrement et/ou à grande échelle en utilisant sbatch.

Éléments importants d'un script sbatch

  1. Compte sur lequel les ressources seront "facturées"
  2. Ressources demandées:
    1. Nombre de CPU, suggestion: 6
    2. Nombre de GPU, suggestion: 1 (Utilisez un (1) seul GPU, à moins d'être certain que votre programme en utilise plusieurs. Par défaut, TensorFlow et PyTorch utilisent un seul GPU.)
    3. Quantité de mémoire, suggestion: 32000M
    4. Durée (Maximum Béluga: 7 jours, Graham et Cedar: 28 jours)
  3. Commandes bash:
    1. Préparation de l'environnement (modules, virtualenv)
    2. Transfert des données vers le noeud de calcul
    3. Lancement de l'exécutable

Exemple de script

File : ml-test.sh

#!/bin/bash
#SBATCH --gres=gpu:1       # Request GPU "generic resources"
#SBATCH --cpus-per-task=3  # Refer to cluster's documentation for the right CPU/GPU ratio
#SBATCH --mem=32000M       # Memory proportional to GPUs: 32000 Cedar, 47000 Béluga, 64000 Graham.
#SBATCH --time=0-03:00     # DD-HH:MM:SS

module load python/3.6 cuda cudnn

SOURCEDIR=~/ml-test

# Prepare virtualenv
source ~/my_env/bin/activate
# You could also create your environment here, on the local storage ($SLURM_TMPDIR), for better performance. See our docs on virtual environments.

# Prepare data
mkdir $SLURM_TMPDIR/data
tar xf ~/projects/def-xxxx/data.tar -C $SLURM_TMPDIR/data

# Start training
python $SOURCEDIR/train.py $SLURM_TMPDIR/data



Morcellement d'une longue tâche

Nous vous recommandons de morceler vos tâches en blocs de 24 heures. Demander des tâches plus courtes améliore votre priorité. En créant une chaîne de tâches, il est possible de dépasser la limite de 7 jours sur Béluga.

  1. Modifiez votre script de soumission (ou votre programme) afin que votre tâche puisse être interrompue et continuée. Votre programme doit pouvoir accéder au checkpoint le plus récent. (Voir l'exemple de script ci-dessous.)
  2. Vérifiez combien d'epochs (ou d'itérations) peuvent être effectuées à l'intérieur de 24 heures.
  3. Calculez combien de blocs de 24 heures vous aurez besoin: n_blocs = n_epochs_total / n_epochs_par_24h
  4. Utilisez l'argument --array 1-<n_blocs>%1 pour demander une chaine de n_blocs tâches.

Le script de soumission ressemblera à ceci:


File : ml-test-chain.sh

#!/bin/bash
#SBATCH --array=1-10%1   # 10 is the number of jobs in the chain
#SBATCH ...

module load python/3.6 cuda cudnn

# Prepare virtualenv
...

# Prepare data
...

# Get most recent checkpoint
CHECKPOINT_EXT='*.h5'  # Replace by *.pt for PyTorch checkpoints
CHECKPOINTS=~/scratch/checkpoints/ml-test
LAST_CHECKPOINT=$(find $CHECKPOINTS -maxdepth 1 -name "$CHECKPOINT_EXT" -print0 | xargs -r -0 ls -1 -t | head -1)

# Start training
if [ -z "$LAST_CHECKPOINT" ]; then
    # $LAST_CHECKPOINT is null; start from scratch
    python $SOURCEDIR/train.py --write-checkpoints-to $CHECKPOINTS ...
else
    python $SOURCEDIR/train.py --load-checkpoint $LAST_CHECKPOINT --write-checkpoints-to $CHECKPOINTS ...
fi