nvcaffe 的一个问题解决
又是解决问题的一天,一个问题解决一天!!
期间经过了多次放弃但是最终坚持下来并解决了难题!!!
是这样的。
我们发现nvcaffe0.16.4会有显存问题,就是刚开始启动训练的时候cudnn会寻优然后会显存爆增,batch设置稍微大点儿就会溢显存!
比如我正常训练显存是9G。我32G卡,开了一个训练是9G,还剩下23G,但是我再开一个同样的任务就会加载不了报错显存溢出!
这不坑爹吗?
nvcaffe0.17就没有这个问题!
然后就想办法把既有的caffe0.16.4升级到0.17就可以了!
但是说起来容易,对比了一下需要改的地方太多,数据层和loss层。特别数据层,牵扯太多太多了。
但是毕竟是任务,攻坚克难!
然后就开干了,我负责数据层,一步步改,改到吐血,整整改了一天终于编译通过,至于对不对不知道,需要训练起来看看才知道。
终于其他同事改好了然后训练发现loss为0啊!!!显然数据层有问题。然后查找问题!发现是图像数据是正常的,但是标签没有!!
AnnotatedDatum这个。在DataLayerSetUp函数,有个直接读取lmdb成AnnotatedDatum,
// Read a data point, and use it to initialize the top blob.
shared_ptr<AnnotatedDatum> sample_datum =
this->sample_only_ ? this->sample_reader_->sample() : this->reader_->sample();
AnnotatedDatum& anno_datum = *sample_datum;
// int num_bboxes_tmp = 0; //这里一直是0
// for (int g = 0; g < anno_datum.annotation_group_size(); ++g) {
// num_bboxes_tmp += anno_datum.annotation_group(g).annotation_size();
// }
//
// int aa = 0;
//图片有,正常
/*
Datum datum1111 = anno_datum.datum();
const string& data = datum1111.data();
std::vector<char> vec_data(data.c_str(), data.c_str() + data.size());
bool is_color = true;
int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat cv_img = cv::imdecode(vec_data, cv_read_flag);
int a1 = 0;
*/ //test show img
图片有,正常. num_bboxes_tmp为0. 一直为0!!反正这里排除了data transform层导致的,这里是一读取就为0.
然后各种看底层代码啊,lmdb代码啊找不到问题。
然后最关键的是我用这个之前0.17的lmdb试了下,居然是可以读到框的!
但是0.16的lmdb也没有问题啊,一直在用的啊!
。。。。
最后!
我把合并的peoto删了,只保留之前0.16的proto。
AnnotatedDatum AnnotationGroup Annotation主要就是这3个。
如图
之前的0.16的
// Group of annotations for a particular label.
message AnnotationGroup {
optional int32 group_label = 1;
repeated Annotation annotation = 2;
}
现在合并的:
// Group of annotations for a particular label.
message AnnotationGroup {
optional int32 group_label = 1;
optional int32 group_id = 2;
repeated Annotation annotation = 3;
optional int32 pos = 4;
optional int32 line_type = 5;
}
然后重新编译代码!
然后发现框可以正常读取了!!!num_bboxes_tmp有值了!!
和proto有关系,难道proto不能随便增加变量参数吗?
呃呃呃,无解,不懂,不知道..。
具体啥愿意我也不知道。
这里有问题可能代码哪里有重复函数。就是函数名一样参数一样,但是函数里面干的完全不一样的事情。这个时候精度就有问题,反正需要仔细改改debug!