:)关于transformers模型的保存与加载-|
关于transformers模型的保存与加载
两种情况, 自定义模型训练后保存, transformers预训练模型保存。
参考代码
# -*- coding: utf-8 -*- import torch from transformers import GPT2LMHeadModel from transformers import AutoTokenizer from transformers import TextGenerationPipeline model = GPT2LMHeadModel.from_pretrained("SkyWork/SkyTextTiny") # torch.save(model.state_dict(), 'model.bin') model.save_pretrained("GPTMODEL") tokenizer = AutoTokenizer.from_pretrained("SkyWork/SkyTextTiny", trust_remote_code=True) tokenizer.save_pretrained('tokenizer_directory') text_generator = TextGenerationPipeline(model, tokenizer, device=0) input_str = "今天是个好天气" max_new_tokens = 20 print(text_generator(input_str, max_new_tokens=max_new_tokens, do_sample=True))
torch架构把模型分为两部分,身体和大脑, 身体即模型的结构,大脑即权重。
模型结构可能存在config.json中, 权重存在pth文件或bin文件。
1 模型训练后保存及加载
1.1保存
1)保存结构
------- 待解决存在问题 Object of type GPT2Config is not JSON serializable
1 # -*- coding: utf-8 -*- 2 import torch 3 from transformers import GPT2LMHeadModel 4 from transformers import AutoTokenizer 5 from transformers import TextGenerationPipeline 6 7 def save_struc(model): 8 import json 9 with open('config.json', 'w') as f: 10 json.dump(model.config, f) 11 torch.save(model.state_dict(), 'model.bin') 12 13 model = GPT2LMHeadModel.from_pretrained('GPTMODEL') 14 15 # 保存模型结构 16 save_struc(model)
2)保存权重
model = GPT2LMHeadModel.from_pretrained("SkyWork/SkyTextTiny") torch.save(model.state_dict(), 'model.bin')
其中
model.state_dict()
把模型得参数权重导出到字典。
1.2 加载
model.load_state_dict(torch.load('model.bin'))
先load 成为字典,再load_state_dict 加载入模型,注意这个model已经是 实例化后的即已经有了结构得model。所以只要读入权重即可。
2 预训练模型保存及加载
2.1
保存直接config.json和权重bin都保存再一个目录
model = GPT2LMHeadModel.from_pretrained("SkyWork/SkyTextTiny") model.save_pretrained("GPTMODEL")
目录为
2.2 加载
model = GPT2LMHeadModel.from_pretrained('GPTMODEL')