From 61e949c1ccac6a94afe2e2dedfeeebfde90209f2 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 26 Jun 2025 18:33:04 +0300 Subject: [PATCH 1/2] Update OpenVINO to 2025.2.0 --- CHANGELOG.md | 1 + installer.py | 4 ++-- modules/intel/openvino/__init__.py | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cccb4ede7..bdd09b0e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Use Diffusers version of *OmniGen* - Control move global settings to control elements -> control settings tab - Control add setting to run hires with or without control + - Update OpenVINO to 2025.2.0 - **SDNQ Quantization** - Add modules_to_not_convert support for post mode diff --git a/installer.py b/installer.py index bf4d0b408..4e4d391cb 100644 --- a/installer.py +++ b/installer.py @@ -752,8 +752,8 @@ def install_openvino(): else: torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+cpu torchvision==0.22.1+cpu --index-url https://download.pytorch.org/whl/cpu') - install(os.environ.get('OPENVINO_COMMAND', 'openvino==2025.1.0'), 'openvino') - install(os.environ.get('NNCF_COMMAND', 'nncf==2.16.0'), 'nncf') + install(os.environ.get('OPENVINO_COMMAND', 'openvino==2025.2.0'), 'openvino') + install(os.environ.get('NNCF_COMMAND', 'nncf==2.17.0'), 'nncf') os.environ.setdefault('PYTORCH_TRACING_MODE', 'TORCHFX') if os.environ.get("NEOReadDebugKeys", None) is None: os.environ.setdefault('NEOReadDebugKeys', '1') diff --git a/modules/intel/openvino/__init__.py b/modules/intel/openvino/__init__.py index bb5ee9c64..26ac004e4 100644 --- a/modules/intel/openvino/__init__.py +++ b/modules/intel/openvino/__init__.py @@ -24,11 +24,13 @@ from modules import shared, devices, sd_models # importing openvino.runtime forces DeprecationWarning to "always" # And Intel's own libs (NNCF) imports the deprecated module -# Reset the warnings back to ignore: +# Don't allow openvino to override warning filters: try: import warnings + filterwarnings = warnings.filterwarnings + warnings.filterwarnings = lambda *args, **kwargs: None import openvino.runtime # pylint: disable=unused-import - warnings.filterwarnings(action="ignore", category=DeprecationWarning) + warnings.filterwarnings = filterwarnings except Exception: pass From ada38d57b466152503b1a8dce8e8f77dc2a5cb4b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 26 Jun 2025 12:21:35 -0400 Subject: [PATCH 2/2] add nvidia-cosmos-predict-2 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 8 +- html/reference.json | 15 ++- .../nvidia--Cosmos-Predict2-2B-Text2Image.jpg | Bin 0 -> 43322 bytes modules/loader.py | 8 +- modules/model_cosmos.py | 108 ++++++++++++++++++ modules/modeldata.py | 2 + modules/processing_args.py | 2 + modules/processing_vae.py | 2 +- modules/sd_detect.py | 4 + modules/sd_models.py | 3 + modules/sd_offload.py | 2 +- modules/sd_samplers_common.py | 2 +- modules/shared_items.py | 1 + 13 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 models/Reference/nvidia--Cosmos-Predict2-2B-Text2Image.jpg create mode 100644 modules/model_cosmos.py diff --git a/CHANGELOG.md b/CHANGELOG.md index bdd09b0e8..0b4cc2a0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,14 @@ ## Update for 2025-06-26 +- **Models** + - [nVidia Cosmos-Predict2 T2I](https://research.nvidia.com/labs/dir/cosmos-predict2/) *2B and 14B* + - available via *networks -> models -> reference* + - *note*: this is a gated model, you need to [accept terms](https://huggingface.co/nvidia/Cosmos-Predict2-2B-Text2Image) and set your [huggingface token](https://vladmandic.github.io/sdnext-docs/Gated/) + - [JoyCaption Beta](https://huggingface.co/fancyfeast/llama-joycaption-beta-one-hf-llava) support (in addition to existing JoyCaption Alpha) + - available via *caption -> vlm caption* + - **Changes** - - Add [JoyCaption Beta](https://huggingface.co/fancyfeast/llama-joycaption-beta-one-hf-llava) support (in addition to existing JoyCaption Alpha) - Support Remote VAE with *Omnigen, Lumina 2 and PixArt* - Use Diffusers version of *OmniGen* - Control move global settings to control elements -> control settings tab diff --git a/html/reference.json b/html/reference.json index fe89f47ac..07d0c97dc 100644 --- a/html/reference.json +++ b/html/reference.json @@ -236,7 +236,20 @@ "desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.", "preview": "Efficient-Large-Model--Sana_1600M_1024px_diffusers.jpg", "skip": true - }, + }, + + "nVidia Cosmos-Predict2 T2I 2B": { + "path": "nvidia/Cosmos-Predict2-2B-Text2Image", + "desc": "Cosmos-Predict2: A family of highly performant pre-trained world foundation models purpose-built for generating physics-aware images, videos and world states for physical AI development.", + "preview": "nvidia--Cosmos-Predict2-2B-Text2Image.jpg", + "skip": true + }, + "nVidia Cosmos-Predict2 T2I 14B": { + "path": "nvidia/Cosmos-Predict2-14B-Text2Image", + "desc": "Cosmos-Predict2: A family of highly performant pre-trained world foundation models purpose-built for generating physics-aware images, videos and world states for physical AI development.", + "preview": "nvidia--Cosmos-Predict2-2B-Text2Image.jpg", + "skip": true + }, "VectorSpaceLab OmniGen v1": { "path": "Shitao/OmniGen-v1-diffusers", diff --git a/models/Reference/nvidia--Cosmos-Predict2-2B-Text2Image.jpg b/models/Reference/nvidia--Cosmos-Predict2-2B-Text2Image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54b9af8c145fa9115083ec9ee073cc752f073238 GIT binary patch literal 43322 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≤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 literal 0 HcmV?d00001 diff --git a/modules/loader.py b/modules/loader.py index 2574c90b4..cb554c38e 100644 --- a/modules/loader.py +++ b/modules/loader.py @@ -35,9 +35,13 @@ warnings.filterwarnings(action="ignore", category=DeprecationWarning) warnings.filterwarnings(action="ignore", category=FutureWarning) warnings.filterwarnings(action="ignore", category=UserWarning, module="torchvision") try: + import torch._logging # pylint: disable=ungrouped-imports + torch._logging._internal.DEFAULT_LOG_LEVEL = logging.ERROR # pylint: disable=protected-access torch._logging.set_logs(all=logging.ERROR, bytecode=False, aot_graphs=False, aot_joint_graph=False, ddp_graphs=False, graph=False, graph_code=False, graph_breaks=False, graph_sizes=False, guards=False, recompiles=False, recompiles_verbose=False, trace_source=False, trace_call=False, trace_bytecode=False, output_code=False, kernel_code=False, schedule=False, perf_hints=False, post_grad_graphs=False, onnx_diagnostics=False, fusion=False, overlap=False, export=None, modules=None, cudagraphs=False, sym_node=False, compiled_autograd_verbose=False) # pylint: disable=protected-access -except Exception: - pass + torch._dynamo.config.verbose = False # pylint: disable=protected-access + torch._dynamo.config.suppress_errors = True # pylint: disable=protected-access +except Exception as e: + errors.log.warning(f'Torch logging: {e}') if ".dev" in torch.__version__ or "+git" in torch.__version__: torch.__long_version__ = torch.__version__ torch.__version__ = re.search(r'[\d.]+[\d]', torch.__version__).group(0) diff --git a/modules/model_cosmos.py b/modules/model_cosmos.py new file mode 100644 index 000000000..c482d033b --- /dev/null +++ b/modules/model_cosmos.py @@ -0,0 +1,108 @@ +import os +import transformers +import diffusers +from huggingface_hub import auth_check +from modules import shared, devices, sd_models, model_quant, modelloader, sd_hijack_te + + +def load_transformer(repo_id, diffusers_load_config={}): + load_args, quant_args = model_quant.get_dit_args(diffusers_load_config, module='Transformer', device_map=True) + fn = None + + if shared.opts.sd_unet is not None and shared.opts.sd_unet != 'Default': + from modules import sd_unet + if shared.opts.sd_unet not in list(sd_unet.unet_dict): + shared.log.error(f'Load module: type=Transformer not found: {shared.opts.sd_unet}') + return None + fn = sd_unet.unet_dict[shared.opts.sd_unet] if os.path.exists(sd_unet.unet_dict[shared.opts.sd_unet]) else None + + if fn is not None and 'gguf' in fn.lower(): + shared.log.error('Load model: type=Cosmos format="gguf" unsupported') + transformer = None + elif fn is not None and 'safetensors' in fn.lower(): + shared.log.debug(f'Load model: type=Cosmos transformer="{repo_id}" quant="{model_quant.get_quant(repo_id)}" args={load_args}') + transformer = diffusers.CosmosTransformer3DModel.from_single_file(fn, cache_dir=shared.opts.hfcache_dir, **load_args) + else: + shared.log.debug(f'Load model: type=Cosmos transformer="{repo_id}" quant="{model_quant.get_quant_type(quant_args)}" args={load_args}') + transformer = diffusers.CosmosTransformer3DModel.from_pretrained( + repo_id, + subfolder="transformer", + cache_dir=shared.opts.hfcache_dir, + **load_args, + **quant_args, + ) + if shared.opts.diffusers_offload_mode != 'none' and transformer is not None: + sd_models.move_model(transformer, devices.cpu) + return transformer + + +def load_text_encoder(repo_id, diffusers_load_config={}): + load_args, quant_args = model_quant.get_dit_args(diffusers_load_config, module='TE', device_map=True) + shared.log.debug(f'Load model: type=Cosmos te="{repo_id}" quant="{model_quant.get_quant_type(quant_args)}" args={load_args}') + text_encoder = transformers.T5EncoderModel.from_pretrained( + repo_id, + subfolder="text_encoder", + cache_dir=shared.opts.hfcache_dir, + **load_args, + **quant_args, + ) + if shared.opts.diffusers_offload_mode != 'none' and text_encoder is not None: + sd_models.move_model(text_encoder, devices.cpu) + + load_args, quant_args = model_quant.get_dit_args(diffusers_load_config, module='LLM', device_map=True) + llama_repo = shared.opts.model_h1_llama_repo if shared.opts.model_h1_llama_repo != 'Default' else 'meta-llama/Meta-Llama-3.1-8B-Instruct' + shared.log.debug(f'Load model: type=HiDream te4="{llama_repo}" quant="{model_quant.get_quant_type(quant_args)}" args={load_args}') + + return text_encoder + + +def load_cosmos_t2i(checkpoint_info, diffusers_load_config={}): + repo_id = sd_models.path_to_repo(checkpoint_info.name) + login = modelloader.hf_login() + try: + auth_check(repo_id) + except Exception as e: + shared.log.error(f'Load model: repo="{repo_id}" login={login} {e}') + return False + + transformer = load_transformer(repo_id, diffusers_load_config) + text_encoder = load_text_encoder(repo_id, diffusers_load_config) + safety_checker = Fake_safety_checker() + + load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, module='Model') + shared.log.debug(f'Load model: type=Cosmos model="{checkpoint_info.name}" repo="{repo_id}" offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args}') + + cls = diffusers.Cosmos2TextToImagePipeline + pipe = cls.from_pretrained( + repo_id, + transformer=transformer, + text_encoder=text_encoder, + safety_checker=safety_checker, + cache_dir=shared.opts.diffusers_dir, + **load_args, + ) + + sd_hijack_te.init_hijack(pipe) + del text_encoder + del transformer + + devices.torch_gc() + return pipe + + +class Fake_safety_checker: + def __init__(self): + from diffusers.utils import import_utils + import_utils._cosmos_guardrail_available = True # pylint: disable=protected-access + + def __call__(self, *args, **kwargs): # pylint: disable=unused-argument + return + + def to(self, _device): + pass + + def check_text_safety(self, _prompt): + return True + + def check_video_safety(self, vid): + return vid diff --git a/modules/modeldata.py b/modules/modeldata.py index 688cff23d..1de6a74a4 100644 --- a/modules/modeldata.py +++ b/modules/modeldata.py @@ -43,6 +43,8 @@ def get_model_type(pipe): model_type = 'sana' elif "HiDream" in name: model_type = 'h1' + elif "Cosmos2TextToImage" in name: + model_type = 'cosmos' # video models elif "CogVideo" in name: model_type = 'cogvideo' diff --git a/modules/processing_args.py b/modules/processing_args.py index d9ad9869f..20e8becec 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -298,6 +298,8 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t args['control_strength'] = p.denoising_strength args['width'] = p.width args['height'] = p.height + if 'Cosmos2TextToImagePipeline': + kwargs['output_type'] = 'np' # cosmos uses wan-vae which is weird # set callbacks if 'prior_callback_steps' in possible: # Wuerstchen / Cascade args['prior_callback_steps'] = 1 diff --git a/modules/processing_vae.py b/modules/processing_vae.py index 36d5d0dda..6feaec0cd 100644 --- a/modules/processing_vae.py +++ b/modules/processing_vae.py @@ -130,7 +130,7 @@ def full_vae_decode(latents, model): # normalize latents latents_mean = model.vae.config.get("latents_mean", None) latents_std = model.vae.config.get("latents_std", None) - scaling_factor = model.vae.config.get("scaling_factor", None) + scaling_factor = model.vae.config.get("scaling_factor", 1.0) shift_factor = model.vae.config.get("shift_factor", None) if latents_mean and latents_std: latents_mean = (torch.tensor(latents_mean).view(1, -1, 1, 1).to(latents.device, latents.dtype)) diff --git a/modules/sd_detect.py b/modules/sd_detect.py index 3c2c1be72..fb8c9d6b5 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -98,6 +98,8 @@ def detect_pipeline(f: str, op: str = 'model', warning=True, quiet=False): warn(f'Model detected as FLUX UNET model, but attempting to load a base model: {op}={f} size={size} MB') if 'flex.2' in f.lower(): guess = 'FLEX' + if 'cosmos-predict2' in f.lower(): + guess = 'Cosmos' # guess for diffusers index = os.path.join(f, 'model_index.json') if os.path.exists(index) and os.path.isfile(index): @@ -113,6 +115,7 @@ def detect_pipeline(f: str, op: str = 'model', warning=True, quiet=False): guess = 'Stable Diffusion 3' if callable(pipeline) and 'Lumina2' in pipeline.__name__: guess = 'Lumina 2' + # switch for specific variant if guess == 'Stable Diffusion' and 'inpaint' in f.lower(): guess = 'Stable Diffusion Inpaint' @@ -122,6 +125,7 @@ def detect_pipeline(f: str, op: str = 'model', warning=True, quiet=False): guess = 'Stable Diffusion XL Inpaint' elif guess == 'Stable Diffusion XL' and 'instruct' in f.lower(): guess = 'Stable Diffusion XL Instruct' + # get actual pipeline pipeline = shared_items.get_pipelines().get(guess, None) if pipeline is None else pipeline if debug_load is not None: diff --git a/modules/sd_models.py b/modules/sd_models.py index 0530f5a5b..1d85ed47b 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -350,6 +350,9 @@ def load_diffuser_force(model_type, checkpoint_info, diffusers_load_config, op=' elif model_type in ['HiDream']: from modules.model_hidream import load_hidream sd_model = load_hidream(checkpoint_info, diffusers_load_config) + elif model_type in ['Cosmos']: + from modules.model_cosmos import load_cosmos_t2i + sd_model = load_cosmos_t2i(checkpoint_info, diffusers_load_config) except Exception as e: shared.log.error(f'Load {op}: path="{checkpoint_info.path}" {e}') if debug_load: diff --git a/modules/sd_offload.py b/modules/sd_offload.py index 70777a30a..0db3a2ba0 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -12,7 +12,7 @@ from modules.timer import process as process_timer debug = os.environ.get('SD_MOVE_DEBUG', None) is not None debug_move = log.trace if debug else lambda *args, **kwargs: None -offload_warn = ['sc', 'sd3', 'f1', 'h1', 'hunyuandit', 'auraflow', 'omnigen', 'cogview4'] +offload_warn = ['sc', 'sd3', 'f1', 'h1', 'hunyuandit', 'auraflow', 'omnigen', 'cogview4', 'cosmos'] offload_post = ['h1'] offload_hook_instance = None balanced_offload_exclude = ['CogView4Pipeline'] diff --git a/modules/sd_samplers_common.py b/modules/sd_samplers_common.py index 52fd6313e..7f3e802ec 100644 --- a/modules/sd_samplers_common.py +++ b/modules/sd_samplers_common.py @@ -9,7 +9,7 @@ from modules import shared, devices, processing, images, sd_vae_approx, sd_vae_t SamplerData = namedtuple('SamplerData', ['name', 'constructor', 'aliases', 'options']) approximation_indexes = { "Simple": 0, "Approximate": 1, "TAESD": 2, "Full VAE": 3 } -flow_models = ['f1', 'sd3', 'lumina', 'auraflow', 'sana', 'lumina2', 'cogview4', 'h1'] +flow_models = ['f1', 'sd3', 'lumina', 'auraflow', 'sana', 'lumina2', 'cogview4', 'h1', 'cosmos'] warned = False queue_lock = threading.Lock() diff --git a/modules/shared_items.py b/modules/shared_items.py index baf247a35..967f17b30 100644 --- a/modules/shared_items.py +++ b/modules/shared_items.py @@ -42,6 +42,7 @@ pipelines = { 'Amused': getattr(diffusers, 'AmusedPipeline', None), 'HiDream': getattr(diffusers, 'HiDreamImagePipeline', None), 'OmniGenPipeline': getattr(diffusers, 'OmniGenPipeline', None), + 'Cosmos': getattr(diffusers, 'Cosmos2TextToImagePipeline', None), # dynamically imported and redefined later 'Meissonic': getattr(diffusers, 'DiffusionPipeline', None), # dynamically redefined and loaded in sd_models.load_diffuser