chainerでのGPUの使い方について

4,141 views
Skip to first unread message

越田恭平

unread,
May 10, 2016, 8:25:14 AM5/10/16
to Chainer Japanese User Group
失礼いたします.
最近chainerでディープラーニングを触り始めたものです.
株価の時系列データから次の株価を予測するということをやってみたくてLSTMを用いたコードを書きました.
CPUでは動いてくれるのですが,GPUで実行しようとしたところエラーが出て動きません.
やっていることは時刻tのデータを入力とし時刻t+1のデータを正解にすることでネットワークを学習しています.
loss=model(x,t)のところでエラーが出ているので,xとtの型が問題なのかと試行錯誤したのですがうまくいきませんでした.
入力データは株価の時系列データを株価が上がれば0,変化しないなら1,下がれば2という風に変換したものを使っています.
train_LSTM.pyが実行ファイルでmyLSTM2.pyがネットワークを記述したもの,9984_2010-4.csvが入力データになっています.
エラーは以下のようなものになっています.

Traceback (most recent call last):
  File "train_LSTM.py", line 100, in <module>
    loss=model(x,t)
  File "C:\Anaconda2\Lib\site-packages\chainer\links\model\classifier.py", line
54, in __call__
    self.y = self.predictor(x)
  File "d:\LSTM-experiment\myLSTM2.py", line 21, in __call__
    h0=self.embed(x)
  File "C:\Anaconda2\Lib\site-packages\chainer\links\connection\embed_id.py", li
ne 42, in __call__
    return embed_id.embed_id(x, self.W, ignore_label=self.ignore_label)
  File "C:\Anaconda2\Lib\site-packages\chainer\functions\connection\embed_id.py"
, line 104, in embed_id
    return EmbedIDFunction(ignore_label=ignore_label)(x, W)
  File "C:\Anaconda2\Lib\site-packages\chainer\function.py", line 115, in __call
__
    self._check_data_type_forward(in_data)
  File "C:\Anaconda2\Lib\site-packages\chainer\function.py", line 190, in _check
_data_type_forward
    raise type_check.InvalidType(e.expect, e.actual, msg=msg)
chainer.utils.type_check.InvalidType:
Invalid operation is performed in: EmbedIDFunction (Forward)

Expect: in_types[0].ndim >= 1
Actual: 0 < 1

chainerのバージョンは1.8.1
pythonは2.7.11
です.
読みにくいコードで申し訳ないのですが,どうすればGPUで動かせるのか教えていただけると本当に助かります.
よろしくお願いします.

myLSTM2.py
train_LSTM.py
9984_2010-4.csv

kitanokumo

unread,
May 11, 2016, 11:09:08 PM5/11/16
to Chainer Japanese User Group
今動かせないので推測ですが、元コードのこの箇所を
if gpu:
    x=Variable(cuda.to_gpu([sequence[i]]))
    t=Variable(cuda.to_gpu([sequence[i+1]])) 

こう変更したらどうなりますか?
if gpu:
    x=Variable(cuda.cupy.asarray([sequence[i]]))
    t=Variable(cuda.cupy.asarray([sequence[i+1]])) 

越田恭平

unread,
May 26, 2016, 6:42:25 AM5/26/16
to Chainer Japanese User Group
回答ありがとうございます.
返信が遅くなり申し訳ありません.
いろいろ試したのですが,やはりうまくいきませんでした.
とりあえず単純なxorを学習するネットワークで動くのか試してみたのですがそれでもだめでした.
CPUでは問題なく動くのになぜGPUでは動いてくれないのか分からず本当に困っています.
xorを識別するネットワークを添付しますので,Variableへの変換の仕方など根本的に間違っているところなどがあればぜひともアドバイスがほしいです.
エラーの内容は以下のようになっているのですがバイアスbはいじっていないのになぜこのようなエラーが出るのでしょうか.

Traceback (most recent call last):
  File "xor.py", line 68, in <module>
    loss = model(x,t)

  File "C:\Anaconda2\Lib\site-packages\chainer\links\model\classifier.py", line
54, in __call__
    self.y = self.predictor(x)
  File "xor.py", line 25, in __call__
    o1 = F.relu(self.l1(x))
  File "C:\Anaconda2\Lib\site-packages\chainer\links\connection\linear.py", line
 65, in __call__
    return linear.linear(x, self.W, self.b)
  File "C:\Anaconda2\Lib\site-packages\chainer\functions\connection\linear.py",
line 81, in linear
    return LinearFunction()(x, W, b)
  File "C:\Anaconda2\Lib\site-packages\chainer\function.py", line 123, in __call
__
    outputs = self.forward(in_data)
  File "C:\Anaconda2\Lib\site-packages\chainer\functions\connection\linear.py",
line 38, in forward
    y = x.dot(W.T)
TypeError: Argument 'b' has incorrect type (expected cupy.core.core.ndarray, got
 numpy.ndarray)

2016年5月12日木曜日 12時09分08秒 UTC+9 kitanokumo:
xor.py

Yuya Unno

unread,
May 26, 2016, 7:04:09 AM5/26/16
to 越田恭平, Chainer Japanese User Group
海野です。

> model.to_gpu
この部分を、

> model.to_gpu(gpu)
にするとどうなりますか?

2016年5月26日 19:42 越田恭平 <kosh...@gmail.com>:

--
このメールは Google グループのグループ「Chainer Japanese User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには chainer-jp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには chain...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/chainer-jp/83945c23-072c-4f35-84ac-f2e1a06ef750%40googlegroups.com にアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

越田恭平

unread,
May 26, 2016, 7:39:19 AM5/26/16
to Chainer Japanese User Group, kosh...@gmail.com
回答ありがとうございます.
早速model.to_gpu(gpu)に変更してみたところ

0
loss:0.698772311211,acc0.5
1

Traceback (most recent call last):
  File "xor.py", line 65, in <module>
    x = chainer.Variable(xp.asarray(x))
  File "C:\Anaconda2\Lib\site-packages\cupy\creation\from_data.py", line 47, in
asarray
    return cupy.array(a, dtype=dtype, copy=False)
  File "C:\Anaconda2\Lib\site-packages\cupy\creation\from_data.py", line 27, in
array
    return core.array(obj, dtype, copy, ndmin)
  File "cupy\core\core.pyx", line 1366, in cupy.core.core.array (cupy\core\core.
cpp:49347)
  File "cupy\core\core.pyx", line 1382, in cupy.core.core.array (cupy\core\core.
cpp:49004)
ValueError: Unsupported dtype object

このように一回だけ学習して止まってしまいます.
途中でdtypeを変更したりはしていないので一回だけ学習するのは不思議な感じです.


2016年5月26日木曜日 20時04分09秒 UTC+9 Yuya Unno:

越田恭平

unread,
May 26, 2016, 8:02:32 AM5/26/16
to Chainer Japanese User Group, kosh...@gmail.com
何度もすいません.
色々試行錯誤した結果,原因が分かりました.
コードをいじっている中で訓練部のforループ内で
x = chainer.Variable(xp.asarray(x,dtype = np.float32))
t= chainer.Variable(xp.asarray(t,dtype = np.int32))
このようにしてしまっていたので二回目の実行の際にVariable型をVariable型に変更する処理がなされていました.
この部分をforループのそとに持っていくと無事実行されました.
また分からないところが出てくると思うので,そのときはアドバイスをいただけるとありがたいです.
ありがとうございました.

2016年5月26日木曜日 20時39分19秒 UTC+9 越田恭平:

Yuya Unno

unread,
May 26, 2016, 11:13:34 PM5/26/16
to 越田恭平, Chainer Japanese User Group
無事に動いたようでよかったです。__init__周辺の型チェックはもう少し厳重に入れたほうが良さそうですね・・。

2016年5月26日 21:02 越田恭平 <kosh...@gmail.com>:
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/chainer-jp/28be484f-af8b-4f1b-843c-264411d60a19%40googlegroups.com にアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Reply all
Reply to author
Forward
0 new messages