mirror of
https://github.com/ParisNeo/lollms.git
synced 2024-12-19 04:37:54 +00:00
added diffusers_client
This commit is contained in:
parent
9d19668e9a
commit
d2b4036e57
@ -1,5 +1,5 @@
|
|||||||
# =================== Lord Of Large Language Multimodal Systems Configuration file ===========================
|
# =================== Lord Of Large Language Multimodal Systems Configuration file ===========================
|
||||||
version: 134
|
version: 135
|
||||||
binding_name: null
|
binding_name: null
|
||||||
model_name: null
|
model_name: null
|
||||||
model_variant: null
|
model_variant: null
|
||||||
@ -102,7 +102,7 @@ copy_to_clipboard_add_all_details: false
|
|||||||
# -------------------- Services global configurations --------------------------
|
# -------------------- Services global configurations --------------------------
|
||||||
# Select the active test to speach, text to image and speach to text services
|
# Select the active test to speach, text to image and speach to text services
|
||||||
active_tts_service: "None" # xtts (offline), openai_tts (API key required), elevenlabs_tts (API key required)
|
active_tts_service: "None" # xtts (offline), openai_tts (API key required), elevenlabs_tts (API key required)
|
||||||
active_tti_service: "None" # autosd (offline), dall-e (online)
|
active_tti_service: "None" # autosd (offline), diffusers (offline), diffusers_client (online), dall-e (online), midjourney (online)
|
||||||
active_stt_service: "None" # whisper (offline), asr (offline or online), openai_whiosper (API key required)
|
active_stt_service: "None" # whisper (offline), asr (offline or online), openai_whiosper (API key required)
|
||||||
active_ttm_service: "None" # musicgen (offline)
|
active_ttm_service: "None" # musicgen (offline)
|
||||||
active_ttv_service: "None" # cog_video_x (offline)
|
active_ttv_service: "None" # cog_video_x (offline)
|
||||||
@ -183,9 +183,13 @@ sd_base_url: http://localhost:7860
|
|||||||
enable_fooocus_service: false
|
enable_fooocus_service: false
|
||||||
fooocus_base_url: http://localhost:7860
|
fooocus_base_url: http://localhost:7860
|
||||||
|
|
||||||
# diffuser
|
# diffusers
|
||||||
diffusers_offloading_mode: sequential_cpu_offload # sequential_cpu_offload
|
diffusers_offloading_mode: sequential_cpu_offload # sequential_cpu_offload
|
||||||
diffusers_model: PixArt-alpha/PixArt-Sigma-XL-2-1024-MS
|
diffusers_model: v2ray/stable-diffusion-3-medium-diffusers
|
||||||
|
|
||||||
|
# diffusers client
|
||||||
|
diffusers_client_base_url: http://localhost:8593
|
||||||
|
|
||||||
|
|
||||||
# Dall e service key
|
# Dall e service key
|
||||||
dall_e_key: ""
|
dall_e_key: ""
|
||||||
|
@ -424,6 +424,9 @@ class LollmsApplication(LoLLMsCom):
|
|||||||
if self.config.active_tti_service == "diffusers":
|
if self.config.active_tti_service == "diffusers":
|
||||||
from lollms.services.tti.diffusers.lollms_diffusers import LollmsDiffusers
|
from lollms.services.tti.diffusers.lollms_diffusers import LollmsDiffusers
|
||||||
self.tti = LollmsDiffusers(self)
|
self.tti = LollmsDiffusers(self)
|
||||||
|
elif self.config.active_tti_service == "diffusers_client":
|
||||||
|
from lollms.services.tti.diffusers_client.lollms_diffusers_client import LollmsDiffusersClient
|
||||||
|
self.tti = LollmsDiffusersClient(self)
|
||||||
elif self.config.active_tti_service == "autosd":
|
elif self.config.active_tti_service == "autosd":
|
||||||
if self.sd:
|
if self.sd:
|
||||||
self.tti = self.sd
|
self.tti = self.sd
|
||||||
@ -526,6 +529,9 @@ class LollmsApplication(LoLLMsCom):
|
|||||||
if self.config.active_tti_service == "diffusers" and (self.tti is None or self.tti.name!="diffusers"):
|
if self.config.active_tti_service == "diffusers" and (self.tti is None or self.tti.name!="diffusers"):
|
||||||
from lollms.services.tti.diffusers.lollms_diffusers import LollmsDiffusers
|
from lollms.services.tti.diffusers.lollms_diffusers import LollmsDiffusers
|
||||||
self.tti = LollmsDiffusers(self)
|
self.tti = LollmsDiffusers(self)
|
||||||
|
elif self.config.active_tti_service == "diffusers_client" and (self.tti is None or self.tti.name!="diffusers_client"):
|
||||||
|
from lollms.services.tti.diffusers_client.lollms_diffusers_client import LollmsDiffusersClient
|
||||||
|
self.tti = LollmsDiffusersClient(self)
|
||||||
elif self.config.active_tti_service == "autosd" and (self.tti is None or self.tti.name!="stable_diffusion"):
|
elif self.config.active_tti_service == "autosd" and (self.tti is None or self.tti.name!="stable_diffusion"):
|
||||||
if self.sd:
|
if self.sd:
|
||||||
self.tti = self.sd
|
self.tti = self.sd
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# =================== Lord Of Large Language Multimodal Systems Configuration file ===========================
|
# =================== Lord Of Large Language Multimodal Systems Configuration file ===========================
|
||||||
version: 134
|
version: 135
|
||||||
binding_name: null
|
binding_name: null
|
||||||
model_name: null
|
model_name: null
|
||||||
model_variant: null
|
model_variant: null
|
||||||
@ -102,7 +102,7 @@ copy_to_clipboard_add_all_details: false
|
|||||||
# -------------------- Services global configurations --------------------------
|
# -------------------- Services global configurations --------------------------
|
||||||
# Select the active test to speach, text to image and speach to text services
|
# Select the active test to speach, text to image and speach to text services
|
||||||
active_tts_service: "None" # xtts (offline), openai_tts (API key required), elevenlabs_tts (API key required)
|
active_tts_service: "None" # xtts (offline), openai_tts (API key required), elevenlabs_tts (API key required)
|
||||||
active_tti_service: "None" # autosd (offline), dall-e (online)
|
active_tti_service: "None" # autosd (offline), diffusers (offline), diffusers_client (online), dall-e (online), midjourney (online)
|
||||||
active_stt_service: "None" # whisper (offline), asr (offline or online), openai_whiosper (API key required)
|
active_stt_service: "None" # whisper (offline), asr (offline or online), openai_whiosper (API key required)
|
||||||
active_ttm_service: "None" # musicgen (offline)
|
active_ttm_service: "None" # musicgen (offline)
|
||||||
active_ttv_service: "None" # cog_video_x (offline)
|
active_ttv_service: "None" # cog_video_x (offline)
|
||||||
@ -183,9 +183,13 @@ sd_base_url: http://localhost:7860
|
|||||||
enable_fooocus_service: false
|
enable_fooocus_service: false
|
||||||
fooocus_base_url: http://localhost:7860
|
fooocus_base_url: http://localhost:7860
|
||||||
|
|
||||||
# diffuser
|
# diffusers
|
||||||
diffusers_offloading_mode: sequential_cpu_offload # sequential_cpu_offload
|
diffusers_offloading_mode: sequential_cpu_offload # sequential_cpu_offload
|
||||||
diffusers_model: PixArt-alpha/PixArt-Sigma-XL-2-1024-MS
|
diffusers_model: v2ray/stable-diffusion-3-medium-diffusers
|
||||||
|
|
||||||
|
# diffusers client
|
||||||
|
diffusers_client_base_url: http://localhost:8593
|
||||||
|
|
||||||
|
|
||||||
# Dall e service key
|
# Dall e service key
|
||||||
dall_e_key: ""
|
dall_e_key: ""
|
||||||
|
216
lollms/services/tti/diffusers_client/lollms_diffusers_client.py
Normal file
216
lollms/services/tti/diffusers_client/lollms_diffusers_client.py
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
# Title LollmsDiffusers
|
||||||
|
# Licence: MIT
|
||||||
|
# Author : Paris Neo
|
||||||
|
# All rights are reserved
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
from lollms.app import LollmsApplication
|
||||||
|
from lollms.utilities import PackageManager, check_and_install_torch, find_next_available_filename, install_cuda, check_torch_version
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import requests
|
||||||
|
from typing import List, Dict, Any
|
||||||
|
|
||||||
|
from ascii_colors import ASCIIColors, trace_exception
|
||||||
|
from lollms.paths import LollmsPaths
|
||||||
|
from lollms.tti import LollmsTTI
|
||||||
|
from lollms.utilities import git_pull
|
||||||
|
from tqdm import tqdm
|
||||||
|
from PIL import Image
|
||||||
|
import threading
|
||||||
|
import base64
|
||||||
|
from PIL import Image
|
||||||
|
import io
|
||||||
|
import pipmaster as pm
|
||||||
|
|
||||||
|
|
||||||
|
def adjust_dimensions(value: int) -> int:
|
||||||
|
"""Adjusts the given value to be divisible by 8."""
|
||||||
|
return (value // 8) * 8
|
||||||
|
|
||||||
|
def download_file(url, folder_path, local_filename):
|
||||||
|
# Make sure 'folder_path' exists
|
||||||
|
folder_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
with requests.get(url, stream=True) as r:
|
||||||
|
r.raise_for_status()
|
||||||
|
total_size = int(r.headers.get('content-length', 0))
|
||||||
|
progress_bar = tqdm(total=total_size, unit='B', unit_scale=True)
|
||||||
|
with open(folder_path / local_filename, 'wb') as f:
|
||||||
|
for chunk in r.iter_content(chunk_size=8192):
|
||||||
|
f.write(chunk)
|
||||||
|
progress_bar.update(len(chunk))
|
||||||
|
progress_bar.close()
|
||||||
|
|
||||||
|
return local_filename
|
||||||
|
|
||||||
|
|
||||||
|
def install_diffusers(lollms_app:LollmsApplication):
|
||||||
|
root_dir = lollms_app.lollms_paths.personal_path
|
||||||
|
shared_folder = root_dir/"shared"
|
||||||
|
diffusers_folder = shared_folder / "diffusers"
|
||||||
|
diffusers_folder.mkdir(exist_ok=True, parents=True)
|
||||||
|
models_dir = diffusers_folder / "models"
|
||||||
|
models_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
PackageManager.reinstall("diffusers")
|
||||||
|
PackageManager.reinstall("xformers")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade_diffusers(lollms_app:LollmsApplication):
|
||||||
|
PackageManager.install_or_update("diffusers")
|
||||||
|
PackageManager.install_or_update("xformers")
|
||||||
|
|
||||||
|
|
||||||
|
class LollmsDiffusersClient(LollmsTTI):
|
||||||
|
has_controlnet = False
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
app:LollmsApplication,
|
||||||
|
wm = "Artbot",
|
||||||
|
base_url:str="http://localhost:8593"
|
||||||
|
):
|
||||||
|
super().__init__("diffusers_client",app)
|
||||||
|
self.ready = False
|
||||||
|
# Get the current directory
|
||||||
|
lollms_paths = app.lollms_paths
|
||||||
|
root_dir = lollms_paths.personal_path
|
||||||
|
|
||||||
|
self.base_url = base_url
|
||||||
|
|
||||||
|
self.wm = wm
|
||||||
|
|
||||||
|
shared_folder = root_dir/"shared"
|
||||||
|
self.diffusers_folder = shared_folder / "diffusers"
|
||||||
|
self.output_dir = root_dir / "outputs/diffusers"
|
||||||
|
self.models_dir = self.diffusers_folder / "models"
|
||||||
|
self.output_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
self.models_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
ASCIIColors.green(" _ _ _ _ _ __ __ ")
|
||||||
|
ASCIIColors.green(" | | | | | | (_)/ _|/ _| ")
|
||||||
|
ASCIIColors.green(" | | ___ | | |_ __ ___ ___ __| |_| |_| |_ _ _ ___ ___ _ __ ___ ")
|
||||||
|
ASCIIColors.green(" | | / _ \| | | '_ ` _ \/ __| / _` | | _| _| | | / __|/ _ \ '__/ __| ")
|
||||||
|
ASCIIColors.green(" | |___| (_) | | | | | | | \__ \| (_| | | | | | | |_| \__ \ __/ | \__ \ ")
|
||||||
|
ASCIIColors.green(" |______\___/|_|_|_| |_| |_|___/ \__,_|_|_| |_| \__,_|___/\___|_| |___/ ")
|
||||||
|
ASCIIColors.green(" ______ ")
|
||||||
|
ASCIIColors.green(" |______| ")
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def verify(app:LollmsApplication):
|
||||||
|
# Clone repository
|
||||||
|
root_dir = app.lollms_paths.personal_path
|
||||||
|
shared_folder = root_dir/"shared"
|
||||||
|
diffusers_folder = shared_folder / "diffusers"
|
||||||
|
return diffusers_folder.exists()
|
||||||
|
|
||||||
|
def get(app:LollmsApplication):
|
||||||
|
root_dir = app.lollms_paths.personal_path
|
||||||
|
shared_folder = root_dir/"shared"
|
||||||
|
diffusers_folder = shared_folder / "diffusers"
|
||||||
|
diffusers_script_path = diffusers_folder / "lollms_diffusers.py"
|
||||||
|
git_pull(diffusers_folder)
|
||||||
|
|
||||||
|
if diffusers_script_path.exists():
|
||||||
|
ASCIIColors.success("lollms_diffusers found.")
|
||||||
|
ASCIIColors.success("Loading source file...",end="")
|
||||||
|
# use importlib to load the module from the file path
|
||||||
|
from lollms.services.tti.diffusers.lollms_diffusers import LollmsDiffusers
|
||||||
|
ASCIIColors.success("ok")
|
||||||
|
return LollmsDiffusers
|
||||||
|
def paint(
|
||||||
|
self,
|
||||||
|
positive_prompt,
|
||||||
|
negative_prompt="",
|
||||||
|
sampler_name="",
|
||||||
|
seed=-1,
|
||||||
|
scale=7.5,
|
||||||
|
steps=20,
|
||||||
|
img2img_denoising_strength=0.9,
|
||||||
|
width=512,
|
||||||
|
height=512,
|
||||||
|
restore_faces=True,
|
||||||
|
output_path=None
|
||||||
|
):
|
||||||
|
url = f"{self.base_url}/generate-image"
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"positive_prompt": positive_prompt,
|
||||||
|
"negative_prompt": negative_prompt,
|
||||||
|
"sampler_name": sampler_name,
|
||||||
|
"seed": seed,
|
||||||
|
"scale": scale,
|
||||||
|
"steps": steps,
|
||||||
|
"width": width,
|
||||||
|
"height": height,
|
||||||
|
"restore_faces": restore_faces
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(url, json=payload)
|
||||||
|
response.raise_for_status()
|
||||||
|
result = response.json()
|
||||||
|
|
||||||
|
# Assuming the server returns the image path
|
||||||
|
server_image_path = result['image_path']
|
||||||
|
|
||||||
|
# If output_path is not provided, use the server's image path
|
||||||
|
if output_path is None:
|
||||||
|
output_path = server_image_path
|
||||||
|
else:
|
||||||
|
# Copy the image from server path to output_path
|
||||||
|
# This part needs to be implemented based on how you want to handle file transfer
|
||||||
|
pass
|
||||||
|
|
||||||
|
return {
|
||||||
|
"image_path": output_path,
|
||||||
|
"prompt": result['prompt'],
|
||||||
|
"negative_prompt": result['negative_prompt']
|
||||||
|
}
|
||||||
|
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"An error occurred: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def save_image(self, image_data, output_path):
|
||||||
|
image = Image.open(io.BytesIO(base64.b64decode(image_data)))
|
||||||
|
image.save(output_path)
|
||||||
|
print(f"Image saved to {output_path}")
|
||||||
|
|
||||||
|
def paint_from_images(self, positive_prompt: str,
|
||||||
|
images: List[str],
|
||||||
|
negative_prompt: str = "",
|
||||||
|
sampler_name="",
|
||||||
|
seed=-1,
|
||||||
|
scale=7.5,
|
||||||
|
steps=20,
|
||||||
|
img2img_denoising_strength=0.9,
|
||||||
|
width=512,
|
||||||
|
height=512,
|
||||||
|
restore_faces=True,
|
||||||
|
output_path=None
|
||||||
|
) -> List[Dict[str, str]]:
|
||||||
|
import torch
|
||||||
|
if sampler_name!="":
|
||||||
|
sc = self.get_scheduler_by_name(sampler_name)
|
||||||
|
if sc:
|
||||||
|
self.model.scheduler = sc
|
||||||
|
|
||||||
|
if output_path is None:
|
||||||
|
output_path = self.output_dir
|
||||||
|
if seed!=-1:
|
||||||
|
generator = torch.Generator("cuda").manual_seed(seed)
|
||||||
|
image = self.model(positive_prompt, negative_prompt=negative_prompt, height=height, width=width, guidance_scale=scale, num_inference_steps=steps, generator=generator).images[0]
|
||||||
|
else:
|
||||||
|
image = self.model(positive_prompt, negative_prompt=negative_prompt, height=height, width=width, guidance_scale=scale, num_inference_steps=steps).images[0]
|
||||||
|
output_path = Path(output_path)
|
||||||
|
fn = find_next_available_filename(output_path,"diff_img_")
|
||||||
|
# Save the image
|
||||||
|
image.save(fn)
|
||||||
|
return fn, {"prompt":positive_prompt, "negative_prompt":negative_prompt}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user