Text-to-Image
Diffusers
Safetensors
English
Krea2Pipeline
image-generation
krea2
orbitquant
w4a4
4-bit precision
quantized
8-bit precision
Instructions to use WaveCut/Krea-2-Turbo-OrbitQuant-W4A4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use WaveCut/Krea-2-Turbo-OrbitQuant-W4A4 with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("WaveCut/Krea-2-Turbo-OrbitQuant-W4A4", 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
| from __future__ import annotations | |
| import copy | |
| import math | |
| import statistics | |
| from pathlib import Path | |
| from typing import Any, Iterable | |
| from PIL import Image, ImageDraw, ImageFont | |
| PAIRING_FIELDS = ( | |
| "prompt_id", | |
| "prompt", | |
| "seed", | |
| "width", | |
| "height", | |
| "num_inference_steps", | |
| "guidance_scale", | |
| ) | |
| def json_safe_loading_info(loading_info: dict[str, Any]) -> dict[str, Any]: | |
| """Normalize Hugging Face loading diagnostics for stable JSON output.""" | |
| result: dict[str, Any] = {} | |
| for key, value in loading_info.items(): | |
| if isinstance(value, set): | |
| result[key] = sorted(value) | |
| elif isinstance(value, tuple): | |
| result[key] = list(value) | |
| else: | |
| result[key] = value | |
| return result | |
| def rewrite_modular_component_sources( | |
| model_index: dict[str, Any], source: str | |
| ) -> dict[str, Any]: | |
| """Point component specs in a modular model index at one release tree.""" | |
| rewritten = copy.deepcopy(model_index) | |
| for value in rewritten.values(): | |
| if ( | |
| isinstance(value, list) | |
| and len(value) >= 3 | |
| and isinstance(value[0], str) | |
| and value[0] in {"diffusers", "transformers"} | |
| and isinstance(value[2], dict) | |
| and "subfolder" in value[2] | |
| ): | |
| value[2]["pretrained_model_name_or_path"] = source | |
| value[2]["revision"] = None | |
| return rewritten | |
| def validate_paired_records( | |
| original: list[dict[str, Any]], orbitquant: list[dict[str, Any]] | |
| ) -> None: | |
| if len(original) != len(orbitquant): | |
| raise ValueError( | |
| f"paired record count differs: original={len(original)}, " | |
| f"orbitquant={len(orbitquant)}" | |
| ) | |
| for index, (original_row, quantized_row) in enumerate(zip(original, orbitquant)): | |
| for field in PAIRING_FIELDS: | |
| if original_row.get(field) != quantized_row.get(field): | |
| raise ValueError( | |
| f"paired record {index} differs in {field}: " | |
| f"{original_row.get(field)!r} != {quantized_row.get(field)!r}" | |
| ) | |
| def summarize_metrics(rows: list[dict[str, Any]]) -> dict[str, Any]: | |
| if not rows: | |
| raise ValueError("cannot summarize an empty metric set") | |
| seconds = [float(row["generation_seconds"]) for row in rows] | |
| hot = seconds[1:] or seconds | |
| result: dict[str, Any] = { | |
| "generated_samples": len(rows), | |
| "first_generation_seconds": seconds[0], | |
| "hot_generation_mean_seconds": statistics.fmean(hot), | |
| "hot_generation_median_seconds": statistics.median(hot), | |
| "generation_mean_seconds": statistics.fmean(seconds), | |
| "generation_median_seconds": statistics.median(seconds), | |
| } | |
| for field in ("gpu_peak_mb", "torch_peak_mb"): | |
| values = [row.get(field) for row in rows if row.get(field) is not None] | |
| result[field] = max(values) if values else None | |
| return result | |
| def _font(label_height: int) -> ImageFont.ImageFont | ImageFont.FreeTypeFont: | |
| size = max(10, label_height // 3) | |
| for name in ("DejaVuSans-Bold.ttf", "Arial Bold.ttf", "Arial.ttf"): | |
| try: | |
| return ImageFont.truetype(name, size=size) | |
| except OSError: | |
| continue | |
| return ImageFont.load_default() | |
| def _open_native_rgb(path: Path, tile_size: tuple[int, int]) -> Image.Image: | |
| with Image.open(path) as source: | |
| if source.size != tile_size: | |
| raise ValueError( | |
| f"{path} has size {source.size}; expected native tile size {tile_size}" | |
| ) | |
| return source.convert("RGB") | |
| def create_full_resolution_matrix( | |
| pairs: Iterable[dict[str, Any]], | |
| output_path: str | Path, | |
| *, | |
| tile_size: tuple[int, int] = (2048, 2048), | |
| prompt_pairs_per_row: int = 2, | |
| label_height: int = 96, | |
| ) -> dict[str, Any]: | |
| records = list(pairs) | |
| if not records: | |
| raise ValueError("at least one image pair is required") | |
| if prompt_pairs_per_row <= 0: | |
| raise ValueError("prompt_pairs_per_row must be positive") | |
| if label_height <= 0: | |
| raise ValueError("label_height must be positive") | |
| tile_width, tile_height = tile_size | |
| row_count = math.ceil(len(records) / prompt_pairs_per_row) | |
| matrix_width = prompt_pairs_per_row * 2 * tile_width | |
| row_height = label_height + tile_height | |
| matrix_height = row_count * row_height | |
| matrix = Image.new("RGB", (matrix_width, matrix_height), "#111111") | |
| draw = ImageDraw.Draw(matrix) | |
| font = _font(label_height) | |
| for index, record in enumerate(records): | |
| row = index // prompt_pairs_per_row | |
| group = index % prompt_pairs_per_row | |
| x = group * 2 * tile_width | |
| label_y = row * row_height | |
| image_y = label_y + label_height | |
| original = _open_native_rgb(Path(record["original"]), tile_size) | |
| quantized = _open_native_rgb(Path(record["orbitquant"]), tile_size) | |
| matrix.paste(original, (x, image_y)) | |
| matrix.paste(quantized, (x + tile_width, image_y)) | |
| seed = record.get("seed", "-") | |
| title = str(record.get("title", f"Prompt {index + 1}")) | |
| draw.text( | |
| (x + 12, label_y + 4), | |
| f"{index + 1:02d} {title} 路 BF16 路 seed {seed}", | |
| fill="white", | |
| font=font, | |
| ) | |
| draw.text( | |
| (x + tile_width + 12, label_y + 4), | |
| f"{index + 1:02d} {title} 路 OrbitQuant W4A4 路 seed {seed}", | |
| fill="white", | |
| font=font, | |
| ) | |
| destination = Path(output_path) | |
| destination.parent.mkdir(parents=True, exist_ok=True) | |
| if destination.suffix.lower() == ".webp": | |
| matrix.save(destination, format="WEBP", lossless=True, quality=100, method=6) | |
| else: | |
| matrix.save(destination) | |
| return { | |
| "matrix_path": str(destination), | |
| "matrix_size": [matrix_width, matrix_height], | |
| "tile_size": [tile_width, tile_height], | |
| "prompt_count": len(records), | |
| "prompt_pairs_per_row": prompt_pairs_per_row, | |
| "label_height": label_height, | |
| "resized": False, | |
| } | |