定位芯片运行错误的方法及装置与流程

文档序号:18985525发布日期:2019-10-29 04:20阅读:281来源:国知局
定位芯片运行错误的方法及装置与流程

本发明涉及神经网络开发技术领域,具体涉及一种自动快速定位芯片运行错误的方法及装置。



背景技术:

人工神经网络是由大量的、简单的处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,它反映了人脑功能的许多基本特征,是一个高度复杂的非线性动力学习系统。神经网络具有大规模并行、分布式存储和处理、自组织、自适应和自学能力,特别适合处理需要同时考虑许多因素和条件的、不精确和模糊的信息处理问题。神经网络在系统辨别、模式识别、智能控制等领域有着广泛而吸引人的前景,是目前最为火热的研究方向-深度学习的基础。

但是,开发神经网络时,芯片解析神经网络模型的参数时出现错误往往导致芯片运行错误,此时,开发者需要逐一检查神经网络模型的所有解析参数,以确定错误层及错误参数的位置,进而消除错误,工作量大,花费开发者大量时间。



技术实现要素:

有鉴于此,本发明实施例提供了一种定位芯片运行错误的方法及装置,能够高效率、高精度、自动化的定位芯片运行错误的原因,大大减小开发周期。

根据本发明实施例的第一方面,提供一种定位芯片运行错误的方法,包括:在开发板生成神经网络模型;通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,在第一程序运行第一测试模型对输入数据进行预测时,生成第一运行日志,通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,并且在第二程序运行第二测试模型对输入数据进行预测时,生成第二运行日志;根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误。

在本发明的一个实施例中,上述通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,包括:通过开发板上的芯片运行的第一程序解析第一测试模型,得到第一测试模型的参数,其中,上述通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,包括:通过利用开发板的环境运行的第二程序解析第二测试模型,得到第二测试模型的参数。

在本发明的一个实施例中,上述第一运行日志和第二运行日志分别包括第一测试模型和第二测试模型的每一层的运行结果,其中,上述根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误,包括:通过比较第一测试模型和第二测试模型的每一层的运行结果,定位第一测试模型的出错层。

在本发明的一个实施例中,上述第一运行日志和第二运行日志分别包括第一测试模型和第二测试模型的每一层的参数,其中,该定位芯片运行错误的方法还包括:通过比较第一测试模型和第二测试模型的出错层的参数,定位第一测试模型的出错层的出错参数。

在本发明的一个实施例中,上述第一运行日志和第二运行日志分别包括第一测试模型和第二测试模型的每一层的参数,其中,上述在开发板生成神经网络模型,包括:在开发板上将原始神经网络模型转换成神经网络模型,其中该定位芯片运行错误的方法还包括:在开发板上将原始神经网络模型转换成神经网络模型时,生成日志参数文件,该日志参数文件包括神经网络模型的每个层的参数;其中,上述根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误,包括:通过比较第一测试模型的出错层的参数与日志参数文件中与出错层对应的层的参数,定位第一测试模型的出错层的出错参数。

在本发明的一个实施例中,该定位芯片运行错误的方法还包括:通过比较第一测试模型的出错层的参数与日志参数文件中与出错层对应的层的参数,确定出错参数对应的正确参数。

在本发明的一个实施例中,上述参数包括神经网络模型的结构、权重、偏置和损失函数中的至少一种。

在本发明的一个实施例中,上述开发板包括神经网络处理器npu开发板,芯片包括深度学习芯片,第一程序包括嵌入式的软件开发工具包sdk可执行程序,第二程序包括在嵌入式环境下运行的仿真程序。

根据本发明实施例的第二方面,提供一种定位芯片运行错误的装置,包括:第一生成模块,用于在开发板生成神经网络模型;第二生成模块,用于通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,在第一程序运行第一测试模型对输入数据进行预测时,生成第一运行日志,通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,并且在第二程序运行第二测试模型对输入数据进行预测时,生成第二运行日志;以及定位模块,用于根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误。

根据本发明实施例的第三方面,提供一种计算机可读存储介质,其上存储有计算机可执行指令,可执行指令被处理器执行时实现如上所述的定位芯片运行错误的方法。

根据本发明实施例提供的技术方案,分别通过开发板上的芯片运行的第一程序和利用开发板的环境运行的第二程序加载神经网络模型,运行该神经网络模型分别得到第一运行日志和第二运行日志,并根据第一运行日志和第二运行日志的比较结果定位芯片运行的模型的错误,可以高效率、高精度、自动化的确定芯片运行错误的原因,不必逐一检查芯片运行的神经网络模型的所有参数,便于开发者节约大量时间,减小开发周期。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1所示为本发明一实施例提供的定位芯片运行错误的方法的流程示意图。

图2所示为本发明另一实施例提供的定位芯片运行错误的方法的流程示意图。

图3所示为本发明一实施例提供的定位芯片运行错误的装置的框图。

图4所示为本发明另一实施例提供的定位芯片运行错误的装置的框图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1所示为本发明一实施例提供的定位芯片运行错误的方法的流程示意图。例如,该方法可以由开发板执行。如图1所示,该方法包括如下内容。

s110:在开发板生成神经网络模型。

应当理解,神经网络模型可以是由开发人员直接在开发板生成的神经网络模型,也可以是在开发板上对在其它设备上生成的原始神经网络模型进行模型转换生成的神经网络模型,本发明对此不作限定。例如,可以将在gpu上训练的caffe模型转换成开发板上的npu芯片的神经网络模型。另外,本发明对神经网络模型的具体类型不作限定,例如,神经网络模型可以是卷积神经网络模型,也可以是循环神经网络模型、深度神经网络模型等。神经网络模型可以包括输入层、中间层和输出层等,例如,卷积神经网络模型可以包括输入层、卷积层、池化层、全连接层等。

s120:通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,在第一程序运行第一测试模型对输入数据进行预测时,生成第一运行日志,通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,并且在第二程序运行第二测试模型对输入数据进行预测时,生成第二运行日志。

应当理解,第一测试模型可以是第一程序运行的神经网络模型,第二测试模型可以是第二程序运行的同一神经网络模型,本发明对此不作限定。开发板包括arm开发板、fpga(现场可编程门阵列)开发板、dsp(数字信号处理器)开发板或npu开发板等,本发明对此不作限定。

在开发板生成神经网络模型后,可以通过开发板上的芯片解析该神经网络模型的参数并运行,不可避免地,解析参数的过程中出现的参数错误等问题会导致芯片运行错误。为了能够高效率、高精度地确定运行错误出现的位置,本发明同时采用运行正确的利用开发板环境运行的第二程序解析该神经网络模型的参数并运行,将其运行日志与第一程序的运行日志作对比,并根据两者的比较结果定位运行错误。例如第一程序可以是嵌入式的sdk可执行程序,第二程序可以是在嵌入式环境下运行的仿真程序,本发明对第一程序、第二程序不作具体限定。

上述通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,包括:通过开发板上的芯片运行的第一程序解析第一测试模型,得到第一测试模型的参数,其中,上述通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,包括:通过利用开发板的环境运行的第二程序解析第二测试模型,得到第二测试模型的参数。

具体地,第一程序解析第一测试模型后得到该第一测试模型的参数,并根据该参数,通过创建寄存器运行第一测试模型,同理,第二程序解析第二测试模型后得到该第二测试模型的参数,并根据该参数,通过创建寄存器运行第二测试模型。应当理解,参数可以包括神经网络模型的结构、权重、偏置和/或损失函数等,本发明对此不作限定。

具体地,第一程序和第二程序分别加载神经网络模型后,分别运行该神经网络模型,即对输入数据进行预测,并输出运行结果。在运行神经网络模型过程中,第一程序和第二程序分别生成运行日志,运行日志可以包括神经网络模型每一层的输入数据、参数和运行结果等,本发明对运行日志的具体内容不做限定。

s130:根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误。

第一测试模型的错误可以是解析神经网络模型时出错导致的出错层、出错参数等,本发明对此不作限定。

在本发明的一个实施例中,第一运行日志和第二运行日志可以分别包括第一测试模型和第二测试模型的每一层的运行结果,通过比较第一测试模型和第二测试模型的每一层的运行结果,可以定位第一测试模型的出错层。

具体地,当第一运行日志与第二运行日志记录的神经网络模型的某一层的运行结果相同时,可判断该层解析参数正确,没有运行错误;当运行结果不同时,可判断该层解析参数错误,存在运行错误。例如,当第一测试模型和第二测试模型的卷积层的输出结果相同时,可判断卷积层未出错,当卷积层的输出结果不同时,可判断卷积层为出错层。通过该方法,在检测运行错误的过程中,不必检查模型的所有参数,只需比较运行结果,便可以快速定位出错层,节省了大量时间。应当理解,当芯片运行的第一测试模型运行到卷积层时出现运行错误,无法继续运行时,也可以判断卷积层为出错层,本发明对此不作限定。

在本发明的另一个实施例中,第一运行日志和第二运行日志可以分别包括第一测试模型和第二测试模型的每一层的参数,通过比较第一测试模型和第二测试模型的出错层的参数,可以定位第一测试模型的出错层的出错参数。

例如,根据第一测试模型和第二测试模型的卷积层的输出结果不同,已知卷积层为出错层,此时,只需比较卷积层的各个参数的参数值,例如权重等参数值,当某个参数的参数值不同时,便可定位出该参数为出错参数,进而便于开发者将其更改为正确参数值,消除错误参数。通过该方法,只需比较出错层的参数,避免了检查芯片运行的神经网络模型的所有参数,大大提高了定位出错问题的效率,为开发者节省了大量时间,缩短了开发周期。

根据本发明实施例提供的技术方案,分别通过开发板上的芯片运行的第一程序和利用开发板的环境运行的第二程序分别加载神经网络模型,运行该神经网络模型分别得到第一运行日志和第二运行日志,并根据第一运行日志和第二运行日志的比较结果定位芯片运行的模型的的错误,可以高效率、高精度、自动化的确定芯片运行错误的位置,不必逐一检查芯片运行的神经网络模型的所有参数,便于开发者节约大量时间,减小开发周期。

在本发明的另一个实施例中,上述在开发板生成神经网络模型,包括:在开发板上将原始神经网络模型转换成神经网络模型,其中该定位芯片运行错误的方法还包括:在开发板上将原始神经网络模型转换成神经网络模型时,生成日志参数文件,该日志参数文件包括神经网络模型的每个层的参数;其中,上述根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误,包括:通过比较第一测试模型的出错层的参数与日志参数文件中与出错层对应的层的参数,定位第一测试模型的出错层的出错参数。

具体地,在开发板上将原始神经网络模型进行模型转换,生成能够在该开发板上运行的神经网络模型,在模型转换过程中,生成日志参数文件,该日志参数文件可以包括原始神经网络模型的每个层的参数,也可以包括转换后的神经网络模型的每个层的参数,即,生成的神经网络模型的正确原始参数,本发明对此不作限定。原始神经模型可以是caffe模型,本发明对此不作限定。例如,可以将在gpu上训练的caffe模型转换成开发板上的npu芯片的神经网络模型。

在根据运行结果确定出错层后,可以将第一测试模型的出错层的参数与日志参数文件中对应层的参数进行比较,与日志参数文件中的参数不同的参数即为错误参数。例如,卷积神经网络的卷积层为出错层,将第一测试模型的卷积层的参数与日志参数文件中的卷积层的正确原始参数作比较,当第一测试模型的卷积层的某个参数与日志文件中的卷积层的对应的参数不同时,便可确定第一测试模型的卷积层中的该参数为错误参数。

在本发明的另一个实施例中,该定位芯片运行错误错误的方法还包括:通过比较第一测试模型的出错层的参数与日志参数文件中与出错层对应的层的参数,确定出错参数对应的正确参数。

具体地,通过与日志参数文件中对应层的正确原始参数相比,可确定出错层的错误参数对应的正确参数,进而消除芯片运行的神经网络模型的错误参数。

图2所示为本发明另一实施例提供的定位芯片运行错误的方法的流程示意图。图2的方法为图1的方法的例子,在此适当省略详细的描述。该方法可以由集成了深度学习芯片的嵌入式npu开发板执行。npu是以神经网络算法和结构为核心的并行处理器。其具有学习、联想、记忆和模式识别的物理结构,核心运算是向量乘法,善于处理实时并行大数据,并行大数据的处理效率是同等功耗下传统cpu的百倍乃至更高。如图2所示,该方法包括如下内容。

s210:在npu开发板上将在gpu上训练的caffe神经网络模型转换成npu神经网络模型(npu模型),并生成日志参数文件。

具体地,将caffe神经网络模型进行模型转换,生成能够在npu开发板上的npu芯片上运行的npu神经网络模型,并在模型转换的过程中,生成日志参数文件,该日志参数文件包括npu神经网络模型的每一层的参数。

通过npu芯片运行的sdk库(socsdk)中的嵌入式的sdk可执行程序执行步骤s221-s261。

s221:加载npu模型,得到第一测试模型。

s231:解析第一测试模型。

具体地,解析第一测试模型,得到该第一测试模型每一层的参数。

s241:创建寄存器。

根据第一测试模型每一层的参数,并通过创建寄存器运行第一测试模型。

s251:获取输入数据并预测。

具体地,运行第一测试模型对输入数据进行预测。

s261:获取第一运行日志并保存。

具体地,在运行第一预测模型的过程中,生成并保存其运行日志。

同理,通过能在npu开发板嵌入式环境下运行的仿真软件库(simulationlibrary)的仿真软件执行步骤s222-s262。

s222:加载npu模型,得到第二测试模型。

s232:解析第二测试模型。

s242:创建寄存器。

s252:获取输入数据并预测。

s262:获取第二运行日志并保存。

s270:比较第一运行日志和第二运行日志的每一层的运行结果是否相同。

当芯片运行得到的第一运行日志与仿真程序得到的第二运行日志的每一层的运行结果相同时,确定芯片运行无错误,当第一运行日志与第二运行日志的运行结果出现不同时,执行步骤s280。

s280:根据第一运行日志与第二运行日志的每一层的运行结果不同,定位芯片运行的第一测试模型的出错层。

s290:比较第一运行日志的出错层的参数与日志参数文件的出错层的参数。

s2100:定位芯片运行的第一测试模型模型的出错层的出错参数。

具体地,当第一运行日志的出错层的某一个参数与日志参数文件的出错层的对应的正确参数不同时,可确定该参数为出错参数。

根据本发明实施例提供的技术方案,分别通过开发板上的芯片运行的第一程序和利用开发板的环境运行的第二程序分别加载神经网络模型,运行该神经网络模型分别得到第一运行日志和第二运行日志,通过比较第一运行日志和第二运行日志的某一层的运行结果不同,可定位芯片运行的神经网络模型的出错层,另外,通过比较第一运行日志的出错层的参数与日志参数文件的出错层的参数,可定位芯片运行的神经网络模型的出错参数。通过该方法可以高效率、高精度、自动化的确定导致芯片运行的神经网络模型运行错误的出错层和出错参数,不必逐一检查芯片运行的神经网络模型的所有参数,便于开发者节约大量时间,减小开发周期。

上述所有可选技术方案,可以采用任意结合形成本发明的可选实施例,在此不再一一赘述。

下述为本发明装置实施例,可以用于执行本发明方法实施例。对于本发明装置实施例中未披露的细节,请参照本发明方法实施例。

图3所示为本发明一实施例提供的定位芯片运行错误的装置的框图。如图3所示,该定位芯片运行错误的装置300包括:

第一生成模块310,用于在开发板生成神经网络模型。

第二生成模块320,用于通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,在第一程序运行第一测试模型对输入数据进行预测时,生成第一运行日志,通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,并且在第二程序运行第二测试模型对输入数据进行预测时,生成第二运行日志。

定位模块330,用于根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误。

根据本发明实施例提供的技术方案,分别通过开发板上的芯片运行的第一程序和利用开发板的环境运行的第二程序分别加载神经网络模型,运行该神经网络模型分别得到第一运行日志和第二运行日志,并根据第一运行日志和第二运行日志的比较结果定位芯片运行的模型的错误。通过两个程序运行同一神经网络模型并采用对比运行日志的方法可以高效率、高精度、自动化的确定芯片运行的神经网络模型出现运行错误的位置,不必逐一检查该神经网络模型的所有参数,便于开发者节约大量时间,减小开发周期。

在本发明的另一个实施例中,该定位芯片运行错误的装置还包括:解析模块340,用于通过开发板上的芯片运行的第一程序解析第一测试模型,得到第一测试模型的参数;以及通过利用开发板的环境运行的第二程序解析第二测试模型,得到第二测试模型的参数。

在本发明的另一个实施例中,第一运行日志和第二运行日志分别包括第一测试模型和第二测试模型的每一层的运行结果,其中,定位模块330还用于通过比较第一测试模型和第二测试模型的每一层的运行结果,定位第一测试模型的出错层。

在本发明的另一个实施例中,第一运行日志和第二运行日志分别包括第一测试模型和第二测试模型的每一层的参数,其中,定位模块330还用于通过比较第一测试模型和第二测试模型的出错层的参数,定位第一测试模型的出错层的出错参数。

在本发明的另一个实施例中,第一运行日志和第二运行日志分别包括第一测试模型和第二测试模型的每一层的参数,其中,第一生成模块310还用于在开发板上将原始神经网络模型转换成神经网络模型;以及在开发板上将原始神经网络模型转换成神经网络模型时,生成日志参数文件,该日志参数文件包括神经网络模型的每个层的参数;定位模块330还用于通过比较第一测试模型的出错层的参数与日志参数文件中与出错层对应的层的参数,定位第一测试模型的出错层的出错参数。

在本发明的另一个实施例中,该定位芯片运行错误的装置还包括:确定模块350,用于通过比较第一测试模型的出错层的参数与日志参数文件中与出错层对应的层的参数,确定出错参数对应的正确参数。

在本发明的另一个实施例中,上述参数包括神经网络模型的结构、权重、偏置、损失函数中的至少一种。

在本发明的另一个实施例中,开发板包括npu开发板,芯片包括深度学习芯片,第一程序包括嵌入式的sdk可执行程序,第二程序包括在嵌入式环境下运行的仿真程序。

上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

图4所示为本发明另一实施例提供的定位芯片运行错误的装置400的框图。

参照图4,装置400包括处理组件410,其进一步包括一个或多个处理器,以及由存储器420所代表的存储器资源,用于存储可由处理组件410的执行的指令,例如应用程序。存储器420中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件410被配置为执行指令,以执行上述定位芯片运行错误的方法。

装置400还可以包括一个电源组件被配置为执行装置400的电源管理,一个有线或无线网络接口被配置为将装置400连接到网络,和一个输入输出(i/o)接口。装置400可以操作基于存储在存储器420的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或类似。

一种非临时性计算机可读存储介质,当存储介质中的指令由上述装置400的处理器执行时,使得上述装置400能够执行一种定位芯片运行错误的方法,包括:在开发板生成神经网络模型;通过开发板上的芯片运行的第一程序加载神经网络模型,得到第一测试模型,在第一程序运行第一测试模型对输入数据进行预测时,生成第一运行日志,通过利用开发板的环境运行的第二程序加载神经网络模型,得到第二测试模型,并且在第二程序运行第二测试模型对输入数据进行预测时,生成第二运行日志;根据第一运行日志和第二运行日志,定位芯片运行的第一测试模型的错误。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序校验码的介质。

另外,还需要说明的是,本案中各技术特征的组合方式并不限本案权利要求中所记载的组合方式或是具体实施例所记载的组合方式,本案所记载的所有技术特征可以以任何方式进行自由组合或结合,除非相互之间产生矛盾。

需要注意的是,以上列举的仅为本发明的具体实施例,显然本发明不限于以上实施例,随之有着许多的类似变化。本领域的技术人员如果从本发明公开的内容直接导出或联想到的所有变形,均应属于本发明的保护范围。

应当理解,本发明实施例中提到的第一、第二等限定词,仅仅为了更清楚地描述本发明实施例的技术方案使用,并不能用以限制本发明的保护范围。

以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1