bolt icon indicating copy to clipboard operation
bolt copied to clipboard

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

Open yanghaojin opened this issue 1 year ago • 6 comments

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?希望得到您的答复,谢谢!

yanghaojin avatar Apr 05 '23 12:04 yanghaojin

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

yuxianzhi avatar May 06 '23 06:05 yuxianzhi

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

  • activation input(NCHW, fp16) -> (N_C/8_H_W_c8, fp16)-> bit-packing using transformFromHalf to (N_C/8_H_W_c8) / 8, bint8, -> further steps in convolution_xnor_A55

  • weight (NCHW, fp32) -> bit-packing via model converter function ws_datatype_converter_bnn, (NCHW)/8, U8 -> weight transform to layout N/16_C/8_HW_n16_c8 using convolution_transform_filter_bnn; 这个转换后的权重将会用来在如convolution_xnor_A55 中进行计算。

  • 请问我以上的解读是否有错误?另外请问卷积输出Tensor 的format是fp16_NCHW还是N_C/8_HW_c8?

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

yanghaojin avatar May 07 '23 20:05 yanghaojin

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的卷积层结果。

yuxianzhi avatar May 11 '23 02:05 yuxianzhi

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

yanghaojin avatar May 11 '23 06:05 yanghaojin

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

yuxianzhi avatar May 18 '23 07:05 yuxianzhi

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模型应该没有这个特殊处理?

lixcli avatar Aug 14 '23 17:08 lixcli