pytorchハマったところ備忘録
Cuda assert fails: device-side assert triggered
BCELossにnanを入力していました。BCELossの入力は[0,1]なのでエラーが出ますね。BCEWithLogitsを使えば[0,1]以外も扱えますが、nanをだしている方をなんとかしました。nanが出ていた理由は学習率が高すぎたというものでした。schedulerでburn in期間を設定して、最初は小さなものから徐々に大きくすることにしました。
logをコピーしすぎてGPUメモリが足りない
for batch in dataloader: (中略) running_loss += loss # loss.item()でないと勾配情報をどんどんコピーしていまい、メモリリーク
Accumulated gradients
大きなバッチサイズを確保したいがGPUのメモリが足りないので、勾配を貯めることにしました。 BNはbatch1つ分のままになってしまうようですので注意が必要です。
accumulation_steps = 4 # batch_size * accumulation_stepsだけ蓄積 for itr, batch in enumerate(dataloader): imgs, targets = batch loss = model(imgs, targets) loss = loss / accumulation_steps loss.backward() if (itr + 1) % accumulation_steps ==0: optimizer.step() optimizer.zero_grad() ````