このメモでは、WSL ターミナルから Windows 側の Conda と Python の実行ファイルを呼び出すことで、GPU アクセラレーション対応のディープラーニングツールを使う実践的な方法を説明します。これを書いた当時、WSL 内で直接実行される Linux バイナリから CUDA GPU へアクセスすることはできませんでした。そのため、信頼できる回避策は Windows に CUDA、cuDNN、Conda、TensorFlow をインストールし、WSL シェルから Windows の実行ファイルを呼び出すことでした。
0. WSL、Xfce、VcXsrv をインストールする
GUI サポートが必要な場合は、WSL と、Xfce のような軽量な Linux デスクトップ環境をインストールします。Windows に VcXsrv をインストールして起動し、その後 WSL から Xfce を起動します。
startxfce4
ターミナルベースの Python スクリプトやノートブックだけが必要な場合、デスクトップ環境は任意です。
1. Windows に Miniconda をインストールする
Windows 版 Miniconda をインストールし、Windows のコマンドラインから conda と python を利用できるようにするインストーラーオプションを選択します。重要なのは、Conda を WSL 内だけでなく Windows 側にインストールすることです。GPU 対応 TensorFlow パッケージは、Windows の NVIDIA ドライバーと CUDA ライブラリを使用するためです。
インストール後、Windows PowerShell またはコマンドプロンプトから Conda が動作することを確認します。
conda --version
python --version
2. WSL にエイリアスを追加する
WSL で入力したコマンドが Windows 側の実行ファイルを呼び出すように、~/.bashrc の末尾にエイリアスを追加します。
alias python="python.exe"
alias conda="conda.exe"
alias ipython="ipython.exe"
alias nosetests="nosetests.exe"
alias pip="pip.exe"
シェル設定を再読み込みします。
source ~/.bashrc
次に、WSL が Windows のツールを解決していることを確認します。
which python
python --version
conda --version
3. TensorFlow GPU サポートをインストールする
WSL から Conda 環境を作成します。上記のエイリアスにより、ここでも Windows 側の Conda が使われます。
conda create -n tf-gpu python=3.6
conda activate tf-gpu
pip install tensorflow-gpu
古い TensorFlow リリースでは、必要な CUDA と cuDNN のバージョンを TensorFlow のビルドに合わせる必要があります。インストールに失敗する場合や、TensorFlow が GPU ライブラリを読み込めない場合は、TensorFlow のバージョン互換表を確認し、対応する CUDA と cuDNN のバージョンを Windows にインストールしてください。
4. Windows に CUDA サポートをインストールする
Windows に NVIDIA GPU スタックをインストールします。
- NVIDIA GPU drivers — CUDA 9.0 にはドライバーバージョン 384.x 以上が必要です。
- CUDA Toolkit — 古い TensorFlow GPU ビルドでは CUDA 9.0 がよく使われていました。
- CUPTI — CUDA Toolkit に同梱されています。
- cuDNN SDK — 互換性のある古いビルドでは 7.2 以降など、TensorFlow リリースが要求する cuDNN バージョンを使用します。
これらのパッケージをインストールした後、CUDA と cuDNN の DLL ディレクトリが Windows の PATH で利用できることを確認してください。
5. WSL から Python スクリプトを実行する
通常どおり WSL ターミナルからスクリプトを実行します。
python train.py
このコマンドは python.exe によって実行されるため、WSL シェルから起動されていても Windows の Python プロセスとして動作します。
TensorFlow から GPU が見えているかどうかは、次のコードで確認できます。
import tensorflow as tf
print(tf.test.is_gpu_available())
新しい TensorFlow 2.x 環境では、次を使用します。
import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
P.S. Hyper Terminal を使うと、ターミナル体験を改善できます。
