用微信控制深度学习训练:中国特色的 keras 插件

1,643 阅读5分钟
原文链接: zhuanlan.zhihu.com

现如今,微信已经成为每个中国人接入社会的重要接口,我们用微信在地铁上看鸡汤、在商场使用电子支付、瘫在沙发上刷朋友圈、谈恋(划掉)。总之,微信几乎包办了我们生活中的一切,让人产生一种错觉,在不久的未来手机上只需要装微信一个软件就够了。

为了证明人类社会的下一阶段是微信主义,我们先定一个小目标:用微信控制深度学习训练。

一般来说,想要监控深度学习训练,只能用ssh或者tensorboard,用手机操作毕竟很麻烦,如果微信能把监控深度学习也包办了岂不是妙哉?

在命令行时代,使用图形界面就是逼格;在图形界面时代,使用命令行就是逼格。玩的就是个潮!

@Coldwings利用微信监管你的TF训练 - 知乎专栏已经实现了微信监控Tensorflow训练,受此启发,我决定开发一个控制keras训练的插件。(控制pytorch、mxnet、caffe交给各位了,动态图类的还可能可以用微信动态定义)

现在已经实现了包括被动监控、主动查询、远程关机/停止训练等多项功能。

效果展示:

与手机微信间的通信主要由littlecodersh/ItChat实现。

欢迎fork这个项目的GitHub:QuantumLiu/wechat_callback,为了方便阅读(添乱)我硬着头皮加了双语注释。

我很惭愧,只做了一点微小的工作,希望能抛砖引玉,得到各位的支持一起完善这个项目。

一、主要功能介绍

  1. 实时监控:在每个epoch结束后,自动发送本epoch训练信息以及两张分别代表所有batch和epoch信息的图表文件传输助手。
  2. 主动查询:在训练开始后的任意时刻,发送特定格式的指令,可获得指定查询项的信息。目前支持batch和epoch的各个指标的信息、显卡状态信息。
  3. 远程指令:当你觉得训练已经收敛,或者同实验室的人催你停止训练时,优雅地终止训练甚至关机就变得很重要了。keras的fit方法中,可以通过在callback设置
    self.model.stop_training = True
    
    来实现在当前epoch结束时终止训练,否则只能Ctrl+c暴力停止。利用本插件,可以使用特殊格式的指令来指定停止epoch、立刻停止训练,甚至关机和取消关机。

二、试一试!

  1. 准备工作

git clone https://github.com/QuantumLiu/wechat_callback.git
cd wechat_callback

需要用到的库:

itchat,keras,numpy,scipy,matplotlib,_thread(py3)确保nvidia-smi可用,如果windows的cmd里找不到命令,请手动将nvidia-smi.exe所在位置添加进环境变量。

2.运行测试脚本

python wechat_test.py

解析:

在wechat_test.py的开头,首先import wechat_utils

import wechat_utils #will login automaticly
#wechat_utils.sendmessage()isthe callback class
#wechat_utils.sendmessage()是keras的回调类,fit时传入callbacklist

在wechat_utils.py中:

# Automaticly login when imported 
#在被import时自动登录
#==============================================================================
itchat.auto_login(enableCmdQR=0.5,hotReload=True)
itchat.dump_login_status()#dump

可以看到,当wechat_utils被import时会调用itchat.auto_login(),不出意外的话,将会在命令行显示二维码,需要使用手机微信扫码登录你的微信账号。


在测试脚本里我使用numpy.random来生成训练数据,搭建了一个多层的FC网络

model = Sequential()
model.add(Dense(2048, input_dim=784))
model.add(Activation('relu'))
for i in range(9):
    model.add(Dense(2048))
    model.add(Activation('relu'))
model.add(Dense(1,activation='sigmoid'))

x=np.random.rand(nb_sample,dim)   
y=np.random.randint(2,size=(nb_sample,1))

调用插件非常简单,只需要在fit时把wechat_utils.sendmessage()这个keras的Callback类传入Callbacklist。

model.fit(x=train_x,y=train_y,batch_size=batch_size,nb_epoch=60,validation_data=(val_x,val_y),callbacks=[wechat_utils.sendmessage()])

于是训练开始,手机会收到如下反馈:我们可以向它发送查询指令,指令一般包括关键词和参数

以获取图表为例,包含以下任意关键词将被识别为获取图表指令:

[u'获取图表','Show me the figure']

参数则用{}或[]来指定,所有的指令均支持不指定参数,获取图表的默认参数是查询所有信息,例如

‘Show me the figure’触发了指令,{batches}表示查询batches级别信息,[loss hinge]表示查询loss和hinge指标(一般的,同一属性参数用空格隔开)

同理,['GPU','gpu',u'显卡']是gpu状态查询的关键词,用[]指定参数,如图,查询了gpu的显存和温度。GPU参数是根据nvidia-smi的预置参数确定的,全部都是大写,具体可查询属性请看GitHub的readme或者阅读源码。

关机指令关键词是[u'关机','Shut down','Shut down the computer',u'别浪费电了',u'洗洗睡吧'],使用{sec}和[name]指定等待时间和保存文件名,文件名不包括.h5。默认保存模型,如果不想保存,可以在消息中包含[u'不保存模型',"don't save"]比如:

Shut down now{120},don't save

取消关机只需要包含[u'取消','cancel','aaaa']就可以了,也就是说如果着急的话打一串a发过去也是可以的~

立刻停止训练的关键词是['Stop now',"That's enough",u'停止训练',u'放弃治疗'](《西部世界》看多了)指定停止epoch的关键词是‘Stop at’,参数可以直接用整数表示,不需要[]。

三、总结

这个项目从有想法算起到写注释、开GitHub、写知乎不过两天半,做的很匆忙也很粗糙,特别是画图的细节和多线程的处理。

我只是一名大一学生(休学ing),水平十分有限,恳请各位多加指点,提高我的姿势水平,如果这个项目能给你带来一点点便利或者灵感,那么我将感到十分荣幸与欣慰。

再次感谢@Coldwings的原创创意。