open-mmlab / OpenUnReID

PyTorch open-source toolbox for unsupervised or domain adaptive object re-ID.
Apache License 2.0
397 stars 67 forks source link

关于大规模数据的问题 #9

Closed huang1997214 closed 4 years ago

huang1997214 commented 4 years ago

对于ReIDtask,在数据规模较大(source20万,target40万)的时候,计算jaccard_distance的时候出现memory error。(loss的计算已经放到cpu,内存128GB) WeChat Work Screenshot_20200824221854 因为对您的代码还不是太熟悉,想问下您在计算loss的时候,不用矩阵乘法,一个batch一个batch的计算是否能解决这个问题呢? 此外您觉得还有哪些地方可以进一步优化呢? 谢谢您啦!

yxgeee commented 4 years ago

请问计算jaccard_distance选择的也是CPU是吗? TRAIN.PSEUDO_LABELS.search_type选的是什么?

huang1997214 commented 4 years ago

实在抱歉,config里TRAIN.PSEUDO_LABELS.search_type还是0,我改成3再试一下。

yxgeee commented 4 years ago

不过看样子不是faiss_gpu的问题。看你报错的这句话,是numpy在cpu上的memory error。如果是这样的话,感觉得重新优化一下矩阵存储和运算这块了。我再琢磨一下。

yxgeee commented 4 years ago

是不是你把loss放在cpu上占用了太多cpu内存,导致这里的numpy无法计算?你尝试先把loss等放回到gpu上呢?然后jaccard这边search_option选3,看看gpu或者cpu会不会超内存。

huang1997214 commented 4 years ago

谢谢您的回复!我再试试看看。

huang1997214 commented 4 years ago

您好,之前内存超都是由于准备dbscan时需要保存dist(N N) 。是否可在此进行优化,对于每个节点只考察top-K个节点而不是全部节点(N top-K) 牺牲一定的精度及时间换取空间。

yxgeee commented 4 years ago

其实现在就是只考虑top-k1的,可能写代码的方法上可以进行优化。那个NN的矩阵很大一部分都是1,都是top-k1以外的。但是dbscan的输入需要是一个NN的similarity矩阵,所以我觉得可以尝试分chunk做。把你的数据分成几个部分,分别做聚类。如果聚类后不做后处理(将几个部分的聚类label合理合并)的话,需要牺牲一定的精度,因为几个部分之间的样本无法相互比较。

Yifeng notifications@github.com于2020年8月25日 周二16:59写道:

您好,之前内存超都是由于准备dbscan时需要保存dist(N * N) 。是否可在此进行优化,对于每个节点只考察top-K个节点而不是全部节点(N

  • top-K) 牺牲一定的精度及时间换取空间。

— You are receiving this because you commented.

Reply to this email directly, view it on GitHub https://github.com/open-mmlab/OpenUnReID/issues/9#issuecomment-679899271, or unsubscribe https://github.com/notifications/unsubscribe-auth/ACHSH2GYCORNZZCK42N7UKLSCN4QNANCNFSM4QJR4L7Q .

huang1997214 commented 4 years ago

我现在在尝试重写一下dbscan,之后再改一下compactness以及independenc(那里也构造了N * N)。谢谢您之前的帮助!