APSoC心音辅助诊断算法硬件加速方法
2022-03-22何乐生王威廉
雷 晨,何乐生,王威廉
(云南大学 信息学院,云南 昆明 650500)
0 引 言
云南是先天性心脏病(congenital heart disease,CHD)的高发区[1,2],大规模的心脏听诊筛查是先心病初诊的重要手段[2]。已有研究人员在探索借助心音采集设备采集心音并上传至云端,利用深度学习的算法进行分类识别。但此方案最大的瓶颈在于采集后数据的上传和分析结果的返回受限于网络状况。在便携式设备部署轻量级分类网络进行先心病的分类处理成了项目组的研究方向[4,5]。为此,本文提出了一种基于APSoC(all programmable system on chip)的先心病初诊辅助诊断系统的硬件设计方案。首先,对5122例心音信号进行MFSC特征提取、维度变换等预处理。然后,训练CNN网络模型用于心音分类。最后,利用软硬件协同设计的思路,充分分析CNN算法前向传播和并行计算的可行性,设计了两个通用的电路,分别负责卷积-全连接和池化运算。采用高层次逻辑综合(high-level synthesis,HLS)方法对电路进行优化,有效提高了电路的计算并行度,降低了电路运行所需时间。通过综合和布局布线,得到一个完整的CNN算法模型电路。最终将该电路部署至硬件平台,实现硬件并行CNN(convolutional neural network,CNN)加速算法。本文提出的硬件加速方案,满足高性能、低资源利用率、低功耗、低成本等要求,实现了离线条件下分类效率高、分类精度高的要求,有望用于先心病筛查。
1 研究现状
卷积神经网络近年来凭借其强大的学习能力在多个领域广泛应用,在分类、检测以及分割等领域均有突破性的研究进展。卷积神经网络的发展依靠算法的不断优化和硬件平台的算力支撑。由于在许多边缘设备应用的场景下,CPU(central processing unit)的串行运算方式无法满足实时性需求,GPU高能耗的特点也不适用于移动设备。FPGA(field programmable gate array)既具备集成电路的性能优势,又有可重新配置的灵活性。通过充分发挥FPGA的并行特性,加快逻辑性强的操作速度,大大提高CNN的计算速度。因此,考虑到实时性处理和要求和便携式设备的运算速度慢的特点,在便携式设备上通过FPGA实现CNN的硬件加速具有重大意义。
传统的FPGA计算能力强,资源丰富,但是不易于搭建系统操作平台,且开发成本高。目前,全可编程片上系统APSoC异军突起,含高性能FPGA(可编程逻辑加速器programmable logic,PL部分)作为外设,以及双核ARM Cotex-A9(可编程系统programming system,PS部分)处理器,为异构计算提供了极大地便利。其充分结合了两者的优势。可通过高层次逻辑综合[6]将C/C++语言转化为Verilog/VHDL(very-high-speed intergrated circuit hardware description language,VHDL)等低层次的RTL(re-gister transfer level)语言,并通过Vivado部署至板卡,开发流程[7]简单,广泛应用于神经网络的硬件加速方案之中。
已有不少学者在APSoC架构上实现了对深度神经网络的算法的加速。综述[8]对卷积神经网络的研究表示卷积层的前向传播是整个CNN前向传播重要部分,计算量和所花费时间的占比均偏高。文献[9]通过块循环矩阵来实现精度和压缩率之间的细粒度权衡,降低了运算复杂度。文献[10]将卷积层转换为与全连接层相似的矩阵乘法。文献[11]同样改变了卷积计算方式,大大提高了卷积层运算速度,但该算法需对不同卷积层进行单独计算和推导,且实现难度大,不易扩展,通用性差。文献[12]在Zynq-7020平台上为脑电信号分类进行加速,在100 MHz的频率下速度提升了19倍。通过对脑电信号的维度转换的处理后,对CNN的每层网络设计IP核,并分别配置实现硬件加速,资源利用率高。但该设计部分卷积层对整个加速器的延迟很大,不利于算法的扩展。
综上,本文提出了一种基于APSoC的先心病初诊辅助诊断系统的设计方案。首先,对原始心音信号进行预处理后训练CNN网络。然后,对CNN进行软硬件划分,将CNN的网络结构拆分为卷积-全连接和池化两个通用IP(intellectual property,IP)。利用HLS实现并优化电路,采用分块化、并行计算和流水线技术。通过Vivado软件对CNN电路的综合和布局布线,得到可下载的比特流文件。最后,将硬件部署到Zynq SOC平台,通过网线连接到PC端的Jupyter Notebook界面,即可在PS端的PYNQ(Python on Zynq,PYNQ)框架下进行FPGA电路的烧写、数据的读取和操作。实现了心音辅助诊断算法的有效加速,且利于算法结构的扩展和迁移。
2 数据处理
2.1 数据来源
本文所用的数据源于从云南省阜外心血管病医院、昆明医科大学第一附属医院临床已确诊的先心病病例,以及课题组随医疗队下乡筛查先心病采集的心音所建数据库,含确诊病例和健康志愿者心音样本。采集对象为0.5到16周岁的儿童和青少年。采集设备由项目组自行研发,采用美国(THE ONE,ThinkLabs)公司生成的心音传感器,采集时长20 s,采样率为5000 Hz。
2.2 数据预处理
对原始心音信号的预处理,通常包括降噪、分帧等。文献[14]中分析对比了不同的小波去噪方法。本文选用db6小波基、4层小波、软阈值10%的小波对心音进行去噪处理。对降噪后的心音进行分帧,本文自动截取每4 s作为一个样本帧,约含5个心动周期,有足够的信息供分析用。
心音特征参数选取的好坏直接影响系统的性能。梅尔频谱系数MFSC(log Mel-frequency spectral coefficients,MFSC)[15],相对于梅尔倒谱系数(Mel frequency cepstral coefficents,MFCC)少了计算离散余弦变换(discrete cosine transformation,DCT)环节,常用于语音信号分析。进行MFSC特征提取,对信号先预加重、分帧、加窗操作,之后进行快速傅里叶变换得到频谱,接下来利用梅尔刻度变换得到频带内信号的能量谱。心音信号经过梅尔变换后,从1维时域信号变换成为2维的M×N梅尔频率能量谱MFSC“特征图”,其中M为时间上的帧数,N为Mel频率滤波器的个数。对MFSC取一阶差分ΔMFSC和二阶差分Δ2MFSC。由静态的MFSC、ΔMFSC、Δ2MFSC这3幅M×N特征图组成三通道的心音特征图。相较于MFCC,MFSC方法主要改进在于将静态特征和反映声音动态特性的差分谱结合起来,既满足了CNN输入特征的映射方式,又能兼顾心音信号的时频域特征。MFSC模拟了彩色图片,RGB通道分别对应每个特征图的MFSC的静态数据、一阶差分和二阶差分的系数特征矩阵。心音数据的处理和MFSC组织方式过程如图1所示。
图1 心音数据的处理和MFSC组织方式
3 FPGA加速方案
3.1 CNN框架
本文选用的卷积神经网络架构分别由3个卷积层Conv_1、Conv_2、Conv_3,3个池化层Pool_1、Pool_2、Pool_3,2个全连接层Fc_1、Fc_2组成,如图2所示。其中,卷积层之后的激活函数为ReLu,池化层选择最大值池化。同时,在池化层之后采用dropout丢弃部分参数,避免过拟合的同时减少了片上资源的占用。
3.2 硬件加速总体架构
目前,基于CNN的卷积神经网络的硬件加速基于其层次结构主要有两种不同的实现模式:一种是流架构,另一种是单结构核心。前者,如图3(a)所示,将相应的硬件资源分配给各网络层,其优点是可实现高度可配置的并行,灵活性强。缺点是对片上资源消耗较大。后者注重资源重用,如图3(b)所示,将不同的网络层通过资源重用共享同一个加速器,这种非高度定制的结构的优点是更灵活,更容易在平台之间迁移,且资源占用率低。
图2 CNN架构图及参数
图3 硬件加速总体架构
CNN的计算量主要集中在卷积层,因其计算过程中涉及到大量的卷积计算,会消耗大量的计算资源。卷积计算的本质为乘累加计算,乘累加计算的并行特质是卷积计算便是CNN可以进行FPGA加速的原因。池化的目的是特征提取,在卷积计算过后所产生的大量数据中,筛选出最有价值的数据进行保存,防止数据量过大导致的数据爆炸等现象发生。池化的实质就是降采样。根据对全连接的计算原理分析即可知,全连接层可以看作被拉扁的卷积层。故本文不再单独设计全连接层加速器,只需在传入参数时,将卷积核大小设置为1*1即可。通过设计一个Conv_fc_acc实现了卷积和全连接两种运算,提高了IP核的重用率和资源利用率。
考虑到硬件平台资源的有限性,本文选择在单计算核心模式下设计了系统架构。计算核心包括Conv_fc_acc和Pool_acc,其中,Conv_fc_acc是指卷积-全连接运算加速器,主要负责对卷积计算过程与全连接计算过程进行加速;Pool_acc是指池化运算加速器,主要负责对池化计算过程进行加速。
硬件加速总体架构如图4所示。系统结构大致可由可编程系统(programming system,PS)、可编程逻辑加速器(programmable logic,PL)两部分组成,还有外部存储器DDR、片内缓冲区以及片内和片外总线互连。其中,输入数据和权重被预先存储在外部存储器DDR中。PS和PL通过AXI总线互连。加速器通过AXI_Lite总线接收来自CPU的配置信号,例如卷积内核大小、跨步、padding方式等。在PS中DDR控制器的作用下,从DDR读取加速器所需的当前层的权重和输入数据,并将其从AXI_memory映射格式转换为AXI4_streaming格式,并在直接内存访问(direct memory access,DMA)的作用下将其转换到加速器的片上缓冲区。通用卷积电路和通用池化电路放在PL端进行并行加速,将特征图输入和分类显示等放在PS端进行。AXI4总线负责完成数据通信,AXI_Lite总线负责完成信号的传输。ARM_CPU将输入特征图加载到DDR内存中,然后在FPGA端进行高度并行化的运算,以达到硬件加速的目的。利用FPGA的AXI_DMA总线送入到CNN加速模块,最后将计算结果再通过AXI_DMA将输出的分类结果传回ARM端。
图4 系统总体架构
3.3 硬件加速及优化措施
本文利用高层次逻辑综合(HLS)[5,6]进行FPGA开发。HLS工具可以将C/C++语言转化为Verilog语言,并通过添加约束命令的方式实现并行化操作。相比传统的FPGA电路设计方法,利用HLS进行开发将大大提高开发效率。卷积计算过程可由6层循环完成,但串行完成,资源利用率低。本文使用的HLS优化方法主要包括对数组的分块处理、对循环的展开和流水、定点化处理,可以提高FPGA的资源利用率来提高硬件系统运算的并行度。
CNN的核心部分是利用卷积运算,利用卷积核对输入特征图提取特征的过程,卷积计算就是乘和累加计算。通过FPGA将乘、累加运算改为并行计算,是实现CNN加速的途径。卷积计算的过程是前一层的输入特征图与权重特征图进行卷积,得到一个输出特征图。同时,它又作为下一层的输入特征图。滑动方向如图5(a)所示,依次是从左到右、从上到下。当输入的特征图从DDR中取出时,将按照循环展开的方法,每个循环的过程中从输入通道的方向分解为K个特征子块。在一个时钟周期里,同时对多个子块进行卷积操作。其中,特征子块计算的顺序如图5(b)所示。因此,大小为 [CH_in][H][W] 的特征图可以被分解为N个子块 [CH_in/K][H][W][K]。 特征子块个数N的计算公式如式(1)所示
N=[CH_in/K]×[H]×[W]×[K]
(1)
式中:CH_in为输入通道的个数,H、W分别为特征图的高度和宽度,K为并行度, [CH_in/K] 为一个特征子块的长度。其中,各个变量均有取整操作。
与特征图参数的重新组织方式一样,权重参数的重新加载也是在输入方向上,即在输入通道数CH_in的方向上分为M个权重子块。权重子块个数M的计算公式如式(2)所示
M=[CH_out][Ky][Kx][CH_in/K][K]
(2)
式中:CH_in、CH_out为输入通道数和输出通道数、Kx、Ky为卷积核的大小、K为并行度。
假设架构被分割成多个相互依赖的阶段,流水线就是一种可以使不同阶段并行执行的技术。流水线技术通过同时执行多个阶段达到减小延迟的目的。如图6所示。当一个循环被流水线化时,在该循环下面的任何层次结构中的循环都必须展开。因此,在进行流水化处理之后,通常会在吞吐量和延迟方面提供最佳性能。
图5 卷积运算顺序及分割方式
图6 流水线操作
在Vivado HLS中,采用流水线技术,通过添加预编译指令#pragma HLS PIPEMINE II=1,将最内层的K层循环展开。经过循环展开之后,此时可实现延迟间隔为1的流水线操作,循环遍历次数可降低K倍。循环遍历次数L_conv的计算公式如式(3)所示
L_conv=[H][W][CH_out][Ky][Kx][CH_in/K]
(3)
经过PIPELINE约束后的运算时间由原来的L_conv×T个周期提升至L_conv+T-1个周期。速度提升倍数如式(4)所示
(4)
式中:I_conv指的是电路计算一个Latency所耗费的时间。
此外,在不影响识别精度的情况下,可采用定点化后的整数计算替代浮点计算,以实现高效率的算术操作。本文采用的是16位的定点量化。
4 实验结果与分析
本实验硬件平台采用Zynq-7020的PYNQ开发板,其中ARMcotex-A9处理器主频为667 MHz,内存为1 GB DDR3,FPGA的主频为100 MHz,开发环境采用的是Xilinx Vivado HLS 2018、Vivado2018.1和SDK 2018.1,编程语言使用VHDL、C和Python;数据预处理由MATLAB 2018a。CPU平台为Inteli7-8700的台式机,主频为3.2 GHz,分类器的训练是在TensorFlow 1.15环境下。实验使用的样本数据大小是32×32×3,从心音数据库中随机选取5122个样本,含1816个异常(病理)样本和3306个正常样本。异常数据作为负样本,正常数据作为正样本。在其中随机抽取85%作为训练样本集,剩下的15%作为测试样本集。
4.1 心音算法模型验证
本文采用损失函数对算法模型的性能进行评估,在图7(a)中可以看出,训练数据在经过20次迭代后,训练精度仍有上升空间。但当迭代参数大于50时,识别率和损失函数不再有提升。如图7(b)所示。实验结果表明,经过38次迭代,达到了90.08%的识别率且此时的损失值不再有提升。
图7 模型迭代次数为20次和40次的损失值和准确率
4.2 硬件性能评估及资源消耗情况分析
利用FPGA对卷积神经网络进行加速的一大之后重要因素就是相比GPU、CPU,FPGA平台具有更低的功耗,也就是说,FPGA平台具有更高的能耗效率。FPGA更适合在移动端使用。上述设计的硬件加速器模块通过Vivado综合实现之后,可以得到FPGA的功耗大致为1.507 W。
表1中列出来FPGA工作在100 MHz下的资源使用情况。乘法部分运算逻辑全部使用DSP资源,资源占用在41.36%。也就是说,本文所设计的系统主要硬件消耗就在卷积单元的乘法运算中。BRAM使用率并不高,只有11.43%。LUT和FF资源分别占用了34.41%和21.88%。可以得出结论:本文算法所占用各项硬件资源并不高,能够满足所需的资源要求。
为对比先心病心音辅助诊断算法在FPGA、ARMCPU和通用CPU的计算性能,本文采用同样的测试数据集,在
表1 FPGA资源占用情况
3种平台上分别进行运算时长的记录。如表2所示,可以看出,本文算法在硬件资源有限的XC7Z010的板卡上,FPGA的前向传播的运算速度为 0.095 s,帧率为41.68 frame/s。与此同时,在相同条件下,ARMCPU的运算时长为1152.49 s。另外,相同条件下,通用CPU的测试时长为3.342 s。相比之下,FPGA的加速效果约为通用CPU的35倍。为了测试本文加速系统的性能,本文将286个负样本和586个正样本进行测试,计算其平均处理时间,可以达到40帧/s。
表2 FPGA与通用CPU运行CNN算法对比
本文算法的运算速度约为通用CPU的35倍,平均帧率可以达到40帧/s。实验结果表明,FPGA加速模块在几乎不损失准确度的情况下,FPGA加速性能好可以满足实时检测的要求。板上测试的精度值最后稳定在90.08%,相对于采用CPU损失了1%左右。实验结果表明,在经过FPGA的板级测试之后,本文的算法精度仍具有相当的可信度。
本文与文献[12]的计算模型性能对比见表3。
表3 本文与其它研究的计算模型性能对比
与文献[12]对比,可以发现在相同的板卡和工作频率条件下,本文所用的加速方案的加速倍数更高,资源占用更低。
综合以上,可以得出FPGA相比通用CPU有明显的加速效果,且经过板卡级的验证。且本文考虑到课题组CNN相关算法的不断升级,设计了适用于多个常见卷积神经网络加速模块的目标,提出一种高并行度与高效率的卷积神经网络加速模块设计方案。
5 结束语
针对边远山区网络传输效果差、普通移动设备对神经网络的处理速度慢的局限性,本文提出一种基于异构平台的心音辅助诊断算法的硬件加速方法。利用FPGA的并行性,对CNN在结构上进行并行设计,并在数据复用上做了一定优化,提高了本设计的效率;利用ARM的易操作性,完成模型的重建和数据的读取的工作,提高了本设计的灵活性。实验结果可以发现,本文提出的方法所占用的硬件资源不到一半,且在满足分类能力不下降的前提下,运算时间得到了大幅度的缩减,能够满足先心病初诊辅助诊断的离线使用的需求。