1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WindowsのCaffeで学習するとき、GPUメモリと戦う方法

Last updated at Posted at 2016-11-29

はじめに

GPUを使ってDeep Learningで学習をさせようとすると、実に簡単にエラーが発生します。
(しかも異常終了するし...)
image1.png

エラーメッセージ

おそらくほとんどのケースが、GPUメモリが足らないというケースかと思います。
image2.png

であるならば、使用するGPUメモリを減らしましょう。

対応策1

画像サイズを小さくします。
例えば、256x256でエラーになっているのであれば、128x128にするとかします。
変更箇所は、学習用モデルと評価用モデルのprototxtファイルになります。

[例]学習用モデル

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 128   ### 256→128
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "train_lmdb"
    batch_size: 256
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 128   ### 256→128
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "test_lmdb"
    batch_size: 50
    backend: LMDB
  }
}

[例]評価用モデル

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 128 dim: 128 } }   ### 256→128
}

修正してもエラーになるのであれば、さらに小さくしましょう。
ただし小さくなればなるほど認識しづらくなるので、気を付けてください。

対応策2

バッチサイズを小さくさくします。
逆伝播する際、バッチサイズ分だけため込んで処理を行うため、小さければ小さいほどため込む量が減ります。
変更箇所は、学習用モデルのprototxtファイルになります。

[例]学習用モデル

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "train_lmdb"
    batch_size: 128   ### 256→128
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "test_lmdb"
    batch_size: 25   ### 50→25
    backend: LMDB
  }
}

なお、バッチサイズを小さくしたら学習回数(ソルバファイルの「max_iter」)を多くするようにしてください。
→「iter_size」というパラメータがあり、こちらを増やす(デフォルトは1)方がよいとの情報をいただきました。(xevixevi様、ありがとうございました!)

修正してもエラーになるのであれば、さらに小さくしましょう。
ただし小さくなればなるほど処理時間が長くなります。また逆伝播によるパラメータ修正の振れ幅が大きくなり、高い精度を出すためにはより多くの学習回数が必要になります。(うまく収束しない場合もある)

おまけ

最初からGPUメモリ内で処理できてしまい、エラーが発生しないことがあります。
そんな時には、GPUメモリの余り具合を確認し、画像サイズ、または、バッチサイズを大きくすることをお勧めします。

なお、GPUメモリの使用状況は、「Open Hardware Monitor」等のフリーソフトで簡単に確認することができます。
image3.png

余談

せっかく調整して、GPUメモリ内で動作するようになっても、うっかりGPU描画を行うアプリを実行したりすると、簡単に落ちます。
(1日以上学習させていたのに、うっかりA-Frameのサンプル見てたら落ちました ;_;)
(あぁ...3日まわしていたのに、google mapで落ちた...)
学習中は、余計なことをしないようにしましょう。

まとめ

出来れば上記のように値を調整するのではなく、より多くGPUメモリが載ったグラフィックスボード(GPUボード)を使用することをお勧めします。
また、多少GPUの世代が古くても、多くのメモリが載ったものがよいと思います。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?