一、模型参数与训练显存
问题:模型的参数量由哪些部分组成,分别是以什么量级影响参数量
-
嵌入层 (Embedding Layer):
-
词嵌入(Word Embeddings): 这部分参数用于将输入的词汇映射到固定维度的向量。其参数量由词汇表大小(V)和嵌入维度(D)决定,总量大约为 V*D。
-
位置嵌入(Positional Embeddings): 这部分添加了位置信息到嵌入向量中。其参数量通常与词嵌入的维度相同,大约为最大序列长度(S)和嵌入维度(D)的乘积,即 S*D。
-
-
编码器和解码器层 (Encoder & Decoder Layers):
-
参数量主要在自注意力机制(Self-Attention)和前馈网络(Feed-Forward Network, FFN)中。
-
自注意力层(Self-Attention): 这部分有三个权重矩阵(Query, Key, Value)和一个输出矩阵,每个权重矩阵的大小为 DD,而输出权重矩阵也大致为 DD,因此大约为 4*D^2。
-
前馈网络(FFN): 这部分包含两层线性变换,中间有一个激活函数。如果中间层的维度是 D_ff,那么这部分的参数大约是 2DD_ff。
-
层归一化(Layer Normalization)和残差连接(Residual Connections): 层归一化涉及一些可学习的参数,通常为每个层有两个 D 维向量(比例(scale)和位移(bias)参数)。
-
一个编码器或解码器层中的总参数量大致为上述组件参数之和,整个 Transformer 的参数量是将层的参数量乘以层数 N。
-
问题:训练显存占用由哪些部分组成,分别是怎么影响的
-
模型大小:
-
参数量:模型参数越多,需要的显存相应增加。参数量通常与模型的各个层的大小和数量有关。
-
数据类型:参数和激活值的数据类型也影响显存使用量。例如,使用 32 位浮点数(float32)的模型比使用 16 位浮点数(float16)的模型占用更多显存。
-
-
批量大小 (Batch Size):
-
大的批量大小意味着每次迭代处理更多的输入数据,因此需要更多的显存来存储输入数据、激活值、梯度等。
-
-
前向传播和反向传播存储的激活值:
-
为了在反向传播期间计算梯度,系统必须存储前向传播期间的中间激活值。
-
-
梯度累积:
-
如果使用了梯度累积技术,那么需要额外的显存来存储多次前向传播和反向传播中计算出的梯度。
-
-
优化器状态:
-
不同的优化器会占用不同的显存量。例如,Adam 优化器需要存储每个参数的
-