Windows版CmdStanRでGPU(OpenCL)を使う方法

Windows版CmdStanRでGPU(OpenCL)を使う方法

本記事では、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
NVIDIAのCUDAのToolkitをインストールしておきます。既に導入されている場合は不要です。

CUDA Toolkit Develop, Optimize and Deploy GPU-Accelerated Apps The NVIDIA® CUDA®…
developer.nvidia.com

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:…..”といったエラーが表示され、そもそもコンパイルから動作しませんでした。

もともとのマニュアル等には、こうした設定は書かれていません。ここをスキップして、とりあえずモデルを実行してみて、ダメだったら再インストールしてみましょう。

Hi! I was trying to run the example Open CL /cmdstanr (https://mc-stan.org/cmdst…
discourse.mc-stan.org

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”を打つと確認可能です。

めっちゃ速い

CmdStanR Open CL
Stanの公式サイトで公開されているサンプルコードを走らせてみました。OpenCLで回したのが左、CPUのみは右。

GPUを使うと78秒、CPUのみの場合は392秒。大体1/5くらいの高速化になっています。ノートパソコン向けのCPUとGPUでこのくらいの高速化がされているので、デスクトップ向けならかなり期待できますね。

参考サイト

CmdStanRの導入とOpenCLのメモ
fu-om.github.io
Hi! I was trying to run the example Open CL /cmdstanr (https://mc-stan.org/cmdst…
discourse.mc-stan.org
Cmdstanrとreduce_sum()の使い方を解説します
www.slideshare.net