Slurm任务磁盘空间耗尽但内存限额未达问题求助
问题描述
在HPC集群上运行高内存需求的模拟任务,使用R的simDesign包拟合cmdstan模型,配置如下:
- 迭代次数:3000次
- 条件数:200种
- 计算资源:parallel分区64核节点,已配置
--ramdisk=100G并将工作目录移至ramdisk
低重复次数(如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
尝试过以下操作但未解决问题:
- 为节点分配更多内存
- 在拟合函数中手动执行
rm(M3)和gc(full=T)释放内存 - 配置ramdisk并迁移工作目录
最终仍出现/tmp目录磁盘空间不足错误:
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
解决方案
1. 强制cmdstan使用ramdisk存储临时文件
cmdstan默认会在系统临时目录生成大量采样中间文件,即使工作目录在ramdisk,也需显式指定其临时路径:
library(cmdstanr) # 设置cmdstan临时目录为ramdisk路径 options(cmdstanr_tempdir = "/path/to/your/ramdisk/temp") # 拟合模型时直接指定临时目录 mod <- cmdstan_model("model.stan") fit <- mod$sample( data = data_list, iter_sampling = 3000, temp_dir = "/path/to/your/ramdisk/temp" )
2. 优化simDesign的并行与清理策略
simDesign并行运行时,每个核心可能生成独立临时文件,需开启自动清理,并在分析函数中即时释放资源:
library(simDesign) # 运行模拟时开启自动清理 results <- runSimulation( design = design_df, replications = 100, generate = your_generate_fun, analyse = your_analyse_fun, summarise = your_summarise_fun, parallel = "snow", ncores = 64, cleanup = TRUE, save_results = FALSE )
在analyse函数中,提取结果后立即清理cmdstan对象:
your_analyse_fun <- function(data, fixed_objects) { fit <- fixed_objects$mod$sample(data = data, temp_dir = ramdisk_temp) fit_summary <- fit$summary() # 即时清理 rm(fit) gc(full = TRUE) return(list(summary = fit_summary)) }
3. 修改Slurm脚本的临时目录环境变量
在Slurm脚本中强制R和cmdstan使用ramdisk作为临时目录,避免系统默认/tmp:
#!/bin/bash #SBATCH --partition=parallel #SBATCH --nodes=1 #SBATCH --cpus-per-task=64 #SBATCH --ramdisk=100G # 挂载ramdisk mkdir -p /mnt/ramdisk mount -t tmpfs -o size=100G tmpfs /mnt/ramdisk # 设置环境变量 export TMPDIR=/mnt/ramdisk export R_USER_TEMP_DIR=/mnt/ramdisk # 运行R脚本 Rscript your_simulation_script.R # 任务结束后卸载ramdisk(可选) umount /mnt/ramdisk
4. 减少cmdstan的磁盘写入量
调整采样参数,关闭不必要的磁盘输出:
fit <- mod$sample( data = data_list, iter_sampling = 3000, temp_dir = ramdisk_temp, save_warmup = FALSE, save_latent_dynamics = FALSE, refresh = 1000 )
5. 调整simDesign结果存储方式
避免实时写入结果,待模拟完成后一次性保存:
# 先运行模拟不实时保存 results <- runSimulation(...) # 模拟完成后保存到ramdisk saveRDS(results, "/mnt/ramdisk/results.rds") # 复制到永久存储 system("cp /mnt/ramdisk/results.rds /your/permanent/storage/")
内容的提问来源于stack exchange,提问作者Jan Götmann
相关产品推荐
相关产品推荐

