Python环境与Slurm(srun/sbatch)的问题

3
我在Ubuntu上尝试使用"virtualenv --system-site-packages myenv"建立虚拟环境,并使用slurm (srun/sbatch)运行我的Python脚本时,遇到了问题。
虽然我过去可以无问题地运行我的代码,但现在在激活环境(source ./myenv/bin/activate)后运行时,会出现"ModuleNotFoundError"错误。
我注意到,虽然我可以正常地使用当前激活的环境运行"python foo.py",但是"srun python foo.py"失败了。实际上,通过打印sys.version,我可以看到与没有srun命令的Python命令不同,这告诉我环境已经改变了(因此找不到我的软件包)。"srun python --version"也证实了这一点。
有人遇到过类似的问题吗?
谢谢
2个回答

1
我在Slurm 20.11.7版本中遇到了类似的问题。
我使用系统Python3创建了一个虚拟环境,该环境的Python版本为3.6.8。
在登录节点上激活venv后,调用已安装的模块可以正常工作,但是在以下shell脚本中却不能正常工作,并出现ModuleNotFound错误。
#!/bin/bash

#SBATCH --partition=gpu         #use GPU partition
#SBATCH --nodes=1               #number of nodes 
#SBATCH --gres=gpu:2            #number of GPUs per node 
#SBATCH --job-name=joeynmt_test
#SBATCH --mail-user=email
#SBATCH --mail-type=all
#SBATCH --ntasks=1
#SBATCH --mem=24G
#SBATCH --time=08:00:00
#SBATCH --qos=standard


source /home/.../bin/activate   #activate venv
python3 --version
which python3


python3 -m myModule

在激活虚拟环境后直接调用python3 --version,结果显示的是系统中的Python及其位置,而不是venv中的Python。我成功的方法是加载一个更新版本的Python(module add Python/3.8.6-GCCcore-10.2.0),然后创建venv,并在shell脚本中相应地使用它。
#!/bin/bash

#SBATCH --partition=gpu         #use GPU partition
#SBATCH --nodes=1               #number of nodes 
#SBATCH --gres=gpu:2            #number of GPUs per node 
#SBATCH --job-name=joeynmt_test
#SBATCH --mail-user=email
#SBATCH --mail-type=all
#SBATCH --ntasks=1
#SBATCH --mem=24G
#SBATCH --time=08:00:00
#SBATCH --qos=standard

module add Python/3.8.6-GCCcore-10.2.0

source /home/.../bin/activate   #activate venv
python3 --version
which python3


python3 -m myModule

使用sbatch将此提交到Slurm时没有引发任何错误,并且venv已成功“传输”到工作节点。对其他人可能有帮助。

1

Python环境是通过环境变量设置的,而Slurm并不总是将您当前的环境传递到作业中。您可以使用--export选项指定它,例如使用--export=ALL。如果没有指定任何内容,则应该是默认值,但您的管理员可能已通过特定的Slurm环境变量进行更改。

另一种解决方法是在作业脚本中加载虚拟环境,如果您使用sbatch。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接