地平线自动驾驶芯片算法面试经历:模型量化+部署优化+端侧推理全考察
2年模型部署经验,详细复盘地平线三轮技术面试全过程,涵盖深度学习基础、量化原理、TensorRT部署、端侧推理优化等核心考点,附真题汇总与备考建议。
背景介绍
我本科自动化专业,研究生方向是计算机视觉,毕业后在一家自动驾驶公司做了2年的模型部署工程师。主要工作是模型量化、蒸馏和端侧部署,用的芯片包括地平线BPU和NVIDIA Orin。地平线在自动驾驶芯片领域是绝对的头部,所以看到他们招算法工程师,我第一时间就投了。
说实话,投递之前我犹豫了一下,因为地平线对算法能力的要求比纯部署岗位高很多,而我的强项更多在工程落地。但转念一想,模型部署和算法本身就不分家,而且我对量化、推理优化这些也有实战经验,应该还是有竞争力的。大概等了10天左右,HR联系我约面试,一共三轮技术面。
面试流程复盘
一面:深度学习基础+量化原理(约1小时)
一面是一位年轻的算法工程师,看起来刚工作没几年,但问题问得很犀利。先让我自我介绍,然后就开始了。
深度学习基础:
第一个问题就让我有点措手不及——"请说说BatchNorm的原理,以及训练和推理时BN的行为有什么不同?"这个我答得还行,训练时用mini-batch的均值和方差,推理时用running mean和running var。面试官追问了"BN的running mean是怎么更新的?"我说了momentum参数和指数移动平均,面试官点了点头。
然后是激活函数——"ReLU和GELU的区别?为什么Transformer用GELU不用ReLU?"我说GELU是平滑的ReLU变体,在零点附近有平滑过渡,对梯度流更友好。Transformer用GELU是因为实验效果更好,特别是在大模型上。面试官追问了"SwiGLU呢?"这个我了解不多,只说了是GLU的变体,用了SiLU激活。
接着是注意力机制——"请说说Multi-Head Attention的计算过程?QKV是怎么得到的?"我从线性投影得到QKV,然后scaled dot-product attention,最后concat和线性变换,一步步说了。面试官追问了"为什么要除以sqrt(d_k)?"我说防止点积值过大导致softmax梯度消失。
还问了损失函数——"交叉熵损失和KL散度的关系?Focal Loss解决什么问题?"我说交叉熵可以看作KL散度的特例,Focal Loss通过降低easy sample的权重来解决类别不平衡问题。
量化原理:
面试官问的第一个量化问题是"量化的基本原理是什么?均匀量化和非均匀量化的区别?"我说量化就是把浮点数映射到低比特整数,均匀量化是等间距映射,非均匀量化可以不等间距。面试官追问了"对称量化和非对称量化的区别?各自的优缺点?"我说对称量化zero point为0,计算简单;非对称量化有zero point,可以更好地利用量化范围。
然后是INT8量化的具体流程——"PTQ和QAT的区别?各自的适用场景?"我说PTQ不需要重训练,速度快但精度可能有损失;QAT需要在训练中模拟量化,精度更好但成本更高。面试官追问了"PTQ的校准数据怎么选?校准方法有哪些?"我说校准数据要和实际推理数据分布一致,校准方法有min-max、percentile、entropy(KL散度)等。
还问到了per-channel和per-tensor量化的区别,以及为什么per-channel量化效果更好。我说per-channel对每个通道有独立的scale和zero point,可以更好地适应不同通道的值域分布差异。
一面结束的时候,面试官说"基础还可以,量化部分答得不错",让我等二面通知。
二面:模型部署+TensorRT(约1.5小时)
二面是一位资深工程师,问题更偏实战。
开场就问了一个很实际的问题——"请说说你做过的最复杂的模型部署项目"。我选了之前做的一个BEV感知模型的部署,从PyTorch模型导出ONNX,然后转TensorRT engine,中间遇到了各种算子兼容性问题。面试官追问了"具体遇到了哪些算子不兼容?怎么解决的?"我说了自定义插件的开发流程,包括插件的注册、序列化和反序列化。
然后是TensorRT的优化——"TensorRT做了哪些优化?为什么推理速度能快这么多?"我列了层融合、精度校准、kernel自动选择、动态形状优化几个方面。面试官特别追问了层融合——"哪些层可以融合?融合的规则是什么?"我说了conv+bn+relu融合、element-wise融合、shuffle层消除等,融合规则基于数据依赖和计算等价性。
接着是动态形状——"TensorRT怎么处理动态形状?有什么性能影响?"我说了优化配置文件(opt profile)的使用,以及动态形状下kernel选择的策略。面试官追问了"如果输入尺寸变化范围很大,怎么优化?"我说可以创建多个profile,或者使用固定尺寸的多个engine。
还问到了模型压缩——"知识蒸馏的原理是什么?你用过哪些蒸馏方法?"我说了logits蒸馏和feature蒸馏的区别,以及我在项目中用的响应蒸馏方法。面试官追问了"蒸馏的温度参数怎么选?"我说温度越高,soft label越平滑,通常从2-20之间搜索。
二面还问了一个性能优化的问题——"如果你的模型在BPU上推理速度不达标,你会怎么分析和优化?"我说了先用profiling工具分析瓶颈在哪——是计算密集还是访存密集,然后针对性地优化。计算密集的话考虑算子融合和精度降低,访存密集的话考虑数据布局优化和缓存利用。面试官对这个回答比较满意。
二面结束的时候,面试官说"工程经验不错,但算法深度还需要加强",这和我对自己的认知是一致的。
三面:端侧推理+项目深挖(约1.5小时)
三面应该是部门的技术leader,问题更偏系统级思考。
首先让我详细介绍地平线BPU的架构特点。这个我准备得比较充分,从BPU的伯努利架构说起,讲到BNN加速引擎、高精度浮点支持、灵活的存储架构。面试官追问了"BPU和GPU在推理场景下的主要差异?"我说BPU是专门为深度学习推理设计的,能效比更高;GPU更通用,但功耗也更高。面试官似乎比较认可。
然后是端侧推理的挑战——"端侧推理和云端推理的最大区别是什么?端侧有哪些特殊约束?"我说端侧有算力限制、内存限制、功耗限制、实时性要求等约束。面试官追问了"怎么在精度和速度之间做trade-off?"我说了量化、剪枝、蒸馏、模型结构搜索等方法,以及如何根据实际场景选择合适的策略。
还问到了多任务模型——"自动驾驶场景下,感知、预测、规划这些任务怎么在一个芯片上高效运行?"我说了模型共享、任务调度、内存管理等策略。面试官追问了"如果多个模型需要同时运行,怎么分配芯片资源?"我说了基于优先级的调度策略和内存池管理。
最后是几个开放性问题——"你怎么看端侧大模型的趋势?""自动驾驶芯片未来3年的发展方向?"这些我结合行业趋势说了自己的看法,面试官没有评判对错,但一直在追问。
三面结束后大概5天,HR通知我通过了。整体来说,地平线的面试非常注重实战经验,纯理论的东西问得不多。
真题汇总
深度学习基础:
1. BatchNorm原理及训练推理时的行为差异
2. ReLU、GELU、SwiGLU的区别
3. Multi-Head Attention的计算过程
4. 为什么要除以sqrt(d_k)
5. 交叉熵和KL散度的关系
6. Focal Loss原理
量化:
7. 均匀量化和非均匀量化的区别
8. 对称量化和非对称量化的优缺点
9. PTQ和QAT的区别及适用场景
10. 校准数据选择和校准方法
11. per-channel和per-tensor量化的区别
模型部署:
12. ONNX模型导出和算子兼容性问题
13. TensorRT自定义插件开发
14. TensorRT的优化策略
15. 层融合的规则和条件
16. 动态形状的处理方法
17. 知识蒸馏的原理和方法
端侧推理:
18. BPU架构特点和GPU的差异
19. 端侧推理的特殊约束
20. 多任务模型的资源分配
21. 精度和速度的trade-off策略
心得建议
1. 量化知识是核心竞争力。地平线的面试对量化要求很高,不是知道概念就行,还要能说清楚具体的校准流程、精度评估方法、不同量化策略的适用场景。建议至少做过一个完整的INT8量化项目。
2. 部署经验要能讲出细节。面试官会追问部署过程中的具体问题,比如哪个算子不兼容、怎么解决的、性能提升了多少。这些细节是编不出来的,必须要有真实经验。
3. 了解目标芯片的架构。地平线面试一定会问BPU相关的知识,如果你对BPU架构一无所知,会很减分。建议提前学习地平线的公开技术文档。
4. 算法基础不能太弱。虽然模型部署岗位偏工程,但地平线对算法基础也有要求。深度学习的基本概念、常见模型结构、训练技巧这些都要了解。
5. 关注自动驾驶行业动态。面试官会问一些行业相关的问题,如果你对自动驾驶的技术趋势有自己的理解,会加分。
FAQ
Q:地平线面试对算法能力要求高吗?
A:比纯部署岗位高,但不会要求你从零设计模型。更看重你对模型的理解深度和部署优化能力。
Q:没有自动驾驶经验能过吗?
A:有模型部署经验就行,不一定要自动驾驶背景。但面试会问一些自动驾驶场景的问题,建议提前了解。
Q:面试会问手撕代码吗?
A:会。一面让我手写了一个量化校准的伪代码,二面让我写了一个TensorRT插件的基本框架。
Q:工作强度怎么样?
A:地平线的工作强度在芯片行业属于中等偏上,项目紧的时候会加班,但整体节奏还算可控。
Q:薪资水平如何?
A:地平线的薪资在自动驾驶芯片行业属于头部水平,加上股票期权,整体package很有竞争力。