0

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

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

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

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

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

多进程是不可接受的,因为我的内存有限,而且theano成本太高。

任何帮助或建议将不胜感激。

4

1 回答 1

0

您可以构建同一个 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。例如,当您执行训练步骤时,只需将新值复制到您的推理网络参数中即可。

让我们听听你的想法!

于 2017-01-13T00:07:04.667 回答