/images/avatar.png

vllbc

remove_padding

即 packing,将不同长度的序列紧凑存储,避免填充,减少不必要的计算和存储,提升效率。

动机

sft进行微调,因为gpu是并行计算的,所以如果一个batch里面的数据,每条数据长度不相等,就需要对数据进行truncation(截断)和padding(pad数据到相同的seq_length)。显然,如果使用了padding,那么一个batch里面,就会有很多的pad_token,这些pad_token输入进入到了模型,但是却没有样本训练,造成了计算量的浪费。

ulysses_sequence_parallel

一句话:在sequence维度上进行切分

  • 将输入序列 X (长度 N) 沿序列维度切分为 SP 块,每个 GPU 分配到 N/SP 长度的子序列。
    • 对于非注意力层 (如 MLP),计算是完全局部的,每个 GPU 处理自己的子序列即可。
      • token 之间独立,token-level projection
      • Ulysses SP的核心复杂性在于Attention层。为了让每个token在计算注意力时能够考虑到全局序列信息(或者说,让每个head在计算时能看到完整的序列,即使这个head只在当前rank计算),Attention模块前后需要进行两次精密的all-to-all数据重排。MLP层则没有这样的需求,数据在进入MLP时已经是按序列分片好的,可以直接进行本地计算。
    • 对于注意力层:
      • 步骤 1 (计算 Q, K, V): 每个 GPU 基于其本地子序列计算出本地的 Q_local, K_local, V_local (维度约为 N/SP x d,d 是隐藏维度)。
      • 步骤 2 (全局 K, V 收集 - 关键): 使用 All-to-All 通信操作(All-Gather??)。每个 GPU 将自己的 K_local, V_local 发送给所有其他 GPU,并接收来自所有其他 GPU 的 K, V 块。执行后,每个 GPU 拥有完整的全局 K 和 V 矩阵 (维度 N x d),但仍然只拥有本地的 Q_local (维度 N/SP x d)。
      • 步骤 3 (本地注意力计算): 每个 GPU 使用其 Q_local 和完整的全局 K, V 计算其负责的那部分注意力输出 O_local (维度 N/SP x d)。计算公式为 Attention(Q_local, K_global, V_global)。这一步的计算量是 (N/SP) * N * d,内存瓶颈在于存储临时的注意力分数矩阵,大小约为 (N/SP) * N。相比原始的 **N*N**,内存显著降低。
      • 步骤 4 (可选的输出重组): 如果后续层需要按序列拼接的完整输出,可能需要另一次通信(如 All-Gather 或另一次 All-to-All 的变种)来组合 O_local。但在 DeepSpeed 实现中,通常保持分布式状态,直接输入到下一个同样按序列并行的层。

verl中的序列并行

在verl中,一般与remove_padding一起使用,即

entropy(reasoning)

熵坍塌

UloRL:An Ultra-Long Output Reinforcement Learning Approach for Advancing Large Language Models’ Reasoning Abilities

UloRL的核心创新 动态掩码熟练掌握正向词元(Dynamic Masking of well-Mastered Positive Tokens, DMMPTs)。论文作者敏锐地指出,熵坍塌的根源并非“训练正样本”,而是“过度训练已经熟练掌握的正向词元(MPTs)”。MPTs指的是那些在正确答案中,且模型已经能以极高概率(如>99%)预测出来的词元。DMMPTs为此设计了一个“熵值恒温器”: 1. 设定一个理想的“目标熵值”。 2. 在训练时,如果模型的当前熵低于这个目标值,说明模型开始变得“僵化”了。此时,系统会自动“屏蔽”(mask)掉那些MPTs,不再对它们进行训练,迫使模型关注那些还未掌握好的部分。 3. 如果模型熵值高于或等于目标值,则正常进行训练。

transformer参数量分析

进入大模型时代,基本上所有大模型都使用 decoder 部分,因此本文只分析 decoder 部分的参数量。 Transformer 的 decoder 每一层由 attention 和 mlp 组成,一般有 l 层。

Self-attention

Self-attention 层由 \(W_{Q}\)\(W_{K}\)\(W_{V}\) 和输出矩阵 \(W_{O}\) 和它们的偏置组成,权重矩阵的形状为 \([h,h]\),偏置形状为 \([h]\),则 self-attention 部分的参数量为 \(4h^2+4h\)

显存占用计算

训练时

  • 模型参数:我们模型的可学习权重。
  • Optimizer states(优化器状态):您需要跟踪的确切状态取决于您使用的优化器;例如,如果您使用的是 AdamW,则除了模型参数之外,您还需要跟踪第一和第二动量估计值。
  • 模型激活值:这将根据您的网络架构和批处理大小而有所不同,但会显著影响内存使用。反向传播需要此信息,以便我们能够有效地计算梯度。
  • 梯度:为模型的每个参数存储,与模型参数相同的内存占用。
  • Input data:要传递给模型的 Importing 数据批次,内存占用取决于正在建模的数据的大小和类型。

图示: image.png 具体数值: 对于一个 transformer 来说,参数量可以由以下公式给出(详见 transformer参数量分析):

面经2025

常见问题总结

多轮对话sft样本怎么构造?

  • [大模型微调样本构造 trick](https://zhuanlan.zhihu.com/p/641562439)

    • 多轮对话的传统组织方式:将多轮对话拆分为多条独立的训练样本,如 Q1A1/Q2A2/Q3A3 可拆分为 Q1—>A1, Q1A1Q2->A2, Q1A1Q2A2Q3->A3 三条样本。