(20220415 作業メモ) Pythonの実行環境

15 4月

以前に、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 等でバージョン的な不一致があったのでしょうか?