影石多模态大模型算法工程师一面面经攒人品
社招第一次面试手撕了这么多代码.....太硬核了!
基操:项目做的是什么?
你训练算法过程中一般用哪些损失函数?
中途插入问题:qwenvl系列的模块设计由哪些部分组成?
然后就直接开始手撕代码了:
多模态输入、Token 处理、Self/Cross Attention、Mask、LoRA、Dataset/DataLoader、训练流程、累计梯度、eval、多进程通信、微调方法 全都要会写代码。
多模态大模型算法岗 · 高频面试题 + 标准答案(完整版)
1. 多模态模型(图文)输入是怎么 Tokenize 的?
答:
- 文本用文本分词器转成文本 Token。
- 图片不直接分词,而是切成固定大小的 Patch,每个 Patch 当作一个视觉 Token。
- 最终把 文本 Token + 视觉 Token 拼接成一个序列,送入 Transformer。
2. 图片是怎么变成模型输入的?(Qwen-VL 风格)写代码
答:
- 图片缩放到固定尺寸(如 448x448)
- 切成 14x14 的 Patch → 得到 32x32=1024 个视觉 Token
- 经过视觉编码器(ViT)变成 Embedding
- 加上
<image>特殊 Token 做模态区分 - 和文本 Token 维度对齐后拼接
3. Self-Attention 前向计算流程?写代码
答:
- 输入 X 线性投影得到 Q、K、V
- 拆成多头
- 计算注意力分数:
Q @ K.T / sqrt(d_k) - 加 Mask
- Softmax 得到权重
- 加权 V
- 合并多头 + 输出投影
4. Attention 里的 Mask 怎么加?
答:Mask 就是把无效位置的分数减去一个极大值(-1e9),让 Softmax 后趋近于 0。常见三种:
- Padding Mask:屏蔽补齐的无效 Token,作用是什么呢?
- Causal Mask:下三角矩阵,防止看到未来 Token
- Modality Mask:限制图片/文本之间的关注
5. Cross-Attention 和 Self-Attention 区别?写代码
答:
- Self-Attention:Q、K、V 来自同一个序列
- Cross-Attention: Q 来自文本(Decoder)K、V 来自图片(Encoder) 用于文本去查图片信息。
写代码
6. Cross-Attention 里 Causal Mask 加在哪?写代码
答:只加在 Q 侧(文本),控制文本生成顺序,和 K/V(图片)无关,扩展维度后广播相加。
写代码
7. 自定义 Dataset 必须实现哪 3 个方法?
答:
__init__:初始化数据、路径、预处理__len__:返回数据集长度__getitem__:根据 idx 返回一个样本(读取+预处理)
8. DataLoader 作用是什么?
答:批量、打乱、多线程加载数据,自动把 __getitem__ 的结果拼成 batch。
9. 完整分类模型训练流程?写代码
答:
- Dataset + DataLoader 加载数据
- 模型前向得到 logits
- 计算 CrossEntropyLoss
- 梯度清零 → 反向传播 → 优化器更新
- 评估:model.eval() + torch.no_grad()
10. 累计梯度(Gradient Accumulation)怎么实现?写代码
答:
- 每
accum_steps个 batch 才更新一次参数 - 中间不清零梯度
- loss 除以
accum_steps防止梯度过大
loss = loss / accum_steps
loss.backward()
if step % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()
11. model.eval() 除了不更新参数还有什么用?
答:
- 关闭 Dropout
- 固定 BN 的均值方差
- 关闭训练时的随机行为 真正禁止梯度的是 torch.no_grad()。
12. 模型微调有哪些方法?
答:
- Full Fine-tuning:全参数训练
- Freeze:冻结主干,只训练顶层/Head
- LoRA:低秩适配,只训练 A、B 矩阵
- Adapter:插入小网络层
- 渐进式微调:先训 Head,再解冻上层
13. LoRA 的公式是什么?(核心!)写代码
答:原始:y = Wx + b
LoRA:y = (W + BA)x + b(不拆 W,只加低秩增量 ΔW=B@A)
维度:
- A: [d_in, r]
- B: [r, d_out]
只训练 A、B,W 冻结。
14. 数据加载为什么要用多线程?怎么开?
答:IO/预处理太慢,用多线程并行处理。
在 DataLoader 里设置:
num_workers=16 pin_memory=True persistent_workers=True prefetch_factor=2
15. 进程间通信(IPC)有哪些方式?
答:
- Pipe:双端通信,最简单
- Queue:线程安全队列,DataLoader 底层用
- 共享内存:最快,适合大数据
- Manager:共享字典/列表
- Socket:跨机器通信
训练里最常用:Queue + 共享内存。
这份面经的定位
多模态大模型 / Transformer / 训练工程 / 数据 pipeline 全覆盖适合:
- 算法工程师
- 多模态模型工程师
- NLP/LLM 微调岗
- 自动驾驶/多模态面试
太太太硬核了,希望二面轻松点......
查看78道真题和解析