我正在尝试使用caret
拟合随机森林模型。我的训练数据大小为129MB,我正在使用8个内核和52GB的RAM在Google Cloud上进行计算。以下是我使用的代码:
library(caret)
library(doParallel)
cl <- makeCluster(3, outfile = '')
registerDoParallel(cl)
model <- train(x = as.matrix(X_train),
y = y_train,
method = 'rf',
verbose = TRUE,
trControl = trainControl(method = 'oob',
verboseIter = TRUE,
allowParallel = TRUE),
tuneGrid = expand.grid(mtry = c(2:10, 12, 14, 16, 20)),
num.tree = 100,
metric = 'Accuracy',
performance = 1)
stopCluster(cl)
尽管有8个核心,但尝试在
makeCluster
中使用超过3个核心会导致以下错误:因此,我认为可能存在内存分配问题,只使用了3个核心进行尝试。经过几个小时的训练后,当我期望得到结果时,惊讶地发现只得到了以下错误:Error in unserialize(socklist[[n]]) : error reading from connection
我的Google云实例仍然拥有52GB的内存,所以我决定检查目前还剩多少可用内存。Error: cannot allocate vector of size 1.9 Gb
as.numeric(system("awk '/MemFree/ {print $2}' /proc/meminfo", intern=TRUE))
[1] 5606656
以上超过了47GB。因此,假设训练结束时无法分配2GB,则训练随机森林使用的内存超过45GB。我知道我的训练数据集被引导100次以生成随机森林,因此大约有13GB的训练数据副本。同时,我的总RAM分为3个集群,为39GB。这应该还剩下大约6GB,但显然并不是这样。尽管如此,这是假设在构建单独的树之后没有释放任何内存,但我怀疑情况并非如此。
因此,我的问题是:
- 我的近似计算是否正确?
- 可能导致我的错误的原因是什么?
- 我如何估计使用我的训练数据训练模型所需的RAM量?
bench
包中的mark
函数估计其内存使用情况。 - A.Fischer