تشغيل البرنامج النصي slurm مع عقد متعددة، وإطلاق خطوات المهمة بمهمة واحدة

StackOverflow https://stackoverflow.com//questions/24056961

  •  26-12-2019
  •  | 
  •  

سؤال

أحاول إطلاق عدد كبير من خطوات المهمة باستخدام برنامج نصي دفعي.يمكن أن تكون الخطوات المختلفة عبارة عن برامج مختلفة تمامًا وتحتاج كل منها إلى وحدة معالجة مركزية واحدة بالضبط.أولاً حاولت القيام بذلك باستخدام --multi-prog حجة ل srun.لسوء الحظ، عند استخدام كافة وحدات المعالجة المركزية المخصصة لعملي بهذه الطريقة، يتدهور الأداء بشكل كبير.يزيد وقت التشغيل إلى قيمته التسلسلية تقريبًا.من خلال الاشتراك، يمكنني تحسين هذا قليلاً.لم أتمكن من العثور على أي شيء عبر الإنترنت بخصوص هذه المشكلة، لذلك افترضت أنها مشكلة في تكوين المجموعة التي أستخدمها.

لذلك حاولت السير في طريق مختلف.لقد قمت بتنفيذ البرنامج النصي التالي (الذي تم إطلاقه عبر sbatch my_script.slurm):

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

وأعلم أن --exclusive ليست هناك حاجة حقا للحجة في حالتي.تحتوي البرامج النصية التي يتم استدعاؤها على الثنائيات المختلفة ووسائطها.يعتمد الجزء المتبقي من البرنامج النصي الخاص بي على حقيقة أن جميع العمليات قد انتهت ومن ثم wait.لقد قمت بتغيير خط الاتصال لجعله مثالاً عمليًا بسيطًا.

في البداية بدا أن هذا هو الحل.لسوء الحظ، عند زيادة عدد العقد المستخدمة في تخصيص وظيفتي (على سبيل المثال عن طريق زيادة --ntasks إلى عدد أكبر من عدد وحدات المعالجة المركزية لكل عقدة في مجموعتي)، لم يعد البرنامج النصي يعمل كما هو متوقع بعد الآن، ويعود

srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1

والاستمرار في استخدام عقدة واحدة فقط (أي.48 وحدة معالجة مركزية في حالتي، والتي تمر بخطوات المهمة بالسرعة التي كانت عليها من قبل، يتم لاحقًا قتل جميع العمليات على العقدة (العقد) الأخرى).

يبدو أن هذا هو السلوك المتوقع، لكني لا أستطيع فهمه حقًا.لماذا يجب أن تتضمن كل خطوة مهمة في تخصيص معين حدًا أدنى لعدد المهام يساوي عدد العقد المضمنة في التخصيص.عادةً لا أهتم على الإطلاق بعدد العقد المستخدمة في التخصيص الخاص بي.

كيف يمكنني تنفيذ البرنامج النصي الدفعي الخاص بي، بحيث يمكن استخدامه على عقد متعددة بشكل موثوق؟

هل كانت مفيدة؟

المحلول

وجدت ذلك!لقد أربكتني التسميات وخيارات سطر الأوامر العديدة.الحل مقدم من

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -N1 -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

يحدد هذا تشغيل المهمة على عقدة واحدة بالضبط تتضمن مهمة واحدة فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top