一、模型架构获取(以 GPT2 为例)

下载预训练模型文件

在镜像版 Hugging Face 中找到 GPT2 预训练模型文件,目录如下

请添加图片描述

使用镜像版 hf 下载 GPT2 的预训练模型文件到本地文件夹,本文为 pretrained/openai-community/gpt2 文件夹。
下载地址:https://hf-mirror.com/openai-community/gpt2

加载预训练模型架构
from transformers import AutoModelForCausalLM
model_url = "pretrained/openai-community/gpt2"
model = AutoModelForCausalLM.from_pretrained(model_url)
# 模型架构整体查看
print(model)
# 模型架构逐层查看
for layer in model.children():
    ...

部分打印结果如下

请添加图片描述

二、from_pretrained 方法原理解析

从 config.json 文件中获取预训练模型配置信息

首先 from_pretrained 方法接收 model_url 从中找到 config.json 文件,读取 GPT2 模型配置信息。

请添加图片描述

从 model.safetensors 文件中获取预训练模型参数

再找到 model.safetensors 文件,读取预训练好的 GPT2 模型参数 state_dict,字典长度 160。

请添加图片描述

模型架构初始化

将 GPT2 模型配置信息传入对应的 GPT2LMHeadModel 类中进行模型架构初始化。

请添加图片描述

模型参数初始化

将读取的 state_dict 导入完成初始化的模型架构,字典长度 149。

请添加图片描述

返回加载 state_dict 后的模型架构。

三、模型参数迁移

获取预训练模型的参数
# 整体查看模型参数,字典长度 149
model.state_dict()
# 模型名称及参数逐层查看
for name, param in model.named_parameters():
    ...
# 指定名称单独获取文本嵌入层参数
model.transformer.wte.state_dict()
# 指定名称单独获取文本嵌入层权重参数,张量大小 (50257, 768)
model.transformer.wte.weight.data
将预训练模型参数迁移至新模型

假如新定义的模型 new_model 中存在配置信息相同的文本嵌入层 token_embedding,想要在 GPT2 文本嵌入层参数的基础上微调训练。

# 方式一
new_model.token_embedding.load_state_dict(model.transformer.wte.state_dict())
# 方式二
new_model.token_embedding.weight.data = model.transformer.wte.weight.data.clone()

若只迁移参数到新模型,不想在新模型训练过程中改变迁移过去的参数。

# 全部冻结
new_model.requires_grad_(requires_grad=False)
# 部分冻结
layers_to_freeze = ['transformer.wte.weight']
for name, param in new_model.named_parameters():
    if any(name.startswith(layer) for layer in layers_to_freeze):
        param.requires_grad = False
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐