SLURM集群执行srun module load命令提示找不到module文件问题问询
报错原因
module不是独立的二进制可执行文件,是Lmod为shell注入的内置函数,仅在完成Lmod初始化的shell环境中可用。
srun默认不会加载用户的shell配置、也不会提前初始化Lmod环境,会直接尝试把module当作独立的二进制文件执行,自然会报找不到文件的错误。
额外说明:即使通过特殊方式用srun成功执行了module load,加载的环境也仅对本次srun启动的进程有效,不会持久化到节点上,后续新启动的作业进程仍需要重新加载模块。
可行解决方案
方案1:通过作业脚本提交(最稳定,生产环境优先使用)
编写作业脚本run_job.sh,示例内容如下:#!/bin/bash #SBATCH -N 2 # 申请2个节点 #SBATCH -n 2 # 总进程数2 # 加载系统全局配置完成Lmod初始化,部分集群需要替换为集群指定的Lmod初始化脚本路径 source /etc/profile # 加载指定模块 module load python/3.8.10 # 后续所有srun启动的任务都会继承当前的模块环境,自动在两个节点上生效 srun python --version提交作业即可:
sbatch run_job.sh方案2:临时测试用单行命令
不需要写脚本的场景,直接用bash将初始化、加载模块、运行业务的逻辑打包执行:srun -n 2 bash -c "source /etc/profile && module load python/3.8.10 && 替换为你要实际运行的命令"方案3:直接调用Lmod可执行文件
先在交互式节点执行which lmod获取Lmod的可执行路径,例如得到路径为/usr/share/lmod/lmod/libexec/lmod,直接调用即可:srun -n 2 /usr/share/lmod/lmod/libexec/lmod load python/3.8.10 && 替换为你要实际运行的命令
该方案兼容性较差,仅当前两种方案不可用时尝试。
内容的提问来源于stack exchange,提问作者rohit_r
相关产品推荐
相关产品推荐

