簡體   English   中英

使用Slurm時調試R代碼

[英]debugging R code when using slurm

我正在集群中的R運行仿真。 每個R文件包含100個模型。 每個模型分析不同的數據集。 群集命令包含在slurm文件中,如下所示。

一小部分模型顯然收斂得不夠好,無法估計Hessian,因此這些模型會產生誤差。 錯誤將放置在錯誤日志文件中。 但是,我無法通過查看參數估計值,錯誤日志文件和輸出日志文件來確定100個模型中的哪個正在生成錯誤。

這是錯誤消息的示例

Error in chol.default(fit$hessian) : 
  the leading minor of order 3 is not positive definite
Calls: chol2inv -> chol -> chol.default

盡管存在這些錯誤,但仍返回參數估計值。 一些SE很大,但是我認為即使沒有返回錯誤消息,SE有時也可能很大。

是否可以在下面的我的slurm文件中包括一行附加內容,以生成一個日志文件,其中包含錯誤和輸出的其余部分,並且錯誤顯示在其原始位置(例如,在我的計算機上顯示錯誤的位置) Windows筆記本電腦)。 這樣,我可以通過查看日志文件來快速確定哪些模型正在產生錯誤。 我一直在嘗試解決問題的方法,但到目前為止還無法提出任何建議。

這是一個slurm文件:

#!/bin/bash
#SBATCH -J JS_N200_301_400_Oct31_17c.R
#SBATCH -n 1
#SBATCH -c 1
#SBATCH -N 1
#SBATCH -t 2000
#SBATCH -p community.q
#SBATCH -o JS_N200_301_400_Oct31_17c.out
#SBATCH -e JS_N200_301_400_Oct31_17c.err
#SBATCH --mail-user markwm@myuniversity.edu
#SBATCH --mail-type ALL
Rscript JS_N200_301_400_Oct31_17c.R

不確定這是否是您想要的,但是R選項error允許控制應發生的錯誤(否則您不會捕獲)。 例如,設置

options(error = function() {
  traceback(2L)
  dump.frames(dumpto = "last.dump", to.file = TRUE)
})

在* .R腳本的開頭或.Rprofile啟動腳本中,將(a)如果出現錯誤則輸出回溯,但更重要的是,它還將(b)將調用堆棧轉儲到文件last.dump.rda ,您可以在新的R會話中加載為:

dump <- get(load("last.dump.rda"))

請注意, get(load(不是一個錯誤,在這里dump的類的對象dump.frames它允許你檢查調用堆棧和它的內容。

您當然可以自定義error以執行其他操作。

我從集群的IT負責人那里了解到,只需刪除slurm文件中對錯誤日志的引用,就可以將錯誤消息添加到輸出日志中。 見下文。 似乎足夠好。

我還計划在每個模型輸出的開頭和結尾將型號編號輸出到日志中,以提高清晰度(我從一開始就應該這樣做)。

#!/bin/bash
#SBATCH -J JS_N200_301_400_Oct31_17c.R
#SBATCH -n 1
#SBATCH -c 1
#SBATCH -N 1
#SBATCH -t 2000
#SBATCH -p community.q
#SBATCH -o JS_N200_301_400_Oct31_17c.out
#SBATCH --mail-user markwm@myuniversity.edu
#SBATCH --mail-type ALL
Rscript JS_N200_301_400_Oct31_17c.R

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM