华为AI软件岗面试攻略:从C++、算子开发到系统设计
2026/9/2 7:12:28 网站建设 项目流程

每年到招聘季,总有一批同学拿着算法岗的面经去准备华为AI软件岗的面试,结果一面就被问懵。我见过不少算法理论背得滚瓜烂熟的人,栽在“深拷贝和浅拷贝的区别”“C++虚函数表存在哪”这种看似基础的问题上;也见过工程能力很强的人,因为没提前了解华为AI业务栈,被“MindSpore和PyTorch的差异”“NPU算子开发”这类题打得措手不及。华为的AI软件岗面试,核心关键词不是“AI”,而是“软件岗”三个字。它招的不是发论文的算法科学家,而是能把AI模型落地成稳定、高效、可交付的软件系统的人。这篇文章不打算列一份“全网最全千题集”,而是基于我对华为AI软件岗面试的观察和复盘,帮你把高频问题背后的考察逻辑拆明白,再给出一条可执行的备考路径。

岗位画像决定了复习方向,方向和努力同样重要。华为AI软件岗的面试流程通常是:机试(在线编程)→ 技术面两到三轮(每轮约45-60分钟)→ 主管面(HR或业务主管面)。技术面里,手写代码、项目深挖、八股问答会交替出现,越到后面越偏系统和工程。下面我按这个逻辑逐块拆解,每一节都会给你具体题目、回答思路和避坑提醒。

1. 面试官到底在找什么人:先从华为AI软件岗的岗位画像聊起

先给一个很多人能背出来的结论:华为的AI软件岗,跟互联网大厂的“推荐算法工程师”“CV算法工程师”不是同一个物种。华为的AI软件岗大量集中在昇腾、盘古、MindSpore、ModelArts、智能汽车解决方案等BG/部门下面,岗位职责经常是这几类:

  • AI框架开发与优化:基于昇腾底座的算子库开发、自动微分、图编译、分布式训练框架,代表产品是MindSpore和CANN。
  • AI推理与部署:模型转换、量化、剪枝、推理引擎开发、端侧/云侧性能优化,TBE算子开发、AI Core指令映射、TensorRT/ONNX Runtime二次开发。
  • AI平台与工具链:AI训练平台、推理服务化、数据标注与处理Pipeline、MLOps系统的设计与开发。
  • 嵌入式/AIOT方向:芯片侧算法工程化、模型压缩与加速,跟硬件打交道非常多。

从这些职责能提炼出华为AI软件岗和“纯算法岗”的核心差异,我就是靠这张表帮学生认清备考重点的:

维度华为AI软件岗传统互联网算法岗
第一优先级工程能力、C++/Python、推理性能、系统设计模型效果、论文/竞赛、数据分析
编程语言C++ > Python,要求扎实的底层能力Python为主,偶尔要Java/Scala
框架要求MindSpore、PyTorch、TensorRT、CANNPyTorch、TensorFlow为主
算法深度能说清原理,但很少推复杂公式需要推导GAN、注意力机制的细节
部署知识必须懂,算子融合/量化/内存复用是常规话题加分项,不是必须
面试官画像多为框架开发/编译器/系统工程师多为算法工程师

所以准备华为AI软件岗的同学,请先停下来问自己一个问题:我是把时间花在刷“K-means聚类证明”还是花在搞懂“手写一个C++智能指针”?答案是后者。算法理论不是不重要,但它的权重和出题方式,跟你想象的不太一样。

华为AI软件岗面试常见的技术考察范围,可以粗分成四块:算法基础、AI基础、工程能力、系统设计。算法基础就是通用的编程题,后面单独说。AI基础考的是机器学习/深度学习核心概念,工程能力考的是C++/Python、算子开发和推理优化,系统设计考的则是架构能力和大模型背景下的分布式训练/推理知识。

2. 机器学习与深度学习高频题:不是背公式,而是讲清楚推导

网上流传的华为AI算法岗面经里最常出现的题,在软件岗上也会问,但问法不同。软件岗的技术面试官更关心你“能不能实现”,而不是你“能不能背诵”。

2.1 机器学习基础:过拟合、正则化与损失函数

“过拟合怎么解决?”几乎每场面试必问。常规回答是增加数据、正则化、Dropout、早停、集成学习。但华为面试官往往会加一句:“你再说说L1和L2正则化的区别,怎么用代码实现?”

L1正则化是加惩罚项的绝对值,L2正则化是加平方和。L1更容易产生稀疏解,因为它在零点处有不可导的尖角,坐标轴下降法/近端梯度法可以在置零处停住。L2是连续平滑的,解不会稀疏,但会趋向于小值。工程实现时,L2正则通常集成到优化器里,也就是weight decay,PyTorch的AdamW就是把weight decay和梯度分开做,避免Adam自适应学习率把正则效果冲淡。L1则更简单,直接在loss上加上lambda * torch.norm(w, p=1)

再高一层,面试官会问“交叉熵损失和MSE在分类问题里怎么选”。如果你只回答“分类用交叉熵,回归用MSE”,那这题只能拿一半分。更好的回答是:交叉熵配合Softmax,输出是概率分布,梯度形式是预测值减真实值,不会出现Sigmoid+MSE那种在饱和区梯度趋近于0导致训练极慢的问题。MSE对分类问题本质上是做最小二乘拟合,它并不惩罚“错误概率分布形状”的偏离,只会让输出向0/1靠拢,训练不稳定。

2.2 神经网络核心:从反向传播到Transformer

手推反向传播是华为技术面保留节目。面试官不会让你推完整的ResNet152,但会让你推一个两三层神经网络的前向和后向,或者解释梯度消失/爆炸的成因。我的建议是:不要只写公式,要用计算图的方式讲。从Loss开始,逐层往前求梯度,说明链式法则中哪个变量是缓存下来直接复用的。这样面试官会觉得你是真的写过训练代码,而不是背了一本书。

Transformer就更常考了。高频题包括:

  • Self-Attention的复杂度为什么是O(n²),对序列长度极端敏感,因此衍生出Sparse Attention、FlashAttention、线性注意力等优化方法。
  • Query、Key、Value分别是什么,为什么需要Scale操作?Scale的作用是防止点积结果过大导致Softmax陷入饱和区,梯度消失。
  • Positional Encoding为什么用sin/cos,能不能学到?这是让模型感知词序的机制,sin/cos能保证相对位置的线性关系,也可以换成可学习的位置编码,但长度泛化能力差一些。
  • MHA和MQA/GQA的区别是什么?MHA每组QKV都有独立权重,大模型推理时KV Cache占用显存巨大;MQA让所有头共享一组Key/Value,GQA则让多头分组成组共享,是推理优化中的重要技术。

上面这些题,如果没有项目背景,容易答成“我知道Transformer用了自注意力”。想拿高分,要找开源实现(比如Hugging Face的实现)读一遍,把代码里mask怎么做的、head_dim怎么拆的、cache怎么存的和删除的讲清楚。华为面试官尤其爱问“如果你要把这个模块部署到NPU上,你会怎么优化”,这就是从AI理论跨到软件工程的典型问题。

2.3 高频问答清单:可以对着自测

我整理一份面试前必自测的清单,覆盖AI基础部分最常考的题:

  • 解释Batch Normalization的作用,训练和推理时有什么区别?(训练用batch统计,推理用滑动平均)
  • 什么是激活函数的“死亡ReLU”问题?LeakyReLU、ELU、GELU怎么缓解?
  • 什么是梯度累积?它模拟的是增大batch_size还是增大学习率?
  • 解释Precision/Recall/F1,什么时候只关心Precision?
  • 什么是Focal Loss,解决什么问题?
  • Momentum、RMSProp、Adam、AdamW有什么区别?哪个适合大模型?
  • 数据并行和模型并行的区别是什么?ZeRO做的是哪件事?
  • 你知道KV Cache吗?为什么能加速自回归生成?

不要光背题目,每个题都要能讲出“为什么”和“代码里怎么做”。

3. C++、算子开发与推理优化:拉分项全在这块

如果说AI基础是门槛,那C++、算子开发、推理优化就是华为AI软件岗面试里真正的拉分项。大部分候选人能答好前两轮,但在“优化”环节被淘汰。

3.1 C++必考点:不只是八股

华为的软件工程师面试,C++相关的问题几乎是必考。即便是Python为主的候选人,也会被问C++,因为AI框架底层、算子、推理引擎几乎都用C++。

高频考点:

  • 智能指针:unique_ptr/shared_ptr/weak_ptr的区别,循环引用怎么解决,引用计数是线程安全的吗?
  • 虚函数:虚函数表放在哪里,多重继承的虚函数表长什么样?
  • 拷贝构造与移动语义:深拷贝浅拷贝的区别,std::move做了什么,何时触发移动构造?
  • STL容器底层:vector扩容机制,mapunordered_map底层红黑树和哈希表的差异,dequevslist
  • 内存管理:栈和堆的区别,内存对齐,内存泄漏排查工具(Valgrind/ASan)。

我的建议是每个问题都要准备一个“场景化解释”。说到vector扩容,不要只说变成两倍,而是说“如果我在一个循环里反复push_back,且数量达到上千万,内存拷贝会非常可观,因此需要提前reserve”。说到shared_ptr循环引用,就说“两个对象互相持有shared_ptr,引用计数永远不为0,如果把其中一个改成weak_ptr就解决了”。这样面试官才会相信你在实际项目中写过。

华为AI岗还会追问C++和AI结合的题,比如“把PyTorch模型加载的部分用C++实现,如何做到与Python的解耦”“ONNX Runtime的C++ API和Python API性能上有什么差异”。你不需要真的在生产环境写过,但至少要了解推理引擎用C++部署原因是避开GIL、更精细控制内存、更好的算子调度。

3.2 算子开发与NPU编程:至少会画一张图

昇腾相关岗位面试一定会问“你了解CANN吗?了解算子开发吗?”如果你没接触过,不用慌,但需要知道基础概念,并且能表现出学习能力。

NPU芯片里计算核心叫AI Core,算子就是运行在AI Core上的计算单元,比如矩阵乘法和卷积就是算子。TBE和Ascend C是开发算子的语言/框架。TBE基于TVM的思想,程序员写算子的计算逻辑,编译器把它映射到AI Core指令。Ascend C是更贴近芯片的高性能编程语言,提供类似CUDA的编程模型,包含并行计算、流水、内存管理、同步等概念。

面试官常问“一个二维卷积算子,如何在AI Core上实现高性能计算”?你不用写复杂代码,但需要会拆解:

  • 数据切分:NHWC还是NCHW布局?如何把一个大的输出切块放入片上内存。
  • 循环分块:输入通道和输出通道分块,或者叫tiling,减少访存。
  • 向量化:使用向量指令资源,一次同时算多个点。
  • 流水线:加载数据、计算、写回三个步骤重叠。
  • 算子融合:把相邻算子的中间结果留在片上,不落回主存。例如Conv+BN+ReLU融合,减少搬运。

如果你还了解CPU上的优化,可以说Cache miss、SIMD、循环展开、NEON/AVX。这些都能让面试官觉得你“有性能意识”。

3.3 模型推理优化:要能给出数据说话

“你的模型部署到实际服务,延迟太高怎么办?”这是系统级问题,不是让你背一个答案。比较好的回答链路是:

  1. 先做性能分析:用profiler看时间花在算子还是数据加载,还是拷贝。不要盲目优化。
  2. 算子级优化:融合、减少内存分配、提高算子并发。
  3. 模型级优化:量化(FP16、INT8)、剪枝、蒸馏。
  4. 框架级优化:换用TensorRT/ONNX Runtime、开启图优化。
  5. 服务级优化:多线程/多进程、动态batch、缓存、预热。

你应该能对每个点展开说。比如INT8量化,你需要知道什么是PTQ和QAT,RN、校准集怎么用,量化误差来源是什么,为什么对Transformer来说量化难度大。动态batch是推理服务常用的手段,在并发请求多的时候把多个请求合并成一个batch,能大幅提升吞吐,但需要注意显存峰值和超时时间。

此外,Distributed training和fsdp的知识也可能出现。华为有大量分布式训练的场景,面试官会问数据并行、模型并行、流水线并行的区别,以及参数服务器和AllReduce的对比。你需要了解Ring-AllReduce的通信量O(n),以及它比PS的优势在哪里。如果你答不上来,至少把“数据并行每个卡都有一份完整模型副本,梯度通信量大;模型并行需要切分模型,通信切片和计算一样重要”这个点说清楚。

4. 机试与手撕代码:华为上机考试的套路与备考节奏

华为的机试是大部分人的第一道坎。校招和OD机试虽然略有不同,但核心都是在线编程,题目风格偏重“逻辑复杂、边界情况多、时间空间要求高”,而不是偏门算法。机试能不能过,直接影响后续面试邀约,所以必须认真对待。

4.1 机试的三种常见形式

  • 校园招聘机试:一般90-120分钟,3道题,难度递增。分值分布常是第一题100分、第二题200分、第三题300分或类似,但总分过线就能进面试。第一题偏模拟,第二题偏字符串和搜索,第三题偏动态规划和贪心。
  • OD机试:网上资料更多,一般有ABCD卷之说,实际是为了防作弊的换题机制。题目风格和校招类似,但更注重“围绕题目给出的场景做准确模拟”。
  • 牛客网/华为OJ平台:环境是ACM模式,代码需要自己处理输入输出,不提供函数模板。这跟力扣的“核心代码模式”不同,很多人直接栽在这里。

4.2 备考节奏与题目类型

我建议把机试备考分为三个阶段:

  • 第一阶段(两周):熟悉数据结构。优先级是数组、字符串、链表、栈、队列、哈希表、二叉树、图。每种结构去力扣刷20道高频题,不要贪多。
  • 第二阶段(三周):专项突破算法。重点是排序、二分查找、双指针、滑动窗口、动态规划、贪心、回溯、DFS/BFS。华为机试第二道和第三道常考动态规划,尤其是“背包类”“区间DP类”和“路径计数类”。
  • 第三阶段(一周):完整模拟机试。严格按照考试时长和时间段,在牛客网上做华为真题。每天至少一套,注意输入输出格式、多组测试样例、超时问题。

具体到题量,我在带学生备考时一般要求至少150道力扣题,其中Medium占80道以上,Hard不需要太多。针对华为,要特别留意“字符串处理”和“情况讨论”的题目。比如“给定一个算式字符串,求结果”“实现一个简易计算器”“括号匹配的变种”“火星文计算”,这些题看起来不难,但边界情况很多,非常考验码风。

4.3 一个高频题示例:手写LRU缓存

手写LRU是华为以及很多大厂机试/手撕代码的热门题。手撕时可以直接用Python的OrderedDict,但最好让面试官看到你在想什么。简单实现如下:

from collections import OrderedDict class LRUCache: def __init__(self, capacity: int): self.capacity = capacity self.cache = OrderedDict() def get(self, key: int) -> int: if key not in self.cache: return -1 self.cache.move_to_end(key) return self.cache[key] def put(self, key: int, value: int) -> None: if key in self.cache: self.cache.move_to_end(key) self.cache[key] = value if len(self.cache) > self.capacity: self.cache.popitem(last=False)

写完还要能回答:为什么用双向链表+哈希表也能实现?OrderedDict底层是什么?如果要求自己实现双向链表,你需要把“哈希表存储key到节点的指针,链表维护访问顺序”说出来。手撕代码考察的往往不只是代码能力,还包括你遇到边界情况的反应速度。写完后主动说“我来检查一下get不存在的key,put已存在的key,大量插入缓存满时删除的是不是最久未访问的项”,这种自测意识非常加分。

4.4 机试中的编程细节

  • 注意时间复杂度和空间复杂度,最好一开始就说出解法复杂度。
  • 用Python时谨慎使用递归,默认递归深度只有1000,可能爆栈。深搜建议显式栈或加sys.setrecursionlimit
  • 注意多个测试用例间的全局变量清空,避免状态污染。
  • 写代码时不要过早优化,先把无脑正确版本写出来,如果复杂度不行再优化。面试官更关注你的思路链,而不是一步到位。

5. 项目深挖与系统设计:把做过的事讲成架构能力

技术面中必然会有一大段时间挖项目。很多人以为项目讲得越炫越好,其实华为的面试官非常讨厌“背稿子”。他们更倾向于不断追问“为什么这样做”“有没有想过另一种方案”“数据量大了怎么办”。

5.1 使用STAR法则组织项目,但要突出技术决策

随便举一个例子:你做过一个图像分类项目,准确率97%。如果你只说“我用ResNet50做分类,准确率97%”,面试官很难往下聊。更好的框架是:

  • Situation:业务场景,比如工业缺陷检测,样本类别极不平衡,坏品只占1%。
  • Task:目标是漏检率低于0.1%,误检率低于5%。
  • Action:不是简单套ResNet,而是设计了图像增强策略、Focal Loss、模型集成、推理时做了TTA(Test-Time Augmentation)。同时在工程上优化了预处理Pipeline,用OpenCV并行替换PIL,使单张推理从80ms降到20ms。
  • Result:漏检率0.08%,误检率2%,最终部署到推理服务器上,QPS达到50。

注意Action部分的描述要和“软件岗”匹配:模型选型和效果提升占1/3,工程落地的性能优化占2/3。如果你能说出“我用了多进程,把图像解码和预处理并行,然后在GPU推理前后做缓存”这类细节,面试官自然会觉得你有工程sense。

5.2 项目被追问时的常见深水区

  • 你用的batch size是多少?为什么选这个值?显存占用怎么算?
  • 训练时数据预处理怎么做的?有没有做数据增强?会不会导致数据泄漏?
  • 你的模型推理显存是多少?有没有用自动混合精度?
  • 准确率提升,你的实验重复了几次?方差多大?有没有做过显著性检验?
  • 如果线上数据分布变化,你的模型会不会跪?你有监控方案吗?

不要因为项目小就回避。我见过项目经历平平、但被追问时每个问题都能答出“当时我在源码里看到是什么行为,所以我怎么做”的候选人,反而顺利通过。面试官要的是真实经验,而不是包装好的完美故事。

5.3 系统设计题:训练平台和推理服务是两大方向

华为AI软件岗的系统设计题很少让你设计“秒杀系统”。它更爱考这两类:

第一类是训练平台设计。题目类似:“设计一个多机多卡的分布式训练系统,训练一个大模型,怎么做资源调度、数据加载、模型同步和容错?”

回答思路应从底层往上讲:计算集群使用容器化调度(K8s、Volcano、Slurm);GPU/NPU虚拟化和共享;数据加载用缓存和预取策略;模型同步用AllReduce(Horovod)或ZeRO;失败任务自动重启并断点续训;训练日志和指标监控接入Prometheus/Grafana。

第二类是推理服务设计。题目类似:“一个大语言模型要部署成在线服务,延迟要求2秒以内,并发100,怎么设计?”

这个题是2025年的热门题。你需要提到:服务架构上做多级缓存(对话前缀缓存、KV Cache复用);动态batch;把模型切成多卡并用张量并行;支持多副本自动扩缩容;预热和健康检查;高可用和灰度发布。还要注意显存估算:一个7B模型用FP16加载大约14GB,加上KV Cache和中间激活,一张卡可能放不下,需要模型并行或者INT8量化。如果你能报出这些数字,面试官就会相信你真的部署过。

系统设计没有标准答案,但面试官希望看到两点:一是你有一种或两种主流设计范式的知识储备,二是你有取舍能力,能说清楚“在资源有限的情况下,我先满足哪个指标”。不要一上来就堆组件,先从单机方案开始,再逐步扩展。

6. 主管面谈动机与压力:技术之外能不能过,取决于这几点

华为面试流程里的主管面,技术含量虽然降低了,但淘汰率不低。主管面通常由部门主管或者资深技术专家担任,面试25-50分钟,重点考察你的动机、价值观、抗压能力和学习潜力。

主管面前,请认真准备三个问题:

  • “为什么选择华为,为什么选择AI这个方向?”
  • “你有没有遇到过特别难的问题或冲突,是怎么解决的?”
  • “你的职业规划是什么?”

第一题不要回答“华为技术强、平台大”这种空话。更好的角度是“我想做AI基础设施,尤其是昇腾这种国产AI算力平台,正好和自己的技术栈匹配”。或者“我之前用的MindSpore做了某类模型适配,感觉它的图模式技术栈很有意思,想深入做编译和算子方向”。只有当过面试官的人才知道,比起大而空的表白,一个具体的业务方向更打动人。

第二个问题,回答框架可以用“遇到挑战-拆解问题-尝试多种方案-最终结果-复盘收获”,但要把重点放在“怎么拆解”和“怎么调动资源”上。不要把自己描述成独自扛下所有。华为很看重团队协作,适度展示你如何让别人配合你,比“我加班三天搞定”更真实。

第三个问题,不要回答“三年做到主管”“五年年薪百万”,也不要回答“我想做技术专家”。更好的说法是“先在某个垂直方向打深,比如推理引擎的算子优化,再横向扩展到整个AI计算栈,之后可以带小团队做完整的系统交付”。这样既显示了技术追求,也显示了领导力潜力。

主管面中还可能出现压力测试,比如“我觉得你技术基础一般,你怎么证明自己合适?”这种题不要慌。它的核心是考察你面对否定时的反应。可以回答“我现在确实有些地方还不够熟,但我在接下来的时间里可以针对性补齐。比如这周我正准备把FP8量化的原理和实现完整看一遍,面试后我可以写一篇技术总结给你看”。要真诚、具体、有行动意图,而不是空洞地说“我很努力”。

7. 关于备考节奏的个人经验:三个月倒推复习法

最后分享一套我觉得靠谱的备考节奏,适合从现在开始准备未来面试的同学。三个月其实很紧张,但也够用。

第一个月:补齐基础和机试能力。每天2道编程题,周末做专项突破;同时每天花1小时复习C++智能指针、STL、内存;周末看机器学习/深度学习核心知识,重点在过拟合、正则化、BN、优化器、Transformer。

第二个月:主打工程和框架。每周深入读一个开源项目,比如MindSpore或PyTorch的某个模块,重点看算子注册、自动微分、缓存分配。写一份阅读笔记。同时把模型推理优化扫一遍,自己用TensorRT或ONNX Runtime跑通一个模型,把量化、融合、检测的过程跑一遍,记录数据。每周做一套完整机试模拟。

第三个月:模拟面试和查漏补缺。找伙伴或自己录屏,模拟20-30分钟技术面,再写复盘。针对薄弱环节,集中训练。同时把项目经历重新打磨,准备追问列表。最后一个星期以看面经为主,不要刷太难的题,保持手感即可。

我在实际陪跑过程中有个很深的感受:很多人并不是技术不行,而是准备方向系统性不强,被“AI岗位”三个字误导,把大量时间投在了论文理解和模型调参上,忽略了软件工程基础。华为AI软件岗面试,本质上是一场“你是否能在真实生产环境里,把模型变成高效可靠的软件”的检验。只要按这个逻辑去准备,面试现场的问题再千变万化,你都能找到回答的锚点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询