mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
Merge branch 'main' into bugfix/convert-sdxl-models
This commit is contained in:
@ -13,8 +13,8 @@ import os
|
|||||||
import shutil
|
import shutil
|
||||||
import textwrap
|
import textwrap
|
||||||
import traceback
|
import traceback
|
||||||
import warnings
|
|
||||||
import yaml
|
import yaml
|
||||||
|
import warnings
|
||||||
from argparse import Namespace
|
from argparse import Namespace
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from shutil import get_terminal_size
|
from shutil import get_terminal_size
|
||||||
@ -45,6 +45,7 @@ from invokeai.app.services.config import (
|
|||||||
from invokeai.backend.util.logging import InvokeAILogger
|
from invokeai.backend.util.logging import InvokeAILogger
|
||||||
from invokeai.frontend.install.model_install import addModelsForm, process_and_execute
|
from invokeai.frontend.install.model_install import addModelsForm, process_and_execute
|
||||||
from invokeai.frontend.install.widgets import (
|
from invokeai.frontend.install.widgets import (
|
||||||
|
SingleSelectColumns,
|
||||||
CenteredButtonPress,
|
CenteredButtonPress,
|
||||||
FileBox,
|
FileBox,
|
||||||
IntTitleSlider,
|
IntTitleSlider,
|
||||||
@ -56,7 +57,6 @@ from invokeai.frontend.install.widgets import (
|
|||||||
from invokeai.backend.install.legacy_arg_parsing import legacy_parser
|
from invokeai.backend.install.legacy_arg_parsing import legacy_parser
|
||||||
from invokeai.backend.install.model_install_backend import (
|
from invokeai.backend.install.model_install_backend import (
|
||||||
hf_download_from_pretrained,
|
hf_download_from_pretrained,
|
||||||
hf_download_with_resume,
|
|
||||||
InstallSelections,
|
InstallSelections,
|
||||||
ModelInstall,
|
ModelInstall,
|
||||||
)
|
)
|
||||||
@ -330,34 +330,49 @@ Use cursor arrows to make a checkbox selection, and space to toggle.
|
|||||||
npyscreen.Checkbox,
|
npyscreen.Checkbox,
|
||||||
name="Free GPU memory after each generation",
|
name="Free GPU memory after each generation",
|
||||||
value=old_opts.free_gpu_mem,
|
value=old_opts.free_gpu_mem,
|
||||||
|
max_width=45,
|
||||||
relx=5,
|
relx=5,
|
||||||
scroll_exit=True,
|
scroll_exit=True,
|
||||||
)
|
)
|
||||||
|
self.nextrely -= 1
|
||||||
self.xformers_enabled = self.add_widget_intelligent(
|
self.xformers_enabled = self.add_widget_intelligent(
|
||||||
npyscreen.Checkbox,
|
npyscreen.Checkbox,
|
||||||
name="Enable xformers support if available",
|
name="Enable xformers support",
|
||||||
value=old_opts.xformers_enabled,
|
value=old_opts.xformers_enabled,
|
||||||
relx=5,
|
max_width=30,
|
||||||
|
relx=50,
|
||||||
scroll_exit=True,
|
scroll_exit=True,
|
||||||
)
|
)
|
||||||
|
self.nextrely -=1
|
||||||
self.always_use_cpu = self.add_widget_intelligent(
|
self.always_use_cpu = self.add_widget_intelligent(
|
||||||
npyscreen.Checkbox,
|
npyscreen.Checkbox,
|
||||||
name="Force CPU to be used on GPU systems",
|
name="Force CPU to be used on GPU systems",
|
||||||
value=old_opts.always_use_cpu,
|
value=old_opts.always_use_cpu,
|
||||||
relx=5,
|
relx=80,
|
||||||
scroll_exit=True,
|
scroll_exit=True,
|
||||||
)
|
)
|
||||||
precision = old_opts.precision or (
|
precision = old_opts.precision or (
|
||||||
"float32" if program_opts.full_precision else "auto"
|
"float32" if program_opts.full_precision else "auto"
|
||||||
)
|
)
|
||||||
|
self.nextrely +=1
|
||||||
|
self.add_widget_intelligent(
|
||||||
|
npyscreen.TitleFixedText,
|
||||||
|
name="Floating Point Precision",
|
||||||
|
begin_entry_at=0,
|
||||||
|
editable=False,
|
||||||
|
color="CONTROL",
|
||||||
|
scroll_exit=True,
|
||||||
|
)
|
||||||
|
self.nextrely -=1
|
||||||
self.precision = self.add_widget_intelligent(
|
self.precision = self.add_widget_intelligent(
|
||||||
npyscreen.TitleSelectOne,
|
SingleSelectColumns,
|
||||||
columns = 2,
|
columns = 3,
|
||||||
name="Precision",
|
name="Precision",
|
||||||
values=PRECISION_CHOICES,
|
values=PRECISION_CHOICES,
|
||||||
value=PRECISION_CHOICES.index(precision),
|
value=PRECISION_CHOICES.index(precision),
|
||||||
begin_entry_at=3,
|
begin_entry_at=3,
|
||||||
max_height=len(PRECISION_CHOICES) + 1,
|
max_height=2,
|
||||||
|
max_width=80,
|
||||||
scroll_exit=True,
|
scroll_exit=True,
|
||||||
)
|
)
|
||||||
self.max_cache_size = self.add_widget_intelligent(
|
self.max_cache_size = self.add_widget_intelligent(
|
||||||
@ -370,12 +385,6 @@ Use cursor arrows to make a checkbox selection, and space to toggle.
|
|||||||
scroll_exit=True,
|
scroll_exit=True,
|
||||||
)
|
)
|
||||||
self.nextrely += 1
|
self.nextrely += 1
|
||||||
self.add_widget_intelligent(
|
|
||||||
npyscreen.FixedText,
|
|
||||||
value="Folder to recursively scan for new checkpoints, ControlNets, LoRAs and TI models (<tab> autocompletes, ctrl-N advances):",
|
|
||||||
editable=False,
|
|
||||||
color="CONTROL",
|
|
||||||
)
|
|
||||||
self.outdir = self.add_widget_intelligent(
|
self.outdir = self.add_widget_intelligent(
|
||||||
FileBox,
|
FileBox,
|
||||||
name="Output directory for images (<tab> autocompletes, ctrl-N advances):",
|
name="Output directory for images (<tab> autocompletes, ctrl-N advances):",
|
||||||
@ -391,7 +400,7 @@ Use cursor arrows to make a checkbox selection, and space to toggle.
|
|||||||
self.autoimport_dirs = {}
|
self.autoimport_dirs = {}
|
||||||
self.autoimport_dirs['autoimport_dir'] = self.add_widget_intelligent(
|
self.autoimport_dirs['autoimport_dir'] = self.add_widget_intelligent(
|
||||||
FileBox,
|
FileBox,
|
||||||
name=f'Autoimport Folder',
|
name=f'Folder to recursively scan for new checkpoints, ControlNets, LoRAs and TI models',
|
||||||
value=str(config.root_path / config.autoimport_dir),
|
value=str(config.root_path / config.autoimport_dir),
|
||||||
select_dir=True,
|
select_dir=True,
|
||||||
must_exist=False,
|
must_exist=False,
|
||||||
@ -402,15 +411,6 @@ Use cursor arrows to make a checkbox selection, and space to toggle.
|
|||||||
scroll_exit=True
|
scroll_exit=True
|
||||||
)
|
)
|
||||||
self.nextrely += 1
|
self.nextrely += 1
|
||||||
self.add_widget_intelligent(
|
|
||||||
npyscreen.TitleFixedText,
|
|
||||||
name="== LICENSE ==",
|
|
||||||
begin_entry_at=0,
|
|
||||||
editable=False,
|
|
||||||
color="CONTROL",
|
|
||||||
scroll_exit=True,
|
|
||||||
)
|
|
||||||
self.nextrely -= 1
|
|
||||||
label = """BY DOWNLOADING THE STABLE DIFFUSION WEIGHT FILES, YOU AGREE TO HAVE READ
|
label = """BY DOWNLOADING THE STABLE DIFFUSION WEIGHT FILES, YOU AGREE TO HAVE READ
|
||||||
AND ACCEPTED THE CREATIVEML RESPONSIBLE AI LICENSES LOCATED AT
|
AND ACCEPTED THE CREATIVEML RESPONSIBLE AI LICENSES LOCATED AT
|
||||||
https://huggingface.co/spaces/CompVis/stable-diffusion-license and
|
https://huggingface.co/spaces/CompVis/stable-diffusion-license and
|
||||||
@ -440,7 +440,6 @@ https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/LICENS
|
|||||||
CenteredButtonPress,
|
CenteredButtonPress,
|
||||||
name=label,
|
name=label,
|
||||||
relx=(window_width - len(label)) // 2,
|
relx=(window_width - len(label)) // 2,
|
||||||
rely=-3,
|
|
||||||
when_pressed_function=self.on_ok,
|
when_pressed_function=self.on_ok,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -584,7 +583,18 @@ def initialize_rootdir(root: Path, yes_to_all: bool = False):
|
|||||||
path = dest / 'core'
|
path = dest / 'core'
|
||||||
path.mkdir(parents=True, exist_ok=True)
|
path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
with open(root / 'configs' / 'models.yaml','w') as yaml_file:
|
maybe_create_models_yaml(root)
|
||||||
|
|
||||||
|
def maybe_create_models_yaml(root: Path):
|
||||||
|
models_yaml = root / 'configs' / 'models.yaml'
|
||||||
|
if models_yaml.exists():
|
||||||
|
if OmegaConf.load(models_yaml).get('__metadata__'): # up to date
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
logger.info('Creating new models.yaml, original saved as models.yaml.orig')
|
||||||
|
models_yaml.rename(models_yaml.parent / 'models.yaml.orig')
|
||||||
|
|
||||||
|
with open(models_yaml,'w') as yaml_file:
|
||||||
yaml_file.write(yaml.dump({'__metadata__':
|
yaml_file.write(yaml.dump({'__metadata__':
|
||||||
{'version':'3.0.0'}
|
{'version':'3.0.0'}
|
||||||
}
|
}
|
||||||
|
@ -48,10 +48,6 @@ sd-1/main/openjourney:
|
|||||||
description: An SD 1.5 model fine tuned on Midjourney; prompt with "mdjrny-v4 style" (2.13 GB)
|
description: An SD 1.5 model fine tuned on Midjourney; prompt with "mdjrny-v4 style" (2.13 GB)
|
||||||
repo_id: prompthero/openjourney
|
repo_id: prompthero/openjourney
|
||||||
recommended: False
|
recommended: False
|
||||||
sd-1/main/portraitplus:
|
|
||||||
description: An SD-1.5 model trained on close range portraits of people; prompt with "portrait+" (2.13 GB)
|
|
||||||
repo_id: wavymulder/portraitplus
|
|
||||||
recommended: False
|
|
||||||
sd-1/main/seek.art_MEGA:
|
sd-1/main/seek.art_MEGA:
|
||||||
repo_id: coreco/seek.art_MEGA
|
repo_id: coreco/seek.art_MEGA
|
||||||
description: A general use SD-1.5 "anything" model that supports multiple styles (2.1 GB)
|
description: A general use SD-1.5 "anything" model that supports multiple styles (2.1 GB)
|
||||||
@ -60,10 +56,6 @@ sd-1/main/trinart_stable_diffusion_v2:
|
|||||||
description: An SD-1.5 model finetuned with ~40K assorted high resolution manga/anime-style images (2.13 GB)
|
description: An SD-1.5 model finetuned with ~40K assorted high resolution manga/anime-style images (2.13 GB)
|
||||||
repo_id: naclbit/trinart_stable_diffusion_v2
|
repo_id: naclbit/trinart_stable_diffusion_v2
|
||||||
recommended: False
|
recommended: False
|
||||||
sd-1/main/waifu-diffusion:
|
|
||||||
description: An SD-1.5 model trained on 680k anime/manga-style images (2.13 GB)
|
|
||||||
repo_id: hakurei/waifu-diffusion
|
|
||||||
recommended: False
|
|
||||||
sd-1/controlnet/canny:
|
sd-1/controlnet/canny:
|
||||||
repo_id: lllyasviel/control_v11p_sd15_canny
|
repo_id: lllyasviel/control_v11p_sd15_canny
|
||||||
recommended: True
|
recommended: True
|
||||||
|
@ -93,13 +93,7 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage):
|
|||||||
self.nextrely -= 1
|
self.nextrely -= 1
|
||||||
self.add_widget_intelligent(
|
self.add_widget_intelligent(
|
||||||
npyscreen.FixedText,
|
npyscreen.FixedText,
|
||||||
value="Use ctrl-N and ctrl-P to move to the <N>ext and <P>revious fields,",
|
value="Use ctrl-N and ctrl-P to move to the <N>ext and <P>revious fields. Cursor keys navigate, and <space> selects.",
|
||||||
editable=False,
|
|
||||||
color="CAUTION",
|
|
||||||
)
|
|
||||||
self.add_widget_intelligent(
|
|
||||||
npyscreen.FixedText,
|
|
||||||
value="Use cursor arrows to make a selection, and space to toggle checkboxes.",
|
|
||||||
editable=False,
|
editable=False,
|
||||||
color="CAUTION",
|
color="CAUTION",
|
||||||
)
|
)
|
||||||
@ -161,33 +155,40 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage):
|
|||||||
BufferBox,
|
BufferBox,
|
||||||
name='Log Messages',
|
name='Log Messages',
|
||||||
editable=False,
|
editable=False,
|
||||||
max_height = 10,
|
max_height = 8,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.nextrely += 1
|
self.nextrely += 1
|
||||||
done_label = "APPLY CHANGES"
|
done_label = "APPLY CHANGES"
|
||||||
back_label = "BACK"
|
back_label = "BACK"
|
||||||
|
cancel_label = "CANCEL"
|
||||||
|
current_position = self.nextrely
|
||||||
if self.multipage:
|
if self.multipage:
|
||||||
self.back_button = self.add_widget_intelligent(
|
self.back_button = self.add_widget_intelligent(
|
||||||
npyscreen.ButtonPress,
|
npyscreen.ButtonPress,
|
||||||
name=back_label,
|
name=back_label,
|
||||||
rely=-3,
|
|
||||||
when_pressed_function=self.on_back,
|
when_pressed_function=self.on_back,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
self.nextrely = current_position
|
||||||
|
self.cancel_button = self.add_widget_intelligent(
|
||||||
|
npyscreen.ButtonPress,
|
||||||
|
name=cancel_label,
|
||||||
|
when_pressed_function=self.on_cancel
|
||||||
|
)
|
||||||
|
self.nextrely = current_position
|
||||||
self.ok_button = self.add_widget_intelligent(
|
self.ok_button = self.add_widget_intelligent(
|
||||||
npyscreen.ButtonPress,
|
npyscreen.ButtonPress,
|
||||||
name=done_label,
|
name=done_label,
|
||||||
relx=(window_width - len(done_label)) // 2,
|
relx=(window_width - len(done_label)) // 2,
|
||||||
rely=-3,
|
|
||||||
when_pressed_function=self.on_execute
|
when_pressed_function=self.on_execute
|
||||||
)
|
)
|
||||||
|
|
||||||
label = "APPLY CHANGES & EXIT"
|
label = "APPLY CHANGES & EXIT"
|
||||||
|
self.nextrely = current_position
|
||||||
self.done = self.add_widget_intelligent(
|
self.done = self.add_widget_intelligent(
|
||||||
npyscreen.ButtonPress,
|
npyscreen.ButtonPress,
|
||||||
name=label,
|
name=label,
|
||||||
rely=-3,
|
|
||||||
relx=window_width-len(label)-15,
|
relx=window_width-len(label)-15,
|
||||||
when_pressed_function=self.on_done,
|
when_pressed_function=self.on_done,
|
||||||
)
|
)
|
||||||
|
@ -17,8 +17,8 @@ from shutil import get_terminal_size
|
|||||||
from curses import BUTTON2_CLICKED,BUTTON3_CLICKED
|
from curses import BUTTON2_CLICKED,BUTTON3_CLICKED
|
||||||
|
|
||||||
# minimum size for UIs
|
# minimum size for UIs
|
||||||
MIN_COLS = 136
|
MIN_COLS = 130
|
||||||
MIN_LINES = 45
|
MIN_LINES = 38
|
||||||
|
|
||||||
# -------------------------------------
|
# -------------------------------------
|
||||||
def set_terminal_size(columns: int, lines: int):
|
def set_terminal_size(columns: int, lines: int):
|
||||||
@ -38,13 +38,13 @@ def set_terminal_size(columns: int, lines: int):
|
|||||||
ts = get_terminal_size()
|
ts = get_terminal_size()
|
||||||
pause = False
|
pause = False
|
||||||
if ts.columns < columns:
|
if ts.columns < columns:
|
||||||
print('\033[1mThis window is too narrow for the user interface. Please make it wider.\033[0m')
|
print('\033[1mThis window is too narrow for the user interface.\033[0m')
|
||||||
pause = True
|
pause = True
|
||||||
if ts.lines < lines:
|
if ts.lines < lines:
|
||||||
print('\033[1mThis window is too short for the user interface. Please make it taller.\033[0m')
|
print('\033[1mThis window is too short for the user interface.\033[0m')
|
||||||
pause = True
|
pause = True
|
||||||
if pause:
|
if pause:
|
||||||
input('Press any key to continue..')
|
input('Maximize the window then press any key to continue..')
|
||||||
|
|
||||||
def _set_terminal_size_powershell(width: int, height: int):
|
def _set_terminal_size_powershell(width: int, height: int):
|
||||||
script=f'''
|
script=f'''
|
||||||
|
Reference in New Issue
Block a user