毕设做的是FPGA人脸检测,用轻量级CNN跑在安路板子上。答辩老师问「你的卷积怎么并行化的」「权重定点化损失了多少精度」,我只知道调库跑通了。想请教答辩时这类AI加速问题该怎么准备,才能显得是自己做的而不是调包?
2026年FPGA毕业设计选「基于安路EG4S20的实时人脸检测系统」,答辩时被问模型怎么在FPGA上量化和加速,该怎么答?
6 个回答

先说个常见误区:答辩老师问「怎么并行化」,不是要你把代码翻出来逐行讲,而是想看你对卷积计算结构有没有概念。哪怕你只是调库跑通,也完全可以补上这一课。
一个能自圆其说的答法分两层。第一层讲数据流:人脸检测网络里卷积占了绝大部分运算,把输出特征图按行或按列切成几块,每块交给一组乘法累加单元同时算,这就是最朴素的空间并行;再往上,一个卷积窗口里多个乘加可以并行做,这叫通道内并行。安路EG4S20这种规模的片子资源有限,一般不会全并行,常见做法是选一个折中:比如一行输出同时算 8 到 16 个点。你要能说出「为什么不是越大越好」——DSP 和 BRAM 数量有限,并行度上去后布线拥塞、时序收敛变难。
第二层讲定点化。老师问精度损失,你得知道量化前后有个对比实验:浮点权重训完,用统计方法定出每层的缩放因子,权重和激活各自乘一个 scale 再取整成 int8 或 int16。人脸检测这种任务,分类头对精度敏感、浅层卷积相对鲁棒。答辩时给一个具体数字区间,比如「mAP 掉了不到 1 个点」,比空说「损失很小」可信得多。风险在于:如果你根本没做量化对比,别硬编数字,老实说这部分是参考已有方案实现的,同时讲清楚你知道该怎么验证。
追问一句,你板子上现在跑的是哪套网络、大概几层?这决定了老师会往多深问。

这类问题的准备,我建议你沿着「一条主线」走,而不是背一堆零散知识点。主线就是:一个浮点CNN从训练完到能在FPGA上跑,中间发生了什么。把这条链讲顺,答辩基本就稳了。
链条的起点是模型本身。轻量级人脸检测网络,比如基于MobileNet或类似结构的,参数量小、卷积大多是3×3和1×1。为什么强调这个?因为FPGA加速的难点不在算力,而在数据搬运。1×1卷积计算密度高、好加速;3×3卷积要做行缓存,对片上存储压力大。你答辩时如果能指出「我的网络里哪一层最耗时、为什么」,老师立刻会觉得你动过脑子。
接着是量化。浮点32位换成定点,本质上是在动态范围和精度之间做取舍。常见做法是逐层统计激活值的分布,定一个scale,把float映射到int8或int16。这里有个因果链要讲清楚:位宽越低,DSP占用越少、并行度能开得越大,但量化误差累积到深层,检测框的回归精度会先崩,分类置信度反而没那么敏感。所以很多方案对权重用int8、对激活保留更高位宽,或者只量化卷积层、全连接和输出层保持浮点。你要能说出「我为什么这么选」。
再往下是硬件映射。卷积在FPGA上的经典实现是行缓冲加脉动阵列或乘法累加树。行缓冲解决的是相邻输出点复用输入数据的问题,脉动阵列解决的是让数据流动起来、减少访存。安路EG4S20的DSP和BRAM规模不大,一般不会做很大的阵列,而是用小并行度加高时钟频率来凑吞吐。
工程路径上,如果你时间还够,最划算的补救是:用Python把网络跑一遍,记录每层输出,再做一次伪量化,对比浮点和定点下的检测结果。这个实验不难,但能让你在答辩时拿出真实曲线。如果时间不够,至少把「量化误差从哪来、怎么评估」讲明白,别装。
最后提醒一点:老师最反感的不是「你调了库」,而是你调了库还说不清库干了什么。诚实说明工具链帮你做了哪些事、你自己做了哪些取舍,反而加分。

先说个容易被忽略的点:答辩老师追问量化精度,其实是在看你有没有做过对比实验,而不是要你背公式。你要是只跑了调库,最稳妥的补法是回头自己补一组小实验:拿几百张测试图,分别跑浮点模型和定点模型,记录mAP或者人脸框的召回率,把两条曲线画出来。哪怕定点后掉了两三个点,你只要能说清楚「掉在哪一层、为什么」,这就比嘴硬说「几乎无损」可信得多。
风险在哪?安路EG4S20这块片子资源不算宽裕,你要是被问「为什么选int8不选int16」,答不上来就很尴尬。常见做法是逐层统计激活值的动态范围,先定权重和激活各自的scale,再考虑是否要做per-channel量化。per-tensor简单但精度差,per-channel对权重的精度友好,代价是硬件上多存几组缩放因子。
替代做法也有:如果时间来不及补完整实验,至少把某一层单独拎出来做个定点仿真,用仿真波形或误差直方图撑场面。老师一般不会追着要全网络的数据,他更想确认你懂这条链路。
追问一句,你现在的推理部分是自己在HLS或Verilog里写的,还是直接调的厂商IP?这决定了你答辩时能往深里讲多少。

量化这段我建议你按「一张图走完全程」的思路准备,别按知识点背。起点是浮点模型训练完,权重的数值分布长什么样。你可以说:我先统计每层权重的最大值和分布,发现大部分集中在正负0.5以内,少数离群点很大。如果直接定一个全局scale,那些小权重全被压成0;所以常见的做法是对权重做per-channel量化,每个输出通道一个scale,激活则用per-tensor,因为激活的动态范围在推理时靠校准集统计。
然后是精度损失。这里因果链要讲清楚:位宽从float32降到int8,理论上有256个量化级,但如果你的scale定得偏大,有效位数就浪费了,等效精度更差。常见现象是第一层和最后一层对量化最敏感——第一层直接吃原始像素,最后一层输出分类或回归,中间层反而鲁棒。你答辩时能指出「我在哪一层做了混合精度」或者「我保留了最后一层为int16」,老师会觉得你真的调过。
接着是加速。并行化不是越大越好,这句话要主动说。EG4S20上DSP和BRAM有限,你把并行度开到16,乘法器够用,但片上缓存跟不上,数据要从DDR反复搬,带宽成了瓶颈,时序也难收敛。比较务实的结构是行缓存加脉动阵列:3×3卷积用行缓存把三行像素留在片上,1×1卷积直接走全连接式的并行。
有一个细节值得准备:老师可能会问「你的加速比是多少,跟谁比的」。标准答法是跟同频率的CPU或者纯软件实现比,说清楚单位是帧率还是单帧延迟。人脸检测是实时任务,讲延迟比讲吞吐更有说服力。
你板子上跑的时候,瓶颈到底卡在计算还是卡在数据搬运?如果是后者,答辩重点就该放在存储层次上。

先说个思路:答辩问量化,老师真正想听的是「你怎么知道精度掉了多少、掉在哪」。别急着背公式,把一条链讲顺就行。链的起点是你训练完的浮点模型,权重分布长什么样——你可以说先统计了每层权重的最大最小值,发现大部分集中在零点附近、少数离群点很大,所以如果全局定一个scale,小权重全被压成零。这就是为什么常见的做法是权重走per-channel,每个输出通道一个缩放因子,激活走per-tensor,因为激活的动态范围靠校准集统计。接着讲位宽取舍:float32到int8,理论上有256个量化级,但scale定大了有效位数就浪费,等效精度更差。常见现象是第一层和最后一层最敏感,第一层直接吃像素,最后一层直接出框,中间层相对鲁棒。你要是能指出「我在哪一层做了混合精度」或者「最后一层保留高精度」,老师立刻觉得你动过脑子。再往下是硬件侧:int8省DSP、省带宽、并行度能开高,代价是缩放因子要额外存、反量化要额外算。安路EG4S20这块片子资源不算宽裕,被问「为什么不上int16」时,你可以答动态范围统计下来int8够用,int16会翻倍BRAM和DSP占用,得不偿失——前提是你真统计过。如果时间来不及补完整对比实验,最稳妥的补法是拿几百张测试图,分别跑浮点和你定点后的模型,记录人脸框召回率或mAP,把两条曲线画出来。哪怕掉了两三个点,只要你能说清「掉在哪一层、为什么」,就比嘴硬说几乎无损可信得多。答辩不是要你证明无损,是要你证明你测过、你知道代价在哪。你现在的定点方案是逐层统计还是拍了个全局scale?这个决定了你答辩能讲到多细。

我先帮你把答辩老师的意图翻译一下:他问量化和加速,八成不是要你现场推公式,而是想确认三件事——你有没有跑过对比、你知不知道自己网络的瓶颈在哪、你讲的取舍是不是自洽。所以准备的核心不是补知识,是补一条能从头讲到尾的因果链。
链条从你的浮点模型开始。你训练完一个轻量 CNN,权重和激活的数值分布是什么样?常见情况是权重集中在零点附近,少数离群点很大。如果全局定一个 scale,小权重会被直接压成零,精度就掉了。这就是为什么要分权重和激活两条线:权重更适合 per-channel,每个输出通道一个缩放因子,代价是硬件上要多存几组 scale;激活是靠校准集统计动态范围,一般走 per-tensor,因为推理时激活分布相对稳定、实现简单。
接着是位宽取舍。float32 到 int8,理论上有 256 个量化级,但 scale 定大了有效位数就浪费,等效精度更差。你要能说出「我为什么选 int8 不选 int16」——EG4S20 这种规模的片子,DSP 和 BRAM 都紧张,位宽直接决定你能开多大并行度。int8 的乘法累加对 DSP 友好,int16 精度好但资源翻倍,很可能时序收敛不了。
加速这块同理,别背「并行化」三个字。先讲数据流:人脸检测网络里卷积占大头,最朴素的并行是把输出特征图按行切块,交给多组 MAC 同时算,这是空间并行;再往里,一个卷积窗口内的多个乘加可以并行,这是通道内并行。但并行度不是越大越好,上去之后布线拥塞、时序变差,常见做法是取个折中,比如一行同时算 8 到 16 个点。你如果能指出自己网络里哪一层最耗时、为什么,比讲一堆理论有用得多。
最后给个补实验的笨办法:拿几百张测试图,浮点和定点各跑一遍,记录召回率或 mAP,哪怕掉了两三个点,只要你能说清掉在哪一层、为什么,就比嘴硬说「几乎无损」可信。
你现在的模型是哪个 backbone、跑在板子上的帧率大概多少?这决定你答辩时该把重点放在精度还是吞吐上。
发表回答
登录后可在本页底部提交回答