基于torch图模式(torchair)整网算子精度比对
简介
torchair图模式整网算子精度比对通过采集torchair图模式下模型中间算子的输入、输出数据,对比两次推理结果是否一致,从而判断模型在不同算子上的精度是否一致。torch图模式(torchair)整网算子精度比对主要支持GE数据与FX数据的比对以及GE开关融合数据的比对。
基本概念 参见《基于torch图模式(torchair)推理场景》。
使用前准备
环境准备与通用约束
参见《基于torch图模式(torchair)推理场景》中的环境准备与约束。
本章节额外约束
- 两次GE dump或两次FX dump间,请指定不同的dump数据保存路径,否则会导致数据混乱,无法区分的问题,从而影响数据比对和分析。
GE融合模式(默认) dump数据与FX dump数据精度比对
dump数据采集方式、接口参数、示例以及结果目录结构参见《基于torch图模式(torchair)推理场景》中的GE融合模式dump数据与FX模式dump数据。
compare精度比对
执行 msprobe compare --target_path <GE_dump_data_path> --golden_path <FX_dump_data_path> [--output_path <output_path>] --mode torchair,在指定的 output_path 路径下输出比对结果csv文件,若不使用 --output_path 参数,则默认保存在当前目录下。
# 使用Ascend Extension for PyTorch 7.1.0及以上版本
msprobe compare --target_path ${dump_path}/msprobe_ge_dump --golden_path ${dump_path}/msprobe_fx_dump --mode torchair
# 使用Ascend Extension for PyTorch 7.1.0版本
msprobe compare --target_path ${dump_path}/msprobe_ge_dump --golden_path ${dump_path}/msprobe_fx_dump/data_dump --mode torchair
# 使用Ascend Extension for PyTorch 7.1.0以下版本
msprobe compare --target_path ${dump_path}/msprobe_ge_dump --golden_path data_dump --mode torchair
注意:使用Ascend Extension for PyTorch 7.1.0以下版本时,FX模式dump结果件中的token id目录的目录名比实际token id大1,因此在比对时会将token id目录名减1,作为真实token id。
GE融合模式(默认)dump数据与GE关闭融合模式dump数据精度比对
GE融合与关闭融合的dump采集方法、示例及目录结构参见GE融合模式dump数据与GE模式关闭融合dump数据。
compare精度比对
执行 msprobe compare --target_path <GE_dump_data_path> --golden_path <fusion_off_GE_dump_data_path> [--output_path <output_path>] --mode torchair,在指定的 output_path 路径下输出比对结果csv文件,若不使用 --output_path 参数,则默认保存在当前目录下。
msprobe compare --target_path ${dump_path in GE dump}/msprobe_ge_dump --golden_path ${dump_path in fusion off GE dump}/msprobe_ge_dump --mode torchair
结果查看
精度比对结果的字段含义、判定标准与颜色标记等信息,请参见附录。
附录
将dump数据转化为指定信息以压缩数据量
说明:本节仅针对特定用户场景使用,若不涉及该场景请忽略。
dump过程中生成的数据量可能占用大量磁盘空间,可以在dump过程中启用后台进程,将完整的数据提取为指定的信息。以下参考脚本将数据转化为最大最小值,并删除原数据。
#!/bin/env python3
import os
import time
import argparse
surfix = "_min_max" # Converted data save surfix
# Define how single data is converted
def convert_data_to_info(data):
return [data.min(), data.max()]
def convert(data_path):
import numpy as np
from components.utils.acc_cmp import parse_torchair_dump_data
npz_surfix, npy_surfix = "{}.npz".format(surfix), "{}.npy".format(surfix)
for cur_path, dirs, files in os.walk(data_path):
for file in files:
if file.endswith(npy_surfix): # already converted FX data
continue
cur = os.path.join(cur_path, file)
if file.endswith(".npy"): # FX saved npy data
file_name = os.path.splitext(cur)[0]
np.save(file_name + surfix, convert_data_to_info(np.load(cur)))
os.remove(cur)
print("Converted: {} -> {}{}".format(cur, file_name, npy_surfix))
elif not file.endswith(npz_surfix) and not file.endswith(".txt") and not file.endswith(".swp"):
inputs, outputs = parse_torchair_dump_data(cur)
inputs = [convert_data_to_info(ii) for ii in inputs]
outputs = [convert_data_to_info(ii) for ii in outputs]
np.savez(cur + npz_surfix, inputs=inputs, outputs=outputs)
os.remove(cur)
print("Converted: {} -> {}{}".format(cur, cur, npz_surfix))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("data_path", help="GE or FX data dump path")
args = parser.parse_args()
while True:
convert(args.data_path)
time.sleep(0.5)
print("Waiting...")
在dump过程中后台执行该脚本,将dump数据转化为info数据,以减少内存占用。
# 将msprobe_ge_dump下的GE dump数据转化为info
python3 convert.py msprobe_ge_dump
# 使用Ascend Extension for PyTorch 7.1.0及以上版本时,将msprobe_fx_dump下的FX dump数据转化为info
python3 convert.py msprobe_fx_dump
# 使用Ascend Extension for PyTorch 7.1.0以下版本时,将data_dump下的FX dump数据转化为info
python3 convert.py data_dump
比对结果文件格式
torchair场景下的精度比对结果以CSV文件格式输出,包含以下主要列:
基本信息
- API Name: 算子或API名称。
- Stack Info: 堆栈信息,用于定位代码位置。
- Data Name: 数据名称,格式为 [NPU真实数据名,Bench真实数据名]。
真实数据模式指标
当dump数据模式为真实数据时,包含以下指标:
| 指标名称 | 含义 | 正常范围 |
|---|---|---|
| Cosine | 余弦相似度,衡量两个向量的方向相似性 | 0.99-1.0 |
| EucDist | 欧氏距离,衡量两个向量的绝对距离 | 越小越好 |
| MaxAbsErr | 最大绝对误差 | 越小越好 |
| MaxRelativeErr | 最大相对误差 | 一般 < 0.01 |
| One Thousandth Err Ratio | 相对误差小于千分之一的比例 | 越高越好 |
| Five Thousandth Err Ratio | 相对误差小于千分之五的比例 | 越高越好 |
| Requires_grad Consistent | 计算梯度是否一致 | True |
统计数据模式指标
当dump数据模式为统计数据时,包含以下指标:
| 指标名称 | 含义 |
|---|---|
| Max diff | 最大值差异 |
| Min diff | 最小值差异 |
| Mean diff | 平均值差异 |
| L2norm diff | L2范数差异 |
| MaxRelativeErr | 最大相对误差 |
| MinRelativeErr | 最小相对误差 |
| MeanRelativeErr | 平均相对误差 |
| NormRelativeErr | 范数相对误差 |
MD5模式指标
当dump数据模式为MD5时,包含以下指标:
| 指标名称 | 含义 |
|---|---|
| NPU MD5 | NPU数据CRC-32值 |
| BENCH MD5 | 标杆数据CRC-32值 |
结果判定信息
- Result: 比对结果(PASS/FAIL)
- Accuracy Reached or Not: 计算精度是否达标(Yes/No)
- Err_message: 错误信息提示
结果判定标准
真实数据模式判定
- PASS: Cosine ≥ 0.99且MaxRelativeErr < 0.01
- FAIL: Cosine < 0.99或MaxRelativeErr ≥ 0.01
统计数据模式判定
- PASS: 各项差异指标在可接受范围内
- FAIL: 存在显著差异
MD5模式判定
- PASS: NPU MD5 == BENCH MD5
- FAIL: NPU MD5 != BENCH MD5
颜色标记说明
当开启高亮颜色标记功能时:
- 红色: 表示精度异常,需要重点关注。
- 黄色: 表示精度可疑,需要进一步分析。
- 绿色: 表示精度正常。
特殊值处理
- N/A: 表示无法计算该比对指标值。
- NaN: 表示计算结果为非数字,通常由于数据中存在NaN值。
- inf: 表示计算结果为无穷大,通常由于除零操作。
当dump数据中存在0或NaN时,比对结果中最大相对误差可能出现inf或NaN的情况,属于正常现象。
结果文件位置
比对结果CSV文件默认保存在当前目录,或通过 --output_path参数指定的目录中。