project: diffusion-from-scratch run_name: mnist32_small data: dataset: mnist image_size: 32 # resize MNIST 28 -> 32 (chia được cho UNet) channels: 1 batch_size: 128 num_workers: 4 opt: lr: 0.0002 betas: [0.9, 0.999] grad_clip: 1.0 diffusion: T: 400 # fewer steps for MNIST beta_schedule: cosine objective: pred_noise # start simple; later try pred_v sampling_steps: 400 # < T => DDIM fast sampling eta: 0.0 self_condition: false clamp_x0: true sample_every: 2000 sample_n: 64 learned_variance: false var_loss_weight: 0.0 min_snr_loss_weight: false model: dim: 32 # lightweight UNet dim_mults: [1, 2, 4] # shallow for MNIST channels: 1 attn_heads: 2 attn_dim_head: 16 dropout: 0.0 self_condition: false learned_variance: false outer_attn: false # turn off outer attention; keep only bottleneck attention train: max_steps: 30000 log_every: 200 ckpt_dir: ./checkpoints grad_accum: 1 ema: enabled: false decay: 0.995 update_every: 10 wandb: enabled: true mode: online api_key_env: b66dc9962d08bb26ff3fc4928703a13b30b2e9c9 tags: [mnist, small, bottleneck-attn] compute: enable_tf32: true metrics: # norms global_norm_every: 1000 # FID / IS (optional; need clean-fid and torch-fidelity installed) enable_fid: true enable_is: true fid_every: 4000 is_every: 4000 metric_num_gen: 5000 metric_batch_size: 32 diffusion: T: 400 beta_schedule: cosine objective: pred_noise sampling_steps: 400 # DDPM eta: 0.0 sample_every: 1000 sample_n: 64 viz: enable_reverse_traj: true reverse_every_steps: 4000 # log video thưa để nhẹ reverse_record_every: 5 # ↓ số này => ghi nhiều snapshot hơn (1 = mượt nhất) reverse_batch_n: 16 enable_forward_traj: true forward_every_steps: 4000 forward_t_values: [0, 20, 40, 60, 80, 120, 160, 240, 320, 399] # dày hơn chút forward_batch_n: 16 video_fps: 16 # tăng FPS (16–24) cho playback mượt hơn # fps cao hơn để mượt