联芸科技嵌入式一面:知识蒸馏怎么设计、INT8 与 FP16 的取舍
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 讲一个记忆最深的项目,说难点和怎么解决的。
- 知识蒸馏是如何设计的?
- INT8 量化与 FP16 有什么区别?
- 如何平衡推理速度与精度?
volatile变量是什么?- cache 一致性是什么?
- 实习工作内容是什么?
- 用过哪些锁,分别起什么作用?
- 信号量池如何设计?
- C++ 多态是什么?
- 抢占式调度是什么?
- 反问。
《参考解析》
知识蒸馏的设计要回答四件事:教师是谁(更大更准的模型)、学生是谁(目标硬件能跑的结构)、蒸馏信号是什么(logits 软标签、中间层特征、注意力图)、损失怎么配(软标签 KL + 硬标签 CE 加权,温度 T 控制软标签的平滑程度)。工程细节:先训教师、冻结后训学生;温度与权重靠小规模实验定;最后在目标数据集上验证掉点。
INT8 与 FP16:FP16 是浮点,动态范围大、无需校准、精度损失小,但需要硬件浮点支持、带宽与算力开销高于 INT8;INT8 是定点,需要校准集确定每层的缩放因子,算力与带宽都更省(常见 2-4 倍加速),代价是离群值敏感的层会明显掉点。选型看硬件是否原生支持 INT8、模型的激活分布、以及可接受的掉点。
速度与精度的平衡:先定硬约束(时延预算、功耗、内存),再按「影响面从大到小」试:结构(骨干/分辨率)、精度(FP16→INT8,逐层混合精度)、工程(算子融合、并行、内存复用)。每一步都用同一套评测集看掉点,只保留收益大于代价的改动。
cache 一致性:多核或 DMA 场景下,CPU cache 与内存可能不一致——DMA 写入内存后 CPU 读到的是 cache 里的旧值(读一致性),CPU 写 cache 未回写时 DMA 读到旧数据(写一致性)。处理方式是 DMA 前后做 clean/invalidate,或把缓冲放在非缓存区。ARM 上对应 SCB_CleanDCache_by_Addr / InvalidateDCache_by_Addr。
信号量池设计:预创建固定数量的信号量对象,用空闲链表管理「借出/归还」,避免运行期动态创建(分配失败与碎片);每个信号量配一个用途标签便于排查;获取失败要有超时与降级路径,防止任务永久阻塞。
C++ 多态:编译期多态(模板、重载)与运行期多态(虚函数 + 虚表)。运行期通过基类指针调用虚函数时,按对象的虚表指针找到实际实现,代价是一次间接跳转与无法内联;嵌入式里要慎用 RTTI 与异常。
抢占式调度:高优先级任务就绪立刻抢占当前任务,靠 SysTick/PendSV 触发上下文切换;要点是临界区要短、共享数据要保护、优先级分配要避免反转(配合优先级继承)。