# Save a fitted Turing model to disk

**URL:** <https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396>\
**Category:** Probabilistic Programming\
**Tags:** question\
**Created:** [June 29, 2024, 5:58pm UTC](https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396 "2024-06-29T17:58:09Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)\
**Post date:** [June 29, 2024, 5:58pm UTC](https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396/1 "2024-06-29T17:58:09Z")

</div>

I am struggling to find the most straightforward way (using as little additional packages as possible) to save a `Chains MCMC chain` object (obtained from sampling from a Turing model) on the disk.

I would like to be able, in another script, to load some models and carry on with some post processing and further analysis.

Thanks!

---

<div class="post-metadata">

**Author:** ![kevbonham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevbonham/32/216165_2.png) [@kevbonham](https://discourse.julialang.org/u/kevbonham)\
**Post date:** [June 30, 2024, 2:14am UTC](https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396/2 "2024-06-30T02:14:24Z")

</div>

I think JLD2.jl is pretty good at stuff like this.

---

<div class="post-metadata">

**Author:** ![ElOceanografo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eloceanografo/32/624_2.png) [@ElOceanografo](https://discourse.julialang.org/u/ElOceanografo)\
**Post date:** [June 30, 2024, 4:17am UTC](https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396/3 "2024-06-30T04:17:22Z")

</div>

Also easy to covert a chain to a `DataFrame` and save it as a CSV file:

```julia
using Turing, DataFrames, CSV
@model function demo(x)
    m ~ Normal()
    s ~ Exponential()
    x .~ Normal(m, s)
end
mod = demo(randn(100))
chn = sample(mod, NUTS(), 1000)
df = DataFrame(chn)
CSV.write("demo_chain.csv", df)

```

---

<div class="post-metadata">

**Author:** ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)\
**Post date:** [June 30, 2024, 10:17am UTC](https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396/4 "2024-06-30T10:17:42Z")

</div>

> Also easy to covert a chain to a `DataFrame`

Unfortunately from a dataframe I don’t think I’m able to then load it and re-use the fitted model to make for e.g., predictions etc.

However, it worked using JLD2 🙂

```jl
using JLD2
jldsave("models/mymodel.jld2"; mymodel)
mymodel= jldopen("models/mymodel.jld2", "r+")["mymodel"]

```

---

<div class="post-metadata">

**Author:** ![sethaxen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sethaxen/32/35604_2.png) [@sethaxen](https://discourse.julialang.org/u/sethaxen)\
**Post date:** [July 4, 2024, 8:49am UTC](https://discourse.julialang.org/t/save-a-fitted-turing-model-to-disk/116396/5 "2024-07-04T08:49:19Z")

</div>

JLD2 is fine for going between steps of a workflow (IIRC you need the environment in which you are saving to be very similar to the one in which you are loading). For more long-term storage (e.g. deposition for a paper), formats like NetCDF are nice, since they also use HDF5 and because they are language- and environment-agnostic. If you use [ArviZ.jl](https://julia.arviz.org/ArviZ/stable/) for downstream analysis, you can do

```julia
using ArviZ
idata = from_mcmcchains(chns)
to_netcdf(idata, "models/mymodel.nc")

```
