Overview
These scripts compare:- Sampling speed: Time taken for different step counts
- Quality: Visual comparison of generated samples
- Speedup: Performance gains from fewer diffusion steps
- Step requirements: Minimum viable steps for quality output
MNIST comparison
Compares DDPM (1000 steps) vs DDIM with various step counts (10, 20, 50, 100, 250, 500, 1000) on MNIST dataset.Usage
Prerequisites
- Trained MNIST model at
best_model.ptin project root - Run
python train_diffusion.pyto train the model first
Configuration
The script uses these default settings fromddim_comparison_mnist.py:21-34:
DDIM step configurations
Tested configurations fromddim_comparison_mnist.py:47:
Expected outputs
All outputs are saved toddim_comparison_mnist/:
- quality_comparison.png: 2x4 grid showing DDPM and DDIM samples at different step counts
- timing_analysis.png: Two charts comparing sampling time and speedup vs steps
- analysis_report.txt: Detailed analysis of speed-quality tradeoffs
- ddpm_samples.png: DDPM generated samples (1000 steps)
- ddim_X_samples.png: DDIM samples for each step configuration (10, 20, 50, etc.)
Sample output
The script produces detailed progress output:Key findings
From the analysis report (seeddim_comparison_mnist.py:196-222):
- DDIM-10: Fastest (20x+) but may show artifacts
- DDIM-50: Good balance of speed (10-15x) and quality
- DDIM-100: High quality with 8-10x speedup
- DDIM-250+: Approaching DDPM quality with 3-5x speedup
- Optimal tradeoff: 50-100 steps for production MNIST
CIFAR-10 comparison
Compares DDPM vs DDIM on CIFAR-10, a more complex natural image dataset requiring more steps for quality.Usage
Prerequisites
- Trained CIFAR-10 EMA model at
best_model_cifar.ptin project root - Run
python diffusion_cifar.pyto train the model first
Configuration
The script uses these settings fromddim_comparison_cifar.py:20-37:
Expected outputs
All outputs are saved toddim_comparison_cifar/:
- quality_comparison.png: Side-by-side DDPM and DDIM RGB samples
- timing_analysis.png: Timing and speedup charts for CIFAR-10
- analysis_report.txt: Dataset-specific analysis
- ddpm_samples.png: DDPM baseline samples
- ddim_X_samples.png: DDIM samples for each configuration
CIFAR-10 specific findings
Fromddim_comparison_cifar.py:206-226:
- More complex dataset requires more steps than MNIST
- Minimum viable: 50-100 steps for recognizable images
- Recommended: 100-250 steps for production quality
- Optimal tradeoff: DDIM-100 to DDIM-250
- Still achieves 4-10x speedup over DDPM
Batch runner
Run both MNIST and CIFAR-10 comparisons sequentially.Usage
Behavior
Fromrun_ddim_comparison.py:9-34, the script:
- Checks for trained model files before running
- Skips comparisons if models are not found
- Reports success/failure for each dataset
- Provides summary of all generated outputs
Example output
Parameters
Common parameters
All comparison scripts share these parameters:| Parameter | Description | Default |
|---|---|---|
device | Compute device (cuda/cpu) | Auto-detected |
num_samples | Number of images to generate | 16 |
ddim_step_configs | List of DDIM step counts to test | [10, 20, 50, 100, 250, 500, 1000] |
eta | DDIM stochasticity parameter | 0.0 (deterministic) |
MNIST specific
| Parameter | Value |
|---|---|
image_size | 28 |
channels | 1 (grayscale) |
hidden_dims | [128, 256, 512] |
model_path | best_model.pt |
CIFAR-10 specific
| Parameter | Value |
|---|---|
image_size | 32 |
channels | 3 (RGB) |
dropout_p | 0.1 |
model_path | best_model_cifar.pt |
Implementation details
Sampling comparison
Both scripts follow this workflow fromddim_comparison_mnist.py:59-86:
- DDPM baseline: Sample with full 1000 steps, measure time
- DDIM variants: For each step configuration:
- Clear GPU cache if available
- Sample with
diffusion.sample_ddim(num_samples, ddim_steps, eta=0.0) - Measure time and calculate speedup
- Store samples for visualization
Visualization generation
Three types of visualizations are created:- Quality comparison (
ddim_comparison_mnist.py:94-127): 2x4 matplotlib grid showing samples from each configuration - Timing analysis (
ddim_comparison_mnist.py:130-163): Bar chart of sampling times + line plot of speedup vs steps - Individual grids (
ddim_comparison_mnist.py:166-178): Separate PNG files for each configuration
Analysis report
The report (ddim_comparison_mnist.py:185-222) includes:
- Sampling speed breakdown for all configurations
- Quality vs speed tradeoff recommendations
- Key findings specific to the dataset
- Step requirements and minimum viable configurations
- Detailed analysis of results
Performance expectations
MNIST typical results
- DDPM (1000 steps): ~10-15s on GPU, ~0.010s per sample
- DDIM (50 steps): ~1-2s on GPU, ~0.001s per sample (~10-15x speedup)
- DDIM (100 steps): ~2-3s on GPU, ~0.002s per sample (~5-7x speedup)
CIFAR-10 typical results
- DDPM (1000 steps): ~30-45s on GPU, ~0.030s per sample
- DDIM (100 steps): ~5-8s on GPU, ~0.005s per sample (~6-8x speedup)
- DDIM (250 steps): ~12-18s on GPU, ~0.012s per sample (~3-4x speedup)
Related functions
DiffusionProcess.sample_ddim(): DDIM sampling implementationDiffusionProcess.sample(): Standard DDPM sampling- See Diffusion process for core sampling methods