つきすけ の コーディング記

細かいところで嫌にならないように、小さいことでも解説していくブログ。たまに関係ないことも書く。

GPU、使いてえ

 実にお久しぶりです。月助です。
 以前はpythonも3.6だったということでしたが、もう3.9まで来ました。
 環境も mac book air (2011) から windows10 デスクトップPC に代わりました。

 そんなことはともかく、GPU使いてええええええ。
 ってあなたに捧げます。僕の奮闘記

 参考はこちら

NVIDAってのがあるらしい

 新しいデスクトップPCになってから、今まで特に何も考えずに使ってたんですけど、どうやらNVIDAっていうのが僕のPCではあるみたいです。
 そして詳しくはまったくわからないのですが、これがあればGPUが使えるらしいんですよ。
 (GPU is 計算早くするツール(雑に言えば))
 (numpyとかScipyとか使わなければ意味ないことかもしれません。多分)
 そしてちょうど最近、ガチ機械学習とかやりたかったので、本当にちょうどいいですね。ぜひなんとか使えるようになろう。

STEP 0 下準備

 次のコマンドを入力してみる。NVDIA関連のバージョン等々を確認するコマンドらしい。

nvcc -V

で、こんな表示がされればOK

Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_Sep_13_20:11:50_Pacific_Daylight_Time_2021
Cuda compilation tools, release 11.5, V11.5.50
Build cuda_11.5.r11.5/compiler.30411180_0

これが出ない場合は、こちら様などを参考にしてください。
self-development.info

 あと、Pythonのバージョンが3.7以上である必要があるそうです。確認する場合は、

import sys
print(sys.version)

とかで確認を。もしくはコンソールで python 立ち上げただけで出てくるかも。

 また、Numpyは1.18以上である必要があるそうです。
 これは pip list すれば確認できますね。
 Numpyが絶対必要なのかよくわかりませんが、まあcupy使いたい人はNumpyも使っていたことでしょう(決めつけ)

 ほかのライブラリについては参考を参照してください。

 あとはなんか、pipをどうにかするらしい。

python -m pip install -U setuptools pip

 これで下準備完了!

STEP 2 cupy-cudaのインストール

 STEP 1ができたらSTEP 2です。
 さっき nvcc -V やったときに。
 release ○○.○ とかいう数字が出てきました。僕の場合11.5です。
 まずはこれに合わせてCuPyというやつをpip installする必要があります。
 もし、11.5だった場合は、こんな感じ。

pip install cupy-cuda115

 ほかのバージョンの場合も大体こんな感じだけど、一覧はここに載ってます。
pypi.org

 エラーが出ていなければ次に進みます。
 もしかしたらバージョン違いが既にあります、とか言われるかもしれません。
 その場合は、僕は詳しくないんですが、

pip uninstall cupy-cuda前のバージョン

 でいいかと。(自己責任)
 あとは pip list とか pip show で cupy-cuda が一覧に入ってればOK
 なかった場合は、うーん調べてみてください。

STEP 3 import できるか

 うっきうきで python を起動し、次のコマンドを打つ。

import cupy

 うまくいけば、ここでおしまい!!!
 うまくいかなければ....? とりあえず

 ModuleNotFoundErrorあたりで死ぬ。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cupy'

 ここで詰まらなかったら幸運です。
 詰まった人、僕と一緒に頑張りましょう。

STEP 4

 そりゃあ「cupy」という名のモジュールは install していないんだし当り前じゃねえか! って方は、試してみてください。
 それで出来たら無問題。僕にはエラーが出ました。

pip install cupy
× Encountered error while trying to install package.
╰─> cupy

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.

 読んでみるとですね、「pipの問題じゃねえよ! cupyのせいだよ!」と書かれています。
 どうしたものか。

 で、一からきちんと調べました。

その1 NVDIAのバージョンについて

 まずは NVDIA のグラフィックドライバのアップデートが来てないかチェックします。
 普通に Windows のスタート画面の中に、NVDIA Corporation フォルダがあって、その中に GeForce Experience というものがあるのでこれを起動。

GeForce の最初の画面

 同意しないと画面消えます。
 同意したら、僕の場合は勝手にアプデを始めました。
  そしてらログインをせがまれたので、アカウント作ってログイン。
 その後もう一度「ドライバ」タブから更新を確認。
 なんかあったのでとりあえず更新

GeForce のドライバ画面
その2 CUDA Toolkit なるもの

 次のサイトで、CUDA Toolkit をダウンロードします。
 「Download Now」押して以下の画面へ、

CUDA Toolkit Download

 ダウンロードのバージョンはとりあえず数字の大きい方ぽちっと。
 そしたらダウンロード方法に local か network かってでてきたんですけど、違いが判らなくて僕は network を押しました。普通にダウンロードされました。
 なので、ダウンロードされた.exeファイルをぽちして、install。

その3 でもダメ

 Python で import cupy !!

モジュールが見つかりません

 絶望
 というわけで、最後にインストールされた先のフォルダパスを通す必要があるのかなー? といろいろ調べて思ったのですが、どうもこれをやっても無駄なもんは無駄みたい
 そこで僕がやったのは

再起動
import cupy

 これでなんのエラーもでなかった!!!!

 やっふー!!

使ってみる

 最後に、使ってみましょう。

 CuPyはNumpyと互換性があるもの。つまりNumpyでできることはCupyでもできるはずです。
 そんなわけで、ただ行列を表示するだけのプログラムはこんな風になります。

Numpy バージョン

import numpy
matrix = numpy.array([[1,2],[3,4]])
print(matrix)
# 出力結果↓
[[1 2]
 [3 4]]

CuPy バージョン

import cupy
matrix = cupy.array([[1,2],[3,4]])
print(matrix)
# 出力結果↓
[[1 2]
 [3 4]]

 ランダム数値を出力するプログラムはこんな感じ。

import numpy
random = numpy.random.rand(1)
print(random)
# 出力結果↓
[0.42015569]
import cupy
random = cupy.random.rand(1)
# 出力結果
[0.78997954]