Solaris
Solaris
> 该head.py支持VOC格式的数据集吗? @vaerdu head跟数据集格式无关,输入head的是已经用dataset读取的图和label,只要dataset用的是支持voc格式的就行
> > 测试发现训练速度瓶颈主要在simOTA,其中的for loop一张一张处理图像无法充分发挥GPU并行计算的优势。有同学(miemie2013)已经实现了并行版simOTA,去掉了for loop,一个batch的数据都可以并行处理,实测训练速度提升了几倍,建议官方采用: https://github.com/miemie2013/miemiedetection/blob/main/mmdet/models/heads/yolox_head_fast.py 直接替换原来的yolo_head.py再简单改一下import就可以使用。 > > 我试着用了一下,在我这个数据集上好像只能提速10%。。。 @Mobu59 你加载数据用了cache吗?可以看看GPU利用率,如果比较低,瓶颈可能在读图和预处理。用cache可以提速一倍,然后调一调worker数量还可以再提一点速度。也可能你的训练分辨率比较大,simOTA的处理时间相对较小,所以提速不明显。
@Mobu59 另外,在不超出显存容量的前提下尽量加大batch size,提升并行度,也能加速训练
> > > > 没有用cache,分辨率的话是640*640的 @Mobu59 RAM够大就用cache吧,直接cache不行的话,可以试试把原始压缩的图像拷贝到/dev/shm目录下,也比直接从硬盘读要快很多。
> @scsolaris 我发现改成batch assign之后,显存占用多了不少,2080Ti跑不了yolox-s,你们有类似的情况吗 @Joker316701882 这个并行实现确实是以空间换时间,显存占用增加是肯定的 。不过我用小分辨率训练yolox-nano显存占用没有明显增加,也没试过yolox-s。
> 感觉没什么变化 @mcmingchang batch size比较小的话加速确实不明显
> @scsolaris 请问跑demo.py,时怎么调整batch_size? @tigerdhl 这个问题跟SimOTA没关系吧,demo.py不会用到SimOTA......而且demo.py的本意应该就是一张一张地跑,所以输入model时batch size为1,没有命令行参数来设置batch_size。 如果实在要用demo.py同时跑多张图,就需要自己改代码了,可以参考训练或验证的代码。
@lunalulu torch.tile()是pytorch 1.8.0引入的新api,跟repeat确实是等效的,参考:[https://github.com/pytorch/pytorch/pull/47974](https://github.com/pytorch/pytorch/pull/47974)
@scsolaris 你开了fp16吗?直接用binary_cross_entropy会报这个错,原作者没考虑这个问题,这是我的修改: ``` # 二值交叉熵 with torch.cuda.amp.autocast(enabled=False): p = p.float() gt_clss = one_hots.float() pair_wise_cls_loss = F.binary_cross_entropy(p, gt_clss, reduction='none') # [N, G, A, 80] ``` 其实就是在调用binary_cross_entropy前先把float16的tensor转换回float32。