George L.
George L.

Reputation: 21

PyMC3 is much slower than PyMC in Metropolis sampling

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

Answers (1)

colcarroll
colcarroll

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

Related Questions