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!

posted @ 2022-05-24 23:39  无左无右  阅读(30)  评论(0编辑  收藏  举报