SHAPの計算に14日かかります、と言われて、それならGPU版を試そうと思ったのですが、資料が少なくビルドに手間取ったのでメモ代わりです。以下では、NVIDIA CUDAがインストール済みで、GPU環境が使用できるものとして記載しています。
SHAP GPUTreeの説明はこちら。ちなみにNVIDA CUDAオンリーです。これを読めば、多分わかる人は判るのでしょうね。
https://shap.readthedocs.io/en/latest/example_notebooks/api_examples/explainers/GPUTree.html
実行環境など(2022/09/28時点での情報)
使用した構成及び環境は以下の通りです。
Windows10
Anaconda Navigator 2.3.0
他の情報は以下の通り。ついでに、nvccが通ることを確認しています。
import sys
import torch
print("Python ==",sys.version)
print("PyTorch ==", torch.__version__)
print("CUDA available", torch.cuda.is_available())
print("CUDA ==", torch.version.cuda)
!nvcc --version
Python == 3.9.12 (main, Apr 4 2022, 05:22:27) [MSC v.1916 64 bit (AMD64)]
PyTorch == 1.11.0
CUDA available True
CUDA == 11.3
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:41:42_Pacific_Daylight_Time_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0
上記SHAPリンクの説明にもありますが、pipやcondaでSHAPをインストールするのではなく、git clone してコンパイルする必要があります。環境に依存すると思いますが、上の環境でしか試しておりませんので、注意してください。
事前準備
envは別に作成するか、shapがインストールされている場合は外した環境を作成しておいたほうが無難です。
注:コンパイルに失敗すると、なぜかAnaconda3が立ち上がらなくなるので、試す場合は、復旧ができるようにバックアップした状態、あるいは別環境を作成してお試しください。
コンパイラのインストール
コンパイラは、vs_BuildTools.exeを使用しましたが、現時点で最新版の2022ではなく、2017か2019版が必要です。コンパイルのログにこっそりエラーで出ていました。以前のバージョンの入手はこちらから。私は2019を使用しました。
https://visualstudio.microsoft.com/ja/vs/older-downloads/
起動すると、おなじみのVisual Studio Installerが現れるので、Visual Studio Toolsの変更ボタンから、表示されるMSVCまたはC++ Build Toolsを選択して、インストールしてください。
コンパイラへのpath設定
インストール後、cl.exeの場所を調べて、システムの詳細設定から、システムの環境変数のpathを通しておきます。例えば、x64のcl.exeの場合は以下のpathにありました。
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64
path確認は、DOS窓を新規に立ててclが起動すればOKです。
SHAPのクローン
https://github.com/slundberg/shap
をクローンします。どれでもOKですが、私の場合にはgit入れてなかったので、colabでGoogleドライブにクローンして、そこからローカルにコピーしました。
%cd /content/drive/MyDrive
!git clone https://github.com/slundberg/shap.git
コンパイル
Anacondaから、目的の環境のPowershell promptを起動します。cloneされたフォルダへ移動して、
PS C:\Users\shap>python setup.py install --user
を実行します。コンパイルログで、fatalやerrorの無いことを確認してください。
書き込みの競合エラーが発生した場合は、以下のフォルダを削除して、再度コンパイルを試してみてください。前のバージョンのshapが残っているとエラーになるようで、事前に外すように書かれていましたが、それでも何故か残る場合があるようです。
C:\Users\user\AppData\Roaming\Python\Python39\site-packages\shap-0.41.0-py3.9-win-amd64.egg
動作確認
まず、コンパイルしたPowershellからpythonを起動して、
>>>import sys
>>>import shap
として、特にエラーが無ければ、コンパイルは正常に完了していると思います。問題がある場合は、この時点で、何らかのエラーメッセージが出てきます。
次に、実際のサンプルプログラムでお試しください。ただ、1分程度で実行できるデータ量では、差が出ないようです。恐らくテンソルのメモリコピーあたりで時間をとられているのだと思いますが、場合によってGPU版の方が遅かったりします。
私の場合、3倍強速くなったという感じですね。下図で、上がGPU版、下が通常版です。
その他
TQDMの表示が出ませんでした。これは、どれくらい進歩しているのか、ハングアップしてるのか、全く分からないので結構不便です。
GPUメモリの使用量は0.1GBで、本当にGPU版かと思うぐらいですが、早くはなっているので、間違いは無いのでしょう。しかし、それでも本来の目的に必要な計算は4日以上かかりそうで、ちょっと微妙ですね。
以上