首页 > 解决方案 > 运行 PyMC3 模型时如何解决内存错误

问题描述

我有以下 pymc3 (3.8) 分层模型,其中

with pm.Model() as model:
    
    gamma_0_0 = pm.Normal("gamma_0_0", mu=0, sigma=10)  
    gamma_k_0 = pm.Normal("gamma_k_0", mu=0, sigma=10, shape=x.shape[1])

    gamma_0_j = pm.Normal("gamma_0_j", mu=0, sigma=10, shape=z.shape[1])
    gamma_k_j = pm.Normal("gamma_k_j", mu=0, sigma=10, shape=(z.shape[1], x.shape[1])) 

    # Model error
    u_0_j = pm.Normal("u_0_j", mu=0, sigma=10) 
    u_k_j = pm.Normal("u_k_j", mu=0, sigma=10, shape=x.shape[1]) 

    r_ij = pm.Gamma("r_ij", alpha=9, beta=4)


    beta_0_j = pm.math.dot(z, gamma_0_j) + gamma_0_0 + u_0_j
    beta_k_j = pm.math.dot(z, gamma_k_j) + gamma_k_0 + u_k_j

    y_hat = pm.math.dot(x, beta_k_j.T) + beta_0_j

    # Likelihood
    y_like = pm.Normal("y_like", mu=y_hat, sigma=r_ij, observed=y)

with model:
    step = pm.NUTS()
    trace = pm.sample(draws=500, chains=2, tune=200, discard_tuned_samples=True, random_seed=SEED, step=step)

当我从后部仅抽取 200 个样本(tune=100)时,模型运行良好。但是,当我将样本增加到 500(tune=200)时,会出现以下错误:

numpy.core._exceptions.MemoryError:无法为形状为(2、500、1313、1313)且数据类型为 float64 的数组分配 12.8 GiB

没有模型不再运行的问题,我不明白为什么错误报告中的数组形状是(2、500、1313、1313)。2 可以是链数,500 是样本数,1313 是 y 的长度。但为什么不是 (2, 500, 1313)?

我知道这个错误可能可以通过分配更多内存来解决,如此处所述(无法分配具有形状和数据类型的数组),但我正在寻求更可持续的解决方案。

我使用 Windows10 (32GB RAM)、Anaconda 3 和 Python 3.8

标签: python-3.xout-of-memoryhierarchical-datamontecarlopymc3

解决方案


推荐阅读