# Deepcopy Flux Model

**URL:** https://discourse.julialang.org/t/deepcopy-flux-model/72930
**Category:** Machine Learning
**Tags:** question
**Created:** [December 11, 2021, 9:20am UTC](https://discourse.julialang.org/t/deepcopy-flux-model/72930 "2021-12-11T09:20:29Z")
**Posts on this page:** 1
**Showing post:** 9

<div class="post-metadata">

### Author: ![ToucheSir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/touchesir/32/14411_2.png) [@ToucheSir](https://discourse.julialang.org/u/ToucheSir)
#### Post date: [December 12, 2021, 6:28pm UTC](https://discourse.julialang.org/t/deepcopy-flux-model/72930/9 "2021-12-12T18:28:02Z")

</div>

Unfortunately this doesn’t work because `cpu`/`gpu` don’t recurse into Dicts, but it lead me to something that should 🙂

```julia
ps_gpu = params(model)
model = cpu(model)

# you could also create a new ADAM() here
opt.state = IdDict(pc => cpu(opt.state[pg]) for (pc, pg) in zip(params(model), ps_gpu))

BSON.@save "model.bson" model opt

#### now lets get it back

BSON.@load "model.bson" model opt

ps_cpu = params(model)
model = gpu(model)

# you could also create a new ADAM() here
opt.state = IdDict(pg => gpu(opt.state[pc]) for (pc, pg) in zip(params(model), ps_gpu))

```

This can be pulled out into a function:

```julia
function load_opt_state!(opt::ADAM, ps_dest, ps_src; transform=identity)
  opt.state = IdDict(p_dest => transform(opt.state[p_src]) for (p_dest, p_src) in zip(ps_dest, ps_src))
end

# example usage
load_opt_state!(opt, ps_cpu, ps_gpu, transform=cpu)

```

---

_[View the full topic](https://discourse.julialang.org/t/deepcopy-flux-model/72930)._
