開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

chainerでcleargrads後のaddgradsでSource gradient is not set.エラー

 chainerでは、複数のGPUを使って並列にlossを求めて逆伝搬し、勾配を足し合わせてからupdateする方法がサポートされている。
 Using GPU(s) in Chainer — Chainer 1.15.0.1 documentation

 コードは以下のようになる。

model_0.cleargrads()
model_1.cleargrads()

loss_0 = model_0(x0, t0)
loss_1 = model_1(x1, t1)

loss_0.backward()
loss_1.backward()

model_0.addgrads(model_1)
optimizer.update()

model_1.copyparams(model_0)

 このうちaddgradsSource gradient is not set.というエラーが発生した。発生箇所はこのあたりだが、原因がよくわからなかった。

 ソースコードを読んでいて原因がわかった。どうやらChainインスタンスadd_linkしたlinkのうち、未使用のものがあるとこのエラーが発生するらしい。解決策としては

  1. 未使用のlinkを消す
  2. cleargradsではなくzerogradsを使う

 といった感じだろう。

 エラーの原因が分かるようassertを出すPRを作ろうと思ったが、Chain内に書くしか無く、そうするとChain内で全paramを網羅的に調べる必要があるので、コードが汚くなるし処理が重複してしまう。うーん、errorをthrowする設計がたまに恋しくなるなぁ。