case1: syncedmem.cpp:56] Check failed: error == cudaSuccess (2 vs. 0) out of memory
这种情况下,可能有进程在使用显存,而且使用很多,已经耗尽显存了。无法再分配显存。
使用:nvidia-smi查看显存使用情况:
Mon Aug 21 17:22:35 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66 Driver Version: 375.66 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 960 Off | 0000:01:00.0 On | N/A |
| 40% 60C P2 37W / 120W | 1513MiB / 1993MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1438 G /usr/lib/xorg/Xorg 160MiB |
| 0 1500 C /usr/bin/python 44MiB |
| 0 3268 G compiz 108MiB |
| 0 25749 C ../caffe/build/tools/caffe 1195MiB |
+-----------------------------------------------------------------------------+
另一种情况是,train和test的prototxt里面的batch_size设置过大,导致显存一次不能载入那么多数据。该小即可:
test:
data_param {
source: "/home/gesture1/lmdb/gesture1_test_lmdb"
batch_size: 1
backend: LMDB
}
train:
data_param {
source: "/home/gesture1/lmdb/gesture1_trainval_lmdb"
batch_size: 1
backend: LMDB
}
现在看看这个batch_size是啥子意思:
这个是网络没迭代一次处理的图片数目,如果你有12800张照片,这个batch_size设置为128,则训练完所有的图片,至少需要迭代100次。
#############################
在使用ssd的mobilenet时候
发现网络输出提示:
Couldn't find any detections
然后直接crash掉。
查看网络结构,发现如下的设置:
code_type: CENTER_SIZE
keep_top_k: 100
confidence_threshold: 0.25
我目下使用自己的数据集进行训练,只有四种物体。之前未crash掉是因为物体种类有21种,检测成其他物体且在0.25左右的可能性很高。为了证明这个推断,查看ssd算法原始deploy的输出值设定:
code_type: CENTER_SIZE
keep_top_k: 200
confidence_threshold: 0.01
可以看出是否发生crash与此处的阈值
confidence_threshold有关
故而修改此值为0.001,再重新运行网络,不会发生crash的情况了。