联想 大模型开发 一面

1. 自我介绍

2. 训练一个 decoder-only 大模型时,为什么 embedding 层和 lm head 常常共享权重

权重共享本质上是一种参数高效和统计一致性的设计。输入端 embedding 学到的是“token 到向量空间”的映射,输出端 lm head 学到的是“隐藏状态到词表概率”的映射,如果这两个空间本身就在描述同一个词表语义,那么共享权重可以减少冗余参数,并让输入语义空间与输出判别空间保持一致。

从优化角度看,共享权重还能起到轻微正则化作用,尤其在词表非常大时更明显。代价是模型表达自由度下降了一点,但对大多数语言模型来说这个损失远小于收益。很多实现里会保留一个独立 bias,以补偿分布偏移。

import torch
import torch.nn as nn

class TinyLM(nn.Module):
    def __init__(self, vocab_size=1000, hidden=128):
        super().__init__()
        self.embed = nn.Embedding(vocab_size, hidden)
        self.lm_head = nn.Linear(hidden, vocab_size, bias=False)
        self.lm_head.weight = self.embed.weight

    def forward(self, input_ids):
        x = self.embed(input_ids)
        logits = self.lm_head(x)
        return logits

3. Attention 中为什么要做 masked softmax,而不是先 softmax 再把未来位置置零

如果先 softmax 再置零,概率质量已经被未来 token 分走了一部分,之后再把它们清掉,相当于没有重新归一化,这会导致有效位置上的注意力权重整体偏小,概率解释也不成立。正确做法是在 softmax 之前就把非法位置加上一个极大负数,让这些位置在 softmax 后概率接近 0,同时剩余合法位置自动完成归一化。

这个细节在训练稳定性上很重要。尤其是混合精度下,如果 mask 逻辑写错,不一定会直接报错,但梯度和注意力分布会被悄悄污染,最后表现成模型训练慢、loss 不对劲或者长序列表现异常。

import torch

scores = torch.tensor([[1.2, 0.3, 2.1]])
mask = torch.tensor([[1, 1, 0]])  # 0 表示非法位置
scores = scores.masked_fill(mask == 0, float('-inf'))
attn = torch.softmax(scores, dim=-1)
print(attn)

4. GQA、MQA 和标准 MHA 的差异是什么,它们对推理系统意味着什么

标准 MHA 里每个 query head 都有独立的 key 和 value head,表达能力最强,但 KV cache 也最贵。MQA 把所有 query head 共享同一组 K/V,极大减少了 KV cache 占用和带宽压力,推理吞吐提升明显,但表达能力会有所损失。GQA 则是折中方案,多个 query head 共享一组 K/V,既比 MHA 省很多 cache,又比 MQA 更保留头间差异。

这件事在推理阶段非常关键。大模型在线服务时,瓶颈经常不在算力而在显存带宽和 cache 容量。GQA/MQA 的价值并不是“理论更先进”,而是它们直接影响 batch size、首 token 时延、长上下文吞吐和成本模型。

5. FlashAttention 为什么能加速,它解决的不是单纯算子快,而是什么问题

FlashAttention 的核心收益不是把 attention 公式换了,而是把内存访问模式改了。标准 attention 会显式构造巨大的 attention matrix,读写 HBM 的代价非常高;FlashAttention 通过 tiled 方式分块计算,把更多中间结果留在 SRAM 或寄存器里,避免大规模 materialize,从而让 IO 开销显著下降。

这也是为什么它在长序列上收益特别大。很多人以为 attention 慢是因为 FLOPs 太多,其实在现代 GPU 上常常是 memory-bound。FlashAttention 真正优化的是 IO complexity,而不是只优化理论计算量。

6. 长上下文训练时,为什么 RoPE 外推会失效,常见补救思路是什么

RoPE 在原始训练长度附近表现很好,但外推到远超训练窗口时,角频率分布会让远距离位置关系变得越来越扭曲,模型看到的是“从未在训练中出现过的相位组合”,注意力模式会失真。表面现象通常是前后文都还行,但中间证据利用率下降,长链依赖突然崩掉。

补救思路通常不是简单暴力拉长训练长度,因为成本太高。更常见的是位置缩放、插值、NTK-aware 调整、YaRN 这类改法,或者干脆在训练中混入更长序列和专项 curriculum。真正有效的方案往往还要配合数据分布设计,不然模型只是“能跑更长”,未必“会用更长”。

7. 为什么训练时 packed sequence 能提升吞吐,但实现不好会破坏监督信号

packed sequence 把多个短样本拼到一个长序列里,减少 padding 浪费,所以 token utilization 更高,吞吐也更好。但如果拼接时 attention mask 和 labels 没处理好,前一个样本的 token 可能会错误地看见后一个样本,或者把跨样本边界也算进 loss,等于监督信号被污染了。

所以 packed sequence 真正难的不是拼,而是“边界隔离”。必须保证注意力和 loss 都严格局限在各自样本内部。很多训练实现看起来显存利用率很漂亮,实际上因为 mask 写错,把样本之间串起来了,后面很难从指标里第一时间发现。

8. ZeRO-1、ZeRO-2、ZeRO-3 和 FSDP 的本质区别是什么

ZeRO 的核心思想是把原来在每张卡上重复保存的训练状态切分掉。ZeRO-1 切 optimizer states,ZeRO-2 再切 gradients,ZeRO-3 连 parameters 也切,所以节省显存越来越激进。FSDP 和 ZeRO-3 很像,都是对参数做分片,只是在实现机制、调度方式和框架集成层面有所不同。

真正要答深一点,不能只说“谁更省显存”。关键在于不同阶段的 all-gather、reduce-scatter 出现在前向还是反向、是否支持更细粒度 wrapping、和 activation checkpointing 怎么配合,以及在不同网络拓扑下通信代价是否可接受。很多时候选择哪一个,不是看论文名字,而是看模型结构、集群带宽和工程栈。

9. 为什么 BF16 在大模型训练里通常比 FP16 更稳,但并不意味着所有算子都能放心用 BF16

BF16 的优势来自更大的指数范围,因此更不容易溢出和下溢,这对大模型训练非常重要。很多梯度、激活和 logits 分布跨度很大,FP16 很容易炸,BF16 则更能兜住。但这不等于所有运算都可以无脑低精度,像归约、softmax、norm、optimizer update 这类对数值误差更敏感的地方,很多框架依旧会在内部转成 FP32 做累加或更新。

所以真正的混合精度策略从来不是“统一降精度”,而是根据数值敏感性选择精度路径。一个训练系统稳不稳,很大程度上取决于你哪些地方坚持高精度,哪些地方敢降精度。

10. 推理阶段 prefill 和 decode 的瓶颈为什么完全不同

prefill 阶段要一次性处理整段 prompt,矩阵规模大,算力利用率高,瓶颈通常更偏计算。decode 阶段每次只生成一个 token,虽然单步 FLOPs 不算夸张,但要频繁读取历史 KV cache,且 batch 动态变化,瓶颈往往转向显存带宽和调度开销。两者的系统优化策略几乎不是一回事。

这也是为什么有些优化只提升首 token 时延,有些优化只提升长回答吞吐。比如算子融合、prefill

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

AI-Agent面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论
同学,考虑一下多多吗,招实习生啦:https://careers.pddglobalhr.com/campus/intern?t=FFEgIPlwIe
点赞 回复 分享
发布于 04-14 16:19 上海
老师面试时间是35min吗
点赞 回复 分享
发布于 04-10 21:47 广东

相关推荐

不得不夸一下联想的效率,笔试到offer只用了两周。先说一下联想校招投递官网talent.lenovo.com.cn创建简历时选择联想员工推荐:填写zhangjb24时间线24年时间线:4.x投简历。4.7下午,笔试的邮件到了,3个自然日自选时间完成。这点很赞。4.9完成笔试4.16 一面 技术面4.17 二面 领导+HR同时面4.23 offer笔试介绍笔试部分分两部分,没有先后顺序,先做哪个都可以:第一部分,综合能力测试:所用题库:SHL。包括2-3类题型;针对所有岗位 Essay Writing-25mins(我好像没有这个)性格问卷-25mins综合能力测试-36mins(30个题目,类似行测),包括:图形推理、计算题、逻辑推理题。综合能力测试是有及格线的,不过线进不了面试。第二部分,技术测评:20道选择题+2道编程题;仅针对技术岗位测评时间:非统一时间测评。和投递部门,投递时间有关。测评有效期:3个自然日(非工作日)如果错过测评没有补测机会、也无法直接参加面试。笔试和评测2天后,11号,收到邮件进面试了,一面面试是5天后的16号。一面(技术面):0.面试官自我介绍,他是入职后的带教导师。1.自我介绍,询问基本情况。2.介绍自己的校园经历or实习经历。3.项目介绍,介绍项目亮点。深度自认为不是特别深,基于项目一些问题。比如介绍项目遇到的困难以及如何解决。4基于项目所用技术,询问该技术相关问题,并问的比较前沿,但是并不是刁钻,可能是想是测一下我对新技术的认知广度。(恰好前几天刷手机看到了一篇论文,刚好提到了这个问题,有点印象但是不多,表达不是特别好)。养成看公众号论文推送的习惯真好。5.面试过程给人很舒适的感觉,一面更多是在和面试官交流,而且也能从面试官的精神状态看出来公司非常 wlb。发散问题时候,有个模块我没有记起来,只大概说了一个名字,他还给我讲了一下这个东西。最后,面试官给我详细介绍了公司部门的业务。总的来说不是特别难,会有比较发散的问题,可能需要有一定的知识广度,以及对问题的思考和理解,整体来说面试体验挺好的。时间45分钟左右。二面(领导+HRBP):1.自我介绍和一面一样。2.介绍项目,但是领导会基于项目问发散性问题,开放式的问题(基于岗位或者简历里提到的技术栈)。3.常规HR问题,压力问题,英语口语等等。面试时间40分钟。OfferOffer是一面面试官最先告诉我的。比offer call提前了一天。联想给的价格很很满意。联想965双休不加班不打卡、15天带薪年假、12天带薪病假等等福利待遇实在没理由拒绝啦~结束语辛苦读研三年,不想说轻舟已过万重山,只是很感谢自己的选择,生活没有最优解,但是我还是相信自己永远会拿到上上签。我走了很远的路,一直到今天。整个求职过程中,从提前批到秋招、春招,真切感受到了整体经济的不景气、就业形式的严峻,焦虑和压力如影随形,但是最终柳暗花明。所以希望此刻有同样就业求职困扰的你,不要自我怀疑,认真对待每一次测评,每一场笔试面试,好运总在下一个转弯。最后,希望在联想这个没有天花板的舞台,我能够实现自己的价值,为用户创造更好的产品。
查看6道真题和解析
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务