一种基于异构芯片的深度学习模型计算误差定位方法转让专利

申请号 : CN202310487619.9

文献号 : CN116187399B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 钟阳宇杜凯刘忠新邓强温研

申请人 : 北京麟卓信息科技有限公司

摘要 :

本发明公开了一种基于异构芯片的深度学习模型计算误差定位方法,通过对深度学习模型进行解析获取所有结构层及算子的输出,在此基础上确定深度学习模型的标准输出,再获取深度学习模型由目标芯片优化后的实测输出,通过计算实测输出与标准输出的相似度定位并修正计算误差,有效提高了由异构芯片优化产生的深度学习模型计算误差的定位及修正效率。

权利要求 :

1.一种基于异构芯片的深度学习模型计算误差定位方法,其特征在于,包括以下步骤:

步骤1、加载深度学习模型,提取其中所有结构层名称和算子名称;确定深度学习模型的标准测试用例,采用已验证正确的深度学习模型执行标准测试用例并将执行后的结果作为标准输出,标准输出包括结构层的输出和算子的输出,其中结构层的输出为第一标准输出,算子的输出为第二标准输出;

步骤2、将待测芯片优化的深度学习模型作为待测深度学习模型,采用待测深度学习模型执行标准测试用例并将执行后的结果作为实测输出;若实测输出与标准输出相同则结束本流程,否则执行步骤3;

步骤3、再次采用待测深度学习模型执行标准测试用例获取所有结构层的输出和所有算子的输出,将所有结构层的输出作为第一实测输出、所有算子的输出作为第二实测输出;

令深度学习模型的起始结构层为当前轮首个结构层,令深度学习模型的结束结构层为当前轮末尾结构层,设定当前轮结构层的结构层编号为n,令n为所有结构层编号的中值;

步骤4、获取当前轮结构层对应的第一实测输出与第一标准输出,计算第一实测输出与第一标准输出的相似度,若相似度大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则令n为当前轮首个结构层与当前轮末尾结构层之间结构层编号的中值确定新的当前轮结构层,并以新的当前轮结构层作为新的当前轮首个结构层,再执行步骤4;

若相似度大于阈值A且当前轮首个结构层与当前轮末尾结构层之间不存在结构层,则根据当前轮结构层执行步骤8;

若相似度不大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则令n为当前轮首个结构层与当前轮末尾结构层之间结构层编号的中值确定新的当前轮末尾结构层,执行步骤4;若相似度不大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则根据当前轮结构层执行步骤5;

步骤5、获取当前轮结构层内所有算子的第二实测输出与第二标准输出,设定当前轮算子的算子编号为m,令m为当前轮结构层内所有算子编号的中值,令当前轮结构层内的起始算子为当前轮首个算子,令当前轮结构层内的结束算子为当前轮末尾算子;

步骤6、计算第二实测输出与第二标准输出的相似度,若相似度大于阈值A且当前轮首个算子与当前轮末尾算子之间存在算子,则令m为当前轮首个算子与当前轮末尾算子之间算子编号的中值确定新的当前轮算子,并以新的当前轮算子作为新的当前轮首个算子,再执行步骤6;若相似度大于阈值A且当前轮首个算子与当前轮末尾算子之间不存在算子,则根据当前轮算子执行步骤8;

若相似度不大于阈值A且当前轮首个算子与当前轮末尾算子之间存在算子,则令m为当前轮首个算子与当前轮末尾算子之间算子编号的中值确定新的当前轮末尾算子,执行步骤

6;若相似度不大于阈值A且当前轮首个算子与当前轮末尾算子之间不存在算子,则根据当前轮算子执行步骤7;

步骤7、修正当前轮算子后以当前轮算子所在的结构层作为深度学习模型的起始结构层,执行步骤3;

步骤8、深度学习模型中所有结构层均执行正确,结束本流程。

2.根据权利要求1所述的深度学习模型计算误差定位方法,其特征在于,所述步骤1中所述结构层名称由结构层标识和结构层编号组成,所述算子名称由结构层名称、算子类型及算子编号组成。

3.根据权利要求1所述的深度学习模型计算误差定位方法,其特征在于,所述步骤3中还包括:以1作为间隔数间隔获取结构层及算子的输入和输出数据。

4.根据权利要求3所述的深度学习模型计算误差定位方法,其特征在于,采用hook函数hook(Module,input_tensor,output_tensor)间隔获取结构层的输入和输出数据,Module为结构层名称,input_tensor为Module的输入数据,output_tensor为Module的输出数据。

5.根据权利要求1所述的深度学习模型计算误差定位方法,其特征在于,对于三维及三维以上的输出数据,将奇数维元素的乘积作为新输出数据的第一维,将偶数维元素的乘积作为新输出数据的第二维,得到新输出数据。

6. 根据权利要求1所述的深度学习模型计算误差定位方法,其特征在于,对于二维输出数据tensor(width,height),其中,width和height分别为两个维度的元素数量,分别按照先从左至右再从上到下的顺序从tensor(width,height)的五个区域提取数据,并将提取到的数据顺序存入中间tensor(num,num)中,其中,num为两个维度的元素数量,对于中间tensor(num,num)中未填满的位置则设置为0,再将中间tensor(num, num)展平为一维输出数据;五个区域是指tensor(width,height)矩阵中的四个顶角区域及中央区域。

7.根据权利要求6所述的深度学习模型计算误差定位方法,其特征在于,对于所述二维输出数据tensor(width,height)将其两个维度的元素数量相乘,即length=width*height,若length大于或等于阈值L,则每隔int(length/L)个元素按照先从左至右再从上到下的顺序提取tensor(width,height)中的数据,并将数据存入一维输出数据;若length小于阈值L,则将tensor(width,height)展平为一维输出数据。

8.根据权利要求1所述的深度学习模型计算误差定位方法,其特征在于,所述相似度为两个输出之间的欧几里得距离。

9. 根据权利要求1所述的深度学习模型计算误差定位方法,其特征在于,所述阈值A采用以下公式计算:

Threshold(x)=sum(xi)/(n*100) i=1,2,...,n

其中,x为标准输出,i为x中元素的编号,n为x的长度。

说明书 :

一种基于异构芯片的深度学习模型计算误差定位方法

技术领域

[0001] 本发明属于计算机软件开发技术领域,具体涉及一种基于异构芯片的深度学习模型计算误差定位方法。

背景技术

[0002] 目前计算机视觉的应用越来越广泛,许多应用场景都需要在异构芯片上实现不同的深度学习模型,并对海量未知数据进行预测。算子是深度学习模型的最小执行单元,其性能极大地影响着模型整体的执行效率。为了提高计算性能,高性能的算子需要针对异构芯片的不同特点进行优化以充分利用异构芯片的计算能力,但是在基于芯片的优化过程中,由于调用的芯片已有算子本身存在错误或采用已有算子优化模型时出现计算错误,以及不同芯片间存在的计算精度差异等原因,都可能会导致基于不同芯片优化的同一深度学习模型之间存在计算误差。因此,为了确保算子优化的正确性,往往需要对深度学习模型在芯片上的执行结果进行验证。
[0003] 然而,由于深度学习模型所具有的网络结构深、算子类型及数量众多、相关计算量大等特点,现有深度学习模型正确性验证的方式都存在人力和时间开销较大的问题。

发明内容

[0004] 有鉴于此,本发明提供了一种基于异构芯片的深度学习模型计算误差定位方法,实现了对由异构芯片优化产生的深度学习模型计算误差的定位及修正。
[0005] 本发明提供的一种基于异构芯片的深度学习模型计算误差定位方法,包括以下步骤:
[0006] 步骤1、加载深度学习模型,提取其中所有结构层名称和算子名称;确定深度学习模型的标准测试用例,采用已验证正确的深度学习模型执行标准测试用例并将执行后的结果作为标准输出,标准输出包括结构层的输出和算子的输出,其中结构层的输出为第一标准输出,算子的输出为第二标准输出;
[0007] 步骤2、将待测芯片优化的深度学习模型作为待测深度学习模型,采用待测深度学习模型执行标准测试用例并将执行后的结果作为实测输出;若实测输出与标准输出相同则结束本流程,否则执行步骤3;
[0008] 步骤3、再次采用待测深度学习模型执行标准测试用例获取所有结构层的输出和所有算子的输出,将所有结构层的输出作为第一实测输出、所有算子的输出作为第二实测输出;令深度学习模型的起始结构层为当前轮首个结构层,令深度学习模型的结束结构层为当前轮末尾结构层,设定当前轮结构层的结构层编号为n,令n为所有结构层编号的中值;
[0009] 步骤4、获取当前轮结构层对应的第一实测输出与第一标准输出,计算第一实测输出与第一标准输出的相似度,若相似度大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则令n为当前轮首个结构层与当前轮末尾结构层之间结构层编号的中值确定新的当前轮结构层,并以新的当前轮结构层作为新的当前轮首个结构层,再执行步骤4;若相似度大于阈值A且当前轮首个结构层与当前轮末尾结构层之间不存在结构层,则根据当前轮结构层执行步骤8;
[0010] 若相似度不大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则令n为当前轮首个结构层与当前轮末尾结构层之间结构层编号的中值确定新的当前轮末尾结构层,执行步骤4;若相似度不大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则根据当前轮结构层执行步骤5;
[0011] 步骤5、获取当前轮结构层内所有算子的第二实测输出与第二标准输出,设定当前轮算子的算子编号为m,令m为当前轮结构层内所有算子编号的中值,令当前轮结构层内的起始算子为当前轮首个算子,令当前轮结构层内的结束算子为当前轮末尾算子;
[0012] 步骤6、计算第二实测输出与第二标准输出的相似度,若相似度大于阈值A且当前轮首个算子与当前轮末尾算子之间存在算子,则令m为当前轮首个算子与当前轮末尾算子之间算子编号的中值确定新的当前轮算子,并以新的当前轮算子作为新的当前轮首个算子,再执行步骤6;若相似度大于阈值A且当前轮首个算子与当前轮末尾算子之间不存在算子,则根据当前轮算子执行步骤8;
[0013] 若相似度不大于阈值A且当前轮首个算子与当前轮末尾算子之间存在算子,则令m为当前轮首个算子与当前轮末尾算子之间算子编号的中值确定新的当前轮末尾算子,执行步骤6;若相似度不大于阈值A且当前轮首个算子与当前轮末尾算子之间不存在算子,则根据当前轮算子执行步骤7;
[0014] 步骤7、修正当前轮算子后以当前轮算子所在的结构层作为深度学习模型的起始结构层,执行步骤3;
[0015] 步骤8、深度学习模型中所有结构层均执行正确,结束本流程。
[0016] 进一步地,所述步骤1中所述结构层名称由结构层标识和结构层编号组成,所述算子名称由结构层名称、算子类型及算子编号组成。
[0017] 进一步地,所述步骤3中还包括:以1作为间隔数间隔获取结构层及算子的输入和输出数据。
[0018] 进一步地,采用hook函数hook(Module,input_tensor,output_tensor)间隔获取结构层的输入和输出数据,Module为结构层名称,input_tensor为Module的输入数据,output_tensor为Module的输出数据。
[0019] 进一步地,对于三维及三维以上的输出数据,将奇数维元素的乘积作为新输出数据的第一维,将偶数维元素的乘积作为新输出数据的第二维,得到新输出数据。
[0020] 进一步地,对于二维输出数据tensor(width,height),其中,width和height分别为两个维度的元素数量,分别按照先从左至右再从上到下的顺序从tensor(width,height)的五个区域提取数据,并将提取到的数据顺序存入中间tensor(num,num)中,其中,num为两个维度的元素数量,对于中间tensor(num,num)中未填满的位置则设置为0,再将中间tensor(num,num)展平为一维输出数据;五个区域是指tensor(width,height)矩阵中的四个顶角区域及中央区域。
[0021] 进一步地,对于所述二维输出数据tensor(width,height)将其两个维度的元素数量相乘,即length=width*height,若length大于或等于阈值L,则每隔int(length/L)个元素按照先从左至右再从上到下的顺序提取tensor(width,height)中的数据,并将数据存入一维输出数据;若length小于阈值L,则将tensor(width,height)展平为一维输出数据。
[0022] 进一步地,所述相似度为两个输出之间的欧几里得距离。
[0023] 进一步地,所述阈值A采用以下公式计算:
[0024] Threshold(x)=sum(xi)/(n*100) i=1,2,...,n
[0025] 其中,x为标准输出,i为x中元素的编号,n为x的长度。
[0026] 本发明通过对深度学习模型进行解析获取所有结构层及算子的输出,在此基础上确定深度学习模型的标准输出,再获取深度学习模型由目标芯片优化后的实测输出,通过计算实测输出与标准输出的相似度定位并修正计算误差,有效提高了由异构芯片优化产生的深度学习模型计算误差的定位及修正效率。

具体实施方式

[0027] 下面列举实施例,对本发明进行详细描述。
[0028] 本发明提供的一种基于异构芯片的深度学习模型计算误差定位方法,具体包括以下步骤:
[0029] 步骤1、加载深度学习模型,提取其中所有的结构层名称和算子名称;确定深度学习模型的标准测试用例,采用已验证正确的深度学习模型执行标准测试用例,并将执行后的结果作为标准输出,标准输出包括结构层的输出和算子的输出,其中结构层的输出为第一标准输出,算子的输出为第二标准输出。
[0030] 具体来说,本发明中深度学习模型可采用现有的COCO数据集中YOLOv5s目标识别模型相关的测试用例进行验证。
[0031] 深度学习模型可以划分为多个相互连接的结构层,每个结构层由一个或多个不同类型的算子组成,结构层名称由结构层标识和结构层编号组成,例如,model.0,model为结构层标识,0为结构层编号;算子名称由结构层名称、算子类型及算子编号组成,例如,model.0.A.0,A为算子类型,0为算子编号。为了进一步简化算子的命名规则,算子编号设定为结构层内同类型算子的顺序编号。
[0032] 步骤2、基于待测芯片优化深度学习模型得到待测深度学习模型,采用待测深度学习模型执行标准测试用例,并将执行后模型的输出作为实测输出;若实测输出与标准输出相同,则说明待测深度学习模型执行正确,即待测芯片对深度学习模型的优化过程未产生误差,结束本流程;否则说明待测深度学习模型执行异常,即待测芯片对深度学习模型的优化过程产生误差,执行步骤3。
[0033] 步骤3、再次采用待测深度学习模型执行标准测试用例,获取待测深度学习模型中所有结构层的输出和所有算子的输出,将所有结构层的输出作为第一实测输出、所有算子的输出作为第二实测输出;令深度学习模型的起始结构层为当前轮首个结构层,令深度学习模型的结束结构层为当前轮末尾结构层,设定当前轮结构层的结构层编号为n,令n为所有结构层编号的中值。
[0034] 此外,也可以1作为间隔数间隔获取结构层及算子的输入和输出数据,实现获取所有结构层和算子的输出数据,例如,采用hook函数hook(Module,input_tensor,output_tensor)间隔获取结构层的输入和输出数据,Module为结构层名称,input_tensor为Module的输入数据,output_tensor为Module的输出数据。
[0035] 步骤4、获取当前轮结构层对应的第一实测输出与第一标准输出,计算第一实测输出与第一标准输出的相似度,若相似度大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则令n为当前轮首个结构层与当前轮末尾结构层之间结构层编号的中值确定新的当前轮结构层,并以新的当前轮结构层作为新的当前轮首个结构层,再执行步骤4;若相似度大于阈值A且当前轮首个结构层与当前轮末尾结构层之间不存在结构层,则根据当前轮结构层执行步骤8;
[0036] 若相似度不大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则令n为当前轮首个结构层与当前轮末尾结构层之间结构层编号的中值确定新的当前轮末尾结构层,执行步骤4;若相似度不大于阈值A且当前轮首个结构层与当前轮末尾结构层之间存在结构层,则根据当前轮结构层执行步骤5。
[0037] 具体来说,如果当前轮结构层的第一实测输出与第一标准输出的相似度大于阈值A,则说明当前轮结构层以及当前轮结构层之前的所有结构层均未出现误差;否则说明当前轮结构层、当前轮结构层之前及当前轮结构层之后的所有结构层均存在出现误差的可能。
[0038] 步骤5、获取当前轮结构层内所有算子的第二实测输出与第二标准输出,设定当前轮算子的算子编号为m,令m为当前轮结构层内所有算子编号的中值,令当前轮结构层内的起始算子为当前轮首个算子,令当前轮结构层内的结束算子为当前轮末尾算子。
[0039] 步骤6、计算第二实测输出与第二标准输出的相似度,若相似度大于阈值A且当前轮首个算子与当前轮末尾算子之间存在算子,则令m为当前轮首个算子与当前轮末尾算子之间算子编号的中值确定新的当前轮算子,并以新的当前轮算子作为新的当前轮首个算子,再执行步骤6;若相似度大于阈值A且当前轮首个算子与当前轮末尾算子之间不存在算子,则根据当前轮算子执行步骤8;
[0040] 若相似度不大于阈值A且当前轮首个算子与当前轮末尾算子之间存在算子,则令m为当前轮首个算子与当前轮末尾算子之间算子编号的中值确定新的当前轮末尾算子,执行步骤6;若相似度不大于阈值A且当前轮首个算子与当前轮末尾算子之间不存在算子,则根据当前轮算子执行步骤7。
[0041] 步骤7、当前轮算子即为存在误差的算子,修正当前轮算子后以当前轮算子所在的结构层作为深度学习模型的起始结构层,执行步骤3。
[0042] 步骤8、深度学习模型中所有结构层均执行正确,结束本流程。
[0043] 实际中,深度学习模型中结构层或算子的输出Tensor可能为一维、二维、三维、四维或五维等,一维向量的元素个数通常在几十到几百万之间,二维矩阵的元素个数通常在几百到几千万之间,三维张量的元素个数通常在几千到几百万之间,四维张量的元素个数通常在几千到几百万之间,五维甚至更高维度的张量的元素个数一般在几十到几百万之间。因此,维度越高相似度的计算越复杂,对系统资源的占用率也越高,计算效率会降低。
[0044] 因此,为了进一步提高实测输出与标准输出之间相似度计算的效率,本发明采用以下方式将输出Tensor的维度降至一维:
[0045] 对于三维及三维以上的Tensor,将奇数维元素的乘积作为新Tensor的第一维,将偶数维元素的乘积作为新Tensor的第二维,由此得到二维的新Tensor;
[0046] 对于二维Tensor,表示为tensor(width,height),width和height分别为两个维度的元素数量,分别按照先从左至右再从上到下的顺序从tensor(width,height)的五个区域提取数据,并将提取到的数据顺序存入中间tensor(num,num)中,其中,num为两个维度的元素数量,五个区域是指tensor(width, height)矩阵中的四个顶角区域及中央区域,对于tensor(num,num)中未填满的位置则设置为0;再将中间tensor(num,num)展平为一维Tensor。
[0047] 此外,对于二维Tensor,tensor(width,height),还可以将二维Tensor的两个维度的元素数量相乘,如length=width*height,width和height分别为两个维度的元素数量,若length大于或等于阈值L,则每隔int(length/L)个元素按照先从左至右再从上到下的顺序提取tensor(width,height)中的数据,并将数据存入新的一维Tensor中;若length小于阈值L,则直接将Tensor展平为一个新的一维Tensor。例如,阈值L的取值为10000。
[0048] 本发明采用两个输出Tensor之间的欧几里得距离作为相似度。
[0049] 具体来说,采用以下公式计算相似度:
[0050] Similiar(x,y)=sqrt(sum (xi‑yi)^2), i=1,2,…,n
[0051] 其中,x和y分别为标准输出和实测输出的Tensor,i为x和y中元素的编号,n为x和y的长度。
[0052] 采用以下公式计算相似性的阈值A:
[0053] Threshold(x)=sum(xi)/(n*100) i=1,2,...,n
[0054] 通过计算标准输出元素的平均值,并将其精确到值的后两位,以保证精度偏差在值的1%内。
[0055] 例如:x=[0.36,0.09],y=[0.41,0.3],则Similiar(x,y)= sqrt((0.41‑0.36)^2+(0.3‑0.09)^2)≈0.2148,Threshold(x)=0.00225,Similiar(x,y)> Threshold(x),因此相似度小。
[0056] 综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。