mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team
|
|
|
|
"""
|
|
convert_models_config_to_3.2.py.
|
|
|
|
This script converts a pre-3.2 models.yaml file into the 3.2 format.
|
|
The main difference is that each model is identified by a unique hash,
|
|
rather than the concatenation of base, type and name used previously.
|
|
|
|
In addition, there are more metadata fields attached to each model.
|
|
These will mostly be empty after conversion, but will be populated
|
|
when new models are downloaded from HuggingFace or Civitae.
|
|
"""
|
|
import argparse
|
|
from pathlib import Path
|
|
|
|
from omegaconf import OmegaConf
|
|
|
|
from invokeai.app.services.config import InvokeAIAppConfig
|
|
from invokeai.backend.model_manager import DuplicateModelException, InvalidModelException, ModelInstall
|
|
from invokeai.backend.model_manager.storage import get_config_store
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Convert a pre-3.2 models.yaml into the 3.2 version.")
|
|
parser.add_argument("--root", type=Path, help="Alternate root directory containing the models.yaml to convert")
|
|
parser.add_argument(
|
|
"--outfile",
|
|
type=Path,
|
|
default=Path("./models-3.2.yaml"),
|
|
help="File to write to. A file with suffix '.yaml' will use the YAML format. A file with an extension of '.db' will be treated as a SQLite3 database.",
|
|
)
|
|
args = parser.parse_args()
|
|
config_args = ["--root", args.root.as_posix()] if args.root else []
|
|
|
|
config = InvokeAIAppConfig.get_config()
|
|
config.parse_args(config_args)
|
|
old_yaml_file = OmegaConf.load(config.model_conf_path)
|
|
|
|
store = get_config_store(args.outfile)
|
|
installer = ModelInstall(store=store)
|
|
|
|
print(f"Writing 3.2 models configuration into {args.outfile}.")
|
|
|
|
for model_key, stanza in old_yaml_file.items():
|
|
if model_key == "__metadata__":
|
|
assert (
|
|
stanza["version"] == "3.0.0"
|
|
), f"This script works on version 3.0.0 yaml files, but your configuration points to a {stanza['version']} version"
|
|
continue
|
|
|
|
try:
|
|
path = config.models_path / stanza["path"]
|
|
new_key = installer.register_path(path)
|
|
model_info = store.get_model(new_key)
|
|
if vae := stanza.get("vae"):
|
|
model_info.vae = (config.models_path / vae).as_posix()
|
|
if model_config := stanza.get("config"):
|
|
model_info.config = (config.root_path / model_config).as_posix()
|
|
model_info.description = stanza.get("description")
|
|
store.update_model(new_key, model_info)
|
|
|
|
print(f"{model_key} => {new_key}")
|
|
except (DuplicateModelException, InvalidModelException) as e:
|
|
print(str(e))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|