宇树机器人

嵌入式AI岗一面、二面面经

完整信息

32 条问法 · 34 道题

本篇目录

面之前,我对自己还是有点信心的。嵌入式基础准备过,板子上也跑过视觉模型,摄像头接进来能出识别结果,怎么也能聊一聊吧。

结果二面问下来,我开始怀疑自己之前理解的“会部署”,是不是有点太宽松了。

我能讲怎么把模型转出来、怎么调用推理接口,但问到量化参数怎么来的、耗时到底花在哪、推理负载上来会不会影响控制任务,就只能讲个大概。面试官再追一句,我脑子里那点东西基本就见底了。

投的是宇树机器人这边的嵌入式AI岗,base杭州,方向偏端侧模型部署。两轮技术面,下面把问题和卡住的地方一起整理一下。

这两轮的重点挺明显:C、内存、操作系统这些要懂,模型在板子上怎么跑、为什么慢、怎么验证优化也得讲得清楚。不能因为自己是嵌入式出身,就把部署那半边全归给算法同学。

我就是嵌入式那半边准备得多,AI部署这边补得太浅,后续二面没过。

一面:技术面,约55分钟

先自我介绍,然后让我挑一个最有挑战的项目。我讲了一个开发板上的视觉识别项目,接摄像头,做预处理,再调用推理框架,最后把识别结果传给后面的业务模块。

平时项目能跑起来,就很容易拿一个好看的FPS当结果。但输入进来多久才能得到可用输出、连续跑时最慢的几帧是什么情况,确实没有认真记过。

项目这块的追问,我整理下来主要是这些:

  1. 为什么选这个模型?在目标板子上试过哪些方案,最后怎么取舍?
  2. 模型文件大小和运行时内存占用是一回事吗?中间激活、工作区、输入输出缓冲区算进去了吗?
  3. 预处理是在CPU上做,还是交给硬件加速?具体做了哪些操作?
  4. 报的耗时包含哪些阶段?第一次运行和预热后的耗时有没有区别?
  5. 摄像头来的速度比推理快,帧在队列里越堆越多怎么办?

后面穿插了不少基础题:

  1. volatile用过哪些场景?访问寄存器和中断共享标志时要注意什么?它能不能代替线程同步?
  2. static修饰局部变量、全局变量、函数,分别有什么效果?
  3. 结构体内存对齐,给一个结构体算大小,再问怎么调整成员顺序减少填充。
  4. 指针和数组有什么区别?数组作为函数参数时,实际传进去的是什么?
  5. 堆和栈有什么区别?模型权重和中间结果的内存由谁分配、谁释放?
  6. malloc在嵌入式项目里有哪些风险?内存碎片怎么产生,频繁分配释放有什么问题?
  7. 浮点和整数运算有什么区别?模型使用INT8量化,有什么收益和代价?
  8. 大小端怎么判断?解析二进制数据时,字节序不一致会有什么影响?
  9. 进程和线程的区别。推理任务放线程里,或者拆成独立进程,各有什么考虑?
  10. 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

这场的题先记到这里。接下来打算把之前那个项目重新测一下。

本篇目录
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06
    volatile用过哪些场景?访问寄存器和中断共享标志时要注意什么?它能不能代替线程同步?
  7. 07
  8. 08
  9. 09
  10. 10
  11. 11
  12. 12
    大小端怎么判断?解析二进制数据时,字节序不一致会有什么影响?
  13. 13
    进程和线程的区别。推理任务放线程里,或者拆成独立进程,各有什么考虑?
  14. 14
    cache有什么作用?为什么访问同一批数据,换一种访问顺序,耗时可能就不一样?
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
    知识蒸馏大概怎么做?为什么学生模型可能在体积小一些的情况下保留较好的效果?
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32

同作者面经

相关公司