mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
migration now integrated into invokeai-configure
This commit is contained in:
parent
33b04f6386
commit
d65c833b90
@ -57,12 +57,11 @@ 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,
|
||||||
)
|
)
|
||||||
from invokeai.backend.model_management.model_probe import (
|
from invokeai.backend.model_management.model_probe import (
|
||||||
ModelProbe, ModelType, BaseModelType, SchedulerPredictionType
|
ModelType, BaseModelType
|
||||||
)
|
)
|
||||||
|
|
||||||
warnings.filterwarnings("ignore")
|
warnings.filterwarnings("ignore")
|
||||||
@ -442,46 +441,6 @@ to allow InvokeAI to download restricted styles & subjects from the "Concept Lib
|
|||||||
begin_entry_at=4,
|
begin_entry_at=4,
|
||||||
scroll_exit=True,
|
scroll_exit=True,
|
||||||
)
|
)
|
||||||
# self.nextrely += 1
|
|
||||||
# self.add_widget_intelligent(
|
|
||||||
# npyscreen.FixedText,
|
|
||||||
# value="Directories containing textual inversion, controlnet and LoRA models (<tab> autocompletes, ctrl-N advances):",
|
|
||||||
# editable=False,
|
|
||||||
# color="CONTROL",
|
|
||||||
# )
|
|
||||||
# self.embedding_dir = self.add_widget_intelligent(
|
|
||||||
# npyscreen.TitleFilename,
|
|
||||||
# name=" Textual Inversion Embeddings:",
|
|
||||||
# value=str(default_embedding_dir()),
|
|
||||||
# select_dir=True,
|
|
||||||
# must_exist=False,
|
|
||||||
# use_two_lines=False,
|
|
||||||
# labelColor="GOOD",
|
|
||||||
# begin_entry_at=32,
|
|
||||||
# scroll_exit=True,
|
|
||||||
# )
|
|
||||||
# self.lora_dir = self.add_widget_intelligent(
|
|
||||||
# npyscreen.TitleFilename,
|
|
||||||
# name=" LoRA and LyCORIS:",
|
|
||||||
# value=str(default_lora_dir()),
|
|
||||||
# select_dir=True,
|
|
||||||
# must_exist=False,
|
|
||||||
# use_two_lines=False,
|
|
||||||
# labelColor="GOOD",
|
|
||||||
# begin_entry_at=32,
|
|
||||||
# scroll_exit=True,
|
|
||||||
# )
|
|
||||||
# self.controlnet_dir = self.add_widget_intelligent(
|
|
||||||
# npyscreen.TitleFilename,
|
|
||||||
# name=" ControlNets:",
|
|
||||||
# value=str(default_controlnet_dir()),
|
|
||||||
# select_dir=True,
|
|
||||||
# must_exist=False,
|
|
||||||
# use_two_lines=False,
|
|
||||||
# labelColor="GOOD",
|
|
||||||
# begin_entry_at=32,
|
|
||||||
# scroll_exit=True,
|
|
||||||
# )
|
|
||||||
self.nextrely += 1
|
self.nextrely += 1
|
||||||
self.add_widget_intelligent(
|
self.add_widget_intelligent(
|
||||||
npyscreen.TitleFixedText,
|
npyscreen.TitleFixedText,
|
||||||
@ -756,14 +715,42 @@ def migrate_init_file(legacy_format:Path):
|
|||||||
new.nsfw_checker = old.safety_checker
|
new.nsfw_checker = old.safety_checker
|
||||||
new.xformers_enabled = old.xformers
|
new.xformers_enabled = old.xformers
|
||||||
new.conf_path = old.conf
|
new.conf_path = old.conf
|
||||||
# new.embedding_dir = old.embedding_path
|
new.root = legacy_format.parent.resolve()
|
||||||
|
|
||||||
invokeai_yaml = legacy_format.parent / 'invokeai.yaml'
|
invokeai_yaml = legacy_format.parent / 'invokeai.yaml'
|
||||||
with open(invokeai_yaml,"w", encoding="utf-8") as outfile:
|
with open(invokeai_yaml,"w", encoding="utf-8") as outfile:
|
||||||
outfile.write(new.to_yaml())
|
outfile.write(new.to_yaml())
|
||||||
|
|
||||||
legacy_format.replace(legacy_format.parent / 'invokeai.init.old')
|
legacy_format.replace(legacy_format.parent / 'invokeai.init.orig')
|
||||||
|
|
||||||
|
# -------------------------------------
|
||||||
|
def migrate_models(root: Path):
|
||||||
|
from invokeai.backend.install.migrate_to_3 import do_migrate
|
||||||
|
do_migrate(root, root)
|
||||||
|
|
||||||
|
def migrate_if_needed(opt: Namespace, root: Path)->bool:
|
||||||
|
# We check for to see if the runtime directory is correctly initialized.
|
||||||
|
old_init_file = root / 'invokeai.init'
|
||||||
|
new_init_file = root / 'invokeai.yaml'
|
||||||
|
old_hub = root / 'models/hub'
|
||||||
|
migration_needed = old_init_file.exists() and not new_init_file.exists() or old_hub.exists()
|
||||||
|
|
||||||
|
if migration_needed:
|
||||||
|
if opt.yes_to_all or \
|
||||||
|
yes_or_no(f'{str(config.root_path)} appears to be a 2.3 format root directory. Convert to version 3.0?'):
|
||||||
|
|
||||||
|
logger.info('** Migrating invokeai.init to invokeai.yaml')
|
||||||
|
migrate_init_file(old_init_file)
|
||||||
|
config.parse_args(argv=[],conf=OmegaConf.load(new_init_file))
|
||||||
|
|
||||||
|
if old_hub.exists():
|
||||||
|
migrate_models(config.root_path)
|
||||||
|
else:
|
||||||
|
print('Cannot continue without conversion. Aborting.')
|
||||||
|
|
||||||
|
return migration_needed
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------
|
# -------------------------------------
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description="InvokeAI model downloader")
|
parser = argparse.ArgumentParser(description="InvokeAI model downloader")
|
||||||
@ -829,19 +816,16 @@ def main():
|
|||||||
errors = set()
|
errors = set()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# We check for to see if the runtime directory is correctly initialized.
|
# if we do a root migration/upgrade, then we are keeping previous
|
||||||
old_init_file = config.root_path / 'invokeai.init'
|
# configuration and we are done.
|
||||||
new_init_file = config.root_path / 'invokeai.yaml'
|
if migrate_if_needed(opt, config.root_path):
|
||||||
if old_init_file.exists() and not new_init_file.exists():
|
sys.exit(0)
|
||||||
logger.info('** Migrating invokeai.init to invokeai.yaml')
|
|
||||||
migrate_init_file(old_init_file)
|
|
||||||
# Load new init file into config
|
|
||||||
config.parse_args(argv=[],conf=OmegaConf.load(new_init_file))
|
|
||||||
|
|
||||||
if not config.model_conf_path.exists():
|
if not config.model_conf_path.exists():
|
||||||
initialize_rootdir(config.root_path, opt.yes_to_all)
|
initialize_rootdir(config.root_path, opt.yes_to_all)
|
||||||
|
|
||||||
models_to_download = default_user_selections(opt)
|
models_to_download = default_user_selections(opt)
|
||||||
|
new_init_file = config.root_path / 'invokeai.yaml'
|
||||||
if opt.yes_to_all:
|
if opt.yes_to_all:
|
||||||
write_default_options(opt, new_init_file)
|
write_default_options(opt, new_init_file)
|
||||||
init_options = Namespace(
|
init_options = Namespace(
|
||||||
|
@ -408,7 +408,32 @@ def get_legacy_embeddings(root: Path) -> ModelPaths:
|
|||||||
path = root / 'invokeai.yaml'
|
path = root / 'invokeai.yaml'
|
||||||
if path.exists():
|
if path.exists():
|
||||||
return _parse_legacy_yamlfile(root, path)
|
return _parse_legacy_yamlfile(root, path)
|
||||||
|
|
||||||
|
def do_migrate(src_directory: Path, dest_directory: Path):
|
||||||
|
|
||||||
|
dest_models = dest_directory / 'models-3.0'
|
||||||
|
dest_yaml = dest_directory / 'configs/models.yaml-3.0'
|
||||||
|
|
||||||
|
paths = get_legacy_embeddings(src_directory)
|
||||||
|
|
||||||
|
with open(dest_yaml,'w') as yaml_file:
|
||||||
|
migrator = MigrateTo3(src_directory,
|
||||||
|
dest_models,
|
||||||
|
yaml_file,
|
||||||
|
src_paths = paths,
|
||||||
|
)
|
||||||
|
migrator.migrate()
|
||||||
|
|
||||||
|
(dest_directory / 'models').replace(dest_directory / 'models.orig')
|
||||||
|
dest_models.replace(dest_directory / 'models')
|
||||||
|
|
||||||
|
(dest_directory /'configs/models.yaml').replace(dest_directory / 'configs/models.yaml.orig')
|
||||||
|
dest_yaml.replace(dest_directory / 'configs/models.yaml')
|
||||||
|
print(f"""Migration successful.
|
||||||
|
Original models directory moved to {dest_directory}/models.orig
|
||||||
|
Original models.yaml file moved to {dest_directory}/configs/models.yaml.orig
|
||||||
|
""")
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(prog="invokeai-migrate3",
|
parser = argparse.ArgumentParser(prog="invokeai-migrate3",
|
||||||
description="""
|
description="""
|
||||||
@ -446,28 +471,7 @@ script, which will perform a full upgrade in place."""
|
|||||||
assert (dest_directory / 'models').is_dir(), f"{dest_directory} does not contain a 'models' subdirectory"
|
assert (dest_directory / 'models').is_dir(), f"{dest_directory} does not contain a 'models' subdirectory"
|
||||||
assert (dest_directory / 'invokeai.yaml').exists(), f"{dest_directory} does not contain an InvokeAI init file."
|
assert (dest_directory / 'invokeai.yaml').exists(), f"{dest_directory} does not contain an InvokeAI init file."
|
||||||
|
|
||||||
dest_models = dest_directory / 'models-3.0'
|
do_migrate(root_directory,dest_directory)
|
||||||
dest_yaml = dest_directory / 'configs/models.yaml-3.0'
|
|
||||||
|
|
||||||
paths = get_legacy_embeddings(root_directory)
|
|
||||||
|
|
||||||
with open(dest_yaml,'w') as yaml_file:
|
|
||||||
migrator = MigrateTo3(root_directory,
|
|
||||||
dest_models,
|
|
||||||
yaml_file,
|
|
||||||
src_paths = paths,
|
|
||||||
)
|
|
||||||
migrator.migrate()
|
|
||||||
|
|
||||||
(dest_directory / 'models').replace(dest_directory / 'models.orig')
|
|
||||||
dest_models.replace(dest_directory / 'models')
|
|
||||||
|
|
||||||
(dest_directory /'configs/models.yaml').replace(dest_directory / 'configs/models.yaml.orig')
|
|
||||||
dest_yaml.replace(dest_directory / 'configs/models.yaml')
|
|
||||||
print(f"""Migration successful.
|
|
||||||
Original models directory moved to {dest_directory}/models.orig
|
|
||||||
Original models.yaml file moved to {dest_directory}/configs/models.yaml.orig
|
|
||||||
""")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user