2016-07-22 39 views
0

我有一個CNN模型。使用這個模型的請求,例如分類圖片,每秒鐘需要1次。如何在一個使用theano進行機器學習的過程中處理多任務?

我想收集請求作爲新的未經處理的數據,並繼續訓練我的模型。

我的問題是:我如何處理培訓任務並有效分類任務?

我將解釋爲什麼它成爲一個問題:

每個訓練階段需要很長的時間,至少severy秒,使用GPU和不可中斷。所以,如果我的分類任務也使用GPU,我無法及時迴應請求。我想使用CPU進行分類任務,但看起來像theano在一個進程中不支持兩個不同的config.device。

多進程是不可接受的,因爲我的記憶是有限的,並且theano成本太高。

任何幫助或建議將被認爲是。

回答

0

您可以爲CPU創建兩個獨立的CNN拷貝,一個在GPU上。我認爲這可能老任GPU後端或新下進行,但以不同的方式....一些想法:

在舊的後端:

負載Theano與device=cpu。建立你的推理函數並編譯它。然後打電話theano.sandbox.cuda.use('gpu'),並建立一個推理功能的新副本,並採取該梯度來做出任何培訓功能。現在推理功能應該在CPU上執行,並且訓練應該發生在GPU上。 (我從來沒有這樣做有目的,但我有它發生在我身上的意外!)

在新的後端:

據我所知,你一定要告訴Theano任何GPU的正確導入時,不晚。在這種情況下,您可以使用THEANO_FLAGS="contexts=dev0->cuda0",它不會強制使用一臺設備。然後像正常一樣構建函數的推理版本,並且對於訓練版本,再次將所有共享變量放在GPU上,並且輸入到任何訓練函數的變量也應該是GPU變量(例如input_var_1.transfer('dev0'))。當你編譯好所有函數時,使用theano.printing.debugprint(function)來查看程序,看看GPU和CPU之間有什麼關係。 (在編譯CPU功能時,它可能會給出一個警告,說明它無法推斷上下文,就我所見,它將它放在CPU上......不確定這種行爲是否安全依賴。)

在任何一種情況下,這取決於您的基於GPU的函數不返回任何CPU(確保輸出變量是GPU的函數)。這應該允許訓練函數同時運行到你的推理函數,然後你可以抓住你需要的CPU。例如,當您進行訓練時,只需將新值複製到推理網絡參數中即可。

讓我們聽聽你想出了什麼!