プロジェクト上でディープラーニングを使ってみたいと思い、準備をしていたところオペレーション時間が結構かかるので、GPUを動かしてみたいなと思い立ったという話です。
AWSという手もありますが、とりあえず試してみるにあたっていきなりコストをかけるほど勝算があるわけでもなかったので、とりあえずNVIDAグラボを積んでいるPCにcudaを入れて試してみることに。しかし、WindowsにNVIDAツールをインストールするとメッセージが頻繁に出てきてうるさいことは経験済みでしたので、Ubuntuをデュアルブートにしてcudaを入れることにしました。これは、そのときの苦労話を記したものです(苦笑
ネット検索で情報を集めたのですが、いずれも古くて適切な現時点バージョンでなかったり、インストールしたい環境が微妙に違ったり、記述がハイレベルすぎて理解できなかったりで、つらかったので、これから同じことを考えている人に向けてこのようなメモを残しておけば、あと半年くらいは役に立つのではないかと。ええ、もちろん、自分向けの備忘録が主です。
pythonのインストール
tensorflowが現時点ではpython3.9に対応していないので、3.8を入れてください。私の環境ではすでに3.8.5が入っていたのでそのまま使いました。ただし、tensorflowのインストールのときにpip3を使うので、次の文でpip3を最新にしておいてください。
$ sudo apt install python3-pip -y
最後に-yをつけておくと、途中でいちいち「y」と打つ必要がなくなります。
GPUドライバのインストール
ウィンドウズキーを押して「so」と入力すると、「ソフトウェアと…」というのが出てくるのでそれをクリックして起動します。タブに「追加ドライバー」というのがありますのでそこを選択して、「nvidia-driver-450から使用します」を選択して、変更の適用を押して、閉じるを選択します。
cudaのインストール
terminalから、次の文を実行します。
$ sudo apt install nvidia-cuda-toolkit
$ nvcc --version
最新版のcudaは11.0だけど、tensorflow-gpuは10.1までしか現時点で対応していませんが、aptでインストールすると都合よく10.1がインストールされるのでラッキーでした。(ラッキーじゃなくてこういうふうに制御されているのかもしれませんが、その辺の事情はよく知りません。)
cuDNNのインストール
インストールというか、ただNVIDIAのホームページからダウンロードしてきたファイルにパスを通すだけです。(そういうふうに書いてあるところがないものだから混乱したのはいい思い出話。)cuDNNをダウンロードするには登録が必要なのですが、昔してあったのでログインして入手。ただし、ここでも最新版はtensorflow-gpuが対応していないので、ver7.6.5 for cuda 10.1を入手しました。tgzファイルなので、
$ tar -xzvf ファイル名
を使って解凍します。そして出てきたファイルたちをそれっぽいところにコピー(PATHを通せばよいのでどこでもOKのようです)。あと、権限も付与します。
$ sudo cp cuda/include/cudnn.h /usr/lib/cuda/include/
$ sudo cp cuda/lib64/libcudnn* /usr/lib/cuda/lib64/
$ sudo chmod a+r /usr/lib/cuda/include/cudnn.h /usr/lib/cuda/lib64/libcudnn*
tensorflow gpu版をインストール
少し前までは、tensorflow-gpuとしてインストールしなければなりませんでしたが、公式ホームページを読んでみるとノーマルcpu版と統合されたようなので、次の文でインストールが完了します。(ただし、もしすでに古いcpu版が入っているのであれば、一旦アンインストールして入れ直す必要があるようです。)
$ pip3 install tensorflow
実行環境にパスを通す
実は、ここが一番大ハマリしました。出来上がって振り返ってみれば至極当たり前のことなんですが、ゴールが見えていないうちははっきりいって「これ無理ゲー」くらいの勢いで迷いまくりました。例えばterminal(.bash)で実行するのであれば、
$ cd
$ nano .bashrc
とやって、次の文を文末にでも挿入する。
export LD_LIBRARY_PATH="/usr/lib/cuda/lib64:/usr/lib/cuda/include:$LD_LIBRARY_PATH"
そしてterminalで
$ .bashrc
とやって、パスを通しておけばよいです。私はPycharmを使っているのですが、Pycharmから実行するには、Run ConfigurationのEnvironment variablesに上記のパスを通しておけばよいです。
GPUでtensorflowが動くかtestする
import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
これを実行して、
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
と出てくればOKです。ここで[ ]だと残念ながら失敗で、エラー分をよく読んで原因究明が必要です。私の場合はPATHがちゃんと通っていなかったというオチでした。
$ pip3 install keras
これでKerasもいれて、準備完了です。