PyMC的并行化

11

有人能够给出如何并行化 PyMC MCMC 代码的一般指导吗?我正在尝试运行这里提供的示例中的 LASSO 回归。我在某处读到并行采样是默认完成的,但我是否仍然需要使用类似于 Parallel Python 的东西使其工作?

下面是一些参考代码,我希望能够在我的机器上并行化运行。

x1 = norm.rvs(0, 1, size=n)
x2 = -x1 + norm.rvs(0, 10**-3, size=n)
x3 = norm.rvs(0, 1, size=n)

X = np.column_stack([x1, x2, x3])
y = 10 * x1 + 10 * x2 + 0.1 * x3

beta1_lasso = pymc.Laplace('beta1', mu=0, tau=1.0 / b)
beta2_lasso = pymc.Laplace('beta2', mu=0, tau=1.0 / b)
beta3_lasso = pymc.Laplace('beta3', mu=0, tau=1.0 / b)

@pymc.deterministic
def y_hat_lasso(beta1=beta1_lasso, beta2=beta2_lasso, beta3=beta3_lasso, x1=x1, x2=x2, x3=x3):
    return beta1 * x1 + beta2 * x2 + beta3 * x3

Y_lasso = pymc.Normal('Y', mu=y_hat_lasso, tau=1.0, value=y, observed=True)

lasso_model = pymc.Model([Y_lasso, beta1_lasso, beta2_lasso, beta3_lasso])
lasso_MCMC = pymc.MCMC(lasso_model)
lasso_MCMC.sample(20000,5000,2)
2个回答

12
看起来你正在使用PyMC2,据我所知,你必须使用一些Python的并行计算方法,例如IPython.parallel。有许多方法可以实现,并且我所知道的所有方法都有点复杂。这里是一个例子,它使用了PyMC2、IPCluster和Wakari。
在PyMC3中,平行采样是在psample方法中实现的,但是你的参考代码需要更新为PyMC3的格式:
with pm.Model() as model:
    beta1 = pm.Laplace('beta1', mu=0, b=b)
    beta2 = pm.Laplace('beta2', mu=0, b=b)
    beta3 = pm.Laplace('beta3', mu=0, b=b)

    y_hat = beta1 * x1 + beta2 * x2 + beta3 * x3
    y_obs = pm.Normal('y_obs', mu=y_hat, tau=1.0, observed=y)

    trace = pm.psample(draws=20000, step=pm.Slice(), threads=3)

11

PYMC3已经将psample合并到sample中。

若要并行运行,请设置参数njobs > 1

pymc.sample函数的用法如下:

sample(draws, step, start=None, trace=None, chain=0, njobs=1, tune=None, progressbar=True, model=None, random_seed=None) 请注意,如果你将njobs=None,它会默认为CPU数量 - 2。

希望这可以帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接