覚え書き: cmdstanr+OpenCLでGPUをうまく使えたり使えなかったり (Windows-AMD編)

 以前、cmdstan (そういうソフトがあるんです) でOpenCLライブラリを経由してGPUを使うという問題にはまりこみ、延々と奇妙で無駄な努力を重ねたことがあった。あれこれ原因を追究した末、結局「そうか、エアコンがないからか…」と座り込む羽目になったりしてね。涙の苦闘の数々は、このブログの以下の記事として記録してある。

 なんと、最初の記録は2023年7月だ。あの頃私は若かった… (そうでもないよ)
 このたび、AMD社製GPUを搭載したWindows機で上記と同じ作業をしたので、いちおう記録しておくことにする。あんまし面白い話ではないです。

目次

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であった。

上記が正解かどうかわからないんだけど、ま、動いたのでよしとするか。