在GPU上配置Theano的情况下运行PyMC3时发生错误

问题描述

我正在接受pymc3的培训,因此我建立了一个二维聚类模型:

generated data (image)

我已经调试了模型,下面是代码:

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import pymc3 as pm
import theano
import theano.tensor as tt

#Generating data

N = 1000
p = (0.1,0.3,0.6)
M = ((1.,1.),(2.,1.5),(3.,1.))
D = (0.23,0.2,0.25)

n = N * np.array(p)
n = [int(n_) for n_ in n]
clast = [np.empty([n_,2]) for n_ in n]
for i in range(3):
        for j in range(n[i]):
            clast[i][j,0] = np.random.normal(M[i][0],D[i])
            clast[i][j,1] = np.random.normal(M[i][1],D[i])

data = np.concatenate([clast[0],clast[1],clast[2]])
np.random.shuffle(data)

#Bulding model

#Point estimation of params
data_mean = [x.mean() for x in data.T]
data_std = [x.std() for x in data.T]
data_std = np.mean(data_std)

model = pm.Model()
with model:
    p_ = pm.Uniform("p_",0.,1.,shape = 3)
    p = p_ / p_.sum()
    assignment = pm.Categorical("assignment",p,shape=N,testval=np.random.randint(0,3,N))
    mu = pm.Normal("mu",np.ones([3,2]) * data_mean,2]) * data_std ** 2,shape = (3,2))
    sigma = pm.Exponential("sigma",2]) * data_std / 3,2))
    mu_rand = pm.Deterministic("mu_rand",mu[assignment])
    sigma_rand = pm.Deterministic("sigma_rand",sigma[assignment])

    obsX = pm.Normal("obsX",mu_rand[:,0],sigma_rand[:,observed = data[:,0])
    obsY = pm.Normal("obsY",1],1])
        
    obs = pm.Deterministic("obs",tt.stack([obsX,obsY],axis = 1))

    map_estimate = pm.find_MAP(method = "powell")

    step1 = pm.Metropolis(vars=[p,mu,sigma])
    step2 = pm.ElemwiseCategorical(vars=[assignment])
    trace = pm.sample(10000,tune = 1000,step = [step1,step2],start = map_estimate,chains = 1)

上面的代码可以正常运行,但是收敛所需的时间过多(约30分钟)。

然后,我决定尝试以GPU加速运行它(PyMC3简历承诺“清晰的GPU支持”)。我安装了CUDA,随后Theano页面的示例代码报告成功使用GPU并加快了大约30倍的速度。 然后,我转到模型上,并在GPU使用情况下配置Theano来运行它。

然后是错误。最初,gpuarray加载良好,并且启用了CUDA。我们有:

Using cuDNN version 7104 on context None
Preallocating 4000/6144 Mb (0.651042) on cuda
Mapped name None to device cuda: GeForce GTX 1060 6GB (0000:01:00.0)

但是在采样时,我们会收到以下消息:

ERROR (theano.gof.opt): Optimization failure due to: local_IncSubtensor_serialize
ERROR (theano.gof.opt): node: Elemwise{add,no_inplace}(Elemwise{mul}.0,AdvancedIncSubtensor1{no_inplace,inc}.0)
ERROR (theano.gof.opt): TRACEBACK:
ERROR (theano.gof.opt): Traceback (most recent call last):
  File "C:\Users\math\miniconda3\lib\site-packages\theano\gof\opt.py",line 2034,in process_node
    replacements = lopt.transform(node)
  File "C:\Users\math\miniconda3\lib\site-packages\theano\tensor\opt.py",line 3327,in local_IncSubtensor_serialize
    tip = mi.owner.op(tip,*mi.owner.inputs[1:])
  File "C:\Users\math\miniconda3\lib\site-packages\theano\gof\op.py",line 615,in __call__
    node = self.make_node(*inputs,**kwargs)
  File "C:\Users\math\miniconda3\lib\site-packages\theano\tensor\subtensor.py",line 1919,in make_node
    ilist_ = theano.tensor.as_tensor_variable(ilist)
  File "C:\Users\math\miniconda3\lib\site-packages\theano\tensor\basic.py",line 142,in as_tensor_variable
    return x._as_TensorVariable()  # TODO: pass name and ndim arguments
  File "C:\Users\math\miniconda3\lib\site-packages\theano\gpuarray\type.py",line 579,in _as_TensorVariable
    return host_from_gpu(self)
  File "C:\Users\math\miniconda3\lib\site-packages\theano\gof\op.py",**kwargs)
  File "C:\Users\math\miniconda3\lib\site-packages\theano\gpuarray\basic_ops.py",line 578,in make_node
    raise TypeError(x)
TypeError: assignment_shared__

我不知道如何解决它。

我尝试过的事情:

  1. 重新安装软件包,然后重新安装整个conda(我使用此环境)

  2. 以不同方式重新配置.theanorc

  3. 试图在另一台机器上运行它,但出现相同的错误

  4. 与Theano共享的data变量float32:

    data = theano.shared(data,theano.config.floatX)

什么都没改变。

我想:

  1. 错误代码结尾的字符串TypeError: assignment_shared__使我认为变量assignment的类型有问题。当我检查它是形状为1000的int16数组时,我遇到了一个问题,根据GPU机器注册表,CUDA上的Theano“喜欢” 32位值。但是我看不到我可以用显式方式处理此变量类型的方法,因为它隐藏在PyMC3“黑色外壳”中。所以我没有武器。

有没有人可以建议对此错误原因的任何猜测?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...