はじめに
GPUを使ってDeep Learningで学習をさせようとすると、実に簡単にエラーが発生します。
(しかも異常終了するし...)
エラーメッセージ
おそらくほとんどのケースが、GPUメモリが足らないというケースかと思います。
であるならば、使用する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」等のフリーソフトで簡単に確認することができます。
余談
せっかく調整して、GPUメモリ内で動作するようになっても、うっかりGPU描画を行うアプリを実行したりすると、簡単に落ちます。
(1日以上学習させていたのに、うっかりA-Frameのサンプル見てたら落ちました ;_;)
(あぁ...3日まわしていたのに、google mapで落ちた...)
学習中は、余計なことをしないようにしましょう。
まとめ
出来れば上記のように値を調整するのではなく、より多くGPUメモリが載ったグラフィックスボード(GPUボード)を使用することをお勧めします。
また、多少GPUの世代が古くても、多くのメモリが載ったものがよいと思います。