How to save and load trace


I tried doing what @junpenglao and @colcarroll pointed to at but I keep getting errors.

My model:

with pm.Model() as mG:
    alpha = pm.Normal(...)
    beta = [...]
    sigma = [...]
    mu =[...]
    Ages = pm.Normal(...)
    trace_mG = pm.sample(2000, tune=1000, random_seed=13)

Saving trace:

trace_1 = pm.save_trace(trace_mG)

Loading trace:

with mG:
    trace2 = pm.load_trace(trace_1)

The error I get:

AttributeError                            Traceback (most recent call last)
<ipython-input-201-ecc0fb6c7706> in <module>()
      1 # rr = pm.load_trace('m', model=mG)
----> 2 with mG:
      3     trace2 = pm.load_trace(trace_1)
AttributeError: __enter__

I also tried loading like this:

trace2 = pm.load_trace('.pymc_1.trace', model=mG)

But the error I get is:

AttributeError: 'str' object has no attribute 'unobserved_RVs'

Anyone know how to do this?


It appears that no one knows the answer.

Should I change the tag to Development?


I am surprised by the error - could you please open an issue on Github with some simple examples?


I can’t reproduce the error, and for some reason now it works fine. I didn’t even restart my computer and did exactly the same thing. Not sure what the problem was; perhaps a bug in my computer.

Maybe we should still leave this closed question up here in case this happens to anyone else.

Thank you @junpenglao


Thanks for the reply. @michaelosthege called these kind of bugs Heisenbug which is pretty fitting :joy:


@junpenglao, After I restart my computer and re-open my jupyter notebook, I tried loading the saved trace:

with model_1:
    trace_1 = pm.load_trace(".pymc_1.trace")

But it says it doesn’t recognize the model. Do I have to re-run my model? If so, what is save_trace usually used for, considering that you have to run the whole model again?


You do need to reinitialized the model, meaning that you should run the same model code, excluding the pm.sample(...) line.


For what it is worth, I have found this to be a good pattern in pymc3 - to separate the modelling step from the sampling step. I even will often define a model in a function, and do things like

def my_model():
    with pm.Model() as model:
        x = pm.Normal('x')
    return model

with my_model():
    other stuff


This is a good idea. Separation between model building and inference is a good way to avoid confusion, we should enforce it better in PyMC4.