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

最近,我试着把使用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的官方指导建议使用字典的形式保存模型,从实践来看也确实如此,只保存模型参数让模型的接续训练成为可能(这个下次再谈)

【NLP学习其五】模型保存与载入的注意事项(记问题No module named 'model')的更多相关文章

  1. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

  2. Tensorflow模型保存与载入

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = in ...

  3. Xgboost 模型保存和载入()

    https://blog.csdn.net/u012884015/article/details/78653178 xgb_model.get_booster().save_model('xgb.mo ...

  4. Tensorflow模型保存与加载

    在使用Tensorflow时,我们经常要将以训练好的模型保存到本地或者使用别人已训练好的模型,因此,作此笔记记录下来. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提 ...

  5. TensorFlow 模型的保存与载入

    参考学习博客: # https://www.cnblogs.com/felixwang2/p/9190692.html 一.模型保存 # https://www.cnblogs.com/felixwa ...

  6. (原+译)pytorch中保存和载入模型

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8108466.html 参考网址: http://pytorch.org/docs/master/not ...

  7. TF-IDF与主题模型 - NLP学习(3-2)

    分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2) 文本向量化及词袋模型 - NLP学习(3-1) 在上一篇博文 ...

  8. TensorFlow 模型保存/载入

    我们在上线使用一个算法模型的时候,首先必须将已经训练好的模型保存下来.tensorflow保存模型的方式与sklearn不太一样,sklearn很直接,一个sklearn.externals.jobl ...

  9. Tensorflow学习笔记----模型的保存和读取(4)

    一.模型的保存:tf.train.Saver类中的save TensorFlow提供了一个一个API来保存和还原一个模型,即tf.train.Saver类.以下代码为保存TensorFlow计算图的方 ...

随机推荐

  1. 服务器通信REST、gRPC,Swagger/OpenAPI,Consul

    服务间的通信方式是在采用微服务架构时需要做出一个最基本的决策.默认的选项是通过 HTTP 发送 JSON,也就是所谓的 REST API.我们也是从 REST 开始的,但最近我们决定改用 gRPC. ...

  2. CSP_J 纪念品题解

    题目: 小伟突然获得一种超能力,他知道未来 T 天 N 种纪念品每天的价格.某个纪念品 的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量. 每天,小伟可以进行以下两种交易无 ...

  3. 附加数据库出现 无法打开物理文件 操作系统错误 5:拒绝访问 SQL

    刚刚从公司的电脑上考到自己刚刚装好系统的笔记本上面,出现了问题: 无法打开物理文件 操作系统错误 5:拒绝访问 . 网上找了下解决方法: 找到需要导入的  mdf和ldf  修改它的权限为完全控制,不 ...

  4. Oracle数据库——Mybatis在一个update标签下执行多更新语句

    begin update table table1 set com1 ='1' ; update table table2 set com1 ='1' ; end;

  5. centos 8.3安装 一键安装部署gitlab

    安装和配置gitlab必须的依赖包 [root@gitlabdev ~]#dnf install -y curl policycoreutils openssh-server perl 设置开机自启s ...

  6. python base64(图片)编码

    参考:https://blog.csdn.net/Good_Luck_Kevin2018/article/details/80953312 通常会在网页中遇到用src="data:image ...

  7. leetcode 字符串转换整数 (模拟)

    思路分析 1.跟着题意模拟,分成几种情况来看待 2.一种全是空格 3.有可能有空格,然后有符号的 4.有可能有空格,无符号数字 5.有可能有空格,非数字开头 6.最后还需要考虑一个越界的问题,所以要除 ...

  8. 打开设置windows10内置linux功能-启用linux子系统

    第一步设置开发者模式 步骤:windows+s打开娜娜,输入设置,并点击. 点击更新与安全 点击开发者选项,选择开发者模型,弹出的对话框选确定之后等待安装完毕. 第二步:安装linux 点击确定后等待 ...

  9. Redis的持久化机制你学会了吗

    大家都知道Redis经常被使用在缓存的场景中,那有没有想过这么一个问题,一旦服务器宕机,内存中的数据全部丢失,我们该如何进行恢复呢?如果直接从后端数据库恢复,不仅会给数据库带来巨大的压力,还会使上层应 ...

  10. 一文读懂k8s rbac 权限验证

    自我认为的k8s三大难点:权限验证,覆盖网络,各种证书. 今天就说一下我所理解的权限验证rbac. 咱不说rbac0,rbac1,rbac2,rbac3.咱就说怎么控制权限就行. 一.前言 1,反正R ...