如何使用theano进行机器学习,在一个进程中处理多任务?

时间:2016-07-22 11:15:13

标签: theano theano-cuda

我有一个CNN模型。使用该模型的请求,例如对图片进行分类,每秒一次。

我想收集请求作为新的无操作数据,并继续训练我的模型。

我的问题是:如何有效地处理培训任务和分类任务?

我将解释为什么它成为一个问题:

每个训练步骤都需要很长时间,至少是几秒钟,使用GPU而不是可中断的。因此,如果我的分类任务也使用GPU,我无法及时响应请求。我想使用CPU进行分类任务,但看起来theano在一个进程中不支持两个不同的config.device。

多流程是不可接受的,因为我的记忆力有限且theano花费太多。

任何帮助或建议都会被贬低。

1 个答案:

答案 0 :(得分:0)

您可以为同一个CNN构建两个单独的副本,一个在CPU上,另一个在GPU上。我认为这可以在旧的GPU后端或新的GPU后端完成,但以不同的方式......一些想法:

在旧的后端下:

使用device=cpu加载Theano。构建推理函数并编译它。然后调用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。例如,当您进行训练步骤时,只需将新值复制到推理网络参数中即可。

让我们听听你的想法!