本記事では、Windows版CmdStanR動作するCmdStanRでGPU(OpenCL)を使う方法を紹介します。「CmdStanRってナニソレオイシイノ?」って人は、清水先生の資料を参照してください。
先日、WindowsのWSL2(Ubuntu)上のCmdStanRで、GPUを使う方法を紹介されている記事を見かけ、これならWindows上で動作するRやRStudio上でも行けそうだなと思い、試してみることにしました(WSL2がGPUを認識してくれなかったので)。
基本的には公式サイトとvignettesを参考にしています。ただ、筆者の環境ではつまづきポイントがあったので、解決方法もまとめて紹介します。ちなみに、NVIDIA GPUでの動作紹介になります、AMDのものを使用する場合は、AMD用のドライバーを入れる必要があり、CmdStanのインストールで別途設定が不要かもしれません。
目次
動作環境
- R: 4.1.1 / RStudio: 1.4.1717 / CmdStan: 2.27.0
- RAM: 32GB
- CPU: Core i9-10885H
- GPU: NVIDIA GeForce RTX 2060 6GB GDDR6 Max-Q
動作確認環境は上記の通り。なお、既にRStanやCmdStanRが動作するという前提で話を進めます。
Windows版CmdStanRでGPU(OpenCL)を使う方法
1. CUDAのGPUドライバーを導入する。
NVIDIAのCUDAのToolkitをインストールしておきます。既に導入されている場合は不要です。
2. CmdStanRとCmdStanのインストール
install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos"))) path_to_opencl_lib <- "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.4/lib/x64" cpp_options = list( "CXXFLAGS += -fpermissive", "PRECOMPILED_HEADERS"=FALSE, paste0("LDFLAGS+= -L\"",path_to_opencl_lib,"\" -lOpenCL") ) install_cmdstan(cores=4, overwrite = TRUE, cpp_options = cpp_options)
CUDA Toolkitのセットアップが終わったらCmdStanRのインストール(既にインストールした人は再インストール)を行います。
“cpp_options”で、OpenCLのライブラリの場所を指定します。これを設定して、CmdStanをインストールしないと”In file included from stan/src/stan/model/model_header.hpp:18:…..”といったエラーが表示され、そもそもコンパイルから動作しませんでした。
もともとのマニュアル等には、こうした設定は書かれていません。ここをスキップして、とりあえずモデルを実行してみて、ダメだったら再インストールしてみましょう。
GPU(OpenCL)を使ってStanを回す
# モデルをコンパイルする(STAN_OPENCL=TRUEを明記する) mod_cl <- cmdstan_model("opencl-files/bernoulli_logit_glm.stan", cpp_options = list(stan_opencl = TRUE)) #サンプリングする(opencl_ids = c(0, 0)でGPUを指定) fit_cl <- mod_cl$sample(data = mdata, chains = 4, parallel_chains = 4, opencl_ids = c(0, 0), refresh = 0)
モデルをコンパイルする際に、”cpp_options = list(stan_opencl = TRUE)”と書き、OpenCL向けにコンパイルすることを明記します。
また、サンプリングする際には、”opencl_ids = c(0, 0)”で、GPUのPlatform番号とDevice番号を指定します。番号は、WindowsユーザーならStan Math Libraryで公開されている、clinfo.exeをダウンロードし、Powershell等でパスを通し、”clinfo -l”を打つと確認可能です。
めっちゃ速い
Stanの公式サイトで公開されているサンプルコードを走らせてみました。OpenCLで回したのが左、CPUのみは右。
GPUを使うと78秒、CPUのみの場合は392秒。大体1/5くらいの高速化になっています。ノートパソコン向けのCPUとGPUでこのくらいの高速化がされているので、デスクトップ向けならかなり期待できますね。