LoginSignup
11
13

Colab上のPyMC5をGPUで動かす

Last updated at Posted at 2024-02-04

はじめに

『Pythonでスラスラわかる ベイズ推論「超」入門』著者の赤石です。
本書の実習のうち、後ろの方の実習は、sample関数呼び出しに相当の時間がかかります。
その対策として、6.3節のコラムに変分推論法の利用について書いているわけですが、他に手はないのだろうかと思っていました。
条件によってはGPU利用が有効であることがわかったので、その方法を説明することにします。
取り上げる例題は、6.3節の『IRT(Item Response Theory)によるテスト評価』です。

手順

Colab上でGPUを利用してsample関数を呼び出すための手順は、以下になります。

  • ランタイムのタイプをGPUに変更
  • ライブラリの更新・追加導入
  • sample関数呼び出し時のオプション追加

では、早速、実際に試してみましょう。

ランタイム環境の変更

Colabのランタイム環境をGPUに変える手順は通常と同じです。
念のため、step by stepで説明します。

最初に画面右上の「接続」のドロップダウンをクリックします。

下のメニューが出たら、上から2番目の「ランタイムのタイプを変更」を選択します。

次のパネルが表示されたら、

①ラジオボタンを「T4 GPUに変更」
②「保存」をクリック

とします。

下の画面のように、右上に「T4」という表示がされていれば、ランタイムの切り替えに成功しています。

ライブラリの更新・追加導入

Notebookの冒頭に新しくセルをつくり、次のコードを実行してください。

# ライブラリの更新・追加導入
!pip install 'pymc>=5.9' | tail -n 1
!pip install numpyro | tail -n 1

PyMCのバージョンを上げ、 更にnumpyroというライブラリを追加導入しています。

sample関数のパラメータ追加

次のように、nuts_sampler="numpyro"のパラメータを追加します、

%%time

with model1:
#    idata1 = pm.sample(random_seed=42)
# サンプリング関数呼び出し時のパラメータ追加
    idata1 = pm.sample(random_seed=42, nuts_sampler="numpyro")

結果

これだけの対応で、処理時間は劇的に早くなります。
以下に、実際の結果の画面コピーを示しました。

普通にCPUを使った場合、約15分 必要だったサンプリングの処理時間が、わずか2分で済むようになりました。

注意点

試したところ、GPU化は向いている処理と、向いていない処理があるようです。
ここで示した6.3節の実習は、確率変数の数が多く、それが処理に時間がかかっている理由でした。
こういうタイプの処理には、GPUは向いています。
逆に、確率変数の数は少ないがtarget_accept=0.998のように、target_acceptの値をチューニングしているため処理に時間がかかる5.3/5.4節の場合は、GPU化することで時間が余分にかかるようです。
GPUを利用する場合は、この点に注意するようにしてください。

おわりに

活用するための制約があるとはいえ、たったこれだけの変更でGPUが使えることにビックリしました。
PyMC、まだまだ私の知らない凄いところがあるようです。

参考リンク

今回の話を6.3節に適用した実装コードは、下記にアップしておきました。

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13