diff --git a/cfg/CentOs6/comp.cfg b/cfg/CentOs6/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..e11ce31210b9d928e669922616342cd8a14efaf7 --- /dev/null +++ b/cfg/CentOs6/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='centos6.cmake' +self.pars['NB_TASKS'].val='6' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch'] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/CentOs6/launch.cfg b/cfg/CentOs6/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..c920c191c7986eb3930491270c49cd0a6a3212b1 --- /dev/null +++ b/cfg/CentOs6/launch.cfg @@ -0,0 +1,9 @@ +self.pars['NB_THREADS'].val='4' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch', 'sge'] +self.pars['RUNMETHOD'].val='sge' +self.pars['QUEUE'].val='defq' +self.pars['SGE_PE'].val='snode' +self.pars['SGEARGS'].val='' +self.pars['TIME'].val='0-1:00:00' +self.pars['MEMORY'].val='1000' diff --git a/cfg/blueberry/comp.cfg b/cfg/blueberry/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0d7cd49c3a857b85cc5cc876029ab78761433a0f --- /dev/null +++ b/cfg/blueberry/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='gaston.cmake' +self.pars['NB_TASKS'].val='6' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch',] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/blueberry/launch.cfg b/cfg/blueberry/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..12256a89f06c5501b848f3489ea602aed964e83d --- /dev/null +++ b/cfg/blueberry/launch.cfg @@ -0,0 +1,4 @@ +self.pars['NB_THREADS'].val='6' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch'] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/clifton/comp.cfg b/cfg/clifton/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0d7cd49c3a857b85cc5cc876029ab78761433a0f --- /dev/null +++ b/cfg/clifton/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='gaston.cmake' +self.pars['NB_TASKS'].val='6' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch',] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/clifton/launch.cfg b/cfg/clifton/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..12256a89f06c5501b848f3489ea602aed964e83d --- /dev/null +++ b/cfg/clifton/launch.cfg @@ -0,0 +1,4 @@ +self.pars['NB_THREADS'].val='6' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch'] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/fabulous/comp.cfg b/cfg/fabulous/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d21d1f25862bcd9ebd34d957764a7c71e00a0da8 --- /dev/null +++ b/cfg/fabulous/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='fabulous.cmake' +self.pars['NB_TASKS'].val='8' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive',] +self.pars['RUNMETHOD'].val='interactive' diff --git a/cfg/fabulous/launch.cfg b/cfg/fabulous/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..1bb876b0fdf8c9d2d815cbd87dc999e1a2f5ba7f --- /dev/null +++ b/cfg/fabulous/launch.cfg @@ -0,0 +1,8 @@ +self.pars['NB_THREADS'].val='12' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','slurm'] +self.pars['RUNMETHOD'].val='slurm' +self.pars['QUEUE'].val='defq' +self.pars['MEMORY'].val='1000' +self.pars['TIME'].val='0-1:00:00' +self.pars['LOCALDISK'].val=True diff --git a/cfg/frontal3/launch.cfg b/cfg/frontal3/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..227f05a827e00b48baeaaa46f7ea9e3f78b032ac --- /dev/null +++ b/cfg/frontal3/launch.cfg @@ -0,0 +1,14 @@ +self.pars['MAIL_ADDR'].val='CanonicalEmailAdress' +self.pars['NB_TASKS'].val='1' +self.pars['NB_THREADS'].val='24' +self.pars['MULTITEST'].val=False +self.pars['LOCALDISK'].val=False +self.pars['TIME'].val='1:00:00' +self.pars['MEMORY'].val='1000' +self.pars['QUEUE'].val='main' +self.pars['PROJECT'].val='hpcwe' +self.pars['RUNMETHOD'].vals=['pbs',] +self.pars['RUNMETHOD'].val='pbs' +self.pars['MODEL'].vals=['auto','westemere','westmere_fat','westmere_xfat','ivyBridge','haswell_xfat',] +self.pars['MODEL'].val='auto' +self.pars['EXEC_NAME'].val='e:\\Dev64\\Offi\\linuxbin\\Metafor.exe' diff --git a/cfg/frontal3/ls_colors.bashrc b/cfg/frontal3/ls_colors.bashrc new file mode 100644 index 0000000000000000000000000000000000000000..8971679c7e7904e7f42e7f204b9afea405770590 --- /dev/null +++ b/cfg/frontal3/ls_colors.bashrc @@ -0,0 +1,2 @@ +LS_COLORS='di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36' +export LS_COLORS diff --git a/cfg/frontal3/modules.profile b/cfg/frontal3/modules.profile new file mode 100644 index 0000000000000000000000000000000000000000..10c20b41899360435d620feea841005e3c6c97bb --- /dev/null +++ b/cfg/frontal3/modules.profile @@ -0,0 +1,20 @@ + +module load python/2.7 +module load swig/3.0.10/64/gcc/4.4.7 +module load compiler/gcc/6.4.0 +module load cmake/3.11.1/64/gcc/5.5.0 + +. /softs/intel/compilers_and_libraries_2018.5.274/linux/mkl/bin/mklvars.sh intel64 +. /softs/intel/compilers_and_libraries_2018.5.274/linux/tbb/bin/tbbvars.sh intel64 +. /softs/intel/compilers_and_libraries_2018.5.274/linux/bin/compilervars.sh intel64 +export INTEL_LICENSE_FILE=/softs/intel/licenses + +# sinon cmake prend /usr/bin/cc meme si gcc est dans le PATH! +export CC=gcc +export CXX=g++ +export FC=gfortran + +#icc +#export CC=$(which icc) +#export CXX=$(which icpc) +#export FC=$(which ifort) diff --git a/cfg/frontal3/python.profile b/cfg/frontal3/python.profile new file mode 100644 index 0000000000000000000000000000000000000000..f64a11d789efde2fb65bd46fe11e1959d2295789 --- /dev/null +++ b/cfg/frontal3/python.profile @@ -0,0 +1,4 @@ +# python recompile (probleme avec la version recompilee en module) +add2env PATH "/projects/acad/hpcwe/softs/python/bin" front +add2env LD_LIBRARY_PATH "/projects/acad/hpcwe/softs/python/lib" front +add2env CMAKE_PREFIX_PATH "/projects/acad/hpcwe/softs/python" front diff --git a/cfg/gaston/comp.cfg b/cfg/gaston/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0d7cd49c3a857b85cc5cc876029ab78761433a0f --- /dev/null +++ b/cfg/gaston/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='gaston.cmake' +self.pars['NB_TASKS'].val='6' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch',] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/gaston/launch.cfg b/cfg/gaston/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..12256a89f06c5501b848f3489ea602aed964e83d --- /dev/null +++ b/cfg/gaston/launch.cfg @@ -0,0 +1,4 @@ +self.pars['NB_THREADS'].val='6' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch'] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/spring/comp.cfg b/cfg/spring/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..df67ee8efb9fe96cc55d205e06df8a682d3dcae9 --- /dev/null +++ b/cfg/spring/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='spring.cmake' +self.pars['NB_TASKS'].val='4' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch',] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/spring/launch.cfg b/cfg/spring/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d66afc51905cfa52f06df5c21904031fed7df37f --- /dev/null +++ b/cfg/spring/launch.cfg @@ -0,0 +1,4 @@ +self.pars['NB_THREADS'].val='4' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch'] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/thorgal/comp.cfg b/cfg/thorgal/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..5d4a8199fa4479202de29572e4270e2964faaf20 --- /dev/null +++ b/cfg/thorgal/comp.cfg @@ -0,0 +1,5 @@ +self.pars['CMAKELIST'].val='thorgal.cmake' +self.pars['NB_TASKS'].val='4' +self.pars['NB_THREADS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch',] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/thorgal/launch.cfg b/cfg/thorgal/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d66afc51905cfa52f06df5c21904031fed7df37f --- /dev/null +++ b/cfg/thorgal/launch.cfg @@ -0,0 +1,4 @@ +self.pars['NB_THREADS'].val='4' +self.pars['NB_TASKS'].val='1' +self.pars['RUNMETHOD'].vals=['interactive','at','batch'] +self.pars['RUNMETHOD'].val='batch' diff --git a/cfg/windows/comp.cfg b/cfg/windows/comp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..f5219520d9296a9bfa9b9882d7ecee226347b07c --- /dev/null +++ b/cfg/windows/comp.cfg @@ -0,0 +1,2 @@ +self.pars['RUNMETHOD'].vals=['interactive',] +self.pars['RUNMETHOD'].val='interactive' diff --git a/cfg/windows/launch.cfg b/cfg/windows/launch.cfg new file mode 100644 index 0000000000000000000000000000000000000000..f5219520d9296a9bfa9b9882d7ecee226347b07c --- /dev/null +++ b/cfg/windows/launch.cfg @@ -0,0 +1,2 @@ +self.pars['RUNMETHOD'].vals=['interactive',] +self.pars['RUNMETHOD'].val='interactive' diff --git a/comp.py b/comp.py index e9b7d808e507b501cc393e31395200f192b016f4..c7414b572c80f06176bc3cee932d16363544fe00 100755 --- a/comp.py +++ b/comp.py @@ -46,8 +46,6 @@ class CompJob(ParametricJob): self.repos.append(GitRepo('linuxbin', 'https://github.com/ulgltas/linuxbin.git')) self.repos.append(GitRepo('parasolid', 'blueberry.ltas.ulg.ac.be:/home/metafor/GIT/parasolid.git')) - self.loadPars() # RB: semble inutile: deja fait dans classe de base PRMSet?? - def setDefaultPars(self): if len(self.pars)!=0: return diff --git a/launch.py b/launch.py index b4e3211d771f73c521ce8d1f91cce42fbf0cf870..f20d19960ec630ba8f745432129aec9a101b8a14 100755 --- a/launch.py +++ b/launch.py @@ -16,7 +16,6 @@ class LaunchJob(ParametricJob): self.jobId=_jobId cfgfile="launch%s.cfg"%self.jobId ParametricJob.__init__(self, cfgfile) - self.loadPars() # gestion des dépendances entre paramètres self.applyDependencies() # liens vers launchGui (lorsque lancé par ce biais pour interaction) @@ -51,21 +50,23 @@ class LaunchJob(ParametricJob): TextPRM(self.pars, 'AFFINITY', 'affinity (cores list)', "") TextPRM(self.pars, 'NB_TASKS', 'nb of task launched in parallel', "1") TextPRM(self.pars, 'NB_THREADS', 'nb of threads by task', "1") - - if isUnix(): - MultiPRM(self.pars, 'RUNMETHOD', 'Run Method', ["interactive", "at", "batch", "slurm", "sge"], "interactive") - else: - MultiPRM(self.pars, 'RUNMETHOD', 'Run Method', ["interactive"], "interactive") + # Run Method : + MultiPRM(self.pars, 'RUNMETHOD', 'Run Method', ["interactive", "at", "batch", "slurm", "sge", "pbs"], "interactive") #AT TextPRM(self.pars, 'AT_TIME' , 'Delay for at launch (no syntax check, use with care)', "now") # QUEUING SYSTEMS : SGE / SLURM TextPRM(self.pars, 'QUEUE', 'Queue name', "defq") YesNoPRM(self.pars, 'LOCALDISK', 'Metafor run on node local disk', True) TextPRM(self.pars, 'MEMORY', 'Total Memory (Mb)', "1000") - TextPRM(self.pars, 'TIME', 'Time (d-hh:mm:ss) ', "0-1:00:00") + TextPRM(self.pars, 'TIME', 'Time (slurm : d-hh:mm:ss / PBS : d:hh:mm:ss) ', "0-1:00:00") # SGE specific TextPRM(self.pars, 'SGE_PE', 'SGE parallel environment', "snode") TextPRM(self.pars, 'SGEARGS', 'additional SGE args', "") + # PBS Specific (zenobe) + #TextPRM(self.pars, 'QUEUE', 'PBS Queue name', "main") # zenobe : main ou large + TextPRM(self.pars, 'PROJECT', 'Project Name (Acces group dirs)', "hpcwe") + MultiPRM(self.pars, 'MODEL', 'CPU Model', ["auto", "westemere", "westmere_fat", "westmere_xfat", "ivyBridge", "haswell_xfat"], "auto") + # FTP YesNoPRM(self.pars, 'ENABLE_FTP', 'ftp transfert', False) TextPRM(self.pars, 'FTP_HOST', 'ftp host', "") @@ -92,7 +93,7 @@ class LaunchJob(ParametricJob): PRMAction(self.actions, 'm', self.pars['RUNMETHOD']) # At parameters PRMAction(self.actions, 'n', self.pars['AT_TIME']) - # SGE/SLURM PARAMETERS + # SGE/SLURM/PBS PARAMETERS PRMAction(self.actions, 'n', self.pars['QUEUE']) PRMAction(self.actions, 'o', self.pars['LOCALDISK']) PRMAction(self.actions, 'p', self.pars['MEMORY']) @@ -101,6 +102,10 @@ class LaunchJob(ParametricJob): #PRMAction(self.actions, 'n', self.pars['SGEQUEUE']) PRMAction(self.actions, 'r', self.pars['SGE_PE']) PRMAction(self.actions, 's', self.pars['SGEARGS']) + # PBS (zenobe) specific PARAMETERS + PRMAction(self.actions, 'r', self.pars['PROJECT']) + PRMAction(self.actions, 's', self.pars['MODEL']) + # FTP PRMAction(self.actions, 'u', self.pars['ENABLE_FTP']) PRMAction(self.actions, 'v', self.pars['FTP_HOST']) @@ -130,7 +135,10 @@ class LaunchJob(ParametricJob): return ret def configActions(self): - self.pars['MAIL_ADDR'].enable(self.pars['SEND_MAIL'].val==True) + #self.pars['MAIL_ADDR'].enable(self.pars['SEND_MAIL'].val==True or + # self.pars['RUNMETHOD'].val=='sge' or + # self.pars['RUNMETHOD'].val=='slurm' or + # self.pars['RUNMETHOD'].val=='pbs') self.pars['SMTP_SERV'].enable(self.pars['SEND_MAIL'].val==True) self.pars['TEST_NAME'].enable(self.pars['MULTITEST'].val==False) @@ -153,20 +161,27 @@ class LaunchJob(ParametricJob): self.pars['MULTITEST'].val==False) # At self.pars['AT_TIME'].enable(self.pars['RUNMETHOD'].val=='at') - # SGE/SLURM + # SGE/SLURM/PBS self.pars['QUEUE'].enable(self.pars['RUNMETHOD'].val=='sge' or - self.pars['RUNMETHOD'].val=='slurm') + self.pars['RUNMETHOD'].val=='slurm' or + self.pars['RUNMETHOD'].val=='pbs') self.pars['LOCALDISK'].enable((self.pars['RUNMETHOD'].val=='sge' or - self.pars['RUNMETHOD'].val=='slurm') and + self.pars['RUNMETHOD'].val=='slurm') and # pas zenobe self.pars['ALGORITHM'].val!='restart' ) self.pars['TIME'].enable(self.pars['RUNMETHOD'].val=='sge' or - self.pars['RUNMETHOD'].val=='slurm') + self.pars['RUNMETHOD'].val=='slurm' or + self.pars['RUNMETHOD'].val=='pbs') self.pars['MEMORY'].enable(self.pars['RUNMETHOD'].val=='sge' or - self.pars['RUNMETHOD'].val=='slurm') + self.pars['RUNMETHOD'].val=='slurm' or + self.pars['RUNMETHOD'].val=='pbs') # SGE specific self.pars['SGE_PE'].enable(self.pars['RUNMETHOD'].val=='sge') self.pars['SGEARGS'].enable(self.pars['RUNMETHOD'].val=='sge') + # PBS specific + self.pars['MODEL'].enable(self.pars['RUNMETHOD'].val=='pbs') # cpu model (to choose subqueue) + self.pars['PROJECT'].enable(self.pars['RUNMETHOD'].val=='pbs') # project (group access & facturation) + def getJobName(self): if (self.pars['MULTITEST'].val==False): @@ -196,7 +211,7 @@ class LaunchJob(ParametricJob): # write kill scripts if isUnix(): if (self.pars['RUNMETHOD'].val == 'interactive' or self.pars['RUNMETHOD'].val == 'at' or - self.pars['RUNMETHOD'].val == 'batch'): + self.pars['RUNMETHOD'].val == 'batch'): self.killScript(self.jobId, os.getpgrp()) elif ((self.pars['RUNMETHOD'].val == 'sge' or self.pars['RUNMETHOD'].val == 'slurm') and self.pars['LOCALDISK'].val == True): diff --git a/launchGui.pyw b/launchGui.pyw index 2908b2f09ae215c472751d8fc697588387aa57b3..56e2a41c7bcdecb4512c24212e4387c020eba7e2 100755 --- a/launchGui.pyw +++ b/launchGui.pyw @@ -149,18 +149,22 @@ class LaunchGui(QWidget): self.sf['AT_TIME'] = TextLine(self, grplay6, self.launch.pars['AT_TIME'], 0, 0, 1) # SGE OPTIONS - self.sgeOptGrpBox = QGroupBox("Queue Options (SGE / SLURM)") + self.sgeOptGrpBox = QGroupBox("Queue Options (SGE / SLURM / PBS)") vbox.addWidget(self.sgeOptGrpBox) grplay4 = QGridLayout() self.sgeOptGrpBox.setLayout(grplay4) grplay4.setColumnStretch(2,1) self.sf['QUEUE'] = TextLine(self, grplay4, self.launch.pars['QUEUE'], 0, 0, 1) - self.sf['LOCALDISK']= CheckBoxLine(self, grplay4, self.launch.pars['LOCALDISK'], 0, 3) + self.sf['LOCALDISK'] = CheckBoxLine(self, grplay4, self.launch.pars['LOCALDISK'], 0, 3) self.sf['MEMORY'] = TextLine(self, grplay4, self.launch.pars['MEMORY'], 1, 0, 1) self.sf['TIME'] = TextLine(self, grplay4, self.launch.pars['TIME'], 1, 3, 1) self.sf['SGE_PE'] = TextLine(self, grplay4, self.launch.pars['SGE_PE'], 2, 0, 1) self.sf['SGEARGS'] = TextLine(self, grplay4, self.launch.pars['SGEARGS'], 2, 3, 1) + self.sf['MODEL'] = MultiPMRLine(self, grplay4, self.launch.pars['MODEL'], 3, 0) + + + # SGE OPTIONS # FTP OPTIONS self.ftpOptGrpBox = QGroupBox("FTP Options") diff --git a/mtfLicense/metafor181231.lic b/mtfLicense/metafor181231.lic new file mode 100644 index 0000000000000000000000000000000000000000..997a54d9d5d1eaec247af1f315c9f881deb9fb8c --- /dev/null +++ b/mtfLicense/metafor181231.lic @@ -0,0 +1 @@ +646574612B0A060C031B13305B736D657473666F72390C19042A061F041111052A0611080B070406FE5831657461666A796D65 diff --git a/parametricJob.py b/parametricJob.py index adf4d80aa0185a6ca4781d1fed0561a38e9b7da4..601d79de8c7dbb0c4fc1d38d49a4e9bf9d1ba14b 100644 --- a/parametricJob.py +++ b/parametricJob.py @@ -1,7 +1,7 @@ # -*- coding: latin-1; -*- import sys, os, os.path, shutil, socket, platform, glob, fnmatch -import datetime, tarfile, subprocess +import datetime, tarfile, subprocess, string from prmClasses import * # -- Base Class ---------------------------------------------------------------- @@ -9,6 +9,11 @@ class ParametricJob(PRMSet): def __init__(self,cfgfile, _verb=False): PRMSet.__init__(self, cfgfile, _verb) + def loadPaths(self): + cfgRep = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'cfg', getHostCfgName()) + local = os.path.abspath('.') + return [local, cfgRep] + def getNiceCmd(self, niceValue): if isUnix(): niceCmd = ['nice', '-%d'%niceValue] @@ -439,7 +444,6 @@ class ParametricJob(PRMSet): file.write("#SBATCH --job-name=metafor\n") file.write("#SBATCH --mail-user=%s\n"%self.pars['MAIL_ADDR'].val) file.write("#SBATCH --mail-type=ALL\n") - #file.write("#SBATCH --output=%s\n"%self.getOutFileName()) file.write("# Ressources needed...\n") file.write("#SBATCH --partition=%s\n"%self.pars['QUEUE'].val) nbCores = (int(self.pars['NB_TASKS'].val) * int(self.pars['NB_THREADS'].val)) @@ -519,6 +523,122 @@ class ParametricJob(PRMSet): file.close() os.chmod(filename,0700) # END OF SLURM SPECIFIC INTERFACE + #=========================================================================== + # PBS SPECIFIC INTERFACE (Zenobe) + def runPBS(self): + # get guess profile + cfgfile = self.guessProfile() + # build script + scriptname='runPBS.sh' + file = open(scriptname,'w') + file.write('#!/bin/bash\n') + file.write('# Metafor launch.py PBS script (Zenobe)...\n') + jobname = self.getJobName() + # Job Name + #file.write("#PBS -N %s\n" % jobname) + file.write("#PBS -N metafor\n") + # Mail + if ( self.pars['MAIL_ADDR'].val == os.getenv('USER') or + string.find(self.pars['MAIL_ADDR'].val, "@") < 0 ): + print "ERROR : PBSPro : Only external email allowed : correct it before launch" + raw_input("press enter to get back to configuration before launch") + return + file.write('#PBS -M %s\n'%self.pars['MAIL_ADDR'].val) + file.write('#PBS -m abe\n') # mail abort/begin/end + # config + file.write('#PBS -r y\n') # defini le job comme rerunnable (en cas de plantage/timeOut,...) ceci proposal + #file.write('#PBS -r n\n') # mtf : non rerunnable : faudrait que le rerun soit un restart par defaut : ACTUELLEMENT REFUSE POUR LES LONG JOBS + file.write('#PBS -j oe\n') # join error and output flux into 1 file (defaut) + file.write('#PBS -W group_list=%s\n'%self.pars['PROJECT'].val) # le grpName permet d'ecrire sur le disque du projet & d'acceder aux ressources du group + + file.write('# Ressources needed...\n') + nbCores = (int(self.pars['NB_TASKS'].val) * int(self.pars['NB_THREADS'].val)) + #file.write('#PBS -l select=1:ncpus=%d:ompthreads=%d:mem=%smb\n'%(nbCores,nbCores,self.pars['MEMORY'].val)) # omp pas utile + file.write('#PBS -l select=1:ncpus=%d:mem=%smb\n'%(nbCores,self.pars['MEMORY'].val)) + file.write('#PBS -l walltime=%s\n'%self.pars['TIME'].val) + # Queue + file.write('# Queue...\n') + file.write('#PBS -q %s\n'%self.pars['QUEUE'].val) # queue == large or main + # faire une variable avec un select + if (self.pars['MODEL'].val != 'auto') : + file.write('#PBS -l model=%s\n'%self.pars['MODEL'].val) #allow choice for subqueues => chose CPU Type + #allowed values : westemere / westmere_fat / westmere_xfat / ivyBridge + # workdir : + file.write('echo "------------------ Work dir --------------------"\n') + #pbs does not start in launchworkdir => get back to it + file.write('cd ${PBS_O_WORKDIR} && echo ${PBS_O_WORKDIR}\n') + #pbs output only written at the end of exec. This command allow having output during run + file.write('exec > ${PBS_O_WORKDIR}/${PBS_JOBNAME}_${PBS_JOBID}.log\n') + file.write('echo "------------------ Job Info --------------------"\n') + # print info + file.write('echo "jobid : $PBS_JOBID"\n') + file.write('echo "jobname : $PBS_JOBNAME"\n') + file.write('echo "job type : $PBS_ENVIRONMENT"\n') + file.write('echo "submit dir : $PBS_O_WORKDIR"\n') + file.write('echo "queue : $PBS_O_QUEUE"\n') + file.write('echo "user : $PBS_O_LOGNAME"\n') + file.write('echo "threads : $NCPUS"\n') + # Lanch the job + import socket + file.write('. %s %s\n' % (cfgfile, socket.gethostname())) + file.write('%s -x -i $PBS_JOBID\n' % (sys.argv[0])) + file.write('qstat -f $PBS_JOBID\n') + file.close() + os.chmod(scriptname,0700) + # send to PBS + print 'sending job "%s" to PBS' % jobname + shcmd='qsub ./%s' % scriptname + import commands + status, result = commands.getstatusoutput(shcmd) + print 'command status = ', status + print 'command result = ', result + if status!=0: + print "Job submission FAILED!" + else: + print "Submission SUCCESSFUL!" + + # le pbsid est le retour de qsub : 3067709.frontal2 + PbsId = result + cfgFileName, cfgFileExtension = os.path.splitext(self.cfgfile) + os.system("cp %s %s%s%s"%(self.cfgfile, cfgFileName, PbsId, cfgFileExtension)) + self.PBSCancelScript(PbsId) + print "\tuse ' qstat -f %s ' to check the status of the PBS scheduling queue of your job" % PbsId + print "\tuse ' qdel %s ' to kill your job" % PbsId + ''' + #import re + #m = re.compile('waiting for job ([0-9]+) to start').match(result) + #result : 3067709.frontal2 + #m = re.compile('([0-9]+)\.(.+)').match(result) + #print "m = ", m + #PbsId = m.group(1) + if m: + cfgFileName, cfgFileExtension = os.path.splitext(self.cfgfile) + os.system("cp %s %s%s%s"%(self.cfgfile, cfgFileName, PbsId, cfgFileExtension)) + self.PBSCancelScript(PbsId) + print "\tuse ' qstat -f %s ' to check the status of the PBS scheduling queue of your job" % PbsId + #print "\tuse ' sprio -l -j %s ' to check the factor priority of your job" % PbsId + #print "\tuse ' sstat -a --format=JobID,NTasks,MaxRSS,MaxVMSize -j %s ' to get information about your running job (adapt format to your needs)" % PbsId + print "\tuse ' qdel %s ' to kill your job" % PbsId + #print "\tuse ' sacct --format=JobID,NTasks,NCPUS,CPUTime,Elapsed,MaxRSS,MaxVMSize -j %s ' to get information about your finished job (adapt format to your needs)" % PbsId + ''' + sys.exit() + + def PBSCancelScriptName(self, jobId): + filename = "qdel%s.py"%jobId + return filename + + def PBSCancelScript(self, jobId): + filename = self.PBSCancelScriptName(jobId) + file=open(filename,"w") + file.write("#!/usr/bin/env python\n") + file.write("import subprocess, os, sys\n") + file.write("subprocess.call('qdel %s',shell=True)\n"%jobId) + # clean qDelScript + file.write("os.remove('./%s')\n"%(filename)) + file.write("sys.exit(0)\n") + file.close() + os.chmod(filename,0700) + # END OF PBS SPECIFIC INTERFACE #=========================================================================== # interface virtuelle... @@ -541,6 +661,8 @@ class ParametricJob(PRMSet): self.runSGE() elif self.pars['RUNMETHOD'].val == 'slurm': self.runSlurm() + elif self.pars['RUNMETHOD'].val == 'pbs': + self.runPBS() else: self.run() diff --git a/prmClasses.py b/prmClasses.py index 9adb5b789bcb25f42c49ec36e2e31a4c688b2955..9b11789ff55e3ea474522aafc0fdd485715f7957 100644 --- a/prmClasses.py +++ b/prmClasses.py @@ -32,8 +32,8 @@ class PRMSet(object): self.debug = _verb def printPars(self): - for k,v in self.pars.items(): - print ("pars['%s'].val=%s\n" % (k,repr(v.val)) ) + for par in self.pars.itervalues(): + par.writePRM(sys.stdout) def loadPaths(self): return [os.path.abspath('.')] @@ -46,9 +46,9 @@ class PRMSet(object): pth = self.savePath() fname = os.path.join(pth, self.cfgfile) file = open(fname,"w") - for k,v in self.pars.items(): - file.write("self.pars['%s'].val=%s\n" % (k,repr(v.val)) ) - file.close() + for par in self.pars.itervalues(): + par.writePRM(file) + file.close() def loadPars(self): # lecture dans les chemins par defaut for pth in self.loadPaths(): @@ -113,6 +113,9 @@ class PRM(object): set[key] = self self.enabled = True + def writePRM(self, file): + file.write("self.pars['%s'].val=%s\n" % (self.key,repr(self.val)) ) + def typecheck(self, val): pass @@ -153,6 +156,13 @@ class MultiPRM(PRM): self.vals = vals PRM.__init__(self, set, key, desc, defval) + def writePRM(self, file): + file.write("self.pars['%s'].vals=["%(self.key)) + for v in self.vals: + file.write("'%s'," % (v)) + file.write("]\n") + PRM.writePRM(self,file) + def input(self): i = self.vals.index(self.val) i = i+1 @@ -267,6 +277,14 @@ def isUnix(): uname = platform.uname() return not (uname[0] == 'Windows' or uname[2] == 'Windows') +# getMachineName +def getHostCfgName(): + uname = platform.uname() + if (uname[0] == 'Windows' or uname[2] == 'Windows'): + return 'windows' + else: + return uname[1] + # copied from linuxbin/parametricJob.py def cls(): uname = platform.uname()