理科系の勉強日記

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

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()

````