可左右滑动选省市

一种用于处理神经网络的方法和系统实用新型专利

更新时间:2024-10-01
一种用于处理神经网络的方法和系统实用新型专利 专利申请类型:实用新型专利;
源自:英国高价值专利检索信息库;

专利名称:一种用于处理神经网络的方法和系统

专利类型:实用新型专利

专利申请号:CN202110020349.1

专利申请(专利权)人:阿里巴巴集团控股有限公司
权利人地址:英属开曼群岛大开曼资本大厦一座四层847号邮箱

专利发明(设计)人:任骜,张涛,王雨豪,谢源

专利摘要:本申请实施例提供了用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的方法和系统。该方法可以包括:将输入矩阵划分为多个向量,每个向量具有第二数量的元素;将多个向量分组为第一组的向量和第二组的向量;修剪第一组的向量和第二组的向量。

主权利要求:
1.一种用于处理神经网络的计算机实现方法,包括:将输入矩阵划分为多个向量,每个向量具有第二数量的元素;所述输入矩阵具有第一数量的元素;
将多个向量分组为第一组的向量和第二组的向量;
修剪所述第一组的向量和所述第二组的向量;
根据所述第一组的每个向量中的关键元素的位置,将所述第一组中的向量分配给多个桶;
使用第一组的剪枝向量和第二组的剪枝向量执行神经网络;
所述使用第一组的剪枝向量和第二组的剪枝向量执行神经网络包括:在对应于多个桶的并行线程中使用剪枝向量的第一部分执行神经网络;
其中,所述将多个向量分组为第一组的向量和第二组的向量包括:确定输入矩阵的剪枝比率;
基于所述第一数量、所述第二数量和所述剪枝比率确定所述第一组的向量和所述第二组的向量的参数;和基于确定的参数将多个向量分组为第一组的向量和第二组的向量,其中,所述参数包括所述第一组中的多个桶的桶大小、所述第一组中的空向量的数量、所述第二组的大小、以及保存在所述第二组中的非零元素的数量。
2.根据权利要求1所述的方法,其中根据第一组的每个向量中的关键元素的位置将第一组中的向量分配给多个桶还包括:在每个向量中的所述第二数量的元素中,通过元素的幅值来确定向量中第二数量的元素的顺序;以及在向量中,按照排列顺序,确定一个幅值最大的元素作为关键元素。
3.根据权利要求2所述的方法,其中所述多个桶具有相同的向量容量,并且根据所述第一组的每个向量中的关键元素的位置将第一组中的向量分配给所述多个桶,还包括:确定所述关键元素在目标向量中的位置;
确定多个桶中的第一桶,以及第一桶对应于所述关键元素的位置;和确定所述第一桶是否已满。
4.根据权利要求3所述的方法,还包括:
响应于第一桶没有满负荷填充,将目标向量分配给与该位置相对应的第一桶;或者响应于第一桶以满容量填充,将目标向量的关键元素设置为零,并且更新顺序以确定目标向量的新的关键元素。
5.根据权利要求1所述的方法,其中将第一组中的向量分配给多个桶还包括:在多个桶中的每一个都根据桶大小填充向量之后,将第一组中的未分配向量确定为空向量。
6.根据权利要求1所述的方法,其中修剪第一组的向量和第二组的向量还包括:对第一组的向量执行规则修剪;和
对第二组的向量执行不规则修剪。
7.根据权利要求1所述的方法,其中输入矩阵包括完全连接层的权重。
8.一种用于处理神经网络的计算设备,包括:存储一组指令的存储器;和
配置为执行一组指令以使设备:
将输入矩阵划分为多个向量,每个向量具有第二数量的元素;所述输入矩阵具有第一数量的元素;
将多个向量分组为第一组的向量和第二组的向量;
修剪第一组的向量和第二组的向量;
其中所述一组指令由一个或多个处理器进一步执行,以使所述设备:根据关键元素在所述第一组的每个向量中的位置,将所述第一组中的向量分配给多个桶;
其中所述一组指令由一个或多个处理器进一步执行,以使所述设备:使用所述第一组的剪枝向量和所述第二组的剪枝向量执行神经网络,其中,使用所述第一组的剪枝向量和所述第二组的剪枝向量来执行神经网络,还包括在对应于多个桶的并行线程中的剪枝向量的第一部分来执行神经网络;
其中在将多个向量分组为第一组的向量和第二组的向量时,一组指令由一个或多个处理器进一步执行,以使设备:确定输入矩阵的剪枝比率;
基于所述第一数量、所述第二数量和所述剪枝比率,确定第一组的向量和第二组的向量的参数;和基于确定的参数将多个向量分组为第一组的向量和第二组的向量,其中,所述参数包括所述第一组中的多个桶的桶大小、所述第一组中的空向量的数量、所述第二组的大小、以及保存在所述第二组中的非零元素的数量。
9.根据权利要求8所述的设备,其中在将第一组中的向量根据第一组的每个向量中关键元素的位置分配给多个桶时,一组指令由一个或多个处理器进一步执行,以使设备:在每个向量的第二数量的元素中,按元素的幅值的大小确定向量中第二数量的元素的顺序;和在向量中确定幅值最大的元素作为关键元素。
10.根据权利要求9所述的设备,其中所述多个桶具有相同的向量容量,并且在根据关键元素在所述第一组的每个向量中的位置将第一组中的向量分配给多个桶时,一组指令由一个或多个处理器进一步执行,以使设备:确定关键元素在目标向量中的位置;
确定多个桶中的第一桶,以及第一桶对应于关键元素的位置;和确定所述第一桶是否已满。
11.根据权利要求10所述的设备,其中在根据所述关键元素在所述第一组的每个向量中的位置将所述第一组中的向量分配给所述多个桶时,一组指令由一个或多个处理器进一步执行,以使设备:响应于第一桶没有满负荷,将目标向量分配给与该位置相对应的第一桶;或者响应于第一桶以满容量填充,将目标向量的关键元素设置为零,并且更新顺序以确定目标向量的新的关键元素。
12.根据权利要求8所述的设备,其中在将第一组中的向量分配给多个桶时,由一个或多个处理器进一步执行该组指令,以使该设备:在多个桶中的每一个都根据桶大小填满向量之后,将所述第一组中的未分配向量确定为空向量。
13.根据权利要求8所述的设备,其中在修剪第一组的向量和第二组的向量时,一组指令由一个或多个处理器进一步执行,以使设备:对第一组向量执行规则修剪;和
对第二组向量执行不规则修剪。
14.根据权利要求8所述的设备,其中输入矩阵包括完全连接层的权重。
15.一种非易失性计算机可读介质,其存储一组指令,该指令可由设备的一个或多个处理器执行,以使设备执行用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的方法,所述方法包括:将输入矩阵划分为多个向量,每个向量具有第二数量的元素;所述输入矩阵具有第一数量的元素;
将多个向量分组为第一组的向量和第二组的向量;和修剪第一组的向量和第二组的向量;
根据所述第一组的每个向量中的关键元素的位置,将所述第一组中的向量分配给多个桶;
使用第一组的剪枝向量和第二组的剪枝向量执行神经网络;
所述使用第一组的剪枝向量和第二组的剪枝向量执行神经网络包括:在对应于多个桶的并行线程中使用剪枝向量的第一部分执行神经网络;
其中,所述将多个向量分组为第一组的向量和第二组的向量包括:确定输入矩阵的剪枝比率;
基于所述第一数量、所述第二数量和所述剪枝比率确定所述第一组的向量和所述第二组的向量的参数;和基于确定的参数将多个向量分组为第一组的向量和第二组的向量,其中,所述参数包括所述第一组中的多个桶的桶大小、所述第一组中的空向量的数量、所述第二组的大小、以及保存在所述第二组中的非零元素的数量。 说明书 : 一种用于处理神经网络的方法和系统背景技术[0001] 随着机器学习程序的发展,为了提高模型精度,机器学习模型的维数显著增加。然而,在模型推理过程中,深度机器学习模型会消耗大量的存储资源、内存带宽、能量和计算资源。这些问题使得在移动和嵌入式设备上部署深度机器学习模型变得困难。发明内容[0002] 本申请的实施例提供了一种用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的计算机实现方法。该方法可以包括:将所述输入矩阵划分为多个向量,每个向量具有第二数量的元素;将所述多个向量分为第一组的向量和第二组的向量;并修剪所述第一组的向量和所述第二组的向量。[0003] 本申请的实施例还提供了一种用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的计算设备。该设备可以包括:存储一组指令的存储器;以及与该存储器耦合并配置为执行该组指令以使该设备:将输入矩阵划分为多个向量,每个向量具有第二数量的元素;将多个向量分组为第一组的向量和第二组的向量;并修剪所述第一组的向量和所述第二组的向量。[0004] 本申请的实施例还提供了一种非易失性计算机可读介质,该介质存储一组指令,该指令可由设备的一个或多个处理器执行,以使所述设备执行用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的方法。该方法可以包括:将输入矩阵划分为多个向量,每个向量具有第二数量的元素;将多个向量分组为第一组的向量和第二组的向量;并修剪所述第一组的向量和所述第二组的向量。[0005] 所公开的实施例的附加特征和优点一部分将在以下描述中阐述,以及一部分将从描述中显而易见,或者可以通过实施例的实践知晓。所公开的实施例的特征和优点可以通过权利要求中所述的元件和组合来实现和获得。[0006] 应当理解,前述一般描述和以下详细描述都是示例性的和解释性的,并不用于限制所公开的实施例;特此声明。附图说明[0007] 本申请的实施例和各个方面在以下详细描述和附图中予以说明。图中显示的各种特征不是按比例绘制的。[0008] 图1A示出了本申请的实施例提供的示例性神经网络加速器架构。[0009] 图1B示出了根据本申请的一些实施例披露的示例性内核架构。[0010] 图1C根据本申请的一些实施例示出了包含加速器架构100的示例性云系统的示意图。[0011] 图2A根据本申请的一些实施例示出了剪枝权重矩阵的示意图。[0012] 图2B根据本申请的一些实施例示出了将向量分配给多个桶的示意图。[0013] 图3是根据本申请的一些实施例的用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的示例性计算机实现方法的流程图。[0014] 图4是根据本申请的一些实施例的用于根据关键元素的位置将第一组的向量分配给桶的示例性方法的流程图。具体实施方式[0015] 现在将给出示例性实施例作为参考,其示例在附图中示出。以下描述请参考附图,除非另有说明,不同附图中的相同数字代表相同或相似的元素。在示例性实施例的以下描述中阐述的实现并不代表与本发明一致的所有实施方案。相反,它们只是与所附权利要求中所述的与本申请相关的方面一致的设备和方法的示例。[0016] 图1A根据本申请的实施例示出了示例性神经网络加速器架构。在本申请的环境中,神经网络加速器也可以称为机器学习加速器或深度学习加速器。在一些实施例中,加速器架构100可以称为神经网络处理单元(NPU)架构100。如图1A所示,加速器架构100可以包括多个内核102,命令处理器104,直接存储器访问(DMA)单元108,联合测试操作组(JTAG)/测试访问端(TAP)控制器110、外部设备接口112、总线114等。[0017] 可以理解,内核102可以基于通信数据执行算法运算。内核102可以包括一个或多个处理部件,该处理部件可以包括单指令、多数据(SIMD)体系结构,该体系结构包括一个或多个处理单元,所述处理单元被配置为基于从命令处理器104接收到的命令来执行一个或多个运算(例如,乘法、加法、乘法累加等)。为了执行所述通信数据的数据包的运算,内核102可以包括一个或多个处理部件,用于处理数据包中的信息。每个处理部件可以包括任意数量的处理单元。根据本申请的一些实施例,加速器架构100可能包括多个内核102,例如四个内核。在一些实施例中,多个内核102可以相互通信耦合。例如,多个内核102可以与单向环形总线连接,该总线支持大型神经网络模型的高效流水线。内核102的体系结构将参照图1B详细解释.[0018] 命令处理器104可以与主机单元120交互,并将相关命令和数据传递给相应的内核102。在一些实施例中,命令处理器104可以在内核模式驱动程序(KMD)的监督下与主机单元交互。在一些实施例中,命令处理器104可以修改每个内核102的相关命令,以便内核102可以尽可能地并行工作。修改后的命令可以存储在指令缓冲区中。在一些实施例中,命令处理器104可以配置为协调一个或多个内核102以实现并行执行。[0019] 直接存储器访问单元108可以帮助在主机存储器121和加速器架构100之间传输数据。例如,直接存储器访问单元108可以帮助将数据或指令从主机存储器121加载到内核102的本地存储器中。直接存储器访问单元108还可以帮助在多个加速器之间传输数据。DMA单元108可以允许片外设备访问片内和片外存储器,而不会导致主机CPU中断。此外,直接存储器访问单元108可以帮助在加速器架构100的组件之间传输数据。例如,直接存储器访问单元108可以帮助在多个内核102之间或每个内核内传输数据。因此,直接存储器访问单元108还可以生成存储器地址并启动存储器读写周期。DMA单元108还可以包含多个硬件寄存器,这些硬件寄存器可以由一个或多个处理器写入和读取,包括存储器地址寄存器,字节计数寄存器,一个或多个控制寄存器,以及其他类型的寄存器。这些寄存器可以指定以下组合:源、目的地、传输方向(从输入/输出(I/O)设备读取或者写入I/O设备)、传输单元的大小或一个传输周期中的字节数。应当理解,加速器架构100可以包括第二直接存储器访问单元,该单元可用于在其他加速器架构之间传输数据,以允许多个加速器架构直接通信,而不涉及所述主机CPU。[0020] JTAG/TAP控制器110可以指定实现串行通信接口的专用调试端口(例如JTAG接口),用于低开销地访问所述加速器,而无需直接外部访问系统地址和数据总线。JTAG/TAP控制器110还可以具有片上测试访问接口(例如,TAP接口),该接口执行协议以访问表示各部件的芯片逻辑电平和设备能力的一组测试寄存器。[0021] 外部设备接口112(例如PCIe接口)如果存在,充当(通常是)芯片间总线,提供加速器和其他设备之间的通信。[0022] 总线114(如I2C总线)包括芯片内总线和芯片间总线。芯片内总线按照系统架构的要求将所有内部组件相互连接。虽然并非所有组件都连接到每个其他组件,但所有组件都与需要与之通信的其他组件有某种连接。芯片间总线将加速器与其他设备连接起来,例如芯片外存储器或外部设备。例如,总线114可以提供跨内核的高速通信,并且还可以将内核102与其他单元连接,例如芯片外存储器或外部设备。通常,如果存在外部设备接口112(例如,芯片间总线),则总线114仅与芯片内总线有关,尽管在某些实现中,它仍可能涉及专用的总线间通信。[0023] 加速器架构100也可以与主机单元120通信。主机单元120可以是一个或多个处理单元(例如,X86中央处理单元)。如图1A所示,主机单元120可能与主机存储器121相关联。在一些实施例中,主机存储器121可能是与主机单元120相关联的一体式存储器或外部存储器。在一些实施例中,主机存储器121可能包括主机磁盘,该磁盘是配置为为主机单元120提供辅助存储器的外部存储器。主机存储器121可以是双倍速率同步动态随机存取存储器(例如DDRSDRAM)等。与集成在加速器芯片中的片上存储器相比,主机存储器121可以被配置为以较慢的访问速度存储大量数据,充当更高级别的缓存。存储在主机存储器121中的数据可以传输到加速器架构100,用于执行神经网络模型。[0024] 在一些实施例中,具有主机单元120和主机存储器121的主机系统可以包括编译器(未显示)。编译器是一种程序或计算机软件,它将以一种编程语言编写的计算机代码转换为加速器架构100的指令,以创建可执行程序。在机器学习应用程序中,编译器可以执行各种操作,例如预处理、词法分析、句法解析、语义分析、输入程序到中间表示的转换、神经网络的初始化、代码优化和代码生成或以上诸种的组合。例如,编译器可以编译神经网络以生成静态参数,例如神经元之间的连接和神经元的权重。[0025] 在一些实施例中,包括编译器在内的主机系统可以将一个或多个命令推送到加速器架构100。如上所述,这些命令可以由加速器架构100的命令处理器104进一步处理,临时存储在加速器架构100的指令缓冲区中,并分配给相应的一个或多个内核(例如图1A中的内核102)或处理部件。一些命令可以指示直接存储器访问单元(例如,图1A的直接存储器访问单元108)从主机存储器(例如,图1A的主机存储器121)加载指令和数据进入加速器架构100。然后,加载的指令可以分配给每个内核(例如,图1A的内核102)以分配相应的任务,并且一个或多个内核可以处理这些指令。[0026] 可以理解,内核102接收的前几个指令可以指示内核102将数据从主机存储器121加载/存储到内核的一个或多个本地存储器中(例如,图1B的本地存储器1032)。然后,每个内核102可以启动指令管道,这涉及从指令缓冲区获取指令(例如,通过序列发生器)、解码指令(例如,通过图1A的直接存储器访问单元108),生成本地内存地址(例如,对应于操作数),读取源数据,执行或加载/存储操作,然后回写结果。[0027] 根据一些实施例,加速器架构100还可以包括具有存储器块(例如,4块8GB第二代高带宽存储器(HBM2)的全局存储器(未示出)作为主存储器。在一些实施例中,全局存储器可以通过直接存储器访问单元108存储来自主机存储器121的指令和数据。然后,指令可以被分配到分配有相应任务的每个内核的指令缓冲区,并且所述内核可以相应地处理这些指令。[0028] 在一些实施例中,加速器架构100还可以包括存储器控制器(未示出),该存储器控制器被配置为管理在全局存储器中向特定存储器块(例如,HBM2)读出或者写入数据。例如,存储器控制器可以管理来自另一个加速器的内核的读/写数据(例如,来自直接存储器访问单元108或对应于另一个加速器的直接存储器访问单元)或来自内核102的读写数据(例如,来自内核102中的本地存储器)。值得注意的是,加速器架构100中可以提供多个存储器控制器。例如,对于全局存储器中的每个存储器块(例如HBM2),可以有一个存储器控制器。[0029] 内存控制器可以生成内存地址并启动内存读取或写入周期。存储器控制器可以包含多个硬件寄存器,这些寄存器可以由一个或多个处理器写入和读取。所述寄存器可以包括存储器地址寄存器、字节计数寄存器、一个或多个控制寄存器和其他类型的寄存器。这些寄存器可以指定以下某种组合:源、目的地、传输方向(从输入/输出(I/O)设备读取或者写入I/O设备)、传输单元的大小或一个传输周期中的字节数,或者其他存储器控制器的典型特征。[0030] 虽然在本发明的一些实施例中,图1A的加速器架构100可用于卷积神经网络(CNNs),但应了解,图1A的加速器架构100可用于各种神经网络,例如深层神经网络(DNNs)、递归神经网络(RNNs)等。另外,一些实施例可以被配置为各种处理架构,例如神经网络处理单元(NPUs)、图形处理单元(GPUs)、现场可编程门阵列(FPGAs)、张量处理单元(TPUs)、专用集成电路(ASICs),或者任何其他类型的异构加速器处理单元(HAPUs)等。[0031] 图1B示出了根据本申请的一些实施例的示例性核心架构。如图1B所示,内核102可以包括一个或多个运算单元(例如第一和第二运算单元1020和1022)、存储器引擎1024、序列发生器1026、指令缓冲器1028、常量缓冲器1030、本地存储器1032等。[0032] 一个或多个运算单元可以包括第一运算单元1020和第二运算单元1022。第一运算单元1020可以配置为对收到的数据(例如矩阵)执行运算。在一些实施例中,第一运算单元1020可以包括一个或多个配置为执行一个或多个运算的处理单元(例如,乘法、加法、乘法‑累加、元素智能运算等)。在一些实施例中,第一运算单元1020被配置为加速卷积运算或矩阵乘法运算的执行。第二运算单元1022可以配置为执行池运算,插值运算,感兴趣区域(ROI)运算等。在一些实施例中,第二运算单元1022可以包括插值单元、池数据路径等。[0033] 存储引擎1024可以配置为在相应的内核102内或在两个内核之间执行数据复制。直接存储器访问单元108可以帮助复制相应内核内或两个内核之间的数据。例如,直接存储器访问单元108可以支持存储器引擎1024从本地存储器(例如,图1B的本地存储器1032)执行数据复制进入相应的运算单元。存储器引擎1024还可以配置为执行矩阵转置,以使矩阵适合在运算单元中使用。[0034] 序列发生器1026可以与指令缓冲器1028耦合,并配置为检索命令并将命令分配给内核102组件。例如,序列发生器1026可以将卷积命令或乘法命令分配给第一运算单元1020,将池命令分配给第二运算单元1022,或者将数据复制命令分配给内存引擎1024。序列发生器1026还可以被配置为监视神经网络任务的执行并并行化神经网络任务的子任务以提高执行效率。在一些实施例中,第一运算单元1020、第二运算单元1022和存储器引擎1024可以根据存储在指令缓冲器1028中的指令在序列发生器1026的控制下并行运行。[0035] 指令缓冲器1028可以配置为存储属于所述相应内核102的指令。在一些实施例中,指令缓冲器1028与序列发生器1026耦合,并向序列发生器1026提供指令。在一些实施例中,存储在指令缓冲器1028中的指令可以由命令处理器104传输或修改。[0036] 常数缓冲器1030可以配置为存储常数值。在一些实施例中,存储在常数缓冲器1030中的常数值可由运算单元(如第一运算单元1020或第二运算单元1022)用于批量标准化、量化、去量化,等等。[0037] 本地存储器1032可以以快速的读/写速度提供存储空间。为了减少与全局存储器的可能交互,本地存储器1032的存储空间可以以大容量实现。利用巨大的存储空间,大部分数据访问可以在内核102内执行,从而减少了数据访问带来的延迟。在一些实施例中,为了最小化数据加载延迟和能耗,集成在芯片上的SRAM(静态随机存取存储器)可以用作本地存储器1032。在一些实施例中,本地存储器1032的容量可以为192MB或更高。根据本申请的一些实施例,本地存储器1032均匀分布在芯片上,以缓解密集布线和加热问题。[0038] 根据本申请的一些实施例,图1C示出了包含加速器架构100的示例性云系统的示意图。如图1C所示,云系统130可以提供具有人工智能(AI)功能的云服务,并且可以包括多个计算服务器(例如132和134)。例如,在一些实施例中,计算服务器132可以结合图1A的神经网络加速器架构100。神经网络加速器架构100在图1C中以简化和清晰的方式示出。[0039] 借助神经网络加速器架构100,云系统130可以提供图像识别、面部识别、翻译、3D建模等的扩展AI功能。应当理解,神经网络加速器架构100可以被部署到其它形式的计算设备。例如,神经网络加速器架构100也可以集成在计算设备中,例如智能电话,平板电脑和可穿戴设备。[0040] 图2A根据本申请的一些实施例,示出了剪枝权重矩阵200的原理示意图。[0041] 权重矩阵200可以包括用于执行神经网络的激活函数的多个权重。如图2A所示,权重矩阵200是包括多行的矩阵的形式。每行可以包括多个权重。例如,权重矩阵200可以是C×S矩阵。也就是说,权重矩阵200包括C行,每行的行大小为S单位。在示例中,行大小S可以是1,006。应当理解,权重矩阵200可以作为整体或基于行进行处理。[0042] 权重矩阵200可分为多个向量,每个向量可包括多个权重。例如,每个向量可以包括八个权重。换句话说,向量大小v将为8。可以理解的是,尽管向量大小为8更为硬件友好,但任何其他值都可以用作向量大小。多个向量可以进一步分为两组。如图2A所示,分组向量210可以包括第一组2102和第二组2104。在一些实施例中,可以对第一组2102执行规则修剪,并且可以对第二组2104执行不规则修剪。因此,第一组2102也可以称为规则组2102,第二组2104也可以称为不规则组2104。例如,在规则修剪期间,可以保留在向量的权重中具有最大幅度的权重,而向量的其他权重的幅度可以设置为零。不规则修剪可能会保留一个以上的权重。在图2A中,修剪中要保留的权重由黑色块表示。[0043] 上述示例性实施例仅旨在表明不同的修剪方法可以应用于所述第一组和所述第二组。可以理解的是,在一些实施例中,也可以对第二组2104执行规则修剪。[0044] 具有至少一个非零权重的向量可以称为非零向量,而具有所有零权重的向量可以称为零向量。[0045] 为了基于权重矩阵200提高执行神经网络的效率,第一组2102中的向量可以进一步分类到给定数量N的桶中。在一些实施例中,给定的数字N可以等于向量大小(例如,在此示例中为8)。例如,参照图1A,可以基于集成在芯片通信系统102中的内核1024的数量来确定桶的所述给定数量和所述向量大小。[0046] 对于剪枝权重矩阵200,可以确定剪枝比率p。通常,当修剪权重时,权重的大小设置为零。并且可以保留未修剪权重的大小。因此,剪枝比率可以定义所述剪枝权重矩阵200中的多少权重要被修剪。换句话说,剪枝比率与剪枝权重矩阵的稀疏性有关。可以理解的是,如果剪枝比例较高,则要修剪更多的权重。[0047] 在权重矩阵200的多个向量可以分组之前,第一组2102和第二组2104的参数,例如第一组2102中的向量分布,第二组2104的大小等可以确定如下。[0048] 在一些实施例中,基于所述行大小S、所述剪枝比率p和桶的所述给定数量N,可以根据下面的等式1‑6确定第一组2102中的桶大小x和空向量的数量y。应当理解,向量大小v可以是任何值,并且可以不等于N。[0049] N×v×x+v×y≤S...(1)[0050] N×x≤S×p...(2)[0051] S×p‑N×x≤S‑(N×v×x+v×y)...(3)[0052] S×p‑N×x≤s‑(N×v×x+v×y)...(3)[0053] 桶大小也称为承载向量的所述桶的容量。在示例中,行大小S为1,006,剪枝比率p设置为0.103,并且所述桶的给定数量为8(这也是向量大小v)。基于这些参数,可以使用下面的公式4确定桶大小x。[0054][0055] 因此,在此示例中,桶尺寸x为floor((1006×0.103)/8)=12。也就是说,八个桶中的每一个最多可以承载12个向量。如上所述,第一组2102桶中的每个向量在修剪后仅保留一个权重。因此,在修剪后,所述桶最多可以承载x×N的权重。在此示例中,第一组2102的所述桶在修剪后最多可以容纳12×8=96个权重。[0056] 为了确定第一组2102中空向量y的数量,可以将等式1和3重写为下面的等式5和6。[0057][0058][0059] 在此示例中,为了满足等式5和6,空向量的数量y≤28。因此,在此示例中,基于行大小S、剪枝比率p和桶的所述给定数量N,一个桶的所述桶大小x确定为12,所述空向量数量y确定为28。[0060] 用确定的所述桶大小x和所述空向量数量y,第二组2104的大小i(例如,不规则组)和保留在第二组2104中的非零权重的数量nz可以进一步使用如下等式7‑8确定。[0061] i=S‑(N×8×x+8×y)...(7)[0062] m=floor(S×p)‑x×N...(8)[0063] 在这个例子中,通过使用等式7‑8,可以确定第二组2104的所述大小i为14,第二组2104中保留的非零权重的所述数量nz为7。[0064] 因此,基于所述行大小S、所述剪枝比率p和桶的所述给定数量N,以及诸如第一组2102中桶的所述桶大小x、第一组2102中所述空向量数量y、第二组2104的所述大小i这些参数,可以确定第二组2104中保留的非零权重的所述数量nz。[0065] 因此,权重矩阵200的多个向量可以根据上述确定的参数进行分组。例如,基于所述桶大小x和第一组2102中的所述空向量数量y,可以确定第一组2102中的向量数量。并且基于所述第二组的所述大小i,还可以确定第二组2104中的向量数量。在一些实施例中,可以根据向量的幅值降序分组到第一组2102和第二组2104。例如,较大的向量可以分组到第一组,较小的向量可以分组到第二组。在一些实施例中,向量可以基于随机选择分组到所述第一组和所述第二组。可以理解的是,任何方法都可以用于对向量进行分组。[0066] 然后,第一组2102中的向量可以分配给多个桶。所述多个桶可以在架构100的存储器(例如,主机存储器104或芯片通信系统102的缓存存储器)中实现,例如作为索引或队列。为了提高硬件上的执行效率,所述多个桶可以对应于架构100的执行线程或内核,以便同一桶中的向量可以由同一执行线程或内核访问和处理。[0067] 在一些实施例中,第一组2102中的向量可以根据每个向量中关键权重的位置分配给多个桶。关键权重可以是在向量的权重中最大的权重,并且关键权重的位置可用于将向量分配给相应的桶。图2B示出了根据本申请的一些实施例的将向量分配给多个桶250(例如,桶250(0)‑250(7))的示意图。[0068] 如图2B所示,在向量212中,可以确定所有权重的幅值以进一步确定权重的顺序,并且第一权被确定为重最大的权重。换句话说,第一权重是向量212的关键权重,在图2B中标记为黑色。[0069] 由于关键权重是向量212的第一权重,因此确定向量212被分配给多个桶250中的第一桶250(0)。对于其他向量,也可以采用类似的方法,其中关键权重在向量内的位置可以影响对相应桶的分配。例如,因为向量214的关键权重是第四权重,所以向量214被分配给第四个桶。类似地,向量216和222(两者在向量的第三位置具有关键权重)被分配给第三个桶250(2),向量218(在向量的第六位置具有关键权重)被分配给第六个桶250(5),以及向量222(在向量的第五位置具有关键权重)被分配给第五个桶250(4)。[0070] 在一些实施例中,在根据向量的关键权重的位置将目标向量分配给桶之前,可以确定桶是否已满。如上所述,可以确定第一组2102中桶的桶大小x。因此,当桶填充了x个向量时,无法将目标向量进一步分配给该桶,必须在分配之前处理目标向量。在一些实施例中,当所述桶满容量填充时,可以更新目标向量的关键权重。[0071] 作为一个例子,在图2A中,最大的向量224的关键权重是根据原始顺序的第三权重,并且在原始顺序中第二大的权重是第八权重。在本例中,对应于向量的第三权重的桶250(2)在分配向量224时是满的。因此,向量224不能分配给桶250(2)。在一些实施例中,在这种情况下,作为原始关键权重的向量224的第三权重可以被设置为零(由图2B中的白块表示),并且可以更新向量幅值的顺序。由于第三权重被设置为零,向量224的第八权重更新后的排序为最大幅值(由图2B中的虚线块指示)。换句话说,向量224的关键权重被更新为第八权重,该权重是在原始顺序中第二大幅值的权重。然后,向量224可被分配给第八个桶250(7),其对应于第八权重的位置。[0072] 因此,通过重复上述过程,可以分别用具有相应关键权重的向量填充多个桶。在此示例中,第一桶填充有第一权重作为关键权重的向量,第二桶填充有第二权重作为关键权重的向量,第三个桶填充有第三权重作为关键权重的向量,依此类推。[0073] 因为向量的分配是根据向量中权重幅值的降序执行的,所以向量的幅值小于桶中的向量的向量保持未分配状态。这些未分配向量的权重在修剪期间设置为零,因此,未分配向量也可以称为空向量。参考图2A,在此示例中,向量232和234可以确定为空向量。可以理解的是,尽管向量232和234被称为空向量,但在修剪之前,向量232和234不是“空的”。尽管在这种情况下将空向量分到第一组2102,但可以理解的是,空向量也可以基于确定的空向量的数量y分组为独立组。[0074] 在对向量进行分组和分配之后,可以修剪第一组2102的向量和第二组2104的向量。如上所述,可以对第一组2102的向量执行规则修剪,以及可以对第二组2104的向量执行不规则修剪。[0075] 在一些实施例中,在所述规则修剪中,分配给桶的向量可以修剪到仅保留关键权重。可以理解的是,在同一桶中的向量在每个向量的相同位置具有关键权重,因为向量是根据关键权重的位置分配给各个桶的。因此,所述桶可以承载具有相同类型的相同数量的向量,这些向量可以定期存储在存储器中并实现有效的并行解码和计算。例如,当在推理期间使用某个桶的向量时,例如,架构100可以检索桶的剪枝权重而无需任何复杂索引来定位剪枝权重,因为剪枝权重的位置与桶本身相关联。因此,可以在与所述多个桶相对应的并行线程中使用第一组2102中的剪枝向量来执行机器学习。此外,未分配的向量可以被完全修剪以最终成为“空”向量,因此这些空向量在推理期间不起作用。[0076] 在一些实施例中,在所述不规则修剪中,第二组2104的向量可以根据确定的参数进行修剪,例如,第二组2104的尺寸i和第二组2104中保留的非零权重的所述数量nz。例如,基于要保留在第二组2104中的非零权重的所述数量nz,可以保留在第二组2104中具有最显著幅值的nz权重,而修剪其他权重。可以理解的是,其他不规则修剪方法也可以应用于第二组2104。[0077] 因此,通过上述过程,工作负载可以均匀地分布在硬件上(例如,架构100的内核102),用于索引保留权重的内存空间可以保存为同一桶中的保留权重共享相同的索引,并且可以保持剪枝矩阵的稀疏性而不会降低准确性。[0078] 图3是根据本申请的一些实施例的用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的计算机实现方法的流程图。[0079] 机器学习可以基于任何需要计算输入矩阵(例如,矩阵乘法)的神经网络来执行。例如,神经网络可以是卷积神经网络(CNN)、深度神经网络(DNN)、递归神经网络(RNN)等,并且输入矩阵可以是权重矩阵或激活矩阵。权重矩阵可以包括神经网络中完全连接层的权重。方法300可由图1A的架构100执行。参考图3,方法300可能包括以下步骤。[0080] 在步骤302,输入矩阵可以分为多个向量。在一些实施例中,可以基于行执行划分。如上所述,输入矩阵的每一行可以被划分为向量以进行进一步的处理,并且向量的向量大小可以被预先确定为更加硬件友好。例如,向量大小可以是8。在一些实施例中,可以对输入矩阵进行改造,使得改造后的输入矩阵的每一行的行大小可以是向量大小的整数倍。[0081] 在步骤304,多个向量可以分组为第一组的向量和第二组的向量。第一组(例如,图2A中的组2102)可以是规则修剪组,第二组(例如,图2A中的组2104)可以是不规则的修剪组。在第一组中,可以提供多个桶来保存所述向量。[0082] 在一些实施例中,可以确定输入矩阵的剪枝比率,并且所述第一组的向量和所述第二组的向量的参数可以基于所述第一数量、所述第二数量和所述剪枝比率来确定。剪枝比率是输入矩阵的所有元素中被修剪的元素的比率,并且与剪枝矩阵的稀疏性相关联。所述参数至少可以包括第一组中所述多个桶的桶大小、第一组中的空向量的数量、第二组的大小,以及保留在第二组中的非零元素的数量。这些参数的详细计算已在上文参考图2A‑2B进行了描述。为了清楚起见,在此省略了其描述。[0083] 然后,基于所确定的参数,可以将多个向量分组为第一组的向量和第二组的向量。例如,基于所述桶大小和第一组中的空向量的数量,可以确定第一组中的向量数。并且,基于第二组的大小,也可以确定第二组中的向量的数量。在一些实施例中,向量可以基于向量的幅值的降序分组到第一组和第二组。例如,幅值较大的向量可以分组到第一组,而幅值较小的向量可以分组到第二组。在一些实施例中,向量可以基于随机选择分组到第一组和第二组。可以理解的是,任何方法都可以用于对向量进行分组。[0084] 在步骤306,第一组中的向量可以根据第一组的每个向量中的关键元素的位置分配给多个桶。在第一组中,可以提供多个桶来保存向量。多个桶的数量可以对应于向量元素个数。并且可以确定在排序中具有最大幅值的元素作为关键元素。[0085] 然后,第一组中的向量可以根据向量中关键元素的位置分配给桶。根据本申请的一些实施例,图4是用于根据关键元素的位置将第一组中的向量分配给桶的方法400的流程图。虽然方法400在本文中被描述为方法300的一部分,但应当理解的是,方法400可以独立执行。方法400也可以通过图1A的体系架构100来实现,包括以下步骤。[0086] 在步骤402,可以确定关键元素在目标向量中的位置。例如,参考图2B,向量212中的关键元素被确定为是第一元素,因此可以确定其位置。[0087] 在步骤404,可以确定与关键元素的位置相对应的第一桶。仍参考图2B,由于向量212中的关键元素是第一元素,因此可以确定桶250(0)——桶组250中的第一桶——来保存向量212。[0088] 在步骤406中,可以确定第一桶是否已满容量。如上所述,已确定桶的桶大小。如果第一桶填满了向量(即,满容量时),则目标向量不能再分配给第一桶。如果第一桶没有满,则可以执行步骤408。[0089] 在步骤408,响应于第一桶没有满容量填充,可以将目标向量分配给与关键元素的位置相对应的第一桶。[0090] 在步骤410,响应于第一桶处于满容量,目标向量的关键元素可以设置为零。[0091] 在步骤412,可以更新目标向量的元素顺序以确定新的关键元素,因为原始关键元素已设置为零。方法400可以使用更新的顺序重复,直到所述目标向量被分配。应当理解,在将原始关键元素设置为零的情况下,现在可以确定在原始顺序中具有第二大的幅值的元素作为关键元素。[0092] 通过连续重复方法400,最终,第一组中的多个桶可以根据桶的大小均匀地填充向量,第一组中的未分配向量可以确定为空向量。[0093] 参考图3,在步骤308,可以修剪第一组的向量和第二组的向量。在一些实施例中,可以对第一组的向量执行规则修剪,并且可以对第二组的向量执行不规则修剪。例如,对于保存在第一组中的多个桶中的向量,可以保留每个向量的关键元素,而可以修剪向量的其他元素。如上所述,那些已被确定为空向量的未分配向量也可以被修剪。对于第二组中的向量,可以根据要保留在第二组中的非零元素的数量来应用任何不规则修剪方法。在一些实施例中,与仅保留桶中的向量的关键元素不同,第二组中的向量在修剪后可以保留多个元素。例如,如图2A所示,向量236‑240每个可以在修剪后保留两个元素。[0094] 在步骤310,在修剪之后,可以使用第一组的剪枝向量和第二组的剪枝向量来执行神经网络。在一些实施例中,可以使用对应于多个桶的并行线程中的剪枝向量的第一部分来执行机器学习。例如,每个线程都可以在架构100的内核上执行。[0095] 因此,通过上述方法300和400,工作负载可以更均匀地分布在硬件上(例如,架构100的内核),用于索引保留权重的存储器空间可以保存为同一桶中的保留权重共享相同的索引,并且可以保持剪枝矩阵的稀疏性而不会降低准确性。[0096] 本申请的实施例还提供了计算机程序产品。计算机程序产品可以包括非易失计算机可读存储介质,其上具有用于使处理器执行上述方法的计算机可读程序指令。[0097] 计算机可读存储介质可以是有形设备,其可以存储指令以供指令执行设备使用。例如,计算机可读存储介质可以是但不限于电子存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储装置,或前述任何合适的组合。计算机可读存储介质的更具体示例的非详尽列表包括以下内容:便携式计算机软盘、硬盘、随机存取存储器(内存)、只读存储器(ROM)、可擦除程序内存、只读存储器(EPROM)、静态随机存取存储器(S内存)、便携式光盘只读存储器(cd‑rom),数字多功能磁盘(DVD),记忆棒,软盘,机械编码的装置,例如在凹槽中具有记录在其上的指令的打孔卡或凸起的结构,以及前述的任何适当组合。[0098] 用于执行上述方法的计算机可读程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、依赖于机器的指令、微码、固件指令、状态设置数据或以一种或多种编程语言的任意组合编写的源代码或目标代码,包括面向对象的编程语言和传统的过程编程语言。计算机可读程序指令可以作为独立软件包完全在计算机系统上执行,或者部分在第一计算机上执行,部分在远离第一计算机的第二计算机上执行。在后一种情况下,第二远程计算机可以通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接到第一计算机。[0099] 计算机可读程序指令可以提供给计算机的处理器或其他可编程数据处理设备以产生机器,使得该指令,其经由计算机或其他可编程数据处理设备的处理器执行,创建用于实现上述方法的装置。[0100] 计算机可读程序指令可被提供给计算机的处理器或其它可编程数据处理设备以产生机器,使得经由计算机或其他可编程数据处理设备的处理器执行的指令创建用于实现上述方法的装置。[0101] 图中的流程图和图表说明了根据本规范的各种实施例的设备、方法和计算机程序产品的可能实现的体系结构、功能和操作。在这方面,流程图或图表中的块可以表示软件程序、段或代码的一部分,其包括用于实现特定功能的一个或多个可执行指令。还应注意,在一些替代实现中,块中记录的函数可能出现在图中记录的顺序之外。例如,根据所涉及的功能,连续显示的两个块实际上可以基本上同时执行,或者有时可以以相反的顺序执行这些块。还应注意,图或流程图的每个块,以及图和流程图中的块的组合,可以通过执行指定功能或动作的基于特殊用途硬件的系统或特殊用途硬件和计算机指令的组合来实现。[0102] 可以使用以下条款进一步描述实施例:[0103] 1、一种用于处理与具有第一数量元素的输入矩阵相关联的神经网络的计算机实现方法,包括:[0104] 将输入矩阵划分为多个向量,每个向量具有第二数量的元素;[0105] 将多个向量分组为第一组的向量和第二组的向量;[0106] 修剪所述第一组的向量和所述第二组的向量;以及[0107] 使用第一组的剪枝向量和第二组的剪枝向量执行机器学习。[0108] 2、根据条款1的方法,进一步包括:根据第一组的每个向量中的关键元素的位置,将所述第一组中的向量分配给多个桶。[0109] 3、根据第2条所述的方法,其中将多个向量分组为第一组的向量和第二组的向量还包括:[0110] 确定输入矩阵的剪枝比率;[0111] 基于第一数量、第二数量和剪枝比率确定第一组的向量和第二组的向量的参数;和[0112] 基于确定的参数将多个向量分组为第一组的向量和第二组的向量,其中,[0113] 所述参数包括第一组中的多个桶的桶大小、第一组中的空向量的数量、第二组的大小、以及保存在第二组中的非零元素的数量。[0114] 4、根据第2条或第3条所述的方法,其中根据第一组的每个向量中的关键元素的位置将第一组中的向量分配给多个桶还包括:[0115] 在每个向量中的第二数量的元素中,通过元素的幅值来确定向量中第二数量的元素的顺序;以及[0116] 在向量中,按照排列顺序,确定一个幅值最大的元素作为关键元素。[0117] 5、根据第4条的方法,其中所述多个桶具有相同的向量容量,并且根据所述第一组的每个向量中的关键元素的位置将第一组中的向量分配给所述多个桶,还包括:[0118] 确定所述关键元素在目标向量中的位置;[0119] 确定多个桶中的第一桶,以及第一桶对应于关键元素的位置;和[0120] 确定所述第一桶是否已满。[0121] 6、根据第5条所述的方法,还包括:[0122] 响应于第一桶没有满负荷填充,将目标向量分配给与该位置相对应的第一桶;或者[0123] 响应于第一桶以满容量填充,将目标向量的关键元素设置为零,并且[0124] 更新顺序以确定目标向量的新的关键元素。[0125] 7、根据第3条所述的方法,其中将第一组中的向量分配给多个桶还包括:[0126] 在多个桶中的每一个都根据桶大小填充向量之后,将第一组中的未分配向量确定为空向量。[0127] 8、根据第2‑7条中的任何一项所述的方法,其中将第一组中的向量分配给多个桶还包括:使用第一组的剪枝向量和第二组的剪枝向量执行神经网络,其中使用第一组的剪枝向量和第二组的剪枝向量执行神经网络还包括:[0128] 在对应于多个桶的并行线程中使用剪枝向量的第一部分执行神经网络。[0129] 9、根据第1‑8条中的任何一种方法,其中剪枝第一组的向量和第二组的向量还包括:[0130] 对第一组的向量执行规则修剪;和[0131] 对第二组的向量执行不规则修剪。[0132] 10、根据第1‑9条中的任何一种方法,其中输入矩阵包括完全连接层的权重。[0133] 11、一种用于处理与具有第一数量的元素的输入矩阵相关联的神经网络的计算设备,包括:[0134] 存储一组指令的存储器;和[0135] 配置为执行一组指令以使设备:[0136] 将输入矩阵划分为多个向量,每个向量具有第二数量的元素;[0137] 将多个向量分组为第一组的向量和第二组的向量;[0138] 修剪第一组的向量和第二组的向量;和[0139] 使用第一组的剪枝向量和第二组的剪枝向量执行机器学习。[0140] 12、根据第11条所述的设备,其中所述一组指令由所述一个或多个处理器进一步执行,以使所述设备:[0141] 根据关键元素在第一组的每个向量中的位置,将第一组中的向量分配给多个桶。[0142] 13、根据第12条所述的装置,其中在将多个向量分组为第一组的向量和第二组的向量时,一组指令由一个或多个处理器进一步执行,以使设备:[0143] 确定输入矩阵的剪枝比率;[0144] 基于第一数量、第二数量和剪枝比率,确定第一组的向量和第二组的向量的参数;和[0145] 基于确定的参数将多个向量分组为第一组的向量和第二组的向量,其中,[0146] 所述参数包括第一组中的多个桶的桶大小、第一组中的空向量的数量、第二组的大小、以及保存在第二组中的非零元素的数量。[0147] 14、根据第12或13条所述的装置,其中在将第一组中的向量根据第一组的每个向量中关键元素的位置分配给多个桶时,一组指令由一个或多个处理器进一步执行,以使设备:[0148] 在每个向量的第二数量的元素中,按元素的幅值的大小确定向量中第二数量的元素的顺序;和[0149] 在向量中确定幅值最大的元素作为关键元素。[0150] 15、根据第14条所述的装置,其中所述多个桶具有相同的向量容量,并且在根据关键元素在第一组的每个向量中的位置将第一组中的向量分配给多个桶时,一组指令由一个或多个处理器进一步执行,以使设备:[0151] 确定关键元素在目标向量中的位置;[0152] 确定多个桶中的第一桶,以及第一桶对应于关键元素的位置;和[0153] 确定所述第一桶是否已满。[0154] 16、根据第15条所述的装置,其中在根据所述关键元素在所述第一组的每个向量中的位置将所述第一组中的向量分配给所述多个桶时,一组指令由一个或多个处理器进一步执行,以使设备:[0155] 响应于第一桶没有满负荷,将目标向量分配给与该位置相对应的第一桶;或者[0156] 响应于第一桶以满容量填充,将目标向量的关键元素设置为零,并且[0157] 更新顺序以确定目标向量的新的关键元素。[0158] 17、根据第13条所述的设备,其中在将第一组中的向量分配给多个桶时,由一个或多个处理器进一步执行该组指令,以使该设备:在多个桶中的每一个都根据桶大小填满向量之后,将第一组中的未分配向量确定为空向量。[0159] 18、根据第12‑17条中的任何一个所述的设备,其中所述一组指令由一个或多个处理器进一步执行,以使所述设备:[0160] 使用第一组的剪枝向量和第二组的剪枝向量执行神经网络,其中,使用第一组的剪枝向量和第二组的剪枝向量来执行神经网络,还包括在对应于多个桶的并行线程中的剪枝向量的第一部分来执行神经网络。[0161] 19、根据第11‑18条中的任何一项所述的装置,其中在修剪第一组的向量和第二组的向量时,一组指令由一个或多个处理器进一步执行,以使设备:[0162] 对第一组向量执行规则修剪;和[0163] 对第二组向量执行不规则修剪。[0164] 20、根据第11‑19条中的任何一项所述的设备,其中输入矩阵包括完全连接层的权重。[0165] 21、一种非易失性计算机可读介质,其存储一组指令,该指令可由设备的一个或多个处理器执行,以使设备执行用于处理与具有第一数量的元素的输入矩阵,方法包括[0166] 将输入矩阵划分为多个向量,每个向量具有第二数量的元素;[0167] 将多个向量分组为第一组的向量和第二组的向量;和[0168] 修剪第一组的向量和第二组的向量。[0169] 如本文所用,除非另有明确说明,术语“或”包括所有可能的组合,除非不可行。例如,如果声明数据库可以包括a或B,则除非另有明确说明或不可行,否则数据库可以包括A或B,或A和B。作为第二个示例,如果声明数据库可以包括a、B或C,则除非另有明确说明或不可行,否则数据库可以包括a或B,或者C,或者A和B,或者A和C,或者B和C,或者A、B和C。[0170] 应当理解,为清楚起见,在单独实施例的上下文中描述的说明书的某些特征也可以在单个实施例中组合提供。相反,为了简洁起见,在单个实施例的上下文中描述了规范的各种特征,也可以单独或在任何合适的子组合中或在本规范的任何其他描述的实施例中提供。在各种实施例的上下文中描述的某些特征不应被视为这些实施例的基本特征,除非该实施例在没有这些元素的情况下不起作用。

专利地区:英国

专利申请日期:2021-01-07

专利公开日期:2024-07-26

专利公告号:CN113159272B


以上信息来自国家知识产权局,如信息有误请联系我方更正!
电话咨询
读内容
搜本页
回顶部