zyxxmu / LBC

Pytorch implementation of our paper accepted by NeurIPS 2022 -- Learning Best Combination for Efficient N:M Sparsity
15 stars 2 forks source link

请问ResNet50是如何获取稀疏化权重的 #1

Closed JingyangXiang closed 1 year ago

JingyangXiang commented 2 years ago
alpha = weight['state_dict']["layer1.0.conv2.alpha"]
index_list = weight['state_dict']["layer1.0.conv2.index_list"]
mask_shape = weight['state_dict']["layer1.0.conv2.weight"].permute(0, 2, 3, 1).shape
mask = (alpha @ index_list).reshape(mask_shape)
mask = mask.abs().sum([1,2])
(mask!=0).sum() / mask.numel()
tensor(0.9536)
可以发现绝大部分的sparaseWeight都不是0,不满足论文中所属的稀疏率

如果我的理解有错误,非常感谢作者可以进行纠正

zyxxmu commented 2 years ago

稀疏率是在训练过程中逐渐满足的,您可以使用我们提供的模型文件验证,或者提供您的详细训练参数/日志。

JingyangXiang commented 2 years ago

这份代码是用以加载您在Google Drive中提供的ResNet50的pth验证得到的,以我个人的理解是,文中是N:M的稀疏度应该是以若干个连续的KxK的卷积核为基本单位,但是在您所提供的ckpt中,得到的所谓的sparaseWeight并不能满足这种,相反的,超过95%的KxK的卷积核中都存在非0元素,您可以加载您提供的pth使用这份代码得到结果

如果是以单一的权重为基本单元,那就是我的理解错误,非常抱歉~

zyxxmu commented 2 years ago

N:M稀疏是在input channel维度的连续M个单一权重保留N个权重,论文3.1章节有详细介绍,如果还有问题欢迎继续提issue交流。