gmgitx / BLOG_natural_science

精于勤,荒于嬉;行成于思,毁于随。 韩愈
GNU General Public License v3.0
0 stars 0 forks source link

Simple Linux Utility for Resource Management(slurm)不解 #9

Open gmgitx opened 5 years ago

gmgitx commented 5 years ago

9

gmgitx commented 5 years ago

1. 为什么可以本地自建slurm? 它的本质是资源管理,两个CPU也是资源,多用户作业竞用也要考虑资源分配

2. 各个学校虽然都用slurm,但是还有学校特色么?还各出教程?

3. 在slurm上用conda建立过虚拟环境么?如果说再学校slurm上用本地账户在本地一个路径装了conda(有权限),直接通过conda env create -f environment.yaml建立了别人的虚拟环境,激活这个虚拟环境后,module list显示的和conda list却不同 slurm的主要功能是资源管理(作业调度),不是module. 这个是把环境变量给到需求即可。 比如:

#!/bin/sh
#SBATCH -J tzy001-0
#SBATCH -n 12
#SBATCH -p TH_NET
export LD_LIBRARY_PATH=/vol-th/lib/mklem64t:$ LD_LIBRARY_PATH
yhrun -pdebug -N1 -n12 ~/bin/vasp5.3.5-neb

但我们不得不去思考的问题是软件运行环境,在未名一号的指南中就提到:

我们选择工作站进行计算的理由其一它可以加深你对软件运行环境的理解。从而会让你产生编写可移植性更强的程序的意识。

Q:我可以在服务器上安装服务器上没有的软件吗? A:可以。需注意的是,绝大多数软件的安装不需要管理员(root)权限,为此,你可能无法像使用你的个人计算机那样 使用 apt/yum 进行软件的安装。

一般的开源软件可以直接从源码编译安装,一个详细的例子:从源码安装 FFTW

安装属于自己的 python 或 R 包可以参考下面的方式:

安装 python 包到个人目录

conda 入门教程

软件安装完毕后,需要根据软件配置自己的环境变量。自行安装的软件无法被别的用户使用。

4 为什么不能在登录节点运算?

5 我应该直接把我的.bashrc送上去?虽然是激活环境了,但是激活的命令是来自conda,而此conda又不来自module。

注意,从本地安装的方法不会自动处理包之间的依赖问题,因此在安装之前请确保依赖的软件包已经安装完毕

###非常非常非常重要的Q&A

Q:装了一些软件在自己用户下的不同目录,而且已经把这些路径都加入了我的环境变量(在.bashrc里指定)。当前任务需要这些软件环境,那么当写提交批处理任务的脚本时,我需要把整个的.bashrc告诉计算节点吗(一般情况是在脚本加载个别用到的module)?

A:bashrc bash_profile 是全部节点共享的

Q:为什么要加载module呢,那些不更是共享的么?

A:模块不加载,不会修改环境变量。bash_profile bashrc 只要登录就会修改环境变量

Q:因此我自己安装的miniconda,很传统的装到一个目录并加到.bashrc,没有采用module的那种方式。而且建好了一个虚拟环境,包含很多软件,任务要在这个虚拟环境下进行。那么这时,当写提交批处理任务的脚本时,我只需要在状态参数设定后,直接写入source activate envir_name1就可以么(不必加载conda)?

A:如果你没有为自己安装的软件建立 module 文件的话,你运行 module 加载 conda 应该是加载了系统安装的 conda。所以你自己安装软件,自己维护 bashrc 文件,这样就不需要加载系统里的 module。module 是给那些不自己装软件,不自己配置环境变量的人用的

Q:如果我当前情况是想在计算节点用自己的conda(而它已经在我的.bashrc),这时还需要为conda建立 module 文件么?应该在批处理任务的脚本中不提到,就是在计算节点用自己的conda了对吗

A:module 是为了方便修改环境变量使用的,你要是能自己维护环境变量,当然就不需要了。你看 anaconda3 的 modulefile 有效的就一句话 prepend-path PATH /home/software/anaconda3/bin 本质上就是修改了环境变量而已 你可以通过修改 bashrc 来维护环境变量,也可以写一个 modulefile 然后 module load/unload 来维护你的环境变量,目的是一样的,你觉得哪个方便就用哪个

Q:只是module的方式在提交任务时需要加载,当软件存在依赖时,就加载不清楚了

A:按先后顺序加载就是了,没有不清楚的

Q:如果全部节点共享.bashrc,这样在提交任务时就不必考虑环境问题,虚拟环境的话,激活一下即可。如果有的软件是依赖java(或者更多),那么只加载这个软件的module怕是不能运行,我是指这个不清楚。

A:你可以先module load java,也可以把module load java这句话写到这个软件的modulefile里去,缺什么就补什么,依赖多就多写几个。D依赖C,C依赖B,B依赖A,那就 module load A B C D

6 disk问题

Q:为何在运行任务的时候有时会提示内存不足或显示程序‘‘已杀死(Killed)’’? A:作业调度系统为作业分配的内存和 SLURM 脚本中申请的单节点 CPU 核心数成正比, 如果内存不够请适当增加 --cpus-per-task 或 --tasks-per-node 参数。

7 module问题 我可以完全不用module吗? 看到完整的软件模块列表我的内心被深深震撼

8 module list与module avail的区别

我并没有加载任何module,为何屏幕会显示?

\#Obtain a list of the currently loaded modules
module list

9 如果我module了某软件的一个版本,可以解决依赖问题吗?

10 如何预知程序所需的cpu?