<>前言
相信有很多人在搞机器学习也好,深度学习也好,最主要的东西都是如何训练出一个好模型,当然应该这样,我也是把最主要的重心放在如何训练好模型上了。
但是最近完成了一个深度学习模型的训练后,在部署到线上的时候,却发现考虑少了一些东西。
其中一个方面就是如何使得你的模型能够快速的应用到线上?如何使得代码的运行效率更快?
因为平时训练都是把模型直接保存在本地,需要的时候就直接读进内存即可。
但是如果在实际生产"环境中,怎么可能每调用一次模型就要读一次文件呢?这样运行效率太低了,而且在部署的时候就需要把模型拷贝到各个服务器上,这样对模型的维护更新更加不方便。
<>一、中间件Redis
相信很多人都知道Redis这个神器。
本例也是利用Redis作为中间件,将模型序列化然后储存在Redis中。
使用Redis的好处有:
只需要在一台机器中储存好模型,使用的时候一次性读取到Redis中即可。
通过Redis读取模型大大加快了从本地磁盘读取的速度,加快线上的业务进程。
更新模型的时候只需要更新一台机器上的模型。
<>二、普通机器学习模型保存序列化
这里用到的例子是在对数据进行标准化的时候训练的模型scaler
普通的保存在本地磁盘的方法是:
借助joblib 包
from sklearn.externals import joblib ## 保存到test目录 joblib.dump(scaler,
'/home/test/scaler_test') ## 读取scaler scaler_test = joblib.load(
'/home/test/scaler_test')
若要储存在Redis中,则需要先对模型进行序列化,直接储存只能储存成一堆字符串
借助cPickle
## 对模型进行序列化 scaler_cp = cPickle.dumps(scaler) ## 储存到redis中 self.redis_dumps(
"scaler",scaler_cp)
存储在Redis中的数据如下
## 加载模型 scaler_loads = self.redis_loads("scaler") ## 反序列化 scaler_cp = cPickle.
loads(scaler_loads)
这样模型就完全加载进来了。
<>三、tensorflow 训练后模型的保存
1、最简单最方便的方法就是直接保存在本地,如下
## 保存 model.save('/home/tensorflow/tensor_test.h5') ## 加载 from tensorflow.keras
.models import load_model model = load_model('/home/tensorflow/tensor_test.h5')
2、若想要储存在Redis中,则需要对模型分为两个部分储存,结构部分,权重部分。
结构部分的储存:
model_json = model.to_json() ## 储存到redis中 self.redis_dumps("model",model_json)
权重部分的储存:
weights_list = model.get_weights() ## 对模型进行序列化 weights = cPickle.dumps(
weights_list) ## 储存到redis中 self.redis_dumps("weights",weights)
模型的加载:
from tensorflow.keras.models import model_from_json model = model_from_json(
self.redis_loads("model")) weight = cPickle.loads(self.redis_loads("weights"))
model.set_weights(weight)
至此模型的加载就完成了。
测试过跟保存在磁盘的模型完全一样。
<>四、总结
在本地做实验训练模型跟真正运用到线上还是有很大的差别的,不仅仅要考虑到模型的准确度,还要考虑到对线上各个方面的影响。
我是一只前进的蚂蚁,希望能一起前行。
如果对您有一点帮助,一个赞就够了,感谢!
注:如果本篇博客有任何错误和建议,欢迎各位指出,不胜感激!!!
技术
今日推荐