2017-09-11 70 views
0

我明白爲什麼並行處理只能在XGB訓練中使用,並且不能用於其他模型。然而,令人驚訝的是我注意到用xgb預測也使用了並行處理。爲什麼caret :: predict()僅使用XGBtree進行並行處理?

我注意到這個意外的時候我拆我的大10M +數據幀成塊預測使用的foreach %dopar%。這導致了一些錯誤,所以試圖解決它們我切換到順序循環與%do%但在終端注意到所有處理器在哪裏使用。

經過一些試驗和錯誤,我發現caret::train()似乎使用並行處理,其中模型只有XGBtree(可能是其他模型),但不在其他模型上。

當然,預測可以與任何模型並行進行,而不僅僅是xgb?

caret::predict()使用所有可用處理器的默認或預期行爲,並且有沒有一種方法可以通過例如以下方式來控制這種情況:打開或關閉它?

重複的例子:

library(tidyverse) 
library(caret) 
library(foreach) 

# expected to see parallel here because caret and xgb with train() 
xgbFit <- train(Species ~ ., data = iris, method = "xgbTree", 
       trControl = trainControl(method = "cv", classProbs = TRUE)) 

iris_big <- do.call(rbind, replicate(1000, iris, simplify = F)) 

nr <- nrow(iris_big) 
n <- 1000 # loop over in chunks of 20 
pieces <- split(iris_big, rep(1:ceiling(nr/n), each=n, length.out=nr)) 
lenp <- length(pieces) 

# did not expect to see parallel processing take place when running the block below 
predictions <- foreach(i = seq_len(lenp)) %do% { # %do% is a sequential loop 

    # get prediction 
    preds <- pieces[[i]] %>% 
    mutate(xgb_prediction = predict(xgbFit, newdata = .)) 

    return(preds) 
} 

如果更改method = "xgbTree"到例如method =「knn」,然後嘗試再次運行循環,只使用一個處理器。

因此,根據模型的類型,預測似乎會自動使用並行處理。

這是正確的嗎? 它是可控的嗎?

enter image description here

回答

1

在這個問題上,你可以找到您需要的信息:

https://github.com/dmlc/xgboost/issues/1345

作爲總結,如果你訓練了與並行模型,該預測方法也將與並行處理運行。 如果你想改變後者的行爲則必須更改設置:

xgb.parameters(bst) <- list(nthread = 1) 

一種替代,是改變一個環境變量:

OMP_NUM_THREADS

正如你解釋,這只是發生了xgbTree

+0

這是否意味着,如果你運行它'nthread = 1',了'predict'將按順序運行呢? –

+0

@F.Privé,我是這麼認爲的,但從未嘗試過自己。 – Picarus

+0

我很快測試它,似乎是這樣。 –