aka7774 commited on
Commit
530a0a9
1 Parent(s): b6edc99

Upload 6 files

Browse files
Files changed (6) hide show
  1. app.py +21 -0
  2. fn.py +81 -0
  3. install.bat +56 -0
  4. main.py +40 -0
  5. requirements.txt +9 -0
  6. venv.sh +7 -0
app.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import fn
2
+ import gradio as gr
3
+
4
+ with gr.Blocks() as demo:
5
+ prompt = gr.Textbox(label='prompt')
6
+ negative_prompt = gr.Textbox(label='negative_prompt')
7
+ model = gr.Textbox(label='model')
8
+ guidance_scale = gr.Textbox(value=5.0, label='guidance_scale')
9
+ steps = gr.Textbox(value=20, label='steps')
10
+ seed = gr.Textbox(value=-1, label='seed')
11
+ run = gr.Button()
12
+ dst_image = gr.Image(label="Result", interactive=False)
13
+
14
+ run.click(
15
+ fn=fn.run,
16
+ inputs=[prompt, negative_prompt, model, guidance_scale, steps, seed],
17
+ outputs=[dst_image],
18
+ )
19
+
20
+ if __name__ == '__main__':
21
+ demo.launch()
fn.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import io
3
+ import base64
4
+ import torch
5
+ from torch.cuda import amp
6
+ import numpy as np
7
+ from PIL import Image
8
+ from diffusers import AutoPipelineForText2Image, AutoencoderKL, DPMSolverMultistepScheduler
9
+
10
+ pipe = None
11
+
12
+ def load_model(_model = None, _vae = None, loras = []):
13
+ global pipe
14
+
15
+ _model = _model or 'cagliostrolab/animagine-xl-3.0'
16
+
17
+ if _vae:
18
+ # "stabilityai/sdxl-vae"
19
+ vae = AutoencoderKL.from_pretrained(_vae, torch_dtype=torch.float16)
20
+ pipe = AutoPipelineForText2Image.from_pretrained(
21
+ _model,
22
+ torch_dtype=torch.float16,
23
+ vae=vae,
24
+ )
25
+ else:
26
+ pipe = AutoPipelineForText2Image.from_pretrained(
27
+ _model,
28
+ torch_dtype=torch.float16,
29
+ )
30
+
31
+ # DPM++ 2M Karras
32
+ pipe.scheduler = DPMSolverMultistepScheduler.from_config(
33
+ pipe.scheduler.config,
34
+ algorithm_type="sde-dpmsolver++",
35
+ use_karras_sigmas=True
36
+ )
37
+
38
+ for lora in loras:
39
+ pipe.load_lora_weights(".", weight_name=lora + ".safetensors")
40
+
41
+ pipe.to("cuda")
42
+ pipe.enable_vae_slicing()
43
+
44
+ def pil_to_webp(img):
45
+ buffer = io.BytesIO()
46
+ img.save(buffer, 'webp')
47
+
48
+ return buffer.getvalue()
49
+
50
+ def bin_to_base64(bin):
51
+ return base64.b64encode(bin).decode('ascii')
52
+
53
+ def run(prompt = None, negative_prompt = None, model = None, guidance_scale = None, steps = None, seed = None):
54
+ global pipe
55
+
56
+ if not pipe:
57
+ load_model(model)
58
+
59
+ _prompt = "masterpiece, best quality, 1girl, portrait"
60
+ _negative_prompt = "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name"
61
+
62
+ prompt = prompt or _prompt
63
+ negative_prompt = negative_prompt or _negative_prompt
64
+ guidance_scale = float(guidance_scale) if guidance_scale else 5.0
65
+ steps = int(steps) if steps else 20
66
+ seed = int(seed) if seed else -1
67
+
68
+ generator = None
69
+ if seed != -1:
70
+ generator = torch.manual_seed(seed)
71
+
72
+ image = pipe(
73
+ prompt=prompt,
74
+ negative_prompt=negative_prompt,
75
+ guidance_scale=guidance_scale,
76
+ num_inference_steps=steps,
77
+ clip_skip=2,
78
+ generator=generator,
79
+ ).images[0]
80
+
81
+ return image
install.bat ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+
3
+ rem -------------------------------------------
4
+ rem NOT guaranteed to work on Windows
5
+
6
+ set REPOS=https://huggingface.co/spaces/aka7774/stablediffusion
7
+ set APPDIR=stablediffusion
8
+ set VENV=venv
9
+
10
+ rem -------------------------------------------
11
+
12
+ set INSTALL_DIR=%~dp0
13
+ cd /d %INSTALL_DIR%
14
+
15
+ :git_clone
16
+ set DL_URL=%REPOS%
17
+ set DL_DST=%APPDIR%
18
+ git clone %DL_URL% %APPDIR%
19
+ if exist %DL_DST% goto install_python
20
+
21
+ set DL_URL=https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.3/PortableGit-2.41.0.3-64-bit.7z.exe
22
+ set DL_DST=PortableGit-2.41.0.3-64-bit.7z.exe
23
+ curl -L -o %DL_DST% %DL_URL%
24
+ if not exist %DL_DST% bitsadmin /transfer dl %DL_URL% %DL_DST%
25
+ %DL_DST% -y
26
+ del %DL_DST%
27
+
28
+ set GIT=%INSTALL_DIR%PortableGit\bin\git
29
+ %GIT% clone %REPOS%
30
+
31
+ :install_python
32
+ set DL_URL=https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.10.13+20240107-i686-pc-windows-msvc-shared-install_only.tar.gz
33
+ set DL_DST="%INSTALL_DIR%python.tar.gz"
34
+ curl -L -o %DL_DST% %DL_URL%
35
+ if not exist %DL_DST% bitsadmin /transfer dl %DL_URL% %DL_DST%
36
+ tar -xzf %DL_DST%
37
+
38
+ set PYTHON=%INSTALL_DIR%python\python.exe
39
+ set PATH=%PATH%;%INSTALL_DIR%python310\Scripts
40
+
41
+ :install_venv
42
+ cd %APPDIR%
43
+ %PYTHON% -m venv %VENV%
44
+ set PYTHON=%VENV%\Scripts\python.exe
45
+
46
+ :install_pip
47
+ set DL_URL=https://bootstrap.pypa.io/get-pip.py
48
+ set DL_DST=%INSTALL_DIR%get-pip.py
49
+ curl -o %DL_DST% %DL_URL%
50
+ if not exist %DL_DST% bitsadmin /transfer dl %DL_URL% %DL_DST%
51
+ %PYTHON% %DL_DST%
52
+
53
+ %PYTHON% -m pip install gradio
54
+ %PYTHON% -m pip install -r requirements.txt
55
+
56
+ pause
main.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import time
4
+ import signal
5
+ import psutil
6
+ import io
7
+
8
+ from fastapi import FastAPI, Request, status, Form, UploadFile
9
+ from fastapi.staticfiles import StaticFiles
10
+ from fastapi.middleware.cors import CORSMiddleware
11
+ from pydantic import BaseModel, Field
12
+ from fastapi.exceptions import RequestValidationError
13
+ from fastapi.responses import Response
14
+
15
+ import fn
16
+ import gradio as gr
17
+ from app import demo
18
+
19
+ app = FastAPI()
20
+
21
+ app.add_middleware(
22
+ CORSMiddleware,
23
+ allow_origins=['*'],
24
+ allow_credentials=True,
25
+ allow_methods=["*"],
26
+ allow_headers=["*"],
27
+ )
28
+
29
+ gr.mount_gradio_app(app, demo, path="/gradio")
30
+
31
+ @app.post("/run")
32
+ async def api_run(prompt = None, negative_prompt = None, model = None, guidance_scale = None, steps = None, seed = None):
33
+ try:
34
+ dst_image = fn.run(prompt, negative_prompt, model, guidance_scale, steps, seed)
35
+ bin = fn.pil_to_webp(dst_image)
36
+
37
+ return Response(content=bin, media_type="image/webp")
38
+ except Exception as e:
39
+ return {"error": str(e)}
40
+
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ diffusers
4
+ torch
5
+ numpy
6
+ opencv-python
7
+ transformers
8
+ accelerate
9
+ python-multipart
venv.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/bash
2
+
3
+ python3 -m venv venv
4
+ curl -kL https://bootstrap.pypa.io/get-pip.py | venv/bin/python
5
+
6
+ venv/bin/python -m pip install gradio
7
+ venv/bin/python -m pip install -r requirements.txt