大模型学习-面试篇(一)LLMs通用知识

系列目录-大模型学习系列(适合初学者)

大模型学习-基础篇
大模型学习-实践篇
大模型学习-面试篇

问题场景(Problems)

主要是因为部分同学可能是为了快速了解大模型的相关概念,准备面试的常见问题,所以我决定开启一个篇章来介绍一些大厂的大模型相关面试问题和回答。这一块儿的内容分为两类,一类是针对基础知识的提问,只包括一些通用知识内容;另一类是针对个人项目的问答,则包括很个性化的内容,仅供大家参考。

面试问题清单只包括提问,问答对总结包括提问和回答,可以方便大家进行学习和实战回顾。
注意:建议先学习大模型学习-基础篇,有了一定的知识储备以后再看这个。

面试问题清单(Solution)-实时更新中

理论类:
1.说一下transformer的模型架构和细节?
2.介绍一下self-attention的计算方式?
3.介绍一下pre-Norm,post-Norm,Layer-Norm,Batch-Norm?
4.介绍一下目前主流的大模型的异同点,包括BART,llama,gpt,T5,PaLM?
5.介绍一下Llama中的注意力机制?(GQA),手写实现一下分组注意力机制。
6.介绍一下位置编码的几种类型,以及各自的异同点?
7.具体介绍一下RLHF的具体工程,包含哪几个模型或阶段?
8.分别讲讲encoder-decoder,decoder only,encoder only几种大模型的代表作?(同4.)
9.具体介绍一下PEFT参数高效微调的几种方法?PEFT和传统微调有哪些不同?
10.大模型推理遇到显存不够时,如何解决?
11.介绍一下几种主流大模型的loss函数?
12.介绍一下deepspeed、vLLM、Open-LLM、TensorRT等加速框架?
13.介绍一下半精度训练、混合精度训练?
14.介绍一下BERT和GPT的预训练方式的区别?
15.chatGPT对比GPT3的性能提升来源于哪几个方面?
16.介绍一下SFT和RLHF?
17.简单介绍一下分布式训练怎么做?
18.介绍一下deep speed的zero1,2,3分别是什么?分析一下训练时的显存占用。
19.介绍一下RAG的主要流程?
20.大模型训练的三种并行方式是什么?各自的通讯开销比如何?
21.目前大模型推理存在哪些问题?应该如何解决比较好?
22.介绍一下大模型加速的实现原理?(同:如何进行大模型的加速优化?)
23.介绍一下casual LM和prefix LM的区别
24.介绍一下LoRA的实现原理?
25.介绍一下指令微调和提示工程的区别?
26.介绍一下NLP模型性能评测指标有哪些?

场景类:
1.如果模型训练后准确率很低,你会如何优化?
2.如果文本数据来源和质量差别很大,训练前你会如何处理?
3.如果你来调优一个BERT或者其他预训练模型,适应某个数据集或者任务,你会怎么做?
4.如何看待计算机网络和操作系统在深度学习中的作用?
5.谈一谈对zero-shot和few-shot的理解?
6.我想提高大模型进行推理时的模型性能,应该如何调节参数?
7.当你开发项目时,如何选择?什么情况用Bert模型,什么情况用LLaMA、ChatGPT类大模型?

问答对总结(Conclusion)

理论类:
1.说一下transformer的模型架构和细节?
先介绍大模型的框架结构,包含注意力层,FFN,embedding层,激活函数。
然后介绍self attention的计算和MHA的计算方式+作用。
最后再讲一讲PE的编码方式和作用。

2.介绍一下self-attention的计算方式?
主要介绍一下自注意力机制的计算公式,然后再介绍Q,K,V矩阵如何得来的,softmax函数如何计算的,以及代码实现的基本逻辑。

3.介绍一下pre-Norm,post-Norm,Layer-Norm,Batch-Norm,RMS-Norm,Deep-Norm?
pre-Norm:将LN层放在注意力层前面(Llama系列,GPT系列、Bloom),深层以后的梯度范式近似相等,可以使深层transformer的训练更稳定。

post-Norm:将LN层放在残差连接之后(transformer,ChatGLM系列),深层以后的梯度范式逐渐增大,造成训练不稳定。

Layer-Norm:对每一个batch中的样本,在各个样本自身的特征维度上执行归一化操作。

Batch-Norm:对每一个bactch的样本的每个特征维度,在batch维度上执行归一化操作。

RMS-Norm:取消归一化操作中每一个x需要减去的均值项,减少运算量,但效果仍然持平

4.介绍一下目前主流的大模型的异同点,包括BART,llama,gpt,T5,PaLM
BART(Bidirectional and Auto-Regressive Transformers). 架构:BART采用encoder-decoder架构。训练方法:它结合了双向编码器(类似于BERT)的优势和自回归解码器(类似于GPT)的优势。 BART主要用于文本生成任务,如摘要和翻译。
训练方法:它通过“破坏”输入文本(例如,通过删除单词或打乱句子顺序)然后训练模型来重建原始文本来进行训练。

LLaMA (Large Language Model). 架构:LLaMA是一个基于Transformer的大规模语言模型,它的具体架构取决于其各个版本的实现,但主要以decoder-only或类似于GPT的架构为主。训练方法:LLaMA通过海量文本数据进行预训练,优化了参数效率和计算效率,使其在多种自然语言处理任务上表现出色
GPT(Generative Pre-trained Transformer). 架构:GPT采用decoder-only架构。
训练方法:GPT通过大规模文本数据进行自回归训练,首先在无监督任务上预训练,然后在特定任务上进行微调。它主要用于文本生成任务。

T5 (Text-to-Text Transfer Transformer). 架构:T5采用encoder-decoder架构。
训练方法:T5的特点是将所有NLP任务转换为文本到文本的格式,无论是翻译、摘要还是问题回答。这种统一的方法简化了不同任务之间的处理流程。
PaLM (Pathways Language Model). 架构:PaLM也是基于最新的Transformer技术,其具体架构细节取决于其版本和实现.
训练方法:PaLM采用了类似于GPT的预训练和微调方法,通过大规模的文本数据进行训练,优化了多任务学习和参数效率

异同点总结
架构: BART和T5使用encoder-decoder架构,适合于翻译和摘要等任务;GPT和LLaMA主要采用 decoder-only架构,优于生成任务;PaLM的架构虽然基于Transformer,但其具体设计旨在通过大规模训练提升模型的通用性和效率。

训练方法: BART通过文本破坏和重建进行训练; T5将所有任务转化为文本到文本格式;GPT和 LLaMA通过大规模的无监督预训练和任务特定的微调进行训练;PaLM也采用了大规模预训练,强调在多任务学习中的性能提升。

5.介绍一下Llama中的注意力机制?(GQA),手写实现一下分组注意力机制。
标准多头注意层(MHA)由H个查询头、键头和值头组成。每个头都有D个维度。GQA将H个头分为G个组,每组的注意力头共享K和V矩阵。

伪代码:
(1)首先,定义查询、键和值。然后设置注意力头的数量,数量随意,但需要保证
n u m H e a d s q u e r y = G ∗ n u m H e a d s k e y numHeads_{query} = G * numHeads_{key} numHeadsquery=GnumHeadskey
(2)然后交换seq_len和num_heads维度
(3)然后就是需要在查询矩阵中引入”分组“的概念(其实也是矩阵变换)
(4)计算注意力的分数,通过insum操作完成

完整代码:

from einops import einsum, rearrange
import torch.nn.functional as F

class GroupedQueryAttention(nn.Module):
    def __init__(self, d_model, n_head, g_head): # 特征维度,注意力头数,group组数
        super(GroupedQueryAttention, self).__init__()
        
        self.n_head = n_head
        self.g_head = g_head

        self.n_dim = d_model // n_head # 那么每个头的维度是64,假设4个头一组,一共2个组


        self.linear_query = nn.Linear(d_model, d_model)  # 假设每个token的特征是512维度,一共8个头
        self.linear_key = nn.Linear(d_model, self.n_dim * self.g_head) # 128维度
        self.linear_value = nn.Linear(d_model, self.n_dim * self.g_head)  # 128维度

    
    def forward(self, x):
        query = self.linear_query(x) # 假设是 (1, 256, 512)
        key = self.linear_key(x) # 假设是 (1, 256, 128)
        value = self.linear_value(x) # 假设是 (1, 256, 128)

        query = rearrange(query, "b s (d n) -> b n s d", n = self.n_head) # (1, 8, 256, 64)
        key = rearrange(key, "b s (d n) -> b n s d",n = self.g_head) # (1, 2, 256, 64)
        value = rearrange(value, "b s (d n) -> b n s d",n = self.g_head) # (1, 2, 256, 64)

        query = rearrange(query, "b (g n) s d -> b n g s d", g = self.g_head) # (1, 4, 2, 256, 64)

        scores = einsum(query, key, "b g h n d, b h s d -> b h n s") # torch.Size([1, 2, 256, 256])

        print(scores.shape)  # torch.Size([1, 2, 256, 256])

        scale = query.size(-1)**0.5
        
        attention = F.softmax(scores / scale, dim=-1)

        out = einsum(attention, value, "b h n s, b h s d -> b h n d")

        out = rearrange(out, "b h n d -> b n h d")

        return out

if __name__ == '__main__':
    GQA = GroupedQueryAttention(512, 8, 2)
    X = torch.randn(1, 256, 512)
    X = GQA.forward(X)
    print(X.shape) # torch.Size([1, 256, 2, 64])

6.介绍一下位置编码的几种类型,以及各自的异同点?
相对位置编码:将句子的先后序列关系融入token位置编码中,位置编码包含了每个token与其他token间的相对位置的差值。
绝对位置编码:将句子序列的每个位置按照序列依次增加,每个位置的token的位置编码由其在整个句子中的绝对先后位置所决定。
可学习的位置编码:将位置编码作为一个矩阵加到输入序列上,随训练一起更新。

异同点总结:

特性绝对位置编码相对位置编码可学习位置编码
编码依据基于 token 的绝对位置基于 token 之间的相对距离位置编码作为可训练的参数
灵活性固定,序列长度变化时需重新生成灵活,能够处理变长序列非常灵活,能适应复杂任务
计算复杂度计算简单,基于数学函数生成计算复杂,尤其在长序列时增加训练参数,计算复杂
适用任务适合固定长度序列,适合简单任务适合长距离依赖、跨段任务适用于复杂任务,具有自适应能力
泛化能力对未见序列长度泛化较弱对未见序列长度泛化较强对未见序列长度泛化能力取决于训练数据
依赖额外参数无需额外训练参数通常通过修改注意力机制实现需要额外训练参数

7.具体介绍一下RLHF的具体工程,包含哪几个模型或阶段?

8.分别讲讲encoder-decoder,decoder only,encoder only几种大模型的代表作?(同4.)
具体内容和问题4.相同,但是先说encoder-decoder,decoder only,encoder only是什么,再说有哪些代表模型。

9.具体介绍一下PEFT参数高效微调的几种方法?PEFT和传统微调有哪些不同?
lora、adapter、prompt、prefix
参数更新:只更新部分参数
计算资源:大幅小于传统微调
存储成本:非常小
微调效果:略低于传统/全量微调

10.大模型推理遇到显存不够时,如何解决?
1)模型量化(PTQ/QAT)
2)梯度检查(前向传播时只保存部分激活值,反向传播重新计算部分前向传递结果,以节省显存。)
3)模型并行
4)数据并行
5)序列裁剪(减少max sequence length)
6)减小batch size
7)显存交换(通过GPU和CPU交换部分计算任务)
8)混合精度训练(使用低精度推理)

11.介绍一下几种主流大模型的loss函数?
1)交叉熵损失(Cross-Entropy Loss):BERT、GPT 系列、T5、BART 等 Transformer 模型,交叉熵损失是生成任务和分类任务中最常用的损失函数,衡量了模型输出的概率分布与目标分布之间的差异。其目标是让模型的预测概率尽可能接近目标概率,通常用于多类别分类任务中。对分类任务效果好,能够处理多类别情况。
L = − 1 N ∑ i = 1 N ( y i ∗ l o g ( P ( y i ) ) ) L=-\frac{1}N\sum_{i=1}^N(y_i*log(P(y_i))) L=N1i=1N(yilog(P(yi)))

2)最大似然损失:
L = − 1 N ∑ t = 1 T ( y t ∣ y 1 , y 2 , . . . , y t − 1 ) L=-\frac{1}N\sum_{t=1}^T(y_t|y_1,y_2,...,y_{t-1}) L=N1t=1T(yty1,y2,...,yt1),在自回归模型中,模型每次生成下一个 token 时,损失函数计算当前时间步上预测的 token 概率和真实 token 之间的差异。目标是最大化生成序列的概率。

3)KL 散度损失:KL 散度衡量的是两个概率分布之间的差异。在语言模型蒸馏任务中,KL 散度用于让学生模型的输出分布尽可能接近教师模型的分布:在这里插入图片描述4)均方误差MSE,均方根误差RMSE:衡量的是预测值与真实值之间的差异。它通常用于回归任务中,目标是最小化预测值与真实值之间的平方差异或者直接取根号。在这里插入图片描述
在这里插入图片描述
平均绝对误差MAE:衡量回归模型预测误差的指标,表示预测值与真实值之间的平均绝对差值。
在这里插入图片描述
对异常值不敏感,因为误差不会被平方放大,在某些情况下对较大误差的区分能力较弱。
MAE 和 RMSE 常一起使用,以更全面地评估模型性能。MAE 注重整体误差水平,而 RMSE 更关注大误差的影响。

12.介绍一下vLLM、TensorRT-LLM、deepspeed等加速框架?

vLLM:特点:简单快速、先进的服务吞吐量、CUDA性能优化、高支持性和兼容性;

先进的服务吞吐量

  1. PagedAttention对注意力Keys和Values存储的有效管理;
  2. 连续批处理传入请求;
  3. 使用CUDA/HIP图快速执行模型;
  4. 支持各种解码算法的高吞吐量服务,包括并行采样、波束搜索等;

CUDA优化
进行了CUDA内核优化和使用CUDA/HIP图快速执行模型

支持性和兼容性

  1. 兼容OpenAI的API服务器;
  2. 支持前缀缓存、Multi-lora;
  3. 支持分布式推理、张量并行;
  4. 支持各种量化算法:GPTQ、AWQ、SqueezeLLM、FP8 KV缓存
    GPTQ:训练后量化, 使用梯度信息来优化每一层的量化,减少精度损失。
    AWQ:通过激活值的分布选择最合适的量化策略,减少精度损失,通过权重量化减少模型大小。
    SqueezeLLM:对硬件环境进行高度优化,对模型采用层融合和结构化剪枝的方式减少模型大小。
    FP8量化:将浮点数从FP32 或 FP16 降低到 FP8(H 100支持FP8),压缩模型大小。
    KV 缓存与量化:使用 FP8 量化 KV 缓存后,大幅减少显存占用。

DeepSpeed,特点:高吞吐量、低延迟
高吞吐:
(1) 块KV缓存;
(2) 连续批处理;
(3) Dynamic SplitFuse
(4) 高性能CUDA核;
低延迟技术:
(1) 张量并行;
(2) DeepFusion for Transformers;
(3) 资源约束系统的ZeRO推理;
(4) 编译器优化;

TensorRT-LLM提供了Python API和NVIDIA Triton推理服务器集成的后端,支持H100/A00/T4/V100。
(1) 支持张量并行和流水线并行;
(2) 支持量化模型,INT4或INT8;
(3) In-flight Batching;
(4) MQA/GQA;
(5) PageAttention;
(6) 贪婪搜索、波束搜索

常用的推理加速框架调用实践

13.介绍一下半精度训练、混合精度训练?

半精度训练:使用半精度(FP16)替换单精度(FP32),减少显存占用,提高 GPU 的并行处理能力。

混合精度训练:同时使用单精度(FP32)和半精度(FP16),加括模型的训练过程,降低显存占用和计算资源要求。

优点:
减少内存占用:FP16的位宽是FP32的一半,权重参数节省一半。
加快通讯效率:针对分布式训练,减少通讯的开销,加快数据的流通。
计算效率更高:使用FP16的执行运算性能比FP32更加快(NVIDIA的V100、华为Ascend 910和310)。

缺点:数据溢出: FP16相比FP32的有效范围要窄很多,使用FP16替换FP32会出现上溢(Overflow)和下溢(Underflow)的情况。权重的梯度是一阶导数,比权重值更小,容易出现数据下溢。当网络模型的反向梯度很小时FP32能够表示,但是FP16会小于当前区间内的最小间隔,会导致数据溢出(舍入误差)。

混合精度训练方法:
1、权重备份(Weight Backup)-避免权重更新无效:
对权重weights,激活activations,梯度gradients等使用 FP16 来进行存储和计算,但是权重使用FP32进行备份。
2、损失缩放(Loss Scaling)-解决梯度过小的数据下溢:
前向计算时将损失变化值增大 2 k 2^k 2k倍,反向传播时将权重梯度缩小 2 k 2^k 2k倍,以FP32存储。
动态损失缩放:每当梯度溢出时候减少损失缩放规模,并且间歇性地尝试增加损失规模,从而实现在不引起溢出的情况下使用最高损失缩放因子,更好地恢复精度。
3、精度累加(Precision Accumulated)-弥补丢失的精度:
使用FP16进行矩阵乘法运算,利用FP32来进行矩阵乘法中间的累加(accumulated),然后再将FP32的值转化为FP16进行存储

混合精度训练详解

14.介绍一下BERT和GPT预训练方式的区别?
BERT:采用掩码语言模型和下一句预测任务进行预训练,模型是transformer编码器部分,输入采用双向的注意力掩码和自注意力机制。

GPT:采用自回归语言模型进行预训练,模型是transformer
解码器部分,采用单向注意力掩码和多头自注意力机制。

15.chatGPT对比GPT3的性能提升来源于哪几个方面?
1)模型参数提升:具有更大的参数量
2)人类反馈强化学习RLHF:通过强化学习和人类反馈实现模型对齐
3)指令微调:加入监督信号,改善模型输出的明确性
4)数据集质量:多样化、广泛化、多领域

16.介绍一下SFT和RLHF?
SFT:通过标注数据集实现指令对话的有监督学习,算法简单,但是依赖高质量的人工标注数据集。
RLHF:包括四个阶段,SFT+生成答案排序+人类反馈+强化学习,训练流程复杂,但是对齐效果好,生成结果更符合人类期望。四个阶段如下:

1)SFT 阶段:通过人类标注数据进行模型微调。
2)生成候选答案阶段:模型生成多个候选答案,准备进行评价。
3)人类反馈阶段:人类对这些候选答案进行排序或打分,训练奖励模型。
4)强化学习优化阶段:通过奖励模型的评分,使用强化学习(PPO)优化生成模型的输出质量。
PPO的损失函数如下:
在这里插入图片描述
解释:当A>0时,变好的幅度不会太大。当A<0时,纠偏的幅度不会太小。
新旧策略的比值,定义为:
在这里插入图片描述
在特定状态 𝑠下,采取动作 𝑎相较于其他动作有多大优势:
在这里插入图片描述

17.简单介绍一下分布式训练怎么做?
(1)数据并行:
每个计算设备都有整个神经网络模型的完整副本。假设一个批次的训练样本数为 N,使用 M 个计算设备并行计算,每个计算设备会分配到 N/M个样本。前向计算完成后,每个计算设备都会根据本地样本计算损失误差得到梯度,并将本地梯度进行广播。所有计算设备需要聚合其他计算设备计算的梯度值,然后使用平均梯度 对模型进行更新,

(2)模型并行:
第一种:按模型的层切分到不同设备,即层间并行或算子间并行(Inter-operator Parallelism),也称之为流水线并行(Pipeline Parallelism,PP)

第二种:将计算图层内的参数切分到不同设备,即层内并行或算子内并行(Intra-operator Parallelism),也称之为张量并行(Tensor Parallelism,TP)
张量并行:
嵌入表示(Embedding)算子:矩阵切分+合并(类似查表)
矩阵乘算子:矩阵分块乘法原理,按行切分或者按列切分。
分类交叉熵算子:可以按照类别维度切分,同时通过中间结果通信,得到最终的全局的交叉熵损失

18.介绍一下DeepSpeed的zero1,2,3分别是什么?分析一下训练时的显存占用。
首先,deepspeed是一个开源的大模型推理加速框架。
模型训练过程中的显存占用,大模型的显存占用主要分布在两个地方:

  1. 模型状态维护上
  2. 激活值

ZeRO-1:只对optimizer状态进行切分
具体步骤:
1)把batch分成N份,每张卡(GPU)一份。
2)执行一步前向和反向传播计算后,每个GPU各得一份梯度。
3)对梯度执行all-reduce操作,得到完整梯度,这里all-reduce操作是将每个节点上的部分梯度累加起来,并将结果广播到所有节点,这样所有节点都拥有一份完整的梯度。
4)每个 GPU 得到完整的梯度 G后,对各自的权重进行更新,权重的更新由优化器状态和梯度共同决定。在这里,优化器的状态也被切分成了N份,每个GPU只需要存储和更新总优化器状态的 1/N ,并更新1/N 的权重;
5)每个GPU维护各自优化器里面更新的权重,最后执行all-gather,使得每个GPU都有更新后的权重,all-gather 操作将更新后的权重同步到所有节点。

ZeRO-2:在optimizer状态划分的基础上,再对梯度也进行划分,每个GPU各自维护一块自己的梯度
具体步骤:
1)把batch分成N份,每张卡(GPU)一份
2)执行一步前向和反向传播计算后,每个GPU各得一份梯度
3)对梯度执行all-reduce,保证每个GPU所维护的梯度是聚合梯度(即各节点汇总之后的梯度),聚合之后对梯度进行切分
具体是怎么切分梯度的呢? 举个栗子——
eg:① 比如GPU1只负责维护梯度G1,其他GPU只需要把对应位置梯度发给GPU1即可
② 汇总完毕后,其他不是GPU1维护的梯度会从GPU1中移除,即更新后马上释放
每个GPU用所维护的优化器和梯度更新相应的权重,即每块GPU维护独立的权重
最后对权重执行all-gather,将其他GPU的权重同步一份完整的到自己节点上来

ZeRO-3:ZeRO-3在ZeRO-1和ZeRO-2的基础上,对权重进行各自的维护,即不再维护一整份权重了
具体步骤:
1)把batch分成N份,每张卡(GPU)一份
2)这个时候模型的权重参数(张量)也被分成N份
3)在进行前向计算之前,对权重执行all-gather操作取回分布在各GPU上的权重,组成完整的参数进行前向计算,计算完成后,把不属于自身维护的权重抛弃
4)在进行反向传播计算之前,对权重执行all-gather操作取回分布在各GPU上的权重,组成完整的参数进行反向传播计算,计算完成后,把不属于自身维护的权重抛弃
5)backward之后得到各自的梯度,对梯度执行all-reduce,得到聚合的梯度之后更新其自身维护的权重,然后立刻把不是自己维护的梯度抛弃

由于每个GPU只保存其自身维护的权重参数,因为无需对权重进行all-reduce

ZeRO-Offload
把占用显存多的部分卸载到cpu上,计算和激活值部分放到gpu上,这样比起跨机,更能节省内存,也能减少跨机跨通信域的通信压力。
原理:
高计算:前向传播和反向传播计算量高,相关的权重参数计算和激活值计算仍然在gpu
低计算:权重更新部分计算量低,以通信为主,且需要的显存较大,放入到cpu中

19.介绍一下RAG的主要流程?
‌RAG的主要流程包括向量化、检索、生成。‌

‌索引‌:这一步骤是将文档分割成小块(chunks),并为这些块生成嵌入向量,然后将它们索引到向量库中。索引过程是组织系统的关键步骤,面临的主要挑战包括不完整的内容表示和不准确的chunk相似性搜索。通过将文本分解成可管理的chunk,RAG能够有效地减少生成事实不正确内容的问题,提高生成内容的相关性和质量。

‌检索‌:在检索阶段,通过比较查询内容与索引向量,找到与问题最相关的文档块。这一步的目的是为后续的生成过程提供有用的上下文信息和知识支撑。通过引用外部知识,RAG有效地减少了生成事实不正确内容的问题,提高了生成内容的质量和相关性。

‌生成‌:生成阶段是将找到的相关文档与原始问题结合,作为额外上下文传递给大型语言模型(LLM),生成最终答案。这一步的目的是结合LLM生成符合用户需求的回答。通过增强步骤,LLM模型能够充分利用外部知识库中的信息,使生成的文本内容更加丰富、准确和符合用户需求。

20.大模型训练的三种并行方式是什么?各自的通讯开销比如何?
大模型训练的三种主要并行方式包括数据并行、模型并行和流水线并行。这些并行方式各有特点,其通讯开销比取决于模型的具体结构和训练需求。

数据并行‌:将数据集分成多个子集,每个子集分配给不同的计算节点(GPU),每个节点上都有完整的模型副本。这种方式实现简单,扩展性好,适用于大多数深度学习任务。但通信开销较大,特别是在节点数量增加时。。

‌流水线并行‌:将模型按层或模块顺序切分成多个阶段,每个阶段分配到不同的计算节点上,形成流水线。这种方式可以减少单个节点的内存占用,适用于深度模型。然而,其实现复杂,存在流水线填充和空闲时间,可能导致效率降低。

张量并行‌:将模型的张量(如权重矩阵)按维度切分到不同的计算节点上。这适用于单个张量过大的情况,可以显著减少单个节点的内存占用。但通信开销较大,特别是在切分维度较多时。

各自的通讯开销比‌:
1)数据并行的通信开销则来自于模型参数和梯度的同步更新,尤其是在节点数量增加时,通信开销会更加显著。
‌2)流水线并行的通信开销主要来自于设备间的数据传输和同步,以及模型层的顺序执行导致的空闲时间。‌
‌3)张量并行的通信开销主要来自于张量的切分和合并过程中的集合通信操作,如AllGather或AllReduce。‌

21.目前大模型推理存在哪些问题?应该如何解决比较好?
当前大模型推理面临的主要问题包括推理速度慢、内存和存储开销大、成本高、实时性与延迟、推理结果的可靠性与鲁棒性,以及能源消耗过大等。

1.由于大模型包含大量参数,推理过程计算复杂,导致推理速度慢,尤其在实时应用中无法满足快速响应的需求。为解决这一问题,常用方法包括模型压缩、剪枝、蒸馏等技术,以减少计算量;同时,利用高效推理框架(如 TensorRT、ONNX Runtime)和硬件加速(如 GPU、TPU)来提升推理效率。

2.大模型的内存和存储需求也很高,特别是在边缘设备上,内存瓶颈更加显著。对此,可以采用分布式计算和动态加载参数的方法。推理过程还伴随高昂的成本,特别是在云端部署时,计算资源的消耗极大。为降低成本,可以通过混合精度推理、优化模型结构等方法减少资源使用。

3.此外,推理延迟过大在需要实时性的场景中表现明显,使用模型分层、边缘推理和并行硬件可以改善延迟问题。

4.大模型的推理结果在面对不常见输入或对抗攻击时可能不够可靠,需引入对抗训练、不确定性评估等方法来增强鲁棒性。

22.介绍一下大模型加速的实现原理?(同:如何进行大模型的加速优化?)

1.flash attention v1和v2

2.vLLM的加速原理

23.介绍一下casual LM和prefix LM的区别

24.介绍一下LoRA的实现原理?

25.介绍一下指令微调和提示工程的区别?
1)指令微调需要通过训练改变模型的参数,提示工程不需要
2)指令微调是给予模型需要的领域内知识或能力,提示工程是激发模型的知识或推理的潜力
3)指令微调需要进行质量较高的有标注数据集,提示工程不需要

26.介绍一下NLP模型性能评测指标有哪些?
1)准确率,召回率,精确率,F1
2)acc@k,recall@k
3)上下文相关性
4)生成文本的困惑度perplexity
5)标准评测数据集的评估/使用最新的数据进行标注和评估
6)人工主观评测

27.为什么现在大模型都采用decoder-only架构
1)涌现能力已被证明
2)训练时效率更高,更多token被模型看到
3)casual decoder的双向注意力会存在低秩问题,这可能会削弱模型表达能力。

基于预测的指标

1)准确率,衡量模型在预测任务中正确预测的比例。它可以用于分类任务,如情感分析、实体识别等。准确率的计算公式为:
A c c u r a c y = ( T P + T N ) / ( T P + T N + F P + F N ) Accuracy=(TP+TN)/(TP+TN+FP+FN) Accuracy=TP+TN/TP+TN+FP+FN
其中,TP(True Positive)表示正例被正确预测为正例,TN(True Negative)表示负例被正确预测为负例,FP(False Positive)表示负例被错误预测为正例,FN(False Negative)表示正例被错误预测为负例。

2)召回率,衡量模型对所有正例的检测率。它可以用于分类任务,如对象检测、实体识别等。召回率的计算公式为:
R e c a l l = T P / ( T P + F N ) Recall=TP/(TP+FN) Recall=TP/(TP+FN)

3)F1分数,综合评估指标,结合准确率和召回率。它可以用于分类任务,如情感分析、实体识别等。F1分数的计算公式为: F 1 = 2 × P r e c i s i o n × R e c a l l / ( P r e c i s i o n + R e c a l l ) F1=2×Precision×Recall/(Precision+Recall) F1=2×Precision×Recall/(Precision+Recall)其中,精度(Precision)是预测为正例中正确预测的比例: T P / ( T P + F P ) TP/(TP+FP) TP/(TP+FP),召回率 R e c a l l Recall Recall是所有正例中被预测为正例的比例: T P / ( T P + F N ) TP/(TP+FN) TP/(TP+FN)

基于排名的指标

1)Precision@K
Precision@K是一种基于排名的评估指标,用于衡量模型在预测任务中前K个结果中正确的比例。它可以用于检索任务,如图像搜索、文本相似度等。精度@K的计算公式为:
P r e c i s i o n @ K = N c o r r e c t K Precision@K = \frac{N{correct}}{K} Precision@K=KNcorrect

其中, N c o r r e c t Ncorrect Ncorrect表示前K个结果中正确的数量,K是用户设定的阈值。

2)Recall@K
Recall@K是一种基于排名的评估指标,用于衡量模型在预测任务中前K个结果中正确的比例。它可以用于检索任务,如图像搜索、文本相似度等。召回@K的计算公式为:
R e c a l l @ K = N c o r r e c t N r e l e v a n t Recall@K = \frac{N{correct}}{N{relevant}} Recall@K=NrelevantNcorrect
其中, N c o r r e c t Ncorrect Ncorrect表示前K个结果中正确的数量, N r e l e v a n t Nrelevant Nrelevant表示所有相关结果的数量。

场景类:
1.如果模型训练后准确率很低,你会如何优化?

2.如果文本数据来源和质量差别很大,训练前你会如何处理?

3.如果你来调优一个BERT或者其他预训练模型,适应某个数据集或者任务,你会怎么做?

4.如何看待计算机网络和操作系统在深度学习中的作用?

5.谈一谈对zero-shot和few-shot的理解?

6.我想提高大模型进行推理时的模型性能,应该如何调节参数?

7.当你开发项目时,如何选择?什么情况用Bert模型,什么情况用LLaMA、ChatGPT类大模型?

**Bert模型:**适合于需要理解文本含义的任务,如文本分类、命名实体识别、问答系统等。BERT的双向训练机制使其在理解上下文中的词义方面表现优秀。因此,当任务需要深入理解文本内容时,BERT是一个好选择。
**LLaMA、ChatGPT类大模型:**适用于需要生成文本、维持对话、翻译或其他需要大量常识和语言生成能力的任务。这类模型通过在大规模数据集上的预训练获得了广泛的知识和强大的语言理解及生成能力。当任务需要模型生成连贯、相关且富有创造性的文本时,选择LLaMA、ChatGPT类大模型更为合适。

总结:在选择模型时,应考虑任务的具体需求、模型的能力限制、计算资源和部署成本。Bert模型在理解特定任务的文本时可能更高效,而LLaMa、ChatGPT类大模型则在需要广泛的常识知识和文本生成能力时展现优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值