dhm2013724 / yolov2_xilinx_fpga

A demo for accelerating YOLOv2 in xilinx's fpga pynq/zedboard
MIT License
792 stars 236 forks source link

请教在资源更多的板子上加速运算 #54

Closed benpaodewali closed 4 years ago

benpaodewali commented 4 years ago

大佬您好^^,我这儿有一块资源更多的板子,运行您的代码只用了很少的资源(成功运行,非常感谢),现在想把资源充分利用起来,看了下您的代码,大佬的代码太复杂了还没有理清,大概知道和下面几个参数有关 `

define Tn 4

define Tm 32

define Tr 26

define Tc 26

` 看了一下综合,compute这个函数里面只有里面的for进行了展开,用了大约TMxTn=32x4=128个dsp乘法器,我的板子是7035,有900个乘法器,大约还有750个乘法器没有用,这里我想充分利用起来,是否可以将Tn改成16,然后把compute最里面的4个乘法扩展成16个,就可以了?还有一个问题是还能采取哪些措施,继续加快运算速度,望大佬赐教,不甚感激

benpaodewali commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

dhm2013724 commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就11和33,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

benpaodewali commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就1_1和3_3,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

非常感谢大佬回复,通过学习这份代码学习到了不少有关hls的知识,感觉比看官网教程文档收获要大很多,谢谢大佬的无私奉献。我在软件这边修改了Tm Tn Tr Tc等等,这些影响weights的排布,然后怎么修改都可以运行出正确结果,说明软件这边没受到你说的幻数的影响,可是在fpga这边运行结果却不正确,我主要是修改Tm,把32改成128,这样乘法器就能用到512个,然后把和Tm有关的数据位宽加了两位,使用的是对应排布的weihts,这里想请教一下大佬,我这儿是不是有哪里疏漏的地方;

hisrg commented 4 years ago

请问楼上你的权值是怎么得到的?我这里只有一个权值文件,而hls源代码需要5个: 如下: FILE *fp_w = fopen("weightsv2_comb_reorg_ap16.bin", "rb"); if(!fp_w) file_error("weightsv2_comb_reorg_ap16.bin");

FILE *fp_b = fopen("biasv2_comb_ap16.bin", "rb");
if(!fp_b) file_error("biasv2_comb_ap16.bin");

请告诉我这些权值下载位置,谢谢!!

dhm2013724 commented 4 years ago

请问楼上你的权值是怎么得到的?我这里只有一个权值文件,而hls源代码需要5个: 如下: FILE *fp_w = fopen("weightsv2_comb_reorg_ap16.bin", "rb"); if(!fp_w) file_error("weightsv2_comb_reorg_ap16.bin");

FILE *fp_b = fopen("biasv2_comb_ap16.bin", "rb");
if(!fp_b) file_error("biasv2_comb_ap16.bin");

请告诉我这些权值下载位置,谢谢!!

跑一遍Software Version里的代码就全有了,兄弟! Good Luck!

dhm2013724 commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就1_1和3_3,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

非常感谢大佬回复,通过学习这份代码学习到了不少有关hls的知识,感觉比看官网教程文档收获要大很多,谢谢大佬的无私奉献。我在软件这边修改了Tm Tn Tr Tc等等,这些影响weights的排布,然后怎么修改都可以运行出正确结果,说明软件这边没受到你说的幻数的影响,可是在fpga这边运行结果却不正确,我主要是修改Tm,把32改成128,这样乘法器就能用到512个,然后把和Tm有关的数据位宽加了两位,使用的是对应排布的weihts,这里想请教一下大佬,我这儿是不是有哪里疏漏的地方;

你看一下,可能是某些地方的位宽我设置的过小了,所以会产生这种问题,软件版没错的话,就看C仿真对不对了,C仿真也对的话,那么应该没事,不然得去找一下你改了哪些地方的位宽,那些地方我为了省资源一般都设的刚刚好,所以你改完就会这样;还有就是那个write back模块里面,考虑到yolov2最后一层,好像做了一些特定优化,所以我不知道你改完设计参数后,会不会也需要改;主要就看你最后C仿真的输出结果了,和软件版一致就OK了。 Good Luck!

hisrg commented 4 years ago

请问能否提供这些文件?我使用vs 跑software version需要时间?我的邮件地址是afetsc2008@sina.com.谢谢

benpaodewali commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就1_1和3_3,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

非常感谢大佬回复,通过学习这份代码学习到了不少有关hls的知识,感觉比看官网教程文档收获要大很多,谢谢大佬的无私奉献。我在软件这边修改了Tm Tn Tr Tc等等,这些影响weights的排布,然后怎么修改都可以运行出正确结果,说明软件这边没受到你说的幻数的影响,可是在fpga这边运行结果却不正确,我主要是修改Tm,把32改成128,这样乘法器就能用到512个,然后把和Tm有关的数据位宽加了两位,使用的是对应排布的weihts,这里想请教一下大佬,我这儿是不是有哪里疏漏的地方;

你看一下,可能是某些地方的位宽我设置的过小了,所以会产生这种问题,软件版没错的话,就看C仿真对不对了,C仿真也对的话,那么应该没事,不然得去找一下你改了哪些地方的位宽,那些地方我为了省资源一般都设的刚刚好,所以你改完就会这样;还有就是那个write back模块里面,考虑到yolov2最后一层,好像做了一些特定优化,所以我不知道你改完设计参数后,会不会也需要改;主要就看你最后C仿真的输出结果了,和软件版一致就OK了。 Good Luck!

C仿真有问题,直接退出,你说的write back我好像看到了和tm有关的幻数,最后一层有425个filter: if(TM_MIN_6b==9) TM_MIN_g = 12; else TM_MIN_g = TM_MIN_6b; 好像是因为425=32*13+9,后面我感觉TM_MIN_g=9应该也可以呀,大佬为啥在这儿变成12,是因为奇偶吗?然后想问一下大佬是怎么仿真调试的,我这边c simulation直接死掉了。如果上板每次改一下重新综合加上编译要大半个小时。。 用tb里面的teshbench测试,把ap_int<>这类数据都用int和unsigned int代替,结果128也是正确的

benpaodewali commented 4 years ago

请问能否提供这些文件?我使用vs 跑software version需要时间?我的邮件地址是afetsc2008@sina.com.谢谢

你还需要不,100M左右

hisrg commented 4 years ago

需要,谢谢

benpaodewali commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就1_1和3_3,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

非常感谢大佬回复,通过学习这份代码学习到了不少有关hls的知识,感觉比看官网教程文档收获要大很多,谢谢大佬的无私奉献。我在软件这边修改了Tm Tn Tr Tc等等,这些影响weights的排布,然后怎么修改都可以运行出正确结果,说明软件这边没受到你说的幻数的影响,可是在fpga这边运行结果却不正确,我主要是修改Tm,把32改成128,这样乘法器就能用到512个,然后把和Tm有关的数据位宽加了两位,使用的是对应排布的weihts,这里想请教一下大佬,我这儿是不是有哪里疏漏的地方;

你看一下,可能是某些地方的位宽我设置的过小了,所以会产生这种问题,软件版没错的话,就看C仿真对不对了,C仿真也对的话,那么应该没事,不然得去找一下你改了哪些地方的位宽,那些地方我为了省资源一般都设的刚刚好,所以你改完就会这样;还有就是那个write back模块里面,考虑到yolov2最后一层,好像做了一些特定优化,所以我不知道你改完设计参数后,会不会也需要改;主要就看你最后C仿真的输出结果了,和软件版一致就OK了。 Good Luck!

C仿真有问题,直接退出,你说的write back我好像看到了和tm有关的幻数,最后一层有425个filter: if(TM_MIN_6b==9) TM_MIN_g = 12; else TM_MIN_g = TM_MIN_6b; 好像是因为425=32*13+9,后面我感觉TM_MIN_g=9应该也可以呀,大佬为啥在这儿变成12,是因为奇偶吗?然后想问一下大佬是怎么仿真调试的,我这边c simulation直接死掉了。如果上板每次改一下重新综合加上编译要大半个小时。。 用tb里面的teshbench测试,把ap_int<>这类数据都用int和unsigned int代替,结果128也是正确的

尝试Tm=128,使用tb里面的代码测试,把ap_uint类型都换成uint,结果正确,这样应该可以确定hls这边逻辑没有问题,继续综合到fpga里还是不对,那么应该推断问题出在sdk这边,我对比一下sdk里面的代码和tb里的代码的区别

benpaodewali commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就1_1和3_3,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

非常感谢大佬回复,通过学习这份代码学习到了不少有关hls的知识,感觉比看官网教程文档收获要大很多,谢谢大佬的无私奉献。我在软件这边修改了Tm Tn Tr Tc等等,这些影响weights的排布,然后怎么修改都可以运行出正确结果,说明软件这边没受到你说的幻数的影响,可是在fpga这边运行结果却不正确,我主要是修改Tm,把32改成128,这样乘法器就能用到512个,然后把和Tm有关的数据位宽加了两位,使用的是对应排布的weihts,这里想请教一下大佬,我这儿是不是有哪里疏漏的地方;

你看一下,可能是某些地方的位宽我设置的过小了,所以会产生这种问题,软件版没错的话,就看C仿真对不对了,C仿真也对的话,那么应该没事,不然得去找一下你改了哪些地方的位宽,那些地方我为了省资源一般都设的刚刚好,所以你改完就会这样;还有就是那个write back模块里面,考虑到yolov2最后一层,好像做了一些特定优化,所以我不知道你改完设计参数后,会不会也需要改;主要就看你最后C仿真的输出结果了,和软件版一致就OK了。 Good Luck!

跑出来了,问题处在vivado,一个小问题,hls代码没问题,不过有个疑问 在hls的YOLO2_FPGA函数中,用rpagma描述Input这个参数或者接口的代码是这样的: `#pragma HLS INTERFACE m_axi depth=512 port=Input offset=slave bundle=DATA_BUS1。。。

pragma HLS INTERFACE s_axilite register port=Input bundle=CTRL_BUS`

按我的理解第一行指的是input是hp接口,第二行指的是gp接口的寄存器,为什么input要寄存器呢,为什么input1、input2、input3没有呢?期待大佬解答,谢谢了

wpyueyue commented 4 years ago

楼上的大佬,vivado创建的工程,最后地址分配是什么样子的。我自动布线,然后验证了,但是地址报错,我只能自己分配地址,但是我感觉有问题,想问以下您是怎样分配的。因为想在linux上移植,但是vivado地址有问题,所以没有向下进行。

1576834615(1)
wpyueyue commented 4 years ago

![Uploading 1576835131(1).png…]()

benpaodewali commented 4 years ago

楼上的大佬,vivado创建的工程,最后地址分配是什么样子的。我自动布线,然后验证了,但是地址报错,我只能自己分配地址,但是我感觉有问题,想问以下您是怎样分配的。因为想在linux上移植,但是vivado地址有问题,所以没有向下进行。

1576834615(1)

hp接口全部设置成0到1G,gp接口64k,你的没错

benpaodewali commented 4 years ago

我觉得有个地方可以改进一下,算了一下weights大小大约97MB,FM来回读写的大小只有35MB左右,可是分配4给HP接口给FM用,只有一个HP给weights,如果要加速的话,可能这儿要重新分配一下

是的,这个问题我想过;实际上,得先测下读写带宽的,最好是就4个HP,读IFM和W共享HP就可以了;带宽够也可以多加HP,或者直接接口换AXI-Stream+SG DMA;关于进一步改进,如果还是用HLS,这东西写不出很多结构,你可以先在软件版上改Tm Tn Tr Tc等等,然后等软件版那几部都对了,再移到HLS上去;软件版里幻数比较多,有很多trade off。。。现在的网络kernel都比较小了,一般就1_1和3_3,我不知道Winograd还是不是那么有效果,可能FFT会更好?或者试试Systolic Array也可以,这个HLS还是可以做的,之前看到Xilinx官方好像有example,这领域已经比较成熟了,玩玩可以,个人不建议跳坑,再往下学术贡献估计不大,Jason Cong都去搞存储了= =

非常感谢大佬回复,通过学习这份代码学习到了不少有关hls的知识,感觉比看官网教程文档收获要大很多,谢谢大佬的无私奉献。我在软件这边修改了Tm Tn Tr Tc等等,这些影响weights的排布,然后怎么修改都可以运行出正确结果,说明软件这边没受到你说的幻数的影响,可是在fpga这边运行结果却不正确,我主要是修改Tm,把32改成128,这样乘法器就能用到512个,然后把和Tm有关的数据位宽加了两位,使用的是对应排布的weihts,这里想请教一下大佬,我这儿是不是有哪里疏漏的地方;

你看一下,可能是某些地方的位宽我设置的过小了,所以会产生这种问题,软件版没错的话,就看C仿真对不对了,C仿真也对的话,那么应该没事,不然得去找一下你改了哪些地方的位宽,那些地方我为了省资源一般都设的刚刚好,所以你改完就会这样;还有就是那个write back模块里面,考虑到yolov2最后一层,好像做了一些特定优化,所以我不知道你改完设计参数后,会不会也需要改;主要就看你最后C仿真的输出结果了,和软件版一致就OK了。 Good Luck!

大佬,我把weight分配到4个hp接口了,120M频率下,TM=128,乘法器使用了512个,一张图片0.633s,没有预想的快哦