首页 > 解决方案 > 在远程集群上执行 pyiron 包装器之前设置环境变量

问题描述

我在 ~/pyiron/resources/queues/ 中使用 SLURM 的作业文件,大致如下所示:

#!/bin/bash
#SBATCH --output=time.out
#SBATCH --job-name={{job_name}}
#SBATCH --workdir={{working_directory}}
#SBATCH --get-user-env=L
#SBATCH --partition=cpu

module load some_python_module
export PYTHONPATH=path/to/lib:$PYTHONPATH

echo {{command}}

如您所见,在调用“python -m pyiron.base.job.wrappercmd ...”之前,我需要加载一个模块以访问正确的python版本,并且我还想设置 PYTHONPATH 变量。

直接在 SLURM 作业文件中设置环境当然是可行的,但是看起来很不方便,因为每当我想用稍微不同的环境运行计算时,我都需要在 ~/pyiron/resources/queues/ 下创建一个新的作业文件。理想情况下,我希望能够直接在 Jupyter notebook 中调整环境。可以通过 Jupyter 配置的上述作业中的 {{environment}} 块之类的东西似乎是一个不错的解决方案。据我所知,对于当前版本的 pyiron 和 pysqa,这是不可能的。是否有类似的解决方案可用?

作为替代方案,我还可以想象将上述作业文件存储在 Jupyter 笔记本附近。这也将减轻我的同事的可重复性。是否有一个选项可以定义一个特定的文件用作jobile的jinja2-template?

在运行 pyiron 作业之前,我可以通过 Jupyter 在 ~/pyiron/resources/queues/ 下编写一个临时作业文件来实现我的预期设置,但这感觉像是一个非常棘手的解决方案。

非常感谢你,

弗洛里安

标签: pyiron

解决方案


更详细地解释这个例子:

我创建了一个名为:的笔记本reading.ipynb,内容如下:

import subprocess
subprocess.check_output("echo ${My_SPECIAL_VAR}", shell=True)

这将读取环境变量My_SPECIAL_VAR

我现在可以使用第二个 jupyter notebook 提交此作业:

import os
os.environ["My_SPECIAL_VAR"] = "SoSpecial"
from pyiron import Project
pr = Project("envjob")
job = pr.create_job(pr.job_type.ScriptJob, "script")
job.script_path = "readenv.ipynb"
job.server.queue = "cm"
job.run()

在这种情况下,我首先设置环境变量,然后提交一个脚本作业,脚本作业能够在使用--get-user-env=L选项转发时读取相应的环境变量。因此,您应该能够在用于提交计算的 jupyter notebook 中定义环境。


推荐阅读