はじめに
『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節に適用した実装コードは、下記にアップしておきました。