Reputation: 21
I am trying to compare the sampling speed between PyMC and PyMC3.
PyMC:
p1 = pymc.Normal('p1', 10, 0.5)
p2 = pymc.Gamma('p2', 11, 5)
p3 = pymc.Normal('p3', p1, p2)
model = pymc.Model([p1, p2, p3])
mcmc = pymc.MCMC(model)
mcmc.use_step_method(pymc.Metropolis, p1, p2, p3)
mcmc.sample(10000, progress_bar=True)
This took 2.7s
PyMC3:
with pm.Model() as model:
p1 = pm.Normal('p1', 10, 0.5)
p2 = pm.Gamma('p2', 11, 5)
p3 = pm.Normal('p3', p1, p2)
steps = pm.Metropolis(vars=[p1, p2, p3])
trace = pm.sample(10000,step=steps, progressbar=True)
This took 6.6s
Is this normal? Am I missing some optimization tricks for PyMC3?
Upvotes: 2
Views: 1906
Reputation: 3682
This is normal! PyMC3 is optimized for running NUTS, an MCMC algorithm for continuous models that is orders of magnitude more efficient than Metropolis for sampling from hierarchical models. Conversely, pymc
is written in fortran, which provides some speedups over jitted theano code from pymc3, and perhaps cares more deeply about algorithms like Metropolis.
Upvotes: 2