NUIST HPC使用讲座 —— 作业提交 刘建宇 2015-05-05
!!!声明!!! ftp://202.195.238.13/Public/submit_job.pdf 仅校内可访问 这里讨论的用户环境设置是基于目前(2014年)的NUIST HPC的配置上进行的 相关的用法、设置方式等有一定的普遍性,也有本地局限性 这里讨论的用法、设置方式,在不同的系统及配置下可能不适用 这里讨论的用法、设置方式,可能有不全面或不足之处 仅供参考,谨慎使用 ftp://202.195.238.13/Public/submit_job.pdf 仅校内可访问
PBS作业脚本 PBS作业脚本 PBS指令 含有PBS指令的脚本 用于申请资源、设置作业属性等 放在注释行的位置,使用#PBS作为前缀 #PBS [option] 除-l和-W选项外,其他选项后如果有多个指令,只有最后一个有效
PBS基本指令 #PBS -P project_no 必需设置,项目号 #PBS -q queue 必须设置,队列名 #PBS -l nodes=N:ppn=M #PBS -l select=N:ncpus=M:mpiprocs=P 必须设置, N:节点数, M:每个节点核数,P:MPI任务数/节点 #PBS -N jobname 可选设置,作业名 #PBS -S /bin/bash 可选设置,指定PBS的Shell为bash #PBS -l walltime=hh:nn:mm 可选设置,墙钟限制,不同队列,墙钟限制不一样,
PBS基本指令 #PBS -M me@eartch #PBS -m bea #PBS -V #PBS -o jobname.out 可选设置,作业报告发送电子邮件地址 #PBS -m bea 可选设置,作业报告发送状态 b – 开始,e – 结束, a – 中止 #PBS -V 可选设置,复制用户环境变量 #PBS -o jobname.out 可选设置,标准输出输出文件 #PBS -e jobname.err 可选设置,标准错误输出文件 # PBS -j oe 可选设置,合并标准输出与标准错误
注意事项 注释掉PBS指令 PBS指令后不能跟有注释内容 PBS指令中不能直接使用变量替换 PBS作业脚本中不能含有不可见的ASCII字符 ##PBS -l node=2:ppn=8 PBS指令后不能跟有注释内容 #PBS -l node=2:ppn=8 #2个节点,8个MPI任务/节点 #PBS -l node=2:ppn=8 PBS指令中不能直接使用变量替换 #PBS -l node=$N:ppn=$M PBS作业脚本中不能含有不可见的ASCII字符 ASCII码为0 ~ 31的字符 ASCII码为126以上字符
注意事项 PBS作业脚本中不能有DOS格式的行终结符(CR/LF) dos2unix job_script 在Windows下编辑的文本文件 在FTP上传时使用ASCII方式上传的文本文件 转换CR/LF的方法 dos2unix job_script tr -d '\r' < job_script > job_script.new
注意事项 -l nodes=n:ppn=p为旧格式 -l select=n:ncpus=m:mpiprocs=p为新格式 兼容性好 对作业的控制有限 -l select=n:ncpus=m:mpiprocs=p为新格式 只适用于较新版本的PBS 可以对作业做更多的控制 具体能做的控制依赖于PBS服务的设置 计算节点没有开启超线程 每个节点申请核数最好不要超过12个 ppn、ncpus、 mpiprocs的设置
注意事项 对内存需求大的任务,在申请资源时可采用增加节点数,降低每个节点使用核数的方式来避免在单个节点上内存不足的问题,例如 单个节点内存为24G,12个核 总共需要使用168个核 每个MPI任务需要使用4G nodes=42:ppn=4 在单个节点上的内存使用一般不要超过系统物理内存的90% 为避免在属性为共享的节点上出现多个用户的任务争用内存互相干扰的情况,最好在申请资源时把结点设置为独占方式(机时统计将按节点算) #PBS -l select=42:ncpus=4:mpiprocs=4 #PBS -l place=scatter:excl 如果希望节省资源而申请共享属性的节点,最好在申请时加上对内存的数量的申请,从而避免争夺内存的情况(机时统计将实际使用核数来算) #PBS -l select=42:ncpus=4:mpiprocs=4:mem=16gb #PBS -l place=scatter:free
PBS的环境变量 变 量 名 说 明 登陆SHELL继承来的变量 说 明 登陆SHELL继承来的变量 包括$HOME,$LANG,$LOGNAME,$PATH,$MAIL,$SHELL和$TZ $PBS_O_HOST qsub提交的节点名称 $PBS_O_QUEUE qsub提交的作业的最初队列名称 $PBS_O_WORKDIR qsub提交的作业的绝对路径 $PBS_JOBID 作业被PBS系统指定的作业号 $PBS_JOBNAME 用户指定的作业名 $PBS_NODEFILE PBS系统指定的作业运行的节点名 $PBS_QUEUE PBS脚本在执行时的队列名 !!!PBS的变量只在PBS环境中才可以访问!!!
MPI作业 运行24个MPI任务,使用两个节点,每个节点12个核 #!/bin/bash #PBS -S /bin/bash #PBS -N helloworld #PBS -P P123456789 #PBS -q Regular #PBS -l nodes=2:ppn=12 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR nprocs=`cat $PBS_NODEFILE | wc -l` mpirun -np $nprocs ./my_mpi_app.exe
OpenMP作业 只能在一个节点内运行, 最多只能运行12个OpenMP线程 #!/bin/bash #PBS -S /bin/bash #PBS -N helloworld #PBS -P P123456789 #PBS -q Regular #PBS -l nodes=1:ppn=12 #PBS -l walltime=00:05:00 nprocs=`cat $PBS_NODEFILE | wc -l` export OMP_NUM_THREADS=$nprocs cd $PBS_O_WORKDIR ./my_openmp_app.exe
Hybrid作业 进程在同一个节点内使用OpenMP方式,跨节点用MPI方式 #!/bin/bash #PBS -S /bin/bash #PBS -N helloworld #PBS -P P123456789 #PBS -q queue Regular #PBS -l nodes=2:ppn=12 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR #每个节点运行4个MPI任务 #每个MPI任务使用3个OpenMP线程 export OMP_NUM_THREADS=3 #OpenMPI #mpirun -np 8 -npernode 4 my_hybrid_app.exe # MVAPICH2 #mpirun -np 8 -ppn 4 my_hybrid_app.exe #每个节点运行1个MPI任务 #每个MPI任务使用12个OpenMP线程 export OMP_NUM_THREADS=12 # OpenMPI #mpirun -np 2 -npernode 1 my_hybrid_app.exe # MVAPICH2 #mpirun -np 2 -ppn 1 my_hybrid_app.exe
串行作业 使用1个节点,4个核运行4个任务 #!/bin/bash #PBS -S /bin/bash #PBS -N helloworld #PBS -P P123456789 #PBS -q queue Regular #PBS -l nodes=1:ppn=4 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR ./myapp1.exe & ./myapp2.exe & ./myapp3.exe & ./myapp4.exe # 此处需要设计一段等待脚本保持 # 在所有任务结束之前不退出 如果未等所有任务结束就退出脚本,未结束的任务将失败或变成不可管理的孤儿进程
MPMD(multiple program, multiple data)作业 OpenMPI #!/bin/bash #PBS -S /bin/bash #PBS -N HelloWorld #PBS -P P123456789 #PBS -q Regular #PBS -l nodes=2:ppn=12 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR mpirun --app configfile #configfile -np 8 exe1 arg1 arg2 -np 4 exe2 -np 12 exe3
MPMD(multiple program, multiple data)作业 MVAPICH2 #!/bin/bash #PBS -S /bin/bash #PBS -N HelloWorld #PBS -P P123456789 #PBS -q Regular #PBS -l nodes=2:ppn=12 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR mpirun -config configfile #configfile -n 8 : exe1 arg1 arg2 -n 4 : exe2 -n 12 : exe3
关联作业 #!/bin/bash job1=`qsub job1.sh` job2=`qsub -W depend=afterok:$job1 job2.sh` job3=`qsub -W depend=afterok:$job2 job3.sh` job4=`qsub -W depend=afterok:$job3 job4.sh` exit 0 afterok:<Job-ID> : 当指定的作业正常退出 afternotok:<Job-ID> :当指定的作业异常退出 afterany:<Job-ID> : 只要指定的作业结束不论正常或异常
作业脚本的额外设置 login shell – CSH login shell – KSH 使用qsub 提交KSH的脚本 设置#PBS -S /bin/bash可避免出现以下信息(需.bashrc与.cshrc的设置一致) e file : tput: No value for $TERM and no -T specified o file : Warning: no access to tty (Bad file descriptor). Thus no job control in this shell. login shell – KSH 设置#PBS -S /bin/bash可避免出现以下信息(需.bashrc与.kshrc的设置一直) /etc/profile[90]: .[5]: .[5]: .[46]: shopt: not found [No such file or directory] 如果需要在作业脚本中使用module命令,则需在作业脚本开头添加以下命令进行ksh的环境初始化 ' . /etc/profile.d/modules.sh ' 使用qsub 提交KSH的脚本
作业脚本的额外设置(续) 把当前脚本中用户环境变量复制到作业脚本运行环境中(1) 在PBS作业脚本中设置#PBS –V #!/bin/bash export work_dir=/blah/blah export data_dir=/blah/blah … … qsub my_job.sh ... … my_job.sh #!/bin/bash #PBS -N check_env #PBS -q Regular #PBS -l node=2:ppn=2 #PBS -l walltime=00:00:05 #PBS -P P000000000 #PBS -V echo work_dir=‘|’$work_dir‘|’ echo data_dir=‘|’$data_dir‘|’
作业脚本的额外设置(续) 把当前脚本中用户环境变量复制到作业脚本运行环境中(2) 在命令行使用“-v variable_list”选项 qsub -v work_dir=/blah/blah, data_dir=/blah/blah my_job.sh qsub -v "var1='A,B,C,D'" job.sh qsub -v a=10, "var2='A,B'", c=20, HOME=/home/zzz job.sh
作业脚本的额外设置(续) 在作业脚本中切换不同的运行环境安全的做法 首先使用module purge清除所有环境设置信息 接着使用module load先加载需要的编译器环境 然后使用module load仅加载运行程序必要的环境 例如, 登录环境为Intel 运行需要PGI环境 则在作业脚本开头加入下面module命令 # KSH Only # . /etc/profile.d/modules.sh module purge module load pgi module load … …
作业管理 删除作业 qdel job_id qdel `qselect -u $USER | cut -d'.' -f1` 查看指定用户的作业 qstat -u $USER
作业管理 qstat -q qstat -n | grep Eco | grep ' Q ' 查看所有队列的情况 查看Economy队列排队的情况 qstat -n | grep Eco | grep ' Q '
作业管理 查看Economy队列资源使用情况 qstat -n | \ grep Eco | \ grep ' R ' | \ awk '{nodes+=$6 ; cores+=$7 } END {printf "Total nodes = %d Total cores = % d \n", nodes, cores }'
作业管理 查看作业详细信息 qstat -n job_id qstat -w job_id qstat -f job_id 查看历史作业信息 qstat -x job_id qstat -fx job_id qstat -x -u $USER qstat -fx -u $USER
作业管理 获取作业ID qselect -u $USER | cut -d'.' -f1 qselect -s R -u $USER | cut -d'.' -f1 获取指定用户运行中的作业ID qselect -s Q -u $USER | cut -d'.' -f1 获取指定用户排队中的作业ID
一些建议 提交正式作业之前,最好做一个简单/快速测试,确保脚本没有问题 根据队列使用情况选择提交的队列 选用较少的资源 只申请一个节点 较小的计算规模 只进行试运行 积分很短的时间 执行简单的命令 根据队列使用情况选择提交的队列 需要资源少、墙钟时间短的作业等待时间相对短
常见问题 ~/.ssh/authorized_keys损坏 Killed by signal 15 Permission denied, please try again. Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 如果不清楚如何修复,则请管理员帮忙修复
常见问题 作业脚本含有DOS格式的行终结符号 -bash: /var/spool/PBS/mom_priv/jobs/164168.log05.SC: /bin/bash^M: bad interpreter: No such file or directory 去除CR/LF的方法 dos2unix job_script tr -d '\r' < job_script > job_script.new
常见问题 已设置项目号,但还是提示项目号错误 项目号没有设置对,或 脚本中有错,作业调度服务无法解析脚本
常见问题 作业节点可能有问题 把作业号告诉管理员,请管理员帮忙检查节点 /nuist/u/home/lanlr/.bashrc: line 9: module: command not found /nuist/u/home/lanlr/.bashrc: line 10: module: command not found 把作业号告诉管理员,请管理员帮忙检查节点
常见问题 作业节点可能有问题,或 运行环境设置有问题 loading shared libraries: xxxxx.so: cannot open shared object file: No such file or directory 比较登录节点和计算节点$LD_LIBRARY_PATH的设置 或 把作业号告知管理员,请管理员帮忙检查节点
常见问题 ~/.ssh/known_hosts文件问题 解决方式 删除~/.ssh/known_hosts 文件 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is fe:65:ab:89:9a:23:34:5a:50:1e:05:d6:bf:ec:da:67. Please contact your system administrator. Add correct host key in /user/.ssh/known_hosts to get rid of this message. Offending key in /home/hahn/.ssh/known_hosts:42 RSA host key for requin has changed and you have requested strict checking. Host key verification failed. 解决方式 删除~/.ssh/known_hosts 文件 或在~/.ssh/config中设置 StrictHostKeyChecking no UserKnownHostsFile /dev/null
问题或建议 hpc@nuist.edu.cn