我在一个hpc集群上运行模拟,这对内存要求很高。我在不同的条件下(200个唯一的组合)用3000次迭代拟合cmdstan模型。
模拟运行得非常好,当我以少量重复(例如10)运行时,输出与预期的一样。为了测试,我现在想以100次重复运行一个条件行(这将是真实的情况)。但大约1小时后,我的节点耗尽了内存:
sh: /rds2874z4733/temp/ no space left on device
sh: /rds2874z4733/temp/ no space left on device
当我在取消作业后监视作业时,我看到分配的内存尚未耗尽(即使最终内存量不足):
State: CANCELLED (exit code 0)
Nodes: 1
Cores per node: 64
CPU Utilized: 3-06:35:52
CPU Efficiency: 93.73% of 3-11:51:28 core-walltime
Job Wall-clock time: 01:18:37
Memory Utilized: 33.82 GB
Memory Efficiency: 39.13% of 86.43 GB
我也试着为我的节点分配更多的内存和内存,但这并不能解决问题。因为我将在每个条件下拟合100个cmdstan模型,所以我也试着在拟合函数中释放内存,方法是:
.....
# Stan is noisy, so tell it to be more quiet()
M3 <- quiet(mod$sample(dat,
refresh = 0,
chains = 4,
#parallel_chains=4,
iter_warmup=n_warmup,
iter_sampling=n_iter,
adapt_delta=adapt_delta,
max_treedepth=max_treedepth,
init = init,
show_messages = FALSE))
M3_hyper <- M3$summary(c("hyper_pars","mu_f"), mean,Mode,sd,rhat,HDInterval::hdi)
M3_subj <- M3$summary(c("subj_pars"), mean,sd,rhat,Mode,HDInterval::hdi)
M3_f <- M3$summary(c("f"), mean,sd,Mode,rhat,HDInterval::hdi)
M3_count_rep <- M3$summary(c("count_rep"),mean)
M3_omega <- M3$summary("cor_mat_lower_tri",mean)
M3_sum <- list(M3_hyper,M3_subj,M3_f,M3_count_rep,M3_omega)
rm(M3)
gc(full = T)
return(M3_sum)
但这并不能解决问题。每次迭代时,都会保存这些数据,当达到迭代次数时,会对这些数据进行汇总。这是并行运行的,因为软件包会处理这些数据。我不保存迭代结果,而是在模拟结束时保存汇总结果。由于我将模拟200种条件,每种条件重复100次。我需要解决这个问题的任何方式。我将明确运行1或2个条件在不同的节点上,所以它将是至少2500个模型为每个节点。
有没有人使用过simDesign软件包或者slurm内存分配,可以给予我一些建议?我在集群上的编码方面相对比较新,所以我很感激任何建议!
干杯 *
扬
下面是从属条件的Jobscript:
#!/bin/bash
#SBATCH -A acc # Account
#SBATCH -p parallel # Partition: parallel, smp, bigmem
#SBATCH -C skylake # architecture Skylake (64 Cores) or Broadwell (40 Cores)
#SBATCH -n 1 # number of tasks
#SBATCH -N 1 # allocate one full node
#SBATCH --ramdisk=100G # Reserve sufficient space for job on ramdisk
#SBATCH -t 02:30:00 # Run time (hh:mm:ss)
## Default Output
WD="/prjtdir/M3-simulations/"
## Move job to Ramdisk for sufficient space
JOBDIR="/localscratch/${SLURM_JOB_ID}/"
RAMDISK=$JOBDIR/ramdisk
module purge # ensures vanilla environment
module load lang/R # will load most current version of R
cp $WD/sim3.R $RAMDISK
cp -R $WD/Functions $RAMDISK
cp -R $WD/Models $RAMDISK
## Change Dir to Jobfolder
cd $RAMDISK
# Run Script
srun Rscript sim3.R -N $1 -K $2 -F $3 -R $4 -P $5 -I ${SLURM_JOB_ID} -D ${WD}
这里是sinfo的一段摘录-我通常使用每个节点64个内核的并行分区
sinfo -Nel -p parallel
Sun Aug 07 01:23:29 2022
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
x0001 1 parallel drained* 64 2:16:2 88500 0 6 anyarch, RBH_OPAFM
x0002 1 parallel drained 64 2:16:2 88500 0 6 anyarch, RBH_OPAFM
x0003 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
x0004 1 parallel drained 64 2:16:2 88500 0 6 anyarch, SlurmdSpoolDir is fu
x0005 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
x0006 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
x0007 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
x0008 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
x0009 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
x0010 1 parallel allocated 64 2:16:2 88500 0 6 anyarch, none
这是我在大约40 - 60分钟后得到的实际误差(取决于条件)
Design row: 1/1; Started: Sun Aug 7 00:44:31 2022; Total elapsed time: 0.00s
sh: /tmp/RtmpyFfzBI/file9eed87b8b8e1c: No space left on device
2条答案
按热度按时间0x6upsns1#
我能够解决在暂存空间上定义TMPDIR的问题:
在每个条件下,以双倍迭代运行,无需额外空间。
polhcujo2#
我知道这个问题之前已经回答过了。但是我觉得我可以补充一下这个错误的答案和根本原因。所以当你的脚本创建了很多文件时,每个文件都会占用磁盘上的特定空间(称为inode)。对于您使用的每个磁盘系统,将存在允许的inode的最大数量,并且当您溢出此数量时,错误消息“设备上没有剩余空间”。这可以通过清除、删除或删除文件来解决,重定向临时文件写入到不同的目标,或者完全删除喷出大量临时文件或小文件的步骤如果你只是简单地增加你的磁盘系统所容纳的inode的数量,你可以赢得更多的时间,并使错误消息消失。