Q&A
Q1:我要提交一个shell命令,如mpirun XXX或者python XXX等,该怎么运行?
此处以运行
python为例
# 1. 创建虚拟环境
$ module load conda # 加载conda环境
$ conda create -n hello_world python=3.11 # 创建名为hello_world的python版本为3.11的环境
$ conda activate hello_world # 激活此环境
# 2. 复制示例文件夹
$ cd ~ && cp $EXAMPLEDIR . -r # 复制示例文件到主目录
$ cd examples/04-conda/01-hello_world # 切换到示例文件
$ cat sub-conda.sh # 查看文件内容
#!/bin/bash -l
#SBATCH --job-name=conda # 任务名称:conda
#SBATCH --nodes=1 # 申请节点数:1
#SBATCH --ntasks=1 # 总task数:128 -> MPI
#SBATCH --cpus-per-task=1 # 每个task使用的CPU数:1 -> OMP
#SBATCH --partition=zen2 # 提交的任务分区:zen2分区
## 上述行##号为注释,#为打开
##################分割##################
echo "before activate env,the python is $(which python)"
module load conda
conda activate hello_world
echo "after activate env,the python is $(which python)"
python <<EOF
print("hello world")
EOF
# 3. 在debug分区上做测试,确保脚本无报错
$ sbatch -p debug sub-conda.sh # 提交任务
Submitted batch job XXX # XXX是此任务的jobid
$ cat slurm-XXX.out # 查看输出
before activate env,the python is /public1/arch/common/software/other/conda/2024.06/bin/python
after activate env,the python is /public1/home/test/.conda/envs/hello_world/bin/python
hello world
# 可以看到我们已经成功调用了hello_world环境下的python,并且得到正确的输出
# 4. 在zen2分区提交正式作业
# 此时我们可以简化原脚本中的指令,删除echo输出
$ cat sub-conda.sh # 查看文件内容
#!/bin/bash -l
#SBATCH --job-name=conda # 任务名称:vasp
#SBATCH --nodes=1 # 申请节点数:1
#SBATCH --ntasks=1 # 总task数:128 -> MPI
#SBATCH --cpus-per-task=1 # 每个task使用的CPU数:1 -> OMP
#SBATCH --partition=zen2 # 提交的任务分区:zen2分区
## 上述行##号为注释,#为打开
##################分割##################
module load conda
conda activate hello_world
python <<EOF
print("hello world")
EOF
$ sbatch sub-conda.sh # 脚本里面已经指定了zen2分区,无需再次指定
Submitted batch job XXX # XXX是此任务的jobid
# 5. 任务管理工具
$ squeue # 查看任务状态
$ scancel XXX # 取消此任务
$ scontrol show job XXX # 查看任务详情