python - Paralelización de PyMC
parallel-processing pymc3 (2)
PYMC3 ha combinado la muestra en muestra .
Para ejecutar en paralelo, configure el parámetro njobs > 1
.
El uso de la función pymc.sample es:
sample(draws, step, start=None, trace=None, chain=0, njobs=1, tune=None, progressbar=True, model=None, random_seed=None)
Tenga en cuenta que si establece njobs=None
, se usará de forma predeterminada Cantidad de CPUs - 2.
Espero que esto ayude.
¿Podría alguien dar algunas instrucciones generales sobre cómo se puede paralelizar el código de PyMC MCMC
? Estoy tratando de ejecutar la regresión LASSO
siguiendo el ejemplo dado aquí . Leí en alguna parte que el muestreo paralelo se realiza de forma predeterminada, pero ¿todavía necesito usar algo como Parallel Python
para que funcione?
Aquí hay un código de referencia que me gustaría poder paralelizar en mi máquina.
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)
Parece que está usando PyMC2, y hasta donde yo sé, debe usar algún enfoque de Python para el cómputo paralelo, como IPython.parallel . Hay muchas formas de hacerlo, pero todas las que conozco son un poco complicadas. Aquí hay un ejemplo de uno, que usa PyMC2, IPCluster y Wakari .
En PyMC3, el muestreo paralelo se implementa en el método psample
, pero su código de referencia deberá actualizarse al formato 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)