Deep learning 将基于GPU的theano模型转换为CPU?

Deep learning 将基于GPU的theano模型转换为CPU?,deep-learning,gpu,pickle,theano,Deep Learning,Gpu,Pickle,Theano,我有一些基于gpu的深度学习模型的pickle文件。我试着在生产中使用它们。但是当我试图在服务器上取消勾选它们时,我得到了以下错误 回溯(最近一次呼叫最后一次): 文件“score.py”,第30行,在 模型=(cPickle.load(文件)) 文件“/usr/local/python2.7/lib/python2.7/site packages/Theano-0.6.0-py2.7.egg/Theano/sandbox/cuda/type.py”,第485行,CudaNdarray_unpi

我有一些基于gpu的深度学习模型的pickle文件。我试着在生产中使用它们。但是当我试图在服务器上取消勾选它们时,我得到了以下错误

回溯(最近一次呼叫最后一次):
文件“score.py”,第30行,在
模型=(cPickle.load(文件))
文件“/usr/local/python2.7/lib/python2.7/site packages/Theano-0.6.0-py2.7.egg/Theano/sandbox/cuda/type.py”,第485行,CudaNdarray_unpickler
返回cuda.CudaNdarray(npa)
AttributeError:(“'NoneType'对象没有属性'CudaNdarray'”,(数组([[0.011515,0.01171047,0.10408644,…-0.0343636,
0.04944979,-0.06583775],
[-0.03771918,0.080524,-0.10609912,…,0.11019105,
-0.0570752,0.02100536],
[-0.03628891,-0.07109226,-0.00932018,…,0.04316209,
0.02817888,0.05785328],
…,
[0.0703947,-0.00172865,-0.05942701,…-0.00999349,
0.01624184,0.09832744],
[-0.09029484,-0.11509365,-0.07193922,…,0.10658887,
0.17730837,0.01104965],
[0.06659461,-0.02492988,0.02271739,…-0.0646857,
0.03879852,0.08779807]],数据类型=float32),)


我在本地机器中检查了cudaNdarray软件包,但它没有安装,但我仍然能够解除对它们的锁定。但在服务器上,我无法。如何使它们在没有GPU的服务器上运行?

Pylern2中有一个脚本,可以满足您的需要:


pylearn2/scripts/gpu\u pkl\u to\u cpu\u pkl.py

相关的Theano代码为


从这里看,似乎有一个选项
config.experiative.unpickle\u gpu\u on_cpu
,您可以设置该选项,它将使
CudaNdarray\u unpickler
返回底层原始Numpy数组。

这对我很有用。注意:除非设置了以下环境变量,否则这不起作用:
export THEANO\u FLAGS='device=cpu'

import os
from pylearn2.utils import serial
import pylearn2.config.yaml_parse as yaml_parse

if __name__=="__main__":

_, in_path, out_path = sys.argv
os.environ['THEANO_FLAGS']="device=cpu"

model = serial.load(in_path)

model2 = yaml_parse.load(model.yaml_src)
model2.set_param_values(model.get_param_values())

serial.save(out_path, model2)

我解决了这个问题,只保存了参数W&b,而不是整个模型。您可以使用以下方法保存参数:
这可以将CudaNdarray保存到numpy数组。然后,您需要通过numpy.load()读取参数,最后使用ano.shared()将numpy数组转换为TensorShared变量。

此脚本非常具有实验性,在许多情况下都无法正常工作。我想知道是否有更好的方法来解决这个问题。可能有,但还没有人这样做。从理论上讲,您可以提取权重并将图形结构转换为它的“成对”CPU操作,但这并不容易。默认情况下,这包括在Theano中吗?我的意思是,这只是一个设置这个选项的问题,然后Cuda阵列被透明地转换?