in jcm/sampling.py [0:0]
def get_progressive_distillation_sampler(config, sde, model, shape, denoise=True):
ema_scales_fn = get_ema_scales_fn(config)
def progressive_distillation_sampler(rng, state):
denoiser_fn = mutils.get_denoiser_fn(
sde, model, state.params_ema, state.model_state, train=False
)
_, num_scales = ema_scales_fn(state.step)
rng = hk.PRNGSequence(rng)
x = sde.prior_sampling(next(rng), shape)
t_start = sde.t_max ** (1 / sde.rho)
t_end = sde.t_min ** (1 / sde.rho)
def loop_body(i, val):
x = val
t = (t_start + i / num_scales * (t_end - t_start)) ** sde.rho
vec_t = jnp.ones((shape[0],)) * t
denoiser = denoiser_fn(x, vec_t)
d = 1 / t * x - 1 / t * denoiser
next_t = (t_start + (i + 1) / num_scales * (t_end - t_start)) ** sde.rho
samples = x + (next_t - t) * d
return samples
x = jax.lax.fori_loop(0, num_scales, loop_body, x)
if denoise:
t = sde.t_min
vec_t = jnp.ones((shape[0],)) * t
denoiser = denoiser_fn(x, vec_t)
d = 1 / t * x - 1 / t * denoiser
next_t = 0.0
samples = x + (next_t - t) * d
else:
samples = x
return samples, num_scales
return jax.pmap(progressive_distillation_sampler, axis_name="batch")