“
天清
PaperWeekly 交流二群群友
關(guān)注音樂生成和量化交易
創(chuàng)意來源
深度學(xué)習(xí)訓(xùn)練是一個非常耗時、枯燥的過程:一次訓(xùn)練少則幾個小時減速機(jī)大全圖片1比2減速機(jī),多則數(shù)天,而且中途能人為干預(yù)的機(jī)會更是少之又少,在大部分時間里能做的只有等待。
不少人都有這樣強(qiáng)迫癥,腳本開始運(yùn)行后會不停的看準(zhǔn)確率和loss,就像像球迷看球賽、股民盯報價一樣刺激。一般來說,想要監(jiān)控深度學(xué)習(xí)訓(xùn)練,只能使用 ssh 或者 Tensorboard。一旦需要外出,只能通過手機(jī)監(jiān)控深度學(xué)習(xí),操作十分麻煩,于是只能無奈地守在電腦前空耗生命。
我們急需一種辦法能夠?qū)⑽覀儚碾娔X前解放,讓監(jiān)控深度學(xué)習(xí)變得簡單方便,不再受時間、空間和平臺的限制。在當(dāng)今社會,有什么東西是在任何時間任何地點(diǎn)我們都能使用的呢減速機(jī)大全圖片1比2減速機(jī)?答案只有一個:微信。
微信是每個中國人接入社會的重要接口,我們用微信在地鐵上看雞湯、在商場使用電子支付、癱在沙發(fā)上刷朋友圈……總之,微信幾乎包辦減速機(jī)大全圖片1比2減速機(jī)了我們生活中的一切,讓人產(chǎn)生一種錯覺,在不久的未來手機(jī)上只需要裝微信一個軟件就夠了。那么,如果微信能把監(jiān)控深度學(xué)習(xí)也包辦了豈不是妙哉?
在知乎上看到@Coldwings - 利用微信監(jiān)管你的TF訓(xùn)練(https://zhuanlan.zhihu.com/p/25597975?group_id=822180572054048768)的用微信監(jiān)控 Tensorflow 訓(xùn)練的項目,很受啟發(fā),決定開發(fā)一款用微信監(jiān)控 Keras 訓(xùn)練的插件。歡迎 fork 這個項目的 GitHub:https://github.com/QuantumLiu/wechat_callback。
原理介紹
本插件基于 python3.5,python2.7 需要將_thread 改為 thread。當(dāng) import 程序文件時,將首先通過 ItChat(https://github.com/littlecodersh/ItChat)在服務(wù)器掃碼登錄微信(網(wǎng)頁版)。
插件的主體是 sendmessage(),一個 Keras 的 keras.callbacks.Callback() 類,訓(xùn)練時被傳入 fit() 方法的 callbacklist。在 on_train_begin(self, logs={}) 時,利用 @itchat.msg_register(TEXT) 注冊針對不同命令的響應(yīng)方法,啟動新線程開始實時監(jiān)控命令。
對命令的識別采用的是 python 的 if any((k in text) for k in cmdlist): 方法,即只要發(fā)送的消息內(nèi)容包含符合條件的關(guān)鍵詞即可出發(fā),冗余字符不影響命令的觸發(fā)。
訓(xùn)練過程中,由手機(jī)微信與“文件傳輸助手”間的通訊來實現(xiàn)命令的傳遞與內(nèi)容反饋。
如圖,“獲取圖表{batches}”和“gpu[MEMORY TEMPERATURE]”是使用者本人發(fā)送的命令,服務(wù)器響應(yīng)命令,以給文件助手發(fā)送消息的方式反饋內(nèi)容(圖表、匯報和狀態(tài))。
主要功能
目前已經(jīng)實現(xiàn)了被動監(jiān)控、主動查詢、遠(yuǎn)程關(guān)機(jī)/停止訓(xùn)練等多項功能。
1. 實時監(jiān)控:在每個epoch結(jié)束后,自動發(fā)送本epoch訓(xùn)練信息以及兩張分別代表所有batch和epoch信息的圖表至文件傳輸助手。
2. 主動查詢:在訓(xùn)練開始后的任意時刻,發(fā)送特定格式的指令,可獲得指定查詢項的信息。目前支持 batch 和 epoch 的各個指標(biāo)的信息、顯卡狀態(tài)信息。
3. 遠(yuǎn)程控制:當(dāng)你覺得訓(xùn)練已經(jīng)收斂,或者因任何原因需要停止訓(xùn)練時,可以優(yōu)雅地終止訓(xùn)練甚至關(guān)機(jī)。Keras 的 fit 方法中,可以通過在 callback 設(shè)置 self.model.stop_training = True 來實現(xiàn)在當(dāng)前 epoch 結(jié)束時終止訓(xùn)練,否則只能 Ctrl+C 暴力停止。利用本插件,可以使用特殊格式的指令來指定停止 epoch、立刻停止訓(xùn)練,甚至關(guān)機(jī)和取消關(guān)機(jī)。
例子與講解1. 準(zhǔn)備工作
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 所在位置添加進(jìn)環(huán)境變量。
2. 運(yùn)行測試腳本
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 的回調(diào)類,fit 時傳入 callbacklist
在 wechat_utils.py 中:
# Automaticly login when imported
#在被import時自動登錄
#==============================================================================
itchat.auto_login(enableCmdQR=0.5,hotReload=True)
itchat.dump_login_status()#dump
可以看到,當(dāng) wechat_utils 被 import 時會調(diào)用 itchat.auto_login(),不出意外的話,將會在命令行顯示二維碼,需要使用手機(jī)微信掃碼登錄你的微信賬號。
在測試腳本里我使用 numpy.random 來生成訓(xùn)練數(shù)據(jù),搭建了一個多層的 FC 網(wǎng)絡(luò)
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))
調(diào)用插件非常簡單,只需要在 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()])
于是訓(xùn)練開始,手機(jī)會收到如下反饋:
現(xiàn)在,我們可以向它發(fā)送查詢指令,指令一般包括關(guān)鍵詞和參數(shù),以獲取圖表為例,包含以下任意關(guān)鍵詞將被識別為獲取圖表指令:
[u'獲取圖表','Show me the figure']
參數(shù)則用{}或[]來指定,所有的指令均支持不指定參數(shù),獲取圖表的默認(rèn)參數(shù)是查詢所有信息,例如:
‘Show me the figure’ 觸發(fā)了指令,{batches} 表示查詢 batches 級別信息,[losshinge] 表示查詢 loss 和 hinge 指標(biāo)(一般的,同一屬性參數(shù)用空格隔開)。
同理,['GPU','gpu',u'顯卡'] 是 gpu 狀態(tài)查詢的關(guān)鍵詞,用[]指定參數(shù),如圖,查詢了 gpu 的顯存和溫度。GPU 參數(shù)是根據(jù) nvidia-smi 的預(yù)置參數(shù)確定的,全部都是大寫,具體可查詢屬性請看 GitHub 的 readme 或者閱讀源碼。
關(guān)機(jī)指令關(guān)鍵詞是 [u'關(guān)機(jī)','Shut down','Shut down the computer',u'別浪費(fèi)電了',u'洗洗睡吧'],使用 {sec} 和 [name] 指定等待時間和保存文件名,文件名不包括.h5。默認(rèn)保存模型,如果不想保存,可以在消息中包含 [u'不保存模型',"don't save"] 比如:
Shut down now{120},don't save
取消關(guān)機(jī)只需要包含 [u'取消','cancel','aaaa'] 就可以了,也就是說如果著急的話打一串 a 發(fā)過去也是可以的。
立刻停止訓(xùn)練的關(guān)鍵詞是 ['Stopnow',"That's enough",u'停止訓(xùn)練',u'放棄治療'] (《西部世界》看多了)。
指定停止 epoch 的關(guān)鍵詞是 ‘Stop at’,參數(shù)可以直接用整數(shù)表示,不需要 []。
命令與關(guān)鍵詞列表
1. 遠(yuǎn)程停止訓(xùn)練
關(guān)鍵詞列表:
['Stop now',"That'senough",u'停止訓(xùn)練',u'放棄治療']
說明:發(fā)送的消息中包含任意一項都可觸發(fā)命令。將在當(dāng)前epoch結(jié)束后停止訓(xùn)練。無參數(shù)。
2. 遠(yuǎn)程關(guān)機(jī)
關(guān)鍵詞列表:
[u'關(guān)機(jī)','Shut down','Shut down the computer',u'別浪費(fèi)電了',u'洗洗睡吧']
說明:發(fā)在指定秒數(shù)后關(guān)機(jī),用 {sec} 和 [name] 指定參數(shù)等待時間和保存文件名,文件名不包括 .h5。如果同時包含 [u'不保存模型',"don't save"],則不會保存模型。例:發(fā)送 'Shut down now [test]{120}',電腦將在 120 秒后關(guān)機(jī),將模型保存為 test.h5。若發(fā)送 'Shut down now{120},don't save',則模型將不會被保存。
3. 取消關(guān)機(jī)
關(guān)鍵詞列表:
[u'取消','cancel','aaaa']
說明:發(fā)送的消息中包含任意一項都可觸發(fā)命令。無參數(shù)。
4. 獲取圖表
關(guān)鍵詞列表:
[u'獲取圖表','Show me the figure']
說明:發(fā)送的消息中包含任意一項都可觸發(fā)命令。通過[metrics] 和{level} 指定參數(shù),如果沒有指定則皆默認(rèn)為’all'。例:手機(jī)發(fā)送"獲取圖表[loss]{batches}",會收到一個 jpg 格式的 loss 隨 batches 變化的圖片。手機(jī)發(fā)送"獲取圖表",則會得到兩張圖片,分別是所有指標(biāo)隨 batch 和 epoch 的變化。
5. 指定訓(xùn)練停止輪數(shù)
關(guān)鍵詞列表:
'Stop at '
參數(shù)可以直接用整數(shù)表示,不需要 []。例:手機(jī)發(fā)送“Stop at:8”,訓(xùn)練將在 epoch8 完成后停止。
6. 查詢顯卡狀態(tài)
關(guān)鍵詞列表:
['GPU','gpu',u'顯卡']
參數(shù)使用 [TYPE] 來指定,GPU 參數(shù)是根據(jù) nvidia-smi 的預(yù)置參數(shù)確定的,全部都是大寫,在 [] 內(nèi)用空格分隔。
可用參數(shù)列表:
['MEMORY', 'UTILIZATION', 'ECC', 'TEMPERATURE','POWER', 'CLOCK', 'COMPUTE', 'PIDS', 'PERFORMANCE','SUPPORTED_CLOCKS,PAGE_RETIREMENT', 'ACCOUNTING']
例:發(fā)送'gpu[MEMORY]'或者'顯卡[MEMORY]'查詢顯存使用;發(fā)送'GPU[MEMORYTEMPERATURE]'查詢顯存和溫度。
總結(jié)
這個項目從有想法算起到寫注釋、開 GitHub、寫知乎不過兩天半,做的很匆忙也很粗糙,特別是畫圖的細(xì)節(jié)和多線程的處理。
我只是一名阿語專業(yè)大一學(xué)生(休學(xué)ing),水平十分有限,懇請各位多加指點(diǎn),提高我的姿勢水平,如果這個項目能給你帶來一點(diǎn)點(diǎn)便利或者靈感,那么我將感到十分榮幸與欣慰。
再次感謝 @Coldwings 的原創(chuàng)創(chuàng)意。
評論列表
還沒有評論,快來說點(diǎn)什么吧~