You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:09:25