- Objective: - Breadcrumb: # 概念阐释 - 模型在[[LLM 预训练|训练阶段]], 一次训练迭代中能够**同时**处理的样本数量。简单理解为模型一次性可以处理多少条数据的问题。 ## batch size的作用 - **在[[数据集|数据]]进入[[Transformer]]之前需要进行清洗、增强、[[tokenization]],然后确保以合适的批量大小(batch size)进入 transformer。** - 计算效率:一次性处理更多数据可以充分利用 GPU/TPU 等加速器的并行能力,从而在一定程度上提高训练速度。 - **影响**:batch size 的大小会影响训练流程(包括前向传播、反向传播和梯度更新等)中的并行处理能力,以及 GPU 显存/内存占用等。 - 如果 ==batch size 过小==,每次迭代计算得到的梯度会有较大的波动,可能导致训练不稳定; - 如果 ==batch size 过大==,模型的更新方向会相对平滑,不容易出现数值上的抖动。 - 显存/内存需求:batch size 越大,需要的显存空间越高,可能导致显存不足。同时,在超大 batch size 下,为了维持合理的学习率,往往需要对训练超参数做特殊调整,否则收敛效果可能会变差。 # 实例 数据预处理 ![](https://image.harryrou.wiki/2024-10-11-CleanShot%202024-10-11%20at%2014.26.58%402x.png) - B:批次大小,在 GPT-3 中为 512 - T:[[context length 上下文长度]],在 GPT-3 中为 2048 - 数组中的数字为 Row1-Row4文本的 token ID - 使用 `<endoftext>` 标记来分隔不同文档 - 在 embedding 层,这个数组会被处理成一个[[tensor 张量]],`(batch_size, context_length, embedding_dim)`,这个张量会在模型中层层传递。 # 相关内容 ## batch size和[[Embedding]]的关系 ### 各自的定义与功能 1. **Batch Size(批大小)** - 表示在一次训练迭代中同时处理的样本数。 - 影响的是 **训练流程**(包括前向传播、反向传播和梯度更新等)中的并行处理能力,以及 GPU 显存/内存占用等。 2. **Embedding(嵌入向量)** - 用于将离散的符号(比如词、子词或其他离散特征)映射到一个连续的向量空间。 - 影响的是 **数据表示** 这一环节,它决定了模型在前向传播时对输入做的第一步或早期处理。 ### 它们之间的基本联系 1. **在训练流程中的位置不同** - 训练时,模型在读到一批数据后,会先把这些数据(如文本 token)的 **索引(token ID)** 通过 embedding 表层转换成相应的向量表示。 - 这个步骤发生在前向传播的前端部分,无论 batch size 是 16 还是 128,都只是一次性处理多少条数据的问题,而 embedding 的 **维度** (如 768 或 1024)一般是固定的。 2. **形状上的关联** - 当我们处理一个批量(batch)时,假设批量大小是 \( B \),序列长度([[context length 上下文长度]])是 \( L \),embedding 维度是 \( D \),那么==经过嵌入层后,通常会得到一个[[tensor 张量]]形状为 \((B, L, D)\) 的输出。 == 3. **训练效率与显存需求** - 如果 batch size 很大,在前向传播阶段,模型一次性会对更多的 token 做 embedding lookup(查表)并把它们映射到向量空间,自然需要更多显存来存储这些张量。 - embedding 的维度越大,对于同样的 batch size,占用的显存也越多。 - 二者的乘积(\(B \times L \times D\))对你的显存使用有直接影响。 # 参考资料 - [state of GPT 视频原文](obsidian://open?vault=Harry%E7%9A%84%E6%91%98%E5%BD%95%E7%B4%A0%E6%9D%90%E5%BA%93&file=%E7%9F%A5%E8%AF%86%E8%A7%86%E9%A2%91%2Fstate%20of%20GPT) - [ChatGPT-batch size](https://readwise.io/reader/shared/01jjkjeawjt6cyexc2gdyt0qft)