Transformers 保存并加载模型 | 八
本文是全系列中第11 / 13篇:Transformers
- Transformers 词汇表 | 二
- Transformers 从pytorch-pretrained-bert迁移 | 十
- Transformers 库常见的用例 | 三
- Transformers 多语言模型 | 十一
- Transformers 中使用 TorchScript | 四
- Transformers 模型上传和共享 | 五
- Transformers 示例 | 六
- Transformers 简介(上)
- Transformers 加载预训练模型 | 七
- Transformers 简介(下)
- Transformers 保存并加载模型 | 八
- Transformers 快速入门 | 一
- Transformers 转换Tensorflow的Checkpoints | 九
作者|huggingface
编译|VK
来源|Github
本节说明如何保存和重新加载微调模型(BERT,GPT,GPT-2和Transformer-XL)。你需要保存三种文件类型才能重新加载经过微调的模型:
- 模型本身应该是PyTorch序列化保存的模型(https://pytorch.org/docs/stable/notes/serialization.html#best-practices)
- 模型的配置文件是保存为JSON文件
- 词汇表(以及基于GPT和GPT-2合并的BPE的模型)。
这些文件的默认文件名如下:
- 模型权重文件:
pytorch_model.bin
- 配置文件:
config.json
- 词汇文件:
vocab.txt
代表BERT和Transformer-XL,vocab.json
代表GPT/GPT-2(BPE词汇), - 代表GPT/GPT-2(BPE词汇)额外的合并文件:
merges.txt
。
如果使用这些默认文件名保存模型,则可以使用from_pretrained()方法重新加载模型和tokenizer。
这是保存模型,配置和配置文件的推荐方法。词汇到output_dir
目录,然后重新加载模型和tokenizer:
from transformers import WEIGHTS_NAME, CONFIG_NAME
output_dir = "./models/"
# 步骤1:保存一个经过微调的模型、配置和词汇表
#如果我们有一个分布式模型,只保存封装的模型
#它包装在PyTorch DistributedDataParallel或DataParallel中
model_to_save = model.module if hasattr(model, 'module') else model
#如果使用预定义的名称保存,则可以使用`from_pretrained`加载
output_model_file = os.path.join(output_dir, WEIGHTS_NAME)
output_config_file = os.path.join(output_dir, CONFIG_NAME)
torch.save(model_to_save.state_dict(), output_model_file)
model_to_save.config.to_json_file(output_config_file)
tokenizer.save_vocabulary(output_dir)
# 步骤2: 重新加载保存的模型
#Bert模型示例
model = BertForQuestionAnswering.from_pretrained(output_dir)
tokenizer = BertTokenizer.from_pretrained(output_dir, do_lower_case=args.do_lower_case) # Add specific options if needed
#GPT模型示例
model = OpenAIGPTDoubleHeadsModel.from_pretrained(output_dir)
tokenizer = OpenAIGPTTokenizer.from_pretrained(output_dir)
如果要为每种类型的文件使用特定路径,则可以使用另一种方法保存和重新加载模型:
output_model_file = "./models/my_own_model_file.bin"
output_config_file = "./models/my_own_config_file.bin"
output_vocab_file = "./models/my_own_vocab_file.bin"
# 步骤1:保存一个经过微调的模型、配置和词汇表
#如果我们有一个分布式模型,只保存封装的模型
#它包装在PyTorch DistributedDataParallel或DataParallel中
model_to_save = model.module if hasattr(model, 'module') else model
torch.save(model_to_save.state_dict(), output_model_file)
model_to_save.config.to_json_file(output_config_file)
tokenizer.save_vocabulary(output_vocab_file)
# 步骤2: 重新加载保存的模型
# 我们没有使用预定义权重名称、配置名称进行保存,无法使用`from_pretrained`进行加载。
# 下面是在这种情况下的操作方法:
#Bert模型示例
config = BertConfig.from_json_file(output_config_file)
model = BertForQuestionAnswering(config)
state_dict = torch.load(output_model_file)
model.load_state_dict(state_dict)
tokenizer = BertTokenizer(output_vocab_file, do_lower_case=args.do_lower_case)
#GPT模型示例
config = OpenAIGPTConfig.from_json_file(output_config_file)
model = OpenAIGPTDoubleHeadsModel(config)
state_dict = torch.load(output_model_file)
model.load_state_dict(state_dict)
tokenizer = OpenAIGPTTokenizer(output_vocab_file)
原文链接:https://huggingface.co/transformers/serialization.html#serialization-best-practices
原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/04/09/transformers-%e4%bf%9d%e5%ad%98%e5%b9%b6%e5%8a%a0%e8%bd%bd%e6%a8%a1%e5%9e%8b-%e5%85%ab/