用微信控制深度学习训练的Keras插件 - #Geek Time




天清

PaperWeekly 交流二群群友

关注音乐生成和量化交易



创意来源


深度学习训练是一个非常耗时、枯燥的过程:一次训练少则几个小时,多则数天,而且中途能人为干预的机会更是少之又少,在大部分时间里能做的只有等待。


不少人都有这样强迫症,脚本开始运行后会不停的看准确率和 loss,就像像球迷看球赛、股民盯报价一样刺激。一般来说,想要监控深度学习训练,只能使用 ssh 或者 Tensorboard。一旦需要外出,只能通过手机监控深度学习,操作十分麻烦,于是只能无奈地守在电脑前空耗生命。


我们急需一种办法能够将我们从电脑前解放,让监控深度学习变得简单方便,不再受时间、空间和平台的限制。在当今社会,有什么东西是在任何时间任何地点我们都能使用的呢?答案只有一个:微信


微信是每个中国人接入社会的重要接口,我们用微信在地铁上看鸡汤、在商场使用电子支付、瘫在沙发上刷朋友圈……总之,微信几乎包办了我们生活中的一切,让人产生一种错觉,在不久的未来手机上只需要装微信一个软件就够了。那么,如果微信能把监控深度学习也包办了岂不是妙哉?


在知乎上看到@Coldwings 利用微信监管你的TF训练https://zhuanlan.zhihu.com/p/25597975?group_id=822180572054048768)的用微信监控 Tensorflow 训练的项目,很受启发,决定开发一款用微信监控 Keras 训练的插件。欢迎 fork 这个项目的 GitHubhttps://github.com/QuantumLiu/wechat_callback


原理介绍


本插件基于 python3.5,python2.7 需要将_thread 改为 thread。当 import 程序文件时,将首先通过 ItChat(https://github.com/littlecodersh/ItChat)在服务器扫码登录微信(网页版)。


插件的主体是 sendmessage(),一个 Keras 的 keras.callbacks.Callback() 类,训练时被传入 fit() 方法的 callbacklist。在 on_train_begin(self, logs={}) 时,利用 @itchat.msg_register(TEXT) 注册针对不同命令的响应方法,启动新线程开始实时监控命令。


对命令的识别采用的是 python 的 if any((k in text) for k in cmdlist): 方法,即只要发送的消息内容包含符合条件的关键词即可出发,冗余字符不影响命令的触发。


训练过程中,由手机微信与“文件传输助手”间的通讯来实现命令的传递与内容反馈。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


如图,“获取图表{batches}”和“gpu[MEMORY TEMPERATURE]”是使用者本人发送的命令,服务器响应命令,以给文件助手发送消息的方式反馈内容(图表、汇报和状态)。


主要功能


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


1. 实时监控在每个epoch结束后,自动发送本epoch训练信息以及两张分别代表所有batchepoch信息的图表至文件传输助手。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


2. 主动查询:在训练开始后的任意时刻,发送特定格式的指令,可获得指定查询项的信息。目前支持 batch 和 epoch 的各个指标的信息、显卡状态信息。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


3. 远程控制:当你觉得训练已经收敛,或者因任何原因需要停止训练时,可以优雅地终止训练甚至关机。Keras 的 fit 方法中,可以通过在 callback 设置 self.model.stop_training = True 来实现在当前 epoch 结束时终止训练,否则只能 Ctrl+C 暴力停止。利用本插件,可以使用特殊格式的指令来指定停止 epoch、立刻停止训练,甚至关机和取消关机。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


例子与讲解


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 所在位置添加进环境变量。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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(),不出意外的话,将会在命令行显示二维码,需要使用手机微信扫码登录你的微信账号。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


在测试脚本里我使用 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()])


于是训练开始,手机会收到如下反馈:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


现在,我们可以向它发送查询指令,指令一般包括关键词参数,以获取图表为例,包含以下任意关键词将被识别为获取图表指令:


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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


关机指令关键词是 [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 发过去也是可以的。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


立刻停止训练的关键词是 ['Stopnow',"That's enough",u'停止训练',u'放弃治疗'] (《西部世界》看多了)。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


指定停止 epoch 的关键词是 ‘Stop at’,参数可以直接用整数表示,不需要 []。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


命令与关键词列表


1. 远程停止训练


关键词列表:

['Stop now',"That'senough",u'停止训练',u'放弃治疗']  


说明:发送的消息中包含任意一项都可触发命令。将在当前epoch结束后停止训练。无参数。


2. 远程关机


关键词列表:

[u'关机','Shut down','Shut down the computer',u'别浪费电了',u'洗洗睡吧']


说明:发在指定秒数后关机,用 {sec} 和 [name] 指定参数等待时间和保存文件名,文件名不包括 .h5。如果同时包含 [u'不保存模型',"don't save"],则不会保存模型。例:发送 'Shut down now [test]{120}',电脑将在 120 秒后关机,将模型保存为 test.h5。若发送 'Shut down now{120},don't save',则模型将不会被保存。


3. 取消关机


关键词列表:

[u'取消','cancel','aaaa']


说明:发送的消息中包含任意一项都可触发命令。无参数。


4. 获取图表


关键词列表:

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


说明:发送的消息中包含任意一项都可触发命令。通过 [metrics]  {level} 指定参数,如果没有指定则皆默认为 ’all'。例:手机发送"获取图表[loss]{batches}",会收到一个 jpg 格式的 loss 随 batches 变化的图片。手机发送"获取图表",则会得到两张图片,分别是所有指标随 batch 和 epoch 的变化。


5. 指定训练停止轮数


关键词列表:

'Stop at '


参数可以直接用整数表示,不需要 []。例:手机发送“Stop at:8”,训练将在 epoch8 完成后停止。


6. 查询显卡状态


关键词列表:

['GPU','gpu',u'显卡']


参数使用 [TYPE] 来指定,GPU 参数是根据 nvidia-smi 的预置参数确定的,全部都是大写,在 [] 内用空格分隔。


可用参数列表:

['MEMORY', 'UTILIZATION', 'ECC', 'TEMPERATURE','POWER', 'CLOCK', 'COMPUTE', 'PIDS', 'PERFORMANCE','SUPPORTED_CLOCKS,PAGE_RETIREMENT', 'ACCOUNTING']


例:发送'gpu[MEMORY]'或者'显卡[MEMORY]'查询显存使用;发送'GPU[MEMORYTEMPERATURE]'查询显存和温度。


总结


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


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


来源:paperweekly


原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值