Jzz24 / pytorch_quantization

A pytorch implementation of dorefa quantization
MIT License
110 stars 11 forks source link

关于量化精度的请教 #1

Open jingdonglin opened 4 years ago

jingdonglin commented 4 years ago

大佬你好,请问做8bit量化的时候,转成量化模型quant_model的时候,为什么权值是小数吖,比如是0.4256之类的,为什不是0-255之间的整数呢?还是说我哪儿操作步骤有问题 恳请大佬教做人,刚入门量化的小白,感激不尽!

Jzz24 commented 4 years ago

客气啦。我理解的量化分为以下步骤, 浮点模型--> 浮点模型clip --> 量化quantize(此处为0-255整数或-128-127)--> 解量化dequantize(此处为量化后的浮点数,但最多只有2^n种浮点表征,即有限浮点数集合)。你所描述的quant_model是dequantize后的模型,所以是浮点。train用dequantize的浮点来模拟inference时的整数,具体你可以读一下这两篇论文。 Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference Quantizing deep convolutional networks for efficient inference: A whitepaper

jingdonglin commented 4 years ago

大佬你好,最近趁着假期在学习大佬的代码收获颇丰,已向周围小伙伴推荐了大佬的代码。但是关于量化过程中我有一点想不明白,训练得到quant_model后(也就是大佬的模型)。 :1、我在模型部署阶段,是需要把里面的卷积权值小数乘以255变成整数吗?如果是的话,卷积后的特征图也也是整数,但时当特征图经过BN层时,BN层的值全是浮点小数怎么和特征图进行定点运算呢?即前向推断过程中,即Conv->BN->激活函数,这一样过程,数据是咋流动的呢? 2、BN层融合这儿,量化训练后,如果把卷积层和BN层融合,变为新的卷积层后,那么这个卷积层的参数便不再是定点小数了,乘以尺度因子后,它也变不回int型的数吖?

yolunghiu commented 3 years ago

大佬你好,最近趁着假期在学习大佬的代码收获颇丰,已向周围小伙伴推荐了大佬的代码。但是关于量化过程中我有一点想不明白,训练得到quant_model后(也就是大佬的模型)。 :1、我在模型部署阶段,是需要把里面的卷积权值小数乘以255变成整数吗?如果是的话,卷积后的特征图也也是整数,但时当特征图经过BN层时,BN层的值全是浮点小数怎么和特征图进行定点运算呢?即前向推断过程中,即Conv->BN->激活函数,这一样过程,数据是咋流动的呢? 2、BN层融合这儿,量化训练后,如果把卷积层和BN层融合,变为新的卷积层后,那么这个卷积层的参数便不再是定点小数了,乘以尺度因子后,它也变不回int型的数吖?

@jingdonglin @Jzz24 大哥, 你这问题解决了吗?

Jzz24 commented 3 years ago

大佬你好,最近趁着假期在学习大佬的代码收获颇丰,已向周围小伙伴推荐了大佬的代码。但是关于量化过程中我有一点想不明白,训练得到quant_model后(也就是大佬的模型)。 :1、我在模型部署阶段,是需要把里面的卷积权值小数乘以255变成整数吗?如果是的话,卷积后的特征图也也是整数,但时当特征图经过BN层时,BN层的值全是浮点小数怎么和特征图进行定点运算呢?即前向推断过程中,即Conv->BN->激活函数,这一样过程,数据是咋流动的呢? 2、BN层融合这儿,量化训练后,如果把卷积层和BN层融合,变为新的卷积层后,那么这个卷积层的参数便不再是定点小数了,乘以尺度因子后,它也变不回int型的数吖?

@jingdonglin @Jzz24 大哥, 你这问题解决了吗?

整个量化的流程可以参照google的量化白皮书,现在的量化框架都是遵循那一套流程。首先拿到fp模型,然后融合bn,然后进行量化。无论离线量化还是finetune量化,都是先融合bn,再量化,我这个git的代码bn处理的不规范

yolunghiu commented 3 years ago

大佬你好,最近趁着假期在学习大佬的代码收获颇丰,已向周围小伙伴推荐了大佬的代码。但是关于量化过程中我有一点想不明白,训练得到quant_model后(也就是大佬的模型)。 :1、我在模型部署阶段,是需要把里面的卷积权值小数乘以255变成整数吗?如果是的话,卷积后的特征图也也是整数,但时当特征图经过BN层时,BN层的值全是浮点小数怎么和特征图进行定点运算呢?即前向推断过程中,即Conv->BN->激活函数,这一样过程,数据是咋流动的呢? 2、BN层融合这儿,量化训练后,如果把卷积层和BN层融合,变为新的卷积层后,那么这个卷积层的参数便不再是定点小数了,乘以尺度因子后,它也变不回int型的数吖?

@jingdonglin @Jzz24 大哥, 你这问题解决了吗?

整个量化的流程可以参照google的量化白皮书,现在的量化框架都是遵循那一套流程。首先拿到fp模型,然后融合bn,然后进行量化。无论离线量化还是finetune量化,都是先融合bn,再量化,我这个git的代码bn处理的不规范

dorefa的量化方法按您说的流程量化我理解是这样: 先正常训练个fp32模型 -->merge bn --> 使用dorefa微调训练不带bn的量化模型. 您是这个意思吗? google白皮书我可能看的不仔细, 这种方式我再试试.