mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
partial port of invokeai-configure
This commit is contained in:
parent
7ef0d2aa35
commit
8d75e50435
2
.gitignore
vendored
2
.gitignore
vendored
@ -201,6 +201,8 @@ checkpoints
|
|||||||
# If it's a Mac
|
# If it's a Mac
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
invokeai/frontend/web/dist/*
|
||||||
|
|
||||||
# Let the frontend manage its own gitignore
|
# Let the frontend manage its own gitignore
|
||||||
!invokeai/frontend/web/*
|
!invokeai/frontend/web/*
|
||||||
|
|
||||||
|
@ -390,6 +390,11 @@ class InvokeAIAppConfig(InvokeAISettings):
|
|||||||
"""Return true if xformers_enabled is false"""
|
"""Return true if xformers_enabled is false"""
|
||||||
return not self.xformers_enabled
|
return not self.xformers_enabled
|
||||||
|
|
||||||
|
@property
|
||||||
|
def try_patchmatch(self)->bool:
|
||||||
|
"""Return true if patchmatch true"""
|
||||||
|
return self.patchmatch
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def find_root()->Path:
|
def find_root()->Path:
|
||||||
'''
|
'''
|
||||||
|
@ -19,10 +19,10 @@ 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
|
||||||
|
from typing import get_type_hints
|
||||||
from urllib import request
|
from urllib import request
|
||||||
|
|
||||||
import npyscreen
|
import npyscreen
|
||||||
import torch
|
|
||||||
import transformers
|
import transformers
|
||||||
from diffusers import AutoencoderKL
|
from diffusers import AutoencoderKL
|
||||||
from huggingface_hub import HfFolder
|
from huggingface_hub import HfFolder
|
||||||
@ -36,21 +36,27 @@ from transformers import (
|
|||||||
CLIPTokenizer,
|
CLIPTokenizer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
import invokeai.configs as configs
|
import invokeai.configs as configs
|
||||||
|
|
||||||
from ...frontend.install.model_install import addModelsForm, process_and_execute
|
from invokeai.frontend.install.model_install import addModelsForm, process_and_execute
|
||||||
from ...frontend.install.widgets import (
|
from invokeai.frontend.install.widgets import (
|
||||||
CenteredButtonPress,
|
CenteredButtonPress,
|
||||||
IntTitleSlider,
|
IntTitleSlider,
|
||||||
set_min_terminal_size,
|
set_min_terminal_size,
|
||||||
)
|
)
|
||||||
from .model_install_backend import (
|
from invokeai.backend.config.legacy_arg_parsing import legacy_parser
|
||||||
|
from invokeai.backend.config.model_install_backend import (
|
||||||
default_dataset,
|
default_dataset,
|
||||||
download_from_hf,
|
download_from_hf,
|
||||||
hf_download_with_resume,
|
hf_download_with_resume,
|
||||||
recommended_datasets,
|
recommended_datasets,
|
||||||
)
|
)
|
||||||
from invokeai.app.services.config import get_invokeai_config()
|
from invokeai.app.services.config import (
|
||||||
|
get_invokeai_config,
|
||||||
|
InvokeAIWebConfig,
|
||||||
|
InvokeAIAppConfig,
|
||||||
|
)
|
||||||
|
|
||||||
warnings.filterwarnings("ignore")
|
warnings.filterwarnings("ignore")
|
||||||
|
|
||||||
@ -298,7 +304,7 @@ def download_vaes():
|
|||||||
# first the diffusers version
|
# first the diffusers version
|
||||||
repo_id = "stabilityai/sd-vae-ft-mse"
|
repo_id = "stabilityai/sd-vae-ft-mse"
|
||||||
args = dict(
|
args = dict(
|
||||||
cache_dir=global_cache_dir("hub"),
|
cache_dir=config.cache_dir,
|
||||||
)
|
)
|
||||||
if not AutoencoderKL.from_pretrained(repo_id, **args):
|
if not AutoencoderKL.from_pretrained(repo_id, **args):
|
||||||
raise Exception(f"download of {repo_id} failed")
|
raise Exception(f"download of {repo_id} failed")
|
||||||
@ -622,7 +628,7 @@ def edit_opts(program_opts: Namespace, invokeai_opts: Namespace) -> argparse.Nam
|
|||||||
|
|
||||||
|
|
||||||
def default_startup_options(init_file: Path) -> Namespace:
|
def default_startup_options(init_file: Path) -> Namespace:
|
||||||
opts = InvokeAIAppConfig(argv=[])
|
opts = InvokeAIWebConfig(argv=[])
|
||||||
outdir = Path(opts.outdir)
|
outdir = Path(opts.outdir)
|
||||||
if not outdir.is_absolute():
|
if not outdir.is_absolute():
|
||||||
opts.outdir = str(config.root / opts.outdir)
|
opts.outdir = str(config.root / opts.outdir)
|
||||||
@ -744,7 +750,42 @@ def write_default_options(program_opts: Namespace, initfile: Path):
|
|||||||
opt.hf_token = HfFolder.get_token()
|
opt.hf_token = HfFolder.get_token()
|
||||||
write_opts(opt, initfile)
|
write_opts(opt, initfile)
|
||||||
|
|
||||||
|
# -------------------------------------
|
||||||
|
# This is ugly. We're going to bring in
|
||||||
|
# the legacy Args object in order to parse
|
||||||
|
# the old init file and write out the new
|
||||||
|
# yaml format.
|
||||||
|
def migrate_init_file(legacy_format:Path):
|
||||||
|
|
||||||
|
old = legacy_parser.parse_args([f'@{str(legacy_format)}'])
|
||||||
|
new = OmegaConf.create()
|
||||||
|
|
||||||
|
new.web = dict()
|
||||||
|
for attr in ['host','port']:
|
||||||
|
if hasattr(old,attr):
|
||||||
|
setattr(new.web,attr,getattr(old,attr))
|
||||||
|
# change of name
|
||||||
|
new.web.allow_origins = old.cors or []
|
||||||
|
|
||||||
|
new.globals = dict()
|
||||||
|
globals = new.globals
|
||||||
|
fields = list(get_type_hints(InvokeAIAppConfig).keys())
|
||||||
|
for attr in fields:
|
||||||
|
if hasattr(old,attr):
|
||||||
|
setattr(globals,attr,getattr(old,attr))
|
||||||
|
|
||||||
|
# a few places where the names have changed
|
||||||
|
globals.nsfw_checker = old.safety_checker
|
||||||
|
globals.xformers_enabled = old.xformers
|
||||||
|
globals.conf_path = old.conf
|
||||||
|
globals.embedding_dir = old.embedding_path
|
||||||
|
|
||||||
|
new.globals = {key: globals[key] for key in sorted(globals)}
|
||||||
|
|
||||||
|
invokeai_yaml = legacy_format.parent / 'invokeai.yaml'
|
||||||
|
with open(invokeai_yaml,"w", encoding="utf-8") as outfile:
|
||||||
|
outfile.write(OmegaConf.to_yaml(new))
|
||||||
|
|
||||||
# -------------------------------------
|
# -------------------------------------
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description="InvokeAI model downloader")
|
parser = argparse.ArgumentParser(description="InvokeAI model downloader")
|
||||||
@ -800,6 +841,7 @@ def main():
|
|||||||
opt = parser.parse_args()
|
opt = parser.parse_args()
|
||||||
|
|
||||||
# setting a global here
|
# setting a global here
|
||||||
|
global config
|
||||||
config.root = Path(os.path.expanduser(get_root(opt.root) or ""))
|
config.root = Path(os.path.expanduser(get_root(opt.root) or ""))
|
||||||
|
|
||||||
errors = set()
|
errors = set()
|
||||||
@ -808,9 +850,15 @@ def main():
|
|||||||
models_to_download = default_user_selections(opt)
|
models_to_download = default_user_selections(opt)
|
||||||
|
|
||||||
# We check for to see if the runtime directory is correctly initialized.
|
# We check for to see if the runtime directory is correctly initialized.
|
||||||
print('** invokeai.init init file is no longer supported. Migrate this code to invokeai.yaml **')
|
old_init_file = Path(config.root, 'invokeai.init')
|
||||||
init_file = Path(config.root, 'invokeai.init')
|
new_init_file = Path(config.root, 'invokeai.yaml')
|
||||||
if not init_file.exists() or not config.model_conf_path.exists():
|
if old_init_file.exists() and not new_init_file.exists():
|
||||||
|
print('** MIGRATING OLD invokeai.init FILE TO NEW invokeai.yaml FORMAT')
|
||||||
|
migrate_init_file(old_init_file)
|
||||||
|
# is it a good idea to re-read invokeai.yaml?
|
||||||
|
config = get_invokeai_config()
|
||||||
|
|
||||||
|
if not config.model_conf_path.exists():
|
||||||
initialize_rootdir(config.root, opt.yes_to_all)
|
initialize_rootdir(config.root, opt.yes_to_all)
|
||||||
|
|
||||||
if opt.yes_to_all:
|
if opt.yes_to_all:
|
||||||
@ -819,7 +867,7 @@ def main():
|
|||||||
precision="float32" if opt.full_precision else "float16"
|
precision="float32" if opt.full_precision else "float16"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
init_options, models_to_download = run_console_ui(opt, init_file)
|
init_options, models_to_download = run_console_ui(opt, new_init_file)
|
||||||
if init_options:
|
if init_options:
|
||||||
write_opts(init_options, init_file)
|
write_opts(init_options, init_file)
|
||||||
else:
|
else:
|
||||||
|
390
invokeai/backend/config/legacy_arg_parsing.py
Normal file
390
invokeai/backend/config/legacy_arg_parsing.py
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
# Copyright 2023 Lincoln D. Stein and the InvokeAI Team
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import shlex
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
SAMPLER_CHOICES = [
|
||||||
|
"ddim",
|
||||||
|
"ddpm",
|
||||||
|
"deis",
|
||||||
|
"lms",
|
||||||
|
"pndm",
|
||||||
|
"heun",
|
||||||
|
"heun_k",
|
||||||
|
"euler",
|
||||||
|
"euler_k",
|
||||||
|
"euler_a",
|
||||||
|
"kdpm_2",
|
||||||
|
"kdpm_2_a",
|
||||||
|
"dpmpp_2s",
|
||||||
|
"dpmpp_2m",
|
||||||
|
"dpmpp_2m_k",
|
||||||
|
"unipc",
|
||||||
|
]
|
||||||
|
|
||||||
|
PRECISION_CHOICES = [
|
||||||
|
"auto",
|
||||||
|
"float32",
|
||||||
|
"autocast",
|
||||||
|
"float16",
|
||||||
|
]
|
||||||
|
|
||||||
|
class FileArgumentParser(ArgumentParser):
|
||||||
|
"""
|
||||||
|
Supports reading defaults from an init file.
|
||||||
|
"""
|
||||||
|
def convert_arg_line_to_args(self, arg_line):
|
||||||
|
return shlex.split(arg_line, comments=True)
|
||||||
|
|
||||||
|
|
||||||
|
legacy_parser = FileArgumentParser(
|
||||||
|
description=
|
||||||
|
"""
|
||||||
|
Generate images using Stable Diffusion.
|
||||||
|
Use --web to launch the web interface.
|
||||||
|
Use --from_file to load prompts from a file path or standard input ("-").
|
||||||
|
Otherwise you will be dropped into an interactive command prompt (type -h for help.)
|
||||||
|
Other command-line arguments are defaults that can usually be overridden
|
||||||
|
prompt the command prompt.
|
||||||
|
""",
|
||||||
|
fromfile_prefix_chars='@',
|
||||||
|
)
|
||||||
|
general_group = legacy_parser.add_argument_group('General')
|
||||||
|
model_group = legacy_parser.add_argument_group('Model selection')
|
||||||
|
file_group = legacy_parser.add_argument_group('Input/output')
|
||||||
|
web_server_group = legacy_parser.add_argument_group('Web server')
|
||||||
|
render_group = legacy_parser.add_argument_group('Rendering')
|
||||||
|
postprocessing_group = legacy_parser.add_argument_group('Postprocessing')
|
||||||
|
deprecated_group = legacy_parser.add_argument_group('Deprecated options')
|
||||||
|
|
||||||
|
deprecated_group.add_argument('--laion400m')
|
||||||
|
deprecated_group.add_argument('--weights') # deprecated
|
||||||
|
general_group.add_argument(
|
||||||
|
'--version','-V',
|
||||||
|
action='store_true',
|
||||||
|
help='Print InvokeAI version number'
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--root_dir',
|
||||||
|
default=None,
|
||||||
|
help='Path to directory containing "models", "outputs" and "configs". If not present will read from environment variable INVOKEAI_ROOT. Defaults to ~/invokeai.',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--config',
|
||||||
|
'-c',
|
||||||
|
'-config',
|
||||||
|
dest='conf',
|
||||||
|
default='./configs/models.yaml',
|
||||||
|
help='Path to configuration file for alternate models.',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--model',
|
||||||
|
help='Indicates which diffusion model to load (defaults to "default" stanza in configs/models.yaml)',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--weight_dirs',
|
||||||
|
nargs='+',
|
||||||
|
type=str,
|
||||||
|
help='List of one or more directories that will be auto-scanned for new model weights to import',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--png_compression','-z',
|
||||||
|
type=int,
|
||||||
|
default=6,
|
||||||
|
choices=range(0,9),
|
||||||
|
dest='png_compression',
|
||||||
|
help='level of PNG compression, from 0 (none) to 9 (maximum). Default is 6.'
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'-F',
|
||||||
|
'--full_precision',
|
||||||
|
dest='full_precision',
|
||||||
|
action='store_true',
|
||||||
|
help='Deprecated way to set --precision=float32',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--max_loaded_models',
|
||||||
|
dest='max_loaded_models',
|
||||||
|
type=int,
|
||||||
|
default=2,
|
||||||
|
help='Maximum number of models to keep in memory for fast switching, including the one in GPU',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--free_gpu_mem',
|
||||||
|
dest='free_gpu_mem',
|
||||||
|
action='store_true',
|
||||||
|
help='Force free gpu memory before final decoding',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--sequential_guidance',
|
||||||
|
dest='sequential_guidance',
|
||||||
|
action='store_true',
|
||||||
|
help="Calculate guidance in serial instead of in parallel, lowering memory requirement "
|
||||||
|
"at the expense of speed",
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--xformers',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
default=True,
|
||||||
|
help='Enable/disable xformers support (default enabled if installed)',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
"--always_use_cpu",
|
||||||
|
dest="always_use_cpu",
|
||||||
|
action="store_true",
|
||||||
|
help="Force use of CPU even if GPU is available"
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--precision',
|
||||||
|
dest='precision',
|
||||||
|
type=str,
|
||||||
|
choices=PRECISION_CHOICES,
|
||||||
|
metavar='PRECISION',
|
||||||
|
help=f'Set model precision. Defaults to auto selected based on device. Options: {", ".join(PRECISION_CHOICES)}',
|
||||||
|
default='auto',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--ckpt_convert',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
dest='ckpt_convert',
|
||||||
|
default=True,
|
||||||
|
help='Deprecated option. Legacy ckpt files are now always converted to diffusers when loaded.'
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--internet',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
dest='internet_available',
|
||||||
|
default=True,
|
||||||
|
help='Indicate whether internet is available for just-in-time model downloading (default: probe automatically).',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--nsfw_checker',
|
||||||
|
'--safety_checker',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
dest='safety_checker',
|
||||||
|
default=False,
|
||||||
|
help='Check for and blur potentially NSFW images. Use --no-nsfw_checker to disable.',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--autoimport',
|
||||||
|
default=None,
|
||||||
|
type=str,
|
||||||
|
help='Check the indicated directory for .ckpt/.safetensors weights files at startup and import directly',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--autoconvert',
|
||||||
|
default=None,
|
||||||
|
type=str,
|
||||||
|
help='Check the indicated directory for .ckpt/.safetensors weights files at startup and import as optimized diffuser models',
|
||||||
|
)
|
||||||
|
model_group.add_argument(
|
||||||
|
'--patchmatch',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
default=True,
|
||||||
|
help='Load the patchmatch extension for outpainting. Use --no-patchmatch to disable.',
|
||||||
|
)
|
||||||
|
file_group.add_argument(
|
||||||
|
'--from_file',
|
||||||
|
dest='infile',
|
||||||
|
type=str,
|
||||||
|
help='If specified, load prompts from this file',
|
||||||
|
)
|
||||||
|
file_group.add_argument(
|
||||||
|
'--outdir',
|
||||||
|
'-o',
|
||||||
|
type=str,
|
||||||
|
help='Directory to save generated images and a log of prompts and seeds. Default: ROOTDIR/outputs',
|
||||||
|
default='outputs',
|
||||||
|
)
|
||||||
|
file_group.add_argument(
|
||||||
|
'--prompt_as_dir',
|
||||||
|
'-p',
|
||||||
|
action='store_true',
|
||||||
|
help='Place images in subdirectories named after the prompt.',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--fnformat',
|
||||||
|
default='{prefix}.{seed}.png',
|
||||||
|
type=str,
|
||||||
|
help='Overwrite the filename format. You can use any argument as wildcard enclosed in curly braces. Default is {prefix}.{seed}.png',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'-s',
|
||||||
|
'--steps',
|
||||||
|
type=int,
|
||||||
|
default=50,
|
||||||
|
help='Number of steps'
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'-W',
|
||||||
|
'--width',
|
||||||
|
type=int,
|
||||||
|
help='Image width, multiple of 64',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'-H',
|
||||||
|
'--height',
|
||||||
|
type=int,
|
||||||
|
help='Image height, multiple of 64',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'-C',
|
||||||
|
'--cfg_scale',
|
||||||
|
default=7.5,
|
||||||
|
type=float,
|
||||||
|
help='Classifier free guidance (CFG) scale - higher numbers cause generator to "try" harder.',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--sampler',
|
||||||
|
'-A',
|
||||||
|
'-m',
|
||||||
|
dest='sampler_name',
|
||||||
|
type=str,
|
||||||
|
choices=SAMPLER_CHOICES,
|
||||||
|
metavar='SAMPLER_NAME',
|
||||||
|
help=f'Set the default sampler. Supported samplers: {", ".join(SAMPLER_CHOICES)}',
|
||||||
|
default='k_lms',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--log_tokenization',
|
||||||
|
'-t',
|
||||||
|
action='store_true',
|
||||||
|
help='shows how the prompt is split into tokens'
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'-f',
|
||||||
|
'--strength',
|
||||||
|
type=float,
|
||||||
|
help='img2img strength for noising/unnoising. 0.0 preserves image exactly, 1.0 replaces it completely',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'-T',
|
||||||
|
'-fit',
|
||||||
|
'--fit',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
help='If specified, will resize the input image to fit within the dimensions of width x height (512x512 default)',
|
||||||
|
)
|
||||||
|
|
||||||
|
render_group.add_argument(
|
||||||
|
'--grid',
|
||||||
|
'-g',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
help='generate a grid'
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--embedding_directory',
|
||||||
|
'--embedding_path',
|
||||||
|
dest='embedding_path',
|
||||||
|
default='embeddings',
|
||||||
|
type=str,
|
||||||
|
help='Path to a directory containing .bin and/or .pt files, or a single .bin/.pt file. You may use subdirectories. (default is ROOTDIR/embeddings)'
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--lora_directory',
|
||||||
|
dest='lora_path',
|
||||||
|
default='loras',
|
||||||
|
type=str,
|
||||||
|
help='Path to a directory containing LoRA files; subdirectories are not supported. (default is ROOTDIR/loras)'
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--embeddings',
|
||||||
|
action=argparse.BooleanOptionalAction,
|
||||||
|
default=True,
|
||||||
|
help='Enable embedding directory (default). Use --no-embeddings to disable.',
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--enable_image_debugging',
|
||||||
|
action='store_true',
|
||||||
|
help='Generates debugging image to display'
|
||||||
|
)
|
||||||
|
render_group.add_argument(
|
||||||
|
'--karras_max',
|
||||||
|
type=int,
|
||||||
|
default=None,
|
||||||
|
help="control the point at which the K* samplers will shift from using the Karras noise schedule (good for low step counts) to the LatentDiffusion noise schedule (good for high step counts). Set to 0 to use LatentDiffusion for all step values, and to a high value (e.g. 1000) to use Karras for all step values. [29]."
|
||||||
|
)
|
||||||
|
# Restoration related args
|
||||||
|
postprocessing_group.add_argument(
|
||||||
|
'--no_restore',
|
||||||
|
dest='restore',
|
||||||
|
action='store_false',
|
||||||
|
help='Disable face restoration with GFPGAN or codeformer',
|
||||||
|
)
|
||||||
|
postprocessing_group.add_argument(
|
||||||
|
'--no_upscale',
|
||||||
|
dest='esrgan',
|
||||||
|
action='store_false',
|
||||||
|
help='Disable upscaling with ESRGAN',
|
||||||
|
)
|
||||||
|
postprocessing_group.add_argument(
|
||||||
|
'--esrgan_bg_tile',
|
||||||
|
type=int,
|
||||||
|
default=400,
|
||||||
|
help='Tile size for background sampler, 0 for no tile during testing. Default: 400.',
|
||||||
|
)
|
||||||
|
postprocessing_group.add_argument(
|
||||||
|
'--esrgan_denoise_str',
|
||||||
|
type=float,
|
||||||
|
default=0.75,
|
||||||
|
help='esrgan denoise str. 0 is no denoise, 1 is max denoise. Default: 0.75',
|
||||||
|
)
|
||||||
|
postprocessing_group.add_argument(
|
||||||
|
'--gfpgan_model_path',
|
||||||
|
type=str,
|
||||||
|
default='./models/gfpgan/GFPGANv1.4.pth',
|
||||||
|
help='Indicates the path to the GFPGAN model',
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--web',
|
||||||
|
dest='web',
|
||||||
|
action='store_true',
|
||||||
|
help='Start in web server mode.',
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--web_develop',
|
||||||
|
dest='web_develop',
|
||||||
|
action='store_true',
|
||||||
|
help='Start in web server development mode.',
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
"--web_verbose",
|
||||||
|
action="store_true",
|
||||||
|
help="Enables verbose logging",
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
"--cors",
|
||||||
|
nargs="*",
|
||||||
|
type=str,
|
||||||
|
help="Additional allowed origins, comma-separated",
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--host',
|
||||||
|
type=str,
|
||||||
|
default='127.0.0.1',
|
||||||
|
help='Web server: Host or IP to listen on. Set to 0.0.0.0 to accept traffic from other devices on your network.'
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--port',
|
||||||
|
type=int,
|
||||||
|
default='9090',
|
||||||
|
help='Web server: Port to listen on'
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--certfile',
|
||||||
|
type=str,
|
||||||
|
default=None,
|
||||||
|
help='Web server: Path to certificate file to use for SSL. Use together with --keyfile'
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--keyfile',
|
||||||
|
type=str,
|
||||||
|
default=None,
|
||||||
|
help='Web server: Path to private key file to use for SSL. Use together with --certfile'
|
||||||
|
)
|
||||||
|
web_server_group.add_argument(
|
||||||
|
'--gui',
|
||||||
|
dest='gui',
|
||||||
|
action='store_true',
|
||||||
|
help='Start InvokeAI GUI',
|
||||||
|
)
|
@ -19,7 +19,7 @@ from tqdm import tqdm
|
|||||||
|
|
||||||
import invokeai.configs as configs
|
import invokeai.configs as configs
|
||||||
|
|
||||||
from invokeai.app.services.config import get_invokeai_config()
|
from invokeai.app.services.config import get_invokeai_config
|
||||||
from ..model_management import ModelManager
|
from ..model_management import ModelManager
|
||||||
from ..stable_diffusion import StableDiffusionGeneratorPipeline
|
from ..stable_diffusion import StableDiffusionGeneratorPipeline
|
||||||
|
|
||||||
|
@ -99,11 +99,14 @@ dependencies = [
|
|||||||
[project.scripts]
|
[project.scripts]
|
||||||
|
|
||||||
# legacy entrypoints; provided for backwards compatibility
|
# legacy entrypoints; provided for backwards compatibility
|
||||||
"invoke.py" = "invokeai.frontend.CLI:invokeai_command_line_interface"
|
|
||||||
"configure_invokeai.py" = "invokeai.frontend.install:invokeai_configure"
|
"configure_invokeai.py" = "invokeai.frontend.install:invokeai_configure"
|
||||||
"textual_inversion.py" = "invokeai.frontend.training:invokeai_textual_inversion"
|
"textual_inversion.py" = "invokeai.frontend.training:invokeai_textual_inversion"
|
||||||
|
|
||||||
# modern entrypoints
|
# shortcut commands to start cli and web
|
||||||
|
"invokeai" = "invokeai.app.cli_app:invoke_cli"
|
||||||
|
"invokeai-web" = "invokeai.app.api_app:invoke_api"
|
||||||
|
|
||||||
|
# full commands
|
||||||
"invokeai-configure" = "invokeai.frontend.install:invokeai_configure"
|
"invokeai-configure" = "invokeai.frontend.install:invokeai_configure"
|
||||||
"invokeai-merge" = "invokeai.frontend.merge:invokeai_merge_diffusers"
|
"invokeai-merge" = "invokeai.frontend.merge:invokeai_merge_diffusers"
|
||||||
"invokeai-ti" = "invokeai.frontend.training:invokeai_textual_inversion"
|
"invokeai-ti" = "invokeai.frontend.training:invokeai_textual_inversion"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user