Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
yanghaojin opened this issue Apr 5, 2023 · 6 comments
Open

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

yanghaojin opened this issue Apr 5, 2023 · 6 comments

Comments

@yanghaojin
Copy link

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
Copy link
Contributor

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

@yanghaojin
Copy link
Author

yanghaojin commented May 7, 2023

感谢回复!我总结一下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 暂时无法对齐,我想弄清楚,哪里可能出现了问题?感谢你们的帮助!

@yuxianzhi
Copy link
Contributor

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
Copy link
Author

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

@yuxianzhi
Copy link
Contributor

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

@lixcli
Copy link

lixcli commented Aug 14, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants