更新时间:2024-06-17 GMT+08:00
分享

精度校验

转换模型后执行推理前,可以使用benchmark工具对MindSpore Lite云侧推理模型进行基准测试。它不仅可以对MindSpore Lite云侧推理模型前向推理执行耗时进行定量分析(性能),还可以通过指定模型输出进行可对比的误差分析(精度)。

精度测试

benchmark工具用于精度验证,主要工作原理是:固定模型的输入,通过benchmark工具进行推理,并将推理得到的输出与标杆数据进行相似度度量(余弦相似度和平均相对误差),得到模型转换后的精度偏差信息。使用benchmark进行精度比对的基本流程如下:

  1. 将模型输入保存二进制文件。
    # 数据读取,预处理
    image = img_preprocess(image_path)
    image = np.array(image, dtype=np.float32)
    image = np.frombuffer(image.tobytes(), np.float32)
    # 保存网络输入为二进制文件
    image.tofile("input_data.bin")
  2. 将基准模型的输出保存到文本文件。

    本例中输出节点名称为output_node_name,输出节点的shape为“(1, 1000)”,因此一共有两维,对应的输出文件为“output_node_name 2 1 1000”,再加上输出的值即可。

    # 基于原始pth模型前向推理
    output = model_inference(input_data)
    # 保存网络输出节点名称、维度、shape及输出到本地文件
    with open("output_data.txt", "w") as f:
    f.write("output_node_name 2 1 1000\n")
    f.write(" ".join([str(i) for i in output]))
  3. 使用benchmark工具进行精度对比。
    #shell
    benchmark --modelFile=model.mindir --inputShapes=1,3,224,224 --inDataFile=input_data.bin --device=Ascend --benchmarkDataFile=output_data.txt --accuracyThreshold=5 --cosineDistanceThreshold=0.99

    其中,--accuracyThreshold=5表示平均绝对误差的容忍度最大为5%,--cosineDistanceThreshold =0.99表示余弦相似度至少为99%,--inputShapes可将模型放入到netron官网中查看。

    图1 benchmark对接结果输出示例图

自动精度对比

在某些场景下,比如算子溢出、误差累积等都可能会导致模型转换前后的模型存在误差,通过精度测试节的精度校验工具可以度量模型输出的精度误差的大小。当误差较大时,可以使用精度对比工具对比转换前后的ONNX模型和OM模型。其中OM模型在使用converter_lite工具进行模型转换时会同步生成。

# shell
cd /usr/local/Ascend/ascend-toolkit/latest/tools/msquickcmp
mkdir -p ~/work/output
python main.py -m ~/work/resnet50.onnx -om ~/work/resnet50.om -o ~/work/output --input-shape "input.1:1,3,224,224"

精度对比命令执行成功后,将会在指定的输出目录中生成result_{timestamp}.csv文件。

图2 精度对比生成文件

打开CSV文件后可以通过CosineSimilarity列和MaxAbsoluteError列排查第一个数值发生突变的行,这种情况一般表明:该突变行对应的Ascend算子和ONNX算子的执行结果存在较大差异,从而将排查重点锁定在对应的算子中。

图3 执行结果

如下图所示,最大绝对误差在295行发生了突变,且突变值约为65504,说明softmax算子输出的结果发生了溢出(FP16的最大值为65504),需要重点分析softmax算子为什么会执行出错,也可以联系华为工程师进行分析。

图4 最大绝对误差
分享:

    相关文档

    相关产品