大模型知识

发布于:2025-05-22 ⋅ 阅读:(19) ⋅ 点赞:(0)


##############################################################
一、vllm大模型测试参数和原理
tempreature top_p top_k
##############################################################
    tempreature top_p top_k
    作用:总体是控制模型的发散程度、多样性、确定性,不同参数设置匹配不同的场景
        
1. Temperature(温度)
作用:控制生成文本的随机性和多样性。

原理:

在 softmax 计算概率分布时,调整 logits(模型输出的原始分数)的缩放比例。

公式:softmax(logits / temperature)。

影响:

temperature > 1:放大低概率选项,输出更随机、多样(可能包含更多错误或创造性内容)。

temperature < 1:缩小低概率选项,输出更确定、保守(倾向于高概率的常见词)。

temperature = 0:完全确定性,总是选择概率最高的词(但实际实现中通常设为接近 0 的小值)。

适用场景:

需要创造性(如诗歌、故事生成)时提高温度。

需要准确性和一致性(如问答、代码生成)时降低温度。

2. Top-k(顶部 k 采样)
作用:限制每一步只从概率最高的 k 个候选词中采样。

原理:

对概率分布进行排序,保留前 k 个最可能的词,重新归一化它们的概率后采样。

影响:

k 值大:候选词多,输出多样性高(可能包含不相关词)。

k 值小:候选词少,输出更保守(但可能重复或单调)。

k = 1:退化为贪心搜索(等同 temperature=0)。

缺点:

固定 k 可能在某些上下文保留不合理的词(如概率分布平坦时,低概率词也可能进入候选)。

3. Top-p(核采样,Nucleus Sampling)
作用:动态地从累积概率超过 p 的最小候选词集合中采样。

原理:

对概率分布排序,累加概率直到超过阈值 p,仅从这部分词中采样。

例如 p=0.9 时,选择最小数量的词使得它们的总概率 ≥ 90%。

影响:

p 值大(如 0.9):候选词多,多样性高。

p 值小(如 0.3):候选词少,输出更确定。

p → 0:退化为贪心搜索。

优势:

自适应候选词数量,适合概率分布不均匀的场景(避免固定 k 的缺陷)。

4. 参数间的交互
优先级:top_p 和 top_k 通常联合使用(如 top_k=40, top_p=0.9),但若同时设置,top_p 会覆盖 top_k 的条件。

与温度的关系:

temperature 在 top_p/top_k 之前生效,先调整概率分布的形状,再应用采样策略。

例如:高温 + 低 top_p 可能导致更多样但低质量的输出。

5. 典型配置示例
场景    推荐参数    说明
代码生成/事实问答    temperature=0.2, top_p=0.1    确定性高,减少错误
创意文本/对话生成    temperature=0.7, top_p=0.9    平衡多样性和合理性
极端创造性任务    temperature=1.0, top_k=50    高风险高多样性
6. 其他相关参数
Repetition Penalty:抑制重复词(如 repetition_penalty=1.2)。

Beam Search:完全确定性生成时使用(与采样参数互斥)。

##############################################################
二、vllm大模型推理原理
##############################################################
vLLM(Very Large Language Model) 是一个针对大语言模型(LLM)推理优化的高效推理框架,由加州大学伯克利分校团队开发。其核心目标是 提升大模型推理的吞吐量和降低延迟,同时支持灵活的采样策略(如 Top-k、Top-p)和长上下文处理。以下是其核心原理和关键技术的详细解析:

1. 核心设计目标
高吞吐量:支持同时处理大量请求(如数百个并发用户)。

低延迟:快速生成响应,减少用户等待时间。

内存高效:优化显存使用,支持更大的模型或更长的上下文。

灵活性:兼容多种采样参数(Temperature、Top-p、Top-k)和模型架构(如 GPT、LLaMA)。

2. 关键技术原理
(1)PagedAttention(分页注意力机制)
问题背景:

传统注意力机制在处理长序列时,需要将全部 KV Cache(键值缓存)存储在连续显存中,导致显存碎片化和浪费。

例如,不同请求的序列长度差异大时,显存分配效率低。

解决方案:

将 KV Cache 分页管理,类似操作系统的虚拟内存分页:

每个序列的 KV Cache 被划分为固定大小的“块”(如 16 个 token 一块)。

显存按需分配块,不同序列的块可以非连续存储。

优势:

显著减少显存浪费,支持更长的上下文(如 100K tokens)。

提升并发请求的吞吐量(显存利用率更高)。

(2)Continuous Batching(连续批处理)
问题背景:

传统批处理(Static Batching)需等待所有请求完成后才能处理下一批,导致 GPU 空闲。

生成式模型的请求完成时间不一致(如短回答 vs 长文生成)。

解决方案:

动态插入新请求到运行中的批次:

当一个请求生成完一个 token 后,若批次中有空闲槽位,立即插入新请求。

称为 Iteration-level Scheduling(迭代级调度)。

优势:

GPU 利用率接近 100%,吞吐量提升 2-4 倍。

用户感知的延迟更低(无需等待整批完成)。

(3)内存优化
KV Cache 共享:

对于同一提示词(prompt)的多个请求,共享其 KV Cache,减少重复计算。

Zero-copy 技术:

主机(CPU)和设备(GPU)间数据传输优化,减少内存拷贝开销。

(4)高效采样支持
原生支持 Temperature、Top-k、Top-p 等采样策略,无需额外计算开销。

通过并行化采样步骤,减少生成延迟。

3. 推理流程(Step-by-Step)
    以生成式推理(如 GPT)为例:

        输入处理:

            用户输入提示词(prompt),转换为 token 序列。

            模型编码 token 并生成初始 KV Cache。

        分页存储:

            PagedAttention 将 KV Cache 分块存储到显存中。

        迭代生成:

            每次迭代生成一个 token,动态更新批次(Continuous Batching)。

            根据采样参数(如 Top-p)选择下一个 token。

        输出返回:

            当生成结束符(EOS)或达到最大长度时,返回结果并释放显存。

4. 性能对比
        技术指标            vLLM                        传统推理框架(如 HF Transformers)
        吞吐量            高(支持数百并发)                    低(受限于静态批处理)
        显存效率        高(PagedAttention 减少浪费)        低(KV Cache 需连续存储)
        长上下文支持    支持 100K+ tokens                    通常限制在 4K-32K tokens
        采样灵活性        原生支持 Top-k/Top-p                需手动实现,可能引入延迟
5. 适用场景
    高并发服务:如聊天机器人、API 服务。

    长文本生成:如文档摘要、代码生成。

    研究实验:快速测试不同采样参数的影响。

6. 代码示例(使用 vLLM)
    python
    from vllm import LLM, SamplingParams

    # 初始化模型和采样参数
    llm = LLM(model="meta-llama/Llama-2-7b-chat-hf")
    sampling_params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=100)

    # 批量推理
    prompts = ["Explain AI in one sentence.", "Write a poem about winter."]
    outputs = llm.generate(prompts, sampling_params)

    for out in outputs:
        print(f"Prompt: {out.prompt}, Generated: {out.outputs[0].text}")
7. 与同类框架对比
框架                        核心优势                        局限性
vLLM                    高吞吐、PagedAttention        主要支持自回归模型(如 GPT)
TGI (HuggingFace)        支持多模态模型                长上下文显存效率较低
DeepSpeed-Inference        分布式推理优化                        配置复杂

8. 未来方向
多模态扩展:支持视觉-语言联合推理。

更细粒度调度:优化混合长短请求的场景。

量化集成:结合 4-bit 量化进一步降低显存占用。

总结来说,vLLM 通过 PagedAttention 和 Continuous Batching 两大核心技术,解决了大模型推理中的显存效率和吞吐量瓶颈,成为目前生产环境部署 LLM 的首选框架之一。


##############################################################    
二、多卡并行推理的并行方式的基本原理
##############################################################
    多卡并行推理的并行方式的基本原理
    TP并行 Tensor Parallelism,张量并行
    PP并行 流水线并行(Pipeline Parallelism)
    EP并行 Expert Parallelism,专家并行
    deepseek PD分离

1、1. 数据并行(Data Parallelism)
原理:

将输入数据(批次)拆分到不同GPU,每张卡独立计算完整模型的推理结果,最后同步结果。

每张GPU存储完整的模型副本。

工作流程:

主GPU将批次数据均分到各GPU(如批次大小=16,4卡时每卡分到4条数据)。

各GPU并行计算前向传播。

收集所有GPU的输出结果(如通过 all_gather 操作)。

优势:

实现简单,适合高吞吐场景(如批量处理大量短文本)。

缺点:

每卡需存储完整模型,显存占用高,无法支持超大规模模型。

适用场景:

模型能单卡放下,但需要提高批量推理效率。

2. 模型并行(Model Parallelism)
(1)张量并行(Tensor Parallelism)
原理:

将模型单层的权重矩阵拆分到不同GPU,每张卡只计算部分结果,通过通信拼接完整输出。

例如:线性层 
Y
=
X
W
Y=XW 中,将权重矩阵 
W
W 按列拆分,每卡计算部分乘积。

关键技术:

Megatron-LM 风格拆分:对矩阵乘法的行或列拆分,配合 all-reduce 通信。

通信开销:每层需同步中间结果(如通过NCCL)。

示例:

在4卡上拆分FFN层的权重矩阵:

python
# 原始权重 W (hidden_dim, 4*hidden_dim)
# 拆分到4卡,每卡存储 W_part (hidden_dim, hidden_dim)
Y = torch.cat([X @ W_part_i for W_part_i in W_parts], dim=-1)  # 需要通信
优势:

支持单层参数量超过单卡显存的模型。

缺点:

通信频繁,延迟敏感。

(2)层间并行(Layer-wise Parallelism)
原理:

将模型的不同层分配到不同GPU(如GPU0处理1-10层,GPU1处理11-20层)。

缺点:

设备空闲率高(如GPU0需等待GPU1完成前一层的计算),较少单独使用。

3. 流水线并行(Pipeline Parallelism)
原理:

将模型按层分组,每组层放到不同GPU,数据像流水线一样依次流过各设备。

通过微批次(Micro-batching)隐藏通信延迟。

工作流程:

将输入数据分成多个微批次(如批次=8,微批次=2)。

GPU0处理微批次1的第1组层后,将激活值发送给GPU1,同时开始处理微批次2的第1组层。

各GPU交替计算和通信,形成流水线。

优势:

支持超长模型(如千亿参数模型)。

缺点:

需要平衡各阶段计算负载,否则效率下降(气泡问题)。

优化技术:

梯度累积:多个微批次后再反向传播,减少气泡。

1F1B调度(One-Forward-One-Backward):优化设备利用率。

4. 混合并行策略
实际部署中常组合多种并行方式:

案例1:GPT-3 175B 的推理:

张量并行:每层的矩阵计算拆分到8卡。

流水线并行:将模型按层分组,分配到多组设备(如8组,每组8卡)。

数据并行:对流水线并行的每组设备复制多份(如64卡=8组×8卡)。

案例2:vLLM 的多卡推理:

数据并行:处理不同请求的批次。

张量并行:单个大请求的模型计算拆分。

5. 通信机制
关键操作:

all-reduce:聚合各卡的梯度或输出(数据并行)。

all-gather:拼接拆分后的张量(张量并行)。

point-to-point:流水线并行的层间数据传输。

通信库:

NCCL(NVIDIA):优化多GPU通信,支持高速PCIe/NVLink。

RPC(PyTorch):用于跨节点通信。

6. 显存优化技术
KV Cache 分区:

在张量并行中,将注意力机制的KV Cache拆分到多卡,减少单卡显存压力。

Zero-Inference:

类似Zero-Redundancy Optimizer(ZeRO)的技术,优化显存占用。

#################################################################
三、PD 分离的基本思想
#################################################################
1. PD 分离的基本思想
    参数解耦:将模型的参数划分为多个相对独立的子集,每个子集负责不同的功能或任务,避免参数之间的过度耦合。

    典型场景:

    多任务学习:不同任务共享部分参数(如特征提取层),但保留任务专属参数(如分类头)。

    模块化设计:模型的不同模块(如注意力头、专家层)参数独立优化。

    动态推理:根据输入动态激活部分参数(如MoE模型中的专家选择)。

2. DeepSeek 中 PD 分离的可能应用
    (1)专家模型(MoE)中的参数解耦
    背景:DeepSeek 可能采用混合专家(MoE)架构,其中不同专家(Expert)对应不同的参数子集。

    PD 分离:

    每个专家的参数完全独立,通过门控(Gating)机制动态激活。

    例如:输入 token A 由专家1处理,token B 由专家2处理,两者参数无共享。

    优势:

    显存高效:仅激活部分参数,适合超大规模模型。

    专业化:不同专家可学习不同领域的特征。

    (2)多阶段训练的参数隔离
    预训练 vs 微调解耦:

    预训练阶段:冻结核心参数(如底层Transformer层),仅微调特定头部参数。

    例如:DeepSeek-R1 模型可能解耦通用知识和领域适配参数。

    优势:

    避免灾难性遗忘,提升微调效率。

    (3)硬件感知的参数分布
    显存与计算分离:

    高频访问参数(如注意力头的KV Cache)放在高速显存,低频参数(如部分FFN层)放在低速存储。

    类似 DeepSpeed-ZeRO 的分级参数管理。

    3. PD 分离的技术实现
    (1)参数分组与优化器配置
    在优化器(如AdamW)中为不同参数组设置独立的学习率或权重衰减:

    python
    # 示例:PyTorch 中的参数分组
    group1 = {'params': model.shared_parameters(), 'lr': 1e-5}  # 共享参数
    group2 = {'params': model.task_specific_parameters(), 'lr': 1e-4}  # 任务专属参数
    optimizer = torch.optim.AdamW([group1, group2])
    (2)动态参数激活
    基于输入选择性地加载部分参数(如MoE的门控机制):

    python
    def forward(self, x):
        gate_scores = self.gating_network(x)  # 计算门控分数
        expert_idx = torch.argmax(gate_scores, dim=-1)  # 选择专家
        y = self.experts[expert_idx](x)  # 仅激活被选专家的参数
        return y
    (3)梯度隔离
    通过停止梯度(detach)或掩码阻止某些参数的更新:

    python
    frozen_params = model.embedding.weight
    frozen_params.requires_grad = False  # 冻结嵌入层参数
    4. PD 分离的优势
    训练效率:减少冗余计算和显存占用。

    模型可解释性:不同参数组对应明确的功能模块。

    灵活部署:可单独更新或替换部分参数(如领域适配时仅微调头部)。

5. 与其他技术的对比
    技术    PD 分离    传统耦合参数
    参数更新粒度    细粒度(分组/模块化)    全局统一更新
    显存占用    动态降低(仅激活部分参数)    固定
    适用场景    MoE、多任务、大规模模型    小型单一任务模型
    6. 潜在挑战
    路由偏差:在MoE中,门控机制可能偏向某些专家,导致负载不均衡。

    通信开销:分布式训练中,参数解耦可能增加同步复杂度(如All-to-All通信)。

    收敛性:需谨慎设计参数组的优化策略,避免训练不稳定。

    总结来说,DeepSeek 中的 PD 分离 可能指通过参数解耦实现更高效的模型设计或训练策略,尤其在 MoE 架构或多任务学习中表现突出。具体实现需结合模型架构和任务需求,核心目标是平衡参数共享与专业化,以提升性能和可扩展性。
#################################################################
大模型推理主要过程
    比如prefill和decode阶段都做了什么
#################################################################
    在大模型(如GPT、LLaMA等)的推理过程中,生成文本通常分为两个核心阶段:Prefill(预填充)阶段 和Decode(解码)阶段。两者的分工和计算模式差异显著,直接影响推理性能和资源占用。以下是它们的详细流程和关键技术:

1. Prefill 阶段(预填充)
    作用:
    处理输入的提示词(Prompt),生成初始的 KV Cache(键值缓存),为后续解码阶段做准备。

    关键步骤:
    输入处理:

    将用户输入的文本(如 "Explain AI in one sentence.")通过分词器(Tokenizer)转换为 Token ID 序列。

    添加特殊Token(如 <BOS>、<EOS>)并截断/填充至固定长度(如有必要)。

    计算初始隐藏状态:

    Token ID 序列通过模型的 Embedding 层 转换为向量表示(形状:[seq_len, hidden_dim])。

    经过所有Transformer层的 前向传播,生成每个Token的隐藏状态。

    生成 KV Cache:

    在Transformer的 自注意力层 中,计算每个Token的 Key(K) 和 Value(V) 矩阵。

    将K、V缓存到显存中(形状:[num_layers, seq_len, num_heads, head_dim]),供后续解码复用。

    输出首个Token的概率分布:

    对最后一个Token的隐藏状态应用 LM Head(语言模型头),得到词汇表上的概率分布。

    根据采样策略(如Top-p、Temperature)选择首个生成的Token(如 "Artificial")。

    计算特点:
    计算密集型:需要处理整个输入序列(可能很长),所有Token并行计算。

    显存占用高:KV Cache的大小与输入序列长度成正比(长Prompt需优化显存管理,如PagedAttention)。

    2. Decode 阶段(解码)
    作用:
    基于Prefill阶段的KV Cache,逐个Token生成输出序列,直到达到停止条件(如最大长度或EOS Token)。

    关键步骤:
    输入当前Token:

    将上一步生成的Token(如 "Artificial")作为新一轮的输入(形状:[1])。

    通过Embedding层转换为向量(形状:[1, hidden_dim])。

    增量计算:

    仅计算 当前Token的隐藏状态(无需重新处理历史Token)。

    在注意力层中:

    计算当前Token的 新Key/Value,并追加到KV Cache中(序列长度+1)。

    使用完整的KV Cache(包括Prefill和之前生成的Token)计算注意力权重。

    生成下一个Token:

    对当前Token的隐藏状态应用LM Head,得到概率分布。

    采样下一个Token(如 "intelligence")。

    循环生成:

    重复步骤1-3,直到生成停止符或达到 max_tokens。

    计算特点:
    内存带宽受限:每次迭代仅处理1个Token,计算量小,但需频繁读写KV Cache。

    延迟敏感:生成速度直接影响用户体验(通常追求低延迟)。

    3. 两阶段对比
    特性    Prefill 阶段    Decode 阶段
    输入长度    整个Prompt序列(可能很长)    单个Token(逐步增长)
    计算模式    全序列并行计算    增量计算(自回归)
    主要瓶颈    计算能力(FLOPs)    内存带宽(KV Cache访问)
    显存占用    高(存储完整Prompt的KV Cache)    逐步增加(每步+1 Token的Cache)
    优化重点    长序列压缩、显存管理    KV Cache读写效率、采样加速
    4. 关键技术优化
    (1)Prefill 阶段优化
    Flash Attention:加速长序列注意力计算,减少显存访问。

    PagedAttention(vLLM):将KV Cache分块存储,支持超长Prompt。

    Prompt 压缩:移除重复或无效Token(如ChatML模板中的固定指令)。

    (2)Decode 阶段优化
    KV Cache 复用:共享不同请求的相同Prompt的Cache。

    连续批处理(Continuous Batching):动态插入新请求到运行中的批次,提高GPU利用率。

    投机解码(Speculative Decoding):用小模型预测多个Token,大模型仅验证。

    5. 示例流程(代码逻辑)
    python
    # 伪代码:基于Transformer的推理流程
    def generate(prompt, max_tokens=100):
        # Prefill 阶段
        input_ids = tokenizer.encode(prompt)  # 编码输入
        kvs = []  # KV Cache初始化
        hidden_states = model.embed(input_ids)
        for layer in model.layers:
            hidden_states, k, v = layer(hidden_states, use_cache=True)
            kvs.append((k, v))  # 缓存KV
        next_token = sample(hidden_states[-1])  # 采样首个Token
        
        # Decode 阶段
        output = [next_token]
        for _ in range(max_tokens - 1):
            hidden_states = model.embed(next_token)
            for i, layer in enumerate(model.layers):
                hidden_states, k, v = layer(hidden_states, past_kv=kvs[i])
                kvs[i] = (torch.cat([kvs[i][0], k]), torch.cat([kvs[i][1], v]))  # 更新Cache
            next_token = sample(hidden_states[-1])
            output.append(next_token)
            if next_token == EOS: break
        return tokenizer.decode(output)
    6. 性能影响指标
    Prefill 延迟:与Prompt长度成正比(优化方向:算法优化、显存管理)。

    Decode 吞吐量:与批次大小、KV Cache效率相关(优化方向:连续批处理、内存带宽优化)。

    显存占用:由KV Cache主导(优化方向:量化、共享Cache)。

    总结来说,Prefill 阶段是“准备期”,负责处理输入并初始化KV Cache;Decode 阶段是“生成期”,以自回归方式逐步产生输出。两者的优化策略差异显著,共同决定了推理效率和用户体验。生产环境中(如vLLM、TGI等框架)会针对这两阶段分别进行极致优化。


#################################################################
三、自己测试内容的理解
    讲清楚测试的内容为什么这么测
    怎么测试更加有效,为什么更有效    
    


网站公告

今日签到

点亮在社区的每一天
去签到