四川大学新能源与低碳技术研究院
高性能计算中心(以鸣计算实验室)
首页
|
联系我们
Toggle navigation
高性能计算中心
中心简介
要闻快讯
评测报告
专题课程
开放资源
仪器设备简介
实验室服务器申请
计算资源申请
线下专题课程预约
线上专题课程预约
合作产品
专题文档
专题文档库
# 第五章 计算环境 [TOC] 很多刚接触Linux的同学,都会不理解为什么Linux需要在用户配置文件中写环境变量,这些环境变量语句看起来像程序语言一样,而不像windows系统,鼠标点点就把程序运行起来了。这里简单的和大家介绍一下。 所谓环境变量,指的是用户应用的软件或服务所需运行环境的参数或指令,以帮助用户实现快捷的操作和服务、应用自动找到运行所需依赖环境。 在使用Linux系统,特别是使用命令行界面操作时,我们运行一个软件,必须要输入该软件的可执行文件的绝对路径或者相对路径,这个路径长并且不容易记住,同时,运行软件时会报各种找不到库文件、头文件等报错信息而使得软件根本运行不起来。我们希望像使用Linux系统命令一样,只输入一个简短的命令,软件就可以非常流畅的运行起来。这就需要我们必须告诉操作系统该软件的环境变量。所以,环境变量的作用就是: - 让你像运行Linux系统命令一样,只是输入安装软件的可执行文件名就可以运行软件; - 软件运行所需的库文件,头文件系统能自动找到; - 能对Linux软件版本进行有效的控制; 对于普通用户而言,环境变量一般是根据用户使用要求,可写入到: - 用户环境配置文件.bashrc或者.bash_profile - 使用module工具 - 计算作业脚本文件 - 自己写的环境配置文本文件 在以鸣计算实验室集群,我们把软件运行的环境变量都编写为一个独立的文本文件,放在 /opt/cluster_share/envs目录中。文件的命名方式为:软件名-版本+编译器-版本+并行环境-版本+数学库-版本......。 ``` anaconda3 openmpi-4.1.5+ib+gcc-4.8.5+pmix3+ucx-1.15 compiler-gcc-8.5.0 openmpi-4.1.5+ib+intel2019u4+pmix3+ucx-1.15 fftw-3.3.10+intel2019u4+openmpi-4.1.5+pmix3+ucx-1.15 openmpi-4.1.5+ib+intel2022.3+pmix3+ucx-1.15 g16 vasp.5.4.4+ib+intel2019u4+openmpi-4.1.5+pmix3 gcc-11.2.1 vasp.5.4.4+vtst+ib+intel2019u4+openmpi-4.1.5+pmix3 intel2019u4 vaspkit-1.4.1 intel2022.3 vtstscripts-1034 lammps-2Aug2023+intel2019u4+openmpi-4.1.5 ``` 这样做有以下几个好处: - 管理员编译安装并运行验证后,把软件运行所需环境写入到一个文件中,用户只需source该文件即可正确加载软件运行环境; - 用户只需查看软件运行环境文件,即可了解软件编译; - 软件运行环境文件包含了软件运行所需所有环境,只需source一个文件即可完成全部运行环境的加载; - 简单便利,安全可靠,用户没有学习成本(相对于module和.bashrc) ## 环境变量   我们以做计算最常用到的OpenMPI并行环境为例,介绍环境变量的语法。   我们使用intel2019u4版本编译器和pmix库编译的Openmpi-4.1.5,Openmpi的编译安装路径是/opt/cluster_share/mpi/openmpi/4.1.5+ib+intel2019u4+pmix3+ucx-1.15   首先我们安装intel2019u4,并编写intel2019u4的环境文件保存到/opt/cluster_share/env目录下.intel2019u4运行环境文件内容如下示例: ``` source /opt/cluster_share/compiler/intel/2019u4/bin/compilervars.sh intel64 ``` openmpi-4.1.5+intel2019u4+pmix-3.2.3运行环境文件内容如下示例: ``` source /opt/cluster_share/env/intel2019u4 UCX=/opt/cluster_share/tools/ucx-1.15.0 PMIX3=/opt/cluster_share/tools/pmix-3.2.3 LIBEVENT=/opt/cluster_share/tools/libevent-2.1.12 HWLOC=/opt/cluster_share/tools/hwloc-2.10.0 OPENMPI=/opt/cluster_share/mpi/openmpi/4.1.5+ib+intel2019u4+pmix3+ucx-1.15 export PATH=$UCX/bin:$OPENMPI/bin:$PMIX3/bin:$LIBEVENT/bin:$HWLOC/bin:$PATH export LD_LIBRARY_PATH=$UCX/lib:$OPENMPI/lib:$PMIX3/lib:$LIBEVENT/lib:$HWLOC/lib:$LD_LIBRARY_PATH export MANPATH=$OPENMPI/share/man:$MANPATH ``` - source /opt/cluster_share/env/intel2019u4 加载intel2019u4编译器运行环境。openmpi是使用intel编译器编译的,因此并行命令运行时,需加载intel编译器支持。 - UCX=/opt/cluster_share/tools/ucx-1.15.0 定义UCX路径,openmpi编译时添加了ucx参数,因此环境中需定义ucx路径 - PMIX3=/opt/cluster_share/tools/pmix-3.2.3 定义PMIX3路径,openmpi编译时添加了PMIX3参数,因此环境中需定义PMIX3路径 - LIBEVENT=/opt/cluster_share/tools/libevent-2.1.12 定义LIBEVENT路径,openmpi编译时添加了LIBEVENT参数,因此环境中需定义LIBEVENT路径 - HWLOC=/opt/cluster_share/tools/hwloc-2.10.0 定义HWLOC路径,openmpi编译时添加了HWLOC参数,因此环境中需定义HWLOC路径 - OPENMPI=/opt/cluster_share/mpi/openmpi/4.1.5+ib+intel2019u4+pmix3+ucx-1.15 OPENMPI是定义一个常量名,一般我们在环境变量中使用常量名时,会让常量名全部为大写。等号后面是Openmpi的安装路径。这行的作用是:定义一个常量OPENMPI,并赋值openmpi的安装路径给它。这种方式在环境变量、作业脚本以及Makefile等文件中非常常见,当需要多次定义相同内容的字符串时,直接引用这个常量即可,如果需要修改,只需修改变常量值就可完成所有引用语句的修改。 - export PATH=$UCX/bin:$OPENMPI/bin:$PMIX3/bin:$LIBEVENT/bin:$HWLOC/bin:$PATH   - export——声明,向系统声明其后面语句所定义的内容。 - PATH——可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。请注意,PATH是用于定义应用软件可执行文件路径。一般是以PATH=/应用软件可执行文件绝对路径/bin:$PATH格式。 - $常量名——引用上一行定义的常量,连续引用多个常量名定义可执行文件路径。连续定义是用:号分隔。也可以直接写常量定义的内容,例如:export PATH=/opt/cluster_share/mpi/openmpi/4.1.5+intel2019u4+pmix-3.2.3/bin:$PATH。由此我们可以看到,引用常量的方式是非常便捷而且不易出错的。 这行的作用是:向系统声明Openmpi可执行文件的路径。在这行声明生效后,我们可以像输入Linux命令一样,直接输入mpirun就可以让应用软件并行运行了。 - export LD_LIBRARY_PATH=$UCX/lib:$OPENMPI/lib:$PMIX3/lib:$LIBEVENT/lib:$HWLOC/lib:$LD_LIBRARY_PATH LD_LIBRARY_PATH——用以向系统声明openmpi库文件路径,当应用软件或服务启动时,会向系统搜索所需的库文件,因此只有向系统声明过库文件路径才能被检索到。其格式:LD_LIBRARY_PATH=应用软件可执行文件绝对路径/lib:$LD_LIBRARY_PATH - export MANPATH=$OPENMPI/share/man:$MANPATH MANPATH——是向系统声明帮助文件的路径。当使用Openmpi并行运行应用软件时,如果运行错误,它将提供报错信息。 PATH、LD_LIBRARY_PATH是最常见的环境变量,其它如定义License文件、头文件等,在下面的示例中会有演示。 ## 环境变量的使用 ### 用户环境配置文件 普通用户的环境配置文件有: ``` .bash_profile、.bashrc ``` 当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。 当用户登录时以及每次打开新的Shell时该文件都将被读取。 这两个文件修改其中任意一个都可以实现定义用户环境变量的效果。 下面是一个用户环境变量示例。   用户SSH登录Linux系统后,在用户主目录,用vi命令编辑.bash_profile文件 ``` vi .bash_profile ``` 打开.bash_profile文件后,我们发现这个文件是已经有一些内容了。我们以上例的Openmpi环境为例,在.bash_profile文件最后输入如下内容: ``` source /opt/cluster_share/env/intel2019u4 UCX=/opt/cluster_share/tools/ucx-1.15.0 PMIX3=/opt/cluster_share/tools/pmix-3.2.3 LIBEVENT=/opt/cluster_share/tools/libevent-2.1.12 HWLOC=/opt/cluster_share/tools/hwloc-2.10.0 OPENMPI=/opt/cluster_share/mpi/openmpi/4.1.5+ib+intel2019u4+pmix3+ucx-1.15 export PATH=$UCX/bin:$OPENMPI/bin:$PMIX3/bin:$LIBEVENT/bin:$HWLOC/bin:$PATH export LD_LIBRARY_PATH=$UCX/lib:$OPENMPI/lib:$PMIX3/lib:$LIBEVENT/lib:$HWLOC/lib:$LD_LIBRARY_PATH export MANPATH=$OPENMPI/share/man:$MANPATH ``` 在完成输入,并保存退出后,执行: ``` source .bash_profile ``` 让用户环境即可生效。 **特别注意:** >普通用户使用Linux系统进行课题计算时,建议仅在以下情况下,环境变量写到用户环境配置文件中: >用户账号只运行单一软件。我们把软件所需编译器、并行环境、软件可执行文件路径、软件所需库文件写到用户环境配置文件中,这样就可以直接运行软件。但如果用户账号下要使用多个软件时,要特别注意可能发生环境变量冲突造成软件运行失败。 ### 作业脚本   当我们使用作业脚本提交计算任务时,可以把计算环境写到作业脚本中。这种方式适用于用户账号使用多种计算软件,并且各计算软件的计算环境不兼容。当我们提交一个作业脚本时,作业调度系统会读取当前作业脚本文件,并以作业脚本中定义的环境变量为计算环境。因此在提交多个作业脚本时,计算环境只以提交的作业脚本中环境变量为计算环境的,这样,运行不同的软件是不会有计算环境冲突问题发生的。 我们以VASP作业脚本为例: ``` #!/bin/bash #SBATCH -J vasp-std-test-pmix_v3-1 #SBATCH -N 1 #SBATCH -n 16 #SBATCH -p batch #load env source /opt/cluster_share/env/vasp.5.4.4+ib+intel2019u4+openmpi-4.1.5+pmix3 #running app srun --mpi=pmix_v3 vasp_std >& result.log ```   我们可以看到,在作业脚本的中部,我们用source命令加载了前面写好的vasp运行环境文件。这样写只是为了大家能理解作业脚本中如何定义计算环境,在计算实验室集群上,openmpi和vasp的计算环境是都写在vasp环境文件中的,这样在作业脚本中使用source命令加载一个环境文件就加载全部计算环境了。 ## 软件环境文件示例 以下环境变量内容供同学参考。**在集群的/opt/cluster_share/envs目录下,有全部环境文件** ### Intel 2019 ``` source /opt/cluster_share/compiler/intel/2019u4/bin/compilervars.sh intel64 ``` ### openmpi-4.1.5+ib+intel2019u4+pmix3+ucx-1.15 ``` source /opt/cluster_share/env/intel2019u4 UCX=/opt/cluster_share/tools/ucx-1.15.0 PMIX3=/opt/cluster_share/tools/pmix-3.2.3 LIBEVENT=/opt/cluster_share/tools/libevent-2.1.12 HWLOC=/opt/cluster_share/tools/hwloc-2.10.0 OPENMPI=/opt/cluster_share/mpi/openmpi/4.1.5+ib+intel2019u4+pmix3+ucx-1.15 export PATH=$UCX/bin:$OPENMPI/bin:$PMIX3/bin:$LIBEVENT/bin:$HWLOC/bin:$PATH export LD_LIBRARY_PATH=$UCX/lib:$OPENMPI/lib:$PMIX3/lib:$LIBEVENT/lib:$HWLOC/lib:$LD_LIBRARY_PATH export MANPATH=$OPENMPI/share/man:$MANPATH ``` ### vasp.5.4.4+openmpi-4.1.5+intel2019u4+pmix-3.2.3 ``` source /opt/cluster_share/env/openmpi-4.1.5+ib+intel2019u4+pmix3+ucx-1.15 export PATH=/opt/cluster_share/apps/vasp/5.4.4+ib+intel2019u4+openmpi-4.1.5+pmix3/bin:$PATH ``` ### g16 ``` #!/bin/sh g16root=/opt/cluster_share/apps export g16root source $g16root/g16/bsd/g16.profile GAUSS_SCRDIR=/tmp export GAUSS_SCRDIR ``` >需要注意GAUSS_SCRDIR常量的定义,示例中把用于存放计算过程文件的临时文件目录定义到/tmp目录下。如果需要看(作业在计算节点运行所产生的过程文件,如果在/tmp目录下(非共享目录),用户只能ssh到计算节点去看,如果把GAUSS_SCRDIR指定到用户目录,这样用户在管理节点里就可以查看到,但会影响计算性能)或保存计算过程文件,可以把GAUSS_SCRDIR定义到用户目录中。 ### vaspkit ``` source /opt/cluster_share/envs/anaconda3 export PATH=/opt/cluster_share/apps/vasp/vaspkit.1.4.1/bin:$PATH ```