Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

模型持久化

上一章,我们给 GPT 模型添加了随机失活的能力,预训练的三大工程优化技术已经完备。

现在,我们来考虑模型预训练的最后一个重要问题:怎样保存训练结果?


训练一个 GPT 模型动则几个小时,甚至数天。显然,不可能每次使用时都重新训练。我们需要把训练好的模型保存下来,下次可以直接加载使用。

保存什么

模型的全部知识都在可训练参数里面:每一层的权重和偏置。我们只需要保存这些数值,不需要保存代码、计算图、或者梯度等。

保存格式

NumPy 提供了 np.savez 函数,可以把多个数组保存到单一文件(.npz 格式的归档文件)中。

GPT 模型的所有可训练参数全部存储在模型的参数列表 model.parameters 里,我们只需要依次将其中每个参数保存到文件中。

何时保存

训练的过程中,我们可以在每个轮次结束后,评估模型在测试集上的表现。如果当前轮次在测试集上的损失值是创了新低,就把模型保存下来。这样,我们可以确保留下了最佳训练结果。

怎么加载

下次使用模型时,我们可以从 .npz 文件中读取参数,依次赋值给模型参数 model.parameters。

数据集

字符编码数据集

下三角矩阵层

归一化层

随机失活层

激活函数

高斯误差线性单元激活函数(GELU)

损失函数

GPT 交叉熵损失函数

模型

GPT 嵌入层

GPT 注意力层

GPT 前馈网络层

GPT Transformer 模块

GPT 输出层

GPT 模型

GPT 训练器

我们在 GPT 训练器中添加保存和加载模型参数的功能:

  • save(保存函数):将模型所有参数按照顺序编号,保存到 .npz 文件;

  • load(加载函数):从 .npz 文件加载数据,按照顺序赋值给模型的参数;

  • train(训练函数):

    • 重排:每个轮次开始前,我们添加了数据重排功能。打乱样本顺序,增加训练的随机性;

    • 日志:跟踪训练中损失值和学习率的变化;

    • 保存最佳模型参数:每个轮次完成后,用测试集评估训练结果。如果效果更佳,则替代已保存参数。

超参数

本章,我们将模型超参数调大,尝试训练一个相对更加有效的模型。最终的模型参数规模约为 10.8M。

💡 提示:在 Mac mini M4 16G 机器上完成训练大约需要 1-2 小时。

学习率

批大小

轮数

上下文尺寸

嵌入尺寸

头数

Transformer 模块数

建模

训练

训练时传入 MODEL_FILE,每个轮次结束后自动保存最佳模型参数。

epoch 1 done, test loss 2.3235
epoch 1 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 2 done, test loss 2.0444
epoch 2 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 3 done, test loss 1.8580
epoch 3 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 4 done, test loss 1.7599
epoch 4 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 5 done, test loss 1.6474
epoch 5 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 6 done, test loss 1.5968
epoch 6 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 7 done, test loss 1.5635
epoch 7 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 8 done, test loss 1.5383
epoch 8 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 9 done, test loss 1.5339
epoch 9 saved model to ../../../../data/tinyshakespeare-gpt.npz
epoch 10 done, test loss 1.5331
epoch 10 saved model to ../../../../data/tinyshakespeare-gpt.npz
GPT-training completed

评估

prediction:	54 steps, each (16, 256, 65)
loss:	1.5330633212018896

推理

训练完成后,最佳模型参数已经保存到 MODEL_FILE 文件。下次使用时,可以直接加载,无需重新训练。

ROMEO:
As have done!

LEONTES:
Ho! when be letimest gentleman learness?

PAULINA:
Preventage straight the understand; such nor
Your victory fallse to dare.

DUKE VINCENTIO:
There, by the crown.

GLOUCESTER:
Indeed: thou art uncle and Verona wilt
Of thy sun-she s

本章,我们给 GPT 训练器添加了保存和加载模型参数的功能:训练时自动保存最佳模型的参数,下次可以直接加载使用。

至此,GPT 模型预训练部分就完整了。下一阶段,我们将进入推理(Inference)阶段:怎样使用预训练好的模型生成文本。

课后练习

  1. 试着把轮数 EPOCHS 改成 20,训练更长时间。观察保存的模型参数文件大小和文本生成的质量有什么变化?