通用处理器与神经网络处理器的协同系统设计
引用的优先申请
本申请要求在先提交的中国专利申请201610663201.9、“一种优化人工神经网络的方法”和中国专利申请201610663563.8“一种用于实现ANN的深度处理单元”的优先权。
技术领域
本发明涉及人工神经网络(ANN),例如卷积神经网络(CNN),尤其涉及如何基于通用处理器与神经网络处理器的协同系统设计来实现人工神经网络。
背景技术
卷积神经网络在当前图像处理领域有着非常广泛的应用,神经网络有训练方法简单、计算结构统一的特点。但是神经网络存储计算量都很大。许多工作试图在FPGA上搭建或者直接设计专用芯片来实现神经网络的加速器。但是,由于专用神经网络加速硬件灵活性还是受限,能够完成的任务过于单一。
发明人姚颂等发表的文章“Going Deeper With Embedded FPGA Platform forConvolutional Neural Network”(2016.2)描述了一种利用FPGA的加速系统,其中用到通用处理器(例如,ARM)来完成一些FPGA没有办法完成的计算。例如,ARM负责传输指令以及准备数据。
发明内容
在上述文章的基础上,发明人提出了进一步的改进。本申请提出了结合神经网络专用处理器与通用处理器(CPU)而提供一个灵活的系统,能够适用于复杂的神经网络。
根据本发明的一方面,提出了一种用于运行人工神经网络(ANN)的深度处理单元(DPU),包括:CPU,用于调度可编程处理模块(PL)和直接存储器访问器(DMA);直接存储器访问器(DMA),分别与所述CPU、可编程处理模块和外部存储器连接,用于所述CPU和和可编程处理模块之间的通信;可编程处理器模块(PL),包括:控制器(Controller),用于获取指令,并基于所述指令对计算核进行调度,计算核(Computing Complex),包括多个计算单元(PE),用于基于指令和数据进行计算任务,缓冲区(buffer),用于保存所述可编程处理器模块使用的数据和指令;外部存储器(DDR),与所述CPU、DMA连接,用于保存:用于实现ANN的指令和需要被ANN处理的数据;所述CPU控制所述DMA以在所述外部存储器和所述可编程逻辑模块之间传输指令和数据。
此外,所述DMA通过FIFO在所述外部存储器和所述可编程处理模块之间传输数据;所述DMA通过FIFO在所述外部存储器和所述可编程处理模块之间传输指令。
根据本发明的另一方面,提出了一种用于运行人工神经网络(ANN)的深度处理单元(DPU),包括:CPU,用于调度可编程处理模块(PL)和直接存储器访问器(DMA);直接存储器访问器(DMA),分别与所述CPU、可编程处理模块和外部存储器连接,用于所述CPU和和可编程处理模块之间的通信;可编程处理器模块(PL),包括:控制器(Controller),用于获取指令,并基于所述指令对计算核进行调度,计算核(Computing Complex),包括多个计算单元(PE),用于基于指令和数据进行计算任务,缓冲区(buffer),用于保存所述可编程处理器模块使用的数据和指令;外部存储器(DDR),与所述CPU、DMA和可编程逻辑模块连接,用于保存:用于实现ANN的指令和需要被ANN处理的数据;其中所述CPU控制所述DMA在所述外部存储器和所述可编程逻辑模块之间传输指令;其中所述可编程逻辑模块和所述外部存储器直接传输数据。
此外,所述DMA和所述可编程处理模块之间通过FIFO传输指令。
此外,所述CPU还包括:状态监视模块,用于监视所述可编程逻辑模块的有限状态机(FSM)的状态。
此外,所述计算单元(PE)包括:复杂卷积核(convolver complex),与所述缓冲区相连以接收ANN的权重,输入数据,用于进行所述ANN中的卷积计算操作;加法树(addertree),与所述复杂卷积核连接,用于对卷积计算操作的结果求和;非线性化模块,与所述加法树连接,用于把非线性函数操作应用到所述加法树的输出。
此外,所述计算单元(PE)还包括:汇集模块,与所述非线性模块连接,用于进行所述ANN中的汇集操作。
此外,所述缓冲区包括:输入缓冲区,用于准备所述计算核计算使用的输入数据、指令;输出缓冲区,保存并输出计算结果。
此外,所述缓冲区还包括:偏置移位器(bias shift),用于移位所述权重到不同的量化范围,所述权重为被量化的定点数,并把移位后的权重输出给所述加法树。
根据本发明的一个实施例,所述CPU、可编程逻辑模块、所述DMA被实现在一个SOC上。所述外部存储器被实现在不同于所述SOC的另一个芯片上。
附图说明
图1a和1b显示了人工神经网络模型的常见结构。
图2显示了把人工神经网络模型部署在专用硬件上的流程。
图3显示了优化人工神经网络的整体流程。
图4显示了根据本发明第一实施例的使用CPU和专用加速器(例如,DPU)的协同设计来实现人工神经网络的硬件架构。
图5显示了图3所示硬件架构使用FIFO的数据传输机制。
图6显示了根据本发明第二实施例的使用CPU和专用加速器(例如,DPU)的协同设计来实现人工神经网络的硬件架构。
图7显示了对本发明第一实施例的进一步改进。
图8显示了对本发明第二实施例的进一步改进。
图9显示了第一、第二实施例的处理流程的异同。
具体实施方式
本申请的一部分内容曾经被发明人姚颂的学术文章“Going Deeper WithEmbedded FPGA Platform for Convolutional Neural Network”(2016.2)所发表。本申请在其基础上进行了更多的改进。
本申请中,将主要以图像处理为例来说明本发明对CNN的改进。深度神经网络(DNN)和循环神经网络(RNN)与CNN类似。
CNN基本概念
CNN在广泛的视觉相关任务中都达到最先进的性能。为帮助理解本申请中分析的基于CNN图像分类算法,我们首先介绍了CNN的基础知识,介绍图像网络数据集和现有CNN模型。
如图1(a)所示,典型的CNN由一系列有序运行的层组成。
CNN模型的参数被称为“权重”(weights)。CNN的第一层读取输入图像,并输出一系列的特征图(map)。下面的层读取由上一层产生的特征图,并输出新的特征图。最后一个分类器(classifier)输出输入图像可能属于的每一类别的概率。CONV层(卷积层)和FC层(全连层)是CNN中两种基本层类型。CONV层后,通常有汇集层(Pooling layers)。
例如,对于一个CNN层,
表示第j个输入特征图(input feature map),
表示第i个输出特征图(output feature map),b
i表示第i个输出图的偏置项。
对于CONV层,nin和nout分别代表输入和输出特征图的数量。
对于FC层,nin和nout分别代表输入和输出特征向量的长度。
CONV层(Convolutional layers,卷积层)的定义:CONV层以一系列特征图作为输入,并以卷积内核卷积获得输出特征图。
通常与CONV层相连的非线性层,即,非线性激励函数,被施加到输出特征图中的每个元素。
CONV层可以用表达式1表示:
其中gi,j是应用到第j个输入特征图和第i个输出特征图的卷积内核。
FC层(Fully-Connected layers,全连层)的定义:FC层应用于输入特征向量上的一个线性变换:
fout=Wfin+b (2)
W是一个nout×nin变换矩阵,b是偏置项。值得注意,对于FC层,输入的不是几个二维特征图的组合,而是一个特征向量。因此,在表达式2中,参数nin和nout实际上对应于输入和输出特征向量的长度。
汇集(pooling)层:通常与CONV层相连,用于输出每个特征图中的每个分区(subarea)的最大值或平均值。Pooling最大值可以由表达式3表示:
其中p是汇集内核的大小。这种非线性的“降采样”不仅为下一层降低了特征图的大小和计算,还提供了一种平移不变(translation invariance)。
CNN可用于前向推理过程中进行图像分类。但在对任何任务使用CNN之前,应该首先训练CNN数据集。最近的研究表明,对于一个给定任务的基于大数据集的前向培训的CNN模型可以用于其他任务,并在网络权值(network weights)中实现高精度的微小调整,这个微小调整叫做“微调(fine-tune)”。CNN的培训主要是在大型服务器上实现。对于嵌入式FPGA平台,我们专注于加速CNN的推理过程。
Image-Net数据集
Image-Net数据集被视为标准参考基准,以评估图像分类和目标检测算法的性能。到目前为止,Image-Net数据集已经在2万1千多个类别里收集了超过1400万幅图像。Image-Net为ILSVRC分类任务发布一个具有1000个类别、120万个图像的子集,大大促进了CV技术的发展。在本申请中,所有CNN模型通过ILSVRC 2014训练集培训,通过ILSVRC 2014验证集评估。
现有CNN模型
在2012年ILSVRC,Supervision队使用AlexNet,在图像分类任务中赢得了第一名,84.7%的前5精度。CaffeNet在复制AlexNet的基础上有微小变化。AlexNet和CaffeNet都包括5个CONV层和3个FC层。
在2013年ILSVRC,Zeiler-and-Fergus(ZF)网络在图像分类任务中赢得了第一名,88.8%的前5精度。ZF网络也有5个CONV层和3个FC层。
如图1(b)所示,从输入-输出的数据流向角度来说明一个典型的CNN。
图1(b)所示的CNN包括5个CONV组Conv1、conv2、conv3、conv4、conv5,3个FC层FC1、FC2、FC3,以及一个Softmax判定函数,其中每个CONV组包括3个卷积层。
图2表示的是人工神经网络的软件优化以及硬件实现的示意图。
如图2所示,为了加速CNN,从优化流程和硬件架构的角度提出了一整套技术方案。
在图2下侧显示了人工神经网络模型。在图2中间显示了如何压缩CNN模型以减少内存占用和操作数量,同时最大限度地减少精度损失。
在图2上侧显示了为压缩后的CNN提供的专用硬件。
如图2上侧所示,在硬件架构中,包括PS和PL两个模块。
通用处理系统中(processing system,PS)包括:CPU和外部存储器(EXTERNALMEMORY)。
可编程逻辑模块(Programmable Logic,PL)包括:DMA和计算核、输入/输出缓冲以及控制器等。
如图2所示,PL设置有:复杂计算(Computing Complex)、输入缓冲区、输出缓冲区、控制器和直接存储器访问(DMA)。
计算核包括多个处理单元(PEs),其负责在人工神经网络的CONV层、汇集层和FC层的大多数的计算任务。
芯片缓冲区包括输入缓冲区和输出缓冲区,准备PEs使用的数据并存储结果。
控制器,获取外部存储器上的指令、对指令解码(如果需要),以及对PL里的所有模块进行调配,除了DMA。
DMAs用于传输外部存储器(例如DDR)和PL之间的数据和指令。
PS包括通用处理器(CPU)8110和外部存储器8120。
外部存储器存储所有的人工神经网络的模型参数、数据和指令。
PS是硬核,硬件结构固定,用软件进行调度。
PL是可编程的硬件逻辑,硬件结构可变。例如,所述可编程逻辑模块(PL)可以是FPGA。
值得一提的是,根据本发明的实施例,DMA虽然在PL侧,却直接接受CPU的控制,将数据从EXTERNAL MEMORY中搬运到PL中。
因此,图2所示的硬件架构仅是功能划分,上述PL和PS之间的界限并不绝对。例如,实际实施中,所述PL和CPU可以实现在一个SOC上,例如xilinx的Zynq芯片。所述外部存储器可以由另一个存储器芯片实现,与所述SOC芯片中的CPU相连接。
图3显示的是在把人工神经网络部署到硬件芯片之前的优化流程。
图3的输入的是原始的人工神经网络。
步骤405:压缩
压缩步骤可以包括对CNN模型进行修剪。网络修剪被证明是一种有效的方法,以减少网络的复杂性和过度拟合。例如,参见B.Hassibi and D.G.Stork的文章“Second orderderivatives for network pruning:Optimal brain surgeon”。
在本申请引用的优先申请201610663201.9、“一种优化人工神经网络的方法”中,提出了一种通过修剪来压缩CNN网络的方法。
第一,初始化步骤,把卷积层、FC层的权重初始化为随机值,其中生成了具有完全连接的ANN,所述连接具有权重参数。
第二,训练步骤,训练所述ANN,根据ANN的精度,来调整ANN的权重,直到所述精度达到预定标准。
例如,所述训练步骤基于随机梯度下降算法来调整所述ANN的权重,即随机调整权重值,基于ANN的精读变化来进行选择。关于随机梯度算法的介绍,可以参见上述“Learningboth weights and connections for efficient neural networks”。
所述精度可以量化为,针对训练数据集,ANN的预测结果和正确结果之间的差异。
第三,修剪步骤,基于预定的条件,发现ANN中的不重要的连接,修剪所述不重要的连接。具体而言,被修剪的连接的权重参数不再被保存。
所述预定条件包括以下任意之一:连接的权重参数为0;或连接的权重参数小于预定值。
第四,微调步骤,将被修剪的连接重新设置为权重参数值为零的连接,即,恢复所述被修剪的连接,并分配权重值为0。
最后,判断ANN的精度达到预定标准。如果没有,重复第二、第三、第四步骤。
步骤410:数据定点量化
对于一个定点数,它的值表示如下:
其中bw是数的位宽度,fl是可以是负的部分的长度(fractional length)。
为了将浮点数转换成定点数的同时得到最高精度,发明人提出了一个动态精度数据量化策略和自动工作流程。
与以前的静态精度量化策略不同,我们所给出的数据量化流程中,fl对于不同的层和特征图集是动态变化的,同时在一个层中保持静态,以尽量减少每层的截断误差。
所提出的量化流程主要由两个阶段组成。
(1)权重量化阶段:
权重量化阶段的目的是找到一个层的权重的最佳fl,如表达式5:
其中W是权重,W(bw,fl)代表在给定的bw和fl下的W的定点格式。
在一个实施例中,首先分析了每一层权重的动态范围,例如通过采样进行估计。之后,为了避免数据溢出,初始化fl。此外,我们在初始fl的邻域搜索最优fl。
根据另一个实施例,在权重定点量化步骤中,采用另一种方式来寻找最佳fl,如表达式6。
其中,i代表bw个位中的某一位,ki为该位权重。采用表达式6的方式,对不同的位给予不同的权重,再计算最优的fl。
(2)数据量化阶段。
数据量化阶段旨在为CNN模型的两层之间的特征图集寻找最优fl。
在此阶段,使用训练数据集(bench mark)来训练CNN。所述训练数据集可以为dataset 0。
根据本发明的一个实施例,首先完成所有CNN的CONV层、FC层的权重量化,再进行数据量化。此时,把训练数据集输入到已经被量化权重的CNN,经过CONV层、FC层的逐层处理,得到各层输入特征图。
针对每一层输入特征图,使用贪婪算法逐层比较定点CNN模型和浮点CNN模型的中间数据,以减少精度损失。每一层的优化目标如表达式7所示:
在表达式7中,当A表示一层(例如某一CONV层或FC层)的计算,x表示输入,x+=A·x时,x+代表该层的输出。值得注意的是,对于CONV层或FC层,直接结果x+具有比给定的标准更长的位宽度。因此,当最佳fl选择时需要截断。最后,整个数据量化配置生成。
根据另一个实施例,在数据定点量化步骤中,采用另一种方式来寻找最佳fl,如表达式8。
其中,i代表bw个位中的某一位,ki为该位权重。与表达式4的方式类似,对不同的位给予不同的权重,再计算最优的fl。
上述数据量化步骤得到最优的fl。
此外,根据另一实施例,权重量化和数据量化可以交替进行,不是依次进行。
就数据处理的流程顺序而言,所述ANN的卷积层(CONV层)、全连层(FC层)中各个层为串联关系,所述训练数据集被所述ANN的CONV层和FC层依次处理时得到的各个特征图集。
具体而言,所述权重量化步骤和所述数据量化步骤根据所述串联关系交替进行,其中在所述权重量化步骤完成其中某一层的定点量化之后,对该层所输出的特征图集执行数据量化步骤。
第一实施例
在优先申请中,发明人提出了使用通用处理器和专用加速器的协同设计,但是并没有讨论如何高效的利用通用处理器的灵活性和专用加速器的计算能力,例如如何传输指令、传输数据、执行计算等。本申请中,发明人提出了进一步的优化方案。
图4显示了对图2的硬件结构的进一步改进。
在图4中,CPU控制DMA,DMA负责调度数据。具体而言,CPU控制DMA将外部存储器(DDR)中的指令搬运到FIFO中。随后,专用加速器在FIFO中取指令并且执行。
专用加速器所需要的数据也由CPU控制DMA将数据数从DDR中搬运到FIFO里,计算时从FIFO中搬运数据进行计算。同样,CPU也维护加速器的输出数据的搬运工作。
在运行的时候,CPU需要时刻监控DMA的状态。当Input FIFO不满时,需要把数据从DDR中搬运到Input FIFO中。当output FIFO不空时,需要把数据从Output FIFO搬运回DDR里。
此外,图4的专用加速器中包括:控制器、计算核(computation Complex)和缓冲区(buffer)。
计算核包括:卷积器、加法器树、非线性模块等。
卷积核的大小通常只有几个选项如3×3、5×5和7×7。例如,为卷积操作设计的二维卷积器是一个3×3窗口。
加法器树(AD)对卷积器的所有结果求和。非线性(NL)模块适用于非线性激励函数的输入数据流。例如,所述函数可以是ReLU函数。此外,最大汇集(Max-Pooling)模块(未示出)用于汇集操作,例如,将特定的2×2窗口用于输入数据流,并输出其中的最大值。
缓冲区包括:输入数据缓冲区、输出数据缓冲区、偏置移位(bias shift)模块。
偏置移位(bias shift)用于支持动态量化范围的转换。例如,针对权重进行移位。还例如,针对数据进行移位。
输入数据缓冲区还可以包括:输入数据缓冲器,权重缓冲器。输入数据缓冲器可以是线状数据缓冲器(line buffer),用于保存运算需要的数据,并延迟释放所述数据,以实现所述数据的重用。
图5显示了CPU和专用加速器之间的FIFO交互方式。
图5所示的架构图中有3类FIFO。同样,CPU对DMA的控制也有三种。
第一实施例中,CPU与专用加速器之间完全通过FIFO通信,CPU与专用加速器之间有三类缓存FIFO:指令、输入数据、输出数据。具体而言,在CPU的控制下,DMA负责外部内存与专用加速器之间的输入数据、输出数据、指令传输,其中在DMA和专用加速器之间分别提供了输入数据FIFO、输出数据FIFO、指令FIFO。
对于专用加速器而言,这种设计简单,只需要关心计算,不需要关心数据。数据操作完全由CPU控制。
但是,在某些应用场景,图5所示方案也有不足之处。
首先,CPU执行调度将消耗CPU的资源。例如,CPU需要时刻监听各个FIFO的状态,随时准备接收和发送数据。CPU监听状态以及根据不同的状态处理数据都要消耗大量的CPU时间。有些应用中,CPU监听FIFO和处理数据的代价会很大,导致CPU几乎被全部占用,没有CPU时间处理其他任务(读取图片,预处理图片等)。
其次,专用加速器中需要设置多个FIFO,也占用PL资源。
第二实施例
第二实施例的特点如下:首先,专用处理器与CPU共享外部内存,两者都可以读取外部内存。其次,CPU仅控制专用加速器的指令输入。以此方式,CPU与专用加速器系统协同操作,其中CPU承担一些专用加速器无法完成的任务。
如图6所示,第二实施例中,专用加速器(PL)和外部内存(DDR)直接交互。相应地,取消了DMA和专用加速器之间的Input FIFO和Ouput FIFO(如图5所示),只保留1个FIFO在DMA和专用加速器之间传输指令,节省了资源。
对于CPU而言,不需要对输入输出数据进行复杂的调度,而由专用加速器直接从外部内存(DDR)访问数据。在人工神经网络运行时,CPU可以进行其他的处理,例如从摄像头读取待处理的图像数据等。
因此,第二实施例解决了CPU任务过重的问题,让CPU可以解放出来处理更多的任务。不过,专用加速器需要自己执行对外部内存(DDR)的数据访问控制。
第一、第二实施例的改进
第一和第二实施例中,CPU都是通过指令控制加速器。
加速器可能在运行过程中出现错误“跑飞”(即,程序进入死循环或者毫无意义地乱运行)。目前的方案中,CPU无法确定加速器是否已经跑飞。
在基于第一或第二实施例的改进实施例中,发明人在CPU中还提供了“状态外设”,从而将专用加速器(PL)中的有限状态机(FSM)的状态直接传递给CPU。
CPU可以通过检测有限状态机(FSM)的状态了解加速器的运行情况。如果发现加速器已经跑飞或者卡死,CPU也可以发送信号直接复位加速器。
图7示出了在图4所示第一实施例的架构上添加“状态外设”的例子。
图8示出了在图6所示第二实施例的架构上添加“状态外设”的例子。
如图7、8所示,专用加速器的控制器中设置有限状态机(FSM),有限状态机的状态被直接传输给CPU的状态外设(即,状态监控模块),从而CPU可以监控程序运行死机等故障情况。
第一和第二实施例比较
第一和第二实施例的两种调度策略各有优势。
图4的实施例中,图片数据需要CPU调度DMA以传输给专用加速器,所以专用加速器会有时间闲置。但是由于CPU调度数据搬运,专用加速器只负责计算,计算能力被优化,处理数据的时间也会相应变短。
图6的实施例中,专用加速器具有单独访问数据的能力而无需CPU调度数据搬运。数据处理可以在专用加速器上独立进行。
CPU可以只负责与外部系统之间的数据读取和输出。读取操作是指例如CPU把图片数据从摄像头(未示出)读取出来,传输到外部存储器;输出操作是指CPU把识别后的输出从外部内存输出到屏幕(未示出)。
采用图6的实施例,可以将任务流水线起来,使得多任务的处理速度更快。相应的代价是,专用加速器同时负责计算和数据搬运,效率不高,处理需要更长的时间。
图9对比示出了第一和第二实施例的处理流程的异同。
第二实施例的应用:人脸识别
根据第二实施例,因为有了共享的外部内存(DDR),所以CPU与专用加速器可以共同完成一个计算任务。
例如,在人脸识别的任务中:CPU可以读取摄像头并且检测到输入图片中的人脸;神经网络过加速器加速核可以完成人脸的识别。
利用使用CPU和专用加速器协同设计可以快速将CPU上面的神经网络计算任务部署在嵌入式设备上。
具体而言,参看图9的实例2,在CPU上运行图片的读取(例如,从摄像头读出)和预处理,在专用加速器上完成图片的处理过程。
由于上述方法将CPU的任务和加速器的任务割裂开来,使得CPU和加速器能够完全并行处理任务。
表格1展示了仅利用CPU与第二实施例(CPU+专用加速器协同设计)之间的性能对比。
表格1
作为对比的CPU使用的是英伟达公司生产的Tegra k1。可以看到利用我们的CPU+专用加速器的协同设计对每一层都有明显的加速,总体加速达到了7倍。
本发明的优点在于,利用CPU(通用处理器)功能丰富的特点弥补专用加速器(可编程逻辑模块PL,例如FPGA)灵活性不足的特点,也利用专用加速器计算速度快的特点弥补CPU计算速度不足以完成实时计算的特点。
此外,通用处理器可以是ARM处理器,或者任何其他的CPU。可编程逻辑模块可以是FPGA,也可以是其他可编程的专用处理器(ASIC)。
需要说明的是,本说明书中的各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本
发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。