1. 理解HPC环境下的脚本执行需求
在高性能计算(HPC)集群上运行shell脚本(*.sh文件)与个人电脑有着本质区别。HPC系统通常采用作业调度系统(如Slurm、PBS、LSF等)管理计算资源,这意味着你不能像在本地终端那样直接执行./script.sh。我第一次使用超算中心时就犯了这个错误,结果脚本根本不会运行,还浪费了半天时间排查。
HPC环境的核心特点是:
- 共享资源:计算节点由所有用户共享,必须通过队列系统申请
- 无交互式环境:计算节点通常不允许SSH直接登录执行命令
- 模块化软件:通过environment modules管理软件版本
- 严格权限:家目录通常不可执行,需要在特定区域运行
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备可执行的Shell脚本
2.1 基础脚本编写规范
一个合格的HPC脚本应该包含:
bash复制#!/bin/bash
#SBATCH --job-name=myjob # 作业名称
#SBATCH --output=output.log # 输出日志
#SBATCH --error=error.log # 错误日志
#SBATCH --nodes=1 # 节点数
#SBATCH --ntasks-per-node=4 # 每节点核心数
#SBATCH --time=01:00:00 # 运行时间上限
# 加载必要模块
module load python/3.8
module load gcc/9.3
# 主程序
echo "Starting at $(date)"
python my_analysis.py
echo "Finished at $(date)"
关键提示:在HPC上所有路径必须使用绝对路径,因为工作目录可能与预期不同。我曾因为使用相对路径导致脚本找不到输入文件。
2.2 常见问题处理
当遇到"no such file or directory"错误时(如热词中提到的script4.sh问题),按以下步骤排查:
- 用
ls -l确认文件真实存在且具有执行权限 - 检查文件编码:
file script.sh应显示"Bourne-Again shell script" - 避免Windows换行符:
dos2unix script.sh - 检查依赖路径:HPC上/home目录可能无法执行,需复制到工作区
3. 提交作业到调度系统
3.1 Slurm系统实操示例
bash复制# 编写提交脚本submit.sh
#!/bin/bash
#SBATCH --partition=compute # 指定队列
#SBATCH --mem=10G # 内存需求
srun hostname # 测试命令
# 提交作业
sbatch submit.sh
# 查看作业状态
squeue -u $USER
3.2 其他调度系统对比
| 系统 | 提交命令 | 状态查看 | 取消作业 |
|---|---|---|---|
| Slurm | sbatch | squeue | scancel |
| PBS | qsub | qstat | qdel |
| LSF | bsub | bjobs | bkill |
经验分享:不同HPC中心可能对同一调度系统有定制参数,务必查阅该中心的用户手册。我曾因为直接复制其他集群的脚本导致资源申请失败。
4. 高级技巧与性能优化
4.1 并行任务处理
对于需要并行执行的任务(如参数扫描),推荐使用GNU parallel:
bash复制# 在脚本中添加
module load parallel
seq 100 | parallel -j $SLURM_NTASKS "python simulation.py -p {}"
4.2 数据传输优化
- 大文件传输:使用
rsync -avzP替代scp - 临时文件:使用
$TMPDIR而非/tmp - 输入输出:HPC通常有专门的
/scratch高速存储区
4.3 资源监控
在脚本中添加资源记录:
bash复制# 记录内存使用
/usr/bin/time -v python analysis.py 2> memory.log
# 监控GPU使用(如有)
nvidia-smi -l 1 > gpu.log &
5. 典型问题解决方案
5.1 依赖问题处理
当遇到"curl | sh"安装方式(如热词中的ollama安装)时,在HPC上应该:
- 下载脚本审核内容:
curl -O https://ollama.com/install.sh - 在登录节点检查:
less install.sh - 修改安装路径到用户目录
- 通过管理员安装或使用conda环境
5.2 数据分析场景
对于"linux sh如何读csv"这类需求,在HPC推荐方案:
bash复制module load python
python -c "import pandas as pd; df=pd.read_csv('data.csv')"
或者使用awk高效处理:
bash复制awk -F',' '{print $1,$3}' largefile.csv > extracted.dat
5.3 调试技巧
- 先在登录节点测试脚本语法:
bash -n script.sh - 小规模测试:申请1节点1核心运行5分钟
- 使用
set -x开启执行追踪 - 检查环境变量:
env > env.log
我在实际使用中发现,HPC作业失败90%的原因可以归结为:
- 路径错误(28%)
- 权限问题(25%)
- 资源不足(20%)
- 环境差异(15%)
- 其他(12%)
最后分享一个实用命令:sacct -j <jobid> --format=JobID,Start,End,Elapsed,State可以精确查看作业运行时间,这对优化资源申请特别有帮助。
