资讯动态

HPC上跑ANSYS Fluent全攻略:从环境准备到断点续算

发布时间:2026/9/16 5:31:58 来源:尧图企业网站定制
在笔记本上跑Fluent跑了两天半第二次路过电脑前盯着那个以爬行速度增长的残差曲线手悬在电源键上方又挪开——不敢关关了怕模型白算。后来把案例挪到集群上跑同样的网格16核并行加断点续算一个晚上出结果人该睡觉睡觉。这个“顿悟时刻”我估计每一个从个人电脑转向HPCHigh Performance Computing的Fluent用户都会经历一次。这篇就把我这几年来在高性能计算环境里折腾ANSYS Fluent的完整经验理一遍。从环境准备、作业提交、核数分配到很多人最关心的“计算中途能不能关电脑”和“怎么暂停续算”再到监控调优和那些一踩一个准的坑全部摊开讲。无论你是刚把案例搬上集群的新手还是在超算中心跑过几个项目但总差点意思的老手应该都能从里面找到一点能直接拿走用的东西。1. 先搞清楚在HPC上跑Fluent和本地台式机有什么本质区别1.1 从“独占GUI”到“排队批处理”的思维转变用过几年Fluent的人肌肉记忆基本是这样的打开Fluent图形界面、读网格、设模型、初始化、迭代、盯着残差。这一切的前提是屏幕上那个窗口一直在鼠标一动参数就能改。到了HPC环境这套思路要彻底反过来——没有屏幕没有鼠标你面对的是一堵看不见的计算墙你的交互工具是命令行、脚本文件和日志文本。这不是退化而是换一种方式做流体仿真。HPC集群上跑Fluent本质上是把“人坐在电脑前操作”变成了“把操作指令写进journal文件然后把人从电脑前赶走”。计算资源不再属于你一个人而是由一个调度系统统一分配你提交一个任务调度系统看哪个节点空闲就安排到哪算完了资源自动释放。所以你会发现HPC思路的核心是三个字不占屏。GUI在HPC上是稀缺资源无GUI批处理模式才是常态。另一个思维变化是“等待”的概念。本地跑case等待时间是你和电脑一对一较劲集群上跑case你等的是调度队列。我提交一个48核的作业前面可能还有几个作业在排队但这个排队时间通常以分钟到小时计真正算起来的速度却是本机的几倍甚至几十倍。1.2 进程托管带来的高可用保障回到文章开头那个“不敢关电脑”的问题。本地跑Fluent计算进程是依附于你的登录会话的。你把笔记本合上、断电、或者SSH连接中断前台运行的Fluent进程大概率直接被杀掉。哪怕你算了一周只要没主动保存数据文件这一周白算。HPC集群则是另一套逻辑。你在登录节点提交作业之后计算进程被调度系统托管跑在计算节点的后台跟你这台本地机器完全脱离。哪怕你把笔记本合上带回家第二天打开一看集群里的作业该跑的还是跑。这也是为什么HPC常被拿来给CFD用户“兜底”——只要作业提交出去你离开电脑的操作对计算没有影响。1.3 资源规模上了一个数量级本地工作站一般4到16核撑死一台双路服务器32到64核内存32到256GB。集群单节点常见32核、64核跨节点可以直接拉到几百甚至上千核内存随核数线性增长。网格量从几十万到千万级甚至亿级都能在这样的资源规模下短期算完。规模和算力当然是优势但反过来也带来新约束——不是所有case都能无脑堆核这个第4章会详细说。2. 上车前的环境准备License校验、模块加载与并行组件包2.1 License是最容易翻车的第一道坎很多第一次上集群的人好不容易申请到账号、连上登录节点module load也成功了结果提交作业后发现Fluent直接启动失败日志里写着license相关错误。原因很简单Fluent的许可证文件或者环境变量没有指向HPC集群能用的License Server。Fluent的license有两类常见模式。第一种是节点锁定node-locked绑定了某台机器的MAC地址这种在个人电脑上很常见但上了集群多半用不了。第二种是网络浮动licensefloating license由一台License Server统一管理集群里的计算节点通过网络从这个Server签发可用额度。你要做的就是确认集群方的License Server地址和端口然后设置环境变量。在新版ANSYS里License环境变量通常是ANSYSLI_LICENSE_FILE老版本用ANSYSLMD_LICENSE_FILE。在提交脚本里可以这样写export ANSYSLI_LICENSE_FILE1055license-server-address其中1055是ANSYS License Manager默认的端口号license-server-address换成你集群实际的License服务器地址。提交前最好先在登录节点手动跑一下lmstat -c 1055license-server-address如果集群装了LMTOOLS或者直接启动一次Fluent测试版试试。2.2 用module load把Fluent“请”进当前环境HPC集群上软件的管理方式通常不是装个启动图标而是用模块系统module environment加载。集群管理员会把Fluent装到某个公共目录然后注册成一个module。你要做的就三行命令module avail # 查看有哪些可用模块 module load ansys/2024R2 # 以实际模块名为准 which fluent flucnt # 确认可执行文件已出现在PATH里需要提醒的是module load只在当前会话生效。如果你用sbatch提交批处理任务提交脚本里的module load是独立执行的也就是说脚本里必须带自己的module load不能指望登录节点加载的模块环境被带进计算节点。这一条踩的人特别多我见过好几个用户本地测试跑得欢一提交作业就报“fluent: command not found”基本都是这个原因。2.3 Intel MPI和oneAPI HPC Toolkit到底起了什么作用Fluent的跨节点并行依赖MPIMessage Passing Interface实现进程间通信。主流HPC集群上的MPI实现有两种一是集群自带的系统MPI比如Open MPI由调度系统集成二是ANSYS自带的Intel MPI位于Ansys安装目录下的某个machiner目录里。Intel oneAPI HPC Toolkit在这张拼图里的角色是一整套Intel编译器、MKL数学核心库和Intel MPI的运行环境。Fluent在包含Intel MPI的构建里会直接调用这套组件所以在很多集群上提交Fluent作业前还要先加载intel或oneapi相关模块特别是用Intel MPI跑跨节点任务的时候module load intel/oneapi/2024.1 module load ansys/2024R2如果你用的Fluent版本是2024R1跑分布式并行时指定-mpiintel底层实际上就是Intel MPI在起作用。Intel oneAPI HPC Toolkit还顺带提供了MKL库对Fluent里涉及线性代数求解的部分有一定加速效果。总的来说这不是强制项但有了它跨节点通信性能和兼容性会稳定不少。3. 任务提交实战从小规模验证到批量计算的完整脚本3.1 先在交互式节点上试一把刚拿到集群账号、还没摸清调度策略的时候直接丢一个几百核的大作业上去大概率不是排队排到怀疑人生就是配置参数错误被系统秒拒。正确姿势是先申请一个交互式会话小规模验证Fluent能启动、license没爆、case能正常迭代。以SLURM调度系统为例申请一个8核交互会话srun --job-nametest -n 8 --time01:00:00 --partitioncompute --pty bash进入计算节点后module load intel/oneapi/2024.1 module load ansys/2024R2 export ANSYSLI_LICENSE_FILE1055license-server-address cd /path/to/your/case flucnt 3ddp -g -t8 -mpiintel -i run.jou test.out 21这里的参数逐一说一下3ddp表示三维双精度2D就是2ddp-g表示无图形界面-t8代表总计算核数为8-mpiintel指定MPI类型为Intel MPI-i run.jou让Fluent执行名为run.jou的journal脚本文件。日志输出重定向到test.out这样你退出交互终端也能事后查看。如果这一步能正常启动迭代说明环境没问题接下来才值得写正式批处理脚本。3.2 批处理脚本的完整骨架批处理脚本本质上是把你刚才在交互式会话里敲的命令固化到一个文件里交给调度系统自动执行。SLURM系统下的完整脚本长这样#!/bin/bash #SBATCH --job-namecylinder_flow #SBATCH --partitioncompute #SBATCH --nodes2 #SBATCH --ntasks-per-node32 #SBATCH --time48:00:00 #SBATCH --outputjob_%j.out #SBATCH --errorjob_%j.err module load intel/oneapi/2024.1 module load ansys/2024R2 export ANSYSLI_LICENSE_FILE1055license-server-address cd $SLURM_SUBMIT_DIR flucnt 3ddp -g -t64 -mpiintel -i solve.jou fluent_run.log 21几个容易被忽略的点--nodes2和--ntasks-per-node32加起来是64核对应-t64三者必须齐平否则Fluent实际启动的进程数和你要的核数对不上。$SLURM_SUBMIT_DIR是SLURM提供的环境变量自动指向提交作业时的目录。在脚本里cd到这个目录确保相对路径的case文件都找得到。 fluent_run.log 21这个重定向一定要有否则Fluent的运行日志会丢失后面排查问题完全没有抓手。3.3 三大调度系统的脚本差异不同超算中心用的调度系统不一样中国国内高校和科研机构用SLURM居多但部分老牌中心还在用PBS/Torque工业界也有不少用LSF的。三个调度系统脚本的字段对应关系整理如下功能SLURMPBS/TorqueLSF作业名#SBATCH --job-namexx#PBS -N xx#BSUB -J xx节点数#SBATCH --nodes2#PBS -l nodes2:ppn32#BSUB -n 64总核数--ntasks64#PBS -l np64#BSUB -n 64运行时间--time48:00:00-l walltime48:00:00-W 48:00输出日志--outputjob_%j.out-o job_$PBS_JOBID.out-o job_%J.out提交命令sbatch job.slurmqsub job.pbsbsub job.lsf换了一个集群先查清楚调度系统再套对应的脚本模板。我在实际接触过的集群里见过太多因为脚本格式不符导致作业秒挂的情况这基本是换平台的第一课。4. “核数越多越快”是错觉资源分配与网格分区策略4.1 为什么不是核数翻倍、时间减半我刚用上集群那阵子也有这个错觉16核算一晚32核不就半天实际一跑傻眼。32核可能只比16核快30%再往上加到64核甚至出现负加速。原因在通信开销。Fluent的并行计算是把整个计算域切块分给不同的核心每个核心只管自己那块网格的计算但算到边界的时候相邻核心之间要交换边界数据。核数多了以后每个核心负责的网格变少计算本身的时间降下来了但核心与核心之间通信花的时间占比反而升高。更关键的是Fluent的每个MPI进程要处理跨进程数据交换这里面的延迟和带宽开销是集群算力提升的最大天敌。网格越密、单步计算量越大核数翻倍的收益就越明显网格稀疏、单步算得快反而会被通信时间拖垮。这是理解并行计算“甜点核数”的起点。4.2 网格分区Fluent是怎么把计算域分给几百个核的Fluent在并行启动时会自动对网格进行分区partition把一个大计算域切成若干块分给各个计算核心。默认使用的分区算法是Metis更老一些有RCBRecursive Coordinate Bisection。Metis是图分割算法它试图让分完的每块网格量大致相等同时把块与块之间的相邻面数降到最低——相邻面越少跨核通信越少。所以大多数情况下让Fluent自动分区即是最优解没必要人工干预。人工干预的场合也有比如你知道某个区域的物理过程特别剧烈需要更细的网格密度可以在TUI里用/parallel/partition/rcb把算法切成RCB按坐标均匀切分在某些几何规则的长方体流域里RCB反而比Metis通信量更小。这不是常规操作但值得知道有这条路。4.3 找到你的“甜点核数”我一般建议每个新case都要做一次弱扩展测试Weak Scaling来确定甜点核数。方法是固定网格量不变分别在8、16、32、64、128核下各跑100步记录每步耗时然后画出一条曲线。一个典型的测试结果长这样核数每步耗时s相对8核加速比82.401.00161.301.85320.753.20640.524.621280.475.11看这组数据64核到128核只提升了约10%的速度但计算资源翻了一倍。对于民用超算核时计费的环境128核是明显不划算的64核就是这个case的甜点。不用每次都测全套换个模型尺寸或网格量级以后测一轮就够参考了。5. 计算中途断电/掉线怎么办从自动保存到无缝续算5.1 为什么集群上“关电脑”不可怕前面说了Fluent进程由调度系统托管这正是“中途关电脑”问题的最优解。但这里要做一个清醒的分界进程还在不代表数据是安全的。如果你的作业本身没有设置自动保存即使进程没死任何一次集群节点异常重启、作业被管理员kill、配额超时照样会让你从头再来。所以答案不是“可以放心关机”而是“只要开启了合适的自动保存策略你不但可以关机甚至可以随时把作业杀掉下次从断点继续”。问题从“敢不敢关机”变成了“能不能续算”。5.2 自动保存的频率、覆盖策略与命名规范Fluent的自动保存设置在“计算活动”之外需要你在启动计算前一次性配置好。GUI路径是Solve → Calculation Activities → Autosave。批处理场景下用journal脚本设置更高效。在run.jou里写; 每200步保存一次data文件文件名带时间步号 /file/auto-save/data-frequency 200 /file/auto-save/append-file-name-with-time-step yes /file/auto-save/retain-most-recent-files yes /file/auto-save/max-files 20这几个命令的实际效果每迭代200步保存一次数据文件文件名自动追加时间步号比如cylinder_t1200.dat.gz旧文件最多保留20份超过就滚动覆盖最老的。频率选择我的经验值是这样瞬态计算建议每个物理时间步保存一次或每几个时间步保存一次因为瞬态计算一旦中断丢失的重算代价很高稳态计算可以放宽到几百步一次因为稳态本身对中间过程不敏感。如果你用的是-i启动的journal也可以在journal里直接加这些配置让整个计算过程自动执行。5.3 断点续算的标准操作流程假设你的作业已经运行到第2000步文件cylinder_t2000.dat.gz已经落盘此刻因为某些原因进程停了或者你打算主动暂停。恢复流程的核心思路是读入之前保存的case和data继续迭代。最稳妥的续算journal脚本如下/file/read-case cylinder.cas.gz /file/read-data cylinder_t2000.dat.gz /solve/iterate 2000注意读case和读data的顺序是先case后data。如果你只读data不读caseFluent会用默认初始化状态来跑等于白算。这里一个容易被忽略的点是read-case会把计算参数湍流模型、边界条件、数值格式、求解器设置全部恢复但一些“会话级”设置比如前面配置的自动保存策略、自定义监视点、report定义不会自动恢复需要重新设置。所以最省事的做法是把自动保存设置也写进同一个续算脚本里。5.4 用journal把启动前的手动操作自动化续算脚本里还可以顺便把“读取后直接开始迭代”这个动作一次性搞定。完整的一个标准续算resume.jou文件可以长这样/file/read-case cylinder.cas.gz /file/read-data cylinder_t2000.dat.gz ; 重设自动保存策略 /file/auto-save/data-frequency 200 /file/auto-save/append-file-name-with-time-step yes /file/auto-save/retain-most-recent-files yes /file/auto-save/max-files 20 ; 继续迭代 /solve/iterate 2000 ; 保存最终结果 /file/write-case-data cylinder_final.cas.gz然后提交任务时把journal文件换掉就行flucnt 3ddp -g -t64 -mpiintel -i resume.jou resume.log 21用这套方法断点续算的工作量从“重启电脑再读文件再点calculate”缩短到“改一个文件名提交一个作业”。我在集群上开过的最长一个case前后断断续续跑了三周中间因为集群维护杀过两次作业每次恢复就是改一个时间步号体验非常顺滑。6. 运行过程的监控与调优方向从日志文件到性能计数6.1 作业状态查询squeue、sacct、scontrol作业提交成功后很多人就干等着。合理做法是定期通过调度系统命令查看作业状态。SLURM系统下常用的三件套squeue -u $USER # 查看自己所有排队/运行中的作业 sacct -j 123456 --formatJobID,State,Elapsed,End,ExitCode # 查看作业历史状态 scontrol show job 123456 # 查看作业完整详情包括运行在哪个节点第一眼看作业是否还活着第二个看作业退出状态是否正常第三个看资源分配情况。如果你用PBS对应的是qstat和qstat -fLSF对应bjobs。核心思想一样通过调度系统掌握作业的“生死状”。6.2 日志文件里的猫腻Fluent到底有没有跑起来调度系统告诉你作业在运行不代表Fluent算得很顺利。真正的运算状况要看Fluent的输出日志。tail -f fluent_run.log日志里重点看几件事一是启动阶段有没有license错误、MPI启动错误二是迭代过程中有没有发散迹象比如残差突然飙升到1e10、某个温度值跑到几百万三是看每步迭代耗时是不是稳定在一个量级如果某一步突然卡了几分钟可能是IO写盘也可能是物理上出现了压力波动的极端步长。如果你在journal里写入了残差监视文件比如GUI的Monitors面板里勾选了“Write to file”Fluent会生成一个.out格式的历史文件可以用文本方式查看残差随迭代步数的变化趋势。补充一句Fluent的.out文件本质是标准文本直接grep关键字就行比如grep Reversed fluent_run.log看到大量Reversed flows不一定发散但如果反向流和high Mach出现频率越来越密就要考虑是不是初始条件或边界条件设置有问题。6.3 几个立竿见影的调优方向运行速度出问题先别急着改求解器设置优先级最高的是以下几个方向IO写盘频率瞬态计算如果每个时间步都全量保存case和dataIO开销会吃掉大量性能。把自动保存频率拉到一个合理的值比如每50到100个时间步保存一次性能立刻改善。文件格式与压缩级别读和写都尽量用.cas.gz和.dat.gz的压缩格式。虽然压缩会消耗一点CPU但节省的磁盘空间和传输时间通常更值。特别是case文件动辄几百MB的工程不压缩写盘一次多等几十秒。并行库选择跨节点任务优先选择-mpiintel。Intel MPI对Infiniband和Intel网卡的适配比较好。如果集群只有千兆以太网跨节点通信带宽上不去那优先把作业控制在单节点内用共享内存跑。线程与CPU绑定Fluent默认会尝试把计算核心绑定到物理CPU上如果你发现htop里面进程在核心间乱跳可以在作业脚本里设置export FLUENT_MPIRUN_FLAGS--bind-to core强制绑定减少缓存失效带来的性能损失。7. 集群实操中容易翻车的几个细节7.1 不要让你的case困在/tmp目录HPC计算节点通常有一块高速本地盘挂载在/tmp或者/scratch/local下。很多人习惯把case文件先拷到这个目录再跑读起来确实快。但注意集群的本地盘是临时的作业一结束或者节点重启内容可能被自动清空。如果你把案例文件和结果放在里面没及时拷回共享存储算完就没了。正确做法是用共享存储目录比如$HOME或者/data作为工作目录如果实在要用本地盘当临时加速就写好脚本在作业结束前把结果强制拷回共享盘cp -r $PWD/result* /data/user/result_backup/7.2 文件格式版本的前后兼容问题Fluent版本一多case文件格式的兼容性问题就冒出来了。新版Fluent可以读旧版文件反过来旧版读新版经常报错。集群上装了多个版本的Fluent很常见我建议提交作业之前确认两件事第一你写的journal文件和当前Fluent版本匹配有些老版本不支持某些TUI命令第二续算的时候用同一个版本的Fluent跨版本续算虽然多数情况没问题但偶尔会遇到求解器设置被重置的情况不值得冒这个险。7.3 ulimit、环境变量和其他“看不见的手”集群登录节点的系统资源和计算节点往往不是一套配置。有的集群把ulimit限制得很严格比如打开文件数上限nofile、堆栈大小stack如果Fluent运行中报“too many open files”之类的错误可以在作业脚本里手动放宽ulimit -s unlimited ulimit -n 65536另外环境变量的传递问题前面提过module load要在脚本里做一遍还有一个隐藏点是PATH和LD_LIBRARY_PATH。有些集群的登录节点配置了用户自装的库路径这些路径不一定会传到计算节点。如果Fluent跑起来报“libssl.so.1.1: cannot open shared object file”多半就是LD_LIBRARY_PATH在计算节点上丢了。7.4 并行结果和串行结果的微小不一致用不同核数跑同一个case最终结果不会完全一致。这是因为浮点运算的求和顺序不同分区边界上的数据交换顺序也不同得到的结果会在最后几位有效数字上有差异迭代几千步之后残差曲线可能在某些步数上出现肉眼可辨的偏差但最终收敛结果的工程精度一般不受影响。如果你要严格复现某个结果就得固定核数、固定分区算法、固定MPI环境。这个特性在设计验证时得心里有数别一次64核一次128核然后拿着结果去对小数点后六位。我个人的习惯是正式投产的case一旦确定了甜点核数后面所有发版计算都用同一套并行配置最多在测试跑通阶段用交互式小核数验证流程最终计算全部走批处理脚本。这样最大程度保证了算例之间的可比性别人来复现我的数据时也不会因为并行配置不同而对不上。最后分享一个小习惯任何时候准备停掉一个跑了几百上千步的作业先花十秒钟看看最新的自动保存文件是第几步、文件是否能正常解压打开。这个动作我吃过一次亏之后就一直保留到现在——有一次自动保存文件写到一半作业被killdat.gz损坏最后硬着头皮从更早一步重新算。如果你用的版本支持/file/check-case之类的校验命令或者本地用文本处理工具看一眼压缩包是否完整都可以。宁可多花半分钟检查也不要赌“应该没问题”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价