Zhenglin Wan
Stage DiffusionART multi-reward step300 adapter
76d175c verified
Raw History Blame Contribute Delete
2.66 kB
"""Generate an image with the DiffusionART SD3.5-M multi-reward PEFT adapter."""
import argparse
from pathlib import Path
BASE_MODEL = "stabilityai/stable-diffusion-3.5-medium"
BASE_REVISION = "b940f670f0eda2d07fbb75229e779da1ad11eb80"
def load_pipeline(adapter, *, base_revision=BASE_REVISION, device="cuda", offload=False):
import torch
from diffusers import StableDiffusion3Pipeline
from peft import PeftModel
if not device.startswith("cuda") or not torch.cuda.is_available():
raise RuntimeError("This inference example requires an available CUDA GPU")
pipe = StableDiffusion3Pipeline.from_pretrained(
BASE_MODEL, revision=base_revision, torch_dtype=torch.float16,
)
pipe.transformer = PeftModel.from_pretrained(
pipe.transformer.float(), adapter, is_trainable=False,
adapter_name="diffusionart",
)
pipe.transformer.eval()
pipe.vae.to(dtype=torch.float32)
if offload:
pipe.enable_model_cpu_offload(device=device)
else:
pipe.to(device)
return pipe
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--adapter", default=str(Path(__file__).resolve().parent))
parser.add_argument("--prompt", required=True)
parser.add_argument("--output", default="image.png")
parser.add_argument("--seed", type=int, default=42)
parser.add_argument("--steps", type=int, default=40)
parser.add_argument("--height", type=int, default=512)
parser.add_argument("--width", type=int, default=512)
parser.add_argument("--guidance-scale", type=float, default=1.0)
parser.add_argument("--device", default="cuda")
parser.add_argument("--cpu-offload", action="store_true")
args = parser.parse_args()
if args.steps <= 0 or any(n <= 0 or n % 16 for n in (args.height, args.width)):
parser.error("steps must be positive; dimensions must be positive multiples of 16")
output = Path(args.output)
if output.exists():
parser.error("output already exists; choose another path")
import torch
pipe = load_pipeline(args.adapter, device=args.device, offload=args.cpu_offload)
generator = torch.Generator(device="cpu").manual_seed(args.seed)
with torch.inference_mode(), torch.autocast("cuda", dtype=torch.float16):
image = pipe(
args.prompt, num_inference_steps=args.steps, guidance_scale=args.guidance_scale,
height=args.height, width=args.width, generator=generator,
).images[0]
output.parent.mkdir(parents=True, exist_ok=True)
image.save(output)
print(output.resolve())
if __name__ == "__main__":
main()