当前位置: 首页 > news >正文

字节大模型面经

2025年3月14日,一面。

一、自我介绍5分钟

二、项目
①处理预训练数据的时候有没有用分布式?问预训练数据到手里处理的时候有多少条,多少TOKEN,多少GB,在规则初筛后、模型推理前。
②上一段实习遇到了什么困难,怎么克服的?
③对于洗数据有什么理解?因为往往要做洗数据前后的消融实验,在洗数据的时候应该注意哪些数据?有没有关注过case?

三、八股:
1.self-attention公式,为什么/根号dk
2.layer-norm和batch-norm区别
3.做过多少张卡的训练?用的什么加速?deepspeed的加速原理,zero_1、2、3的区别
4.RoPE旋转位置编码
5.多头注意力机制,近期进展,比如GQA
6.Adam原理
7.LLM适配多模态时,用的projecter是什么?image encoder用的什么,多少参数?
8.多模态大模型,用复杂的模块对齐特征(比如Q-Former),和直接用MLP,优势劣势。

代码题:
①判断给定的二叉树是不是BST。
②有n个从1到n的节点,求可以构造多少个合法的BST?

复盘:
①自我介绍没提前准备,下次准备一个。
②八股背的不行,吃不上LLM的饭。投完NeurIPS,再全面进军LLM,双线作战容易双线溃败。

补一下八股答案,一共答上来两个,太难蚌了,一问三不知。
1.self-attention公式,为什么/根号dk
①softmax( Q*K^T / sqrt(k) )
②防止梯度爆炸。

2.layer-norm和batch-norm区别

3.做过多少张卡的训练?用的什么加速?deepspeed的加速原理,zero_1、2、3的区别

①8卡A800,训qwen-32B,用的zero_3_offload(因为640GB显存不够,要用900GB,offload用内存或者多机训练)。
②deepspeed,微软开发。
③deepspeed特点:
(1)分布式训练:支持数据并行、模型并行。
(2)zero技术加速:

核心技术:
(1)显存优化:把模型状态(参数、梯度、优化器状态)分布在多卡上,防止单卡显存不够用。
● 激活检查点:在反向传播时重新计算中间激活值,而非保存所有激活,牺牲约20%计算时间换取显存节省。
● CPU Offload:将优化器状态和梯度卸载到CPU内存,GPU显存需求进一步降低(适合资源有限场景)。
● 梯度累积(Gradient Accumulation):小批次多次累积梯度后更新参数,模拟大Batch效果。
(2)计算并行化:
● 数据并行(Data Parallelism):将数据分片,每个GPU处理不同数据。
● 流水线并行(Pipeline Parallelism):将模型按层切分到不同GPU,通过“微批次”减少流水线气泡。
● 张量并行(Tensor Parallelism):将单个层的计算拆分到多个GPU(如矩阵乘法的行列分割)。
(3)通信优化:
● 分层通信(Hierarchical Communication):在ZeRO-3中,仅需在局部GPU组内通信参数,减少全局通信量。(比如2卡作为一组,8卡就是4组,组与组之间通信,减少外部通信。)
● 异步数据加载:提前加载数据到显存,避免训练过程因数据I/O阻塞。
(4)混合精度训练:FP16+FP32或BF16+FP32混合训练,需要用动态精度缩放、混合精度优化器等方法减少模型精度损失。

zero1、2、3的区别,zero1是把优化器状态分片,2阶段是优化器+梯度,3阶段是优化器+梯度+模型。

④扩展:Accelerate,HF开发,特点:
(1)简化配置,提供统一的接口处理多GPU和TPU
(2)集成DeepSpeed,可以用Accelerate配置DeepSpeed。
(3)简化分布式训练:自动处理分布式训练的设置和同步问题,比如模型参数在cuda:0,但是数据存在CPU里。

4.RoPE旋转位置编码
纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。为此我们大体有两个选择:1、想办法将位置信息融入到输入中,这构成了绝对位置编码的一般做法;2、想办法微调一下Attention结构,使得它有能力分辨不同位置的Token,这构成了相对位置编码的一般做法。

两个向量的相似度可以通过他们之间的角度衡量,衡量了他们的相对位置。但是这里缺乏了位置信息,通过将两个向量一起旋转(旋转位置*β),可以将语义和相对位置信息嵌入到一起。

RoPE旋转的时候是将向量中的维度两两分组,第i组的旋转角度是\theta_i = base^(-2*i/d),前边的组旋转角度大,后边的小。

为什么这样设置旋转角度?因为这样可以多尺度捕捉位置信息。
频率越低,对相对位置越不敏感。
高频:短距离依赖。
低频:长距离依赖。

5.多头注意力机制,近期进展,比如GQA
①目的
多头注意力机制,MHA、GQA、MQA、MLA,都是为了解决KV cache占用显存过多的问题。
在标准的 Transformer 模型中,多头注意力(Multi-Head Attention, MHA)机制通过并行计算多个注意力头来捕捉输入序列中的不同特征。每个注意力头都有自己的查询(Query, Q)、键(Key, K)和值(Value, V)矩阵。
MLA 的核心思想是通过低秩联合压缩技术,减少 K 和 V 矩阵的存储和计算开销。
②MLA的原理
对Q和K进行拆分,一部分维度做压缩、一部分维度做RoPE编码。

压缩部分,先对K和V进行联合压缩,通过Wc降维;再通过Wk和Wv升维。后面就是普通的多头注意力机制,每个头分别算,最后加权求和。此外,对Q也进行低秩压缩,与对K、V的压缩方式一致。

虽然节省了显存,但是增加了计算量。为了解决计算量增加的缺陷,提出矩阵吸收。把Q和K^T合并成一个大的映射矩阵。

6.Adam原理

维护梯度的一阶矩,也就是EMA,默认参数设置为0.99. dp[i] = λ*dp[i-1] + (1-λ) g_t
维护梯度的二阶矩,也就是梯度平方的EMA。

偏差修正:
训练早期,βt_1和βt_2接近1,导致m_t和v_t偏向于0,导致更新步长不准确。

7.LLM适配多模态时,用的projecter是什么?image encoder用的什么,多少参数?

llava-next的projector用的2层MLP,很简单。
image encoder用的pre-trained CLIP visual encoder ViT-L/14,也就14亿参数。

补一下编程题:
①第一题送分的,判断二叉树的中序遍历是否升序即可。
②第二题当时有点慌了,没做明白。我想的是DFS+剪枝,但是面试官说DFS太笨了,后来提示我DP。当时没想明白方案数只和几个数有关,因为每次放完树根,左右子树里的数还是连续的,是个递归子问题。设dp[i]为i个节点的总方案数,他是由1-n分别当树根的方案数组成的,i作为树根时的方案数dp[i-1] * dp[n-1] (面试的时候写成加法了,没想清楚,后来复盘的时候才发现。)

dp[i] = dp[0] * dp[i-1] + dp[1] * dp[i-2] + … + dp[i-1] * dp[0]

这样的话就n²dp了,n<=19,完全可以接受。

其实这个是卡特兰数,可以再优化一下。C_{n+1} = 2*(2n+1)*Cn / (n+2),优化成O(n)。前提是知道卡特兰数的定义和公式,通过上边的n² dp去推这个公式也有点难。


http://www.mrgr.cn/news/95222.html

相关文章:

  • 单片机flash存储也做磨损均衡
  • 【C#语言】C#中的同步与异步编程:原理、示例与最佳实践
  • RAG各类方法python源码解读与实践:RAG技术综合评测【3万字长文】
  • Redis核心机制(一)
  • C++学习之nginx+fastDFS
  • 从零开始实现Stable Diffusion本地部署
  • DeDeCMS靶场获取wenshell攻略
  • go~协程阻塞分析
  • 大模型在肺源性心脏病预测及治疗方案制定中的应用研究报告
  • [Xilinx]工具篇_PetaLinux自动编译
  • 【问题解决】Postman 测试报错 406
  • vue3+ts项目心得
  • 【VUE】day05-ref引用
  • git tag以及git
  • 基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析
  • K8S下nodelocaldns crash问题导致域名请求响应缓慢
  • c语言笔记 结构体指针运用
  • Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用
  • 【算法day15】最接近的三数之和
  • git tag常用操作