import random import gradio as gr import numpy as np import spaces import torch from diffusers import StableDiffusionXLPipeline, AutoencoderKL # , EulerDiscreteScheduler # 添加导入语句 from sd_embed.embedding_funcs import get_weighted_text_embeddings_sdxl if not torch.cuda.is_available(): DESCRIPTION += "\n
你现在运行在CPU上,但是该程序仅支持GPU。
" MAX_SEED = np.iinfo(np.int32).max MAX_IMAGE_SIZE = 4096 if torch.cuda.is_available(): vae = AutoencoderKL.from_pretrained( "madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16 ) pipe = StableDiffusionXLPipeline.from_pretrained( "John6666/noobai-xl-nai-xl-epsilonpred075version-sdxl", vae=vae, torch_dtype=torch.float16, use_safetensors=True, add_watermarker=False, ) # pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing") # pipe.tokenizer.model_max_length = 512 pipe.to("cuda") def randomize_seed_fn(seed: int, randomize_seed: bool) -> int: if randomize_seed: seed = random.randint(0, MAX_SEED) return seed @spaces.GPU def infer( prompt: str, negative_prompt: str = "", use_negative_prompt: bool = True, seed: int = 1, width: int = 512, height: int = 768, guidance_scale: float = 3, num_inference_steps: int = 30, randomize_seed: bool = False, use_resolution_binning: bool = True, progress=gr.Progress(track_tqdm=True), ): seed = int(randomize_seed_fn(seed, randomize_seed)) generator = torch.Generator("cuda").manual_seed(seed) # 使用 get_weighted_text_embeddings_sdxl 获取文本嵌入,不传递 device 参数 if use_negative_prompt and negative_prompt: ( prompt_embeds, prompt_neg_embeds, pooled_prompt_embeds, negative_pooled_prompt_embeds, ) = get_weighted_text_embeddings_sdxl( pipe, prompt=prompt, neg_prompt=negative_prompt, ) else: ( prompt_embeds, _, pooled_prompt_embeds, _, ) = get_weighted_text_embeddings_sdxl( pipe, prompt=prompt, ) prompt_neg_embeds = None negative_pooled_prompt_embeds = None image = pipe( prompt_embeds=prompt_embeds, negative_prompt_embeds=prompt_neg_embeds, pooled_prompt_embeds = pooled_prompt_embeds, negative_pooled_prompt_embeds = negative_pooled_prompt_embeds, width=width, height=height, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, generator=generator, use_resolution_binning=use_resolution_binning, ).images[0] return image, seed examples = [ "a cat eating a piece of cheese", "a ROBOT riding a BLUE horse on Mars, photorealistic, 4k", ] css = ''' .gradio-container{max-width: 560px !important} h1{text-align:center} footer { visibility: hidden } ''' with gr.Blocks(css=css) as demo: gr.Markdown("""# 梦羽的模型生成器 ### 快速生成NoobXL的模型图片.""") with gr.Group(): with gr.Row(): prompt = gr.Text( label="关键词", show_label=False, max_lines=1, placeholder="输入你要的图片关键词", container=False, ) run_button = gr.Button("生成", scale=0, variant="primary") result = gr.Image(label="Result", show_label=False) with gr.Accordion("高级选项", open=False): with gr.Row(): use_negative_prompt = gr.Checkbox(label="使用反向词条", value=True) negative_prompt = gr.Text( label="反向词条", max_lines=5, lines=4, placeholder="输入你要排除的图片关键词", value="lowres, {bad}, error, fewer, extra, missing, worst quality, jpeg artifacts, bad quality, watermark, unfinished, displeasing, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]", visible=True, ) seed = gr.Slider( label="种子", minimum=0, maximum=MAX_SEED, step=1, value=0, ) randomize_seed = gr.Checkbox(label="随机种子", value=True) with gr.Row(visible=True): width = gr.Slider( label="宽度", minimum=512, maximum=MAX_IMAGE_SIZE, step=64, value=1024, ) height = gr.Slider( label="高度", minimum=512, maximum=MAX_IMAGE_SIZE, step=64, value=1536, ) with gr.Row(): guidance_scale = gr.Slider( label="Guidance Scale", minimum=0.1, maximum=10, step=0.1, value=7.0, ) num_inference_steps = gr.Slider( label="生成步数", minimum=1, maximum=50, step=1, value=28, ) use_negative_prompt.change( fn=lambda x: gr.update(visible=x), inputs=use_negative_prompt, outputs=negative_prompt, ) gr.on( triggers=[prompt.submit, run_button.click], fn=infer, inputs=[ prompt, negative_prompt, use_negative_prompt, seed, width, height, guidance_scale, num_inference_steps, randomize_seed, ], outputs=[result, seed], ) if __name__ == "__main__": demo.launch()