鲲鹏920环境,yolov8n模型int8量化速度比默认的fp16慢了50%
expectation | 诉求 | 期待する
- speed
- precision
model | 模型 | モデル
- yolov8n_int8_aciq.bin yolov8n_int8_aciq.param
detail | 详细描述 | 詳細な説明
问题1:在2并发时,fp16平均耗时100ms,int8 (opt.use_int8_inference = true) 平均耗时158ms。 问题2:aciq量化精度有损失,检测结果是对;kl量化检测结果是错误的。 问题3:哪些模型适合int8量化?
关联问题: yolov5s模型经过int8量化,无明显加速效果 yolov5转ncnn量化后,fp16和fp32相差不大,int8反而慢了一倍多
版本:ncnn-20240410
yolov8 激活层使用 relu / leakyrelu 会变快些,swish 无法量化,退回fp16计算导致更大的 overhead
ReLU(x)=max(0,x) LeakyReLU(x)=max(αx,x) 其中,x 是激活函数的输入,α 是一个小的正常数,通常很小(例如 0.01)。这个函数的特点是当 x 为负时,它不会直接输出零,而是输出一个很小的正比例的值 αx。这样,即使在输入为负的情况下,梯度也不会完全消失,从而帮助维持和传递一些有用的梯度信息。 Swish函数 f(x)=x⋅σ(βx) 其中,x 是输入,σ 是Sigmoid函数,而 β 是一个可训练的参数或者固定的常数。在最初的论文中,β 被设置为1或者作为一个可学习的参数。在多个基准测试中,Swish展示了与ReLU相比在深度学习模型中的性能优势。尤其是在深层网络和复杂任务中,Swish往往能够提供更好的准确率和收敛速度。
对于使用 ReLU 和 Leaky ReLU 激活函数的模型,INT8 量化是一个有效的方法来减少模型的大小和提高推理速度,同时保持可接受的精度损失。 Swish激活函数的Sigmoid函数和乘法操作都可能在低精度下引入额外的误差。
通过配置改激活层,需重新训练 Change activation function of YOLOv8
激活层使用 leakyrelu ,重新训练 在2并发时,fp16平均耗时100ms,int8 (opt.use_int8_inference = true) 平均耗时125ms。
测试下来,鲲鹏920环境 int8量化对yolov8没效果,有副作用。