Как я могу освободить память GPU после установки модели в пакет R xgboost?

#r #memory-management #gpu #xgboost

#r #управление памятью #графический процессор #xgboost

Вопрос:

Мне нужно освободить память графического процессора, используемую моделью xgboost. Этот процесс кажется простым для пакета python. Просто запустите функцию ._del_() на выходе модели после того, как вы собрали необходимую информацию, как показано здесь. Однако в выходном объекте R такой функции нет. Как я могу сделать то же самое в сеансе R?

Я пробовал:

  1. удаление выходных данных из памяти и затем запуск gc().
  2. использование функции output .call() модели
  3. запуск модели в отдельном процессе и остановка потока. Это освобождает память, но приводит к сбою xgboost, когда я пытаюсь запустить его снова.

Этот код взят из примеров xgboost:

 library('xgboost')

# Simulate N x p random matrix with some binomial response dependent on pp columns
set.seed(111)
N <- 1000000
p <- 50
pp <- 25
X <- matrix(runif(N * p), ncol = p)
betas <- 2 * runif(pp) - 1
sel <- sort(sample(p, pp))
m <- X[, sel] %*% betas - 1   rnorm(N)
y <- rbinom(N, 1, plogis(m))

tr <- sample.int(N, N * 0.75)
dtrain <- xgb.DMatrix(X[tr, ], label = y[tr])
dtest <- xgb.DMatrix(X[-tr, ], label = y[-tr])
wl <- list(train = dtrain, test = dtest)

param <- list(objective = 'reg:logistic', eval_metric = 'auc', subsample = 0.5, nthread = 4,
              max_bin = 64, tree_method = 'gpu_hist')
pt <- proc.time()
bst_gpu <- xgb.train(param, dtrain, watchlist = wl, nrounds = 50)
proc.time() - pt
 

Мне нужно было бы стереть bst_gpu из памяти графического процессора. Кто-нибудь знает, как я мог бы это сделать? В python функция / метод ._del_() будет привязан к объекту bst_gpu…

Спасибо,

Ответ №1:

Мне удалось решить эту проблему с помощью пункта 3: создать отдельный процесс и остановить поток. После остановки дочернего потока или потоков память графического процессора очищается. Секрет в том, что родительский сеанс R не может получить доступ к графическому процессору через xgboost, в противном случае произойдет сбой ниже.

 Error in checkForRemoteErrors(val) : 
  2 nodes produced errors; first error: [23:17:55] /home/share/xgboost/src/c_api/../data/../common/common.h:44: /home/share/xgboost/src/tree/../common/device_helpers.cuh: 182: cudaErrorInitializationError: initialization error
Stack trace:
  [bt] (0) /home/R/x86_64-pc-linux-gnu-library/4.0/xgboost/libs/xgboost.so( 0x3f5828) [0x7f05434ad828]
  [bt] (1) /home/R/x86_64-pc-linux-gnu-library/4.0/xgboost/libs/xgboost.so(dh::ThrowOnCudaError(cudaError, char const*, int) 0x297) [0x7f05434b2ad7]
  [bt] (2) /home/R/x86_64-pc-linux-gnu-library/4.0/xgboost/libs/xgboost.so(dh::CheckComputeCapability() 0x113) [0x7f05436cdfb3]
  [bt] (3) /home/R/x86_64-pc-linux-gnu-library/4.0/xgboost/libs/xgboost.so(xgboost::tree::GPUHistMaker::Configure(std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx1