ivadomed / ivadomed

Repository on the collaborative IVADO medical imaging project between the Mila and NeuroPoly labs.
https://ivadomed.org
MIT License
154 stars 149 forks source link

Cannot use automate_training on Compute Canada cluster #496

Open jcohenadad opened 3 years ago

jcohenadad commented 3 years ago

Based on internal discussions, it appears that the script automate_training.py does not run on Compute Canada. The problem might be coming from the allocation of specific GPUs via this script.

The purpose of this issue is to document the problem, what has been tried, the communication with Compute Canada, and (ultimately) the solution. So that, in the future, if others run into the same problem, they can start from this issue thread instead of re-investigating from the beginning (and re-emailing Compute Canada folks with the same question).

andreanne-lemay commented 3 years ago

Here is the email thread, I had with someone from Compute Canada. The error he mentioned in the latest email was not related to the current issue "J'ai essayé de rouler le script, et au lieu d'avoir un manque de mémoire, j'ai eu une autre erreur. ", but his hypothesis about the problem coming from our code is probably valid. After this e-mail, I got caught up with other experiments and stopped investigating this matter.

Bonjour Andreanne Lemay,

J'ai essayé de rouler le script, et au lieu d'avoir un manque de mémoire, j'ai eu une autre erreur. Voyez le log ici: /home/anlemj/scratch/.support/slurm-50677549.out

J'ai regardé un peu comment ça fonctionne, et la seule explication que je vois est qu'il y a un bug à quelque part dans le code que vous utilisez. Il semble qu'il faudrait vérifier que le code place bien les tenseurs et les poids sur le bon GPU, ce qui peut demander une étape supplémentaire lors qu'on charge les poids d'un modèle à partir d'un fichier.

L'environnement GPU sur cedar ne devrait pas être différent de celui sur votre cluster interne. Lorsque vous demandez N gpus, ils ont les indices 0 à N-1.

Sur votre cluster interne, est-ce que vous utilisez un seul processus CPU par GPU?

Quel est la quantité de mémoire par GPU sur votre cluster interne?

Cordialement,

-- Carl Lemaire Compute Canada - Calcul Canada Calcul Québec: Université de Sherbrooke

View this ticket here / Voyez ce billet ici: https://support.computecanada.ca/otrs/customer.pl?Action=CustomerTicketZoom;TicketID=102620

2020-09-14 10:59 (-4) - Andreanne Lemay wrote:

Bonjour,

Le script sbatch est situé à cet endroit: /home/anlemj/scratch/lumbar.sh et le script python qui gère le parallélisme: /home/anlemj/ivadomed/ivadomed/scripts/automate_training.py. Le gpu id sont situés dans le fichier de configuration /home/anlemj/ivadomed/ivadomed/config/config_lumbar.json.

Sur le cluster intern, je partirais le training parallèle avec la même ligne utilisée sur Compute Canada: python /home/anlemj/ivadomed/ivadomed/scripts/automate_training.py -p /home/anlemj/ivadomed/ivadomed/config/hyperparamters.json -c /home/anlemj/ivadomed/ivadomed/config/config_lumbar.json -l --run-test -n 3. Si je voulais partir le training sur les gpus 0, 1, 2 et 3, dans mon fichier de configuration (ici config_lumbar.json) je mettrais la clé gpu égale à la liste suivante: [0, 1, 2, 3]. Sur Compute Canada, j'ai essayé plusieurs trucs en lien avec les gpu ids, sans succès.

Merci encore pour votre assistance,

Andréanne

On 9/14/20 10:32 AM, Carl Lemaire via Compute Canada Support wrote:

Bonjour Andreanne Lemay,

J'aurais besoin de savoir exactement comment vous lancez l'entraînement sur votre cluster interne, et comment vous essayez sur Compute Canada. Vous pouvez me donner le chemin vers votre script sbatch, et m'indiquer quel est le script python qui gère le parallélisme.

Cordialement,

-- Carl Lemaire Compute Canada - Calcul Canada Calcul Québec: Université de Sherbrooke

View this ticket here / Voyez ce billet ici: https://support.computecanada.ca/otrs/customer.pl?Action=CustomerTicketZoom;TicketID=102620

2020-09-14 00:08 (-4) - Andreanne Lemay wrote:

Bonjour M. Lemaire,

J'ai augmenté le nombre de cpus-per-task, par contre je dépasse la mémoire disponible sur le GPU me laissant encore croire que les processus ne sont pas roulés sur différents GPUs, mais sur le même. Lorsque je roule seulement 1 processus sur 1 GPU je n'ai jamais cette erreur.

Également lorsque je roule ce même script sur un cluster de GPU interne (qui n'est pas Compute Canada) le parallélisme s'effectue bien; chaque processus roule sur un GPU distinct. Toutefois, j'indique quels numéros de GPUs j'utilise ce que je ne peux pas faire ici, peut-être le problème vient-il de là?

Merci,

Andréanne Lemay

On 9/11/20 3:42 PM, Carl Lemaire via Compute Canada Support wrote:

Bonjour Andreanne,

Je pense que un seul coeur par entraînement ne sera pas suffisant. Essayez avec 3, donc un total de 12 cpus-per-task.

Cordialemement,

-- Carl Lemaire Compute Canada - Calcul Canada Calcul Québec: Université de Sherbrooke

View this ticket here / Voyez ce billet ici: https://support.computecanada.ca/otrs/customer.pl?Action=CustomerTicketZoom;TicketID=102620

2020-09-11 10:15 (-4) - Andreanne Lemay wrote:

Bonjour M. Lemaire,

Merci pour votre réponse rapide! J'essaye d'exécuter des entrainements indépendants en parallèle. Combien de cpus-per-task devrais-je prendre? Par exemple, je viens de prendre 1 seul noeud avec 4 gpus et j'ai m cpus-per-task à 4, pourtant les 4 entrainements ne semblent pas rouler en parallèle: 2 s'entraînent et 2 stagnent.

Merci pour votre assistance et vos conseils,

Andréanne Lemay

On 9/10/20 11:49 AM, Carl Lemaire via Compute Canada Support wrote:

Bonjour Andreanne Lemay,

J'aimerais savoir plus précisément ce que vous tentez de faire. Est-ce que vous voulez exécuter plusieurs entraînement indépendants en parallèle, ou vous voulez exécuter un entraînement avec plusieurs GPUs (Data Parallel) ?

Sachez que si vous demandez plusieurs noeuds, vous ne pourrez pas utiliser le multiprocessing pour communiquer entre les noeuds. Multiprocessing ne fonctionne qu'a l'intérieur d'un noeud. D'après moi, vous devriez commencer par essayer avec un seul noeud. Pour demander plusieurs processeurs, il faut utiliser l'option --cpus-per-task. Par défaut, vous obtenez 1 seul coeur.

Aussi, veuillez demander une quantité de mémoire proportionnelle au nombre de GPUs demandés. Par exemple, si vous demandez 2 GPUs sur 4 disponibles sur le noeud, vous devriez demander la moitié de la mémoire. Vous pouvez trouver les configurations des noeuds de Cedar ici: https://docs.computecanada.ca/wiki/Cedar/fr#Caract.C3.A9ristiques_des_n.C5.93uds

En terminant, je vous encouragerais à corriger votre ".bashrc". Vous vous retrouvez avec à la fois une activation de conda, et une activation d'un virtualenv; c'est à éviter. Or, à Calcul Canada, nous vous encourageons fortement à utiliser virtualenv. Donc, vous pourriez enlever dans votre .bashrc les lignes en lien avec conda.

J'attends votre réponse.

Cordialement,

-- Carl Lemaire Compute Canada - Calcul Canada Calcul Québec: Université de Sherbrooke

View this ticket here / Voyez ce billet ici: https://support.computecanada.ca/otrs/customer.pl?Action=CustomerTicketZoom;TicketID=102620

2020-09-09 21:04 (-4) - Andreanne Lemay wrote:

Hi,

I am currently using the cluster Cedar and can properly run a job on a single GPU. I have a script that runs parallel jobs (using Python's mp.Pool), but it doesn't seem to be running in parallel. When I use multiple GPU I run out of memory even though I have enough memory when I run one of these processes on a single GPU. In my job script, I tried using more than one gpu (gres=gpu:v100l:2), more than one node (--nodes=2), but it doesn't seem to work (I included a picture of the job file). In my script I usually define the GPU numbers I am using, but on Compute Canada if I put a GPU number different than 0 or -1, I get an error. Perhaps the problem comes from here, I define all my GPU numbers to -1, so maybe all my processes are trying to run on the same GPU.

Thank you so much for your help.

Andreanne Lemay