批量执行 (Batch Execution) — CAE术语解说
批量执行概述
定义与基本概念
批量执行(Batch Execution)是指通过命令行或脚本启动CAE求解器,而无需通过GUI(图形用户界面)进行交互的执行方式。用户无需坐在屏幕前,投入作业后可以放置不管,等待结果生成。这是最大的优点。
典型的批量执行命令示例:
# Abaqus情况
abaqus job=model_01 cpus=8 interactive
# OpenFOAM情况
mpirun -np 16 simpleFoam -parallel > log.simpleFoam 2>&1
# ANSYS Mechanical情况
ansys212 -b -np 4 -i input.dat -o output.txt
批量执行与用GUI普通运行分析有什么区别?我们公司的人都是从Abaqus/CAE界面上点"提交"按钮……
从GUI点提交时,实际上后台也在运行批量执行。但GUI需要人坐在电脑前逐个操作,而直接使用批量执行则可以在夜间或周末一次性运行50个计算,早上来时结果就齐了。这样的效率差异在实务CAE中差异巨大。
听起来不错,但命令行看起来很难……没有Linux知识可以吗?
最少需要掌握一些基础Linux命令——cd切换目录、ls列出文件、cat查看文件内容——就够了。只要这些就可以开始了。因为HPC集群基本都是Linux系统,迟早要学,不如现在就学吧。
HPC队列系统
企业和研究机构通常在多用户共享的HPC(High Performance Computing)集群上进行CAE分析。为了公平分配计算资源,需要使用作业调度程序(队列系统)来管理。
代表性的作业调度程序:
- SLURM(Simple Linux Utility for Resource Management)— 当前最流行。用
sbatch投入作业,squeue查看状态 - PBS / Torque(Portable Batch System)— 历来的标准。用
qsub投入,qstat查看 - LSF(Load Sharing Facility)— IBM产品,大企业采用较多。用
bsub投入 - SGE(Sun Grid Engine)— 现存为Open Grid Scheduler
在HPC集群上运行分析时,经常听说SLURM和PBS,那是什么?与在自己电脑上运行有什么区别?
这是作业调度程序。比如100个工程师共用一个集群,如果大家随意运行作业会耗尽资源。调度程序自动分配"这个人的作业用节点3-6,那个人的作业用节点10-12"。
具体怎样投入作业呢?
以SLURM为例,首先编写一个"作业脚本"的Shell脚本,其中记述所需的CPU数、内存、最大执行时间、执行命令。然后用sbatch job.sh投入。作业进入队列,资源空闲时自动执行。等待时间长时用squeue -u 用户名查看自己作业的状态。
作业脚本的编写
SLURM作业脚本的基本结构:
#!/bin/bash
#SBATCH --job-name=crash_sim_01
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=32
#SBATCH --time=24:00:00
#SBATCH --partition=general
#SBATCH --output=job_%j.out
#SBATCH --error=job_%j.err
module load abaqus/2024
cd $SLURM_SUBMIT_DIR
abaqus job=crash_model cpus=$SLURM_NTASKS scratch=$TMPDIR mp_mode=mpi
PBS作业脚本的情况:
#!/bin/bash
#PBS -N thermal_analysis
#PBS -l nodes=1:ppn=16
#PBS -l walltime=12:00:00
#PBS -q batch
#PBS -o thermal.log
#PBS -e thermal.err
module load ansys/2024r1
cd $PBS_O_WORKDIR
ansys242 -b -np 16 -i thermal_input.dat -o thermal_output.txt
#SBATCH --time=24:00:00的墙时间超过会怎样?
作业被强制停止。这是初学者最容易遇到的坑。设置较短的墙时间通常队列等待时间会减少,但太短就会被切断。最好先留足余量,然后根据实际经验调整合适的值。
被切断了就要从头再来吗?那太浪费了……
有些求解器有重启功能。比如Abaqus可以用oldjob=前次作业名从中断点继续。LS-DYNA也用R=rstfile支持重启。大规模非线性解析或显式衝撞解析,要设置频繁输出重启文件。
参数化研究的结合应用
批量执行的真正威力体现在改变设计参数,自动执行多个案例的参数化研究(参数扫描)中。板厚5阶段、材料3种、荷载4水平——全组合是5×3×4=60个案例,用GUI手工逐个运行不现实,但用批量执行就能自动化。
用批量执行运行参数化研究时,怎样生成60个不同的输入文件?不能手工写吧。
标准做法是"模板+替换脚本"。先写一个输入文件模板,把参数部分用@@THICKNESS@@这样的占位符表示。然后用Python或Shell脚本循环替换这些占位符为实际值,自动生成文件。大概是这样:
# Python生成参数化输入文件的例子
import itertools, os
thicknesses = [1.0, 1.5, 2.0, 2.5, 3.0]
materials = ['steel', 'aluminum', 'titanium']
loads = [1000, 2000, 3000, 4000]
template = open('template.inp').read()
for t, mat, load in itertools.product(thicknesses, materials, loads):
case_name = f"case_t{t}_mat{mat}_F{load}"
inp = template.replace('@@THICKNESS@@', str(t))
inp = inp.replace('@@MATERIAL@@', mat)
inp = inp.replace('@@LOAD@@', str(load))
os.makedirs(case_name, exist_ok=True)
with open(f"{case_name}/model.inp", 'w') as f:
f.write(inp)
输入文件生成后,作业投入也能自动化吗?60个一个个sbatch也麻烦。
SLURM有作业数组功能。写#SBATCH --array=0-59就能一次投入60个作业,每个作业自动获得$SLURM_ARRAY_TASK_ID标识符0到59。脚本内部用这个编号从参数列表取对应参数,一个脚本就能管理全部案例。这是HPC运维的基本技巧。
#!/bin/bash
#SBATCH --job-name=param_sweep
#SBATCH --array=0-59
#SBATCH --ntasks=8
#SBATCH --time=04:00:00
#SBATCH --output=logs/job_%A_%a.out
# 从参数列表获取案例
CASE_DIR=$(sed -n "$((SLURM_ARRAY_TASK_ID + 1))p" case_list.txt)
cd $CASE_DIR
module load abaqus/2024
abaqus job=model cpus=$SLURM_NTASKS scratch=$TMPDIR
结果的后处理也能自动化吗?60个案例的图表手工做太累了。
后处理自动化才是批量执行的真髓。用Python读取odb文件提取结果,把最大应力写进CSV,再用pandas和matplotlib一次性绘图可视化。这样就能快速看出"改变参数后结果如何变化"的趋势。结合DOE(实验设计法),就能找到最优设计的入口。
故障排查
批量作业中途失败时怎样调试?GUI也没有错误对话框。
首先查看作业的标准输出和标准错误日志文件。SLURM情况下是job_12345.out和job_12345.err。还要看求解器特有的日志。Abaqus看.msg和.sta文件,OpenFOAM看log.simpleFoam。常见原因有三个:
- 内存不足(OOM): 查看命令:
sacct -j <jobid> --format=MaxRSS。解决方法:增加节点数或粗化网格 - 墙时间超过: 查看命令:
sacct -j <jobid> --format=Elapsed,Timelimit。解决方法:延长时间限制或利用重启 - 许可证不足: 求解器的许可证令牌全部被占用,作业无法开始。用
lmstat -a查看
许可证不足时,作业会报错吗?还是在队列中等待?
这取决于求解器和调度程序的设置。Abaqus许可证不足时会立即错误退出,导致一次性投入大量作业时多数失败。解决方法是编写脚本在投入前检查许可证空闲,或使用SLURM的许可证资源管理功能。而OpenFOAM这样的开源求解器就不用担心许可证了。
相关术语
- HPC(High Performance Computing): 大规模并行计算机环境。CAE主要使用集群型HPC
- MPI(Message Passing Interface): 并行计算标准进程间通信库
- DOE(Design of Experiments): 实验设计法。用于规划参数化研究的高效执行
- 作业数组: 调度程序功能,用不同参数同时运行多个相同脚本
- 重启解析: 从中断点继续执行作业的功能
准确理解CAE术语是团队内沟通的基础。— Project NovaSolver也面向实务者的学习支援。
在批量执行实务中遇到的课题,请告诉我们
Project NovaSolver致力于解决CAE工程师日常面临的课题——设置的复杂性、计算成本、结果解释——等问题。你的实务经验将成为更优工具开发的原动力。
联系我们(准备中)相关主题
价值
更详细
错误