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
手順
- GPUを確認し、CUDAをインストールする。
- CUDAのインストールはNVIDIAのサイトから。
- CUDA 11.0となっているが、tensorflowの兼ね合いで11.3だが、多分メジャーバージョンが一緒なら大丈夫。
- Packageを入手する
CRANからインストールできるバージョンはGPUに対応していないので、下記URLからダウンロードする。
https://github.com/dmlc/xgboost/releases
執筆時点(2023.12.02)では2.0.1が最新。 - ダウンロードした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!