AI变小了,却认不出数字
一句话总结
转换成功,执行整数内核,通过不同的检查确认分类质量。
为什么需要这个?
减少了数字读取器的文件大小,但正确率大幅下降。转换命令成功,文件扩展名也是onnx。以什么为依据拒绝部署呢?文件较小的事实,存在整数加权的事实,实际运行了整数内核的事实,正确读取数字的事实,都是不同的证据。
怎么行动
量子化是将错误近似为狭义整数表示的转换。利用scale和zero point将整数和实数对应起来,可能会产生信息丢失。静态量子化通过提前执行校正输入来确定活性值范围。QDQ图中包含QuantizeLinear和DequantizeLinear。在这个过程中,将活性值和权重转换为signed INT8,权重使用每个通道的范围。详细的API在ONNX Runtime官方指南 请参考。
我们的Picture的FP32模型是一个具有三个线性层的小型MLP。创建一个读取360张校正图像的CalibrationDataReader,并将每个样本传递为名为pixels的1×64 float32输入。转换器可以在输入ONNX旁边创建用于形状推理的临时文件。因此,无需直接转换受保护的/opt/lab/quantization/fp32.onnx,而是将其复制到自己的工作目录中为source.onnx使用。无需解封以写入原始文件。
提供的bad-calibration.onnx是所有像素为0的校正输入制成的失败比较集。在与正常校正候选相同的评价资料上运行后,看看差异。哪些数字被误认为是其他数字,在混淆矩阵中会显示出来。本教材的行是实际类别,列是预测类别。如果实际1读成了2,就会增加confusion[1][2]。即使翻转轴,对角线和总准确度也一样,所以只要验证准确度就会错过错误。
在最后一次输出中,由于四舍五入,应用了QDQ的模型的概率和可能不完全等于1。在提供正常转换中观察到的和的最小值约为0.992。检查器允许这个转换的1/255间隔和10个类别的四舍五入误差,但拒绝负数、非实数值和偏差很大的和。允许误差并不意味着任何输出都能通过。
在现场相遇的样子
假设您参加了分类器的部署审查。如果同事说“创建了24KB的文件”,您不必立即反对。相反,您可以问在哪些输入下产生了哪些性能。文件大小是存储空间的证据。加权数据类型是表达方式的证据。配置文件是运行路径的证据。从评估材料中获得的指标是有限范围的质量证据。不将这四个问题合并为一个项目是本课题的核心。
混淆序列可以解释准确度数字。如果实际正确答案是[1, 2, 1, 0, 9],预测是[2, 2, 1, 0, 8],那么正确的样本有三个。准确度是3/5,错误的两个样本是1→2和9→8。如果代码记录为2→1和8→9,即使比例正确,报告的说明也是倒着的。这就是将总结函数分离到整个模型中,以简短的列表进行测试的原因。
确认准确度差异时,比较标准也必须固定。如果标准FP32本身收到错误输入,候选和两者都会产生较低的准确度,差异会变小。“损失小”的标准就可以了。检查器首先确认提供的FP32是否在评估集中达到0.95以上,然后再查看与候选的差异。预处理单独测试、确认标准模型、候选比较负责不同类型的错误。
请考虑一下为什么要实际运行不良校正模型。总是将报告中的reject_bad设置为true的程序只是模仿拒绝的样子。重新计算并比较三个模型的count、correct、accuracy、混淆矩阵,才能知道不良候选人是如何根据什么依据拒绝的。因为比较组的模型大小可能与正常候选人相似,所以不能用字节数作为质量指标。文件较小的不是这个事件中的犯人,而是单独的观察。
如果CPU种类不同,在相同字节的INT8模型中,接近边界的样本的预测也会有所不同。开发时不会背诵一台机器的正确答案列表,并应用于所有运行环境。在同一运行环境中,同时评估标准和候选,并检查差异。但是,也不是一直允许出现差异的事实。超过设置的损失限度就是失败。在后面的小测验中阅读错误方向,在最后一个模块的综合练习中直接制作报告。
下次实习要做的事情
在4–6阶段直接创建candidate.onnx,运行三个模型的推理。metrics.py的summarize(predictions, labels)返回count·correct·accuracy·10×10 confusion。准确度是0–1的比例。与FP32相比,损失限度1%p是比例0.01,这与相对减少1%不同。如果FP32是0.96,候选0.95就是界限。在regression.json中留下实际结果和不良模型拒绝判断。