プログラマーのみなさん、GPUを有効活用していますか?
ゲームするだけで、普段はGPUを遊ばせていませんか?
実は、私はGPUを無駄に遊ばせていました。
その反省から、機械学習でGPUを利用するようにはなりました。
具体的には、TensorFlowをGPUで動かすということです。
しかし、毎回機械学習をするわけではありません。
それ以外のプログラミングも行います。
そのような場合にもGPUを使ってやろうと思いませんか?
是非、使いましょう。
PythonでGPUを利用するには、PyCUDAが必要となります。
この記事では、PyCUDAに関して解説していきます。
本記事の内容
- PyCUDAとは?
- PyCUDAのシステム要件
- PyCUDAのインストール
- PyCUDAの動作確認
それでは、上記に沿って解説していきます。
PyCUDAとは?
PyCUDAは、CUDAのPythonバインディングです。
と言われても、「CUDAとはなに?」ということでしょう。
CUDAは、NVIDIA製GPU向けの統合開発環境のことです。
CUDAには、NVIDIA製GPUを利用するためのAPIが用意されています。
そして、このCUDAはC/C++での利用が基本となっています。
そのため、Pythonは直接にCUDAを利用できません。
そこで、PyCUDAの出番です。
PyCUDAは、PythonとCUDAの間に入って、PythonからCUDAを利用でるようにしてくれています。
ただし、間接的にですけどね。
そうは言っても、CUDAを利用するメリットは計り知れません。
それに、PythonからPyCUDAによりCUDAを利用する方が便利です。
PyCUDAがしっかりと作りこまれているということなのでしょう。
PyCUDAに関して、おおよその理解ができました。
次は、PyCUDAのシステム要件を確認しましょう。
PyCUDAのシステム要件
現在公開されている最新バージョンは、2020.1となります。
2020年の10月にリリースされています。
PyCUDAのシステム要件は、以下。
- GPU
- CUDA
- Microsoft Visual C++
- Sixライブラリ
Pythonのバージョンに関しては、厳密にはないようです。
基本的には、上記を満たせばOKなのでしょう。
それぞれ説明していきます。
GPU
何よりも、まずはGPUを搭載していることです。
手っ取り早い確認方法を説明します。
ここに「dxdiag」と入力して、Enterを押します。
すると、DirectX 診断ツールが立ち上がります。
「ディスプレイ」タブを選択します。
デバイスの「名前」を確認します。
「NVIDIA GeForce」と記載されていれば、まずGPUが搭載されています。
それ以外では、「NVIDIA Quadro」と記載されていれば、GPUであることは間違いないでしょう。
CUDA
さて、本来であれば、さらに詳細なシステム要件があります。
しかし、それを一つづつ確認することにそれほど意味がありません。
一つのコマンドが動けば、すべて解決です。
その前提として、CUDAはインストールしておいてください。
CUDAのインストールは、次の記事で解説しています。
利用しているGPUや各自の環境によって、インストールするバージョンが異なってきます。
では、その一つのコマンドに話を戻しましょう。
それは以下。
>nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2019 NVIDIA Corporation Built on Sun_Jul_28_19:12:52_Pacific_Daylight_Time_2019 Cuda compilation tools, release 10.1, V10.1.243
コマンドプロンプトで上記コマンドを実行してください。
上記のように表記されれば、CUDAがインストール済みであることが保証されています。
Microsoft Visual C++
PyCUDAは、内部でCUDAを利用しています。
そして、PyCUDAではCUDAのAPIにアクセスするためにC++を利用しています。
そうすると、PyCUDAのインストールの際にC++のプログラムをコンパイルする必要が出てきます。
そのために、Microsoft Visual C++が必須となっています。
Microsoft Visual C++に関しては、以下の記事で解説しています。
インストール方法の記載もあります。
インストールがまだの方は、上記の記事を参考にしてください。
Sixライブラリ
PyCUDAでは、 Python 2と3の互換性が必要となっています。
そのため、Python 2とPython 3の間の違いを吸収するSixが必須です。
インストールしていないなら、Sixライブラリのインストールが必要です。
pip install six
PyCUDAのインストール
最初に、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 20.3.3 setuptools 51.1.1 six 1.15.0
次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip
では、PyCUDAのインストールです。
PyCUDAのインストールは、以下のコマンドで行います。
pip install pycuda
上記コマンドを実行して、以下のエラーが出るかもしれません。
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
この場合は、Microsoft Visual C++の最新バージョンをインストールしてください。
インストールは上記で案内した記事が、参考になります。
インストールが完了したら、パッケージの確認をしましょう。
>pip list Package Version ---------- -------- appdirs 1.4.4 decorator 4.4.2 Mako 1.1.3 MarkupSafe 1.1.1 numpy 1.19.5 pip 20.3.3 pycuda 2020.1 pytools 2020.4.4 six 1.15.0
結構いろんなモノに依存していることがわかります。
最後に、PyCUDAの動作確認をしておきましょう。
PyCUDAの動作確認
以下のプログラムで動作を確認できます。
# GPUにデータを転送するプログラム # PyCudaのインポート import pycuda.driver as cuda import pycuda.autoinit from pycuda.compiler import SourceModule # numpy配列用 import numpy # 4x4の乱数のnumpy配列を作成 a = numpy.random.randn(4,4) # nVidiaデバイス(GPU)は単精度のみサポート→変換 a = a.astype(numpy.float32) # GPU上に送信データ用のメモリを割り当てる a_gpu = cuda.mem_alloc(a.nbytes) # GPUにデータを転送 cuda.memcpy_htod(a_gpu, a)
プログラムの詳細は、コメントを見てください。
上記コードを実行してエラーがなければ、動作確認は成功と言えます。
しかし、これだけでは本当にGPUにデータを転送したのかどうかわかりません。
そこで、とても原始的な確認方法を記しておきます。
まず、タスクマネージャーを起動します。
そして、「パフォーマンス」タブを選択。
各デバイスの中から、「GPU」を選択します。
この状態でプログラムの下記を変更します。
#a = numpy.random.randn(4,4) a = numpy.random.randn(10000,10000)
GPUに渡すデータ量を増やします。
コードを変更して、プログラムを実行すると使用率が大きく変動します。
私の環境では一瞬だけ100%になりました。
プログラムを2回実行した結果が、グラフに表れていますね。
なお、配列を大きくする際は、各自で調整(1000→5000と段階を踏むなど)してください。
負荷を与えすぎて、PCがおかしくなる可能性もありますので。