我使用包glarma提供的R中的glarma(广义自回归移动平均)时间序列模型。由于对类似数据集执行了大量独立估计,因此我通过parLapply并行化了该过程。
不幸的是,这个程序非常不稳定。我在一个系统上运行它。一段时间后,系统冻结并变得无法响应。我提供了一个小型化的例子。我的问题:如何稳定大型列表的并行化glarma拟合程序?
library(glarma)
library(doParallel)
# wrapper function for glarma()
glarma_wrapper_forecast <- function(y_X){
X_tr <- matrix(y_X[,3:ncol(y_X)],ncol=2)
colnames(X_tr) <- c('b_0','b_1')
# glm model (for reference)
# gl <- glm(matrix(y_X[,c(1,2)],ncol=2)~X_tr, family = 'binomial')
# glarma model
tryCatch({gl <- glarma(y=matrix(y_X[,c(1,2)],ncol=2),X=X_tr,
phiLags = c(1,2,3,4,5), thetaLags = c(6,7,8,9), type='Bin')})
rm(X_tr)
gc()
if(exists('gl'))
return(gl)
else
return(NULL)
}
# setup data (y: response, X: design matrix)
n_total <- 1000
X_1 <- matrix(rep(1,n_total),nrow=n_total)
set.seed(1337)
X <- cbind(X_1,rnorm(n=n_total,mean=0,sd=3))
colnames(X) <- c('b_0','b_1')
y_1 <- ifelse(pnorm(q = rowSums(X) + rnorm(n=nrow(X),mean=0,sd=2)) > 0.5, 1, 0)
y_2 <- ifelse(y_1 == 1, 0, 1)
y <- matrix(c(y_1,y_2), nrow = n_total, byrow = F)
# - input to list format
y_X_list <- list()
n_train <- round(0.8*n_total)
for(i in n_train:n_total){
y_X_list[[length(y_X_list) + 1]] <- matrix(c(y[1:i,], X[1:i,]), nrow=i)
}
# setup cluster & compute parallelized
no_cores <- max(1,detectCores()-5)
cpu_cluster <- makeCluster(no_cores)
clusterEvalQ(cl=cpu_cluster, library(glarma))
clusterExport(cl=cpu_cluster, "y_X_list")
# parLapply
mu <- parLapply(cl=cpu_cluster, X=y_X_list, fun=glarma_wrapper_forecast)
stopCluster(cpu_cluster)
我试图缩小完成问题:
不同的并行方法:foreach
,clusterApply
等会产生同样的问题。使用不同的包,即library(parallel)
无法解决问题。
从命令终端而不是RStudio执行文件并不是更好。
线程管理:我有12个物理内核,24个线程(AMD Threadripper 1920X)。计算工作正常几分钟,许多核心运行或接近满容量。从群集中取出2到10个线程无法解决问题。
显式创建一个集群为'FORK'(我运行Ubuntu OS)也无济于事。
内存管理:并不重要。 RAM最大使用率为20%且仍然冻结。对于其他应用程序,RStudio达到100%RAM甚至接近100%交换没有任何问题。然后它提供温和的“致命错误”,而不是冻结系统。使用remove()
并在顶部调用垃圾收集器gc()
也无济于事。
(!)glarma
打包本身:有趣的是,拟合glm()
而不是glarma()
模型可以很好地扩展。如果列表变得非常大(~10000),RStudio在执行100%的RAM内存使用并接近100%交换后会显示致命错误,但它不会像glarma模型和中等列表大小(~500)那样冻结系统。
系统信息: Threadripper 1920X,64GiB RAM,操作系统:Ubuntu 16.04 LTS,R版本:3.4.3(2017-11-30),平台:平台:x86_64-pc-linux-gnu(64位)
关于glarma的详细信息:
计数数据的时间序列模型(在这种情况下为二进制),它使用ARMA-lag结构来建模序列依赖性和协变量来模拟响应变量的条件概率。我的简单示例包括截距和1个协变量向量,并且没有序列依赖性(即glm拟合就足够了)以保持代码简单。响应变量的产生还受到第二正态分布协变量的影响,该协变量未包括在模型中以避免数值难以处理。响应y被编码为矩阵,因为这是glarma
包所需的。
非常感谢你。