buq’s blog

覚えておきたいけど覚えておけなさそうなことを書きます?

chainer に GPU 計算をさせるときは model を GPU に移してから optimizer と紐付ける

OK なコード

model = Regression(Model())
if gpu >= 0:
    xp = cuda.cupy
    cupy.cuda.Device(gpu).use()
    model.to_gpu()
else:
    xp = np
opt = optimizers.Adam() # モデルを gpu に移したあとで
opt.setup(model)        # optimizer と紐付けるとOK

NGなコード

model = Regression(Model())
opt = optimizers.Adam() # モデルを gpu に移す前に
opt.setup(model)        # optimizer と紐付けると悲しい
if gpu >= 0:
    xp = cuda.cupy
    cupy.cuda.Device(gpu).use() 
    model.to_gpu()
else:
    xp = np

NGなコードは,動作はしてしまうが一歩も学習が進まない

epoch 0
trainingloss 1249.54880859
testloss  1482.03295898
epoch 1
trainingloss 1249.54880859
testloss  1482.03295898

GPUも動くだけ動いちゃうので,reluでも勾配が消えうるのかと思って1日溶かしました👀