嵌入式AI岗一面、二面面经
完整信息
本篇目录
面之前,我对自己还是有点信心的。嵌入式基础准备过,板子上也跑过视觉模型,摄像头接进来能出识别结果,怎么也能聊一聊吧。
结果二面问下来,我开始怀疑自己之前理解的“会部署”,是不是有点太宽松了。
我能讲怎么把模型转出来、怎么调用推理接口,但问到量化参数怎么来的、耗时到底花在哪、推理负载上来会不会影响控制任务,就只能讲个大概。面试官再追一句,我脑子里那点东西基本就见底了。
投的是宇树机器人这边的嵌入式AI岗,base杭州,方向偏端侧模型部署。两轮技术面,下面把问题和卡住的地方一起整理一下。
这两轮的重点挺明显:C、内存、操作系统这些要懂,模型在板子上怎么跑、为什么慢、怎么验证优化也得讲得清楚。不能因为自己是嵌入式出身,就把部署那半边全归给算法同学。
我就是嵌入式那半边准备得多,AI部署这边补得太浅,后续二面没过。
一面:技术面,约55分钟
先自我介绍,然后让我挑一个最有挑战的项目。我讲了一个开发板上的视觉识别项目,接摄像头,做预处理,再调用推理框架,最后把识别结果传给后面的业务模块。
平时项目能跑起来,就很容易拿一个好看的FPS当结果。但输入进来多久才能得到可用输出、连续跑时最慢的几帧是什么情况,确实没有认真记过。
项目这块的追问,我整理下来主要是这些:
- 为什么选这个模型?在目标板子上试过哪些方案,最后怎么取舍?
- 模型文件大小和运行时内存占用是一回事吗?中间激活、工作区、输入输出缓冲区算进去了吗?
- 预处理是在CPU上做,还是交给硬件加速?具体做了哪些操作?
- 报的耗时包含哪些阶段?第一次运行和预热后的耗时有没有区别?
- 摄像头来的速度比推理快,帧在队列里越堆越多怎么办?
后面穿插了不少基础题:
- volatile用过哪些场景?访问寄存器和中断共享标志时要注意什么?它能不能代替线程同步?
- static修饰局部变量、全局变量、函数,分别有什么效果?
- 结构体内存对齐,给一个结构体算大小,再问怎么调整成员顺序减少填充。
- 指针和数组有什么区别?数组作为函数参数时,实际传进去的是什么?
- 堆和栈有什么区别?模型权重和中间结果的内存由谁分配、谁释放?
- malloc在嵌入式项目里有哪些风险?内存碎片怎么产生,频繁分配释放有什么问题?
- 浮点和整数运算有什么区别?模型使用INT8量化,有什么收益和代价?
- 大小端怎么判断?解析二进制数据时,字节序不一致会有什么影响?
- 进程和线程的区别。推理任务放线程里,或者拆成独立进程,各有什么考虑?
- cache有什么作用?为什么访问同一批数据,换一种访问顺序,耗时可能就不一样?
基础部分大多数能答,但也没到特别顺的程度。比如volatile,我以前习惯一句“防止编译器优化”就结束,后面才补清楚:它不能直接保证原子性,也不能拿来代替锁或原子操作。
最后手撕一个二维卷积的朴素版本。
没有上来就要求写成框架里的卷积算子,先把输入、卷积核、输出之间的关系写对,别下标越界。一面结束时感觉还行,至少没有完全接不上的一整块。
二面:技术面,约75分钟
先问模型量化:
- 1.INT8量化具体怎么把浮点值映射成整数?scale和zero-point分别干什么?
- 2.对称量化和非对称量化有什么区别?按张量量化和按通道量化又有什么区别?
- 3.量化后精度掉了,从哪几个方向排查?
- 4.训练后量化和量化感知训练有什么区别,各自有什么代价?
- 5.剪枝是什么?结构化和非结构化剪枝,对实际部署有什么不同?
- 6.知识蒸馏大概怎么做?为什么学生模型可能在体积小一些的情况下保留较好的效果?
- 7.算子融合有什么作用?为什么合并一些操作可能提速?
- 8.ONNX在部署链路里起什么作用?导出了ONNX,是不是就能直接在任意板子上跑?
- 9.用过哪些推理框架?TensorRT、TFLite或者芯片厂商的工具,选型要看什么?
- 10.NPU、GPU、CPU各有什么特点?为什么有的模型搬到加速器上,收益没有预想的大?
- 11.从训练好的模型到目标板子上运行,把部署过程完整讲一遍。
- 12.转换后电脑上结果正常,板子上结果不对,你先检查什么?
- 13.一个模型运行很慢,怎么区分瓶颈在计算、内存访问还是数据搬运?
- 14.怎样减少输入输出和中间数据的搬运?
- 15.摄像头到模型输入这一路,零拷贝可以做到什么程度?
- 16.假设推理和实时控制共享计算资源,推理负载突然增大,怎么保证控制任务按时运行?
- 17.多个模型同时跑,怎么安排执行顺序和资源?
- 18.推理结果来晚了,或者某一帧没有结果,上层应该怎么处理?
复盘:有项目,和能把项目讲明白,差得还挺远
后续二面没过。面完难受了一阵,但把问题记下来之后,也能看出准备偏在哪。
我花了不少时间补C和操作系统,AI这边却一直停留在看概念、跑例程。量化、剪枝、融合这些词都认识
如果也是嵌入式出身,准备这种交叉方向,我觉得可以先找一个小模型,把部署链路完整做一遍。保留浮点版本的结果,再试量化版本;用同一批输入比较输出和耗时,把失败日志也留着。模型不用很大,关键是自己真的对照过。
嵌入式基础部分,也可以看看牛客那份《嵌入式软件工程师面试完全指南》,按自己的薄弱项补一补。模型部署这块还得结合目标平台和框架文档动手验证。
https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
这场的题先记到这里。接下来打算把之前那个项目重新测一下。
本篇目录
当前问题0132
- 01
为什么选这个模型?在目标板子上试过哪些方案,最后怎么取舍?
- 02
模型文件大小和运行时内存占用是一回事吗?中间激活、工作区、输入输出缓冲区算进去了吗?
- 03
预处理是在CPU上做,还是交给硬件加速?具体做了哪些操作?
- 04
报的耗时包含哪些阶段?第一次运行和预热后的耗时有没有区别?
- 05
摄像头来的速度比推理快,帧在队列里越堆越多怎么办?
- 06
volatile用过哪些场景?访问寄存器和中断共享标志时要注意什么?它能不能代替线程同步?
- 07
static修饰局部变量、全局变量、函数,分别有什么效果?
- 08
指针和数组有什么区别?数组作为函数参数时,实际传进去的是什么?
- 09
堆和栈有什么区别?模型权重和中间结果的内存由谁分配、谁释放?
- 10
malloc在嵌入式项目里有哪些风险?内存碎片怎么产生,频繁分配释放有什么问题?
- 11
浮点和整数运算有什么区别?模型使用INT8量化,有什么收益和代价?
- 12
大小端怎么判断?解析二进制数据时,字节序不一致会有什么影响?
- 13
进程和线程的区别。推理任务放线程里,或者拆成独立进程,各有什么考虑?
- 14
cache有什么作用?为什么访问同一批数据,换一种访问顺序,耗时可能就不一样?
- 15
最后手撕一个二维卷积的朴素版本。
- 16
INT8量化具体怎么把浮点值映射成整数?scale和zero-point分别干什么?
- 17
对称量化和非对称量化有什么区别?按张量量化和按通道量化又有什么区别?
- 18
量化后精度掉了,从哪几个方向排查?
- 19
训练后量化和量化感知训练有什么区别,各自有什么代价?
- 20
剪枝是什么?结构化和非结构化剪枝,对实际部署有什么不同?
- 21
知识蒸馏大概怎么做?为什么学生模型可能在体积小一些的情况下保留较好的效果?
- 22
算子融合有什么作用?为什么合并一些操作可能提速?
- 23
ONNX在部署链路里起什么作用?导出了ONNX,是不是就能直接在任意板子上跑?
- 24
用过哪些推理框架?TensorRT、TFLite或者芯片厂商的工具,选型要看什么?
- 25
NPU、GPU、CPU各有什么特点?为什么有的模型搬到加速器上,收益没有预想的大?
- 26
转换后电脑上结果正常,板子上结果不对,你先检查什么?
- 27
一个模型运行很慢,怎么区分瓶颈在计算、内存访问还是数据搬运?
- 28
怎样减少输入输出和中间数据的搬运?
- 29
摄像头到模型输入这一路,零拷贝可以做到什么程度?
- 30
假设推理和实时控制共享计算资源,推理负载突然增大,怎么保证控制任务按时运行?
- 31
多个模型同时跑,怎么安排执行顺序和资源?
- 32
推理结果来晚了,或者某一帧没有结果,上层应该怎么处理?