「ゼロから作るDeep Learning2」を読んで

継続は力なり、ありがとうございます。

斎藤康毅氏の「ゼロから作るDeep Learning」に続いて、次作である「ゼロから作るDeep Learning2」という本を読んでいますが、4章においてGPUを使っての学習でちょっと躓いたので一応記録の意味でブログに載せておきます。
NVIDIA製のGPUを搭載したパソコンの場合、CUDA Toolkitというものを導入してcupyなるライブラリをインストールすればディープラーニングの学習時の膨大な計算をGPUに任せることができるとのことで、いろいろググってcupyなるライブラリをインストールするところまで漕ぎつけました。
そこで、ch04/train.pyファイル中の「# config.GPU = True」のコメント#を外して試してみたところ、エラーが発生。

..................
common\layers.py", line 170, in backward
np.scatter_add(dW, self.idx, dout)
..................
AttributeError: module 'cupy' has no attribute 'scatter_add'

cupyにはscatter_addというメソッドが存在しないと怒られます。
上記エラーのキーワードをいろいろ入れてググってみたところ、あるサイトではcupyのバージョンが新しすぎるのが原因であって、
cupyのバージョンを下げればうまくいくと書いてありました。今回いれたcupyのバージョンを調べてみると「9.4.0」です。
(ちなみにCUDA Toolkitは「11.4」)
そのサイトでは、cupyを「8.0.0」未満にバージョンダウンすればうまくいくとあったのでいろいろやってみたのですが、バージョンダウンしようとすると、赤い文字でエラーメッセージが出てどうもうまくいきませんでした。
新しいcupyのバージョンのままなんとかできないものかとさらにググり続けていたところ、cupyxにscatter_addというメソッドがあるとの情報が。cupyxなんてよく知らないけどなんでもかんでもとりあえずやってみようということで、
common/layers.pyファイルを以下のように修正、

if GPU:
    import cupyx

class Embedding:
    ..............
    ..............
    ..............
    if GPU:
        # np.scatter_add(dW, self.idx, dout)
        cupyx.scatter_add(dW, self.idx, dout)
    ..............

でやってみたら見事学習に成功しました!

最後に、今回私がやった内容が技術的に正しいことなのかどうかは一切わかりませんので、これを見て試される方はあくまで自己責任にてお願いします(笑)