斎藤 康毅:ゼロから始める Deep Learning 2

作成日 : 2020-09-02
最終更新日 :

概要

副題は「自然言語処理編」

感想

貧乏な我が家ではどうにもならないかもしれない

この本にいたって、ついに GPU があると学習時間が大幅に短縮できる例題が出てきた。 PTB コーパスを使った学習がそれである(p.164)。GPU を使わないと学習には多くの時間(半日程度) が必要になるという。では、GPU を使えばどれだけ短縮できるのかが気になるのだが、 そこは書かれていない。(2020-09-02)

貧乏な我が家で GPU を試す

貧乏な我が家にやっと GPU 入りのパソコンがやってきた。本書のコードで p.164 の PTB コーパスを使った学習をさせた。 まず、GPU を使わない場合を試すと、1 エポックに 336 秒を要した。全学習は待てなかったので 1 エポックの時間から類推すると、 全学習となる 10 エポックでは 1 時間弱ということになる。本書の p.53 では、2018 年現在のCuPy と NumPy のメソッドの関係を説明しているので、 そのころの標準パソコンで実行して半日程度という時間になったのだろう。では、GPU を使ったらどうなるだろうか。うきうきして実行してみたら、 エラーになった。

C:> python .\train.py
------------------------------------------------------------
                       GPU Mode (cupy)
------------------------------------------------------------

Traceback (most recent call last):
  File "C:\Users\username\dl2\ch04\train.py", line 42, in 
    trainer.fit(contexts, target, max_epoch, batch_size)
  File "C:\Users\username\dl2\ch04\..\common\trainer.py", line 39, in fit
    loss = model.forward(batch_x, batch_t)
  File "C:\Users\username\dl2\ch04\cbow.py", line 39, in forward
    h += layer.forward(contexts[:, i])
  File "C:\Users\username\dl2\ch04\..\common\layers.py", line 160, in forward
    out = W[idx]
  File "cupy\_core\core.pyx", line 1473, in cupy._core.core._ndarray_base.__array__
TypeError: Implicit conversion to a NumPy array is not allowed. Please use `.get()` to construct a NumPy array explicitly.

本書が出版されたときはこのようなエラーは発生しなかったのだろうか。なお、私が実行しているのは Windows の Python 3.9.12 、 numpy 1.21.5、cupy-cuda11x 11.2.0 だ。

結局原因がわからない。私が手で打ったコードが間違ったのだろう。すべてを GitHub からダウンロードしなおして、同じように GPU を ON にしてやってみた。

C:> python .\train.py
------------------------------------------------------------
                       GPU Mode (cupy)
------------------------------------------------------------

Traceback (most recent call last):
  File "C:\Users\username\dl2git\ch04\train.py", line 40, in 
    trainer.fit(contexts, target, max_epoch, batch_size)
  File "C:\Users\username\dl2git\ch04\..\common\trainer.py", line 40, in fit
    model.backward()
  File "C:\Users\username\dl2git\ch04\cbow.py", line 43, in backward
    dout = self.ns_loss.backward(dout)
  File "C:\Users\username\dl2git\ch04\..\ch04\negative_sampling_layer.py", line 108, in backward
    dh += l1.backward(dscore)
  File "C:\Users\username\dl2git\ch04\..\ch04\negative_sampling_layer.py", line 28, in backward
    self.embed.backward(dtarget_W)
  File "C:\Users\username\dl2git\ch04\..\common\layers.py", line 167, in backward
    np.scatter_add(dW, self.idx, dout)
  File "C:\Users\marin\anaconda3\lib\site-packages\cupy\__init__.py", line 938, in __getattr__
    raise AttributeError(f"module 'cupy' has no attribute {name!r}")
AttributeError: module 'cupy' has no attribute 'scatter_add'

これには対応方法があるようだ。
http://zairyo.susi.oita-u.ac.jp/wordpress/?p=10788
https://teratail.com/questions/352263
https://docs.cupy.dev/en/v12.0.0b2/reference/generated/cupyx.scatter_add.html
https://www.arbk.net/wp/今日も一日ありがとう-470/
結局次のように対応した。

なお、現在(2022-12-17)で、GitHub の common.np に、np.add.at = np.scatter_add という行はなかった。

これでやっと GPU を使った p.164 の PTB コーパスが学習できた。 GPU を使った場合は 1 エポックで 166 秒だった。GPU を使わない場合は 1 エポックに 336 秒を要したから、 時間にして半分強短縮できたことになる。p.53 では、このコードの実行には CPU で数時間かかりますが、 GPU を使えば数十分程度で完了します。とある。数時間が数十分になるということは 1/4 ぐらいの短縮ができるように思えるが、 私の場合は 1/2 だった。何かがおかしいのだろうか。

書誌情報

書 名ゼロから始める Deep Learning 2
著 者斎藤 康毅
発行日2016 年 9 月 28 日(初版第1刷)
発行所オライリー・ジャパン
発売元オーム社
定 価3400 円
サイズA5 判
ISBN978-4-87311-758-4
その他越谷市立図書館で借りて読む

まりんきょ学問所コンピュータの部屋コンピュータの本ニューロコンピューティング > 斎藤 康毅:ゼロから始める Deep Learning 2


MARUYAMA Satosi