最近因为业务关系和某家超算供应商有合作,使用过程中涉及到Abaqus软件部署问题。虽然平台客服提供了安装方案,但对于我这种爱瞎折腾的人来说不自己亲自动手解决是不会善罢干休的,而且还可以顺便水篇文章。
1. 平台配置
哪家平台就不细说了,反正又没给我付广告费。
这里用的安装包是SIMULIA 2024,系统要求GLIBC>=2.281、GLIBCXX>=3.4.21及CXXABI>=1.3.9。后两个好解决,可以通过LD_PRELOAD载入高版本的libstdc++.so暂时绕过限制。但是GLIBC涉及到底层动态库,除非升级发行版或者重新编译,否则真没什么好的解决办法。
用以下命令查看当前登陆节点的GLIBC版本。
getconf GNU_LIBC_VERSION
注意这是登陆节点的GLIBC版本,计算节点和登陆节点的GLIBC甚至发行版未必一致,需要和平台确认清楚。
按这些平台的尿性,部署节点安装的大多数是CentOS 7或者对应版本的RHEL发行版,版本号不会太高,毕竟要优先保证兼容性。
uname -r -v
2. GLIBC切换
好在我用的这个平台推出了GLIBC版本热切换功能2,搭配slurm在计算脚本头部添加两行注释即可,也算是十分方便了。
...
#SBATCH --comment={glibcVersion:2.31} # 指定使用glibc 2.31环境
#SBATCH --exclusive # 独占节点
...
至于哪个分区支持哪些GLIBC版本,可以通过whichpartition命令查看。
由于登陆节点GLIBC版本太低,需要登陆一个计算节点并切换到高版本的GLIBC中进行安装,通过salloc命令申请独占一个计算节点。-p指定是计算节点所在的分区为wzhctest,-N1指定占用1个节点,-t指定运行时间2小时(避免超时不退出导致计费太高),其他的开关和sbatch脚本注释一样。
salloc -p wzhctest -N1 --ntasks-per-node=64 -q normal -t 2:00:00 --comment={glibcVersion:2.31} --exclusive
申请成功后会返回作业号和节点列表,也可以通过squeue查看申请的作业号的节点列表。下面通过SSH连接节点。
ssh k02r1n18 # k02r1n18是上面显示返回的节点名称
使用getconf GNU_LIBC_VERSION查看登陆的计算节点GLIBC版本。
3. 安装程序
载入高版本GCC编译环境。
module purge # 清除当前载入的模块
module load compiler/gcc/9.3.0 # 载入GCC 9.3.0
定义一些环境变量,避免报错
export DSYAuthOS_`lsb_release -si`=1
export DSY_Force_OS=linux_a64
export NOLICENSECHECK=true
这个时候直接启动安装程序还是会报错。
./StartTUI.sh
参考前面说的,通过LD_PRELOAD载入高版本的libstdc++.so暂时绕过限制。你要是问我高版本libstdc++.so那里找,只能告诉你自己扫描系统环境吧。
LD_PRELOAD=/public/software/compiler/gnu/gcc-9.3.0/lib64/libstdc++.so.6.0.28 ./StartTUI.sh
正常进入安装界面,这时候参考之前的文章3完成安装即可。
如果遇到Linux许可证服务器无法启动的问题,可以考虑安装2022版的SSQ许可证服务器,两者效果是一样的,只不过SSQ的许可在服务器安装需要root权限。超算上普通用户一般没有root权限,建议联系平台客服解决。也可以参考这篇文章4,通过分离部署解决许可证服务器问题。
4. 善后工作
安装完成后记得使用exit命令退出计算节点,然后通过scancel取消任务,避免持续扣费。
scancel 27998015 # 27998015是你的作业号,可以通过squeue查询
新建环境变量配置文件abaqus2024.env,最好放在安装目录下,方便在不同计算分区上打包迁移。
export LICENSE_PREFIX_DIR=[install-path]/SIMULIA/License/2024/linux_a64/code/bin
export SIMULIA_COMMAND_DIR=[install-path]/SIMULIA/Commands
export PATH=$SIMULIA_COMMAND_DIR:$LICENSE_PREFIX_DIR:$PATH
export LM_LICENSE_FILE=29100@login01 #许可证服务器部署在登录节点
参考计算脚本如下,通过sbatch提交即可。
#!/bin/bash
#SBATCH -J abaqus2024 #作业名
#SBATCH -p test #计算节点所在分区
#SBATCH -N 1 #节点数
#SBATCH --ntasks-per-node=64 #每节点进程数
#SBATCH --comment={glibcVersion:2.31}
#SBATCH --exclusive
#SBATCH -o out.%j
#SBATCH -e err.%j
module purge
module load compiler/gcc/9.3.0
module load mpi/openmpi/4.1.5/gcc-9.3.0
source /work/home/ac8ytpxsek/opt/SIMULIA/abaqus2024.env
export EXEC=abaqus
WORK_DIR=`pwd` #当前目录
INPUT_FILE=abaqus_test.inp #输入文件
job_name=`echo ${INPUT_FILE} | awk -F. '{print $1}'`
#USER_FILE=example.for #fortran子程序
LOG_FILE=abaqus_test.log
#########################################################
cd $WORK_DIR
env_file=abaqus_v6.env
node_list=$(scontrol show hostname ${SLURM_NODELIST} | sort -u)
mp_host_list="["
for host in ${node_list}; do
mp_host_list="${mp_host_list}['$host', ${SLURM_CPUS_ON_NODE}],"
done
mp_host_list=$(echo ${mp_host_list} | sed -e "s/,$/]/")
echo "mp_host_list=${mp_host_list}" >${env_file}
echo "mp_mpi_implementation=PMPI" >>${env_file}
echo "mp_file_system=(SHARED, LOCAL)" >>${env_file}
$EXEC job=${job_name} input=${INPUT_FILE} cpus=$SLURM_NPROCS mp_mode=MPI int