副題は「自然言語処理編」
この本にいたって、ついに GPU があると学習時間が大幅に短縮できる例題が出てきた。 PTB コーパスを使った学習がそれである(p.164)。GPU を使わないと学習には多くの時間(半日程度) が必要になるという。では、GPU を使えばどれだけ短縮できるのかが気になるのだが、 そこは書かれていない。(2020-09-02)
貧乏な我が家にやっと 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, intrainer.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, intrainer.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 判 |
ISBN | 978-4-87311-758-4 |
その他 | 越谷市立図書館で借りて読む |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > ニューロコンピューティング > 斎藤 康毅:ゼロから始める Deep Learning 2