1. 引言aiida-hyperqueue 是 AiiDA 生态中的一个计算后端插件它将 AiiDA 的自动化工作流管理与 HyperQueue 的高性能任务调度能力结合起来。HyperQueue 是一个面向 HPC 集群的分布式任务调度器特别擅长处理大量短小任务和动态资源分配。aiida-hyperqueue 让 AiiDA 用户能够以声明式的方式把计算任务提交到 HyperQueue 集群上执行同时保留 AiiDA 的 provenance数据溯源、可复现性和工作流编排能力。本文将从功能特性、安装配置、核心语法与参数、9 个实际应用案例以及常见错误与注意事项五个方面系统介绍 aiida-hyperqueue 的使用方法。2. 功能概述aiida-hyperqueue 的核心功能可以概括为以下几点任务提交与调度把 AiiDA 的 CalcJob 提交到 HyperQueue 队列支持批量提交和动态资源分配。资源管理支持为每个任务指定 CPU 核数、内存、GPU 数量等资源需求HyperQueue 会根据集群资源自动调度。工作流集成与 AiiDA 的 Process 和 WorkChain 无缝集成支持依赖关系、数据传递和 provenance 记录。队列监控提供任务状态查询接口支持轮询和回调两种方式获取任务执行结果。多集群支持可配置多个 HyperQueue 集群按需选择目标集群提交任务。容错与重试支持任务失败自动重试、超时控制和错误日志收集。3. 安装与配置3.1 环境要求安装 aiida-hyperqueue 前需要满足以下环境要求Python 3.8 及以上版本AiiDA 2.0 及以上版本HyperQueue 0.13 及以上版本建议使用最新稳定版可访问的 HyperQueue 调度服务本地或远程3.2 安装步骤推荐使用 pip 安装 aiida-hyperqueuepip install aiida-hyperqueue如果需要安装开发版本可以从 GitHub 仓库安装pip install githttps://github.com/aiidateam/aiida-hyperqueue.gitmain3.3 配置 HyperQueue 计算资源安装完成后需要在 AiiDA 中注册并配置 HyperQueue 计算资源。首先启动 HyperQueue 服务端hq server start然后通过 AiiDA 的 verdi 命令创建计算资源verdi computer setup --label hq-cluster --hostname localhost --transport local --scheduler direct --mpirun-command hq submit接着配置代码code资源指向可执行的 Python 脚本或命令verdi code setup --label hq-code --computer hq-cluster --remote-abs-path /path/to/your/script.py4. 核心语法与参数4.1 提交任务的基本语法在 AiiDA 中使用 aiida-hyperqueue 提交任务的基本流程是定义 CalcJob 子类重写 define 和 prepare_for_submission 方法然后在 WorkChain 或脚本中调用。from aiida import orm from aiida.engine import CalcJob from aiida.plugins import DataFactory class HyperQueueExampleJob(CalcJob): 一个使用 HyperQueue 后端的示例 CalcJob。 classmethod def define(cls, spec): super().define(spec) spec.input(parameters, valid_typeorm.Dict, help任务参数) spec.output(result, valid_typeorm.Dict, help计算结果) spec.inputs[metadata][options][resources].default { num_cpus: 4, memory_mb: 8192, } spec.inputs[metadata][options][queue_name].default default def prepare_for_submission(self, folder): import json params self.inputs.parameters.get_dict() with open(folder.get_abs_path(input.json), w) as f: json.dump(params, f) with open(folder.get_abs_path(run.sh), w) as f: f.write(#!/bin/bash\n) f.write(python compute.py input.json output.json\n) return { code: self.inputs.code.get_executable(), script: run.sh, }/code/pre 4.2 常用参数说明 aiida-hyperqueue 支持以下常用参数配置 参数名 类型 说明 默认值 num_cpus int 任务所需的 CPU 核数 1 memory_mb int 任务所需的内存MB 1024 num_gpus int 任务所需的 GPU 数量 0 queue_name str 目标队列名称 default max_retries int 任务失败后的最大重试次数 0 time_limit str 任务超时时间如 1h、30m 无限制 priority int 任务优先级数值越大优先级越高 0 custom_scheduler_opts dict 传递给 HyperQueue 的额外调度参数 {} 4.3 在 WorkChain 中使用 aiida-hyperqueue 可以嵌入到 WorkChain 中实现复杂的工作流编排 from aiida.engine import WorkChain, ToContext from aiida import orm class HyperQueueWorkChain(WorkChain): 使用 HyperQueue 后端的示例工作流。 classmethod def define(cls, spec): super().define(spec) spec.input(code, valid_typeorm.Code) spec.input(parameters, valid_typeorm.Dict) spec.outline( cls.submit_job, cls.collect_result, ) spec.output(result, valid_typeorm.Dict) def submit_job(self): inputs { code: self.inputs.code, parameters: self.inputs.parameters, metadata: { options: { resources: {num_cpus: 8, memory_mb: 16384}, queue_name: high_priority, } }, } future self.submit(HyperQueueExampleJob, **inputs) return ToContext(jobfuture) def collect_result(self): self.out(result, self.ctx.job.outputs.result)/code/pre 5. 9 个实际应用案例 5.1 案例一批量参数扫描 在材料科学中经常需要对不同参数组合进行批量计算。使用 aiida-hyperqueue 可以轻松实现参数扫描 from aiida import orm, engine from aiida.plugins import CalculationFactory def batch_parameter_scan(code, param_grid): 对参数网格进行批量扫描。 results [] for params in param_grid: inputs { code: code, parameters: orm.Dict(dictparams), metadata: { options: { resources: {num_cpus: 2, memory_mb: 4096}, queue_name: default, } }, } calc engine.submit(CalculationFactory(hyperqueue.example), **inputs) results.append(calc) return results 5.2 案例二分子动力学模拟 分子动力学模拟通常需要大量计算资源。通过 aiida-hyperqueue可以将模拟任务提交到 HPC 集群 def submit_md_simulation(code, structure, forcefield, steps): 提交分子动力学模拟任务。 inputs { code: code, structure: structure, forcefield: forcefield, parameters: orm.Dict(dict{steps: steps}), metadata: { options: { resources: {num_cpus: 16, memory_mb: 32768}, queue_name: md_queue, time_limit: 24h, } }, } return engine.submit(CalculationFactory(hyperqueue.md), **inputs) 5.3 案例三机器学习模型训练 机器学习训练任务通常需要 GPU 资源。aiida-hyperqueue 支持 GPU 资源分配 def submit_training(code, dataset, model_config): 提交机器学习训练任务。 inputs { code: code, dataset: dataset, parameters: orm.Dict(dictmodel_config), metadata: { options: { resources: {num_cpus: 8, memory_mb: 16384, num_gpus: 1}, queue_name: gpu_queue, } }, } return engine.submit(CalculationFactory(hyperqueue.train), **inputs) 5.4 案例四数据预处理流水线 数据预处理通常包含多个步骤可以使用 WorkChain 编排流水线 class DataPipelineWorkChain(WorkChain): 数据预处理流水线。 classmethod def define(cls, spec): super().define(spec) spec.input(raw_data, valid_typeorm.ArrayData) spec.input(code, valid_typeorm.Code) spec.outline( cls.clean_data, cls.normalize_data, cls.feature_extract, ) spec.output(features, valid_typeorm.ArrayData) def clean_data(self): inputs { code: self.inputs.code, data: self.inputs.raw_data, parameters: orm.Dict(dict{step: clean}), metadata: {options: {resources: {num_cpus: 4}}}, } future self.submit(CalculationFactory(hyperqueue.preprocess), **inputs) return ToContext(cleanedfuture) def normalize_data(self): inputs { code: self.inputs.code, data: self.ctx.cleaned.outputs.result, parameters: orm.Dict(dict{step: normalize}), metadata: {options: {resources: {num_cpus: 4}}}, } future self.submit(CalculationFactory(hyperqueue.preprocess), **inputs) return ToContext(normalizedfuture) def feature_extract(self): inputs { code: self.inputs.code, data: self.ctx.normalized.outputs.result, parameters: orm.Dict(dict{step: features}), metadata: {options: {resources: {num_cpus: 8}}}, } future self.submit(CalculationFactory(hyperqueue.preprocess), **inputs) return ToContext(featuresfuture)/code/pre 5.5 案例五量子化学计算 量子化学计算任务通常计算量大、耗时较长。aiida-hyperqueue 可以很好地管理这类任务 def submit_qc_calculation(code, molecule, basis_set, method): 提交量子化学计算任务。 inputs { code: code, molecule: molecule, parameters: orm.Dict(dict{ basis_set: basis_set, method: method, }), metadata: { options: { resources: {num_cpus: 32, memory_mb: 65536}, queue_name: qc_queue, time_limit: 48h, max_retries: 2, } }, } return engine.submit(CalculationFactory(hyperqueue.qc), **inputs) 5.6 案例六并行蒙特卡洛模拟 蒙特卡洛模拟天然适合并行化。通过 aiida-hyperqueue 可以同时提交多个独立模拟任务 def parallel_monte_carlo(code, n_simulations, n_steps): 并行执行多个蒙特卡洛模拟。 futures [] for i in range(n_simulations): inputs { code: code, parameters: orm.Dict(dict{ seed: i, steps: n_steps, }), metadata: { options: { resources: {num_cpus: 1, memory_mb: 2048}, queue_name: mc_queue, } }, } future engine.submit(CalculationFactory(hyperqueue.mc), **inputs) futures.append(future) return futures 5.7 案例七基因组序列分析 基因组分析涉及大量序列比对和数据处理任务适合使用 HyperQueue 进行批量调度 def genome_analysis_pipeline(code, genome_data, reference_db): 基因组序列分析流水线。 inputs { code: code, genome: genome_data, reference: reference_db, metadata: { options: { resources: {num_cpus: 16, memory_mb: 32768}, queue_name: bio_queue, time_limit: 12h, } }, } return engine.submit(CalculationFactory(hyperqueue.genome), **inputs) 5.8 案例八有限元分析 工程仿真中的有限元分析通常需要大量计算资源。aiida-hyperqueue 支持提交这类计算密集型任务 def submit_fem_analysis(code, mesh, material_props, boundary_conditions): 提交有限元分析任务。 inputs { code: code, mesh: mesh, parameters: orm.Dict(dict{ material: material_props, bc: boundary_conditions, }), metadata: { options: { resources: {num_cpus: 64, memory_mb: 131072}, queue_name: fem_queue, time_limit: 72h, } }, } return engine.submit(CalculationFactory(hyperqueue.fem), **inputs) 5.9 案例九多尺度耦合模拟 多尺度模拟需要将不同尺度的计算任务组合在一起。使用 WorkChain 可以编排复杂的多尺度工作流 class MultiScaleWorkChain(WorkChain): 多尺度耦合模拟工作流。 classmethod def define(cls, spec): super().define(spec) spec.input(atomistic_code, valid_typeorm.Code) spec.input(continuum_code, valid_typeorm.Code) spec.input(structure, valid_typeorm.StructureData) spec.outline( cls.atomistic_sim, cls.continuum_sim, cls.coupling, ) spec.output(final_result, valid_typeorm.Dict) def atomistic_sim(self): inputs { code: self.inputs.atomistic_code, structure: self.inputs.structure, metadata: {options: {resources: {num_cpus: 32}}}, } future self.submit(CalculationFactory(hyperqueue.atomistic), **inputs) return ToContext(atomisticfuture) def continuum_sim(self): inputs { code: self.inputs.continuum_code, parameters: self.ctx.atomistic.outputs.result, metadata: {options: {resources: {num_cpus: 64}}}, } future self.submit(CalculationFactory(《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章前6章涵盖深度学习基础包括张量运算、神经网络原理、数据预处理及卷积神经网络等后5章进阶探讨图像、文本、音频建模技术并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法每章附有动手练习题帮助读者巩固实战能力。内容兼顾数学原理与工程实现适配PyTorch框架最新技术发展趋势。