您可以构建同一个 CNN 的两个独立副本,一个在 CPU 上,一个在 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。例如,当您执行训练步骤时,只需将新值复制到您的推理网络参数中即可。
让我们听听你的想法!