我的情况是集群由3台pc (Raspbian with slurm 18)组成,它们都连接在一起,共享文件存储,挂载为/storage
。
任务文件为/storage/multiple_hello.sh
:
#!/bin/bash
#SBATCH --ntasks-per-node=1
#SBATCH --nodes=3
#SBATCH --ntasks=3
cd /storage
srun echo "Hello World from $(hostname)" >> ./"$SLURM_JOB_ID"_$(hostname).txt
它作为sbatch /storage/multiple_hello.sh
运行,预期的结果是在/storage
中创建名为120_node1.txt
,121_node2.txt
和122_node3.txt
(任意作业编号)的文件,因为:
- 请求3个节点
- 请求3个任务
- 为每个任务设置了1个节点的限制
实际输出:只创建了一个文件:120_node1.txt
如何使其按预期工作?
很奇怪,srun --nodes=3 hostname
按预期工作,并返回:
node1
node2
node3
要获得预期的结果,将最后一行修改为
srun bash -c 'echo "Hello World from $(hostname)" >> ./"$SLURM_JOB_ID"_$(hostname).txt'
Bash解析该行的方式与您期望的不同。首先,在分配的第一个节点(运行提交脚本的节点)上展开$hostname
和$SLURM_JOBID
,然后运行srun
,并将其输出附加到文件中。您需要明确重定向>>
是您希望srun
做的事情的一部分。使用上述解决方案,在每个节点上执行变量和命令展开,以及重定向。