想象一下,你要把一位“AI 人脸识别大专家”请进一个登机箱大小的出租屋。这位专家在云端大机房上班时,身边有几百 GB 的存储、几十块显卡和永不断电的机房;可手机和摄像头只有几 GB 内存、一块指甲盖大的芯片、一块可能随时没电的电池。让专家在这么小的环境里工作,不是魔法,而是一门“打包搬家”的工程学。这篇文章会带你把这门工程彻底拆开看:先看边缘设备的“房间”到底有多小;再看怎么给专家的行李瘦身——剪掉用不上的旧物、把大件换成轻便压缩品、让老专家带出高徒;最后选一只顺手的行李箱(推理框架),并在精度、速度、功耗之间找到平衡。一路看下来,你就会彻底明白,人脸识别到底是怎么跑进手机和摄像头的。

岗位关联

掌握边缘端人脸识别部署能力,是 AI 工程师从“会训练模型”走向“能让模型真正量产”的关键分水岭。学完这篇,你将能独立评估并实施一个端侧人脸识别方案。

目录
  1. 可视化演示
  2. 边缘部署挑战:先看小房间有多大
  3. 模型压缩瘦身:先给行李箱减负
  4. 参数剪枝减负:扔掉用不上的旧物
  5. 量化加速推理:把大件换成轻便款
  6. 知识蒸馏传承:老师傅带出小徒弟
  7. 推理框架选型:挑一个顺手的行李箱
  8. 部署综合调优:装好行李还要边走边调
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示人脸识别模型从云端压缩到边缘设备部署的全流程,含量化剪枝、知识蒸馏与端侧推理框架选型的关键指标对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

云端到边缘端部署流程 云端大模型经压缩后部署到边缘设备 量化剪枝蒸馏三步压缩 pipeline Cloud → Compress → Edge 边缘部署实现低延迟低功耗人脸识别

边缘部署挑战:先看小房间有多大

AI 人脸识别专家在云端时,住的是“大别墅”:几十块显卡随便调用,内存按 GB 计,电费不用担心。可要搬进手机和摄像头,就像把全套家具塞进一个登机箱大小的出租屋。搬家前你做的第一件事,一定是拿尺子量一量新房间的门和墙面,搞清楚到底能放下多少东西。边缘设备就是这么个小房间:CPU 只有几个核、内存往往不到 1GB、电池电量以毫安时计算,却要求人脸识别在几百毫秒内完成。

把镜头拉近到技术视角,所谓“搬进设备”就是把训练好的深度模型部署到端侧芯片上运行。人脸识别模型动辄数百万到数千万个参数,一个典型的 1000 万参数模型,用 32 位浮点保存,体积就要几十 MB。而手机 App 分给模型的运行内存常常只有几 MB 到十几 MB,安防摄像头的主控芯片算力更是远低于服务器。于是算力受限、内存瓶颈、功耗约束、实时性要求,这四堵墙把“搬家路线”卡得死死的。

好在这四堵墙并非不可翻越。要判断模型到底有多大、该从哪里减负,可以先用一个非常简单的公式估算模型的存储占用。参数总量乘以每个参数的位宽,再除以 8,就是模型权重占用的字节数:

量完房间尺寸,结论很清楚:必须给模型“打包瘦身”。接下来几节,我们会依次打开剪刀(剪枝)、压缩袋(量化)和拜师学艺(蒸馏)这三样打包工具,一步步让大模型轻到能进门。

S=N×B8S = \frac{N \times B}{8}
这个公式把“模型体积”拆成了两个可操作的变量:参数量 N 和位宽 B。想让模型变小,要么减少 N,要么降低 B——这正是后面剪枝和量化要做的事。
  1. 统计参数量 N模型里所有卷积核和偏置的个数总和,N 越大模型越“胖”。
    N=∑l=1LnlN = \sum_{l=1}^{L} n_l
  2. 确认位宽 B每个参数用多少比特存储,普通训练常用 32 位浮点,即 B=32。
    B=32 bitB = 32\ \mathrm{bit}
  3. 换算成字节8 个比特等于 1 字节,所以总字节数要除以 8。
    S=N×B8 (Byte)S = \frac{N \times B}{8}\ (\mathrm{Byte})

模型压缩瘦身:先给行李箱减负

搬家分拣行李时,你会先做三件事:扔掉十年不穿的旧衣服、用真空压缩袋把羽绒服压扁、让经验丰富的长辈把“哪些东西必须带”的经验告诉孩子。对应到模型压缩,这三件事恰好就是剪枝、量化和蒸馏——它们是端侧部署最常用的“行李箱打包三件套”。压缩的核心不是把模型随意变小,而是在尽量保住“认人能力”的前提下,去掉冗余。

从技术上说,模型里很多权重对最终识别结果贡献极小,网络结构本身也存在大量冗余参数。压缩的直观指标是“压缩率”:压缩后的体积与原始体积的比值。一个优秀的人脸识别端侧方案,通常能把模型压缩到原来的 10% 到 30%,同时维持 95% 以上的识别精度。压缩率不是越低越好,压得过头,模型可能把两张不同的人脸认成同一个人。

为了量化压缩效果,我们定义压缩率 R 为压缩后体积与压缩前体积的比值:

真空压缩袋虽好,却不能把钢琴也压成薄片。剪枝、量化和蒸馏各有适用场景,下面三节逐一拆解,看看每件工具到底怎么用。

R=VafterVbeforeR = \frac{V_{\text{after}}}{V_{\text{before}}}
R 越小代表压缩得越狠。比如 R=0.2 表示模型体积只剩原来的五分之一。但压缩率要和精度一起看,单看体积没意义。
  1. 压缩前体积原始 float32 模型的存储占用,通常用 MB 表示,作为分母基准。
    Vbefore=∑l=1LSlV_{\text{before}} = \sum_{l=1}^{L} S_l
  2. 压缩后体积经过剪枝、量化、蒸馏之后新模型的存储占用。
    Vafter=∑l=1LSl(new)V_{\text{after}} = \sum_{l=1}^{L} S_l^{\text{(new)}}
  3. 求压缩比两者相减再除以原体积,直观看出“瘦身了多少”。
    R=VafterVbeforeR = \frac{V_{\text{after}}}{V_{\text{before}}}

参数剪枝减负:扔掉用不上的旧物

收拾行李时最痛快的时刻,是把那些压箱底、一年都用不上的旧衣服果断扔进回收袋。模型剪枝做的就是这件事:把网络中“不重要”的权重直接置零并移除。问题来了,怎么判断哪个权重不重要?一个朴素而有效的思路是看权重绝对值的大小——绝对值越小,说明它对输出的影响越弱,删掉它损失最小。

技术上,剪枝分两种粒度。细粒度的“权重剪枝”把单个权重置零,矩阵会变得稀疏,但形状不规整,普通硬件很难加速;粗粒度的“通道剪枝”则把整个卷积通道删掉,网络结构变得规整,CPU 和 NPU 都能高效执行,所以端侧部署更偏爱通道剪枝。剪完之后的网络还要“重新训练”(微调)一段时间,让剩下的参数把被删掉的损失补回来。

剪枝的成都用一个叫“稀疏度”的指标来描述——被置零的权重数占总权重数的比例。稀疏度越高,模型越“骨感”:

扔衣服也有风险:万一下个月突然要穿呢?所以剪枝之后必须微调,让模型“适应”没有那些参数的生活。下一节再给剩下的行李套上压缩袋。

s=NzeroNtotals = \frac{N_{\text{zero}}}{N_{\text{total}}}
s=0 表示没有剪枝,s=0.8 表示 80% 的权重被置零。对端侧部署来说,更重要的是“结构化稀疏”——剪得整整齐齐,硬件才跑得快。
  1. 统计总权重把网络里所有层的参数量相加,得到分母。
    Ntotal=∑l=1LnlN_{\text{total}} = \sum_{l=1}^{L} n_l
  2. 统计零权重剪枝后绝对值被置为零的权重个数,这些就是被“扔掉”的旧物。
    Nzero=∣{w∣w=0}∣N_{\text{zero}} = \left|\{w \mid w = 0\}\right|
  3. 求稀疏度零权重占比越高,模型越稀疏,存储和计算越省。
    s=NzeroNtotals = \frac{N_{\text{zero}}}{N_{\text{total}}}

量化加速推理:把大件换成轻便款

搬过家的人都知道,同样一床羽绒被,塞进真空压缩袋后体积能小一大半。量化做的正是这件事:把模型里精雕细琢的 32 位浮点数(float32),换成更粗糙但体积只有四分之一的 8 位整数(int8)。32 位浮点能表达的数值精度极高,但端侧设备其实并不需要每个权重都精确到小数点后七八位;就像旅行箱里的衣服,叠整齐就行,不必每件都熨烫出折痕。

量化的核心是一个映射公式。给定一组浮点权重,找出它们的最大值和最小值,然后把这段范围均匀切分成 255 份,每一份的宽度就是“缩放系数” scale。量化时把每个浮点数除以 scale 并取整,就得到 0 到 255 之间的整数;反量化时再乘回 scale,就得到一个和原值非常接近的近似值。这个过程会有精度损失,但配合一小批“校准数据”来统计数值范围、选择合适的量化边界,精度损失通常能控制在 1% 以内。

其中缩放系数的计算是量化的第一步:

压缩袋虽好,可如果压得太猛,羽绒服会被压出死褶,再也蓬松不起来。量化也是同样的道理:位宽越低误差越大,所以很多方案采用“混合精度”——敏感层保持 16 位,冗余层降到 8 位。压缩之外,还有一条传承的路:让老专家带个徒弟。

scale=fmax⁡−fmin⁡2B−1\text{scale} = \frac{f_{\max} - f_{\min}}{2^{B} - 1}
B 是量化位宽,B=8 时分母就是 255。scale 相当于“每一格代表多大”的刻度尺,决定了量化后的分辨率。
  1. 找数值范围统计权重的最大最小值,差值是整个要映射的区间。
    Δ=fmax⁡−fmin⁡\Delta = f_{\max} - f_{\min}
  2. 确定格数B 位整数能表示 2 的 B 次方个级别,去掉起点后间隔数是 2^B - 1。
    Llevel=2B−1L_{\text{level}} = 2^{B} - 1
  3. 计算刻度区间宽度除以格数,得到每个整数代表的浮点大小。
    scale=ΔLlevel\text{scale} = \frac{\Delta}{L_{\text{level}}}

知识蒸馏传承:老师傅带出小徒弟

行李箱空间实在有限,老专家本人挤不进去,但他可以带一个“小徒弟”进去。徒弟不需要随身携带师父的全部资料,只要把师父判断人脸的本事学到手就行。知识蒸馏就是这么一种传承技术:先用一个大而强的“教师模型”在训练数据上学到丰富的知识,再让小体积的“学生模型”模仿教师的行为,最终学生模型接替教师上岗。

小徒弟怎么学?不只是背答案(预测的类别),更要学老师的“解题思路”——也就是老师给出的概率分布,即“软标签”。比如面对一张脸,教师模型会说“99% 是张三、0.8% 是李四、0.2% 是王五”,这组分布里藏着类与类之间的细微关系,比单纯一个“张三”的硬标签信息量大得多。为了让软标签更“软”,训练时还会加一个“温度”参数,温度越高,概率分布越均匀,徒弟能看到的细节越多。

学生模型的训练目标,是同时模仿真实标签和教师输出,用一条混合损失来平衡:

小徒弟出师后,行李只剩一件随身背包。接下来要做的,是给这位小专家挑一只真正顺手的行李箱——也就是跑模型的推理框架。

L=α⋅Lhard+(1−α)⋅LsoftL = \alpha \cdot L_{\text{hard}} + (1 - \alpha) \cdot L_{\text{soft}}
L_hard 是学生模型和真实标签之间的交叉熵,L_soft 是学生和教师软标签之间的 KL 散度。α 控制“学标准答案”和“学老师思路”的权重。
  1. 硬损失学生模型与真实身份标签的交叉熵,保证最基本的分对。
    Lhard=−∑c=1Cyclog⁡pcL_{\text{hard}} = -\sum_{c=1}^{C} y_c \log p_c
  2. 软损失学生模型概率与教师软标签的 KL 散度,让学生的“思路”逼近老师。
    Lsoft=∑c=1Cpc(t)log⁡pc(t)pc(s)L_{\text{soft}} = \sum_{c=1}^{C} p^{(t)}_c \log \frac{p^{(t)}_c}{p^{(s)}_c}
  3. 加权组合α 在 0 到 1 之间,调大 α 更注重真实标签,调小则更依赖老师。
    L=α⋅Lhard+(1−α)⋅LsoftL = \alpha \cdot L_{\text{hard}} + (1 - \alpha) \cdot L_{\text{soft}}

推理框架选型:挑一个顺手的行李箱

行李打包好了,可如果行李箱的拉链是坏的、轮子不转,这一路照样寸步难行。推理框架就是那只看不见的手:它负责把训练好的模型翻译成能在端侧硬件上高效运行的代码。框架选得好,模型跑得又快又省;选得不好,再小的模型也会被折腾得又卡又烫。市面上的行李箱各有侧重,关键要看你要去哪里、坐什么交通工具。

端侧人脸识别常用的推理框架有四个:TFLite 是谷歌出品,Android 手机生态加持,还支持 EdgeTPU 加速;NCNN 是腾讯开源的高性能神经网络前向计算框架,以纯 CPU 优化见长,非常适合国产安卓设备;MNN 是阿里的移动端推理引擎,对 ARM CPU 和 GPU 都有深度优化;TensorRT 是英伟达的推理优化器,专门吃透自家 GPU 的特性,适用于带 NVIDIA 芯片的摄像头盒子。选型时优先看三个维度:算子是否全覆盖、硬件加速是否到位、内存占用是否可控。

选型的最终目标只有一个——让推理快到人眼感觉不到延迟。每秒能处理多少帧,由单帧推理耗时决定:

好箱子还要会装东西。选完框架只是第一步,真正让模型在设备上顺畅跑起来,还需要做最后的综合调优。

FPS=1tinfer\text{FPS} = \frac{1}{t_{\text{infer}}}
FPS 是帧率,t_infer 是处理一帧人脸图像的总耗时。摄像头场景通常要求 25 帧以上,手机解锁则要求 200 毫秒内出结果。
  1. 拆分耗时一帧的总耗时包括图像前处理、骨干网络推理、后处理三部分。
    tinfer=t前处理+t骨干+t后处理t_{\text{infer}} = t_{\text{前处理}} + t_{\text{骨干}} + t_{\text{后处理}}
  2. 取倒数每秒能完成的帧数等于单帧耗时的倒数。
    FPS=1tinfer\text{FPS} = \frac{1}{t_{\text{infer}}}

部署综合调优:装好行李还要边走边调

行李装好了,但真正背着它走起来,你还会发现肩带勒得疼、轮子有点涩,得边走边调。边缘端部署同样如此:模型导进去只是开始,后面还有一连串“工程手感”要打磨——怎么把计算分给 NPU 和 DSP?怎么让内存不爆?怎么控制发热和耗电?精度、速度、功耗三者怎样取舍?

硬件加速是第一件大事:把卷积、矩阵乘法这些重活交给 NPU 或 DSP,CPU 只做调度和预处理,识别速度能提升好几倍。内存优化讲究“精打细算”:用内存池复用中间张量、把相邻算子融合成一次计算、避免重复拷贝,都能显著减少峰值内存。功耗控制则更细:降低芯片频率、在无人时进入睡眠、用事件唤醒替代持续运行,能让摄像头盒子在电池供电下撑过一整天。

调优不能只盯一个指标。一个实用的评估思路,是给需求打分——精度越高越好,延迟和功耗越低越好。三者综合起来,就得到一个“部署得分”:

到这里,“AI 大专家”终于被安顿进了那只小行李箱:压缩袋压过了、冗余扔掉了、小徒弟接班了、行李箱顺滑了。现在,一台普通的手机或摄像头,就能在离线状态下毫秒级认出你的脸。

Score=AccLatency×Power\text{Score} = \frac{\text{Acc}}{\text{Latency} \times \text{Power}}
Acc 是识别准确率,Latency 是单帧延迟,Power 是平均功耗。这个分数越高,说明方案在精度、速度、功耗三方面的综合表现越好。
  1. 识别精度模型在测试集上识别正确的比例,是“认得准不准”的度量。
    Acc=识别正确数测试总数\text{Acc} = \frac{\text{识别正确数}}{\text{测试总数}}
  2. 延迟与功耗延迟越低、功耗越小,越适合边缘场景,但通常需要牺牲部分精度。
    Latency×Power\text{Latency} \times \text{Power}
  3. 综合得分精度做分子,延迟和功耗做分母,得分越高方案越均衡。
    Score=AccLatency×Power\text{Score} = \frac{\text{Acc}}{\text{Latency} \times \text{Power}}

AI 应用场景

智能门禁摄像头:把大模型装进小镜头

阶段:模型部署 / 推理优化

解决的问题:传统门禁依赖云端比对,每次开门都要上传人脸到服务器,延迟高、隐私风险大,网络一断就瘫痪。通过边缘端部署,把压缩后的识别模型直接跑在摄像头内置芯片上,人脸在本地完成识别,几十毫秒出结果,断网也能用。

具体案例:某小区改造门禁系统,原来使用云端人脸比对,平均响应 800 毫秒,高峰期排队明显。工程师把 MobileFaceNet 模型做 INT8 量化加通道剪枝,体积从 40MB 压到 4.5MB,部署到摄像头板载 NPU 后,识别延迟降到 80 毫秒,实测准确率仅下降 0.3%。

手机 App 离线人脸解锁

阶段:端侧推理 / 隐私保护

解决的问题:手机人脸解锁要求数据绝不出设备,同时必须在极短时间内完成活体检测和人脸比对。云端方案完全不可行,只能把识别模型部署在手机本地。

具体案例:一款移动支付 App 上线离线人脸登录功能,使用 TFLite 作为推理框架,配合 NPU 加速,模型权重用 8 位量化存储。在骁龙中端芯片上,人脸检测加特征比对总耗时 120 毫秒,模型体积仅 2.8MB,用户无感完成解锁。

低功耗智能门锁

阶段:功耗控制 / 低功耗推理

解决的问题:智能门锁靠干电池供电,待机功耗要用微安算,不能像手机一样随时“满血跑模型”。需要事件唤醒加超低功耗推理的完整方案。

具体案例:某智能门锁采用 NCNN 框架部署轻量化人脸模型,平时 DSP 处于睡眠模式,只有人体红外传感器触发时才唤醒。每次识别耗电仅 0.5 毫安时,四节五号电池可撑 10 个月,识别速度保持在 300 毫秒以内。

Python 演示

python65 行
import numpy as np  class EdgeFaceDeployer:    """边缘端人脸识别部署演示:注册特征库 + 量化 + 剪枝 + 体积预估"""     def __init__(self, dim=128):        self.dim = dim        self.enroll_embeddings = None        self.enroll_labels = []        self.threshold = 0.6     def enroll(self, name, embedding):        if self.enroll_embeddings is None:            self.enroll_embeddings = np.array([embedding], dtype=np.float32)        else:            self.enroll_embeddings = np.vstack([self.enroll_embeddings, embedding])        self.enroll_labels.append(name)     def recognize(self, embedding):        dists = np.linalg.norm(self.enroll_embeddings - embedding, axis=1)        idx = int(np.argmin(dists))        return self.enroll_labels[idx], float(dists[idx])     def quantize_weights(self, weights, bits=8):        fmin, fmax = float(weights.min()), float(weights.max())        scale = (fmax - fmin) / (2 ** bits - 1)        zero_point = round(-fmin / scale)        q = np.clip(np.round(weights / scale) + zero_point, 0, 2 ** bits - 1)        dequant = (q - zero_point) * scale        return q.astype(np.uint8), dequant     def prune_weights(self, weights, ratio=0.5):        thr = np.quantile(np.abs(weights), ratio)        mask = np.abs(weights) >= thr        return weights * mask, mask     def estimate_size(self, param_count, bits):        return param_count * bits / 8.0  def main():    rng = np.random.default_rng(42)    deployer = EdgeFaceDeployer(dim=128)    names = ["Alice", "Bob", "Carol"]    for name in names:        deployer.enroll(name, rng.normal(size=128).astype(np.float32))     query = rng.normal(size=128).astype(np.float32)    _, dq = deployer.quantize_weights(query)    name, dist = deployer.recognize(dq.astype(np.float32))    print("识别结果:", name, "欧氏距离:", round(dist, 4))     weights = rng.normal(size=(64, 128)).astype(np.float32)    pruned, mask = deployer.prune_weights(weights, ratio=0.5)    pct = 100 * (1 - mask.mean())    print("剪枝比例: %.1f%%" % pct)    before = deployer.estimate_size(weights.size, 32)    after = deployer.estimate_size(int(mask.sum()), 8)    print("模型体积: %.2f KB -> %.2f KB (节省 %.1f%%)"          % (before / 1024, after / 1024, 100 * (1 - after / before)))  if __name__ == "__main__":    main()
目的:模拟边缘端人脸识别落地的三个关键动作——注册人脸特征库、对权重做 INT8 量化、按阈值剪枝,并估算模型体积节省比例。
  1. self.enroll_embeddings = np.vstack([self.enroll_embeddings, embedding])把新注册人脸的特征向量追加进特征库,每张脸用 128 维向量表示
  2. dists = np.linalg.norm(self.enroll_embeddings - embedding, axis=1)把待识别人脸和库中所有人比较欧氏距离,距离最小者即最像
  3. idx = int(np.argmin(dists))找到最近邻居的下标,再返回对应姓名
  4. scale = (fmax - fmin) / (2 ** bits - 1)计算量化步长,等价于正文里的 scale 公式
  5. q = np.clip(np.round(weights / scale) + zero_point, 0, 2 ** bits - 1)把浮点权重映射成 0-255 的整数,超出范围的值被截断
  6. dequant = (q - zero_point) * scale反量化出近似原值的浮点数,检验量化损失
  7. thr = np.quantile(np.abs(weights), ratio)取绝对值分布的分位数作为剪枝阈值,比阈值小的权重被顺手扔掉

常见误区

误区初学者以为剪枝很简单,把权重矩阵里一半的数字直接改成 0 就算剪完了。这样做模型确实变小了,但精度往往瞬间崩盘。

正解剪枝必须“看菜下饭”:先按权重绝对值大小或梯度等信息评估每个参数的重要性,删除影响小的,保留关键结构。而且剪完必须做微调训练,让剩余权重重新适应。就像扔旧衣服也要先看哪些还能穿,而不是闭眼扔一半。

为何常见:因为剪枝的最终效果看起来就是“矩阵变稀疏”,容易让人误解为随便置零。实际工程中评估重要性和微调才是最花时间的部分。

误区“int8 损失那么多精度,人脸识别肯定不准了,还是老老实实用 float32 吧。”很多初学者一听到量化就摇头。

正解只要选好校准数据、合理设置数值范围和量化边界,INT8 量化的人脸识别模型精度损失通常能控制在 1% 以内。尤其在端侧,量化后模型变小、变快,还能上 NPU,综合收益远超那一点点精度损失。就像真空压缩羽绒服,压完保暖性几乎不变。

为何常见:因为从 32 位降到 8 位听起来损失巨大,大家下意识以为信息丢了一半以上。实际上浮点数里大量低位信息本身是噪声,量化只是把噪声抹掉了。

误区“我用 TFLite 导出个 .tflite 文件拷进手机,不就部署完了吗?”这是最常见的翻车现场。

正解真正的边缘部署是系统工程:要确认算子被框架完整支持,要把大算子拆到 NPU 上跑,要处理内存峰值和发热降频,还要做功耗策略。文件转换只是打开了行李箱,里面的衣服怎么叠、怎么分配空间,才是决定旅行体验的关键。

为何常见:因为转换工具做得越来越一键化,让人误以为后面没有工作了。实际工作中部署调优常常占整个项目一半以上的时间。

误区“压缩率越高不是越厉害吗?干脆把模型压到 1MB 以内。”有人为了追求极致体积,把剪枝和量化参数调到最狠。

正解压缩是有极限的。压过头后,模型会失去区分相似人脸的能力,出现高误识率;在安防场景,一次错认比慢 100 毫秒严重得多。正确做法是用“精度-体积曲线”找到拐点,在可接受的精度损失范围内取最小体积。

为何常见:因为初学时容易把“模型小”当成唯一目标,忽略了业务场景真正关心的是识别准确率和误报率。优化从来是取舍,不是单点极致。

面试题

Q1. 把训练好的大模型部署到手机和摄像头上,最先要面对的限制是什么?

单选题 · easy

  • A.算力和内存资源有限← 正确答案
  • B.训练数据无法使用
  • C.摄像头没有像素
  • D.模型语言是英文

答案:A。边缘设备最大的约束是本地的算力、内存、功耗都很有限,模型再强也装不进去、跑不动。B、C、D 都属于“不可能发生的干扰项”。就像搬家先看房间大小,部署先看设备资源。

Q2. 模型剪枝的核心做法是什么?

单选题 · easy

  • A.把输入图像整体缩小
  • B.删除影响小的权重← 正确答案
  • C.增加模型的层数
  • D.用更大批数据训练

答案:B。剪枝的本质是“扔旧物”——把网络里对输出影响小的权重或通道删除。A 是降低输入分辨率,C 让模型变大,D 是提升数据量,都和剪枝无关。

Q3. 将 float32 权重改成 int8 存储,理论体积减少多少?

单选题 · easy

  • A.八分之一
  • B.四分之一← 正确答案
  • C.二分之一
  • D.四倍

答案:B。float32 是 4 字节,int8 是 1 字节,所以体积变为原来的四分之一。这就像把四件厚外套压成一件的厚度,量化的直接收益就是体积除以 4。

Q4. 在知识蒸馏训练中,学生模型主要学习的是什么?

单选题 · mid

  • A.教师模型对样本的软性输出← 正确答案
  • B.训练数据的原始文件内容
  • C.教师模型的网络层参数
  • D.训练时的硬件运行功耗

答案:A。蒸馏的核心是让学生模仿教师的软标签——也就是教师输出的概率分布,里面藏着类间相似度信息。学生不直接复制教师参数,也不关心硬件功耗,只学“判断思路”。

Q5. 推理框架 TensorRT 最适合用在哪种端侧设备?

单选题 · mid

  • A.英伟达 GPU 的边缘盒子← 正确答案
  • B.低端安卓手机设备
  • C.无操作系统单片机
  • D.纯云端 CPU 服务器

答案:A。TensorRT 是英伟达为自家 GPU 深度优化的推理引擎,在带 NVIDIA 芯片的边缘盒子上能榨干 GPU 算力。手机、单片机和纯 CPU 场景更适合 TFLite、NCNN 这类框架。

Q6. 关于 8bit 权重量化,下列说法正确的是?

多选题 · mid

  • A.参数体积约为原来的四分之一← 正确答案
  • B.通常需要校准数据控制误差← 正确答案
  • C.精度相比浮点模型一定会提高
  • D.可以减少端侧内存带宽占用← 正确答案

答案:ABD。int8 只有 1 字节,所以体积是 fp32 的四分之一,内存带宽也同步降低;量化前需要用校准数据统计数值范围来控制误差。量化的精度通常略降而非提高,C 错。

Q7. 端侧推理框架选型时,最关键的标准是什么?

单选题 · mid

  • A.算子覆盖与硬件加速能力← 正确答案
  • B.框架名字是否响亮
  • C.开发者数量有多少
  • D.版本号是否大于 1.0

答案:A。选框架要先看它支持的算子是否够全、能否调用 NPU/GPU 加速。名字、社区热度和版本号只能做辅助参考,算子都不支持、加速跑不起来,再热闹也没用。

Q8. 结构化剪枝相比非结构化剪枝的优势是什么?

单选题 · hard

  • A.硬件友好可加速推理← 正确答案
  • B.裁剪后无需重新训练
  • C.不删除任何网络参数
  • D.只适用于全连接网络

答案:A。结构化剪枝删的是整个通道或滤波器,网络形状规整,CPU 和 NPU 都能高效执行;但它仍然需要剪后微调,B 错。C 与剪枝定义矛盾,D 也不对,卷积网络同样适用。

Q9. 下列哪些属于端侧模型压缩的常用方法?

多选题 · hard

  • A.参数剪枝去除冗余连接← 正确答案
  • B.权重量化降低存储位宽← 正确答案
  • C.知识蒸馏训练轻量学生模型← 正确答案
  • D.扩大训练集提升模型能力

答案:ABC。剪枝、量化、蒸馏是端侧部署的“打包三件套”,都能直接减小模型。扩大训练集提升的是模型能力,不改变模型体积,所以不算压缩方法。

Q10. 某摄像头 NPU 可分配内存 16MB,模型参数量 1000 万,以 int8 部署时权重需约占多少内存?

单选题 · extreme

  • A.约 10MB,可以勉强放下← 正确答案
  • B.约 80MB,远远超出限制
  • C.约 320MB,完全无法部署
  • D.约 1.6MB,剩余空间充足

答案:A。1000 万参数 × 1 字节 = 1000 万字节 ≈ 10MB,小于 16MB 限制,可以部署但剩余空间不多。B 是 1000 万×8 字节,C 是×32 字节,D 是误以为 int8 只占 1/6 字节,都不对。