如何在Grid Engine HPC集群计算节点运行家目录中的AMPL软件
解决Grid Engine集群中AMPL在计算节点的调用问题
问题背景
在大学Grid Engine架构的HPC集群中,用户将AMPL安装在家目录,希望通过队列作业脚本执行echo "include s.run;" | ./ampl运行模型求解。但提交的作业实际在登录节点执行,触发penalty1/penalty2处罚,AMPL进程被杀死,错误信息显示Mathematica相关隧道脚本被调用,AMPL进程被杀。
用户提供的配置文件
作业脚本
#!/bin/bash -l #$ -cwd #$ -l h_rt=12:0:0 # Request 1 hour runtime #$ -l h_vmem=64G # Request 1GB RAM source ~/.bashrc cd $HOME/ampl.linux-intel64 echo "include s.run;" | ./ampl
.bashrc文件
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions module load gcc-libs/4.9.2 module load xorg-utils/X11R7.7 module load mathematica/13.1.0 source /shared/ucl/apps/bin/defmods # AMPL setup export AMPL_HOME="$HOME/software/ampl" export PATH="$AMPL_HOME:$PATH"
s.run脚本
model /home/ucbvapk/ampl.linux-intel64/model4.md; data /home/ucbvapk/ampl.linux-intel64/data75.dat; option solver conopt; option conopt_options 'outlev=3 maxftime=36000 opttol=0.1 rgmax=1e-15'; #option ipopt_options 'tol=1e-30'; option solver_msg 1; solve; set I := 1..len1; set J := 1..len2; for {i in I} {printf "%d,%.5f\n", i, b[i] > fileb;}; for {i in I} {printf "%d,%.5f\n", i, y[i] > filey;}; for {i in J} {printf "%d,%.5f\n", i, d[i] > filed;}; for {i in J} {printf "%d,%.5f\n", i, e[i] > filee;}; for {i in I} {printf "%d,%.5f\n", i, degA[i] > filedegA;}; for {i in I} {printf "%d,%.5f\n", i, strA[i] > filestrA;}; for {i in J} {printf "%d,%.5f\n", i, degB[i] > filedegB;}; for {i in J} {printf "%d,%.5f\n", i, strB[i] > filestrB;};
错误信息
Using existing ~/Scratch/.Mathematica/13.1/FrontEnd/tunnel.sh Using existing ~/Scratch/.Mathematica/13.1/FrontEnd/tunnel_sub.sh /var/opt/sge/node-d00a-222/job_scripts/1360741: line 12: 223298 Done echo "include s.run;" 223299 Killed | ./ampl
错误分析
- Mathematica模块的干扰:
.bashrc中加载的Mathematica模块包含强制在登录节点建立X11隧道的逻辑,导致作业被绑定到登录节点执行,违反集群调度规则触发处罚。 - AMPL路径不一致:
.bashrc中配置的AMPL_HOME路径$HOME/software/ampl与作业脚本中进入的目录$HOME/ampl.linux-intel64不匹配,导致路径混淆。 - 本地调用的不可靠性:作业脚本中使用
./ampl依赖当前工作目录的正确性,若环境变量未正确对齐,计算节点可能无法找到可执行文件。
修复步骤
1. 移除.bashrc中不必要的模块加载
编辑~/.bashrc,注释或删除Mathematica相关模块加载行:
# 注释或删除以下行 # module load mathematica/13.1.0
原因:Mathematica的隧道脚本会强制作业在登录节点运行,触发集群违规处罚。
2. 对齐AMPL的路径配置
确认AMPL实际安装目录为$HOME/ampl.linux-intel64,更新.bashrc中的AMPL环境变量:
# AMPL setup - 修正为实际安装目录 export AMPL_HOME="$HOME/ampl.linux-intel64" export PATH="$AMPL_HOME:$PATH"
修改后,无论当前工作目录在哪,都能通过环境变量直接找到AMPL可执行文件。
3. 优化作业脚本
作业脚本无需加载整个.bashrc(避免引入不必要的环境干扰),直接设置AMPL路径或利用环境变量调用:
#!/bin/bash -l #$ -cwd #$ -l h_rt=12:0:0 #$ -l h_vmem=64G # 直接设置AMPL路径,替代source ~/.bashrc export AMPL_HOME="$HOME/ampl.linux-intel64" export PATH="$AMPL_HOME:$PATH" # 进入AMPL目录并调用(利用PATH环境变量直接使用ampl命令) cd $AMPL_HOME echo "include s.run;" | ampl
注意:使用ampl替代./ampl,利用PATH环境变量直接调用,可靠性更高。
4. 验证文件路径
s.run脚本中已使用绝对路径指向模型和数据文件,确保这些文件在集群共享家目录中存在(若为计算节点本地目录需提前同步)。
验证方法
提交作业前,先在计算节点的交互式会话中测试:
qrsh -l h_rt=1:0:0,h_vmem=64G export AMPL_HOME="$HOME/ampl.linux-intel64" export PATH="$AMPL_HOME:$PATH" cd $AMPL_HOME echo "include s.run;" | ampl
确认AMPL能正常运行无报错后,再提交批量作业。
内容的提问来源于stack exchange,提问作者apg
相关产品推荐
相关产品推荐

