PaddleSlim
PaddleSlim copied to clipboard
Paddle2.1 动态图Embedding层怎么量化,急!
需要对Transformer进行量化,可以量化中间层,但是不知道怎么量化Embedding层,Embedding层和其他层一起量化应该怎么配置
请问是量化训练吗?Embedding层量化的话应该只需要量化weight就可以了,我看下需要怎么配置。。
是量化训练,量化整个transformer模型包括embedding部分
好的,可能需要修改paddle代码,我稍微晚点发出来具体的修改~
- 按照这样在quant layer中添加embedding的quant: https://github.com/ceci3/Paddle/commit/15641f9cf925f8358d0a764319f9b93432fcb6c1
- 配置量化参数的时候把 Embedding添加到 quantizable_layer_type中,https://github.com/PaddlePaddle/PaddleSlim/tree/develop/demo/dygraph/quant#%E9%85%8D%E7%BD%AE%E9%87%8F%E5%8C%96%E5%8F%82%E6%95%B0 这样就可以对embedding进行量化了。
好的,我试下,这个提交在正式分支上有发布吗?或者有没有发布计划
暂时还没有在正式分支上发布,我们需要内部讨论下发布计划
请教一下,按照上面的修改在quant_layers.py添加QuantizedEmbedding的实现,但是哪里调用这个module呢?是不是还需要修改调用解析的地方
上面那个问题我在./fluid/contrib/slim/quantization/imperative/qat.py +375中找到答案了,感谢!
按照这样在quant layer中添加embedding的quant: ceci3/Paddle@15641f9 应该修改成下面这样吧: `class QuantizedEmbedding(layers.Layer): def init(self, layer, weight_bits=8, activation_bits=8, moving_rate=0.9, weight_quantize_type='abs_max', activation_quantize_type='abs_max', weight_pre_layer=None, act_pre_layer=None, weight_quant_layer=None, act_quant_layer=None): super(QuantizedEmbedding, self).init() ### For Embedding self.weight = getattr(layer, 'weight') self._name = getattr(layer, '_name') ### For FakeQuant self._embedding_quant_axis = 1 self._fake_quant_weight = _get_fake_quant_type( weight_quantize_type, name=self.weight.name, moving_rate=moving_rate, quant_bits=weight_bits, dtype=self._dtype, quant_on_weight=True, channel_num=self.weight.shape[self._embedding_quant_axis], quant_axis=self._embedding_quant_axis) self._padding_idx = getattr(layer, '_padding_idx') self._sparse = getattr(layer, '_sparse')
def forward(self, input):
quant_weight = self._fake_quant_weight(self.weight)
return F.embedding(
x=input,
weight=quant_weight,
padding_idx=self._padding_idx,
sparse=self._sparse,
name=self._name)
`