【问题标题】:Converting a theano model built on GPU to CPU?将基于 GPU 的 theano 模型转换为 CPU?
【发布时间】:2014-10-03 21:55:07
【问题描述】:

我有一些基于 gpu 的深度学习模型的 pickle 文件。我正在尝试在生产中使用它们。但是当我尝试在服务器上解开它们时,我收到以下错误。

回溯(最近一次通话最后一次):
文件“score.py”,第 30 行,在
模型 = (cPickle.load(file))
文件“/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'", , (array([[ 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]], dtype=float32),))

我在我的本地机器上检查了那个 cudaNdarray 包,它没有安装,但我仍然可以解开它们。但在服务器中,我无法。如何让它们在没有 GPU 的服务器上运行?

【问题讨论】:

    标签: deep-learning gpu pickle theano


    【解决方案1】:

    pylearn2 中有一个脚本可以满足您的需求:

    pylearn2/scripts/gpu_pkl_to_cpu_pkl.py

    【讨论】:

    • 这个脚本是非常实验性的,在很多情况下都不能正常工作。我想知道是否有更好的方法来解决这个问题。
    • 可能有,但还没有人做过。理论上,您可以提取权重并将图形结构转换为它的“配对”CPU 操作,但这并不容易。
    【解决方案2】:

    相关的Theano代码是here

    从那里看来,您可以设置一个选项 config.experimental.unpickle_gpu_on_cpu,这将使 CudaNdarray_unpickler 返回底层的原始 Numpy 数组。

    【讨论】:

    • 这是默认包含在 Theano 中的吗?我的意思是,只是设置了这个选项,然后Cuda数组就透明转换了吗?
    【解决方案3】:

    这对我有用。注意:除非设置了以下环境变量,否则这不起作用:export THEANO_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)
    

    【讨论】:

      【解决方案4】:

      我只保存参数 W & b 解决了这个问题,而不是整个模型。您可以使用此保存参数:http://deeplearning.net/software/theano/tutorial/loading_and_saving.html?highlight=saving%20load#robust-serialization 这可以将 CudaNdarray 保存到 numpy 数组。然后需要通过 numpy.load() 读取参数,最后使用 theano.shared() 将 numpy 数组转换为 tensorSharedVariable。

      【讨论】:

        猜你喜欢
        • 2019-02-16
        • 2020-04-17
        • 2017-03-22
        • 2022-08-23
        • 1970-01-01
        • 2017-01-05
        • 2016-07-16
        • 2015-12-24
        • 1970-01-01
        相关资源
        最近更新 更多