LoginSignup
2
3

xgboost on RでもGPUを使いたい

Last updated at Posted at 2023-12-02

Windowsにおいて、xgboost on RでGPUを使おうとしたら、日本語情報が見当たらなかったので作成しました。

環境

OS : Windows 10 Home(22H2)
CPU : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz 2.59 GHz
RAM:16.0 GB (15.8 GB 使用可能)
GPU:NVIDIA GeForce RTX 2060
Driver Version: 532.09
CUDA Version: 11.3

手順

  1. GPUを確認し、CUDAをインストールする。
    • CUDAのインストールはNVIDIAのサイトから。
    • CUDA 11.0となっているが、tensorflowの兼ね合いで11.3だが、多分メジャーバージョンが一緒なら大丈夫。
  2. Packageを入手する
    CRANからインストールできるバージョンはGPUに対応していないので、下記URLからダウンロードする。
    https://github.com/dmlc/xgboost/releases
    執筆時点(2023.12.02)では2.0.1が最新。
  3. ダウンロードしたPackageをインストール
    生のRからでも、RstudioのGUIからでもどちらでも可能。
    CRAN版をインストール済みの場合は削除してから。
    これで使えるようになるはずです。

動作確認

下記コードで検証を行った。交差検証を行うことで、学習回数を稼いでいる。

library(tidymodels)
tidymodels_prefer()
set.seed(123)
df <- tibble(
  A = c(rnorm(50000, 70, 10),rnorm(50000, 50, 10)),
  B = c(rnorm(50000, 60, 30),rnorm(50000, 55, 10)),
  C = c(rnorm(50000, 50, 10),rnorm(50000, 60, 10)),
  D = c(rnorm(50000, 40, 20),rnorm(50000, 50, 10)),
  E = c(rnorm(50000, 40, 10),rnorm(50000, 40, 5)),
  F = c(rnorm(50000, 35, 5),rnorm(50000, 35, 10)),
  G = c(rnorm(50000, 40, 20),rnorm(50000, 50, 10)),
  Class= factor(c(rep("Class1",50000),rep("Class2",50000)))
)
cv_splits <- df %>%
  vfold_cv(v = 10)
xgb_recipe <-
  recipe(Class ~ ., data = df) %>%
  step_normalize(all_numeric_predictors())
xgb_model.gpu <-
  boost_tree(trees = 100) %>%
  set_mode("classification") %>%
  set_engine("xgboost", tree_method = "hist", device = "cuda")
xgb_model.cpu <-
  boost_tree(trees = 100) %>%
  set_mode("classification") %>%
  set_engine("xgboost", tree_method = "hist", device = "cpu")
xgb_workflow.gpu <-
  workflow() %>%
  add_recipe(xgb_recipe) %>%
  add_model(xgb_model.gpu)
xgb_workflow.cpu <-
  workflow() %>%
  add_recipe(xgb_recipe) %>%
  add_model(xgb_model.cpu)
###
start <- Sys.time()
xgb_cv <-
  fit_resamples(
    xgb_workflow.gpu,
    resamples = cv_splits,
    metrics = metric_set(accuracy, sens, spec))
end <- Sys.time()
diff <- end - start
print(diff)
# Time difference of 5.665711 secs
start <- Sys.time()
xgb_cv <-
  fit_resamples(
    xgb_workflow.cpu,
    resamples = cv_splits,
    metrics = metric_set(accuracy, sens, spec))
end <- Sys.time()
diff <- end - start
print(diff)
# Time difference of 11.11292 secs
xgb_cv %>% collect_metrics()

5.6 sec(GPU)と11.1 sec(CPU)という結果になりGPUによる高速化できました!

補足

小データセットや複雑ではないモデル(既定値)ではCPU版の方が早い結果になります。計算部分よりはデータ転送などがネックになっていると考えられ、大きなデータで大きなモデルをやるひとはGPU版も検討してください。
Enjoy!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3