以前、cmdstan (そういうソフトがあるんです) でOpenCLライブラリを経由してGPUを使うという問題にはまりこみ、延々と奇妙で無駄な努力を重ねたことがあった。あれこれ原因を追究した末、結局「そうか、エアコンがないからか…」と座り込む羽目になったりしてね。涙の苦闘の数々は、このブログの以下の記事として記録してある。
- 覚え書き: cmdstanr+OpenCLでGPUをうまく使えたり使えなかったり (Windows-NVIDIA編)
- 覚え書き: cmdstanr+OpenCLでGPUをうまく使えたり使えなかったり (Windows-Intel編)
- 覚え書き: cmdstanr+OpenCLでGPUをうまく使えたり使えなかったり (WSL2-Ubuntu-NVIDEA編)
なんと、最初の記録は2023年7月だ。あの頃私は若かった… (そうでもないよ)
このたび、AMD社製GPUを搭載したWindows機で上記と同じ作業をしたので、いちおう記録しておくことにする。あんまし面白い話ではないです。
目次
- Case 31: Win11, R4.5.2, Rtools4.5, cmdstan2.38.1, OpenCLなし, 成功
- Case 32: Win11, R4.5.2, Rtools4.5, cmdstan2.38.1, OpenCL(OCL-SDK), 成功
Case 31: Win11, R4.5.2, Rtools4.5, cmdstan2.38.1, OpenCLなし, 成功
まずはベンチマークから。
- Windows 11 Pro (25H2)
- R 4.5.2
- Rtools 4.5.6536
- cmdstanrパッケージ 0.9.0安定版のインストール。
install.packages("cmdstanr", repos = c('https://stan-dev.r-universe.dev', getOption("repos"))) - cmdstan 2.38.0 のインストール。
install_cmdstan(cores = 4, overwrite = TRUE) - モデルのコンパイル。Stanコードは以前に使った
stantest2.stanである。mod <- cmdstan_model("./stantest2.stan", force_recompile = TRUE, quiet = FALSE) - サンプリング。
n <- 250000 k <- 20 X <- matrix(rnorm(n * k), ncol = k) y <- rbinom(n, size = 1, prob = plogis(3 * X[,1] - 2 * X[,2] + 1)) mdata <- list(k = k, n = n, y = y, X = X) fit <- mod$sample(data = mdata, chains = 4, parallel_chains = 4, refresh = 100)無事終了。所要時間は574 secであった。
Case 32: Win11, R4.5.2, Rtools4.5, cmdstan2.38.1, OpenCL(OCL-SDK), 成功
さて、このノートPCに搭載されているGPUは、タスクマネージャくんにいわせればAMD Radeonである。こいつをOpenCL経由で使うためには、なんかドライバを入れないといけないよね? NVIDIA社でいうCUDA Toolkitみたいなやつ。AMD ROCmってのがそれなの? それとも AMD HIP SDKってやつ? なにがなんだかわからないよ...
としばし悶絶したが、結局、OCL-SDKというオープンソースのドライバをいれることにした。なぜならCmdStan User's Guideにそう書いてあったから。しかっし、このOCL-SDKってやつ、一切説明がついていないし、最終更新は2018年だし... 不安だ...
- Windows 11 Pro (25H2)
- AMD Ryzen 5 PRO 6650 with Radeon Graphics, ディスプレイドライバーバージョン32.0.13040.16001
- OCL-SDK Light, タイムスタンプはJan 15 2018
- R 4.5.2
- Rtools 4.5.6536
- cmdstanrパッケージ 0.9.0安定版
- cmdstan 2.38.0 のインストール。無事終了したけど、途中で赤字のnotesやwarningが山ほど出た。
path_to_opencl_lib <- "C:/Program Files (x86)/OCL_SDK_Light/lib/x86_64" # path_to_opencl_lib <- "C:/Windows/System32" # これはだめだった cpp_options = list( "CXXFLAGS += -fpermissive", "PRECOMPILED_HEADERS" = FALSE, paste0("LDFLAGS+= -L\"",path_to_opencl_lib,"\" -lOpenCL") ) install_cmdstan(cores = 4, cpp_options = cpp_options, overwrite = TRUE) - モデルのコンパイル。
mod <- cmdstan_model("./stantest2.stan", force_recompile = TRUE, quiet = FALSE, cpp_options = list(stan_opencl = TRUE)) - サンプリング。
n <- 250000 k <- 20 X <- matrix(rnorm(n * k), ncol = k) y <- rbinom(n, size = 1, prob = plogis(3 * X[,1] - 2 * X[,2] + 1)) mdata <- list(k = k, n = n, y = y, X = X) fit <- mod$sample(data = mdata, chains = 4, parallel_chains = 4, opencl_ids = c(0, 0), refresh = 100)あっけなく動き出したので拍子抜け。実際にGPUが使われていることをタスクマネージャで確認した。無事終了。所要時間は255 secであった。
上記が正解かどうかわからないんだけど、ま、動いたのでよしとするか。