您可以爲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。例如,當您進行訓練時,只需將新值複製到推理網絡參數中即可。
讓我們聽聽你想出了什麼!