2020-05-13【TF2时间序列建模过程+Kubernete
今日鸡汤:
卡夫卡说:
“信仰是什么?
相信一切事和一切时刻的合理的内在联系,
相信生活作为整体将永远继续下去,
相信最近的东西和最远的东西。”
一个人相信什么,他未来的人生就会靠近什么。与你共勉。
Eat TensorFlow 2.0 in 30 days (1-4)
今天学了使用时间序列数据,用函数式API定义4层LSTM网络做预测问题,同样,还是按照Tensorflow的一般流程总结一下:
准备数据
- 用Pandas导入数据:
pd.read_csv()
- 用Pandas查看总体数据趋势:
df.plot()
,会按照每一列绘制一条曲线。 - 对于时间序列数据,查看差分情况,可以用diff函数将数据进行某种移动之后与原数据进行比较得出差异数据:
dfdata.diff(periods=1)
- 对数据分batch:
dataset.batch()
定义模型
使用函数式API构建模型:
tf.keras.backend.clear_session()
x_input = layers.Input(shape = (None,3),dtype = tf.float32)
x = layers.LSTM(3,return_sequences = True,input_shape=(None,3))(x_input)
x = layers.LSTM(3,return_sequences = True,input_shape=(None,3))(x)
x = layers.LSTM(3,return_sequences = True,input_shape=(None,3))(x)
x = layers.LSTM(3,input_shape=(None,3))(x)
x = layers.Dense(3)(x)
x = Block()(x_input,x)
model = models.Model(inputs = [x_input],outputs = [x])
model.summary()
训练模型
采用fit方法。使用Adam优化器,用MSPE做loss:
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
model.compile(optimizer=optimizer,loss=MSPE(name = "MSPE"))
对于RNN设置多个学习率进行尝试,监控loss指标,并使用Keras 提供的多种回调函数调整训练状态:
1)ReduceLROnPlateau:当指标停止提升时,降低学习速率。一旦学习停止,模型通常会将学习率降低2-10倍。该回调监测数量,如果没有看到epoch的 'patience' 数量的改善,那么学习率就会降低。
2)EarlyStopping:当监测数量停止改善时停止训练。
tb_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
#如果loss在100个epoch后没有提升,学习率减半。
lr_callback = tf.keras.callbacks.ReduceLROnPlateau(monitor="loss",factor = 0.5, patience = 100)
#当loss在200个epoch后没有提升,则提前终止训练。
stop_callback = tf.keras.callbacks.EarlyStopping(monitor = "loss", patience= 200)
callbacks_list = [tb_callback,lr_callback,stop_callback]
history = model.fit(ds_train,epochs=500,callbacks = callbacks_list)
评估模型
使用plt.plot(epochs, train_metrics)
方法可视化模型loss随Epoch的变化。
使用模型
该任务为预测任务,先用一个循环生成未来100天的数据,之后做query。
model.predict(tf.constant(tf.expand_dims(dfresult.values[-38:,:],axis = 0)))
保存模型
使用tf原生方式保存模型,同样,设置save_format为tf即可:
model.save('./data/tf_model_savedmodel', save_format="tf")
Kubernetes 权威指南
Kubernetes是什么?
一个基于容器技术的分布式架构方案,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率最大化。
- 它是一个开放的平台,用任何语言实现的服务都可以映射为Kubernetes的Service,并通过标准的TCP通信协议进行交互
- 它是一个完备的分布式系统开发和支撑平台,具备完备的集群管理能力,提供完善的管理工具。
Pod是什么?
Pod=1个Pause容器+一堆用户业务容器
- Pod IP:每个Pod都有唯一的IP地址(Pod IP),一个Pod中多个容器共享该IP。
- Container Port:在Pod里包含的容器组定义在spec中,包含containerPort。
- Endpoint:Pod IP + Container Port组成EndPoint,代表此Pod中的一个服务进程的对外通信地址。该地址会随Pod的销毁和重新创建而发生变化。
Replication Controller是什么?
RC声明期待系统中某种Pod的副本数量在任意时刻都符合该预期值,定义包括:
- Pod期待的副本数量(replicas)
- 筛选目标Pod的Label Selector (selector)
- 创建新Pod的模板 (template)
Deployment是什么?
Deployment其实跟RC差不多,只不过能看到当前Pod部署的进度。
Service是什么?
Service其实就是微服务,定义了一个服务的访问入口地址,前端应用通过该入口地址通过Label Selector访问背后的Pod组成的集群实例。
它的特征有:
- 拥有唯一指定的名称
- 拥有一个虚拟IP(Cluster IP)和端口号,在Service整个生命周期中,Cluster IP不会改变。
- 能够提供某种远程服务能力
- 被映射到提供这种服务能力的一组容器应用上
Service与Pod怎么关联?
Kubernetes首先给每个Pod贴上一个Label,然后给相应的Service定义标签选择器(Label Selector),这样这个service会作用于所有包含该Label的Pod上。
Kubernetes怎么管理集群?
Kubernetes集群=1个Master+一堆Node
- Master:运行集群管理相关进程(kube-apiserver、 kube-controller-manager、kube-scheduler)
- Node:工作节点,运行服务进程(kubelet、kube-proxy、Docker Engine)
Kubernetes的服务发现机制?
对Service来说,每个service都有单独的Cluster IP和唯一的名称,固定在配置中,因此只需要根据Service名称找到对应的Cluster IP,Kubernetes引入DNS系统,将服务名作为DNS域名解决服务发现问题。
如何在集群外面访问Service?
在service定义中指定NodePort,K8S中的每个Node都会开启一个对应的TCP监听端口。
也可以在servcie定义中制定LoadBalancer,K8S会自动创建一个LoadBalancer实例并返回IP供外部客户端使用。