主页 › 范文 › 软件工程 › 本文

Python工作流定义:计算材料设计的工作流交换格式

摘要

文章提出Python工作流定义(PWD),用于在基于Python的工作流管理系统(AiiDA、jobflow和pviron)之间交换工作流。PWD由三部分组成:conda环境文件、Python模块和JSON工作流图。该格式支持有向无环图(DAG)工作流,实现了工作流的导出和导入,提升计算材料科学领域工作流的互操作性和可重复性。

1. 引言

计算材料科学领域存在多种工作流管理系统(WfMS),但不同格式阻碍了工作流的互操作性和可重复性。文章提出Python工作流定义(PWD),作为基于Python的WfMS(AiiDA/jobflow/pviron)的通用交换格式。PWD通过分离科学复杂性(工作流逻辑)和技术复杂性(执行环境),实现工作流的跨平台共享。

2. Python工作流定义(PWD)

PWD包含三个核心组件:

2.1 Conda环境

通过environment.yml文件指定软件依赖:

channels:
  - conda-forge
dependencies:
  - python=3.12

支持跨平台复现计算环境,覆盖材料科学常用工具链。

2.2 Python模块

包含工作流节点函数,独立于WfMS实现。例如算术工作流函数:

def get_prod_and_div(x: float, y: float) -> dict:
    return {"prod": x*y, "div": x/y}

函数支持多返回值(如矩阵对角化的特征值和向量)和类型提示,增强互操作性。

2.3 JSON工作流图

基于ELK格式存储节点和边关系:

{
  "nodes": [
    {"id":0, "type":"function", "value":"workflow.get_sum"}
  ],
  "edges": [
    {"source":0, "target":1, "targetPort":"x"}
  ]
}

关键特性:
• 节点类型:函数/输入/输出
• 端口映射:精确控制数据流向
• 可扩展性:字典结构支持未来扩展

3. 跨系统互操作性实现

PWD在三大WfMS中的实现:

3.1 AiiDA集成

通过task装饰器封装函数:

get_sum = task(outputs=["result"])(_get_sum)
wg.add_task(get_sum, x=orm.Float(1.0))

支持数据溯源和HPC任务调度。

3.2 jobflow转换

使用job装饰器生成延迟执行对象:

get_square = job(_get_square)
result = get_square(x=tmp_sum.output)

适配高通量计算场景。

3.3 pyiron对接

指定输出键列表实现预链接:

get_prod_and_div = job(_get_prod_and_div, 
                      output_key_list=["prod","div"])

支持HDF5数据存储和资源分配。

4. 应用案例

4.1 能量-体积曲线计算

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.2 文件工作流支持

有限元仿真工作流(图4):

def generate_mesh(domain_size: float) -> str:
    subprocess.call(["gmsh", "-2", ...])
    return "square.msh"  # 返回文件路径

通过Python函数封装外部可执行文件,实现非Python工具链集成。

5. 局限与展望

当前限制:
• 仅支持有向无环图(DAG),不包含动态循环
• 计算资源配置需各WfMS单独指定

未来方向:
• 支持动态流控制(循环/条件分支)
• 扩展至实验数据处理工作流
• 开发HPC资源标准化接口

相关论文