From 3ea3bc85462f3e41ddffb0db61ce256eec14c50b Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 26 Feb 2025 20:34:02 -0500 Subject: [PATCH 1/5] Fix wan issues when prompt length is long. --- comfy/ldm/wan/model.py | 2 +- comfy/text_encoders/wan.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/comfy/ldm/wan/model.py b/comfy/ldm/wan/model.py index dbe84b8bb..5471763bb 100644 --- a/comfy/ldm/wan/model.py +++ b/comfy/ldm/wan/model.py @@ -421,7 +421,7 @@ class WanModel(torch.nn.Module): e0 = self.time_projection(e).unflatten(1, (6, self.dim)) # context - context = self.text_embedding(torch.cat([context, context.new_zeros(context.size(0), self.text_len - context.size(1), context.size(2))], dim=1)) + context = self.text_embedding(context) if clip_fea is not None and self.img_emb is not None: context_clip = self.img_emb(clip_fea) # bs x 257 x dim diff --git a/comfy/text_encoders/wan.py b/comfy/text_encoders/wan.py index d98c9ad28..971ac8fa8 100644 --- a/comfy/text_encoders/wan.py +++ b/comfy/text_encoders/wan.py @@ -11,7 +11,7 @@ class UMT5XXlModel(sd1_clip.SDClipModel): class UMT5XXlTokenizer(sd1_clip.SDTokenizer): def __init__(self, embedding_directory=None, tokenizer_data={}): tokenizer = tokenizer_data.get("spiece_model", None) - super().__init__(tokenizer, pad_with_end=False, embedding_size=4096, embedding_key='umt5xxl', tokenizer_class=SPieceTokenizer, has_start_token=False, pad_to_max_length=False, max_length=99999999, min_length=1, pad_token=0) + super().__init__(tokenizer, pad_with_end=False, embedding_size=4096, embedding_key='umt5xxl', tokenizer_class=SPieceTokenizer, has_start_token=False, pad_to_max_length=False, max_length=99999999, min_length=512, pad_token=0) def state_dict(self): return {"spiece_model": self.tokenizer.serialize_model()} From 89253e9fe5bef0a93cc3b8d6e43542f0a5eae697 Mon Sep 17 00:00:00 2001 From: BiologicalExplosion <49753622+BiologicalExplosion@users.noreply.github.com> Date: Thu, 27 Feb 2025 09:45:13 +0800 Subject: [PATCH 2/5] Support Cambricon MLU (#6964) Co-authored-by: huzhan --- README.md | 7 +++++++ comfy/model_management.py | 44 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d9a6a41e..ae6092fd0 100644 --- a/README.md +++ b/README.md @@ -260,6 +260,13 @@ For models compatible with Ascend Extension for PyTorch (torch_npu). To get star 3. Next, install the necessary packages for torch-npu by adhering to the platform-specific instructions on the [Installation](https://ascend.github.io/docs/sources/pytorch/install.html#pytorch) page. 4. Finally, adhere to the [ComfyUI manual installation](#manual-install-windows-linux) guide for Linux. Once all components are installed, you can run ComfyUI as described earlier. +#### Cambricon MLUs + +For models compatible with Cambricon Extension for PyTorch (torch_mlu). Here's a step-by-step guide tailored to your platform and installation method: + +1. Install the Cambricon CNToolkit by adhering to the platform-specific instructions on the [Installation](https://www.cambricon.com/docs/sdk_1.15.0/cntoolkit_3.7.2/cntoolkit_install_3.7.2/index.html) +2. Next, install the PyTorch(torch_mlu) following the instructions on the [Installation](https://www.cambricon.com/docs/sdk_1.15.0/cambricon_pytorch_1.17.0/user_guide_1.9/index.html) +3. Launch ComfyUI by running `python main.py --listen` # Running diff --git a/comfy/model_management.py b/comfy/model_management.py index 1e6599be2..49eaf7948 100644 --- a/comfy/model_management.py +++ b/comfy/model_management.py @@ -95,6 +95,13 @@ try: except: npu_available = False +try: + import torch_mlu # noqa: F401 + _ = torch.mlu.device_count() + mlu_available = torch.mlu.is_available() +except: + mlu_available = False + if args.cpu: cpu_state = CPUState.CPU @@ -112,6 +119,12 @@ def is_ascend_npu(): return True return False +def is_mlu(): + global mlu_available + if mlu_available: + return True + return False + def get_torch_device(): global directml_enabled global cpu_state @@ -127,6 +140,8 @@ def get_torch_device(): return torch.device("xpu", torch.xpu.current_device()) elif is_ascend_npu(): return torch.device("npu", torch.npu.current_device()) + elif is_mlu(): + return torch.device("mlu", torch.mlu.current_device()) else: return torch.device(torch.cuda.current_device()) @@ -153,6 +168,12 @@ def get_total_memory(dev=None, torch_total_too=False): _, mem_total_npu = torch.npu.mem_get_info(dev) mem_total_torch = mem_reserved mem_total = mem_total_npu + elif is_mlu(): + stats = torch.mlu.memory_stats(dev) + mem_reserved = stats['reserved_bytes.all.current'] + _, mem_total_mlu = torch.mlu.mem_get_info(dev) + mem_total_torch = mem_reserved + mem_total = mem_total_mlu else: stats = torch.cuda.memory_stats(dev) mem_reserved = stats['reserved_bytes.all.current'] @@ -232,7 +253,7 @@ try: if torch_version_numeric[0] >= 2: if ENABLE_PYTORCH_ATTENTION == False and args.use_split_cross_attention == False and args.use_quad_cross_attention == False: ENABLE_PYTORCH_ATTENTION = True - if is_intel_xpu() or is_ascend_npu(): + if is_intel_xpu() or is_ascend_npu() or is_mlu(): if args.use_split_cross_attention == False and args.use_quad_cross_attention == False: ENABLE_PYTORCH_ATTENTION = True except: @@ -316,6 +337,8 @@ def get_torch_device_name(device): return "{} {}".format(device, torch.xpu.get_device_name(device)) elif is_ascend_npu(): return "{} {}".format(device, torch.npu.get_device_name(device)) + elif is_mlu(): + return "{} {}".format(device, torch.mlu.get_device_name(device)) else: return "CUDA {}: {}".format(device, torch.cuda.get_device_name(device)) @@ -905,6 +928,8 @@ def xformers_enabled(): return False if is_ascend_npu(): return False + if is_mlu(): + return False if directml_enabled: return False return XFORMERS_IS_AVAILABLE @@ -936,6 +961,8 @@ def pytorch_attention_flash_attention(): return True if is_ascend_npu(): return True + if is_mlu(): + return True if is_amd(): return True #if you have pytorch attention enabled on AMD it probably supports at least mem efficient attention return False @@ -984,6 +1011,13 @@ def get_free_memory(dev=None, torch_free_too=False): mem_free_npu, _ = torch.npu.mem_get_info(dev) mem_free_torch = mem_reserved - mem_active mem_free_total = mem_free_npu + mem_free_torch + elif is_mlu(): + stats = torch.mlu.memory_stats(dev) + mem_active = stats['active_bytes.all.current'] + mem_reserved = stats['reserved_bytes.all.current'] + mem_free_mlu, _ = torch.mlu.mem_get_info(dev) + mem_free_torch = mem_reserved - mem_active + mem_free_total = mem_free_mlu + mem_free_torch else: stats = torch.cuda.memory_stats(dev) mem_active = stats['active_bytes.all.current'] @@ -1053,6 +1087,9 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True, ma if is_ascend_npu(): return True + if is_mlu(): + return True + if torch.version.hip: return True @@ -1121,6 +1158,11 @@ def should_use_bf16(device=None, model_params=0, prioritize_performance=True, ma return False props = torch.cuda.get_device_properties(device) + + if is_mlu(): + if props.major > 3: + return True + if props.major >= 8: return True From 92d8d153000cab2eae4eab4ef7314abb2ddbf9f1 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 26 Feb 2025 20:47:08 -0500 Subject: [PATCH 3/5] Readme changes. Instructions shouldn't recommend to run comfyui with --listen --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae6092fd0..5d3ba0496 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ ComfyUI lets you design and execute advanced stable diffusion pipelines using a #### [Manual Install](#manual-install-windows-linux) Supports all operating systems and GPU types (NVIDIA, AMD, Intel, Apple Silicon, Ascend). -## Examples +## [Examples](https://comfyanonymous.github.io/ComfyUI_examples/) See what ComfyUI can do with the [example workflows](https://comfyanonymous.github.io/ComfyUI_examples/). @@ -266,7 +266,7 @@ For models compatible with Cambricon Extension for PyTorch (torch_mlu). Here's a 1. Install the Cambricon CNToolkit by adhering to the platform-specific instructions on the [Installation](https://www.cambricon.com/docs/sdk_1.15.0/cntoolkit_3.7.2/cntoolkit_install_3.7.2/index.html) 2. Next, install the PyTorch(torch_mlu) following the instructions on the [Installation](https://www.cambricon.com/docs/sdk_1.15.0/cambricon_pytorch_1.17.0/user_guide_1.9/index.html) -3. Launch ComfyUI by running `python main.py --listen` +3. Launch ComfyUI by running `python main.py` # Running From 714f728820858836b3249a465443f3e2317c2ca2 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 26 Feb 2025 20:48:50 -0500 Subject: [PATCH 4/5] Add to README that the Wan model is supported. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5d3ba0496..9190dd493 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ See what ComfyUI can do with the [example workflows](https://comfyanonymous.gith - [LTX-Video](https://comfyanonymous.github.io/ComfyUI_examples/ltxv/) - [Hunyuan Video](https://comfyanonymous.github.io/ComfyUI_examples/hunyuan_video/) - [Nvidia Cosmos](https://comfyanonymous.github.io/ComfyUI_examples/cosmos/) + - [Wan 2.1](https://comfyanonymous.github.io/ComfyUI_examples/wan/) - [Stable Audio](https://comfyanonymous.github.io/ComfyUI_examples/audio/) - Asynchronous Queue system - Many optimizations: Only re-executes the parts of the workflow that changes between executions. From b07f116dea4e00b42df3fbbe045f4c8c76c9d97b Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 26 Feb 2025 21:19:14 -0500 Subject: [PATCH 5/5] Bump ComfyUI version to v0.3.18 --- comfyui_version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/comfyui_version.py b/comfyui_version.py index 2c00ff181..9d69edfc1 100644 --- a/comfyui_version.py +++ b/comfyui_version.py @@ -1,3 +1,3 @@ # This file is automatically generated by the build process when version is # updated in pyproject.toml. -__version__ = "0.3.17" +__version__ = "0.3.18" diff --git a/pyproject.toml b/pyproject.toml index d119e9834..be52c6028 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ComfyUI" -version = "0.3.17" +version = "0.3.18" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.9"