From a5d3a681077bf9ddf5f935c915b26f5c2dbf31ff Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 15 Mar 2025 13:20:17 -0400 Subject: [PATCH] add cogview4 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 33 ++++-- html/reference.json | 8 +- .../Alpha-VLLM--Lumina-Image-2.0.jpg | Bin models/Reference/THUDM--CogView4-6B.jpg | Bin 0 -> 40384 bytes modules/model_cogview.py | 95 ++++++++++++++++++ modules/model_flux.py | 33 ------ modules/model_quant.py | 8 +- modules/modeldata.py | 4 + modules/sd_detect.py | 6 +- modules/sd_models.py | 8 +- modules/sd_samplers_common.py | 2 +- modules/shared_items.py | 3 +- wiki | 2 +- 13 files changed, 148 insertions(+), 54 deletions(-) mode change 100755 => 100644 models/Reference/Alpha-VLLM--Lumina-Image-2.0.jpg create mode 100644 models/Reference/THUDM--CogView4-6B.jpg create mode 100644 modules/model_cogview.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 32d906a7d..f0b8b9c52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,30 @@ # Change Log for SD.Next -## Update for 2025-03-14 +## Update for 2025-03-15 -- fix installer not starting when older version of rich is installed -- fix circular imports when debug flags are enabled -- fix cuda errors with directml -- fix memory stats not displaying the ram usage -- fix runpod memory limit reporting -- fix remote vae not being stored in metadata, thanks @iDeNoh -- add --upgrade to torch_command when using --use-nightly for ipex and rocm -- **ipex** +- **Models** + - [THUDM CogView 4 6B](https://huggingface.co/THUDM/CogView4-6B) + new foundation model for image generation based o T5-XXL text encoder and a flow-based diffusion transformer + fully supports offloading and on-the-fly quantization + simply select from *networks -> models -> reference* + - New [zer0int CLiP-L](https://huggingface.co/zer0int/CLIP-Registers-Gated_MLP-ViT-L-14) models: + download text encoders into folder set in settings -> system paths -> text encoders (default is `models/Text-encoder`) + load using *settings -> text encoder* + *tip*: add *sd_text_encoder* to your *settings -> user interface -> quicksettings* list to have it appear at the top of the ui +- **Wiki/Docs** + - updated [Models](https://github.com/vladmandic/sdnext/wiki/Models) info + - Updated SD3 +- **Other** + - add remote vae info to metadata, thanks @iDeNoh + - add quantization support to **CogView-3Plus** +- **Fixes** + - fix installer not starting when older version of `rich` is installed + - fix circular imports when debug flags are enabled + - fix cuda errors with *directml* + - fix memory stats not displaying the ram usage + - fix **RunPod** memory limit reporting +- **IPEX** + - add `--upgrade` to torch_command when using `--use-nightly` for *ipex* and *rocm* - add xpu to profiler - fix untyped_storage, torch.eye and torch.cuda.device ops - fix torch 2.7 compatibility diff --git a/html/reference.json b/html/reference.json index 4cc2edb28..7b6589215 100644 --- a/html/reference.json +++ b/html/reference.json @@ -376,9 +376,15 @@ "extras": "sampler: DPM++ 2M EDM" }, + "CogView 4": { + "path": "THUDM/CogView4-6B", + "desc": "An innovative cascaded framework that enhances the performance of text-to-image diffusion. CogView is the first model implementing relay diffusion in the realm of text-to-image generation, executing the task by first creating low-resolution images and subsequently applying relay-based super-resolution.", + "preview": "THUDM--CogView4-6B.jpg", + "skip": true + }, "CogView 3 Plus": { "path": "THUDM/CogView3-Plus-3B", - "desc": "This model is the DiT version of CogView3, a text-to-image generation model, supporting image generation from 512 to 2048px. Resolution: Width and height must meet the range from 512px to 2048px and must be divisible by 32.", + "desc": "An innovative cascaded framework that enhances the performance of text-to-image diffusion. CogView is the first model implementing relay diffusion in the realm of text-to-image generation, executing the task by first creating low-resolution images and subsequently applying relay-based super-resolution.", "preview": "THUDM--CogView3-Plus-3B.jpg", "skip": true }, diff --git a/models/Reference/Alpha-VLLM--Lumina-Image-2.0.jpg b/models/Reference/Alpha-VLLM--Lumina-Image-2.0.jpg old mode 100755 new mode 100644 diff --git a/models/Reference/THUDM--CogView4-6B.jpg b/models/Reference/THUDM--CogView4-6B.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5876b935ba4fff7da75e4df471b58ef5b4aeb2b0 GIT binary patch literal 40384 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 A{{R30 literal 0 HcmV?d00001 diff --git a/modules/model_cogview.py b/modules/model_cogview.py new file mode 100644 index 000000000..f76a95ed3 --- /dev/null +++ b/modules/model_cogview.py @@ -0,0 +1,95 @@ +import transformers +import diffusers +from modules import shared, devices, sd_models + + +def load_common(diffusers_load_config={}, module=None): + from modules import model_quant, modelloader + modelloader.hf_login() + + if 'torch_dtype' not in diffusers_load_config: + diffusers_load_config['torch_dtype'] = 'torch.float16' + if 'low_cpu_mem_usage' in diffusers_load_config: + del diffusers_load_config['low_cpu_mem_usage'] + if 'load_connected_pipeline' in diffusers_load_config: + del diffusers_load_config['load_connected_pipeline'] + if 'safety_checker' in diffusers_load_config: + del diffusers_load_config['safety_checker'] + if 'requires_safety_checker' in diffusers_load_config: + del diffusers_load_config['requires_safety_checker'] + + quant_args = {} + if not quant_args: + quant_args = model_quant.create_bnb_config(quant_args, module=module) + if not quant_args: + quant_args = model_quant.create_ao_config(quant_args, module=module) + if quant_args: + shared.log.debug(f'Load model: type=CogView quantization module="{module}" {quant_args}') + + return diffusers_load_config, quant_args + + +def load_cogview3(checkpoint_info, diffusers_load_config={}): + repo_id = sd_models.path_to_repo(checkpoint_info.name) + shared.log.debug(f'Load model: type=CogView3 model="{checkpoint_info.name}" repo="{repo_id}" offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype}') + + diffusers_load_config, quant_args = load_common(diffusers_load_config, module='Model') + transformer = diffusers.CogView3PlusTransformer2DModel.from_pretrained( + repo_id, + subfolder="transformer", + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config, + **quant_args, + ) + + diffusers_load_config, quant_args = load_common(diffusers_load_config, module='Text Encoder') + text_encoder = transformers.T5EncoderModel.from_pretrained( + repo_id, + subfolder="text_encoder", + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config, + **quant_args, + ) + + pipe = diffusers.CogView3PlusPipeline.from_pretrained( + repo_id, + text_encoder=text_encoder, + transformer=transformer, + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config, + ) + devices.torch_gc() + return pipe + + +def load_cogview4(checkpoint_info, diffusers_load_config={}): + repo_id = sd_models.path_to_repo(checkpoint_info.name) + shared.log.debug(f'Load model: type=CogView4 model="{checkpoint_info.name}" repo="{repo_id}" offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype}') + + diffusers_load_config, quant_args = load_common(diffusers_load_config, module='Model') + transformer = diffusers.CogView4Transformer2DModel.from_pretrained( + repo_id, + subfolder="transformer", + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config, + **quant_args, + ) + + diffusers_load_config, quant_args = load_common(diffusers_load_config, module='Text Encoder') + text_encoder = transformers.T5EncoderModel.from_pretrained( + repo_id, + subfolder="text_encoder", + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config, + **quant_args, + ) + + pipe = diffusers.CogView4Pipeline.from_pretrained( + repo_id, + text_encoder=text_encoder, + transformer=transformer, + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config, + ) + devices.torch_gc() + return pipe diff --git a/modules/model_flux.py b/modules/model_flux.py index bdb42037b..190007819 100644 --- a/modules/model_flux.py +++ b/modules/model_flux.py @@ -110,39 +110,6 @@ def load_flux_bnb(checkpoint_info, diffusers_load_config): # pylint: disable=unu return transformer, text_encoder_2 -""" -def quant_flux_bnb(checkpoint_info, transformer, text_encoder_2): - repo_id = sd_models.path_to_repo(checkpoint_info.name) - cache_dir=shared.opts.diffusers_dir - if len(shared.opts.bnb_quantization) > 0 and (transformer is None or text_encoder_2 is None): - from modules.model_quant import load_bnb - load_bnb('Load model: type=FLUX') - try: - bnb_config = diffusers.BitsAndBytesConfig( - load_in_8bit=shared.opts.bnb_quantization_type in ['fp8'], - load_in_4bit=shared.opts.bnb_quantization_type in ['nf4', 'fp4'], - bnb_4bit_quant_storage=shared.opts.bnb_quantization_storage, - bnb_4bit_quant_type=shared.opts.bnb_quantization_type, - bnb_4bit_compute_dtype=devices.dtype - ) - if ('Model' in shared.opts.bnb_quantization) and (transformer is None): - transformer = diffusers.FluxTransformer2DModel.from_pretrained(repo_id, subfolder="transformer", cache_dir=cache_dir, quantization_config=bnb_config, torch_dtype=devices.dtype) - shared.log.debug(f'Quantization: module=transformer type=bnb dtype={shared.opts.bnb_quantization_type} storage={shared.opts.bnb_quantization_storage}') - if ('Text Encoder' in shared.opts.bnb_quantization) and (text_encoder_2 is None): - if repo_id == 'sayakpaul/flux.1-dev-nf4': - repo_id = 'black-forest-labs/FLUX.1-dev' # workaround since sayakpaul model is missing model_index.json - text_encoder_2 = transformers.T5EncoderModel.from_pretrained(repo_id, subfolder="text_encoder_2", cache_dir=cache_dir, quantization_config=bnb_config, torch_dtype=devices.dtype) - shared.log.debug(f'Quantization: module=t5 type=bnb dtype={shared.opts.bnb_quantization_type} storage={shared.opts.bnb_quantization_storage}') - except Exception as e: - shared.log.error(f"Load model: type=FLUX failed quantize using BnB: {e}") - transformer, text_encoder_2 = None, None - if debug: - from modules import errors - errors.display(e, 'FLUX:') - return transformer, text_encoder_2 -""" - - def load_quants(kwargs, repo_id, cache_dir, allow_quant): try: if not allow_quant: diff --git a/modules/model_quant.py b/modules/model_quant.py index 23cc37aec..127254343 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -30,10 +30,10 @@ def get_quant(name): return 'none' -def create_bnb_config(kwargs = None, allow_bnb: bool = True): +def create_bnb_config(kwargs = None, allow_bnb: bool = True, module: str = 'Model'): from modules import shared, devices if len(shared.opts.bnb_quantization) > 0 and allow_bnb: - if 'Model' in shared.opts.bnb_quantization: + if 'Model' in shared.opts.bnb_quantization or (module is not None and module in shared.opts.bnb_quantization): load_bnb() if bnb is None: return kwargs @@ -53,10 +53,10 @@ def create_bnb_config(kwargs = None, allow_bnb: bool = True): return kwargs -def create_ao_config(kwargs = None, allow_ao: bool = True): +def create_ao_config(kwargs = None, allow_ao: bool = True, module: str = 'Model'): from modules import shared if len(shared.opts.torchao_quantization) > 0 and shared.opts.torchao_quantization_mode == 'pre' and allow_ao: - if 'Model' in shared.opts.torchao_quantization: + if 'Model' in shared.opts.torchao_quantization or (module is not None and module in shared.opts.torchao_quantization): load_torchao() if ao is None: return kwargs diff --git a/modules/modeldata.py b/modules/modeldata.py index 0105771e5..012372b3b 100644 --- a/modules/modeldata.py +++ b/modules/modeldata.py @@ -37,6 +37,10 @@ def get_model_type(pipe): model_type = 'lumina' elif "OmniGen" in name: model_type = 'omnigen' + elif "CogView3" in name: + model_type = 'cogview3' + elif "CogView4" in name: + model_type = 'cogview4' elif "CogVideo" in name: model_type = 'cogvideox' elif "Sana" in name: diff --git a/modules/sd_detect.py b/modules/sd_detect.py index f011fd77a..642043f29 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -75,8 +75,10 @@ def detect_pipeline(f: str, op: str = 'model', warning=True, quiet=False): guess = 'Kolors' if 'auraflow' in f.lower(): guess = 'AuraFlow' - if 'cogview' in f.lower(): - guess = 'CogView' + if 'cogview3' in f.lower(): + guess = 'CogView3' + if 'cogview4' in f.lower(): + guess = 'CogView4' if 'meissonic' in f.lower(): guess = 'Meissonic' pipeline = 'custom' diff --git a/modules/sd_models.py b/modules/sd_models.py index bb5b672f7..0d662f9df 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -295,9 +295,13 @@ def load_diffuser_force(model_type, checkpoint_info, diffusers_load_config, op=' sd_model = load_lumina2(checkpoint_info, diffusers_load_config) elif model_type in ['Stable Diffusion 3']: from modules.model_sd3 import load_sd3 - shared.log.debug(f'Load {op}: model="Stable Diffusion 3"') - shared.opts.scheduler = 'Default' sd_model = load_sd3(checkpoint_info, cache_dir=shared.opts.diffusers_dir, config=diffusers_load_config.get('config', None)) + elif model_type in ['CogView3']: # forced pipeline + from modules.model_cogview import load_cogview3 + sd_model = load_cogview3(checkpoint_info, diffusers_load_config) + elif model_type in ['CogView4']: # forced pipeline + from modules.model_cogview import load_cogview4 + sd_model = load_cogview4(checkpoint_info, diffusers_load_config) elif model_type in ['Meissonic']: # forced pipeline from modules.model_meissonic import load_meissonic sd_model = load_meissonic(checkpoint_info, diffusers_load_config) diff --git a/modules/sd_samplers_common.py b/modules/sd_samplers_common.py index 0b50c5c6c..5eb4a5f94 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'] +flow_models = ['f1', 'sd3', 'lumina', 'auraflow', 'sana', 'lumina2', 'cogview4'] warned = False queue_lock = threading.Lock() diff --git a/modules/shared_items.py b/modules/shared_items.py index 5c1e3aebb..7b9940a45 100644 --- a/modules/shared_items.py +++ b/modules/shared_items.py @@ -89,7 +89,8 @@ def get_pipelines(): 'SegMoE': getattr(diffusers, 'StableDiffusionPipeline', None), # dynamically redefined and loaded in sd_models.load_diffuser 'Kolors': getattr(diffusers, 'KolorsPipeline', None), 'AuraFlow': getattr(diffusers, 'AuraFlowPipeline', None), - 'CogView': getattr(diffusers, 'CogView3PlusPipeline', None), + 'CogView3': getattr(diffusers, 'CogView3PlusPipeline', None), + 'CogView4': getattr(diffusers, 'CogView4Pipeline', None), 'Stable Cascade': getattr(diffusers, 'StableCascadeCombinedPipeline', None), 'PixArt-Sigma': getattr(diffusers, 'PixArtSigmaPipeline', None), 'HunyuanDiT': getattr(diffusers, 'HunyuanDiTPipeline', None), diff --git a/wiki b/wiki index 910dc3083..cba8d182b 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 910dc3083c087eb806f548f05b6cf86ce4666268 +Subproject commit cba8d182b3cb18aeb4519d7c211d14cf9532021c