# ms_pt_compare **Repository Path**: wangchao285/ms_pt_compare ## Basic Information - **Project Name**: ms_pt_compare - **Description**: 功能:比较pytorch与mindspore网络模型间的精度 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 2 - **Created**: 2022-10-09 - **Last Updated**: 2023-02-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MS-PT模块级精度测试工具 #### 介绍 功能:在pytorch网络迁移到MindSpore网络的过程中,经常会出现API使用映射错误、模型结构重写出错等问题, 导致MindSpore的网络模型较原模型出现精度差异。本工具通过模块化验证的手段,用户提取两个框架下网络的部分 区间模块代码,作为待验证的两个子网。工具侧会自动根据用户要求,构造相同输入数据,分别针对两个子网进行推理, 并最终将网络的输出结果进行精度比对,便于用户快速定位精度问题 ### 环境准备 #### 软件依赖 1. 安装python3环境 2. 通过pip3安装环境依赖numpy、scikit-learn 3. pytorch cpu (实测1.11)通过pytorch官网安装 2. mindspore npu (实测1.8.1)通过mindspore官网安装 #### 硬件依赖 1. 已安装开发运行环境的昇腾AI设备 ### 获取 - 下载压缩包方式获取。 将 https://gitee.com/wangchao285/ms_pt_compare 仓中的脚本下载至服务器的任意目录。 例如存放路径为:$HOME/AscendProjects/ms_pt_compare - 命令行使用git命令方式获取。 在命令行中:$HOME/AscendProjects目录下执行以下命令下载代码。 **git clone https://gitee.com/wangchao285/ms_pt_compare.git** ### 使用方法 1. 进入ms_pt_compare目录, 执行python3 net_compare.py 【+所需参数】 ### 参数说明 | 参数名 | 描述 | 必选 | |----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----| | -ms,--mindspore_net | mindspore 模型推理脚本 | 是 | | -pt,--pytorch_net | pytorch 模型推理脚本 | 是 | | -i,--input_shape | 模型的输入shape集合,每个输入的shape以“,”分割,存在list中。例如一个输入shape为[1,2]表示为:[[1,2]] ;两个输入shape均为[1,2]表示为:[[1,2],[1,2]]。*注意:由于命令行的特输限制(空格代表此参数的结尾),input_shape的值不能带空格,否则会被命令识别为参数异常* | 是 | | -dtype,--input_dtype | 模型的输入dtype集合,每个输入的shape以“,”分割。例如一个输入dtype为int16表示为:-dtype="int16" ;两个输入dtype均为int16表示为:-dtype="int16,int16"。*注意:如果配置此参数,需要与input_shape个数一致。默认不配置此参数,则所有输入默认按float32类型生成。* | 否 | | -o,--output_path | 输出文件路径,默认为当前路径 | 否 | | -init, --init_mode | 网络初始化模式,取值为"ones"或"random","ones"表示会把模块中的所有权重初始化为1,"random"表示会把模块中的所有权重初始化为任意一个随机数,默认为“random” | 否 | | -d,--device | 指定运行设备 [0,255],可选参数,默认0 | 否 | | -print_result | 是否打印模型输出的具体data,默认关闭,建议小shape输出打印 | 否 | #### 使用说明 1. 参数准备 - MindSpore模型推理脚本 - Pytorch模型推理脚本 ***注意:上述两个脚本有如下定义规则:具体可参照sample目录下的demo文件*** ***1:上述两个脚本需要定义网络类,类名需要固定为“TestNet”*** ***2:上述两个脚本的推理输出结果需要存入list返回。举例:一个输出return [out1]; 两个输出 return [out1, out2]*** 2. 执行命令 1.示例 ``` python3 net_compare.py -ms sample/encoder_ms.py -pt sample/encoder_pt.py -i [[1,1,28,28]] -o /home/HwHiAiUser/compare_out/ ``` **注意**:如果有多个输入,需要用**英文逗号**隔开,用[ ]包裹,其他参数详情可使用--help查询,详细内容请查看参数说明 ### 输出结果说明 #### 1. 输出目录树 ``` output-path/timestamp ├── data │   ├── input(两个网络共用的输入数据) │   │   ├── input_1.npy (第一个输入) │   │   └── input_2.npy (第二个输入) │   ├── output(两个网络输出数据) │   │   ├── MindSpore (MindSpore输出数据) │   │   │  ├── output_0.npy (只有一个输出) │   │   ├── Pytorch (Pytorch输出数据) │   │   │  ├── output_0.npy (只有一个输出) ├── result_2021211214657.csv └── compare_result.csv (比对结果数据) ``` #### 2. compare_result.csv | Pytorch data | Pytorch output shape | MindSpore data | MindSpore output shape | cosine similarity | similarity | variance | max absolute error | max relative error | mean absolute error | mean relative error | mean square error | relative euclidean distance | |-------------------------------------------------------------------| ---- | ---- | ---- |-------------------| ---- | ---- | ---- | ---- | ---- |---------------------| ---- | ---- | | /home/compare_out/20221014105326/data/output/PyTorch/output_0.npy | (1, 10) | /home/compare_out/20221014105326/data/output/MindSpore/output.npy | (1, 10) | 1 |0.999779427831526|0.35999998|2718|0.00022073463|2716.2|0.00022058841|2716.2|0.000220588423403286| 比对结果的常见参考点: 1. 优先关注余弦相似度(cosine similarity),通过计算两个向量的夹角余弦值来评估他们的相似度。余弦值的范围在[-1,1]之间,值越趋近于1, 代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。通常情况下,我们认为约接近于1的两个子网,精度约相近。 2. 部分算子可以关注相似度(similarity),计算两个向量均值差的占比,通常情况下,我们认为约接近于1的两个子网,精度约相近。 3. 有些特殊算子对方差及最大误差等有要求的话,可以继续参考其他精度指标。 #### 3. 运行日志 ``` 2022-10-17 17:19:17(1002)-[INFO]=================================Start init Net================================= #初始化网络常量值 2022-10-17 17:19:17(1002)-[INFO]Init net condtant is: 0.13104220729353422 2022-10-17 17:19:17(1002)-[INFO]==========================Start check and parse input shape=========================== #检查命令行参数,确定input个数 2022-10-17 17:19:17(1002)-[INFO]one of input data shape is [1, 1, 28, 28] 2022-10-17 17:19:17(1002)-[INFO]After check input_shape, this compare task have 1 input 2022-10-17 17:19:17(1002)-[INFO]==============================Start generate input data============================== #生成输出数据 2022-10-17 17:19:17(1002)-[INFO]Generate input data at: /home/wangchao/compare_out/20221017171917/data/input/input_1.npy 2022-10-17 17:19:17(1002)-[INFO]=================================Start inference net================================= #执行推理 2022-10-17 17:19:17(1002)-[INFO]The PyTorch net inference completed cost 0.03270125389099121 seconds. #Pytorch耗时 2022-10-17 17:19:17(1002)-[INFO]The MindSpore net inference completed cost 2.384185791015625e-07 seconds. #MindSpore耗时 2022-10-17 17:19:17(1002)-[INFO]The MindSpore net inference have 1 result. 2022-10-17 17:19:17(1002)-[INFO]The PyTorch net inference have 1 result. 2022-10-17 17:19:17(1002)-[INFO]=========================Start Check Out Data 0 =========================== #比对前的结果检查 2022-10-17 17:19:17(1002)-[INFO]shape of result_pt: (1, 10) 2022-10-17 17:19:17(1002)-[INFO]shape of result_ms: (1, 10) 2022-10-17 17:19:17(1002)-[INFO]================= ======Start Save Out Data 0 ========================= #分别存储两个模型的输出 2022-10-17 17:19:17(1002)-[INFO]Saved MindSpore output data at: /home/wangchao/compare_out/20221017171917/data/output/MindSpore/output_0.npy 2022-10-17 17:19:17(1002)-[INFO]Saved PyTorch output data at: /home/wangchao/compare_out/20221017171917/data/output/PyTorch/output_0.npy 2022-10-17 17:19:17(1002)-[INFO]=========================Start Compare Out Data 0 =========================== #针对输出data0,进行比对 -similarity-: 1.0 #余弦相似度 -cosine similarity-: 0.9999999999999998 #相似度 -variance-: 0.0 #方差 -max_absolute_error- 0.0 #最大绝对误差 -max_relative_error- 0.0 #最大相对误差 -mean_absolute_error- 0.0 #平均绝对误差 -mean_relative_error- 0.0 #平均相对误差 -mean_square_error- 0.0 #均方差 -relative_euclidean_distance- 0.0 #相对欧氏距离 2022-10-17 17:19:17(1002)-[INFO]=================================Start save result================================= #落盘比对结果,便于后续查看 2022-10-17 17:19:17(1002)-[INFO]The comparison result have been written to /home/wangchao/compare_out/20221017171917/compare_result.csv 2022-10-17 17:19:17(1002)-[INFO]The command was completed and took 0.38480639457702637 seconds. ```