Press "Enter" to skip to content

【NLP学习其五】模型保存与载入的注意事项(记问题No module named ‘model’)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

这是一次由于路径问题(找不到模型)引出模型保存问题的记录

 

最近,我试着把使用GPU训练完成的模型部署至预发布环境时出现了一个错误,以下是log节选

 

unpickler.load() ModuleNotFoundError: No module named 'model'

 

问题分析

 

当时我很奇怪,因为这个模型在本地环境测试已经通过了

 

从错误本身来看,程序是没有找到我们的模型

 

那幺这里可能是路径设置有误

 

这是训练结束用于本地测试的目录树

 

 

解决办法

 

我添加了一个与src并行的包test用于复现问题

 

 

到这里,问题很明确了, 我在test中使用src的模型,需要指定src的路径(也就是src的绝对路径)

 

于是我将路径替换为绝对路径(如下)

 

 

然后运行程序依旧报出相同的错误(我c了都)

 

问题分析(再次)

 

经过高强度互联网搜索,查到GitHub上有人发现相同错误( https://github.com/pytorch/pytorch/issues/18325)

 

问题指向pytorch的模型保存函数

 

官方tutorials: https://pytorch.org/tutorials/beginner/saving_loading_models.html

 

众所周知(并不),pytorch提供两种模型保存的方式,一种是仅保存模型训练时产生的参数(当这个参数满足你的需求时),另一种则比较简单粗暴,直接把所有东西保存( 包括一切涉及模型的数据 )

 

说的具体一点就是下面这样

 

#方法一:
torch.save(model.state_dict(), model_name) #保存模型,但只是把训练产生的模型参数存入一个字典
#方法二:
torch.save(model, model_name) #保存模型,提供要保存的模型和模型的名字就可以将其整个保存

 

到这里你应该发现问题的关键了

 

我是用方法二来保存模型的,而在这个过程中, 函数会保存一切,包括训练时模型所在文件夹的位置关系 ,因此当我想要在别的地方使用这个模型时,由于当前路径与模型保存的路径不同,程序自然无法找到模型进而报错。

 

这是我在训练完之后立刻在本地测试模型不能察觉的问题,因为那时候路径还与保存的路径一致。

 

解决办法

 

知道是保存的锅就好办了,修改保存方式重新训练呗

 

在你原来保存模型的地方用方法一的代码替换即可

 

由于保存方式的变化,我们在载入模型时的方法也要做出相应的变化

 

#载入模型(方法二)
mymodel_path = "G:\\src\\models\\test"
model = torch.load(mymodel_path)
#载入模型(方法一)
mymodel_path = "G:\\src\\models\\test"
m_state_dict = torch.load(mymodel_path)
model = BiLSTM_CRF(                           #仅更新模型的参数
    vocab_size=len(word_to_id),
    tag_to_ix=tag_to_id,
    embedding_dim=parameters["word_dim"],
    hidden_dim=parameters["word_lstm_dim"],
    use_gpu=use_gpu,
    char_to_ix=char_to_id,
    pre_word_embeds=word_embeds,
    use_crf=parameters["crf"],
    char_mode=parameters["char_mode"],
)
model.load_state_dict(m_state_dict)

 

这次程序可以正常运行

 

注:pytorch的官方指导建议使用字典的形式保存模型,从实践来看也确实如此,只保存模型参数让模型的接续训练成为可能(这个下次再谈)

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注