文章提出Python工作流定义(PWD),用于在基于Python的工作流管理系统(AiiDA、jobflow和pviron)之间交换工作流。PWD由三部分组成:conda环境文件、Python模块和JSON工作流图。该格式支持有向无环图(DAG)工作流,实现了工作流的导出和导入,提升计算材料科学领域工作流的互操作性和可重复性。
计算材料科学领域存在多种工作流管理系统(WfMS),但不同格式阻碍了工作流的互操作性和可重复性。文章提出Python工作流定义(PWD),作为基于Python的WfMS(AiiDA/jobflow/pviron)的通用交换格式。PWD通过分离科学复杂性(工作流逻辑)和技术复杂性(执行环境),实现工作流的跨平台共享。
PWD包含三个核心组件:
通过environment.yml文件指定软件依赖:
channels: - conda-forge dependencies: - python=3.12
支持跨平台复现计算环境,覆盖材料科学常用工具链。
包含工作流节点函数,独立于WfMS实现。例如算术工作流函数:
def get_prod_and_div(x: float, y: float) -> dict:
return {"prod": x*y, "div": x/y}
函数支持多返回值(如矩阵对角化的特征值和向量)和类型提示,增强互操作性。
基于ELK格式存储节点和边关系:
{
"nodes": [
{"id":0, "type":"function", "value":"workflow.get_sum"}
],
"edges": [
{"source":0, "target":1, "targetPort":"x"}
]
}
关键特性:
• 节点类型:函数/输入/输出
• 端口映射:精确控制数据流向
• 可扩展性:字典结构支持未来扩展
PWD在三大WfMS中的实现:
通过task装饰器封装函数:
get_sum = task(outputs=["result"])(_get_sum) wg.add_task(get_sum, x=orm.Float(1.0))
支持数据溯源和HPC任务调度。
使用job装饰器生成延迟执行对象:
get_square = job(_get_square) result = get_square(x=tmp_sum.output)
适配高通量计算场景。
指定输出键列表实现预链接:
get_prod_and_div = job(_get_prod_and_div,
output_key_list=["prod","div"])
支持HDF5数据存储和资源分配。
Quantum ESPRESSO工作流(图3):
\[ \text{结构生成} \rightarrow \text{弛豫计算} \xrightarrow{\text{应变}} \text{能量计算} \rightarrow \text{绘图} \]
跨系统执行代码一致性:
# AiiDA/jobflow/pyiron共用
wg = pwd.load_workflow.json("qe.json")
wg.tasks[0].inputs.a.value = 4.05 # 修改晶格常数
wg.run()
有限元仿真工作流(图4):
def generate_mesh(domain_size: float) -> str:
subprocess.call(["gmsh", "-2", ...])
return "square.msh" # 返回文件路径
通过Python函数封装外部可执行文件,实现非Python工具链集成。
当前限制:
• 仅支持有向无环图(DAG),不包含动态循环
• 计算资源配置需各WfMS单独指定
未来方向:
• 支持动态流控制(循环/条件分支)
• 扩展至实验数据处理工作流
• 开发HPC资源标准化接口