Instructions to use ProCreations/Image-2.1-Calibrated-FP8 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use ProCreations/Image-2.1-Calibrated-FP8 with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("ProCreations/Image-2.1-Calibrated-FP8", dtype=torch.bfloat16, device_map="cuda") prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" image = pipe(prompt).images[0] - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- Draw Things
- DiffusionBee
Accelerate full 40-step FP8 generation with native precision, measured quality and real-time demo
1081be0 verified Download optimization/source/benchmark_final.py from ProCreations/Image-2.1-Calibrated-FP8: direct link, hf CLI and curl.
- Browser
- Download file 3.46 kB
-
https://huggingface.co/ProCreations/Image-2.1-Calibrated-FP8/resolve/main/optimization/source/benchmark_final.py
- Command line
-
hf download hf://ProCreations/Image-2.1-Calibrated-FP8/optimization/source/benchmark_final.py
-
curl -L -o benchmark_final.py https://huggingface.co/ProCreations/Image-2.1-Calibrated-FP8/resolve/main/optimization/source/benchmark_final.py
3.46 kB
| import sys,time,json,statistics,collections,argparse | |
| from pathlib import Path | |
| import torch | |
| ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT)) | |
| from fp8_runtime import load_pipeline,CalibratedFP8Linear | |
| from acceleration import accelerate_pipeline | |
| from prompts import EVALUATION | |
| ap=argparse.ArgumentParser();ap.add_argument('--baseline',action='store_true');a=ap.parse_args() | |
| out=Path(__file__).parent/('final-baseline' if a.baseline else 'final-optimized');out.mkdir(exist_ok=True) | |
| def main(): | |
| start=time.perf_counter();p=load_pipeline('/home/user/models/qwen-image-2.1-b3179ad',ROOT/'release/transformer');load_sec=time.perf_counter()-start | |
| if not a.baseline:accelerate_pipeline(p) | |
| fps=[m for m in p.transformer.modules() if isinstance(m,CalibratedFP8Linear)] | |
| assert len(fps)==224 and all(m.weight.dtype==torch.float8_e4m3fn and m.smooth.dtype==torch.float32 and m.weight_scale.dtype==torch.float32 for m in fps) | |
| result={'load_seconds':load_sec,'torch':torch.__version__,'gpu':torch.cuda.get_device_name(),'fp8_linears':len(fps),'steps':40,'cfg':1,'extra_quantization':False,'approximate_cache':False,'timing':{},'protocol':'CUDA synchronized; batch1; full40steps; includes encoder, denoising and VAE; excludes model load, resolution warmup and file writes. Weights and prefixKVcache unchanged. Compiled mode emulates intermediate precision casts.'} | |
| for size in [1024,2048]: | |
| vals=[];n=2 if a.baseline else (5 if size==1024 else 3) | |
| for j in range(n+1): | |
| torch.cuda.reset_peak_memory_stats();torch.cuda.synchronize();t=time.perf_counter() | |
| im=p(prompt=EVALUATION[15],width=size,height=size,num_inference_steps=40,generator=torch.Generator('cuda').manual_seed(30000+j)).images[0] | |
| torch.cuda.synchronize();sec=time.perf_counter()-t | |
| if j:vals.append(sec) | |
| else:warm=sec | |
| print(json.dumps({'size':size,'i':j,'seconds':sec,'baseline':a.baseline}),flush=True) | |
| result['timing'][str(size)]={'seconds':vals,'mean':statistics.mean(vals),'warmup_seconds':warm,'peak_gb':torch.cuda.max_memory_allocated()/1e9} | |
| im.save(out/f'{size}.png');(out/'benchmark.json').write_text(json.dumps(result,indent=2)) | |
| if not a.baseline: | |
| profiler=torch.profiler.profile(activities=[torch.profiler.ProfilerActivity.CPU,torch.profiler.ProfilerActivity.CUDA]) | |
| count={'n':0} | |
| def before(m,args,kw): | |
| if count['n']==10:profiler.start() | |
| def after(m,args,kw,r): | |
| if count['n']==10:torch.cuda.synchronize();profiler.stop() | |
| count['n']+=1 | |
| h=p.transformer.register_forward_pre_hook(before,with_kwargs=True);g=p.transformer.register_forward_hook(after,with_kwargs=True) | |
| p(prompt=EVALUATION[15],width=1024,height=1024,num_inference_steps=40,generator=torch.Generator('cuda').manual_seed(40000));h.remove();g.remove() | |
| profiler.export_chrome_trace(str(out/'denoising-trace.json')) | |
| kernels=collections.Counter(e.name for e in profiler.events() if e.device_type==torch.autograd.DeviceType.CUDA) | |
| proof={'fp8_sm120_launches':sum(v for k,v in kernels.items() if 'Sm120' in k and 'float_e4m3' in k),'native_bf16_flash_attention':sum(v for k,v in kernels.items() if 'flash_fwd_kernel' in k and 'bfloat16' in k),'all_kernels':dict(kernels),'transformer_calls':count['n'],'full_denoising_steps':40} | |
| (out/'kernel_evidence.json').write_text(json.dumps(proof,indent=2));assert proof['fp8_sm120_launches']==224 and proof['native_bf16_flash_attention']==32 and count['n']==40,proof | |
| print('BENCHMARK_COMPLETE',flush=True) | |
| main() | |