Tutoriel Apprentissage machine: Difference between revisions
m (Lemc2220 a déplacé la page Guide ML vers Tutoriel Apprentissage machine) |
(Marked this version for translation) |
||
Line 4: | Line 4: | ||
<translate> | <translate> | ||
<!--T:1--> | |||
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, ML) sur une grappe Calcul Canada. | ||
== Étape 1: Archivage d'un ensemble de données == | == Étape 1: Archivage d'un ensemble de données == <!--T:2--> | ||
<!--T:3--> | |||
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 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'''. | ||
<!--T:4--> | |||
En supposant que les fichiers dont vous avez besoin sont dans le dossier <tt>mydataset</tt>: | En supposant que les fichiers dont vous avez besoin sont dans le dossier <tt>mydataset</tt>: | ||
$ tar cf mydataset.tar mydataset/* | <!--T:5--> | ||
$ tar cf mydataset.tar mydataset/* | |||
<!--T:6--> | |||
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 == | == Étape 2: Préparation de l'environnement virtuel == <!--T:7--> | ||
<!--T:8--> | |||
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 demande de tâche interactive: | ||
$ salloc --account=def-someuser --gres=gpu:1 --cpus-per-task=6 --mem=32000M --time=1:00 | $ salloc --account=def-someuser --gres=gpu:1 --cpus-per-task=6 --mem=32000M --time=1:00 | ||
Une fois dans la tâche: | Une fois dans la tâche: | ||
<!--T:9--> | |||
* [[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: | * [[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: | ||
$ virtualenv --no-download $SLURM_TMPDIR/env | $ virtualenv --no-download $SLURM_TMPDIR/env | ||
Line 30: | Line 37: | ||
(env) $ pip freeze > ~/requirements.txt | (env) $ pip freeze > ~/requirements.txt | ||
<!--T:10--> | |||
'''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 sur le noeud de calcul (<tt>$SLURM_TMPDIR</tt>), et le moins possible sur le noeud de stockage (home, scratch, project).''' | ||
== Étape 3: Préparation du script de soumission == | == Étape 3: Préparation du script de soumission == <!--T:11--> | ||
<!--T:12--> | |||
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 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. | ||
=== Éléments importants d'un script <tt>sbatch</tt> === | === Éléments importants d'un script <tt>sbatch</tt> === <!--T:13--> | ||
<!--T:14--> | |||
# Compte sur lequel les ressources seront "facturées" | # Compte sur lequel les ressources seront "facturées" | ||
# Ressources demandées: | # Ressources demandées: | ||
Line 49: | Line 59: | ||
## Lancement de l'exécutable | ## Lancement de l'exécutable | ||
=== Exemple de script === | === Exemple de script === <!--T:15--> | ||
<!--T:16--> | |||
{{File | {{File | ||
|name=ml-test.sh | |name=ml-test.sh | ||
Line 62: | Line 73: | ||
#SBATCH --output=%N-%j.out | #SBATCH --output=%N-%j.out | ||
<!--T:17--> | |||
module load python/3.6 cuda cudnn | module load python/3.6 cuda cudnn | ||
<!--T:18--> | |||
SOURCEDIR=~/ml-test | SOURCEDIR=~/ml-test | ||
<!--T:19--> | |||
# Prepare virtualenv | # Prepare virtualenv | ||
virtualenv --no-download $SLURM_TMPDIR/env | virtualenv --no-download $SLURM_TMPDIR/env | ||
Line 71: | Line 85: | ||
pip install --no-index -r $SOURCEDIR/requirements.txt | pip install --no-index -r $SOURCEDIR/requirements.txt | ||
<!--T:20--> | |||
# 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 $SLURM_TMPDIR/data | ||
<!--T:21--> | |||
# Start training | # Start training | ||
python $SOURCEDIR/train.py $SLURM_TMPDIR/data | python $SOURCEDIR/train.py $SLURM_TMPDIR/data | ||
}} | }} | ||
=== Morcellement d'une longue tâche === | === Morcellement d'une longue tâche === <!--T:22--> | ||
<!--T:23--> | |||
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. | 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. | ||
<!--T:24--> | |||
# 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.) | # 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.) | ||
# Vérifiez combien d'epochs (ou d'itérations) peuvent être effectuées à l'intérieur de 24 heures. | # Vérifiez combien d'epochs (ou d'itérations) peuvent être effectuées à l'intérieur de 24 heures. | ||
Line 88: | Line 106: | ||
# Utilisez l'argument <tt>--array 1-<n_blocs>%1</tt> pour demander une chaine de <tt>n_blocs</tt> tâches. | # Utilisez l'argument <tt>--array 1-<n_blocs>%1</tt> pour demander une chaine de <tt>n_blocs</tt> tâches. | ||
<!--T:25--> | |||
Le script de soumission ressemblera à ceci: | Le script de soumission ressemblera à ceci: | ||
<!--T:26--> | |||
{{File | {{File | ||
|name=ml-test-chain.sh | |name=ml-test-chain.sh | ||
Line 98: | Line 118: | ||
#SBATCH ... | #SBATCH ... | ||
<!--T:27--> | |||
module load python/3.6 cuda cudnn | module load python/3.6 cuda cudnn | ||
<!--T:28--> | |||
# Prepare virtualenv | # Prepare virtualenv | ||
... | ... | ||
<!--T:29--> | |||
# Prepare data | # Prepare data | ||
... | ... | ||
<!--T:30--> | |||
# Get most recent checkpoint (this example is for PyTorch *.pth checkpoint files) | # Get most recent checkpoint (this example is for PyTorch *.pth checkpoint files) | ||
export CHECKPOINTS=~/scratch/checkpoints/ml-test | export 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 . -maxdepth 1 -name "$CHECKPOINTS/*.pth" -print0 {{!}} xargs -r -0 ls -1 -t {{!}} head -1) | ||
<!--T:31--> | |||
# Start training | # Start training | ||
if [ -n "$LAST_CHECKPOINT" ]; then | if [ -n "$LAST_CHECKPOINT" ]; then |
Revision as of 20:33, 2 October 2019
This is not a complete article: This is a draft, a work in progress that is intended to be published into an article, which may or may not be ready for inclusion in the main wiki. It should not necessarily be considered factual or authoritative.
Cette page constitue un guide de démarrage servant à porter une tâche d'apprentissage automatique (Machine Learning, ML) sur une grappe Calcul Canada.
Étape 1: Archivage d'un ensemble de données
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.
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 2: Préparation de l'environnement virtuel
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 demande de tâche interactive:
$ salloc --account=def-someuser --gres=gpu:1 --cpus-per-task=6 --mem=32000M --time=1:00
Une fois dans la tâche:
- Créez et activez un environnement virtuel dans $SLURM_TMPDIR (cette variable pointe vers un dossier local, c'est-à-dire sur le noeud de calcul). N'utilisez pas Anaconda. Par exemple:
$ virtualenv --no-download $SLURM_TMPDIR/env
- Installez les paquets dont vous avez besoin. Pour TensorFlow, installez le paquet tensorflow_gpu; il s'agit d'une version optimisée pour nos systèmes.
- Tentez d'exécuter votre programme
- Installez les paquets manquants s'il y a lieu
- Créez un fichier requirements.txt afin de pouvoir recréer l'environnement virtuel:
(env) $ pip freeze > ~/requirements.txt
Maintenant est un bon moment pour vérifier que votre tâche lit et écrit le plus possible sur le noeud de calcul ($SLURM_TMPDIR), et le moins possible sur le noeud de stockage (home, scratch, project).
Étape 3: Préparation du script de soumission
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.
Éléments importants d'un script sbatch
- Compte sur lequel les ressources seront "facturées"
- Ressources demandées:
- Nombre de CPU, suggestion: 6
- 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.)
- Quantité de mémoire, suggestion: 32000M
- Durée (Maximum Béluga: 7 jours, Graham et Cedar: 28 jours)
- Commandes bash:
- Préparation de l'environnement (modules, virtualenv)
- Transfert des données vers le noeud de calcul
- Lancement de l'exécutable
Exemple de script
#!/bin/bash
#SBATCH --gres=gpu:1 # Request GPU "generic resources"
#SBATCH --cpus-per-task=6 # Cores proportional to GPUs: 6 on Cedar, 16 on Graham.
#SBATCH --mem=32000M # Memory proportional to GPUs: 32000 Cedar, 64000 Graham.
#SBATCH --time=0-03:00 # DD-HH:MM:SS
#SBATCH --output=%N-%j.out
module load python/3.6 cuda cudnn
SOURCEDIR=~/ml-test
# Prepare virtualenv
virtualenv --no-download $SLURM_TMPDIR/env
source $SLURM_TMPDIR/env/bin/activate
pip install --no-index -r $SOURCEDIR/requirements.txt
# Prepare data
mkdir $SLURM_TMPDIR/data
tar xf ~/projects/def-xxxx/data.tar $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.
- 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.)
- Vérifiez combien d'epochs (ou d'itérations) peuvent être effectuées à l'intérieur de 24 heures.
- Calculez combien de blocs de 24 heures vous aurez besoin: n_blocs = n_epochs_total / n_epochs_par_24h
- Utilisez l'argument --array 1-<n_blocs>%1 pour demander une chaine de n_blocs tâches.
Le script de soumission ressemblera à ceci:
#!/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 (this example is for PyTorch *.pth checkpoint files)
export CHECKPOINTS=~/scratch/checkpoints/ml-test
LAST_CHECKPOINT=$(find . -maxdepth 1 -name "$CHECKPOINTS/*.pth" -print0 | xargs -r -0 ls -1 -t | head -1)
# Start training
if [ -n "$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 $CHECKPOINTS/$LAST_CHECKPOINT --write-checkpoints-to $CHECKPOINTS ...
fi