以前に、docker で以前の環境を再現する話を書きました。docker で何かをやるのは、いつもやっていれば良いのかもしれませんが、たまにやるには敷居が高い。それで可能なら、起動ディスクの入れ替えで、環境を切り替えたいと思います。上の写真にあるオウルテックの OWL-GPD523 を利用します。
ビデオカードは NVIDIA RTX A4000 です。今試している環境は、なるべくなら新しいものでなんとかならないかと考えて、OS を ubuntu 20.04 で試みています。ビデオカードのドライバは 510.54 です。
ついで CUDA をインストールしました。これは いつものサイトに従います。ローカルインストールにしました。コマンドを下記に記録します。
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda-repo-ubuntu2004-11-6-local_11.6.2-510.47.03-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu2004-11-6-local_11.6.2-510.47.03-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-ubuntu2004-11-6-local/7fa2af80.pub
$ sudo apt-get updatesudo apt-get -y install cuda
ここまでは何とか上手くいきました。CUDA の新しいものをインストールするときには、ドライバのバージョンも新しいものが必要なようです。nvidia-smi
の出力です。
続いて、CUPY のインストールです。参考サイトはこちらです。コマンドを記録します。
$ python3 -m pip install -U setuptools pip
$ pip3 install cupy-cuda116
アナコンダなどは入れてなくて、もともと入っている python だけなのですが、synaptic で python3-pip を入れていて、pip のコマンドは pip3 です。
これで「ゼロから作るDeep Learning2」にあったコードを試す用意ができました。以前に、GPU を利用するコードを走らせる場合に、本にあるソースに修正を加える件を書きました。修正を下記にあげます。
- (1)common.np 中の np.add.at = np.scatter_add をコメントアウト
- (2)common.layers 中の Embedding 逆伝播の中を書き換え
def backward(self, dout):
dW, = self.grads
dW[...] = 0
if GPU:
np.scatter_add(dW, self.idx, dout)
else:
np.add.at(dW, self.idx, dout)
今回も同じように修正を加えて、4章のコード(ch04/train.py)を実行してみたのですが GPU を利用して CUPY のコードを実行させるとエラーとなります。
np.scatter_add
でエラーとなります。これは調べてみると CUPY の仕様の変化によるもののようです。こちらのサイトによると,CUPY 固有の関数は CUPYX の名前空間に移ったようで,こちらのサイトに解決策がありました。cupy._cupyx.scatter_add
のような書き方になります。結局下記のコードに変更しました。
def backward(self, dout):
dW, = self.grads
dW[...] = 0
if GPU:
np._cupyx.scatter_add(dW, self.idx, dout)
else:
np.add.at(dW, self.idx, dout)
何とか動きました。
他の環境はまた後日試します。
(20220422)
とりあえず,他の環境をためすというよりは,インストールした比較的新しいバージョンのCUDAやCUPYでどこまでやれるか試しています。
以前自分で書いた python のコードを色々動かして試しています。以前に作った pkl ファイルを読み込んで実行しようとしたら,エラーが生じました。下記のようなメッセージです。
No module named 'cupy.core'
鍛えた重み配列を保存した pkl です。何か仕様が変わったのかとも思いましたが,鍛える方のコードはそのまま動きました。それでまた新しく重みファイルを pkl として書き出して,その新しいファイルを読み込んでみたら,今度はエラーが生じません。何か CUPY 等でバージョン的な不一致があったのでしょうか?