結論
- ゲーミングPCでも量子化学計算は可能
- GPUを使うことで約6倍速で計算できる
- Dockerのおかげで環境構築も簡単にできる
環境
Machine1 | Machine2 |
---|---|
Ubuntu22.04 (WSL2) | Ubuntu22.04 (WSL2) |
GeForce RTX 2070 super | GeForce RTX 4090 |
VRAM 8GB | VRAM 24GB |
Intel Core i5 12400F | Intel Core i7 9700F |
RAM 16GB | RAM 16GB |
SSD (M.2) | SSD (SATA) |
これらにフリーの量子化学計算ソフトのGAMESSをインストールしてベンチマークを実行してみます。有機分子サイズの計算に必要なメモリはGAMESSのデフォルトの8メガワード = 64MBでたいてい事足りますし、ログファイルも<10MBくらいなので、計算速度さえ気にならなければ個人で量子化学計算に挑戦するのは十分可能です。
GAMESSのインストール手順
GPUを使用するためにDockerコンテナとして配布されているものを使用します。コンパイル不要で下準備が少ないので楽ちんです。おおまかに次の手順で進みます。
- WindowsにUbuntuをインストール (WSL2)
- Windowsに最新のNVIDIAドライバをインストール
- WSL2にDockerをインストール
- WSL2にNVIDIA Container Toolkitをインストール
- WSL2にNVIDIA GPU Cloud (NGC)からGAMESSコンテナを引っ張ってくる
NVIDIA Container Toolkitのインストールまではこちらの記事によくまとまってますが、私のような材料屋にはこれでも苦しかったので補足して説明します。
WindowsにUbuntuをインストール (WSL2)
Docker Desktopを使ってしまえばもっと楽みたいなのですが、どうせ操作はコマンドラインからになるのでWindows Subsystem for Linux 2 (WSL2)を使っていきましょう。
- 管理者権限でコマンドプロンプトかPowerShellを起動します。
-
wsl --list --online
でインストール可能なLinuxのバージョンを確認します。(Ubuntu22.04とします) -
wsl --install -d Ubuntu22.04
でUbuntuをインストールします。 - コマンドラインの指示に従ってユーザー名やパスワードを設定します。
この手順はMicrosoftの公式手順を修正したものです。wsl --install
でどのバージョンが入るか不明なのは、トラブルシューティングで困りそうなので指定するようにしました。
Windowsに最新のNVIDIAドライバをインストール
これは簡単ですね。ゲーミングPCを想定しているのでGeForce ExperienceでGame Readyドライバを入れてしまえばいいです。
WSL2にDockerをインストール
Docker公式に従うならWSL2で次のコマンドを実行します。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
これをNVIDIAの方の記事では一行で書いてcurl https://get.docker.com | sh
とされています。「Docker Desktop for Windowsを使え」と警告されますが無視です。
なお初めてWSL2を使われた方の中にはCould not resolve host: get.docker.com
みたいなエラーが出るかもしれません。この場合はこちらの記事に解決策があるので修正して上記コマンドを再実行して下さい。
WSL2にNVIDIA Container Toolkitをインストール
NVIDIA公式の手順に従います。まずレポジトリとGPG keyを設定するらしいです。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
をWSL2で実行して下さい。そのまま続いて
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
でインストールできます。さらにDockerにNVIDIA Container runtimeを認識されるため?に
sudo nvidia-ctk runtime configure --runtime=docker
を実行らしいです。最後にDockerを再起動します。
sudo service docker restart
sudo systemctl restart docker
はたぶん使えないです。念のために正常にインストールできていることを確認します。
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
もし
Failed to initialize NVML: GPU access blocked by the operating system
Failed to properly shut down NVML: GPU access blocked by the operating system
みたいなエラーが出てしまったら厄介です。修正されたことになっているバグですが私は出ました。私の場合は不要なはずのCUDA Toolkitをインストールしてみたら解決しましたが、その前に再起動した方が正解だったかもしれません。
エラーが出ずにGPUの使用状況が出力されたらNVIDIA Container Toolkitのインストールは完了です。
インストール確認でエラーが出てCUDA Toolkitをインストールしてみる場合
CUDAのバージョン管理が面倒でDockerコンテナを使ってる側面があるのでお勧めはしません。そもそもコンテナイメージ内にあるCUDAを使うはずなのに、なぜこの手順を行ってうまくいったのか分かってません。
PyTorchやTensorFlowなどを使う見込みが一切なければガイドに従って最新版をインストールします。こちらはネットワーク版のコマンドです。
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get updatesudo apt-get -y install cuda
PyTorchやTensorFlowのために古いバージョンが必要な場合はアーカイブからバージョンを選択し、そのバージョン用のガイドに従って下さい。ネットワーク版だと最新版と同じコマンドが表示されて不安になるため、ローカル版を選択する方が安心できるでしょう。
CUDA Toolkitをインストールしたらコマンドプロンプト(ホストのwindows側)から
wsl --shutdown
wsl
でWSL2を再起動し、さらにWSL2で
sudo service docker restart
としてDockerを再起動しておきましょう。
ここまで試してsudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
でエラーが出る場合は私にはお手上げなので、各人で頑張って下さい・・・。
WSL2にNVIDIA GPU Cloud (NGC)からGAMESSイメージを引っ張ってくる
非常に簡単です。NVIDIAのGPU版GAMESS紹介ページを参考に
sudo docker run --gpus all -v $(pwd):/results --rm -it nvcr.io/hpc/gamess:17.09-r2-libcchem
でGPUを利用するGAMESSを実行できるコンテナが起動します。元はnvidia-docker run
となってますが古い方法で非推奨のため修正しました。
GAMESSコンテナ起動のエイリアスの設定
毎度長いコマンド打つのは嫌だし、そもそも覚えられないのでエイリアス(ショートカットコマンド)を設定します。
echo alias gamess='sudo docker run --gpus all -v $(pwd):/results --rm -it nvcr.io/hpc/gamess:17.09-r2-libcchem' >> ~/.bash_aliases
source ~/.bashrc
~/.bash_aliases
に記述することでエイリアスが設定できます。今回はgamess
と打てば長いコマンドを打ったのと同じになります。
ベンチマークの実行
結果
先ほどのNVIDIAのGPU版GAMESS紹介の最下部でHPCサーバ向けCPUとGPUを比較してGPUの効果が示されているので、それらと比べてゲーミングPCの実力がどんなものかを見てみましょう。同じベンチマークを実行するにはWSL2で次のコマンドを実行します。
sudo docker run --gpus all -v $(pwd):/results --rm -it nvcr.io/hpc/gamess:17.09-r2-libcchem
cd /workspace/examples
rungms rimp2-valinomycin.spherical.energy.ccd_cct.inp
さて紹介ページと私の結果を並べてみます。
Proceccor | 2x Intel Xeon E5-2690 v4 | 1x Tesla P100 | 1x Tesla V100 | 1x RTX 2070 super | 1x RTX 4090 |
---|---|---|---|---|---|
Time/sec | 5072 | 639 | 744 | 890 | 844 |
FP64/TFLOPS | 4.71 | 72 | 0.283 | 1.294 |
CPUは2基並列みたいです。また私が試したRTXシリーズは1回ずつしか計算していません。計算時間は必ずしも倍精度の計算速度(FP64)に従うわけではありませんでした。VRAMの速度やCPUとの接続速度などの影響でしょうか?なんにせよCPUより断然速くなるのは確かでした。そもそもGAMESSが遅く、Intel CPUに最適化されたFireflyに変えると10倍速くなるらしいですが。
ベンチマークの中身
今回計算した内容を簡単に説明しておきましょう。対象とした分子は分子量が約1100のバリノマイシンという抗生物質で、その全エネルギーを計算しています。結合距離や結合角などは予め与えられています。
構造式だけ与えられた状態から同じように全エネルギーを計算してHOMOやLUMOの情報を得ようとすると、実際には構造最適化と振動解析を先に行う必要があります。構造最適化の手順についてはこちらのサイトによくまとまっています。
結言
この記事では計算速度と必要な計算資源を確認することで、GAMESSは個人の環境でも実践できることを示したつもりです。全然量子化学計算をやったことがないけど興味はあるという人間にとって、数多あるフリーソフトからどれを選ぶかというのがまず問題です。同様にFireflyやPySCF、psi4などでどなたかが似たような比較記事を書いて下さることを密かに期待しております。