huawei-noah / bolt

Bolt is a deep learning library with high performance and heterogeneous flexibility.
https://huawei-noah.github.io/bolt/
MIT License
918 stars 160 forks source link

binary conv arm中input bit-packing像素顺序问题 #131

Open yanghaojin opened 1 year ago

yanghaojin commented 1 year ago

Thanks for the great work! 在看了代码后,我发现bolt的实现中可能存在一些问题,但也不是很确定,想请教一下: 比如这里:convolution_xnor_A55transformFromHalf本质上是对input tensor做了bit-packing,但潜在的问题是它是按照row-wise的顺序的方式对整个input tensor进行像素访问。而通常实现binary 矩阵乘法时,需要先做im2col,将input变成patches,每一个patch包含和weight filter大小一样的子矩阵,然后再对每一个patch中的像素进行bit-packing。这里可以看到问题了,在bolt的实现中input tensor的bit-packing是不是做早了?packing到一起的像素并不属于卷积时的相同的patch?希望得到您的答复,谢谢!

yuxianzhi commented 1 year ago

你好,我们的bit packing是把输入channel维度的8个拼成一个byte,不是width或height,这个是不影响卷积滑窗的。不知道这样是不是能回答你的问题?

yanghaojin commented 1 year ago

感谢回复!我总结一下bolt实现的过程,麻烦您给指正:

目前我使用(-1,1)模拟二值化训练生成的模型,它的输出和bolt 暂时无法对齐,我想弄清楚,哪里可能出现了问题?感谢你们的帮助!

yuxianzhi commented 1 year ago

input: (N_C/8_H_W_c8) / 8, bint8 weight: N/16_C/8_HW_n16_c8 output: N_C/8_HW_c8

目前我使用(-1,1)模拟二值化训练生成的模型,它的输出和bolt 暂时无法对齐,我想弄清楚,哪里可能出现了问题?感谢你们的帮助! 是不是卷积需要padding,padding的值是什么?这个有影响,可以先比较一下没有padding的卷积层结果。

yanghaojin commented 1 year ago

是不是卷积需要padding,padding的值是什么?这个有影响,可以先比较一下没有padding的卷积层结果。 我测试专门去掉了padding。请问bolt中的unit test是否建立过使用(-1,1)做参数以及用乘加计算模拟二值化计算的对齐测试?谢谢

yuxianzhi commented 1 year ago

compute/tensor/tests/test_convolution_bnn.cpp,可以看一下是否对你有帮助

lixcli commented 1 year ago

input: (N_C/8_H_W_c8) / 8, bint8 weight: N/16_C/8_HW_n16_c8 output: N_C/8_HW_c8

目前我使用(-1,1)模拟二值化训练生成的模型,它的输出和bolt 暂时无法对齐,我想弄清楚,哪里可能出现了问题?感谢你们的帮助! 是不是卷积需要padding,padding的值是什么?这个有影响,可以先比较一下没有padding的卷积层结果。

padding这里我看bolt源码默认是pad 0,我没看完完整的代码,但是我猜底层计算二值卷积的时候是把-1当作0,然后使用xnor和popcount等位运算实现的二值卷积,这样的话padding就需要特殊处理,可以选择pad +1或者-1,不pad的话会二值输出结果就会不一致。我这边实验发现pad -1效果比较好。我猜作者用来测试的bnn模型应该没有这个特殊处理?