最近面试了几家做端侧AI的公司,被问了很多相关的问题。有些是基础概念,有些是深入原理,还有些是结合实际项目的。

这篇文章就来记录一下我被问到的端侧AI面试题,以及我的回答思路。如果你也在准备端侧AI相关的面试,希望能帮到你。

基础概念题

第一个问题:什么是端侧AI?它和云端AI有什么区别?

我的回答是:端侧AI就是把AI模型部署在终端设备上运行,比如手机、平板、物联网设备、嵌入式设备等。和云端AI的区别主要有几点:端侧AI不需要联网,数据不出设备,隐私性好;延迟低,响应速度快;不需要服务器成本,但受限于设备的算力和内存。云端AI算力强,能跑大模型,但需要联网,有延迟,数据要传到服务器,有隐私风险。

然后面试官追问:端侧AI适合哪些场景?不适合哪些场景?

这个问题我答的是:端侧AI适合实时性要求高、隐私敏感、网络不稳定的场景。比如手机上的人脸识别、语音助手、拍照优化,物联网设备上的异常检测,自动驾驶上的实时感知等。不适合需要大规模算力、模型特别大、需要频繁更新的场景,比如大语言模型、大规模图像生成等,这些还是更适合云端。

第二个问题:端侧AI的主要挑战是什么?

我的回答是:主要有三个挑战。第一是算力有限,端侧设备的CPU、GPU、NPU算力都远不如服务器,大模型跑不动。第二是内存有限,端侧设备的内存通常只有几GB,模型太大加载不进去。第三是功耗和散热,端侧设备尤其是移动设备,功耗和散热都有限制,不能长时间高负载运行。

模型压缩题

模型压缩是端侧AI的核心技术,面试必问。

第一个问题:常用的模型压缩方法有哪些?

我的回答是:主要有四类。第一是剪枝,去掉模型中不重要的权重或者神经元,减少模型参数量。第二是量化,把高精度的权重(比如FP32)转换成低精度(比如INT8、INT4),减少内存占用和计算量。第三是知识蒸馏,用大模型(教师模型)指导小模型(学生模型)训练,让小模型学到大模型的能力。第四是神经网络架构搜索(NAS),自动设计更高效的模型结构,在保证精度的前提下减少计算量。

然后面试官追问:量化的原理是什么?INT8量化和FP32比,精度损失大吗?

这个问题我答的是:量化的原理是把浮点数映射到整数范围,比如把FP32的权重范围[-1, 1]映射到INT8的[-128, 127]。这样每个权重从4字节变成1字节,内存占用减少75%,计算量也大大减少。精度损失取决于模型和量化方法,一般来说INT8量化的精度损失很小,很多模型几乎看不出差别。但对于一些对精度敏感的模型,或者量化方法不对,可能会有明显的精度下降。还有INT4量化,压缩率更高,但精度损失也更大,需要更精细的量化方法。

第二个问题:剪枝有哪些类型?结构化剪枝和非结构化剪枝的区别?

我的回答是:剪枝分为非结构化剪枝和结构化剪枝。非结构化剪枝是去掉单个不重要的权重,剪枝后模型是稀疏的,需要特殊的稀疏计算库才能加速。结构化剪枝是去掉整个通道、层或者卷积核,剪枝后模型是规则的,可以直接用普通的推理框架加速。非结构化剪枝的压缩率更高,但加速效果依赖硬件支持;结构化剪枝压缩率低一些,但兼容性好,更容易加速。

推理优化题

推理优化也是端侧AI的重点。

第一个问题:端侧推理优化有哪些常用方法?

我的回答是:第一是算子融合,把多个小算子合并成一个大算子,减少内存访问和kernel launch开销。比如把卷积、BN、ReLU融合成一个算子。第二是内存优化,复用中间张量的内存,减少内存占用。第三是调度优化,根据设备的硬件特性,优化算子的执行顺序和并行策略。第四是硬件加速,利用设备的NPU、GPU、DSP等专用硬件加速推理。

然后面试官追问:算子融合为什么能加速?

这个问题我答的是:算子融合主要有两个好处。第一是减少内存访问,每个算子都要把中间结果写到内存再读出来,融合之后中间结果可以留在寄存器或者缓存里,减少了内存带宽的消耗。第二是减少kernel launch开销,每个算子启动都有开销,融合之后只需要启动一次,减少了开销。特别是在端侧设备上,内存带宽和kernel launch开销往往是瓶颈,算子融合的效果很明显。

第二个问题:怎么选择推理框架?

我的回答是:选择推理框架要考虑几个因素。第一是硬件支持,不同的框架支持的硬件不一样,比如CoreML支持苹果设备,NNAPI支持安卓,TensorRT支持NVIDIA GPU,NCNN和MNN是跨平台的。第二是模型支持,不同框架支持的算子和模型格式不一样,要确认你的模型能被支持。第三是性能,不同框架在不同硬件上的性能差异很大,要实际测试。第四是易用性,框架的API设计、文档、社区活跃度都要考虑。

框架和工具题

端侧AI的框架和工具也是面试常问的。

第一个问题:你用过哪些端侧推理框架?它们的优缺点是什么?

我的回答是:我用过TensorFlow Lite、NCNN、MNN、ONNX Runtime等。TensorFlow Lite是谷歌出的,生态好,文档全,支持安卓和iOS,还有很多预训练模型,但性能不是最优的。NCNN是腾讯出的,针对移动端优化,性能很好,跨平台,但文档相对少一些。MNN是阿里出的,性能也不错,支持的硬件多,有自动调优功能。ONNX Runtime是微软出的,跨平台,支持ONNX格式,易用性好,但移动端的性能不如专门优化的框架。

第二个问题:模型转换的流程是怎样的?会遇到什么问题?

我的回答是:模型转换一般是从训练框架的格式(比如PyTorch、TensorFlow)转换成中间格式(比如ONNX),再转换成推理框架的格式(比如TFLite、NCNN的bin和param)。转换过程中常见的问题有:算子不支持,训练框架用的某些算子推理框架不支持,需要自定义算子或者替换;精度损失,转换过程中可能有数值精度的问题,导致结果不对;动态形状,有些模型的输入形状是动态的,推理框架可能不支持,需要固定形状;版本不兼容,不同版本的框架之间转换可能有问题。

实际应用题

面试中还会问一些结合实际应用的问题。

第一个问题:如果要在手机上部署一个实时人像分割模型,你会怎么做?

我的回答是:首先选择合适的模型,人像分割不需要太大的模型,可以用轻量级的分割网络,比如MobileNet+U-Net,或者专门的人像分割模型。然后做模型压缩,用量化和剪枝把模型变小,保证在手机上能实时运行。接着选择推理框架,安卓用NNAPI或者NCNN,iOS用CoreML,保证性能。然后做性能优化,算子融合、内存优化、硬件加速,保证帧率。最后做精度验证,确保分割效果满足需求。还要考虑功耗,不能让手机发烫太厉害。

第二个问题:端侧AI怎么保护模型不被破解?

这个问题我答的是:端侧模型部署在设备上,用户可以拿到模型文件,有被反编译和窃取的风险。保护方法主要有:模型加密,把模型文件加密,运行时解密,增加破解难度;混淆,把模型结构和权重做混淆,让反编译出来的代码难以理解;拆分模型,把模型的一部分放在云端,端侧只跑一部分,即使拿到端侧模型也不完整;硬件保护,利用设备的安全硬件(比如TEE)来存储和运行模型,防止被窃取。不过这些方法都只能增加破解难度,不能完全防止破解,要根据安全需求选择合适的方案。

性能调优题

性能调优是端侧AI的核心能力,面试会深入问。

第一个问题:怎么定位端侧推理的性能瓶颈?

我的回答是:首先用 profiling 工具看各部分的耗时,比如模型加载时间、预处理时间、推理时间、后处理时间。如果是推理时间长,再看每个算子的耗时,找到耗时最长的算子。然后分析是计算密集型还是内存密集型,计算密集型的话考虑用硬件加速或者优化算法,内存密集型的话考虑算子融合或者内存优化。还要看硬件利用率,CPU、GPU、NPU的利用率,如果利用率低说明有调度问题。

第二个问题:INT8量化之后精度下降很多,怎么解决?

我的回答是:首先检查量化方法,是训练后量化还是量化感知训练,量化感知训练的精度通常更好。然后看校准数据集,量化需要校准数据,如果校准数据不代表实际使用场景,精度会下降。可以用更有代表性的校准数据。然后看哪些层精度损失大,有些敏感层可以保持FP16或者FP32,做混合精度量化。还可以用更先进的量化方法,比如逐通道量化、非均匀量化,减少精度损失。如果还是不行,可以考虑用知识蒸馏,用量化后的模型学习全精度模型的输出。

面试心得

面了几家公司,总结了一些端侧AI面试的心得。

第一,基础要扎实。端侧AI涉及的知识面很广,机器学习、深度学习、模型压缩、推理优化、硬件架构、操作系统,都要懂一些。面试官不会只问一个方向,会从不同角度考察。

第二,要有实际项目经验。光说理论没用,面试官会问你做过什么项目,遇到了什么问题,怎么解决的。所以平时做项目的时候要多总结,把遇到的问题和解决方案记下来。

第三,要关注最新技术。端侧AI发展很快,新的模型、新的框架、新的优化方法层出不穷。要保持学习,了解最新的技术动态。

第四,要会表达。技术好是一方面,能不能说清楚是另一方面。面试的时候要条理清晰,先给结论,再展开说,不要东拉西扯。

第五,不要怕说不知道。端侧AI的范围很广,不可能什么都懂。遇到不会的问题,坦诚说不知道,然后说说你的思路,比瞎编强。

写在最后

端侧AI是一个很有前景的方向,随着端侧设备算力越来越强,越来越多的AI应用会跑在端侧。面试虽然有难度,但只要基础扎实、有项目经验、保持学习,就能找到合适的工作。

希望这篇文章能帮到正在准备端侧AI面试的你。祝大家都能拿到心仪的offer。