From 2538ae6332f2dbbec725f6349e0ff6e8169264f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zeyu=20Huang=20=7C=20=E9=BB=83=E6=BE=A4=E5=AE=87?= <11222265+fhfuih@users.noreply.github.com> Date: Mon, 9 Feb 2026 09:54:41 +0800 Subject: [PATCH 01/10] [ComfyUI]: ComfyUI integration (#1113) Signed-off-by: Huang, Zeyu <11222265+fhfuih@users.noreply.github.com> --- .github/workflows/build_wheel.yml | 2 + .github/workflows/comfyui-publish.yml | 27 + .github/workflows/comfyui-validate.yml | 40 ++ .gitignore | 9 + apps/ComfyUI-vLLM-Omni/.gitignore | 115 ++++ apps/ComfyUI-vLLM-Omni/LICENSE | 15 + apps/ComfyUI-vLLM-Omni/README.md | 170 ++++++ apps/ComfyUI-vLLM-Omni/__init__.py | 52 ++ .../comfyui_vllm_omni/__init__.py | 1 + .../comfyui_vllm_omni/nodes.py | 569 ++++++++++++++++++ .../comfyui_vllm_omni/utils/api_client.py | 473 +++++++++++++++ .../comfyui_vllm_omni/utils/format.py | 230 +++++++ .../comfyui_vllm_omni/utils/logger.py | 125 ++++ .../comfyui_vllm_omni/utils/models.py | 119 ++++ .../comfyui_vllm_omni/utils/types.py | 39 ++ .../comfyui_vllm_omni/utils/validators.py | 84 +++ .../docs/images/comfyui-comprehension.jpg | Bin 0 -> 423088 bytes .../docs/images/comfyui-image-generation.jpg | Bin 0 -> 135014 bytes .../docs/images/comfyui-multi-stage.jpg | Bin 0 -> 217410 bytes .../docs/images/comfyui-tts.jpg | Bin 0 -> 309855 bytes .../vLLM-Omni Annotated Example.json | 1 + .../vLLM-Omni Image Generation.json | 1 + .../example_workflows/vLLM-Omni TTS.json | 1 + apps/ComfyUI-vLLM-Omni/web/main.js | 21 + docs/.nav.yml | 1 + docs/features/comfyui.md | 70 +++ 26 files changed, 2165 insertions(+) create mode 100644 .github/workflows/comfyui-publish.yml create mode 100644 .github/workflows/comfyui-validate.yml create mode 100644 apps/ComfyUI-vLLM-Omni/.gitignore create mode 100644 apps/ComfyUI-vLLM-Omni/LICENSE create mode 100644 apps/ComfyUI-vLLM-Omni/README.md create mode 100644 apps/ComfyUI-vLLM-Omni/__init__.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/__init__.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/nodes.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/api_client.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/format.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/logger.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/models.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/types.py create mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/validators.py create mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-comprehension.jpg create mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-image-generation.jpg create mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-multi-stage.jpg create mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-tts.jpg create mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Annotated Example.json create mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Image Generation.json create mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni TTS.json create mode 100644 apps/ComfyUI-vLLM-Omni/web/main.js create mode 100644 docs/features/comfyui.md diff --git a/.github/workflows/build_wheel.yml b/.github/workflows/build_wheel.yml index e84b399df..2d76c69b2 100644 --- a/.github/workflows/build_wheel.yml +++ b/.github/workflows/build_wheel.yml @@ -7,6 +7,7 @@ on: paths-ignore: - 'docs/**' - 'examples/**' + - 'apps/**' - '.github/**' - '.buildkite/**' - '**.md' @@ -20,6 +21,7 @@ on: paths-ignore: - 'docs/**' - 'examples/**' + - 'apps/**' - '.github/**' - '.buildkite/**' - '*.yml' diff --git a/.github/workflows/comfyui-publish.yml b/.github/workflows/comfyui-publish.yml new file mode 100644 index 000000000..c282bcada --- /dev/null +++ b/.github/workflows/comfyui-publish.yml @@ -0,0 +1,27 @@ +name: ComfyUI Integration -- Publish to Comfy registry +on: + workflow_dispatch: + push: + tags: + - "*" + paths: + - "apps/ComfyUI-vLLM-Omni/**" + +permissions: + issues: write + +defaults: + run: + working-directory: apps/ComfyUI-vLLM-Omni + +jobs: + publish-node: + name: Publish Custom Node to registry + runs-on: ubuntu-latest + steps: + - name: ♻️ Check out code + uses: actions/checkout@v4 + - name: 📦 Publish Custom Node + uses: Comfy-Org/publish-node-action@main + with: + personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} diff --git a/.github/workflows/comfyui-validate.yml b/.github/workflows/comfyui-validate.yml new file mode 100644 index 000000000..06b9b1f91 --- /dev/null +++ b/.github/workflows/comfyui-validate.yml @@ -0,0 +1,40 @@ +name: ComfyUI Integration -- Validate backwards compatibility + +on: + pull_request: + branches: + - master + - main + paths: + - "apps/ComfyUI-vLLM-Omni/**" + +defaults: + run: + working-directory: apps/ComfyUI-vLLM-Omni + +jobs: + check-base-path: + runs-on: ubuntu-latest + outputs: + exists: ${{ steps.check.outputs.exists }} + defaults: + run: + working-directory: . + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.base.sha }} + fetch-depth: 1 + - id: check + run: | + if [ -d "apps/ComfyUI-vLLM-Omni" ]; then + echo "exists=true" >> "$GITHUB_OUTPUT" + else + echo "exists=false" >> "$GITHUB_OUTPUT" + fi + validate: + needs: check-base-path + if: needs.check-base-path.outputs.exists == 'true' + runs-on: ubuntu-latest + steps: + - uses: comfy-org/node-diff@main diff --git a/.gitignore b/.gitignore index f7b771bc7..7b0a9c368 100644 --- a/.gitignore +++ b/.gitignore @@ -153,6 +153,14 @@ dmypy.json # Cython debug symbols cython_debug/ +# Claude +CLAUDE.md +.claude/ + +# Codex +AGENTS.md +.codex/ + # cursor .cursor/ @@ -214,6 +222,7 @@ data/ datasets/ *.csv *.json +!apps/ComfyUI-vLLM-Omni/example_workflows/*.json *.jsonl *.parquet diff --git a/apps/ComfyUI-vLLM-Omni/.gitignore b/apps/ComfyUI-vLLM-Omni/.gitignore new file mode 100644 index 000000000..5704ad153 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/.gitignore @@ -0,0 +1,115 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# OSX useful to ignore +*.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +venv/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# IntelliJ Idea +.idea +*.iml +*.ipr +*.iws + +# PyBuilder +target/ + +# Cookiecutter +output/ +python_boilerplate/ +cookiecutter-pypackage-env/ + +# vscode settings +.history/ +*.code-workspace + +# Frontend extension +node_modules/ +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +node.zip +.vscode/ +.claude/ +.codemate/ diff --git a/apps/ComfyUI-vLLM-Omni/LICENSE b/apps/ComfyUI-vLLM-Omni/LICENSE new file mode 100644 index 000000000..b3c346397 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/LICENSE @@ -0,0 +1,15 @@ +Apache Software License 2.0 + +Copyright (c) 2026, Zeyu Huang + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/apps/ComfyUI-vLLM-Omni/README.md b/apps/ComfyUI-vLLM-Omni/README.md new file mode 100644 index 000000000..dd530174f --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/README.md @@ -0,0 +1,170 @@ +# vLLM-Omni + +vLLM-Omni offers a ComfyUI integration on top of its online serving API. +It can send model inference requests to either a locally running vLLM-Omni service or a remote one. + +## Requirement + +- Python 3.12 or above +- [ComfyUI installed](https://docs.comfy.org/installation/system_requirements) +- [vLLM-Omni installed](https://docs.vllm.ai/projects/vllm-omni/en/latest/getting_started/installation/) on either the same device or another device discoverable via the internet. +- No need to install additional packages apart from those already required by ComfyUI. + +> [!TIP] +> If you run both ComfyUI and vLLM-Omni on the same device, you can create separate virtual environments and use different Python versions for them. + + +## Installation + +Copy this folder to the `custom_nodes` subfolder of your ComfyUI installation. Your directory should look like `ComfyUI/custom_nodes/ComfyUI-vLLM-Omni`. + +If you are running ComfyUI during copying, you should restart ComfyUI to load this extension. + +> [!TIP] +> You can use utility websites such as https://download-directory.github.io/ to download a subdirectory of a repo. Also checkout community discussions (e.g., https://stackoverflow.com/questions/7106012/download-a-single-folder-or-directory-from-a-github-repository) for more info. + +On the device and virtual environment you run ComfyUI, launch ComfyUI with +```bash +cd ComfyUI + +# The regular way +python main.py + +# If you are mainly using this node, launch it faster with +python main.py --cpu +``` + +On the device and virtual environment you run vLLM-Omni, start a model service with +```bash +vllm serve The_Model_ID_to_Serve --omni --port 8000 +``` + +Check **ComfyUI's sidebar -> Node Library**. There should be a new folder named **vLLM-Omni**. +If no, check your shell running the ComfyUI process. There may be some error messages before the line `Import times for custom nodes:` and the line `To see the GUI go to: http://127.0.0.1:8188`. + +## Quickstart + +This extension offers the following nodes based on the output modalities (at **ComfyUI sidebar -> Node Library**): + +- **Generate Image** for text-to-image and image-to-image tasks +- **Multimodality Comprehension** for multimodality-to-text and multimodality-to-audio tasks +- **TTS** and **TTS Voice Clone** for TTS tasks + +This extension also offers example workflows (at **ComfyUI sidebar -> Templates -> vLLM-Omni**) + +> [!INFO] +> The node UI and feature designs are intended to match vLLM-Omni online serving interfaces. It cannot offer more than what the interfaces support. + +To build a simple workflow yourself, + +- Drag a generation node onto the canvas. +- Depending on your need, grab built-in multimedia file loader nodes, such as **image->Load Image**, **image->video->Load Video**, **audio->Load Audio** +- Depending on your need, grab built-in multimedia file preview nodes, such as **image->Preview Image**, **image->video->Save Video**, **audio->Preview Audio**. For text output, you can install [ComfyUI-Custom-Scripts plugin](https://github.com/pythongosssss/ComfyUI-Custom-Scripts/) and grab its **utils->Show Text 🐍** node. +- If you want to tune sampling parameters, grab corresponding nodes from **vLLM-Omni-> Sampling Params**. + - For multi-stage models, you can connect multiple **AR Sampling Params** and **Diffusion Sampling Params** nodes to a **Multi-Stage Sampling Params List** node, and connect this node to the generation node. + - For some multi-stage models like BAGEL, [only one stage's sampling parameters are exposed and tunable via vLLM-Omni's online serving API](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/examples/online_serving/bagel/). Thus, these models are treated as single-stage ones. Please check the vLLM-Omni documentation on how to correctly set each model's sampling parameters. + - For multi-stage models where all stages are either autoregression or diffusion, you can also connect only a single Sampling Params node, indicating that this set of sampling parameters will be used for all stages. + +**The following features are tested**: + +- Single-node workflows for + - Multimodal Comprehension (e.g., Qwen Omni, BAGEL) + - Text-to-Image Generation (e.g., Qwen-Image) + - Image-to-Image Generation (e.g., Qwen-Image-Edit) + - TTS (e.g., Qwen TTS, including VoiceDesign, VoiceClone, CustomVoice) + +**The following features are not currently tested**. They may work or break. You are welcomed to test it out and offer comments. + +- Multi-node workflow that connects multiple model services together. + +## Screenshots and Examples + +### Multimodal comprehension (e.g., Qwen Omni series, BAGEL) + +(Also available at **ComfyUI sidebar->Template->vLLM-Omni->vLLM-Omni Annotated Example**) + +

+ + + vLLM-Omni Main Architecture + +

+ +> [!TIP] +> Although this node enables all-modality input, you should check whether the specific model you host and request for supports the modalities you connect to the node. + +You can configure per-stage sampling parameters for multi-stage models. + +

+ + + vLLM-Omni Main Architecture + +

+ +### Text-to-image and image-to-image generation (e.g., Z-Image-Turbo, Qwen-Image-Edit, BAGEL) + +(Also available at **ComfyUI sidebar->Template->vLLM-Omni->vLLM-Omni Image Generation**) + +

+ + + vLLM-Omni Main Architecture + +

+ +> [!TIP] +> The node automatically choose text-to-image or image-to-image API endpoints depending on whether you connect an image input or not. + +### TTS (e.g., Qwen TTS series) + +(Also available at **ComfyUI sidebar->Template->vLLM-Omni->vLLM-Omni TTS**) + +

+ + + vLLM-Omni Main Architecture + +

+ +> [!TIP] +> There is a dedicated node for VoiceClone tasks with reference audio input. Other simple text-to-speech tasks should use the regular TTS node. + +## Develop + +Follow the [development convention and rules of vLLM-Omni](https://docs.vllm.ai/projects/vllm-omni/en/latest/contributing/). + +## Limitation and Non-Goals + +- Single server mode only. No automatic load balancing or failover. +- Features set is bounded to vLLM-Omni's online service capability, including + - The types of models supported in online mode, + - The types of sampling parameters supported in the online mode, + - The ways to send files (primarily through full-length base64 in JSON payload), + - Figuring out errors in the payload (such as unsupported fields by a specific model) if the endpoint does not explicitly return an error, + - (The lack of) Authentication + - (The lack of) Progress indicator + +## Support + +If you are new to ComfyUI, please check out [its documentation](https://docs.comfy.org/) for usage instructions. + +If you are new to vLLM-Omni, please also check out [its documentation](https://docs.vllm.ai/projects/vllm-omni/en/latest/) for usage instructions. + +Whenever you find an issue or problem, please + +- First find out if this is an upstream limitation of vLLM-Omni's online serving mode, by [checking their documentation](https://docs.vllm.ai/projects/vllm-omni/en/latest/examples/). +- [Open an issue](https://github.com/vllm-project/vllm-omni/issues) that clearly describes this ComfyUI or online service problem. + +## Acknowledgements + +Features + +- https://github.com/dougbtv/comfyui-vllm-omni/ The official reference implementation for ComfyUI integration with vLLM-Omni's DALL-E compatible image generation API. +- https://github.com/Comfy-Org/ComfyUI/tree/master/comfy_extras ComfyUI's built-in node implementations. + +UI/UX design references + +- https://github.com/sgl-project/sglang/pull/15271 SGLang Diffusion's official ComfyUI integration for image and video generation. +- https://github.com/SXQBW/ComfyUI-Qwen-Omni A third party ComfyUI integration for Qwen Omni series. +- https://github.com/flybirdxx/ComfyUI-Qwen-TTS https://github.com/DarioFT/ComfyUI-Qwen3-TTS Third party ComfyUI integrations for Qwen TTS series. diff --git a/apps/ComfyUI-vLLM-Omni/__init__.py b/apps/ComfyUI-vLLM-Omni/__init__.py new file mode 100644 index 000000000..ffb86ddb3 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/__init__.py @@ -0,0 +1,52 @@ +"""Top-level package for comfyui_vllm_omni.""" # noqa: N999 # This is not a python library intended to be imported + +__all__ = [ + "NODE_CLASS_MAPPINGS", + "NODE_DISPLAY_NAME_MAPPINGS", + "WEB_DIRECTORY", +] + +__author__ = """Zeyu Huang""" +__email__ = "11222265+fhfuih@users.noreply.github.com" +__version__ = "0.0.1" + +from .comfyui_vllm_omni.nodes import ( + VLLMOmniARSampling, + VLLMOmniComprehension, + VLLMOmniDiffusionSampling, + VLLMOmniGenerateImage, + VLLMOmniQwenTTSParams, + VLLMOmniSamplingParamsList, + VLLMOmniTTS, + VLLMOmniVoiceClone, +) + +# A dictionary that contains all nodes you want to export with their names +NODE_CLASS_MAPPINGS = { + # === Generation === + "VLLMOmniGenerateImage": VLLMOmniGenerateImage, + "VLLMOmniComprehension": VLLMOmniComprehension, + "VLLMOmniTTS": VLLMOmniTTS, + "VLLMOmniVoiceClone": VLLMOmniVoiceClone, + # === Params === + "VLLMOmniARSampling": VLLMOmniARSampling, + "VLLMOmniDiffusionSampling": VLLMOmniDiffusionSampling, + "VLLMOmniSamplingParamsList": VLLMOmniSamplingParamsList, + "VLLMOmniQwenTTSParams": VLLMOmniQwenTTSParams, +} + +# A dictionary that contains the friendly/humanly readable titles for the nodes +NODE_DISPLAY_NAME_MAPPINGS = { + # === Generation === + "VLLMOmniGenerateImage": "Generate Image", + "VLLMOmniComprehension": "Multimodality Comprehension", + "VLLMOmniTTS": "TTS (Text to Speech)", + "VLLMOmniVoiceClone": "TTS Voice Cloning", + # === Params === + "VLLMOmniARSampling": "AR Sampling Params", + "VLLMOmniDiffusionSampling": "Diffusion Sampling Params", + "VLLMOmniSamplingParamsList": "Multi-Stage Sampling Params List", + "VLLMOmniQwenTTSParams": "Qwen TTS Params", +} + +WEB_DIRECTORY = "./web" diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/__init__.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/__init__.py new file mode 100644 index 000000000..ebc9c5a59 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/__init__.py @@ -0,0 +1 @@ +# noqa: N999 # This is not a python library intended to be imported diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/nodes.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/nodes.py new file mode 100644 index 000000000..ebc2822df --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/nodes.py @@ -0,0 +1,569 @@ +from typing import Literal, cast + +import torch +from comfy_api.input import AudioInput, VideoInput + +from .utils.api_client import VLLMOmniClient +from .utils.logger import get_logger +from .utils.models import lookup_model_spec +from .utils.types import AudioFormat +from .utils.validators import ( + add_sampling_parameters_to_stage, + validate_model_and_sampling_params_types, +) + +logger = get_logger(__name__) + + +class _VLLMOmniGenerateBase: + """Base class for vLLM-Omni generation nodes with shared functionality.""" + + CATEGORY = "vLLM-Omni" + + @classmethod + def VALIDATE_INPUTS(cls, url, model) -> str | Literal[True]: + """ + Can only validate this model's own input. Cannot check inputs from other nodes. + See: https://docs.comfy.org/custom-nodes/backend/server_overview#validate_inputs + """ + if not url: + return "URL must not be empty" + if not model: + return "Model must not be empty" + return True + + +class VLLMOmniGenerateImage(_VLLMOmniGenerateBase): + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "url": ("STRING", {"default": "http://localhost:8000/v1"}), + "model": ("STRING", {"default": "Tongyi-MAI/Z-Image-Turbo"}), + "prompt": ("STRING", {"multiline": True}), + "negative_prompt": ("STRING", {"multiline": True, "default": ""}), + "width": ("INT", {"default": 512, "min": 64, "max": 2048}), + "height": ("INT", {"default": 512, "min": 64, "max": 2048}), + }, + "optional": { + "image": ("IMAGE",), + "mask": ("MASK",), + # "video": ("VIDEO",), + # "audio": ("AUDIO",), + "sampling_params": ("SAMPLING_PARAMS",), + }, + } + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("image",) + FUNCTION = "generate" + + async def generate( + self, + url: str, + model: str, + prompt: str, + width: int, + height: int, + negative_prompt: str | None = None, + image: torch.Tensor | None = None, + mask: torch.Tensor | None = None, + audio: AudioInput | None = None, # Hidden & unused + video: VideoInput | None = None, # Hidden & unused + sampling_params: dict | list[dict] | None = None, + **kwargs, + ): + logger.info("Uncaught kwargs: %s", kwargs) + logger.debug("Got sampling params: %s", sampling_params) + validate_model_and_sampling_params_types(model, sampling_params) + if image is None and mask is not None: + raise ValueError("Mask input provided without an image input.") + + client = VLLMOmniClient(url) + + spec, pattern = lookup_model_spec(model) + is_bagel = pattern is not None and "bagel" in pattern.lower() + + # Prefer DALL-E compatible API for simple (one-stage) diffusion models + if (spec is None or spec["stages"] == ["diffusion"]) and not is_bagel: + sampling_params = cast(dict | None, sampling_params) + if audio is None and image is None and video is None: + # No multimodal input --- use DALL-E image generation + logger.info("Using DALL-E image generation endpoint") + output = await client.generate_image( + model=model, + prompt=prompt, + width=width, + height=height, + negative_prompt=negative_prompt, + sampling_params=sampling_params, + ) + return (output,) + elif image is not None and audio is None and video is None: + # Image and text input --- use DALL-E image edit + logger.info("Using DALL-E image edit endpoint") + output = await client.edit_image( + model=model, + prompt=prompt, + image=image, + width=width, + height=height, + negative_prompt=negative_prompt, + mask=mask, + sampling_params=sampling_params, + ) + return (output,) + + logger.info("Using chat completion endpoint") + sampling_params = add_sampling_parameters_to_stage( + model, sampling_params, "diffusion", width=width, height=height + ) + logger.debug("Edited sampling params: %s", sampling_params) + + output = await client.generate_image_chat_completion( + model=model, + prompt=prompt, + negative_prompt=negative_prompt, + image=image, + audio=audio, + video=video, + sampling_params=sampling_params, + ) + + return (output,) + + +class VLLMOmniComprehension(_VLLMOmniGenerateBase): + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "url": ("STRING", {"default": "http://localhost:8000/v1"}), + "model": ("STRING", {"default": "Qwen/Qwen2.5-Omni-7B"}), + "prompt": ("STRING", {"multiline": True}), + "output_text": ("BOOLEAN", {"default": True}), + "output_audio": ("BOOLEAN", {"default": True}), + "use_audio_in_video": ("BOOLEAN", {"default": True}), + }, + "optional": { + "image": ("IMAGE",), + "video": ("VIDEO",), + "audio": ("AUDIO",), + "sampling_params": ("SAMPLING_PARAMS",), + }, + } + + RETURN_TYPES = ("STRING", "AUDIO") + RETURN_NAMES = ("text_response", "audio_response") + FUNCTION = "generate" + + @classmethod + def VALIDATE_INPUTS(cls, url, model, output_text, output_audio) -> str | Literal[True]: # type: ignore[reportIncompatibleMethodOverride] + super_validation = super().VALIDATE_INPUTS(url, model) + if isinstance(super_validation, str): + return super_validation + if not output_text and not output_audio: + return "At least one of output_text or output_audio must be True." + return True + + async def generate( + self, + url: str, + model: str, + prompt: str, + image: torch.Tensor | None = None, + audio: AudioInput | None = None, + video: VideoInput | None = None, + sampling_params: dict | list[dict] | None = None, + output_text: bool = True, + output_audio: bool = True, + use_audio_in_video: bool = True, + **kwargs, + ) -> tuple[str, AudioInput]: + logger.info("Uncaught kwargs: %s", kwargs) + logger.debug("Got sampling params: %s", sampling_params) + validate_model_and_sampling_params_types(model, sampling_params) + + client = VLLMOmniClient(url) + spec, pattern = lookup_model_spec(model) + is_bagel = pattern is not None and "bagel" in pattern.lower() + + if is_bagel: + # A lot of special handlings here... + if output_audio: + raise ValueError("BAGEL models do not support audio output.") + if audio is not None or video is not None: + raise ValueError("BAGEL models do not support audio or video input.") + ( + text_response, + _, + ) = await client.generate_comprehension_chat_completion( + model=model, + prompt=prompt, + image=image, + audio=None, + video=None, + sampling_params=sampling_params, + modalities=["text"], + ) + else: + modalities = [] + if output_text: + modalities.append("text") + if output_audio: + modalities.append("audio") + + if use_audio_in_video and video is not None: + use_audio_in_video = True + else: + use_audio_in_video = False + + ( + text_response, + audio, + ) = await client.generate_comprehension_chat_completion( + model=model, + prompt=prompt, + image=image, + audio=audio, + video=video, + sampling_params=sampling_params, + modalities=modalities, + # == extra kwargs == + mm_processor_kwargs={"use_audio_in_video": use_audio_in_video}, + ) + + if text_response is None: + text_response = "" + if audio is None: + channels = 1 + duration = 1 + sample_rate = 44100 + num_samples = int(round(duration * sample_rate)) + waveform = torch.zeros((1, channels, num_samples), dtype=torch.float32) + audio = {"waveform": waveform, "sample_rate": sample_rate} + + return (text_response, audio) + + +class VLLMOmniTTS(_VLLMOmniGenerateBase): + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "url": ("STRING", {"default": "http://localhost:8000/v1"}), + "model": ( + "STRING", + {"default": "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice"}, + ), + "input": ("STRING", {"multiline": True}), + "voice": ("STRING", {"default": "Vivian"}), + "response_format": (["mp3", "opus", "aac", "flac", "wav", "pcm"],), + "speed": ( + "FLOAT", + {"default": 1.0, "min": 0.25, "max": 4.0, "step": 0.01}, + ), + }, + "optional": { + "model_specific_params": ("TTS_PARAMS",), + }, + } + + RETURN_TYPES = ("AUDIO",) + RETURN_NAMES = ("audio",) + FUNCTION = "generate" + + async def generate( + self, + url: str, + model: str, + input: str, + voice: str, + response_format: AudioFormat, + speed: float, + model_specific_params: dict | None, + **kwargs, + ) -> tuple[AudioInput]: + logger.info("Got extra kwargs in TTS: %s", kwargs) + + is_qwen_tts = "qwen3-tts" in model.lower() + extra_params_type = None if model_specific_params is None else model_specific_params["type"] + if not is_qwen_tts and extra_params_type == "qwen-tts": + raise ValueError( + "You have provided Qwen-specific TTS params." + "However, the model appears to not be a Qwen TTS model (no 'Qwen3-TTS' in model name)." + ) + + combined_params = {**kwargs, **(model_specific_params or {})} + combined_params.pop("type", None) # Internal fields in model_specific_params + + client = VLLMOmniClient(url) + + audio = await client.generate_speech( + model=model, + input=input, + voice=voice, + response_format=response_format, + speed=speed, + **combined_params, + ) + return (audio,) + + +class VLLMOmniVoiceClone(_VLLMOmniGenerateBase): + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "url": ("STRING", {"default": "http://localhost:8000/v1"}), + "model": ("STRING", {"default": "Qwen/Qwen3-TTS-12Hz-1.7B-Base"}), + "input": ("STRING", {"multiline": True}), + "voice": ("STRING", {"default": "Vivian"}), + "response_format": (["mp3", "opus", "aac", "flac", "wav", "pcm"],), + "speed": ( + "FLOAT", + {"default": 1.0, "min": 0.25, "max": 4.0, "step": 0.01}, + ), + "ref_audio": ("AUDIO",), + "ref_text": ("STRING", {"multiline": True}), + "x_vector_only_mode": ("BOOLEAN", {"default": False}), + }, + "optional": { + "model_specific_params": ("TTS_PARAMS",), + }, + } + + RETURN_TYPES = ("AUDIO",) + RETURN_NAMES = ("audio",) + FUNCTION = "generate" + + async def generate( + self, + url: str, + model: str, + input: str, + voice: str, + response_format: AudioFormat, + speed: float, + ref_audio: AudioInput, + ref_text: str, + x_vector_only_mode: bool, + model_specific_params: dict | None, + **kwargs, + ): + is_qwen_tts = "qwen3-tts" in model.lower() + extra_params_type = None if model_specific_params is None else model_specific_params["type"] + if not is_qwen_tts and extra_params_type == "qwen-tts": + raise ValueError( + "You have provided Qwen-specific TTS params." + "However, the model appears to not be a Qwen TTS model (no 'Qwen3-TTS' in model name)." + ) + + combined_params = { + "ref_audio": ref_audio, + "ref_text": ref_text, + "x_vector_only_mode": x_vector_only_mode, + **kwargs, + **(model_specific_params or {}), + } + combined_params.pop("type", None) # Internal fields in model_specific_params + + client = VLLMOmniClient(url) + + audio = await client.generate_speech( + model=model, + input=input, + voice=voice, + response_format=response_format, + speed=speed, + **combined_params, + ) + return (audio,) + + +class VLLMOmniARSampling: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "max_tokens": ("INT", {"default": 100, "min": 1, "max": 10000}), + "temperature": ( + "FLOAT", + {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.01}, + ), + "top_p": ( + "FLOAT", + {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}, + ), + "repetition_penalty": ( + "FLOAT", + {"default": 1.0, "min": 0.0, "max": 5.0, "step": 0.01}, + ), + # === Put seed at last. === + # Whenever a field named "seed" is present, ComfyUI adds another field called "control after generate" + "seed": ( + "INT", + { + "default": -1, + "min": -1, + "step": 1, + "tooltip": "-1 means to not provide a seed.", + }, + ), + } + } + + RETURN_TYPES = ("SAMPLING_PARAMS",) + RETURN_NAMES = ("AR sampling params",) + FUNCTION = "get_params" + CATEGORY = "vLLM-Omni/Sampling Params" + + def get_params(self, seed, **kwargs): + params = { + "type": "autoregression", # for internal use, removed before sending the request + **kwargs, + } + if seed >= 0: + params["seed"] = seed + return (params,) + + +class VLLMOmniDiffusionSampling: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "n": ( + "INT", + { + "default": 1, + "min": 0, + "max": 10, + "step": 1, + "tooltip": "Number of images to generate", + }, + ), + "num_inference_steps": ( + "INT", + { + "default": 50, + "min": 1, + "max": 1000, + "tooltip": "Number of denoising steps (higher = better quality, slower).", + }, + ), + "guidance_scale": ( + "FLOAT", + { + "default": 7.5, + "min": 0.0, + "max": 20.0, + "step": 0.1, + "tooltip": "Classifier-free guidance scale (higher = more prompt adherence).", + }, + ), + "true_cfg_scale": ( + "FLOAT", + { + "default": 1.0, + "min": 0.0, + "max": 20.0, + "step": 0.5, + "tooltip": "True CFG scale for advanced control (model-specific).", + }, + ), + "vae_use_slicing": ( + "BOOLEAN", + { + "default": False, + "tooltip": "Enable VAE slicing for reduced memory usage (slight quality trade-off)", + }, + ), + # === Put seed at last. === + # Whenever a field named "seed" is present, ComfyUI adds another field called "control after generate" + "seed": ( + "INT", + { + "default": -1, + "min": -1, + "step": 1, + "tooltip": "-1 means to not provide a seed.", + }, + ), + } + } + + RETURN_TYPES = ("SAMPLING_PARAMS",) + RETURN_NAMES = ("diffusion sampling params",) + FUNCTION = "get_params" + CATEGORY = "vLLM-Omni/Sampling Params" + + def get_params(self, seed, **kwargs): + params = { + "type": "diffusion", # for internal use, removed before sending the request + **kwargs, + } + if seed >= 0: + params["seed"] = seed + return (params,) + + +class VLLMOmniSamplingParamsList: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "param1": ("SAMPLING_PARAMS",), + }, + "optional": { + "param2": ("SAMPLING_PARAMS",), + "param3": ("SAMPLING_PARAMS",), + }, + } + + RETURN_TYPES = ("SAMPLING_PARAMS",) + RETURN_NAMES = ("param list",) + FUNCTION = "aggregate" + CATEGORY = "vLLM-Omni/Sampling Params" + + def aggregate(self, param1: dict, param2: dict | None = None, param3: dict | None = None): + for i, p in enumerate((param1, param2, param3)): + if isinstance(p, list): + raise ValueError( + f"Input {i} is a Multi-Stage Sampling Params List. " + f"Expected a single sampling parameters node (either AR or Diffusion)." + ) + + params = [param1] + if param2 is not None: + params.append(param2) + if param3 is not None: + params.append(param3) + return (params,) + + +class VLLMOmniQwenTTSParams: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "task_type": ( + ["CustomVoice", "VoiceDesign", "Base"], + {"default": "CustomVoice"}, + ), + "language": ( + ["Auto", "Chinese", "English", "Japanese", "Korean"], + {"default": "Auto"}, + ), + "instructions": ("STRING", {"multiline": True}), + "max_new_tokens": ("INT", {"default": 2048, "min": 1}), + } + } + + RETURN_TYPES = ("TTS_PARAMS",) + RETURN_NAMES = ("Qwen TTS params",) + FUNCTION = "get_params" + CATEGORY = "vLLM-Omni/TTS Params" + + def get_params(self, **kwargs): + return ({"type": "qwen-tts", **kwargs},) diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/api_client.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/api_client.py new file mode 100644 index 000000000..c5372641f --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/api_client.py @@ -0,0 +1,473 @@ +""" +An high-level API client adapter that forwards ComfyUI inputs to vLLM-Omni's REST API, +and transforms the API responses back to ComfyUI formats. + +The image generation part is derived from dougbtv/comfyui-vllm-omni by Doug (@dougbtv). +Original source at https://github.com/dougbtv/comfyui-vllm-omni, distributed under the MIT License. +""" + +from typing import Any + +import aiohttp +import av.error +import torch +from comfy_api.input import AudioInput, VideoInput + +from .format import ( + audio_to_base64, + base64_to_audio, + base64_to_image_tensor, + bytes_to_audio, + image_tensor_to_base64, + image_tensor_to_png_bytes, + video_to_base64, +) +from .logger import get_logger, pretty_printer +from .models import lookup_model_spec +from .types import AudioFormat + +logger = get_logger(__name__) + + +class VLLMOmniClient: + def __init__(self, base_url: str, timeout: float = 300.0): + self.base_url = base_url + self.timeout = aiohttp.ClientTimeout(total=timeout) + + async def generate_image( + self, + *, + model: str, + prompt: str, + width: int, + height: int, + negative_prompt: str | None = None, + sampling_params: dict | None = None, + ) -> torch.Tensor: + """Run text-to-image generation via DALLE API""" + await self._check_model_exist(model) + + size = f"{width}x{height}" + payload = { + "model": model, + "prompt": prompt, + "size": size, + "response_format": "b64_json", + } + if negative_prompt: + payload["negative_prompt"] = negative_prompt + if sampling_params is not None: + # Only select specific sampling params + for k in ( + "n", + "num_inference_steps", + "guidance_scale", + "true_cfg_scale", + "vae_use_slicing", + ): + if k in sampling_params and sampling_params[k] is not None: + payload[k] = sampling_params[k] + logger.debug("img gen payload: %s", payload) + + url = self.base_url + "/images/generations" + async with aiohttp.ClientSession(timeout=self.timeout) as session: + try: + async with session.post( + url, + json=payload, + headers={"Content-Type": "application/json"}, + ) as response: + if not response.ok: + error_text = await response.text() + raise (ValueError if response.status < 500 else RuntimeError)( + f"vLLM-Omni API returned status {response.status}: {error_text}" + ) + + try: + data = await response.json() + except aiohttp.ContentTypeError as e: + raise RuntimeError(f"Invalid JSON response from vLLM-Omni: {e}") + if "data" not in data: + raise RuntimeError("API response missing 'data' field - expected OpenAI DALL-E format") + if not data["data"]: + raise RuntimeError("API returned empty data array") + + image_tensors = [] + for idx, img in enumerate(data["data"]): + if "b64_json" not in img: + raise RuntimeError(f"API returned image #{idx} without 'b64_json' field") + base64_str = img["b64_json"] + tensor = base64_to_image_tensor(base64_str) + image_tensors.append(tensor) + logger.debug("Image #%d has shape %s", idx, tensor.shape) + + batch_tensor = torch.stack(image_tensors, dim=0) + logger.debug("batch_tensor output has shape: %s", batch_tensor.shape) + return batch_tensor + + except aiohttp.ClientError as e: + raise RuntimeError(f"Network error connecting to vLLM-Omni at {url}: {e}") + + async def edit_image( + self, + *, + model: str, + prompt: str, + image: torch.Tensor, + width: int, + height: int, + negative_prompt: str | None = None, + mask: torch.Tensor | None = None, + sampling_params: dict | None = None, + ) -> torch.Tensor: + """Run image editing via DALLE API""" + await self._check_model_exist(model) + + size = f"{width}x{height}" + image_filename = "image.png" # Required for multipart form + form = aiohttp.FormData() + form.add_field("model", model) + form.add_field( + "image", + image_tensor_to_png_bytes(image, image_filename), + filename=image_filename, + content_type="image/png", + ) + form.add_field("prompt", prompt) + form.add_field("size", size) + if negative_prompt: + form.add_field("negative_prompt", negative_prompt) + if sampling_params is not None: + # Only select specific sampling params + for k in ("n", "num_inference_steps", "guidance_scale", "true_cfg_scale"): + if k in sampling_params and sampling_params[k] is not None: + form.add_field(k, str(sampling_params[k])) + if mask is not None: + mask_filename = "mask.png" + form.add_field( + "mask", + image_tensor_to_png_bytes(mask, mask_filename), + filename=mask_filename, + content_type="image/png", + ) + + url = self.base_url + "/images/edits" + async with aiohttp.ClientSession(timeout=self.timeout) as session: + try: + async with session.post(url, data=form) as response: + if not response.ok: + error_text = await response.text() + raise (ValueError if response.status < 500 else RuntimeError)( + f"vLLM-Omni API returned status {response.status}: {error_text}" + ) + + try: + data = await response.json() + except aiohttp.ContentTypeError as e: + raise RuntimeError(f"Invalid JSON response from vLLM-Omni: {e}") + + if "data" not in data: + raise RuntimeError("API response missing 'data' field - expected OpenAI DALL-E format") + if not data["data"]: + raise RuntimeError("API returned empty data array") + + image_tensors = [] + for idx, img in enumerate(data["data"]): + if "b64_json" not in img: + raise RuntimeError(f"API returned image #{idx} without 'b64_json' field") + base64_str = img["b64_json"] + tensor = base64_to_image_tensor(base64_str) + image_tensors.append(tensor) + + return torch.stack(image_tensors, dim=0) + + except aiohttp.ClientError as e: + raise RuntimeError(f"Network error connecting to vLLM-Omni at {url}: {e}") + + async def generate_image_chat_completion( + self, + *, + model: str, + prompt: str, + negative_prompt: str | None = None, + image: torch.Tensor | None = None, + audio: AudioInput | None = None, + video: VideoInput | None = None, + sampling_params: dict | list[dict] | None = None, + ) -> torch.Tensor: + payload = VLLMOmniClient._prepare_chat_completion_messages( + model=model, + prompt=prompt, + negative_prompt=negative_prompt, + image=image, + audio=audio, + video=video, + sampling_params=sampling_params, + modalities=["image"], + ) + choices = await self._generate_base_chat_completion(model, payload) + + image_tensors = [] + for idx, img_content in enumerate(choices[0]["message"]["content"]): + base64_str = img_content.get("image_url", {}).get("url", "") + if not base64_str: + raise RuntimeError(f"API returned image #{idx} without image url") + tensor = base64_to_image_tensor(base64_str) + image_tensors.append(tensor) + + return torch.stack(image_tensors, dim=0) + + async def generate_comprehension_chat_completion( + self, + *, + model: str, + prompt: str, + image: torch.Tensor | None = None, + audio: AudioInput | None = None, + video: VideoInput | None = None, + sampling_params: dict | list[dict] | None = None, + modalities: list[str] = ["text", "audio"], + **extra_body, + ) -> tuple[str | None, AudioInput | None]: + # Response may contain two choices: one with text, one with audio + payload = VLLMOmniClient._prepare_chat_completion_messages( + model=model, + prompt=prompt, + negative_prompt=None, + image=image, + audio=audio, + video=video, + sampling_params=sampling_params, + modalities=modalities, + **extra_body, + ) + + choices = await self._generate_base_chat_completion(model, payload) + text_response = None + audio_base64 = None + for choice in choices: + try: + text_response = choice["message"]["content"] + except (KeyError, TypeError): + # Either this case (text response) or the audio response case will be hit. Checking None's later. + pass + try: + audio_base64 = choice["message"]["audio"]["data"] + except (KeyError, TypeError): + # Either this case (text response) or the audio response case will be hit. Checking None's later. + pass + if audio_base64 is None and text_response is None: + raise RuntimeError( + "API response missing both '.message.audio' and 'message.content' fields." + f"The choices object is {choices}" + ) + if audio_base64 is not None: + audio = base64_to_audio(audio_base64) + logger.debug( + "audio sample rate %d, audio shape %s, duration in second %f", + audio["sample_rate"], + audio["waveform"].shape, + audio["waveform"].shape[2] / audio["sample_rate"], + ) + else: + audio = None + return text_response, audio + + async def generate_speech( + self, + *, + model: str, + input: str, + voice: str, + response_format: AudioFormat, + speed: float, + **extra_params, + ) -> AudioInput: + await self._check_model_exist(model) + + ref_audio: AudioInput | None = extra_params.pop("ref_audio", None) + + payload = { + "model": model, + "input": input, + "voice": voice, + "response_format": response_format, + "speed": speed, + **extra_params, + } + + if ref_audio is not None: + audio_base64 = audio_to_base64(ref_audio) + payload["ref_audio"] = audio_base64 + + logger.debug("Omni TTS payload: %s", pretty_printer.pformat(payload)) + + url = self.base_url + "/audio/speech" + async with aiohttp.ClientSession(timeout=self.timeout) as session: + try: + async with session.post( + url, + json=payload, + headers={"Content-Type": "application/json"}, + ) as response: + if not response.ok: + error_text = await response.text() + raise (ValueError if response.status < 500 else RuntimeError)( + f"vLLM-Omni API returned status {response.status}: {error_text}" + ) + + try: + audio_bytes = await response.read() + except aiohttp.ContentTypeError as e: + raise RuntimeError(f"Invalid JSON response from vLLM-Omni: {e}") + + try: + audio = bytes_to_audio(audio_bytes) + except av.error.InvalidDataError as e: + raise ValueError( + f"Invalid audio data received from vLLM-Omni: {e}" + "Check if you have input unsupported arguments (such as 'voice')" + ) + return audio + + except aiohttp.ClientError as e: + raise RuntimeError(f"Network error connecting to vLLM-Omni at {url}: {e}") + + async def _generate_base_chat_completion(self, model: str, payload: dict[str, Any]) -> list[dict[str, Any]]: + logger.debug("Omni payload: %s", pretty_printer.pformat(payload)) + await self._check_model_exist(model) + + url = self.base_url + "/chat/completions" + async with aiohttp.ClientSession(timeout=self.timeout) as session: + try: + async with session.post( + url, + json=payload, + headers={"Content-Type": "application/json"}, + ) as response: + if not response.ok: + error_text = await response.text() + raise (ValueError if response.status < 500 else RuntimeError)( + f"vLLM-Omni API returned status {response.status}: {error_text}" + ) + + try: + data = await response.json() + except aiohttp.ContentTypeError as e: + raise RuntimeError(f"Invalid JSON response from vLLM-Omni: {e}") + + logger.debug( + "chat completion response: %s", + pretty_printer.pformat(data), + ) + + try: + return data["choices"] + except (KeyError, TypeError): + raise RuntimeError("Invalid JSON response from vLLM-Omni: missing 'choices' field") + + except aiohttp.ClientError as e: + raise RuntimeError(f"Network error connecting to vLLM-Omni at {self.base_url}: {e}") + + async def _check_model_exist(self, model: str): + url = self.base_url + "/models" + async with aiohttp.ClientSession(timeout=self.timeout) as session: + try: + async with session.get( + url, + headers={"Content-Type": "application/json"}, + ) as response: + if not response.ok: + error_text = await response.text() + raise (ValueError if response.status < 500 else RuntimeError)( + f"vLLM-Omni API returned status {response.status} " + f"when getting hosted model list: {error_text}" + ) + + try: + data = await response.json() + except aiohttp.ContentTypeError as e: + raise RuntimeError(f"Invalid JSON response when getting hosted model list from vLLM-Omni: {e}") + + except aiohttp.ClientError as e: + raise RuntimeError(f"Network error connecting to vLLM-Omni at {self.base_url}: {e}") + try: + model_list = data["data"] + model_found = next((True for m in model_list if m["id"] == model), False) + except (KeyError, TypeError): + raise RuntimeError(f"Invalid JSON response of the hosted model list: {data}") + + if not model_found: + raise ValueError(f"Model {model} not served at {self.base_url}.") + + @staticmethod + def _prepare_chat_completion_messages( + *, + model: str, + prompt: str, + negative_prompt: str | None, + image: torch.Tensor | None = None, + audio: AudioInput | None = None, + video: VideoInput | None = None, + sampling_params: dict | list[dict] | None = None, + modalities: list[str] | None = None, # diffusion don't have this field + **extra_body, + ): + message_content: list[dict] = [{"type": "text", "text": prompt}] + if image is not None: + message_content.append( + { + "type": "image_url", + "image_url": {"url": image_tensor_to_base64(image)}, + } + ) + if audio is not None: + message_content.append({"type": "audio_url", "audio_url": {"url": audio_to_base64(audio)}}) + if video is not None: + message_content.append({"type": "video_url", "video_url": {"url": video_to_base64(video)}}) + messages = [{"role": "user", "content": message_content}] + + combined_extra_body: dict[str, Any] = {} + if sampling_params is not None: + spec, _ = lookup_model_spec(model) + is_single_sampling_param = isinstance(sampling_params, dict) or len(sampling_params) == 1 + + # Exclude internal key + if isinstance(sampling_params, dict): + sampling_params = {k: v for k, v in sampling_params.items() if k != "type"} + else: + sampling_params = [{k: v for k, v in sp.items() if k != "type"} for sp in sampling_params] + + if (spec is None and is_single_sampling_param) or (spec is not None and spec["stages"] == ["diffusion"]): + # Diffusion format: extra_body directly contains sampling params. + # Validation should have taken care of matching sampling params' types. + # * Use this mode if the model is a simple one-stage diffusion model. + # * Fallback to this mode if model is not registered and a single sampling param is provided. + sampling_params = sampling_params if isinstance(sampling_params, dict) else sampling_params[0] + combined_extra_body: dict[str, Any] = {**sampling_params} + if "n" in combined_extra_body: + combined_extra_body["num_outputs_per_prompt"] = combined_extra_body["n"] + del combined_extra_body["n"] + else: + # Use AR style payload, extra_body has a sampling_params_list field + combined_extra_body: dict[str, Any] = {"sampling_params_list": sampling_params} + + if negative_prompt: + combined_extra_body["negative_prompt"] = negative_prompt + + if extra_body: + combined_extra_body.update(extra_body) + + payload: dict[str, Any] = {"messages": messages, "model": model} + if combined_extra_body: + payload["extra_body"] = combined_extra_body + if modalities: + payload["modalities"] = modalities + + spec, _ = lookup_model_spec(model) + if spec: + preprocessor = spec.get("payload_preprocessor", None) + if preprocessor is not None: + payload = preprocessor(payload) + + return payload diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/format.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/format.py new file mode 100644 index 000000000..0ddf86f9c --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/format.py @@ -0,0 +1,230 @@ +"""Image/tensor format helpers. + +The image generation part is derived from dougbtv/comfyui-vllm-omni by Doug (@dougbtv). +Original source at https://github.com/dougbtv/comfyui-vllm-omni, distributed under the MIT License. +""" + +import base64 +import mimetypes +from io import BytesIO + +import av +import numpy as np +import torch +from comfy_api.input import AudioInput, VideoInput +from comfy_extras import nodes_audio +from PIL import Image + +from .logger import get_logger + +logger = get_logger(__name__) + + +def base64_to_image_tensor(base64_str: str, mode: str = "RGB") -> torch.Tensor: + """ + Convert base64-encoded image to ComfyUI image tensor. + + Args: + base64_str: Base64-encoded image string + mode: PIL image mode (default RGB for transparency support) + + Returns: + torch.Tensor with shape (1, H, W, C) in float32 [0, 1] range + + Raises: + ValueError: If base64 string is invalid or image cannot be decoded + """ + if base64_str.startswith("data:image"): + _, base64_str = base64_str.split(",", 1) + + try: + # Decode base64 to bytes + image_bytes = base64.b64decode(base64_str) + except Exception as e: + raise ValueError(f"Invalid base64 string: {e}") + + # Create BytesIO object for PIL + image_bytesio = BytesIO(image_bytes) + + # Open with PIL and convert to desired mode + try: + pil_image = Image.open(image_bytesio) + pil_image = pil_image.convert(mode) + except Exception as e: + raise RuntimeError(f"Failed to open image: {e}") + + image_array = np.asarray(pil_image).astype(np.float32) / 255.0 + image_tensor = torch.from_numpy(image_array) + return image_tensor + + +def image_tensor_to_png_bytes(tensor: torch.Tensor, filename: str = "image.png") -> BytesIO: + """ + Convert ComfyUI image tensor to PNG BytesIO for multipart upload. + + This function converts a ComfyUI IMAGE tensor to a PNG-encoded BytesIO object + suitable for multipart/form-data upload. The BytesIO object has its .name + attribute set, which is required by aiohttp for file uploads. + + Args: + tensor: ComfyUI IMAGE tensor with shape (B, H, W, C), dtype float32, range [0, 1] + filename: Name attribute to set on BytesIO (default: "image.png") + + Returns: + BytesIO object containing PNG-encoded image with .name attribute set + + Raises: + ValueError: If tensor format is invalid (not 4D, wrong dtype, etc.) + """ + if tensor.ndim != 4: + raise ValueError(f"Expected 4D tensor with shape (B, H, W, C), got {tensor.ndim}D tensor") + + image_tensor = tensor[0] # Shape: (H, W, C) + image_np = (image_tensor.cpu().numpy() * 255.0).astype(np.uint8) + pil_image = Image.fromarray(image_np) + + # Save to BytesIO as image file + img_bytes = BytesIO() + # Set name attribute (required for multipart upload and mimetype detection) + img_bytes.name = filename + try: + pil_image.save(img_bytes) + except Exception as e: + raise RuntimeError(f"Failed to save image as file: {e}") + + # Reset position to beginning + img_bytes.seek(0) + + return img_bytes + + +def image_tensor_to_base64(tensor: torch.Tensor, filename: str = "image.png") -> str: + """ + Convert ComfyUI image tensor to base64-encoded image string. + + Args: + tensor: ComfyUI IMAGE tensor with shape (B, H, W, C), dtype float32, range [0, 1] + filename: Name attribute to set on BytesIO (default: "image.png") + format: File format of the output image file buffer (default: "PNG") + + Returns: + Base64-encoded image string + + Raises: + ValueError: If tensor format is invalid (not 4D, wrong dtype, etc.) + """ + img_bytes = image_tensor_to_png_bytes(tensor, filename) + img_bytes.seek(0) + byte_data = img_bytes.read() + base64_str = base64.b64encode(byte_data).decode("utf-8") + mime_type = mimetypes.guess_type(filename)[0] or "application/octet-stream" + return f"data:{mime_type};base64,{base64_str}" + + +def video_to_bytes(video: VideoInput, filename: str = "video.mp4") -> BytesIO: + output_buffer = BytesIO() + output_buffer.name = filename + video.save_to(output_buffer) + output_buffer.seek(0) + return output_buffer + + +def video_to_base64(video: VideoInput, filename: str = "video.mp4") -> str: + video_buffer = video_to_bytes(video, filename) + video_buffer.seek(0) + byte_data = video_buffer.read() + base64_str = base64.b64encode(byte_data).decode("utf-8") + mime_type = mimetypes.guess_type(filename)[0] or "application/octet-stream" + return f"data:{mime_type};base64,{base64_str}" + + +def audio_to_bytes(audio: AudioInput, filename: str = "audio.mp3", quality: str = "128k") -> BytesIO: + waveform = audio["waveform"][0] # Shape: (C, T) + sample_rate = audio["sample_rate"] + format = filename.rsplit(".", maxsplit=1)[1] + layout = "mono" if waveform.shape[0] == 1 else "stereo" + + output_buffer = BytesIO() + output_buffer.name = filename + output_container = av.open(output_buffer, mode="w", format=format) + if format == "opus": + out_stream = output_container.add_stream("libopus", rate=sample_rate, layout=layout) + if quality == "64k": + out_stream.bit_rate = 64000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif quality == "96k": + out_stream.bit_rate = 96000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif quality == "128k": + out_stream.bit_rate = 128000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif quality == "192k": + out_stream.bit_rate = 192000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif quality == "320k": + out_stream.bit_rate = 320000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif format == "mp3": + out_stream = output_container.add_stream("libmp3lame", rate=sample_rate, layout=layout) + if quality == "V0": + out_stream.codec_context.qscale = 1 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif quality == "128k": + out_stream.bit_rate = 128000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + elif quality == "320k": + out_stream.bit_rate = 320000 # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + else: # format == "flac": + out_stream = output_container.add_stream("flac", rate=sample_rate, layout=layout) + + frame = av.AudioFrame.from_ndarray( + waveform.movedim(0, 1).reshape(1, -1).float().numpy(), + format="flt", + layout=layout, + ) + frame.sample_rate = sample_rate + frame.pts = 0 + output_container.mux(out_stream.encode(frame)) # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + # Flush encoder + output_container.mux(out_stream.encode(None)) # type: ignore # copy from ComfyUI comfy_api/latest/_ui.py + output_container.close() + output_buffer.seek(0) + + return output_buffer + + +def audio_to_base64(audio: AudioInput, filename: str = "audio.mp3", quality: str = "128k") -> str: + audio_buffer = audio_to_bytes(audio, filename, quality) + audio_buffer.seek(0) + byte_data = audio_buffer.read() + base64_str = base64.b64encode(byte_data).decode("utf-8") + mime_type = mimetypes.guess_type(filename)[0] or "application/octet-stream" + return f"data:{mime_type};base64,{base64_str}" + + +def bytes_to_audio(audio_bytes: bytes) -> AudioInput: + """ + Convert audio bytes to ComfyUI audio tensor. + + Args: + audio_bytes: Audio file bytes + Returns: + torch.Tensor with shape (B, C, T) in float32 range [-1, 1] + """ + audio_buffer = BytesIO(audio_bytes) + waveform, sample_rate = nodes_audio.load(audio_buffer) # type: ignore # Although expect string argument, it calls av.open underneath, which supports BytesIO (file-like) + return {"waveform": waveform.unsqueeze(0), "sample_rate": sample_rate} + + +def base64_to_audio(base64_str: str) -> AudioInput: + """ + Convert base64-encoded audio to ComfyUI audio tensor. + + Args: + base64_str: Base64-encoded audio string + Returns: + torch.Tensor with shape (B, C, T) in float32 range [-1, 1] + """ + if base64_str.startswith("data:audio"): + _, base64_str = base64_str.split(",", 1) + + try: + # Decode base64 to bytes + audio_bytes = base64.b64decode(base64_str) + except Exception as e: + raise ValueError(f"Invalid base64 string: {e}") + + return bytes_to_audio(audio_bytes) diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/logger.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/logger.py new file mode 100644 index 000000000..cad640f4d --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/logger.py @@ -0,0 +1,125 @@ +"""Centralized logger configuration for vLLM-Omni ComfyUI.""" + +import logging +import pprint +import sys +from typing import Any + + +def get_logger(name: str) -> logging.Logger: + """ + Get or create a logger with proper formatting. + + Args: + name: Logger name (typically __name__ of the calling module) + + Returns: + Configured logger instance + """ + logger = logging.getLogger(name) + + # Only configure if not already configured + if not logger.handlers: + logger.setLevel(logging.DEBUG) + + # Create console handler + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.INFO) + + # Create formatter + formatter = logging.Formatter( + fmt="(ComfyUI-vLLM-Omni) [%(levelname)s] %(asctime)s [%(filename)s:%(lineno)s] %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + handler.setFormatter(formatter) + + # Add handler to logger + logger.addHandler(handler) + + # Prevent propagation to root logger + logger.propagate = False + + return logger + + +class OmitBase64PrettyPrinter(pprint.PrettyPrinter): + """ + A PrettyPrinter that redacts specific field names with '...' + wherever they appear in nested structures. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def _format(self, obj: Any, stream, indent: int, allowance: int, context, level: int) -> None: + # Check if this is a dict with redacted keys + if isinstance(obj, dict): + # Create a copy with redacted values + display_obj = {} + for key, value in obj.items(): + if key == "data" or key == "url": + if value.startswith("data:"): + base64_header = value.split(",", 1)[0] + display_obj[key] = f"{base64_header},***" + elif value.startswith("http://") or value.startswith("https://"): + display_obj[key] = value + elif len(value) > 10: + display_obj[key] = f"{value[:10]}***" + else: + display_obj[key] = value + else: + display_obj[key] = value + obj = display_obj + + # Handle list/tuple/set containing dicts that might have redacted keys + # (pprint will recursively call _format on nested items, so this + # handles arbitrary nesting automatically) + + super()._format(obj, stream, indent, allowance, context, level) + + +pretty_printer = OmitBase64PrettyPrinter() + + +# ========== PPrint EXAMPLES ========== + +if __name__ == "__main__": + data = { + "messages": [ + { + "role": "system", + "content": ( + "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group," + "capable of perceiving auditory and visual inputs, as well as generating text and speech." + ), + }, + { + "role": "user", + "content": [ + { + "type": "text", + "text": "What sound is it, and what is the drawing about?", + }, + { + "type": "text", + "text": "What sound is it, and what is the drawing about?", + }, + { + "type": "image_url", + "image_url": {"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwAAAA"}, + }, + { + "type": "audio_url", + "audio_url": {"url": "data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADT="}, + }, + ], + }, + ], + "extra_body": {"mm_processor_kwargs": {"use_audio_in_video": False}}, + "modalities": ["text"], + } + + # Create printer that redacts 'password' and 'token' fields + + print("\nRedactingPrettyPrinter (hides secrets):") + pretty_printer.pprint(data) diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/models.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/models.py new file mode 100644 index 000000000..83bf64fe7 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/models.py @@ -0,0 +1,119 @@ +import re + +from .types import Modality, ModelMode, Spec + + +def _bagel_payload_preprocessor(payload: dict) -> dict: + try: + for message in payload["messages"]: + for content in message["content"]: + if content["type"] == "text": + content["text"] = "<|im_start|>" + content["text"] + "<|im_end|>" + except (KeyError, TypeError): + raise RuntimeError("Internal Error: malformatted BAGEL payload") + extra_body = payload.pop("extra_body", {}) + return {**payload, **extra_body} + + +def _qwen25_payload_preprocessor(payload: dict) -> dict: + if payload["messages"][0]["role"] != "system": + payload["messages"] = [ + { + "role": "system", + "content": ( + "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group," + "capable of perceiving auditory and visual inputs, as well as generating text and speech." + ), + }, + *payload["messages"], + ] + return payload + + +_MODEL_PIPELINE_SPECS: dict[str, Spec] = { + r"BAGEL-7B-MoT": { + "stages": [ + "diffusion" # The vLLM-Omni interface treats it as a single-stage diffusion model + ], + "modes": [ + { + "mode": ModelMode.COMPREHENSION, + "input_modalities": [Modality.TEXT, Modality.IMAGE], + } + ], + "payload_preprocessor": _bagel_payload_preprocessor, + }, + r"Qwen2.5-Omni*": { + "stages": ["autoregression", "autoregression", "autoregression"], + "payload_preprocessor": _qwen25_payload_preprocessor, + "modes": [ + { + "mode": ModelMode.COMPREHENSION, + "input_modalities": [ + Modality.TEXT, + Modality.IMAGE, + Modality.VIDEO, + Modality.AUDIO, + ], + } + ], + }, + r"Qwen3-Omni*": { + "stages": ["autoregression", "autoregression", "autoregression"], + "modes": [ + { + "mode": ModelMode.COMPREHENSION, + "input_modalities": [ + Modality.TEXT, + Modality.IMAGE, + Modality.VIDEO, + Modality.AUDIO, + ], + } + ], + }, +} +# Convert dict keys to regex patterns +MODEL_PIPELINE_SPECS: dict[re.Pattern, Spec] = {} +for k, v in _MODEL_PIPELINE_SPECS.items(): + MODEL_PIPELINE_SPECS[re.compile(k)] = v +del _MODEL_PIPELINE_SPECS + + +def lookup_model_spec(model: str) -> tuple[Spec | None, str | None]: + try: + last_component = model.rstrip("/").rsplit("/", 1)[-1] + except IndexError: + last_component = model + for pattern, spec in MODEL_PIPELINE_SPECS.items(): + if pattern.search(last_component): + return spec, pattern.pattern + return None, None + + +# ============== DEMONSTRATION ============== + +if __name__ == "__main__": + test_paths = [ + "Qwen/Qwen2.5-Omni-7B", + "MyModels/Qwen2.5-Omni-3B", + "/root/home/Qwen2.5-Omni-7B", + "Qwen/Qwen3-Omni", + "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "Custom/Path/UnknownModel-Instruct", + "Not/Matching/Anything", + ] + + test_payload = {"messages": [{"role": "user", "content": "prompt"}]} + + print("Testing registry lookups:\n") + for path in test_paths: + spec, _ = lookup_model_spec(path) + if spec: + if preprocessor := spec.get("payload_preprocessor"): + result = preprocessor(test_payload) + print(f"✓ {path:<40} → {result}") + else: + print(f"✓ {path:<40} → No preprocessor") + else: + print(f"✗ {path:<40} → No match") diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/types.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/types.py new file mode 100644 index 000000000..29be9648c --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/types.py @@ -0,0 +1,39 @@ +from collections.abc import Callable +from enum import Enum, auto +from typing import ( + Any, + Literal, + NotRequired, + TypeAlias, + TypedDict, +) + +AudioFormat: TypeAlias = Literal["mp3", "opus", "aac", "flac", "wav", "pcm"] + + +class ModelMode(Enum): + IMAGE_GENERATION = auto() + VIDEO_GENERATION = auto() + AUDIO_GENERATION = auto() + COMPREHENSION = auto() + + +class Modality(Enum): + TEXT = auto() # maybe not useful. Prompt is always required + IMAGE = auto() + VIDEO = auto() + AUDIO = auto() + + +class ModelModeSpec(TypedDict): + mode: ModelMode + input_modalities: list[Modality] + + +PayloadPreprocessor: TypeAlias = Callable[[dict[str, Any]], dict[str, Any]] + + +class Spec(TypedDict): + stages: list[Literal["diffusion", "autoregression"]] + modes: list[ModelModeSpec] + payload_preprocessor: NotRequired[PayloadPreprocessor] diff --git a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/validators.py b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/validators.py new file mode 100644 index 000000000..f1af7b2e9 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/validators.py @@ -0,0 +1,84 @@ +from .logger import get_logger +from .models import lookup_model_spec + +logger = get_logger(__name__) + + +def validate_model_and_sampling_params_types( + model_name: str, + sampling_param_list: dict | list[dict] | None = None, +): + # Check if model name exists + if not model_name: + raise ValueError("Model name must not be empty.") + + # Skip if no spec or no sampling params + pipeline_spec, _ = lookup_model_spec(model_name) + if pipeline_spec is None: + logger.info("skipping sampling params check because spec is not found") + return + if sampling_param_list is None: + return + + # Check the number of stages and their data types + stages = pipeline_spec["stages"] + if isinstance(sampling_param_list, list): + # Check that the lengths match + if len(stages) != len(sampling_param_list): + raise ValueError( + f"Sampling parameter list length {len(sampling_param_list)} does not match " + f"number of stages {len(stages)} for model {model_name}." + ) + # Check that each stage's type match + for i, sp in enumerate(sampling_param_list): + if "type" not in sp: + raise RuntimeError("Internal error: unknown sampling parameter type") + if sp["type"] != stages[i]: + raise ValueError( + f"Sampling parameter type ({sp['type']}) does not match " + f"stage type ({stages[i]}) at index {i} for model {model_name}." + ) + elif isinstance(sampling_param_list, dict): + if "type" not in sampling_param_list: + raise RuntimeError("Internal error: unknown sampling parameter type") + # Check that the provided single sampling param matches all stages + elif any(stage != sampling_param_list["type"] for stage in stages): + raise ValueError( + f"When passing a single sampling parameter node, all stages of the model must match " + f"the provided sampling parameter's type. " + f"However, the stages of model {model_name} are: {stages}. " + f"The provided sampling parameter is {sampling_param_list['type']}" + ) + + +def add_sampling_parameters_to_stage( + model_name: str, + sampling_param_list: dict | list[dict] | None, + stage_type: str, + /, + **params_to_add, +) -> dict | list[dict]: + """ + Given a model's name and the sampling parameter list to query this model, + add arbitrary additional parameters to the sampling parameters of all stages of the given type. + """ + pipeline_spec, _ = lookup_model_spec(model_name) + if not pipeline_spec: + logger.warning( + f"Since the model {model_name} is not in our list, we cannot ensure if " + f"the fields ({tuple(params_to_add.keys())}) are added to the correct stage's sampling params. " + f"We will do it heuristically." + ) + pipeline_spec = {"stages": ["diffusion"]} + + stages = pipeline_spec["stages"] + if isinstance(sampling_param_list, dict): + sampling_param_list.update(params_to_add) + elif sampling_param_list is None: + sampling_param_list = params_to_add.copy() + else: + for i, stage in enumerate(stages): + if stage == stage_type: + sampling_param_list[i].update(params_to_add) + + return sampling_param_list diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-comprehension.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-comprehension.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2f6c8de175e93cf8e24851ab504cc895011bccb GIT binary patch literal 423088 zcmbrkc{p3$*EfDLhy*2qmYRYD(dyUGs#y|25(Gg9Is{QeMGZwuwGl%THAEyzYi?q! z-m2zu7u6cto7T`O+Nx@m*3ePszV7$Ae%JH-^ZfpK*SXF)>+H4n+Mk@gclOzzz5Y!7 znFEkiXNofb0s#PM^8o(LgQh5sjz>M|9?ldur~fhx0-FLg0RUFy$r!o|5q;pGA6k0u zze@aT3kZsh`uG07$fn;fkN))z0OQ90OP>F~WCSxfHfS@$`sRs=*{pmMtn#L=9P(ef z;lFy|f9baW>Io;KPHyJ${8x|hp*wEs%uU@e~S?{^Xv5EJl!-9b06;A6)C;6pV4Y&i%3N)G@)#{d7?HZT7RHuR=RV-wej z%_9Ve0D=KDKmj6wAYj*~W(Jr5rhvtt8NhL~Isf0}Unl=>9yUw==>ZhskRr%62uK$I zD}o@3pg;Y9*5><$Nd4Op|33i%UZQG`nA zz)*m+k|{yg3m%}XqGuMJg4jyTt61M=e!Uli)pw*neDQww9`C@I*c++_7NmWGroB!+ zK_?S9qRN)B2^nW!=CRa#p}4tE&Ct?ie{g(SM!^-y?f$r`Npi^f*0wu$#~=NRZW9;? z3i+S#V4LWqK%4OXMaNLwG;ace!k|zESs4gov-4~|DgF!3R9cDP1y|M$h)z*4qvz>W z^sXbeV$Ang5WNEh`J(F&$FaNj`tA#giRbi<={u5QPsTM(ym)U=+2WL%mVQOj+{sUD zbuxbWQk61=PM0)Kks+0+loNxNdqQdBNvKyFQi;Iq-80xibceW^=75ieA@agH%yFz zEoyiYy^VCxA|#fCIr|WN>Pwu(Z({=gA~B8lTubMzuNPw^}%_iFuy)efxEXDMcc+X+0nk$KwdGq&H z8vbsuS#50EYcVe%w(CxgzN!2JG=Fcv^Q0WeQB`KZ9rSx}(wQ4QE=F+93u?ntNrBuJa=Z1V;t>bv}Zd} z)cFAWSQ(VuXVDOj`vcs8V=yVmK$9rTs8_UdDCQSkxOz}H(T+9p6BcTdQUG?+k5d{E z0j0~Tg(eogl|GgTdd=sQ!BP2jC9ApB<(+^uKmE zSF~oUc>L07j~bMOzcZ88|7-DZNl&|PZe<=+nN7IQ45WG(?LkKG0x>xvaOutRA-Z0~ z7`|tJz7jylu`usS&5G=WB`y2`>f7MO5Isd8VeR7|AoTY$c*}#BE1uG*_=EH(R8DVg z)R0h_zXij9yc|62WULbOe(}rq z(rs{(5#|RMocxpg@#EZuLx*13m+$LSI!2ITkt!wq0)BHoh{59X_oLt--6#fT#IEb-t>#mk zo*xfq6UCN<7VPm^*z`pJWm;BopJ#F=NW=C+wP#|AMVt;5mAD$Ib;c`?tGWUKJk*u+ zV6o`_pv9M87dO^#QrSqA55GPT210Ys!doT})lNuZ6lw)*JVL<=Loquh2>A#s>J56} zT4d-?w0&0LL?7$b--GHmJ~__v%;W?<$4*U+4n@Vj{9B=I<7YcWpOl57x!qMb`v(}k z$1#rI?1xCB9pA;(EAnICN0eKT@b5am1m@h84d(+nKH*SZ=}9B0$bf-aI-`N==7i=# z;VaLlqOYg^y^snp1^Q=-%T{wQ%HXBfkalytU;XmGEp;CghO_bM4gL`lSzV>aQEV_0 zu00oJN5SBM4P5cM@9^cXSn}5LN{@sISd4S%+)r`J>*%|8f_2TIL%K=l7`A$;MYwgu zmv7o@Sy4{a+e#c_uRm3Ejccnawj#GQzHz0Qda9p^Q@;I=VblDBt(=!JS`n5{;+nT9 zc5++Cim4Fyb_h*#n2I9IKCag#D=q4hF&xXO)$pd?hb^BYEkqr}Umf4$RApELk-H}@ zZ~(nnm0jr6RCEze<9Oyi(bkKGGCObLjI&Bs2>e2rE|iq@ZH`;uc_`u}v9BmTCi_MQ zKM({nK*bg_)-?ml!!FB}t5{NV-R=EioM8+$Eeciot3Q(}_~1N7y>v3t4f@J0r`H6q zTj23bZLye&2;n=g*(hb^uM5@9i(OeveUjlqra@7t4sJ^`ed~i=FacR=VVDAJl=kT} z=8ASTKTNk61AA7H#5$I{szPFtkUq-r5oRxE1A{f&DpMThwE2NnTIa2PW&x20)fie` zd8Kn>i}rekiaZv(gQ^{gYz9dgp}Dh&VS=iyqG`Wg)jMp#ig!`T6eB=OhQkIb zWXuIHf+@mASN+ZvHPmn_@M~)!RqUn4KYTUu2uH#}TgXwaMsx%4ua? zLV?`RUpYyo-)hjq$cCF)B4nWrzK`h)hpJ`;wVgWf`~i{URx2i^h)5Vkr~toWs`q?Q zH;8q;Ny>&g+vbhMnOv*q&9tXZfsoE-a>!Gh?8ZFr4zcK$@#_aZ$Z{d4kgT`_K_YS% z@ciTI$n**wEY4rTTpdoWFHC(tKE+UjzISm^^l7S8`SduGq-1)-tkTUx5CjF1z__t- zpi|VkmA)=LW|4a%f{(#NMH&FLO$``@H*=PYx3mdcQT*vMwJ!{$Cju4Dsr7(;2BTkI z_g9`zfXf)!>Ccl&s-uyZ_>F-rh(7=#>J?f?f~qX0mg>FQNCAd4#bh(mL{s)K#g$A& za%vFz)Mx8?xuHd-Gm!N001t~q0@anKIyD8Aun1@csRKNdB#og@pP%`x>TE&EBpa!h zz~Xy)?ba1WIZVKg8qsUKI? z6uj)HQI)m+^%&~i2Yv~mfRQet=$%c!2h_7`Tyu|Bz7F9LT}BbOR|6%Hkji#BXGs?i zR!@ssGcpDaJ~cFzngGoeFCc9=A?MqDGWv3sb~Rg+45@cEl=P3*ubWzZd0}g(mz0h@ z9zbH*YvReKYTroYQ4YEAQrwW3)Eqf$Pz#Y zLI>8BzOFC2HNJ7f84`0Ik{yw5I_`zw7&K#UgH1D22sApj zors%?6;BUOhdEJMW-@$)L5D~w-_-Jcj*_vNzoTTQNLh!3YfPq6DGp00gjKqNxm}5y zZfObr1({_@Z4$8Iskqb^CLZ_s_`K$t3X`;2yWI)XazgCk{vFUC3yh*ssAuaq16(yT zeK-y;Y3}*ql$KRxr=tr+K{ra3+;{sKdAqkGKlY#ilf#~a({Aw}^&pM5{18*y)VoiB`MF)!>d!X<`1^&XZ9{XJ7Sj<8L&1E}&a|9N zWje&2kAGsIe<*kZW9PAku%4X$M9NhZ7!!U^8J*Y+Za1k<#L)qRii-QgU;|% zO|@DP$Z_*~rLeD1O{gk=tQ6HwxUPFFFyvMY+O0=7WvAI8kYQ+j5R;99V`)VkQ;-Q+ z3mQ3~Fg0{qcBz~{UVW^eE$!7Pm)1Ki(pJhZ%#l!84cd_9k2KAZCTG1!l#oPi&aL9XLDha&{p{FKS3yihx(asOpL5 z_Mg_WVPn9~Hi}N3_jKUV?qHdvAv6Zm{UybPK_q)A-bC{WO1<80cahs?t1^jrGg+RD zr5hj5U9CWq^*F!#(t!CZ4em>x^jq&Uu5-V^wewz#psp1G3p>1~(lA&>8x%|)WY?o-7MnA>EvtE% zGv?vm|GkHTz*#{FdC!u0Y`Ij-eijs%eIP1^ zW&%Plq;gGngMtfjvQ%{`y)jD46PM03=5X4=nZYYzRkBRuiVoRRy(}wD-W75pq2AWWPz8)_8fiK2p(AVEs-^HsN8{Q7-m&77vj{V`Qo+M{y{JHZ9$* zIjFIpV_Q6ON;jZ7w5v(D2P9X*rBbx2!I^lE(-70r*SeORiY?bF1!|#EM&)i;%t{#6 zCIwlewJ41aJayH1+_Pp@wDloUD8@vdAt0Gt-Pn~`)#@{blV0~2=lX;`K4#?)J}XY^ zM>&t%Lj_KI-D}kSrLb6|*)(AlDFN}T^sDBT=Dgec#<6!Z`d3J=5ahzJzBA6r)$MBY z5erm7yr{-aa$67-28MqrCjTljZ6JGv#I*98_$WEn7E97xei`)ZdTg)KzG*P38QVlS z5#uAgALn(mvCzTN6cES(tFOv6w2&kH zt{ALPjY+X}+fL<3lfi<$s5FGu2fV&C*Y2aiO)b<+Ehq+sr}Jz;Zt*afvqIiXs1dl?y#SfVg=6I4;Y`7y{QD7Z9&A3Z~6z7{bdqiuH#@%rl#d6m>42eQW z7-ra+oI7e3G@)!0?X4HhfBkYpAV}w~KtV7Vnx{R$ErjkK=SdOVF`%i`W`qtJY-*ZS z7HzBOJmXfYeh*130VK`P?7ys#@r97DXAkMmQ1hi)HH`clWsqb<^dOX7$R?}xBlXT( zP{IjO*{f?Jq+Hi^aMCwbC`hSjuC0agiFo#D4^(VqU9ZIUoy{8VDjb0N2;W5b`nGze z_f~7}!Ky2L3CHLY0MRjLl?AtG&jPQBsFNv(E&Mbg%dO!#m}~|uR7H_%5 znJR=(s&LCr4L;3Hqc~o5z5@N(r~792mL5EU>;J^Q$nLt`6@9lT(z6Q`?>laK6B#{H zhWnm)|6Q9K{k%g5y=V)*9qI?LBq|n7;;jNI*|;}rAySum=I2}&`g1`g9pQRRxf1@_ zI)S>~h&D z%R1+KCmTMAr0zaJc$YD{Ix7RhO>HuscU7WGx)kv*Lv;XXS!<{YwzVhw4TikNA;1Vq zsYt(%5owZSeV4C}N8_4Lplyo;CQOZ#RP=oQ>ohCG6T`7iAa2WonWl!pKOyN*|e|i;3 z3}xSDuj}lB&mx}``6LR9X0cw_BQ{!3KlazoqUSoBm_{Un z*BE?%R(uc4Qa8

hq-R2hV!mX@q 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

nsNrAfk8ne*gmsK)_*M9TI7UB^q8arsX(gx4y)3 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 z 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 aj7Qf%8dJ=m3TOpIB+ppuJAx6YhW-x^x>c0` literal 0 HcmV?d00001 diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-image-generation.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-image-generation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5aec26e8cb66f5d9b0d5ce09df8fc836e4070f29 GIT binary patch literal 135014 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�Yj0Q{vt?*K0X(M?bWd$6~g0+WSnEm+<;G@md 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

=P?GhqEO*QulIc^6b#mJ-E8SD7B4GpP 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ࢽ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

P+(f< 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 A`~Uy| literal 0 HcmV?d00001 diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-tts.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-tts.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f446de2a004321f6ad2c5fccb4a6db13c7630a03 GIT binary patch literal 309855 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.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�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%0A7fUI6}A_H>ux38`&xFi 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 literal 0 HcmV?d00001 diff --git a/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Annotated Example.json b/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Annotated Example.json new file mode 100644 index 000000000..16657df0e --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Annotated Example.json @@ -0,0 +1 @@ +{"id":"1c99f525-0a37-45ba-a28a-7df7c3af66b4","revision":0,"last_node_id":12,"last_link_id":14,"nodes":[{"id":1,"type":"VLLMOmniComprehension","pos":[1191.2177053682556,144.66829928181377],"size":[400,268],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":1},{"localized_name":"video","name":"video","shape":7,"type":"VIDEO","link":2},{"localized_name":"audio","name":"audio","shape":7,"type":"AUDIO","link":3},{"localized_name":"sampling_params","name":"sampling_params","shape":7,"type":"SAMPLING_PARAMS","link":14},{"localized_name":"url","name":"url","type":"STRING","widget":{"name":"url"},"link":null},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":null},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"output_text","name":"output_text","type":"BOOLEAN","widget":{"name":"output_text"},"link":null},{"localized_name":"output_audio","name":"output_audio","type":"BOOLEAN","widget":{"name":"output_audio"},"link":null},{"localized_name":"use_audio_in_video","name":"use_audio_in_video","type":"BOOLEAN","widget":{"name":"use_audio_in_video"},"link":null}],"outputs":[{"localized_name":"text_response","name":"text_response","type":"STRING","links":[8]},{"localized_name":"audio_response","name":"audio_response","type":"AUDIO","links":[9]}],"properties":{"Node name for S&R":"VLLMOmniComprehension"},"widgets_values":["http://localhost:8000/v1","Qwen/Qwen2.5-Omni-7B","",true,true,true]},{"id":3,"type":"LoadVideo","pos":[729.5984141255855,-198.631920454299],"size":[282.798828125,233.0743408203125],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"file","name":"file","type":"COMBO","widget":{"name":"file"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[2]}],"properties":{"Node name for S&R":"LoadVideo"},"widgets_values":["draw.mp4","image"]},{"id":4,"type":"LoadAudio","pos":[729.8037086965753,99.86963519703949],"size":[282.798828125,136],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"COMBO","widget":{"name":"audio"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"AUDIOUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"AUDIO","name":"AUDIO","type":"AUDIO","links":[3]}],"properties":{"Node name for S&R":"LoadAudio"},"widgets_values":["Megan-Fox.mp3",null,null]},{"id":5,"type":"VLLMOmniARSampling","pos":[510.3517536642828,658.073751009259],"size":[270,178],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"max_tokens","name":"max_tokens","type":"INT","widget":{"name":"max_tokens"},"link":null},{"localized_name":"temperature","name":"temperature","type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"top_p","name":"top_p","type":"FLOAT","widget":{"name":"top_p"},"link":null},{"localized_name":"repetition_penalty","name":"repetition_penalty","type":"FLOAT","widget":{"name":"repetition_penalty"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null}],"outputs":[{"localized_name":"AR sampling params","name":"AR sampling params","type":"SAMPLING_PARAMS","links":[12]}],"properties":{"Node name for S&R":"VLLMOmniARSampling"},"widgets_values":[100,1,1,1,-1,"randomize"]},{"id":7,"type":"VLLMOmniARSampling","pos":[503.33235181647115,419.34158016181806],"size":[270,178],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"max_tokens","name":"max_tokens","type":"INT","widget":{"name":"max_tokens"},"link":null},{"localized_name":"temperature","name":"temperature","type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"top_p","name":"top_p","type":"FLOAT","widget":{"name":"top_p"},"link":null},{"localized_name":"repetition_penalty","name":"repetition_penalty","type":"FLOAT","widget":{"name":"repetition_penalty"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null}],"outputs":[{"localized_name":"AR sampling params","name":"AR sampling params","type":"SAMPLING_PARAMS","links":[5,13]}],"properties":{"Node name for S&R":"VLLMOmniARSampling"},"widgets_values":[100,1,1,1,-1,"randomize"]},{"id":8,"type":"VLLMOmniSamplingParamsList","pos":[820.6056617389042,426.38372037182273],"size":[263.066015625,66],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"param1","name":"param1","type":"SAMPLING_PARAMS","link":5},{"localized_name":"param2","name":"param2","shape":7,"type":"SAMPLING_PARAMS","link":12},{"localized_name":"param3","name":"param3","shape":7,"type":"SAMPLING_PARAMS","link":13}],"outputs":[{"localized_name":"param list","name":"param list","type":"SAMPLING_PARAMS","links":[14]}],"properties":{"Node name for S&R":"VLLMOmniSamplingParamsList"},"widgets_values":[]},{"id":11,"type":"MarkdownNote","pos":[826.2328280438272,569.1890318701705],"size":[333.8220435590464,261.63596728060656],"flags":{},"order":4,"mode":0,"inputs":[],"outputs":[],"title":"Note: Sampling Parameters","properties":{},"widgets_values":["## Sampling Parameter Types\n\nThere are two types of sampling parameters: one for autoregression and one for diffusion.\nYou should ensure that you have chosen the correct type of sampling parameters for the model you request.\n\n## Stages & Shorthand\n\nFor multi-stage models such as Qwen Omni, you can either\n- connect one sampling parameter node, which is applied to all stages.\n- connect exactly the same number of sampling parameter nodes to a \"Multi-Stage Sampling Parameter List\" node, then connect this node to the primary request node.\n\nNote that this shorthand is intended to stay consistent with the [online serving API](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/examples/online_serving/qwen2_5_omni/)"],"color":"#432","bgcolor":"#000"},{"id":12,"type":"MarkdownNote","pos":[378.9866207003777,152.59550252215752],"size":[319.7287574247016,107.15904081906785],"flags":{},"order":6,"mode":0,"inputs":[],"outputs":[],"title":"Note: Input","properties":{},"widgets_values":["Note that not all models support every modality as input. For example, `ByteDance-Seed/BAGEL-7B-MoT` in Multimodality Comprehension mode only support text and image input.\n\nYou should ensure that the input are supported by the model. You can check the corresponding [online serving documentation](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/examples/online_serving/bagel/) for confirmation."],"color":"#432","bgcolor":"#000"},{"id":2,"type":"LoadImage","pos":[394.4674804308822,-207.6987397548834],"size":[282.798828125,314],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[1]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["example.png","image"]},{"id":10,"type":"PreviewAudio","pos":[1664.548345556043,297.5921292054054],"size":[270,88],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":9},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"Node name for S&R":"PreviewAudio"},"widgets_values":[]},{"id":9,"type":"ShowText|pysssss","pos":[1649.2506875091847,66.22823888292349],"size":[318.7188464232943,173.38502269972975],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","link":8}],"outputs":[{"localized_name":"STRING","name":"STRING","shape":6,"type":"STRING","links":null}],"properties":{"Node name for S&R":"ShowText|pysssss"},"widgets_values":[]}],"links":[[1,2,0,1,0,"IMAGE"],[2,3,0,1,1,"VIDEO"],[3,4,0,1,2,"AUDIO"],[5,7,0,8,0,"SAMPLING_PARAMS"],[8,1,0,9,0,"STRING"],[9,1,1,10,0,"AUDIO"],[12,5,0,8,1,"SAMPLING_PARAMS"],[13,7,0,8,2,"SAMPLING_PARAMS"],[14,8,0,1,3,"SAMPLING_PARAMS"]],"groups":[{"id":1,"title":"Sampling Parameters","bounding":[480.1649301181556,341.08402513937995,692.4113568972277,510.48648853403665],"color":"#3f789e","font_size":24,"flags":{}},{"id":2,"title":"Input","bounding":[344.2364817813528,-287.5850484183313,704.8832238768634,559.5124009832894],"color":"#3f789e","font_size":24,"flags":{}}],"config":{},"extra":{"workflowRendererVersion":"LG","ds":{"scale":0.9478575057427204,"offset":[33.81037136029557,307.1974296197726]}},"version":0.4} diff --git a/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Image Generation.json b/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Image Generation.json new file mode 100644 index 000000000..d1495bc94 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Image Generation.json @@ -0,0 +1 @@ +{"id":"91f75acc-8040-40f6-865a-2e8a7cfd6672","revision":0,"last_node_id":11,"last_link_id":23,"nodes":[{"id":3,"type":"PreviewImage","pos":[1281.8455167767304,-69.02638461454333],"size":[305.6628685610174,307.0336884172169],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":22}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":11,"type":"VLLMOmniGenerateImage","pos":[816.0962515873642,-137.51112584854445],"size":[400,278],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":21},{"localized_name":"mask","name":"mask","shape":7,"type":"MASK","link":null},{"localized_name":"sampling_params","name":"sampling_params","shape":7,"type":"SAMPLING_PARAMS","link":23},{"localized_name":"url","name":"url","type":"STRING","widget":{"name":"url"},"link":null},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":null},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"negative_prompt","name":"negative_prompt","type":"STRING","widget":{"name":"negative_prompt"},"link":null},{"localized_name":"width","name":"width","type":"INT","widget":{"name":"width"},"link":null},{"localized_name":"height","name":"height","type":"INT","widget":{"name":"height"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[22]}],"properties":{"Node name for S&R":"VLLMOmniGenerateImage"},"widgets_values":["http://localhost:8000/v1","Qwen/Qwen-Image-Edit","Put this figure in a realistic mountain view","",512,512]},{"id":8,"type":"VLLMOmniDiffusionSampling","pos":[478.59266934006774,183.67711984955648],"size":[284.205078125,202],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"n","name":"n","type":"INT","widget":{"name":"n"},"link":null},{"localized_name":"num_inference_steps","name":"num_inference_steps","type":"INT","widget":{"name":"num_inference_steps"},"link":null},{"localized_name":"guidance_scale","name":"guidance_scale","type":"FLOAT","widget":{"name":"guidance_scale"},"link":null},{"localized_name":"true_cfg_scale","name":"true_cfg_scale","type":"FLOAT","widget":{"name":"true_cfg_scale"},"link":null},{"localized_name":"vae_use_slicing","name":"vae_use_slicing","type":"BOOLEAN","widget":{"name":"vae_use_slicing"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null}],"outputs":[{"localized_name":"diffusion sampling params","name":"diffusion sampling params","type":"SAMPLING_PARAMS","links":[23]}],"properties":{"Node name for S&R":"VLLMOmniDiffusionSampling"},"widgets_values":[4,50,1,1,false,42,"fixed"]},{"id":10,"type":"MarkdownNote","pos":[227.99306819575278,-231.24143306069843],"size":[240.3326478922474,136.3505820791881],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"title":"Note: Task and Input","properties":{},"widgets_values":["vLLM-Omni nodes are categorized based on the output modality. The \"Generate Image\" node supports both text-to-image generation or image-to-image generation (a.k.a. image editing). The node will route to the correct endpoint depending on whether an input image is present or not."],"color":"#432","bgcolor":"#000"},{"id":4,"type":"LoadImage","pos":[496.31859627609606,-229.71277089860084],"size":[270,314],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[21]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["example.png","image"]}],"links":[[21,4,0,11,0,"IMAGE"],[22,11,0,3,0,"IMAGE"],[23,8,0,11,2,"SAMPLING_PARAMS"]],"groups":[{"id":1,"title":"Input","bounding":[213.1706010087147,-313.20095750667554,560.8246471437027,407.4246532472182],"color":"#3f789e","font_size":24,"flags":{}}],"config":{},"extra":{"workflowRendererVersion":"LG","ds":{"scale":1.1469075819486894,"offset":[276.8427259980847,549.4885226647582]}},"version":0.4} diff --git a/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni TTS.json b/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni TTS.json new file mode 100644 index 000000000..761e8d147 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni TTS.json @@ -0,0 +1 @@ +{"id":"c0a11241-f0e6-4f5c-8488-b3d344a9df3d","revision":0,"last_node_id":7,"last_link_id":3,"nodes":[{"id":4,"type":"PreviewAudio","pos":[690.1759063763212,226.76444957981545],"size":[270,88],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":2},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"Node name for S&R":"PreviewAudio"},"widgets_values":[]},{"id":5,"type":"LoadAudio","pos":[-83.61093919682321,103.80510898465587],"size":[282.798828125,136],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"COMBO","widget":{"name":"audio"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"AUDIOUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"AUDIO","name":"AUDIO","type":"AUDIO","links":[3]}],"properties":{"Node name for S&R":"LoadAudio"},"widgets_values":["Megan-Fox.mp3",null,null]},{"id":3,"type":"VLLMOmniVoiceClone","pos":[248.63466280064262,168.13112893706375],"size":[400,306],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"ref_audio","name":"ref_audio","type":"AUDIO","link":3},{"localized_name":"model_specific_params","name":"model_specific_params","shape":7,"type":"TTS_PARAMS","link":1},{"localized_name":"url","name":"url","type":"STRING","widget":{"name":"url"},"link":null},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":null},{"localized_name":"input","name":"input","type":"STRING","widget":{"name":"input"},"link":null},{"localized_name":"voice","name":"voice","type":"STRING","widget":{"name":"voice"},"link":null},{"localized_name":"response_format","name":"response_format","type":"COMBO","widget":{"name":"response_format"},"link":null},{"localized_name":"speed","name":"speed","type":"FLOAT","widget":{"name":"speed"},"link":null},{"localized_name":"ref_text","name":"ref_text","type":"STRING","widget":{"name":"ref_text"},"link":null},{"localized_name":"x_vector_only_mode","name":"x_vector_only_mode","type":"BOOLEAN","widget":{"name":"x_vector_only_mode"},"link":null}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[2]}],"properties":{"Node name for S&R":"VLLMOmniVoiceClone"},"widgets_values":["http://localhost:8000/v1","Qwen/Qwen3-TTS-12Hz-1.7B-Base","Someone just spilled a cup of coffee on my jacket this morning in the subway. Now I have to wear this stained jacket for a whole day!","","mp3",1,"",true]},{"id":6,"type":"MarkdownNote","pos":[255.52667408769662,27.26842775454861],"size":[381.58204108637847,88],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"title":"Note: TTS Nodes","properties":{},"widgets_values":["Apart from the Voice Cloning node, there is also another TTS node for simple text-to-speech tasks (without extra inputs for reference audio)."],"color":"#432","bgcolor":"#000"},{"id":7,"type":"MarkdownNote","pos":[-196.99453003423977,598.3693693727904],"size":[382.4539509209102,88],"flags":{},"order":3,"mode":0,"inputs":[],"outputs":[],"title":"Note: Model-Specific Parameters","properties":{},"widgets_values":["TTS models often require some tailor-made parameters. If you need to customize these parameters, grab one that matches the model you are requesting from \"TTS Params\" subfolder."],"color":"#432","bgcolor":"#000"},{"id":2,"type":"VLLMOmniQwenTTSParams","pos":[-207.8925310560497,342.7942867650348],"size":[400,200],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"task_type","name":"task_type","type":"COMBO","widget":{"name":"task_type"},"link":null},{"localized_name":"language","name":"language","type":"COMBO","widget":{"name":"language"},"link":null},{"localized_name":"instructions","name":"instructions","type":"STRING","widget":{"name":"instructions"},"link":null},{"localized_name":"max_new_tokens","name":"max_new_tokens","type":"INT","widget":{"name":"max_new_tokens"},"link":null}],"outputs":[{"localized_name":"Qwen TTS params","name":"Qwen TTS params","type":"TTS_PARAMS","links":[1]}],"properties":{"Node name for S&R":"VLLMOmniQwenTTSParams"},"widgets_values":["Base","Auto","Super angry",2048]}],"links":[[1,2,0,3,1,"TTS_PARAMS"],[2,3,0,4,0,"AUDIO"],[3,5,0,3,0,"AUDIO"]],"groups":[{"id":1,"title":"Model-Specific Parameters","bounding":[-228.38328407738007,264.42790274716276,443.9887293164586,439.6853171248897],"color":"#3f789e","font_size":24,"flags":{}}],"config":{},"extra":{"workflowRendererVersion":"LG","ds":{"scale":1.1469075819486911,"offset":[898.8819468322333,258.7179979718389]}},"version":0.4} diff --git a/apps/ComfyUI-vLLM-Omni/web/main.js b/apps/ComfyUI-vLLM-Omni/web/main.js new file mode 100644 index 000000000..da99b2539 --- /dev/null +++ b/apps/ComfyUI-vLLM-Omni/web/main.js @@ -0,0 +1,21 @@ +/** + * @file This file is intended to add dynamic fields to vLLM-Omni nodes + * based on widget (in-node form fields) and input (connection link) values and changes. + * However, this functionality is currently disabled/commented out. + * Because it introduces too much complexity, + * and it may even conflict with the current backend (Python) validation for unknown reasons (pending ComfyUI upstream fixes). + */ + +import { app } from "../../scripts/app.js"; +app.registerExtension({ + name: "vllm.vllm_omni", + async beforeRegisterNodeDef(nodeType, nodeData, app) { + if (!nodeData.name.startsWith("VLLMOmni")) { + return + } + // Stub frontend plugin for now + }, + async setup() { + console.info("vLLM-Omni Setup complete!") + }, +}) diff --git a/docs/.nav.yml b/docs/.nav.yml index 41754c9c7..adf7321d7 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -44,6 +44,7 @@ nav: - Cache-DiT: user_guide/diffusion/cache_dit_acceleration.md - Parallelism Acceleration: user_guide/diffusion/parallelism_acceleration.md - CPU Offloading: user_guide/diffusion/cpu_offload_diffusion.md + - ComfyUI: features/comfyui.md - Developer Guide: - General: - contributing/README.md diff --git a/docs/features/comfyui.md b/docs/features/comfyui.md new file mode 100644 index 000000000..3b7a9551e --- /dev/null +++ b/docs/features/comfyui.md @@ -0,0 +1,70 @@ +# vLLM-Omni ComfyUI Integration + +vLLM-Omni offers a ComfyUI integration on top of its online serving API. +It can send model inference requests to either a locally running vLLM-Omni service or a remote one. + +## Requirement + +- Python 3.12 or above +- [ComfyUI installed](https://docs.comfy.org/installation/system_requirements) +- [vLLM-Omni installed](https://docs.vllm.ai/projects/vllm-omni/en/latest/getting_started/installation/) on either the same device or another device discoverable via the internet. +- No need to install additional packages apart from those already required by ComfyUI. + +!!! tip + If you run both ComfyUI and vLLM-Omni on the same device, you can create separate virtual environments and use different Python versions for them. + + +## Installation + +Copy the `apps/ComfyUI-vLLM-Omni` folder to the `custom_nodes` subfolder of your ComfyUI installation. Your directory should look like `ComfyUI/custom_nodes/ComfyUI-vLLM-Omni`. + +If you are running ComfyUI during copying, you should restart ComfyUI to load this extension. + +!!! tip + You can use utility websites such as https://download-directory.github.io/ to download a subdirectory of a repo. Also checkout community discussions (e.g., https://stackoverflow.com/questions/7106012/download-a-single-folder-or-directory-from-a-github-repository) for more info. + +On the device and virtual environment you run ComfyUI, launch ComfyUI with +```bash +cd ComfyUI + +# The regular way +python main.py + +# If you are mainly using this node, launch it faster with +python main.py --cpu +``` + +On the device and virtual environment you run vLLM-Omni, start a model service with +```bash +vllm serve The_Model_ID_to_Serve --omni --port 8000 +``` + +Check **ComfyUI's sidebar -> Node Library**. There should be a new folder named **vLLM-Omni**. +If no, check your shell running the ComfyUI process. There may be some error messages before the line `Import times for custom nodes:` and the line `To see the GUI go to: http://127.0.0.1:8188`. + +## Quickstart + +This extension offers the following nodes based on the output modalities: + +- **Generate Image** for text-to-image and image-to-image tasks +- **Multimodality Comprehension** for multimodality-to-text and multimodality-to-audio tasks +- **TTS** and **TTS Voice Clone** for TTS tasks + +This extension also offers example workflows (at **ComfyUI sidebar -> Templates -> vLLM-Omni**) + +!!! info + The node UI and feature designs are intended to match vLLM-Omni online serving interfaces. It cannot offer more than what the interfaces support. + +To build a simple workflow yourself, + +- Drag a generation node onto the canvas. +- Depending on your need, grab built-in multimedia file loader nodes, such as **image->Load Image**, **image->video->Load Video**, **audio->Load Audio** +- Depending on your need, grab built-in multimedia file preview nodes, such as **image->Preview Image**, **image->video->Save Video**, **audio->Preview Audio**. For text output, you can install [ComfyUI-Custom-Scripts plugin](https://github.com/pythongosssss/ComfyUI-Custom-Scripts/) and grab its **utils->Show Text 🐍** node. +- If you want to tune sampling parameters, grab corresponding nodes from **vLLM-Omni-> Sampling Params**. + - For multi-stage models, you can connect multiple **AR Sampling Params** and **Diffusion Sampling Params** nodes to a **Multi-Stage Sampling Params List** node, and connect this node to the generation node. + - For some multi-stage models like BAGEL, [only one stage's sampling parameters are exposed and tunable via vLLM-Omni's online serving API](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/examples/online_serving/bagel/). Thus, these models are treated as single-stage ones. Please check the vLLM-Omni documentation on how to correctly set each model's sampling parameters. + - For multi-stage models where all stages are either autoregression or diffusion, you can also connect only a single Sampling Params node, indicating that this set of sampling parameters will be used for all stages. + +## Examples & Screenshots + +Please read the [ComfyUI integration's README](https://github.com/vllm-project/vllm-omni/tree/main/apps/ComfyUI-vLLM-Omni) for more info. From c6b526bc2e57f5dd351face06f6ca7e578872965 Mon Sep 17 00:00:00 2001 From: Chenguang Zheng <645327136@qq.com> Date: Mon, 9 Feb 2026 11:46:00 +0800 Subject: [PATCH 02/10] fix: add diffusion offload args to OmniConfig group instead of serve_parser (#1271) Signed-off-by: Chenguang ZHENG <645327136@qq.com> --- vllm_omni/entrypoints/cli/serve.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vllm_omni/entrypoints/cli/serve.py b/vllm_omni/entrypoints/cli/serve.py index ac03de143..1be3b02f1 100644 --- a/vllm_omni/entrypoints/cli/serve.py +++ b/vllm_omni/entrypoints/cli/serve.py @@ -194,17 +194,17 @@ class OmniServeCommand(CLISubcommand): ) # diffusion model offload parameters - serve_parser.add_argument( + omni_config_group.add_argument( "--enable-cpu-offload", action="store_true", help="Enable CPU offloading for diffusion models.", ) - serve_parser.add_argument( + omni_config_group.add_argument( "--enable-layerwise-offload", action="store_true", help="Enable layerwise (blockwise) offloading on DiT modules.", ) - serve_parser.add_argument( + omni_config_group.add_argument( "--layerwise-num-gpu-layers", type=int, default=1, From 29e6a29e54ceed1c97e421c9cb12f6a12266719c Mon Sep 17 00:00:00 2001 From: Didan Deng <33117903+wtomin@users.noreply.github.com> Date: Mon, 9 Feb 2026 15:53:01 +0800 Subject: [PATCH 03/10] [Doc] Adding models/pipelines/features Tutorial (#1196) Signed-off-by: Didan Deng <33117903+wtomin@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: dongbo910220 <32610838+dongbo910220@users.noreply.github.com> --- docs/.nav.yml | 6 + docs/contributing/features/cache_dit.md | 286 +++++ docs/contributing/features/cfg_parallel.md | 249 ++++ .../features/sequence_parallel.md | 405 ++++++ docs/contributing/features/teacache.md | 459 +++++++ docs/contributing/features/tensor_parallel.md | 279 ++++ .../model/adding_diffusion_model.md | 1119 ++++++++++++----- .../diffusion/parallelism_acceleration.md | 276 ---- 8 files changed, 2518 insertions(+), 561 deletions(-) create mode 100644 docs/contributing/features/cache_dit.md create mode 100644 docs/contributing/features/cfg_parallel.md create mode 100644 docs/contributing/features/sequence_parallel.md create mode 100644 docs/contributing/features/teacache.md create mode 100644 docs/contributing/features/tensor_parallel.md diff --git a/docs/.nav.yml b/docs/.nav.yml index adf7321d7..16821c595 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -54,6 +54,12 @@ nav: - contributing/model/README.md - contributing/model/adding_omni_model.md - contributing/model/adding_diffusion_model.md + - Advanced Features: + - contributing/features/cfg_parallel.md + - contributing/features/sequence_parallel.md + - contributing/features/tensor_parallel.md + - contributing/features/cache_dit.md + - contributing/features/teacache.md - CI: contributing/ci - Design Documents: - design/index.md diff --git a/docs/contributing/features/cache_dit.md b/docs/contributing/features/cache_dit.md new file mode 100644 index 000000000..f39b93578 --- /dev/null +++ b/docs/contributing/features/cache_dit.md @@ -0,0 +1,286 @@ +# Support Cache-DiT + +This section describes how to add cache-dit acceleration to a new diffusion pipeline. We use the Qwen-Image pipeline and LongCat-Image pipeline as reference implementations. + +--- + +## Table of Contents + +- [Overview](#overview) +- [Standard Models: Automatic Support](#standard-models-automatic-support) +- [Custom Architectures: Writing Custom Implementation](#custom-architectures-writing-custom-implementation) +- [Testing](#testing) +- [Troubleshooting](#troubleshooting) +- [Reference Implementations](#reference-implementations) +- [Summary](#summary) + +--- + +## Overview + +### What is Cache-DiT? + +Cache-DiT is an acceleration library for Diffusion Transformers (DiT) that caches intermediate computation results across denoising steps. The core insight is that adjacent denoising steps often produce similar intermediate features, so we can skip redundant computations by reusing cached results. + +The library supports three main caching strategies: + +- **DBCache:** Dynamic block-level caching that selectively computes or caches transformer blocks based on residual differences +- **TaylorSeer:** Calibration-based prediction that estimates block outputs using Taylor expansion +- **SCM (Step Computation Masking):** Dynamic step skipping based on configurable policies + +### Architecture + +vLLM-omni integrates cache-dit through the `CacheDiTBackend` class, which provides a unified interface for managing cache-dit acceleration on diffusion models. + +| Method/Class | Purpose | Behavior | +|--------------|---------|----------| +| [`CacheDiTBackend`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/#vllm_omni.diffusion.cache.CacheBackend) | Unified backend interface | Automatically handles enabler selection and cache refresh | +| [`enable_cache_for_dit()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/cache_dit_backend/#vllm_omni.diffusion.cache.cache_dit_backend.enable_cache_for_dit) | Apply caching to transformer | Configures DBCache on transformer blocks | + +**Key APIs from Cache-DiT:** + +[Cache-DiT API Reference](https://cache-dit.readthedocs.io/en/latest/user_guide/CACHE_API/) + +| API | Description | +|-----|-------------| +| `BlockAdapter` | Core abstraction for applying cache-dit to transformers. Specifies transformer module(s), block list(s), and forward signature pattern(s). | +| `ForwardPattern` | Defines block forward signature patterns: `Pattern_0`, `Pattern_1`, `Pattern_2` | +| `ParamsModifier` | Per-transformer or per-block-list cache configuration customization | +| `DBCacheConfig` | Configuration for DBCache parameters (warmup steps, cached steps, thresholds) | +| `refresh_context()` | Update cache context | Called when `num_inference_steps` changes | + +--- + +## Standard Models: Automatic Support + +Most DiT models follow this pattern: +- Single transformer with one `ModuleList` of blocks +- Standard forward signature +- Compatible with cache-dit's automatic detection + +**Examples:** Qwen-Image, Z-Image + +For standard single-transformer models, **no code changes are needed**. The `CacheDiTBackend` automatically uses `enable_cache_for_dit()`: + +```python +from vllm_omni import Omni + +# Works automatically for standard models +omni = Omni( + model="Qwen/Qwen-Image", # Standard single-transformer model + cache_backend="cache_dit", + cache_config={ + "Fn_compute_blocks": 1, + "Bn_compute_blocks": 0, + "max_warmup_steps": 4, + } +) +``` + +**What happens automatically:** + +```python +def enable_cache_for_dit(pipeline: Any, cache_config: Any) -> Callable[[int], None]: + """Default enabler for standard single-transformer DiT models.""" + + # Build cache configuration + db_cache_config = DBCacheConfig( + num_inference_steps=None, # Will be set during first inference + Fn_compute_blocks=cache_config.Fn_compute_blocks, + Bn_compute_blocks=cache_config.Bn_compute_blocks, + max_warmup_steps=cache_config.max_warmup_steps, + max_cached_steps=cache_config.max_cached_steps, + max_continuous_cached_steps=cache_config.max_continuous_cached_steps, + residual_diff_threshold=cache_config.residual_diff_threshold, + ) + + # Enable cache-dit on transformer + cache_dit.enable_cache( + pipeline.transformer, + cache_config=db_cache_config, + ) + + # Return refresh function for dynamic num_inference_steps updates + def refresh_cache_context(pipeline: Any, num_inference_steps: int, verbose: bool = True): + cache_dit.refresh_context(pipeline.transformer, num_inference_steps=num_inference_steps, verbose=verbose) + + return refresh_cache_context +``` + +--- + +## Custom Architectures: Writing Custom Implementation + +Some models require custom handling: + +- **Dual-transformer:** Models with separate high-noise and low-noise transformers (e.g., Wan2.2) +- **Multi-block-list:** Models with multiple block lists in one transformer (e.g., LongCatImage with `transformer_blocks` + `single_transformer_blocks`) +- **Special forward patterns:** Models with non-standard block execution patterns + +### Example 1: Dual-Transformer Model (Wan2.2) + +Wan2.2 uses two transformers: one for high-noise steps and one for low-noise steps. + +**Key difference:** Use `BlockAdapter` to wrap multiple transformers with separate configurations. + +```python +# Standard: cache_dit.enable_cache(pipeline.transformer, ...) +# Custom: Use BlockAdapter to handle multiple transformers +cache_dit.enable_cache( + BlockAdapter( + transformer=[pipeline.transformer, pipeline.transformer_2], # Multiple transformers + blocks=[pipeline.transformer.blocks, pipeline.transformer_2.blocks], + forward_pattern=[ForwardPattern.Pattern_2, ForwardPattern.Pattern_2], + params_modifiers=[ + ParamsModifier(...), # Config for high-noise transformer + ParamsModifier(...), # Config for low-noise transformer (different params) + ], + ), + cache_config=db_cache_config, +) +``` + +**Key difference:** `refresh_context` must be called on each transformer separately. + +```python +# Standard: cache_dit.refresh_context(pipeline.transformer, num_inference_steps=N) +# Custom: Refresh each transformer with its own step count +def refresh_cache_context(pipeline, num_inference_steps, verbose=True): + high_steps, low_steps = _split_inference_steps(num_inference_steps) + cache_dit.refresh_context(pipeline.transformer, num_inference_steps=high_steps, ...) + cache_dit.refresh_context(pipeline.transformer_2, num_inference_steps=low_steps, ...) +``` + +### Example 2: Multi-Block-List Model (LongCatImage) + +LongCatImage has a single transformer with two block lists: `transformer_blocks` and `single_transformer_blocks`. + +**Key difference:** Use `BlockAdapter` to specify multiple block lists within one transformer. + +```python +# Standard: cache_dit.enable_cache(pipeline.transformer, ...) +# - Automatically detects single block list +# Custom: Use BlockAdapter to specify multiple block lists +cache_dit.enable_cache( + BlockAdapter( + transformer=pipeline.transformer, # Single transformer + blocks=[ + pipeline.transformer.transformer_blocks, # Block list 1 + pipeline.transformer.single_transformer_blocks, # Block list 2 + ], + forward_pattern=[ForwardPattern.Pattern_1, ForwardPattern.Pattern_1], + params_modifiers=[modifier], + ), + cache_config=db_cache_config, +) +``` + +> **Note:** For single transformer with multiple block lists, `refresh_context` works the same as standard models. + +### Registering Custom Implementations + +After writing your custom enabler, register it in `CUSTOM_DIT_ENABLERS` in `vllm_omni/diffusion/cache/cache_dit_backend.py`: + +```python +CUSTOM_DIT_ENABLERS = { + "Wan22Pipeline": enable_cache_for_wan22, + "LongCatImagePipeline": enable_cache_for_longcat_image, + "YourCustomPipeline": enable_cache_for_your_model, # Add here +} +``` + +--- + +## Testing + +After adding cache-dit support, test with: + +```python +from vllm_omni import Omni +from vllm_omni.inputs.data import OmniDiffusionSamplingParams + +# Test your custom model +omni = Omni( + model="your-model-name", + cache_backend="cache_dit", + cache_config={ + "Fn_compute_blocks": 1, + "Bn_compute_blocks": 0, + "max_warmup_steps": 4, + "residual_diff_threshold": 0.24, + } +) + +images = omni.generate( + "a beautiful landscape", + OmniDiffusionSamplingParams(num_inference_steps=50), +) +``` + +**Verify:** + +1. Cache is applied (check logs for "Cache-dit enabled successfully on xxx") +2. Performance improvement (should be around 1.5x-2x faster) +3. Image quality (compare with `cache_backend=None`) + +--- + +## Troubleshooting + +### Issue: Cache not applied + +**Symptoms:** No speedup observed, no cache-related log messages. + +**Causes & Solutions:** + +- **Enabler not registered:** + +**Problem:** Pipeline name not in `CUSTOM_DIT_ENABLERS` registry. + +**Solution:** Verify `pipeline.__class__.__name__` matches the registry key and add your enabler to `CUSTOM_DIT_ENABLERS`. + +### Issue: Quality degradation + +**Symptoms:** Generated images have artifacts or lower quality compared to non-cached inference. + +**Causes & Solutions:** + +- **Cache parameters too aggressive:** + +**Solution:** +```python +cache_config={ + "residual_diff_threshold": 0.12, # Lower from 0.24 (try 0.12-0.18) + "max_warmup_steps": 6, # Increase from 4 (try 6-8) + "max_continuous_cached_steps": 2, # Reduce if higher +} +``` + +Check the [user guide for cache_dit](../../user_guide/diffusion/cache_dit_acceleration.md) for more adjustable parameters. + +--- + +## Reference Implementations + +Complete examples in the codebase: + +| Model | Path | Pattern | Notes | +|-------|------|---------|-------| +| **Standard DiT** | [`cache_dit_backend.py::enable_cache_for_dit`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/cache_dit_backend/#vllm_omni.diffusion.cache.cache_dit_backend.enable_cache_for_dit) | Default enabler | Single transformer, automatic | +| **Wan2.2** | [`cache_dit_backend.py::enable_cache_for_wan22`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/cache_dit_backend/#vllm_omni.diffusion.cache.cache_dit_backend.enable_cache_for_wan22) | Dual-transformer | Separate high/low noise transformers | +| **LongCat** | [`cache_dit_backend.py::enable_cache_for_longcat_image`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/cache_dit_backend/#vllm_omni.diffusion.cache.cache_dit_backend.enable_cache_for_longcat_image) | Multi-block-list | Two block lists in one transformer | +| **BAGEL** | [`cache_dit_backend.py::enable_cache_for_bagel`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/cache_dit_backend/#vllm_omni.diffusion.cache.cache_dit_backend.enable_cache_for_bagel) | Omni model | Complex architecture | + +--- + +## Summary + +Adding cache-dit support: + +1. ✅ **Check model type** - Standard models work automatically, custom architectures need enablers +2. ✅ **Write enabler** (if needed) - Use `BlockAdapter` for complex architectures +3. ✅ **Register enabler** (if needed) - Add to `CUSTOM_DIT_ENABLERS` dictionary +4. ✅ **Return refresh function** (if needed) - Handle `num_inference_steps` changes +5. ✅ **Test** - Verify with `cache_backend="cache_dit"` + +For most models, the default enabler is sufficient. Only write custom enablers for complex architectures! diff --git a/docs/contributing/features/cfg_parallel.md b/docs/contributing/features/cfg_parallel.md new file mode 100644 index 000000000..adfe447c9 --- /dev/null +++ b/docs/contributing/features/cfg_parallel.md @@ -0,0 +1,249 @@ +# Support CFG-Parallel + +This section describes how to add CFG-Parallel (Classifier-Free Guidance Parallel) to a diffusion pipeline. We use the Qwen-Image pipeline as the reference implementation. + +--- + +## Table of Contents + +- [Overview](#overview) +- [Step-by-Step Implementation](#step-by-step-implementation) +- [Customization](#customization) +- [Testing](#testing) +- [Troubleshooting](#troubleshooting) +- [Reference Implementations](#reference-implementations) +- [Summary](#summary) + +--- + +## Overview + +### What is CFG-Parallel? + +In standard Classifier-Free Guidance, each diffusion step requires two forward passes through the transformer: + +1. **Positive/Conditional**: Guided by the text prompt +2. **Negative/Unconditional**: Typically using empty or negative prompt + +CFG-Parallel eliminates this bottleneck by distributing the two forward passes across different GPU ranks, allowing them to execute simultaneously rather than sequentially. + +### Architecture + +vLLM-omni provides `CFGParallelMixin` that encapsulates all CFG parallel logic. Pipelines inherit from this mixin and implement a `diffuse()` method that orchestrates the denoising loop. + +| Method | Purpose | Automatic Behavior | +|--------|---------|-------------------| +| [`predict_noise_maybe_with_cfg()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Predict noise with CFG | Detects parallel mode, distributes computation, gathers results | +| [`scheduler_step_maybe_with_cfg()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Step scheduler with sync | Rank 0 steps, broadcasts latents to all ranks | +| [`combine_cfg_noise()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Combine positive/negative | Applies CFG formula with optional normalization | +| [`predict_noise()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Forward pass wrapper | Override for custom transformer calls | +| [`cfg_normalize_function()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Normalize CFG output | Override for custom normalization | + +### How It Works + +`predict_noise_maybe_with_cfg()` automatically detects and switches between two execution modes: + +- **CFG-Parallel mode** (when `cfg_world_size > 1`): + - Rank 0 computes positive prompt prediction + - Rank 1 computes negative prompt prediction + - Results are gathered via `all_gather()` + - Combined on rank 0 using CFG formula + +- **Sequential mode** (when `cfg_world_size == 1`): + - Single rank computes both positive and negative predictions + - Directly combines them with CFG formula + +`scheduler_step_maybe_with_cfg()` ensures consistent latent states across all ranks: + +- **CFG-Parallel mode**: + - Only rank 0 performs the scheduler step (applies noise prediction to update latents) + - Updated latents are broadcast to all other ranks via `broadcast()` + - All ranks maintain synchronized latent states for the next iteration + +- **Sequential mode**: + - Single rank directly performs the scheduler step + - No synchronization needed + +--- + +## Step-by-Step Implementation + +### Step 1: Inherit `CFGParallelMixin` + +Allow your pipeline to inherit from `CFGParallelMixin` and implements the `diffuse()` method for your specific model. + +**Example (Qwen-Image):** + +```python +from vllm_omni.diffusion.distributed.cfg_parallel import CFGParallelMixin +import torch.nn as nn +class YourModelPipeline(nn.Module, CFGParallelMixin): + def diffuse(self, ...) -> torch.Tensor: + for i, t in enumerate(timesteps): + # Prepare positive_kwargs (conditional) and negative_kwargs (unconditional) + positive_kwargs = {...} # hidden_states, encoder_hidden_states, etc. + negative_kwargs = {...} if do_true_cfg else None + + # Key method 1: Predict noise with automatic CFG parallel handling + noise_pred = self.predict_noise_maybe_with_cfg( + do_true_cfg=do_true_cfg, + true_cfg_scale=true_cfg_scale, + positive_kwargs=positive_kwargs, + negative_kwargs=negative_kwargs, + ) + + # Key method 2: Step scheduler with automatic CFG synchronization + latents = self.scheduler_step_maybe_with_cfg( + noise_pred, t, latents, do_true_cfg + ) + + return latents +``` + +**Key Points:** + +- `positive_kwargs`: transformer arguments for conditional (text-guided) prediction +- `negative_kwargs`: transformer arguments for unconditional prediction (set to `None` if CFG disabled) +- For image editing pipelines, add `output_slice=image_seq_len` to extract the generative image portion + +### Step 2: Call `diffuse` + +Call `self.diffuse` in your pipeline's forward function: + +```python +import torch.nn as nn +class YourModelPipeline(nn.Module, CFGParallelMixin): + def forward( + self, + prompt: str, + negative_prompt: str | None = None, + guidance_scale: float = 3.5, + num_inference_steps: int = 50, + **kwargs, + ): + # Encode prompts, Initialize latents, Get timesteps + ... + # Run diffusion loop (calls the mixin's diffuse method) + latents = self.diffuse( + prompt_embeds=prompt_embeds, + prompt_embeds_mask=prompt_embeds_mask, + negative_prompt_embeds=negative_embeds, + negative_prompt_embeds_mask=negative_mask, + latents=latents, + timesteps=timesteps, + do_true_cfg=do_true_cfg, + true_cfg_scale=guidance_scale, + ... + ) +``` + +--- + +## Customization + +### Override `predict_noise()` for Custom Transformer Calls + +If your transformer requires custom prediction function, you can rewrite `predict_noise` function. Taking Wan2.2 as an example, which has two transformer models. The actual transformer to be called is determined by `self.transformer`. + +```python +class Wan22Pipeline(nn.Module, CFGParallelMixin): + def predict_noise(self, current_model: nn.Module | None = None, **kwargs: Any) -> torch.Tensor: + if current_model is None: + current_model = self.transformer + return current_model(**kwargs)[0] +``` + + +### Override `cfg_normalize_function()` for Custom Normalization + +Some models have their own normalization function. Taking LongCat Image model as an example: + +```python +class LongCatImagePipeline(nn.Module, CFGParallelMixin): + def cfg_normalize_function(self, noise_pred, comb_pred, cfg_renorm_min=0.0): + """ + Normalize the combined noise prediction. + """ + cond_norm = torch.norm(noise_pred, dim=-1, keepdim=True) + noise_norm = torch.norm(comb_pred, dim=-1, keepdim=True) + scale = (cond_norm / (noise_norm + 1e-8)).clamp(min=cfg_renorm_min, max=1.0) + noise_pred = comb_pred * scale + return noise_pred + + # The original cfg_normalize_function function in CFGParallelMixin + # cond_norm = torch.norm(noise_pred, dim=-1, keepdim=True) + # noise_norm = torch.norm(comb_pred, dim=-1, keepdim=True) + # noise_pred = comb_pred * (cond_norm / noise_norm) + # return noise_pred +``` + +--- + +## Testing + +After adding CFG-Parallel support, test with: + +```bash +cd examples/offline_inference/text_to_image +python text_to_image.py \ + --model Your-org/your-model \ + --prompt "a cup of coffee on the table" \ + --negative_prompt "ugly, unclear" \ + --cfg_scale 4.0 \ + --num_inference_steps 50 \ + --output "cfg_enabled.png" \ + --cfg_parallel_size 2 +``` + +**Verify:** + +1. Check logs for CFG parallel being activated +2. Record the `e2e_time_ms` in the log and compare with CFG-Parallel disabled +3. Compare the generated result quality with baseline +4. Record comparison results in your PR + +--- + +## Troubleshooting + +### Issue: CFG parallel not activating + +**Symptoms:** Generation still slow, logs don't show CFG parallel being used. + +**Causes & Solutions:** + +- **CFG is not enabled:** + +**Problem:** Guidance scale too low or negative prompt not provided. + +**Solution:** Ensure `guidance_scale > 1.0` and negative prompt is provided: +```python +images = pipeline( + prompt="a cat", + negative_prompt="", # Must provide (even if empty) + guidance_scale=3.5, # Must be > 1.0 +) +``` + +--- + +## Reference Implementations + +Complete examples in the codebase: + +| Model | Path | Pattern | Notes | +|-------|------|---------|-------| +| **Qwen-Image** | `vllm_omni/diffusion/models/qwen_image/cfg_parallel.py` | Mixin | Dual-stream transformer | +| **Qwen-Image-Edit** | `vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image_edit.py` | Mixin | Image editing with `output_slice` | +| **Wan2.2** | `vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.py` | Mixin | Dual-transformer architecture | +| **CFGParallelMixin** | `vllm_omni/diffusion/distributed/cfg_parallel.py` | Base implementation | Core mixin class | + +--- + +## Summary + +Adding CFG-Parallel support: + +1. ✅ **Create mixin** - Inherit from `CFGParallelMixin` and implement `diffuse()` method +2. ✅ **(Optional) Customize** - Override `predict_noise()` or `cfg_normalize_function()` for custom behavior +3. ✅ **Test** - Verify with `--cfg_parallel_size 2` and compare performance diff --git a/docs/contributing/features/sequence_parallel.md b/docs/contributing/features/sequence_parallel.md new file mode 100644 index 000000000..3bcee7345 --- /dev/null +++ b/docs/contributing/features/sequence_parallel.md @@ -0,0 +1,405 @@ +# Support Sequence Parallel + +This section describes how to add Sequence Parallel (SP) to a diffusion transformer model. We use the Qwen-Image transformer and Wan2.2 transformer as reference implementations. + +--- + +## Table of Contents + +- [Overview](#overview) +- [Approach 1: Non-Intrusive `_sp_plan` (Recommended)](#approach-1-non-intrusive-_sp_plan-recommended) +- [Approach 2: Intrusive Modification (For Complex Cases)](#approach-2-intrusive-modification-for-complex-cases) +- [Testing](#testing) +- [Troubleshooting](#troubleshooting) +- [Reference Implementations](#reference-implementations) +- [Summary](#summary) + +--- + +## Overview + + +### What is Sequence Parallel? + +**Terminology Note:** Our "Sequence Parallelism" (SP) corresponds to "Context Parallelism" (CP) in the [diffusers library](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/_modeling_parallel.py). We use "Sequence Parallelism" to align with vLLM-Omni's terminology. + +Diffusion transformers process long sequences of image patches or video frames. For high-resolution generation, these sequences can become very large. Enabling SP allows each GPU to process only a portion of the sequence, with attention mechanisms (Ulysses/Ring) handling cross-GPU communication transparently. + +### Architecture + +The major APIs for Sequence Parallel: + +```python +from vllm_omni.diffusion.distributed.sp_plan import ( + SequenceParallelInput, # For sharding (splitting) tensors + SequenceParallelOutput, # For gathering tensors +) +from vllm_omni.diffusion.distributed.sp_sharding import sp_shard, sp_gather +``` + +| Method/Class | Purpose | Behavior | +|--------------|---------|----------| +| `SequenceParallelInput` | Declare input sharding in `_sp_plan` | Auto-shards tensors at module input | +| `SequenceParallelOutput` | Declare output gathering in `_sp_plan` | Auto-gathers tensors at module output | +| `sp_shard()` | Manual tensor sharding | Splits tensor across SP workers | +| `sp_gather()` | Manual tensor gathering | Gathers sharded tensors from all workers | + +--- + +## Approach 1: Non-Intrusive `_sp_plan` (Recommended) + +The `_sp_plan` mechanism allows SP **without modifying `forward()` logic**. The framework automatically registers hooks to shard inputs and gather outputs at module boundaries. + +**When to use:** +- Standard transformer architectures +- Tensor operations happen at `nn.Module` boundaries +- Predictable sharding/gathering patterns + +**How it works:** +1. Declare `_sp_plan` dict in your transformer class +2. Framework automatically applies hooks when `sequence_parallel_size > 1` +3. Hooks shard/gather tensors at specified module boundaries +4. Attention layers handle cross-GPU communication internally + +```python +class StandardTransformer(nn.Module): + _sp_plan = { + # Shard hidden_states at first transformer block input + "blocks.0": { + "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), + }, + # Gather at final output projection + "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), + } +``` + +`StandardTransformer` has a transformer blocks list `self.blocks = nn.ModuleList([...])`, and a projection output layer `self.proj_out`. The `_sp_plan` above defines that when SP is enabled, sharding the input tensor to the first transformer block, and gathering the sharded tensor at the final output projection layer. + +**Requirements:** +- Tensor operations that need sharding/gathering must happen at **`nn.Module` boundaries** +- Inline Python operations (e.g., `torch.cat`, `pad_sequence`) **cannot be hooked** + +**Solution for inline operations:** Extract into a submodule (see Step 2 below). + +### Step 1: Understand Module Boundaries + +Identify where tensors need to be sharded or gathered in your model's forward pass: + +```python +class MyTransformer(nn.Module): + def __init__(self): + self.patch_embed = PatchEmbed() # ← Boundary 1 + self.pos_embed = RoPE() # ← Boundary 2 + self.blocks = nn.ModuleList([...]) # ← Boundary 3 + self.norm_out = LayerNorm() + self.proj_out = Linear() # ← Boundary 4 + + def forward(self, x): + x = self.patch_embed(x) # ← Shard before this? + pos = self.pos_embed(x) # ← Shard RoPE outputs? + for block in self.blocks: + x = block(x, pos) # ← Blocks process sharded x + x = self.norm_out(x) + output = self.proj_out(x) # ← Gather after this? + return output +``` + +### Step 2: Handle Inline Operations + +If your `forward()` contains inline tensor operations, **extract them into submodules**. + +**Example: Z-Image concatenates image + text features inline** + +```python +# ❌ BAD: Inline operation - hooks cannot intercept +class ZImageTransformer(nn.Module): + def forward(self, x, cap_feats): + # This concatenation happens inline - _sp_plan can't shard it! + unified = torch.cat([x, cap_feats], dim=1) + + for layer in self.layers: + unified = layer(unified) + + return unified + +# ✅ GOOD: Extract into submodule +class UnifiedPrepare(nn.Module): + """Submodule to concatenate image and text features.""" + def forward(self, x, cap_feats): + return torch.cat([x, cap_feats], dim=1) + +class ZImageTransformer(nn.Module): + def __init__(self): + super().__init__() + self.unified_prepare = UnifiedPrepare() # Now a module! + self.layers = nn.ModuleList([...]) + + def forward(self, x, cap_feats): + # Now _sp_plan can shard the output of unified_prepare! + unified = self.unified_prepare(x, cap_feats) + + for layer in self.layers: + unified = layer(unified) + + return unified +``` + +**Other common cases:** +- `pad_sequence()` → `PadSequenceModule` +- `torch.cat()` → `ConcatModule` +- `tensor.reshape()` → `ReshapeModule` +- Complex preprocessing → `PreprocessModule` + +### Step 3: Write `_sp_plan` for Your Model + +Create a class-level `_sp_plan` dictionary specifying where to shard/gather tensors. + +Typically, there are two patterns for diffusion models: + +**Pattern 1: Shard at first block, gather at output projection** + +Most common pattern for standard transformers: + +```python +from vllm_omni.diffusion.distributed.sp_plan import ( + SequenceParallelInput, # For sharding (splitting) tensors + SequenceParallelOutput, # For gathering tensors +) +class StandardTransformer(nn.Module): + _sp_plan = { + # Shard hidden_states at first transformer block input + "blocks.0": { + "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), + }, + # Gather at final output projection + "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), + } +``` + +**Pattern 2: Shard RoPE embeddings separately** + +When RoPE is computed in a separate module: + +```python +from vllm_omni.diffusion.distributed.sp_plan import ( + SequenceParallelInput, # For sharding (splitting) tensors + SequenceParallelOutput, # For gathering tensors +) +class TransformerWithRoPE(nn.Module): + _sp_plan = { + # Shard RoPE module OUTPUTS (returns tuple of cos, sin) + "rope": { + 0: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), # cos + 1: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), # sin + }, + # Shard transformer block INPUT + "blocks.0": { + "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), + }, + # Gather at output + "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), + } +``` + +### API Reference + +**SequenceParallelInput Parameters:** + +| Parameter | Type | Description | +|-----------|------|-------------| +| `split_dim` | int | Dimension to split (usually `1` for sequence) | +| `expected_dims` | int \| None | Expected tensor rank for validation (optional) | +| `split_output` | bool | `False`: shard **input** params; `True`: shard **output** tensors | +| `auto_pad` | bool | Auto-pad if sequence not divisible by world_size (default: `False`) | + +**SequenceParallelOutput Parameters:** + +| Parameter | Type | Description | +|-----------|------|-------------| +| `gather_dim` | int | Dimension to gather (usually `1` for sequence) | +| `expected_dims` | int \| None | Expected tensor rank for validation (optional) | + +**Module Naming Conventions:** + +| Key | Meaning | Python equivalent | +|-----|---------|-------------------| +| `""` | Root model | `model` | +| `"blocks.0"` | First element of ModuleList | `model.blocks[0]` | +| `"blocks.*"` | All elements of ModuleList | `for b in model.blocks` | +| `"rope"` | Named submodule | `model.rope` | +| `"outputs.main"` | ModuleDict entry | `model.outputs["main"]` | + +**Dictionary Value Types:** + +| Key type | `split_output` | Description | +|----------|----------------|-------------| +| `"param_name"` (str) | `False` | Shard **input parameter** by name | +| `0`, `1`, ... (int) | `True` | Shard **output tuple** by index | + +--- + +## Approach 2: Intrusive Modification (For Complex Cases) + +For models with dynamic sharding logic that cannot be expressed via `_sp_plan`, manually insert shard/gather calls. + +**When to use:** +- Dynamic/conditional sharding logic +- Complex tensor manipulations that can't be encapsulated +- Temporary workaround during development + +```python +from vllm_omni.diffusion.distributed.sp_sharding import sp_shard, sp_gather + +def forward(self, hidden_states, ...): + if self.parallel_config.sequence_parallel_size > 1: + hidden_states = sp_shard(hidden_states, dim=1) + + # ... computation ... + + if self.parallel_config.sequence_parallel_size > 1: + output = sp_gather(output, dim=1) + + return output +``` + +--- + +## Testing + +After implementing Sequence Parallel support, thoroughly test your implementation to ensure correctness and performance across different configurations. + +**Test Different `sp_size`:** + +Test your model with various sequence parallel world sizes to verify correctness and identify optimal configurations: + +```bash +cd examples/offline_inference/text_to_image +python text_to_image.py \ + --model Your-org/your-model \ + --prompt "a cup of coffee on the table" \ + --num_inference_steps 50 \ + --ulysses_degree 2 \ + --ring_degree 2 \ + --output sp_test_image_ulysses=2_ring=2.png +``` + +**Verify:** + +1. **Correctness:** Output should be identical across all `sp_size` values +2. **Speed:** Throughput should remain stable or improve (especially for large sequences) +3. **Logs:** Check for any shape mismatch or communication errors + +**Test with Tensor Parallel:** + +Sequence Parallel can be combined with other parallelism strategies: + +```bash +cd examples/offline_inference/text_to_image +python text_to_image.py \ + --model Your-org/your-model \ + --prompt "a cup of coffee on the table" \ + --num_inference_steps 50 \ + --ulysses_degree 2 \ + --tensor_parallel_size 2 \ + --output sp_test_image_ulysses=2_tp=2.png +``` + +--- + +## Troubleshooting + +### Issue: Shape mismatch errors + +**Symptoms:** `RuntimeError: shape mismatch` during forward pass. + +**Causes & Solutions:** + +- **RoPE dimension mismatch:** + +**Problem:** RoPE embeddings not sharded, but hidden_states is sharded. + +**Solution:** Shard RoPE outputs in `_sp_plan`: +```python +_sp_plan = { + "rope": { + 0: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), + 1: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), + }, + ... +} +``` + +- **Sequence Length not divisible by sp_size:** + +**Problem:** `SequenceParallelInput(auto_pad=False)` - auto_pad should be True to enable automatic sequence padding. + +**Solution:** In `SequenceParallelInput`, set `auto_pad=True`: +```python +"blocks.0": { + "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3, auto_pad=True) +} +``` + +### Issue: Inline operations not sharded + +**Symptoms:** Some tensors remain full-sized, not sharded. + +**Causes & Solutions:** + +- **Operations happen inline in `forward()`, not at module boundaries:** + +**Problem:** +```python +def forward(self, x, cap): + unified = torch.cat([x, cap], dim=1) # ← Inline operation! + # _sp_plan can't hook this +``` + +**Solution:** Extract into submodule: +```python +class ConcatModule(nn.Module): + def forward(self, x, cap): + return torch.cat([x, cap], dim=1) + +class MyModel(nn.Module): + _sp_plan = { + "concat": { + 0: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), + 1: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), + }, + ... + } + def __init__(self): + self.concat = ConcatModule() # Now hookable! + + def forward(self, x, cap): + unified = self.concat(x, cap) # ← Can be sharded via _sp_plan +``` + +--- + +## Reference Implementations + +Complete examples in the codebase: + +| Model | Path | Pattern | Notes | +|-------|------|---------|-------| +| **Qwen-Image** | `vllm_omni/diffusion/models/qwen_image/qwen_image_transformer.py` | Dual-stream + preprocessing | auto_pad, separate RoPE | +| **Wan2.2** | `vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py` | Dual-Transformer + RoPE | Video transformer | +| **Z-Image** | `vllm_omni/diffusion/models/z_image/z_image_transformer.py` | Unified sequence | Concatenated input | +| **SP Plan Types** | `vllm_omni/diffusion/distributed/sp_plan.py` | Type definitions | SequenceParallelInput/Output | +| **Hook Implementation** | `vllm_omni/diffusion/hooks/sequence_parallel.py` | Hook mechanics | How hooks work | +| **Tests** | `tests/diffusion/distributed/test_sp_plan_hooks.py` | Test examples | Validation patterns | + +--- + +## Summary + +Adding Sequence Parallel support to a transformer: + +1. ✅ **Choose approach** - Use `_sp_plan` for standard cases, intrusive modification for complex cases +2. ✅ **Identify sharding boundaries** - Where should tensors be split/gathered? +3. ✅ **Extract inline operations** - Move `torch.cat`, `pad_sequence`, etc. to submodules +4. ✅ **Define `_sp_plan`** - Declare shard/gather points as class attribute +5. ✅ **Use `auto_pad` for variable lengths** - Support non-uniform sequences +6. ✅ **Test** - Verify with different `ulysses_degree` and `ring_degree` combinations diff --git a/docs/contributing/features/teacache.md b/docs/contributing/features/teacache.md new file mode 100644 index 000000000..6c29c0f99 --- /dev/null +++ b/docs/contributing/features/teacache.md @@ -0,0 +1,459 @@ +# Support TeaCache + +This section describes how to add TeaCache to a diffusion transformer model. We use the Qwen-Image transformer as the reference implementation. + +--- + +## Table of Contents + +- [Overview](#overview) +- [Step-by-Step Implementation](#step-by-step-implementation) +- [Customization](#customization) +- [Testing](#testing) +- [Troubleshooting](#troubleshooting) +- [Reference Implementations](#reference-implementations) +- [Summary](#summary) + +--- + +## Overview + +### What is TeaCache? + +TeaCache speeds up diffusion inference by caching transformer block computations when consecutive timesteps are similar. It provides **1.5x-2.0x speedup** with minimal quality loss. + +The core insight is that the modulated input (after normalization and timestep conditioning) changes gradually across timesteps. By measuring the L1 distance between consecutive modulated inputs and comparing it to a threshold, TeaCache decides whether to execute the full transformer blocks or reuse the cached residual from the previous step. + +vLLM-omni provides a **hook-based** TeaCache system that requires **zero changes to model code**. The hook completely intercepts the transformer's forward pass and implements adaptive caching transparently. This design allows easy integration with any transformer model by simply writing an extractor function. + +### Architecture + +The TeaCache system consists of three main components: + +| Component | Purpose | Location | +|-----------|---------|----------| +| [`CacheContext`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/#vllm_omni.diffusion.cache.CacheContext) | Dataclass containing model-specific information for caching | `vllm_omni/diffusion/cache/teacache/context.py` | +| [`EXTRACTOR_REGISTRY`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/teacache/extractors/#vllm_omni.diffusion.cache.teacache.extractors.EXTRACTOR_REGISTRY) | Maps transformer class names to extractor functions | `vllm_omni/diffusion/cache/teacache/extractors.py` | +| [`TeaCacheConfig`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/cache/#vllm_omni.diffusion.cache.TeaCacheConfig) | Configuration including thresholds and polynomial coefficients | `vllm_omni/diffusion/cache/teacache/config.py` | + +The hook handles all caching logic automatically, including: + +- CFG-aware state management (separate states for positive/negative branches) +- CFG-parallel compatibility +- L1 distance computation with polynomial rescaling +- Residual caching and reuse + + +--- + +## Step-by-Step Implementation + +To add TeaCache support for a new model, you need to: + +1. Write an **extractor function** that returns a `CacheContext` object +2. Register the extractor in the `EXTRACTOR_REGISTRY` +3. Add model-specific polynomial coefficients to `TeaCacheConfig` + +### Step 1: Model-Specific Preprocessing + +Extract and process model inputs. This typically involves: +- Embedding image/latent inputs +- Processing text encoder outputs (if dual-stream) +- Creating timestep embeddings +- Computing positional embeddings + +**Example (Qwen-Image):** + +```python +def extract_qwen_context( + module: nn.Module, + hidden_states: torch.Tensor, + encoder_hidden_states: torch.Tensor, + encoder_hidden_states_mask: torch.Tensor, + timestep: torch.Tensor, + img_shapes: torch.Tensor, + txt_seq_lens: torch.Tensor, + guidance: torch.Tensor | None = None, + **kwargs: Any, +) -> CacheContext: + # Validate model structure + if not hasattr(module, "transformer_blocks") or len(module.transformer_blocks) == 0: + raise ValueError("Module must have transformer_blocks") + + # Preprocessing: embed inputs + hidden_states = module.img_in(hidden_states) + timestep = timestep.to(device=hidden_states.device, dtype=hidden_states.dtype) + encoder_hidden_states = module.txt_norm(encoder_hidden_states) + encoder_hidden_states = module.txt_in(encoder_hidden_states) + + # Create timestep embedding + if guidance is not None: + guidance = guidance.to(hidden_states.dtype) * 1000 + temb = ( + module.time_text_embed(timestep, hidden_states) + if guidance is None + else module.time_text_embed(timestep, guidance, hidden_states) + ) + + # Compute position embeddings + image_rotary_emb = module.pos_embed(img_shapes, txt_seq_lens, device=hidden_states.device) +``` + +### Step 2: Extract Modulated Input + +The modulated input is used for cache decisions. Extract it from the **first transformer block** after normalization and modulation. + +**Example (Qwen-Image):** + +```python + # Extract modulated input from first transformer block + block = module.transformer_blocks[0] + img_mod_params = block.img_mod(temb) + img_mod1, _ = img_mod_params.chunk(2, dim=-1) + img_modulated, _ = block.img_norm1(hidden_states, img_mod1) +``` + +**Key Points:** + +- Use the **first block** to extract modulated input early +- Apply the same normalization and modulation as the actual forward pass +- The tensor should represent the processed features that will change across timesteps + +### Step 3: Define Transformer Execution + +Create a callable that executes all transformer blocks. This encapsulates the main computation loop. + +**Example (Qwen-Image dual-stream):** + +```python + def run_transformer_blocks(): + """Execute all Qwen transformer blocks.""" + h = hidden_states + e = encoder_hidden_states + + for block in module.transformer_blocks: + e, h = block( + hidden_states=h, + encoder_hidden_states=e, + encoder_hidden_states_mask=encoder_hidden_states_mask, + temb=temb, + image_rotary_emb=image_rotary_emb, + ) + return (h, e) # Return both image and text hidden states +``` + +**Example (Single-stream model like Flux):** + +```python + def run_transformer_blocks(): + """Execute all Flux transformer blocks.""" + h = hidden_states + + for block in module.transformer_blocks: + h = block(h, temb=temb) + return (h,) # Return only image hidden states +``` + +**Key Points:** + +- Return format: +- For single-stream models: return `(hidden_states,)` +- For dual-stream models: return `(hidden_states, encoder_hidden_states)` + +### Step 4: Define Postprocessing + +Create a callable that applies final transformations to produce the model output. + +**Example (Qwen-Image):** + +```python + return_dict = kwargs.get("return_dict", True) + + def postprocess(h): + """Apply Qwen-specific output postprocessing.""" + h = module.norm_out(h, temb) + output = module.proj_out(h) + if not return_dict: + return (output,) + return Transformer2DModelOutput(sample=output) +``` + +### Step 5: Return CacheContext + +Package all information into a `CacheContext` object. + +```python + return CacheContext( + modulated_input=img_modulated, + hidden_states=hidden_states, + encoder_hidden_states=encoder_hidden_states, # or None for single-stream + temb=temb, + run_transformer_blocks=run_transformer_blocks, + postprocess=postprocess, + ) +``` + +**CacheContext Fields:** + +| Field | Type | Purpose | +|-------|------|---------| +| `modulated_input` | `torch.Tensor` | Tensor used for cache decision (similarity comparison) | +| `hidden_states` | `torch.Tensor` | Current hidden states (will be modified by caching) | +| `encoder_hidden_states` | `torch.Tensor | None` | Encoder states for dual-stream models, `None` for single-stream | +| `temb` | `torch.Tensor` | Timestep embedding tensor | +| `run_transformer_blocks` | `Callable[[], tuple]` | Executes transformer blocks, returns `(hidden_states, [encoder_hidden_states])` | +| `postprocess` | `Callable[[torch.Tensor], Any]` | Applies final transformations to produce model output | +| `extra_states` | `dict | None` | Optional dict for additional model-specific state | + +### Step 6: Register the Extractor + +Add your extractor to the `EXTRACTOR_REGISTRY` in `vllm_omni/diffusion/cache/teacache/extractors.py`: + +```python +EXTRACTOR_REGISTRY: dict[str, Callable] = { + "QwenImageTransformer2DModel": extract_qwen_context, + "Bagel": extract_bagel_context, + "ZImageTransformer2DModel": extract_zimage_context, + "YourModelTransformer2DModel": extract_your_model_context, # Add here +} +``` + +**Key:** Use the transformer class name (`module.__class__.__name__`) + +### Step 7: Add Model Coefficients + +Add polynomial rescaling coefficients to `vllm_omni/diffusion/cache/teacache/config.py`: + +```python +_MODEL_COEFFICIENTS = { + "QwenImageTransformer2DModel": [ + -4.50000000e02, + 2.80000000e02, + -4.50000000e01, + 3.20000000e00, + -2.00000000e-02, + ], + "YourModelTransformer2DModel": [ # Add your model's coefficients + # 5 polynomial coefficients (can reuse similar model's coefficients initially) + ], +} +``` + + +**Initial approach:** Start with coefficients from a similar model architecture, then tune empirically following [Customization](#customization) section. + +--- + +## Customization + +### Coefficient Estimation + +While you can start with coefficients from a similar model architecture, estimating custom coefficients for your specific model typically improves TeaCache performance. + +**Why Estimate Coefficients?** + +The polynomial coefficients rescale L1 distances between consecutive modulated inputs to better predict when cached residuals can be reused. Model-specific coefficients account for: + +- Architecture differences (layer count, hidden size, attention patterns) +- Training data characteristics +- Noise prediction behavior across timesteps + +| Approach | Performance | Effort | +|----------|-------------|--------| +| Using defaults from similar model | Within 5-10% of optimal | Low | +| Estimating custom coefficients | Best performance | Medium | + +#### Implement Data Collection Adapter + +Add an adapter in `vllm_omni/diffusion/cache/teacache/coefficient_estimator.py`: + +```python +class YourModelAdapter: + """Adapter for coefficient estimation on your model.""" + + @staticmethod + def load_pipeline(model_path: str, device: str, dtype: torch.dtype) -> Any: + """Load your diffusion pipeline.""" + from your_model_package import YourModelPipeline + + pipeline = YourModelPipeline.from_pretrained( + model_path, + torch_dtype=dtype, + ) + pipeline = pipeline.to(device) + return pipeline + + @staticmethod + def get_transformer(pipeline: Any) -> tuple[Any, str]: + """Extract transformer from pipeline.""" + return pipeline.transformer, "YourTransformer2DModel" + + @staticmethod + def install_hook(transformer: Any, hook: DataCollectionHook) -> None: + """Install data collection hook on transformer.""" + from vllm_omni.diffusion.hooks import HookRegistry + + registry = HookRegistry.get_or_create(transformer) + registry.register_hook(hook._HOOK_NAME, hook) + + +# Register your adapter +_MODEL_ADAPTERS["YourModel"] = YourModelAdapter +``` + +#### Collect Data and Estimate + +```python +from vllm_omni.diffusion.cache.teacache.coefficient_estimator import ( + TeaCacheCoefficientEstimator, +) +from datasets import load_dataset +from tqdm import tqdm + +# Initialize estimator +estimator = TeaCacheCoefficientEstimator( + model_path="/path/to/your/model", + model_type="YourModel", +) + +# Load diverse prompts (paper recommends ~70 prompts) +dataset = load_dataset("nateraw/parti-prompts", split="train") +prompts = dataset["Prompt"][:70] + +# Collect data +for prompt in tqdm(prompts, desc="Collecting data"): + estimator.collect_from_prompt(prompt=prompt, num_inference_steps=50) + +# Estimate coefficients +coeffs = estimator.estimate(poly_order=4) +print(f"Estimated coefficients: {coeffs.tolist()}") +``` + +**Data Statistics Guide:** + +| Metric | Good Range | Warning Signs | +|--------|------------|---------------| +| **Count** | 2000-5000+ | < 1000: too few prompts | +| **Input Diffs (x)** | 0.01-0.10 | Very small (<0.001): model may not modulate properly | +| **Output Diffs (y)** | Should correlate with x | No correlation: check extractor | +| **Coefficient magnitude** | -1e6 to 1e6 | > 1e8: numerical instability | + +--- + +## Testing + +After adding TeaCache support, test with: + +```python +from vllm_omni import Omni +from vllm_omni.inputs.data import OmniDiffusionSamplingParams + +omni = Omni( + model="your-model-name", + cache_backend="tea_cache", + cache_config={ + "rel_l1_thresh": 0.2, + "coefficients": [1.33e6, -1.69e5, 7.95e3, -1.64e2, 1.26], # Your coefficients + } +) + +images = omni.generate( + "a beautiful landscape", + OmniDiffusionSamplingParams(num_inference_steps=50), +) +``` + +**Verify:** + +1. **Check logs** - Look for TeaCache initialization messages +2. **Compare performance** - Measure speedup vs baseline (expect 1.5x-2.0x) +3. **Verify output quality** - Visually compare cached vs uncached outputs (should be nearly identical) + +See more detailed examples in [user guide for teacache](../../user_guide/diffusion/teacache.md). + +--- + +## Troubleshooting + +### Issue: "Unknown model type" + +**Symptoms:** Error message indicating the model type is not recognized when enabling TeaCache. + +**Causes & Solutions:** + +- **Extractor not registered:** + +**Problem:** The transformer class name doesn't exist in `EXTRACTOR_REGISTRY`. + +**Solution:** Check the class name and add to registry: +```python +# Check transformer class name +print(pipeline.transformer.__class__.__name__) + +# Add to EXTRACTOR_REGISTRY +EXTRACTOR_REGISTRY["YourTransformer2DModel"] = extract_your_context +``` + +- **Transformer class name mismatch:** + +**Solution:** Ensure the registry key matches exactly with `module.__class__.__name__`. + +### Issue: "Cannot find coefficients" + +**Symptoms:** Error when initializing TeaCache about missing model coefficients. + +**Causes & Solutions:** + +- **Missing coefficients in config:** + +**Solution:** Add coefficients to `_MODEL_COEFFICIENTS` in `config.py`, or pass custom coefficients: +```python +omni = Omni( + model="your-model", + cache_backend="tea_cache", + cache_config={"coefficients": [1.0, -0.5, 0.1, -0.01, 0.001]} +) +``` + +### Issue: Quality Degradation + +**Symptoms:** Output images look noticeably different or have artifacts compared to baseline. + +**Causes & Solutions:** + +- **Threshold too high:** + +**Problem:** `rel_l1_thresh` is too aggressive, causing cache reuse when outputs differ significantly. + +**Solution:** Lower the threshold: +```python +cache_config={"rel_l1_thresh": 0.1} # Try 0.1-0.2 +``` + +- **Coefficients not tuned:** + +**Solution:** Estimate model-specific coefficients using the coefficient estimation process described above. + +--- + +## Reference Implementations + +Complete examples in the codebase: + +| Model | Path | Pattern | Notes | +|-------|------|---------|-------| +| **Qwen-Image** | `vllm_omni/diffusion/cache/teacache/extractors.py` | Dual-stream | `extract_qwen_context` | +| **Bagel** | `vllm_omni/diffusion/cache/teacache/extractors.py` | Omni model | `extract_bagel_context` | +| **TeaCache Core** | `vllm_omni/diffusion/cache/teacache/` | Base implementation | Hook and config | +| **Coefficient Estimator** | `vllm_omni/diffusion/cache/teacache/coefficient_estimator.py` | Estimation tool | Adapter pattern | + +--- + +## Summary + +Adding TeaCache support: + +1. ✅ **Write extractor** - Create function returning `CacheContext` with model-specific preprocessing +2. ✅ **Register extractor** - Add to `EXTRACTOR_REGISTRY` with transformer class name +3. ✅ **Add coefficients** - Add polynomial coefficients to `_MODEL_COEFFICIENTS` +4. ✅ **Test** - Verify with `cache_backend="tea_cache"` diff --git a/docs/contributing/features/tensor_parallel.md b/docs/contributing/features/tensor_parallel.md new file mode 100644 index 000000000..aecc1aedc --- /dev/null +++ b/docs/contributing/features/tensor_parallel.md @@ -0,0 +1,279 @@ +# Support Tensor Parallel + +This section describes how to add Tensor Parallel (TP) to a diffusion transformer model. We use the Z-Image transformer as the reference implementation. + +--- + +## Table of Contents + +- [Overview](#overview) +- [Step-by-Step Implementation](#step-by-step-implementation) +- [Testing](#testing) +- [Troubleshooting](#troubleshooting) +- [Reference Implementations](#reference-implementations) +- [Summary](#summary) + +--- + +## Overview + +### What is Tensor Parallel? + +Tensor Parallel (TP) is a model parallelism technique that **shards model weights** across multiple GPUs. Each GPU holds only a portion of the model's parameters and computes only part of each layer's output. + +Diffusion transformers contain large attention and MLP layers. We can use Tensor Parallel to shard the model dimension across multiple GPUs, allowing larger models to fit in memory while achieving near-linear speedup. + +### Architecture + +The Tensor Parallel implementation relies vLLM's Parallel Layers: + +[vLLM Parallel Layers API Reference](https://docs.vllm.ai/en/latest/contributing/model/basic/?h=column#3-optional-implement-tensor-parallelism-and-quantization-support) + +**Parallel Layer Types:** + +| Layer Type | Purpose | Weight Partitioning | +|------------|---------|---------------------| +| `ColumnParallelLinear` | First FFN layer, separated QKV | Columns (output dimension) | +| `RowParallelLinear` | Second FFN layer, attention output | Rows (input dimension) | +| `QKVParallelLinear` | Multi-head/grouped-query attention QKV | Handles head replication automatically | +| `ReplicatedLinear` | Layers that shouldn't be sharded | No partitioning (replicated) | + +--- + +## Step-by-Step Implementation + + +### Step 1: Identify Linear Layers + +Find all `nn.Linear` layers in your transformer that need to be sharded. + +**Key questions:** +- Which layers should be column parallel (weight split by columns)? +- Which layers should be row parallel (weight split by rows)? + +### Step 2: Replace Linear Layers with Parallel Equivalents + +Replace `nn.Linear` with parallel layers from `vllm.model_executor.layers.linear`. + +**Example (MLP Block - Up-Down Pattern):** + +```python +class FeedForward(nn.Module): + def __init__(self, dim: int, hidden_dim: int): + super().__init__() + # Column parallel: weight split by columns [hidden_dim/N, dim] + self.w1 = ColumnParallelLinear( + dim, + hidden_dim, + bias=False, + return_bias=False, + ) + self.act = nn.GELU() + + self.w2 = RowParallelLinear( + hidden_dim, + dim, + bias=False, + input_is_parallel=True, # Input already sharded from w1 + return_bias=False, + ) + + def forward(self, x): + # x: [batch, seq, dim] (replicated on all GPUs) + # w1 outputs sharded [batch, seq, hidden_dim/N] + x = self.w1(x) + # act operates on sharded tensors (no communication) + x = self.act(x) + # w2 outputs full dim [batch, seq, dim] via all-reduce + x = self.w2(x) + return x +``` + +**Example (Attention - QKV-Out Pattern):** + +```python +from vllm_omni.diffusion.attention.layer import Attention +class YourModelAttention(nn.Module): + def __init__(self, dim: int, num_heads: int, num_kv_heads: int): + super().__init__() + self.head_dim = dim // num_heads + + # Column parallel: QKV weight split by columns + # Each GPU gets num_heads/N heads + self.to_qkv = QKVParallelLinear( + hidden_size=dim, + head_size=self.head_dim, + total_num_heads=num_heads, + total_num_kv_heads=num_kv_heads, + bias=False, + return_bias=False, + ) + + # Row parallel: output weight split by rows + self.to_out = RowParallelLinear( + dim, + dim, + bias=False, + input_is_parallel=True, # Input sharded from attention + return_bias=False, + ) + + self.attn = Attention( + num_heads=self.to_qkv.num_heads, # Each GPU gets num_heads/N heads + head_size=self.head_dim, + softmax_scale=1.0 / (self.head_dim**0.5), + causal=False, + num_kv_heads=self.to_qkv.num_kv_heads, + ) + + def forward(self, x): + # x: [batch, seq, dim] (replicated) + # to_qkv outputs sharded [batch, seq, (q+k+v) * head_dim/N] + qkv = self.to_qkv(x) + # Split into Q, K, V (each sharded on heads) + q, k, v = qkv.split([...], dim=-1) + # Attention computed independently on each GPU + out = self.attn(q, k, v) + # to_out all-reduces to full dim + out = self.to_out(out) + return out +``` + +**Key Points:** + +- `ColumnParallelLinear` → `RowParallelLinear` is the standard pairing +- Set `input_is_parallel=True` on `RowParallelLinear` when input comes from `ColumnParallelLinear` +- Use `QKVParallelLinear` for attention projections (handles head replication automatically) + +### Step 3: Validate TP Constraints + +For correct TP operation, these dimensions **must be divisible** by `tensor_parallel_size`: + +| Dimension | Reason | Example Error | +|-----------|--------|---------------| +| `num_heads` | Heads sharded by QKVParallelLinear | `num_heads=30, tp=4` ❌ (30 % 4 ≠ 0) | +| `num_kv_heads` | KV heads sharded by QKVParallelLinear | `num_kv_heads=30, tp=4` ❌ (30 % 4 ≠ 0) | + +--- + +## Testing + +After adding Tensor Parallel support, test with: + +```python +from vllm_omni import Omni +from vllm_omni.diffusion.data import DiffusionParallelConfig +from vllm_omni.inputs.data import OmniDiffusionSamplingParams + +parallel_config = DiffusionParallelConfig(tensor_parallel_size=2) +omni = Omni(model="your-model-name", parallel_config=parallel_config) + +output = omni.generate( + "a cup of coffee on the table", + OmniDiffusionSamplingParams(num_inference_steps=50), +) +``` + +**Or via command line:** + +```bash +cd examples/offline_inference/text_to_image +python text_to_image.py \ + --model Your-org/your-model \ + --prompt "a cup of coffee on the table" \ + --negative_prompt "ugly, unclear" \ + --cfg_scale 4.0 \ + --num_inference_steps 50 \ + --output "tp_enabled.png" \ + --tensor_parallel_size 2 +``` + +**Verify:** + +1. Check the `e2e_time_ms` in the log for speedup +2. Compare generated image quality with TP disabled +3. Verify memory usage is reduced proportionally +4. Record comparison results in your PR + +--- + +## Troubleshooting + +### Issue: TP not activating + +**Symptoms:** Model runs on single GPU, no memory savings or speedup. + +**Causes & Solutions:** + +- **Still using `nn.Linear`:** + +**Problem:** Linear layers not replaced with parallel equivalents. + +**Solution:** Replace with parallel layers: +```python +# ❌ BAD +self.proj = nn.Linear(dim, dim) + +# ✅ GOOD +self.proj = RowParallelLinear(dim, dim, input_is_parallel=True) +``` + +### Issue: Dimension mismatch errors + +**Symptoms:** `RuntimeError: shape mismatch` during forward pass. + +**Causes & Solutions:** + +- **Missing `input_is_parallel=True`:** + +**Problem:** RowParallelLinear expects sharded input but receives full tensor. + +**Solution:** Set `input_is_parallel=True` when input comes from ColumnParallelLinear: +```python +# ✅ GOOD: Correct pairing +self.w1 = ColumnParallelLinear(dim, hidden_dim, return_bias=False,) +self.w2 = RowParallelLinear( + hidden_dim, + dim, + input_is_parallel=True, # Input sharded from w1 + return_bias=False, +) +``` + +- **Incorrect split dimensions:** + +**Problem:** QKV split sizes don't match sharded dimensions. + +**Solution:** Use `self.to_qkv.num_heads` (local heads per GPU): +```python +# ❌ BAD: Uses total heads +q_size = self.total_num_heads * self.head_dim + +# ✅ GOOD: Uses local heads +q_size = self.to_qkv.num_heads * self.head_dim +``` + +--- + +## Reference Implementations + +Complete examples in the codebase: + +| Model | Path | Pattern | Notes | +|-------|------|---------|-------| +| **Z-Image** | `vllm_omni/diffusion/models/z_image/z_image_transformer.py` | Standard TP | Full implementation with validation | +| **FLUX** | `vllm_omni/diffusion/models/flux/flux_transformer.py` | Dual-stream | Image + text streams | +| **Qwen-Image** | `vllm_omni/diffusion/models/qwen_image/qwen_image_transformer.py` | Standard TP | With RoPE | +| **TP Tests** | `tests/e2e/offline_inference/test_zimage_tensor_parallel.py` | E2E testing | TP correctness and performance | +| **Constraint Tests** | `tests/diffusion/models/z_image/test_zimage_tp_constraints.py` | Unit testing | Validation logic | + +--- + +## Summary + +Adding Tensor Parallel support to a transformer: + +1. ✅ **Identify linear layers** - Which layers should be sharded? +2. ✅ **Replace with parallel layers** - Use QKVParallelLinear, ColumnParallelLinear, RowParallelLinear +3. ✅ **Validate TP constraints** - Ensure dimensions divisible by TP size +4. ✅ **Test** - Verify with `tensor_parallel_size=N`, check memory, speed, and quality diff --git a/docs/contributing/model/adding_diffusion_model.md b/docs/contributing/model/adding_diffusion_model.md index 80212360f..529cab752 100644 --- a/docs/contributing/model/adding_diffusion_model.md +++ b/docs/contributing/model/adding_diffusion_model.md @@ -1,22 +1,27 @@ -# Adding a Diffusion Model -This guide walks through the process of adding a new Diffusion model to vLLM-Omni, using Qwen/Qwen-Image-Edit as a comprehensive example. +# Adding a Diffusion Model to vLLM-Omni + +This guide walks you through adding a new diffusion model to vLLM-Omni. We use **Qwen-Image** as the primary example, with references to other models (LongCat, Flux, Wan2.2) to illustrate different patterns. + + +--- + +## Table of Contents -# Table of Contents 1. [Overview](#overview) 2. [Directory Structure](#directory-structure) -3. [Step-by-Step Implementation](#step-by-step-implementation) -4. [Testing](#testing) -5. [Adding a Model Recipe](#adding-a-model-recipe) +3. [Basic Implementation](#basic-implementation) +4. [Advanced Features](#advanced-features) +5. [Troubleshooting](#troubleshooting) +6. [Pull Request Checklist](#pull-request-checklist) +7. [Reference Implementations](#reference-implementations) +8. [Summary](#summary) +--- -# Overview -When add a new diffusion model into vLLM-Omni, additional adaptation work is required due to the following reasons: +## Overview -+ New model must follow the framework’s parameter passing mechanisms and inference flow. +vLLM-Omni's diffusion inference follows this architecture: -+ Replacing the model’s default implementations with optimized modules, which is necessary to achieve the better performance. - -The diffusion execution flow as follow:

@@ -24,348 +29,892 @@ The diffusion execution flow as follow:

+**Key Components:** -# Directory Structure -File Structure for Adding a New Diffusion Model +1. **Request Handling:** User prompts → `OmniDiffusionRequest` +2. **Diffusion Engine:** Request → Preprocessing (Optional) → Pipeline execution -> Post-processing +3. **Pipeline Execution:** Request → Encode prompt → Diffusion steps → Vae decode + + +## Directory Structure + +Organize your model files following this structure: ``` vllm_omni/ -└── examples/ - └──offline_inference - └── example script # reuse existing if possible (e.g., image_edit.py) - └──online_serving - └── example script └── diffusion/ - └── registry.py # Registry work - ├── request.py # Request Info - └── models/your_model_name/ # Model directory (e.g., qwen_image) - └── pipeline_xxx.py # Model implementation (e.g., pipeline_qwen_image_edit.py) + ├── registry.py # ← Register your model here + ├── request.py # Request data structures + └── models/ + └── your_model_name/ # ← Create this directory + ├── __init__.py # Export pipeline and transformer + ├── pipeline_xxx.py # Pipeline implementation + └── xxx_transformer.py # Transformer implementation ``` -# Step-by-step-implementation -## Step 1: Model Implementation -The diffusion pipeline’s implementation follows **HuggingFace Diffusers**. -### 1.1 Define the Pipeline Class -Define the pipeline class, e.g., `QwenImageEditPipeline`, and initialize all required submodules, either from HuggingFace `diffusers` or custom implementations. In `QwenImageEditPipeline`, only `QwenImageTransformer2DModel` is re-implemented to support optimizations such as Ulysses-SP. When adding new models in the future, you can either reuse this re-implemented `QwenImageTransformer2DModel` or extend it as needed. +**Naming Conventions:** -### 1.2 Pre-Processing and Post-Processing Extraction -Extract the pre-processing and post-processing logic from the pipeline class to follow vLLM-Omni’s execution flow. For Qwen-Image-Edit: +- **Model directory:** `your_model_name` (lowercase, underscores), e.g., `qwen_image`, `flux`, `longcat_image`, `wan2_2` +- **Pipeline file:** `pipeline_xxx.py` where `xxx` describes the task, e.g., `pipeline_qwen_image.py`, `pipeline_qwen_image_edit.py` +- **Transformer file:** `xxx_transformer.py` matching transformer class name, e.g., `qwen_image_transformer.py`, `flux_transformer.py` + +--- + +## Basic Implementation + +This section covers the minimal steps to get a model working in vLLM-Omni with basic features (online/offline serving, batch requests). + +### Step 1: Adapt Transformer Model + +The transformer is the core denoising network. Start by copying the transformer implementation from Diffusers and making these adaptations. + + +#### 1.1: Remove Diffusers Mixins + +Diffusers' `Mixin` classes are not needed in vLLM-Omni. Remove them: + +```diff +# Before (Diffusers) +- from diffusers.models.modeling_utils import ModelMixin +- from diffusers.models.attention_processor import AttentionModuleMixin + +- class YourModelTransformer2DModel(ModelMixin, AttentionModuleMixin): ++ class YourModelTransformer2DModel(nn.Module): + """Your transformer model.""" +``` + +**Example mixins to remove:** + +- `ModelMixin` - Weight loading utilities (vLLM-Omni has its own weight loader) +- `AttentionModuleMixin` - Attention processors (using vLLM-Omni's Attention layer instead) +- `ConfigMixin` - Config management (not needed) +- `PeftAdapterMixin` - Parameter efficient finetune utilities (not needed) + +#### 1.2: Replace Attention Implementation + +**The most important adaptation:** Replace Diffusers' attention with vLLM-Omni's optimized `Attention` layer. + +**Before (Diffusers):** ```python -def get_qwen_image_edit_pre_process_func( - od_config: OmniDiffusionConfig, -): - """ - Define a pre-processing function that resizes input images and - pre-process for subsequent inference. - """ +from diffusers.models.attention_processor import dispatch_attention_fn + +class YourAttentionBlock(nn.Module): + def forward(self, hidden_states, encoder_hidden_states=None, ...): + ... + hidden_states = dispatch_attention_fn( + query, key, value, + attn_mask=attention_mask, + dropout_p=0.0, + is_causal=False, + backend=self._attention_backend, + ) ``` -```python -def get_qwen_image_edit_post_process_func( - od_config: OmniDiffusionConfig, -): - """ - Defines a post-processing function that post-process images. - """ -``` - -### 1.3 Define the forward function -The forward function of `QwenImageEditPipeline` follows the HuggingFace `diffusers` design for the most part. The key differences are: -+ As described in the overview, arguments are passed through `OnniDiffusionRequest`, so we need to get user parameters from it accordingly. -```python -prompt = req.prompt -``` -+ pre/post-processing are handled by the framework elsewhere, so skip them. - -### 1.4 Replace some ops or layers in DiT component - -vLLM-Omni provides a set of optimized operators with better performance and built-in support for parallelism, including attention, rotary embeddings (RoPE), and linear layers. - -Below is an example showing how to replace standard Transformer attention and FFN layers with vLLM-Omni implementations: - +**After (vLLM-Omni):** ```python from vllm_omni.diffusion.attention.layer import Attention +from vllm_omni.diffusion.attention.backends.abstract import AttentionMetadata + +class YourAttentionBlock(nn.Module): + def __init__(self, ...): + super().__init__() + + # Initialize vLLM-Omni's Attention layer + self.attn = Attention( + num_heads=self.num_heads, + head_size=self.head_dim, + softmax_scale=1.0 / (self.head_dim ** 0.5), + causal=False, # Diffusion models typically use bidirectional attention + num_kv_heads=self.num_kv_heads, + ) + + def forward(self, hidden_states, encoder_hidden_states=None, attention_mask=None, ...): + ... + # Create attention metadata + attn_metadata = AttentionMetadata(attn_mask=attention_mask) + hidden_states = self.attn(query, key, value, attn_metadata=attn_metadata) + +``` + +**Key Points:** + +- **Attention layer initialization:** Done in `__init__`, not per-forward +- **Tensor shapes:** vLLM-Omni `Attention` expects QKV to have `[B, seq, num_heads, head_dim]` shape +- **AttentionMetadata:** Wraps attention mask and other metadata + +**Attention backends:** vLLM-Omni automatically selects the attention backend given the environmental variable `DIFFUSION_ATTENTION_BACKEND`. The default attention backend is `FLASH_ATTN` for diffusion models. + +#### 1.3: Replace Imports and Utilities + +**Logger:** +```diff +- from diffusers.utils import logging +- logger = logging.get_logger(__name__) + ++ from vllm.logger import init_logger ++ logger = init_logger(__name__) +``` + +**Custom layers from vLLM and vLLM-Omni (if needed):** + +```python +from vllm.model_executor.layers.layernorm import RMSNorm from vllm_omni.diffusion.layers.rope import RotaryEmbedding +from vllm_omni.diffusion.layers.adalayernorm import AdaLayerNorm +``` -class MyAttention(nn.Module): - def __init__(self): +#### 1.4: Remove Training-Only Code + +Remove code that's only needed for training: + +```diff +# Remove gradient checkpointing +- if torch.is_grad_enabled() and self.gradient_checkpointing: +- hidden_states = torch.utils.checkpoint.checkpoint( +- self._forward_block, hidden_states, ... +- ) +- else: +- hidden_states = self._forward_block(hidden_states, ...) ++ hidden_states = self._forward_block(hidden_states, ...) + +# Remove training-specific attributes +- self.gradient_checkpointing = False + +# Remove dropout (set to 0 or remove) +- self.dropout = nn.Dropout(dropout_prob) ++ # Removed dropout for inference +``` + +#### 1.5: Add Configuration Support + +Add support for vLLM-Omni's `OmniDiffusionConfig`: + +```python +from vllm_omni.diffusion.data import OmniDiffusionConfig + +class YourModelTransformer2DModel(nn.Module): + def __init__( + self, + *, + od_config: OmniDiffusionConfig | None = None, # ← Add vLLM-Omni config + # ... other model-specific parameters + num_layers: int = 28, + hidden_size: int = 3072, + num_heads: int = 24, + **kwargs, + ): super().__init__() - self.attn = Attention() - self.to_qkv = QKVParallelLinear() - self.to_out = RowParallelLinear() - self.rope = RotaryEmbedding(is_neox_style=False) - def forward(self, hidden_states): - qkv, _ = self.to_qkv(hidden_states) - q, k, v = qkv.split(...) - q, k = self.rope(...) - attn_output = self.attn(q, k, v) - output = self.to_out(attn_output) + # Store config + self.od_config = od_config + self.parallel_config = od_config.parallel_config if od_config else None -class MyFFN(nn.Module): - def __init__(self): + # Model architecture + self.num_layers = num_layers + self.hidden_size = hidden_size + # ... initialize layers +``` + +### Step 2: Adapt Pipeline + +The pipeline orchestrates the full generation process (text encoding, denoising loop, VAE decoding). Adapt it from Diffusers format to vLLM-Omni's interface. + +#### 2.1: Remove Diffusers Inheritance + +**Remove Diffusers base classes:** +```diff +- from diffusers import DiffusionPipeline +- from diffusers.loaders import LoraLoaderMixin + +- class YourModelPipeline(DiffusionPipeline, LoraLoaderMixin): ++ class YourModelPipeline(nn.Module): + """Your model pipeline for vLLM-Omni.""" +``` + +#### 2.2: Adapt `__init__` Method + +**Before (Diffusers):** +```python +class YourModelPipeline(DiffusionPipeline): + def __init__( + self, + vae: AutoencoderKL, + text_encoder: CLIPTextModel, + tokenizer: CLIPTokenizer, + transformer: YourTransformer, + scheduler: FlowMatchScheduler, + ): super().__init__() - self.fc1 = ColumnParallelLinear() - self.fc2 = RowParallelLinear() - self.act = F.gelu - - def forward(self, hidden_states): - hidden, _ = self.fc1(hidden_states) - hidden = self.act(hidden) - output = self.fc2(hidden) - return output + self.register_modules( + vae=vae, + text_encoder=text_encoder, + tokenizer=tokenizer, + transformer=transformer, + scheduler=scheduler, + ) ``` -In this example: - -+ Attention uses vLLM-Omni’s optimized attention kernel together with parallel QKV projection and RoPE. - -+ Linear layers are replaced with column- and row-parallel variants to enable tensor parallelism. - -+ The FFN follows a standard two-layer structure and can be further optimized (e.g., using fused or merged projections) if needed. - - -### 1.5 Provide a `_repeated_blocks` in DiT model -`_repeated_blocks` is the small and frequently-repeated block(s) of a model -- typically a transformer layer. - -It's used for torch compile optimizations. +**After (vLLM-Omni):** ```python -_repeated_blocks = ["QwenImageTransformerBlock"] +import os +from diffusers import AutoencoderKL +from diffusers.schedulers import FlowMatchEulerDiscreteScheduler +from transformers import CLIPTextModel, CLIPTokenizer + +from vllm_omni.diffusion.data import OmniDiffusionConfig +from vllm_omni.diffusion.distributed.utils import get_local_device +from vllm_omni.diffusion.utils.tf_utils import get_transformer_config_kwargs +from vllm_omni.diffusion.models.your_model_name.your_model_transformer import ( + YourModelTransformer2DModel, +) + + +class YourModelPipeline(nn.Module): + def __init__( + self, + *, + od_config: OmniDiffusionConfig, + prefix: str = "", + ): + super().__init__() + self.od_config = od_config + self.parallel_config = od_config.parallel_config + self.device = get_local_device() + model = od_config.model + local_files_only = os.path.exists(model) + + # Load components from checkpoint + self.scheduler = FlowMatchEulerDiscreteScheduler.from_pretrained( + model, subfolder="scheduler", local_files_only=local_files_only) + self.text_encoder = CLIPTextModel.from_pretrained( + model, subfolder="text_encoder", local_files_only=local_files_only).to(self.device) + self.tokenizer = CLIPTokenizer.from_pretrained( + model, subfolder="tokenizer", local_files_only=local_files_only) + self.vae = AutoencoderKL.from_pretrained( + model, subfolder="vae", local_files_only=local_files_only).to(self.device) + + # Initialize transformer with vLLM-Omni config + transformer_kwargs = get_transformer_config_kwargs( + od_config.tf_model_config, YourModelTransformer2DModel) + self.transformer = YourModelTransformer2DModel( + od_config=od_config, **transformer_kwargs) + + # Store VAE scale factor for latent space conversions + self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) + self.default_sample_size = 128 # Default latent size ``` +**Key Changes:** -### 1.6 (Optional) implement sequence parallelism -vLLM-Omni has a non-intrusive `_sp_plan` that enable sequence parallel without modifying `forward()` logic. -You can refer to [How to parallelize a new model](../../user_guide/diffusion/parallelism_acceleration.md) +1. **`od_config` parameter:** All configuration through `OmniDiffusionConfig` +2. **Manual component loading:** No `register_modules()`, load each component explicitly +3. **Local files support:** Check `os.path.exists(model)` for local checkpoints +4. **Transformer with config:** Pass `od_config` to transformer constructor +#### 2.3: Adapt `__call__` → `forward` Method -### 1.7 (Optional) integrate with Cache-Dit -vLLM-Omni supports acceleration via [Cache-Dit](../../user_guide/diffusion/cache_dit_acceleration.md). Most models compatible with Diffusers can use Cache-Dit seamlessly. For new models, you can extend support by modifying`cache_dit_backend.py` +**Change signature:** -## Step 2: Extend OmniDiffusionRequest Fields -User-provided inputs are ultimately passed to the model’s forward method through OmniDiffusionRequest, so we add the required fields here to support the new model. -```python -prompt: str | list[str] | None = None -negative_prompt: str | list[str] | None = None -... +```diff +- @torch.no_grad() +- def __call__( ++ def forward( + self, ++ req: OmniDiffusionRequest, # ← Add request parameter here +- ): ++ ) -> DiffusionOutput: # ← Add return type ``` -## Step 3: Registry -+ registry diffusion model in registry.py +[`OmniDiffusionRequest`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/request/#vllm_omni.diffusion.request.OmniDiffusionRequest) is a dataclass that contains the **prompts** and **sampling parameters** [`OmniDiffusionSamplingParams`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/inputs/data/#vllm_omni.inputs.data.OmniDiffusionSamplingParams) for the diffusion pipeline execution. It also contains a request_id for other components to trace this request and its outputs. + +See some parameters in `OmniDiffusionSamplingParams` as follows: + +| parameters | type |value | function | +|:---:|:---:|:---:|:---:| +| `num_inference_steps` | `int` | 50 | The number of diffusion steps during inference| +| `guidance_scale` | `float` | 0.0 | The classifier free guidance scale | +| `width` and `height` | `int` | None | The width and height of the generated image | + +**Extract parameters from request:** + ```python +from vllm_omni.diffusion.request import OmniDiffusionRequest +from vllm_omni.diffusion.data import DiffusionOutput + +def forward( + self, + req: OmniDiffusionRequest, +) -> DiffusionOutput: + # Extract prompts from request + if req.prompts is not None: + prompt = [ + p if isinstance(p, str) else (p.get("prompt") or "") + for p in req.prompts + ] + + # Extract sampling parameters + sampling_params = req.sampling_params + num_inference_steps = sampling_params.num_inference_steps or 50 + guidance_scale = sampling_params.guidance_scale or 7.5 + height = sampling_params.height or (self.default_sample_size * self.vae_scale_factor) + width = sampling_params.width or (self.default_sample_size * self.vae_scale_factor) + + # For image editing pipelines, extract images from multi_modal_data + if hasattr(req, 'multi_modal_data') and req.multi_modal_data: + input_images = req.multi_modal_data.get('image', []) + + # ... rest of generation logic +``` + +For an image editing model, an example `OmniDiffusionRequest` is like: +```python +{ + "prompt": "turn this cat to a dog", + "multi_modal_data": {"image": input_image} +}, +``` + +**Wrap output:** + +```diff + # Generate images + images = self.vae.decode(latents)[0] + +- return {"images": images} ++ return DiffusionOutput(output=images) +``` + +#### 2.4: Extract Pre/Post-Processing Functions + +vLLM-Omni separates image processing from the main pipeline for better modularity. + +**Post-processing function (required):** +```python +def get_your_model_post_process_func( + od_config: OmniDiffusionConfig, +): + """ + Create post-processing function for your model. + + Returns a function that converts latents to images. + """ + from diffusers.image_processor import VaeImageProcessor + import json + + # Load VAE config to get scale factor + model_path = od_config.model + if not os.path.exists(model_path): + from vllm_omni.diffusion.model_loader.utils import download_weights_from_hf_specific + model_path = download_weights_from_hf_specific(model_path, None, ["*"]) + + vae_config_path = os.path.join(model_path, "vae/config.json") + with open(vae_config_path) as f: + vae_config = json.load(f) + vae_scale_factor = 2 ** (len(vae_config["block_out_channels"]) - 1) + + # Create image processor + image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor) + + def post_process_func(images: torch.Tensor): + return image_processor.postprocess(images, output_type="pil") + + return post_process_func +``` + +**Pre-processing function (for image editing pipelines):** + +```python +def get_your_model_pre_process_func( + od_config: OmniDiffusionConfig, +): + """ + Create pre-processing function for image editing. + + Returns a function that prepares input images. + """ + from PIL import Image + from diffusers.image_processor import VaeImageProcessor + + # Load VAE config + # ... (similar to post_process_func) + + image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor) + + def pre_process_func( + request: OmniDiffusionRequest, + ): + for i, prompt in enumerate(request.prompts): + multi_modal_data = prompt.get("multi_modal_data", {}) if not isinstance(prompt, str) else None + raw_image = multi_modal_data.get("image", None) if multi_modal_data is not None else None + # image pre-processing + # after pre-processing, update the request attributes + ... + return request + + return pre_process_func +``` + +#### 2.5: Add Weight Loading Support + +Add methods for automatic weight downloading and loading: + +```python +from vllm_omni.diffusion.model_loader.diffusers_loader import DiffusersPipelineLoader +from vllm.model_executor.models.utils import AutoWeightsLoader + +class YourModelPipeline(nn.Module): + def __init__(self, *, od_config: OmniDiffusionConfig, prefix: str = ""): + super().__init__() + # ... initialization code + + # Define weight sources for automatic loading + self.weights_sources = [ + DiffusersPipelineLoader.ComponentSource( + model_or_path=od_config.model, + subfolder="transformer", + revision=None, + prefix="transformer.", + fall_back_to_pt=True, + ) + ] + + def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]: + """ + Customize the weight loading behavior, such as filter weights name. + + Args: + weights: Iterable of (param_name, param_tensor) tuples + + Returns: + Set of loaded parameter names + """ + loader = AutoWeightsLoader(self) + return loader.load_weights(weights) +``` + +### Step 3: Register Model + +Register your model in `vllm_omni/diffusion/registry.py` so vLLM-Omni can discover and load it. + +#### 3.1: Register Pipeline Class + +```python +# vllm_omni/diffusion/registry.py + _DIFFUSION_MODELS = { - # arch:(mod_folder, mod_relname, cls_name) - ... - "QwenImageEditPipeline": ( - "qwen_image", - "pipeline_qwen_image_edit", - "QwenImageEditPipeline", + # Format: "PipelineClassName": (module_folder, module_file, class_name) + + # Existing models + "QwenImagePipeline": ("qwen_image", "pipeline_qwen_image", "QwenImagePipeline"), + "FluxPipeline": ("flux", "pipeline_flux", "FluxPipeline"), + + # Add your model + "YourModelPipeline": ( + "your_model_name", # Module folder name + "pipeline_your_model", # Python file name (without .py) + "YourModelPipeline", # Pipeline class name ), - ... } ``` -+ registry pre-process get function + +#### 3.2: Register Pre/Post-Processing Function + ```python +# vllm_omni/diffusion/registry.py _DIFFUSION_PRE_PROCESS_FUNCS = { # arch: pre_process_func - ... + # `pre_process_func` function must be placed in {mod_folder}/{mod_relname}.py, + # where mod_folder and mod_relname are defined and mapped using `_DIFFUSION_MODELS` via the `arch` key + "GlmImagePipeline": "get_glm_image_pre_process_func", "QwenImageEditPipeline": "get_qwen_image_edit_pre_process_func", - ... -} -``` -+ registry post-process get function -```python + # Add your model + "YourModelPipeline": "get_your_model_pre_process_func", # Optional +} _DIFFUSION_POST_PROCESS_FUNCS = { - # arch: post_process_func - ... - "QwenImageEditPipeline": "get_qwen_image_edit_post_process_func", - ... + # Format: "PipelineClassName": "function_name" + + # Existing models + "QwenImagePipeline": "get_qwen_image_post_process_func", + "FluxPipeline": "get_flux_post_process_func", + + # Add your model + "YourModelPipeline": "get_your_model_post_process_func", } ``` -## Step 4: Add an Example Script -For each newly integrated model, we need to provide examples script under the examples/ to demonstrate how to initialize the pipeline with Omni, pass in user inputs, and generate outputs. -Key point for writing the example: -+ Use the Omni entrypoint to load the model and construct the pipeline. +#### 3.3: Export from Module -+ Show how to format user inputs and pass them via omni.generate(...). - -+ Demonstrate the common runtime arguments, such as: - - + model path or model name - - + input image(s) or prompt text - - + key diffusion parameters (e.g., inference steps, guidance scale) - - + optional acceleration backends (e.g., Cache-DiT, TeaCache) - -+ Save or display the generated results so users can validate the integration. - -## Step 5: TeaCache Coefficient Estimation (Optional) - -If your model supports TeaCache acceleration, you need to estimate the polynomial coefficients for optimal caching performance. - -### 5.1 Add Extractor Function - -First, implement an extractor function in `vllm_omni/diffusion/cache/teacache/extractors.py`. The extractor extracts the modulated input and defines how to run transformer blocks: +Create/update `__init__.py` to export your classes: ```python -def extract_your_model_context( - module: nn.Module, - hidden_states: torch.Tensor, - timestep: torch.Tensor, - **kwargs: Any, -) -> CacheContext: - # 1. Preprocessing - temb = module.time_embed(timestep) +# vllm_omni/diffusion/models/your_model_name/__init__.py - # 2. Extract modulated input (for cache decision) - modulated_input = module.transformer_blocks[0].norm1(hidden_states, temb) - - # 3. Define transformer execution - def run_transformer_blocks(): - h = hidden_states - for block in module.transformer_blocks: - h = block(h, temb=temb) - return (h,) - - # 4. Define postprocessing - def postprocess(h): - return module.proj_out(module.norm_out(h, temb)) - - return CacheContext( - modulated_input=modulated_input, - hidden_states=hidden_states, - encoder_hidden_states=None, - temb=temb, - run_transformer_blocks=run_transformer_blocks, - postprocess=postprocess, - ) -``` - -Register it in `EXTRACTOR_REGISTRY`: -```python -EXTRACTOR_REGISTRY = { - ... - "YourTransformer2DModel": extract_your_model_context, -} -``` - -### 5.2 Add Adapter for Coefficient Estimation - -Add an adapter in `vllm_omni/diffusion/cache/teacache/coefficient_estimator.py`: - -```python -class YourModelAdapter: - @staticmethod - def load_pipeline(model_path: str, device: str, dtype: torch.dtype) -> Any: - # Load your pipeline - ... - - @staticmethod - def get_transformer(pipeline: Any) -> tuple[Any, str]: - return pipeline.transformer, "YourTransformer2DModel" - - @staticmethod - def install_hook(transformer: Any, hook: DataCollectionHook) -> None: - registry = HookRegistry.get_or_create(transformer) - registry.register_hook(hook._HOOK_NAME, hook) - -_MODEL_ADAPTERS["YourModel"] = YourModelAdapter -``` - -### 5.3 Run Coefficient Estimation - -Use the provided script to estimate coefficients: - -```python -from vllm_omni.diffusion.cache.teacache.coefficient_estimator import ( - TeaCacheCoefficientEstimator, +from .pipeline_your_model import ( + YourModelPipeline, + get_your_model_post_process_func, ) -from datasets import load_dataset -from tqdm import tqdm +from .your_model_transformer import YourModelTransformer2DModel -# Load model -estimator = TeaCacheCoefficientEstimator( - model_path="/path/to/model", - model_type="Bagel", # Your model type - device="cuda", -) - -# Load prompts (paper suggests ~70 prompts) -dataset = load_dataset("nateraw/parti-prompts", split="train") -prompts = dataset["Prompt"][:70] - -# Collect data -for prompt in tqdm(prompts): - estimator.collect_from_prompt(prompt, num_inference_steps=50) - -# Estimate coefficients -coeffs = estimator.estimate(poly_order=4) -print(f"Coefficients: {coeffs}") +__all__ = [ + "YourModelPipeline", + "YourModelTransformer2DModel", + "get_your_model_post_process_func", +] ``` -### 5.4 Interpreting Coefficient Estimation Results +--- -The estimator outputs statistics and polynomial coefficients. Here's how to interpret them: +### Step 4: Add Example Script -**Example Output:** -``` -Data statistics: -Count: 48 -Input Diffs (x): min=1.1089e-02, max=5.2555e-02, mean=2.8435e-02 -Output Diffs (y): min=2.8242e-02, max=2.9792e-01, mean=7.0312e-02 -Coefficients: [1333131.29, -168644.23, 7950.51, -163.75, 1.26] + +If your model is one of Text-to-Image, Text-to-Audio, Text-to-Video, Image-to-Image, Image-to-Video models, you can simply try one of the following offline inference scripts to run your model: + +| Model Category | Offline Inference Script | +|---|---| +| Image-to-Image | `examples/offline_inference/image_to_image/image_edit.py` | +| Image-to-Video | `examples/offline_inference/image_to_video/image_to_video.py` | +| Text-to-Image | `examples/offline_inference/text_to_image/text_to_image.py` | +| Text-to-Audio | `examples/offline_inference/text_to_audio/text_to_audio.py` | +| Text-to-Video | `examples/offline_inference/text_to_video/text_to_video.py` | + + +If new CLI arguments need to be added, please edit the offline inference script corresponding to your model category from the table above, and update the example inference script in its corresponding document file (e.g., `examples/offline_inference/text_to_video/text_to_video.md`). + +For online inference, all the supported tasks are listed in `docs/user_guide/examples/online_serving/`. If your model falls into these categories, please check the corresponding documentation in this folder and the example at `examples/online_serving/TASK_NAME`. Update them accordingly if needed. + +--- + +If your model is an Omni (understanding and generation) model, please follow the steps below. + +#### 4.1: Create Example File + +Taking **BAGEL** model as examples for both offline and online: + +- Offline: `examples/offline_inference/bagel/` +- Online: `examples/online_serving/bagel/` + +Add **two example folders** for your model: + +```bash +mkdir -p examples/offline_inference/your_model_name +mkdir -p examples/online_serving/your_model_name ``` -**What to Check:** -- **Count**: Number of timestep pairs analyzed. Should be at least 30-50 for reliable estimation. Low count suggests insufficient prompts or inference steps. -- **Input/Output Ranges**: Verify output differences correlate with input differences. If ranges seem unusual, check your prompt diversity. -- **Coefficient Magnitude**: Extremely large values (>1e8) may indicate numerical instability - try collecting more diverse data. +**Offline (recommended minimum):** create `examples/offline_inference/your_model_name/end2end.py` and a README. -**Troubleshooting:** -- If results seem unreliable, try: - - Increasing number of prompts (100+ recommended) - - Using more diverse prompts from multiple datasets - - Adjusting `num_inference_steps` (try 20, 50, 100) +- Script: `examples/offline_inference/your_model_name/end2end.py` + - Parse args like BAGEL (`--model`, `--modality`, optional `--image-path`, `--steps`, etc.) + - Use `from vllm_omni.entrypoints.omni import Omni` (or `OmniDiffusion` if your model is diffusion-only) + - Save outputs (images/audio/video/text) with deterministic filenames (e.g., `output_0_0.png`) +- Doc: `examples/offline_inference/your_model_name/README.md` + - Include at least one runnable command, e.g.: -### 5.5 Add Coefficients to Config - -Add the estimated coefficients to `vllm_omni/diffusion/cache/teacache/config.py`: - -```python -_MODEL_COEFFICIENTS = { - ... - "YourTransformer2DModel": [ - 1.04730573e+06, # a4 - -1.34150749e+05, # a3 - 6.51517806e+03, # a2 - -1.41209108e+02, # a1 - 1.17241808e+00, # a0 - ], -} +```bash +cd examples/offline_inference/your_model_name +python end2end.py --model your-org/your-model-name --modality text2img --prompts "A cute cat" ``` -## Step 6: Open a Pull Request -When submitting a pull request to add support for a new model, please include the following information in the PR description: +#### 4.2: Add Online Serving Example (OpenAI-Compatible) -+ Output verification: provide generation outputs to verify correctness and model behavior. +Mirror BAGEL’s online serving setup: -+ Inference speed: provide a comparison with the corresponding implementation in Diffusers. +- Server launcher: `examples/online_serving/your_model_name/run_server.sh` + - Wrap `vllm serve ... --omni --port ...` (and `--stage-configs-path ...` if needed) +- Client: `examples/online_serving/your_model_name/openai_chat_client.py` + - Send requests to `POST /v1/chat/completions` + - Support multimodal inputs (e.g., base64 image) if your model needs it +- Doc: `examples/online_serving/your_model_name/README.md` + - Include both “launch server” and “send request”: -+ Parallelism support: specify the supported parallel sizes and any relevant limitations. +```bash +# Terminal 1: launch server +cd examples/online_serving/your_model_name +bash run_server.sh -+ Cache acceleration: check whether the model can be accelerated using Cache-Dit or not. +# Terminal 2: send request +python openai_chat_client.py --prompt "A cute cat" --modality text2img +``` -Providing these details helps reviewers evaluate correctness, performance improvements, and parallel scalability of the new model integration. +### Step 5: Test Your Implementation -# Testing +Before submitting, thoroughly test your implementation. + +#### 5.1: Performance/Speed Check + +Manually compare **latency/throughput** and **output quality** against a Diffusers baseline. + +For a fair comparison, keep the same **prompt**, **seed**, **resolution**, **num_inference_steps**, and **guidance settings**, and run multiple trials to reduce randomness. Record the results (and your hardware / driver / CUDA versions) in your PR description. + + +#### 5.2 Functionality Check in CI + +To ensure project maintainability and sustainable development, we encourage contributors to submit test code (unit tests, system tests, or end-to-end tests) alongside their code changes. For comprehensive testing guidelines, please refer to the [Test File Structure and Style Guide](../ci/tests_style.md). +--- + +## Advanced Features + +Once basic implementation works, add advanced features for better performance. + +### torch.compile Support + +Enable automatic compilation for repeated blocks: + +```python +# In your_model_transformer.py + +class YourModelTransformer2DModel(nn.Module): + # Specify which blocks can be compiled + _repeated_blocks = ["YourTransformerBlock"] # List of block class names + + def __init__(self, ...): + super().__init__() + # ... initialization +``` + +vLLM-Omni automatically compiles blocks in `_repeated_blocks` when `torch.compile` is available. + +### Tensor Parallelism + +See detailed guide: [How to add Tensor Parallel support](../features/tensor_parallel.md) + +**Quick setup:** + +1. Replace Linear layers by various parallel linear layers (e.g., `ColumnParallelLinear`) in vLLM +2. Check `tp_size` validity: `hidden_dim`, `num_heads`, and `num_kv_heads` must be divisible by `tp_size` + +**Usage:** Set `tensor_parallel_size` when initializing: +```python +omni = Omni(model="your-model", tensor_parallel_size=2) +``` + +### CFG Parallelism + +See detailed guide: [How to add CFG-Parallel support](../features/cfg_parallel.md) + +**Quick setup:** + +1. Implement `diffuse()` method +2. Inherit `CFGParallelMixin` in your pipeline class + +**Usage:** Set `cfg_parallel_size` when initializing: +```python +omni = Omni(model="your-model", cfg_parallel_size=2) +``` + +### Sequence Parallelism + +See detailed guide: [How to add Sequence Parallel support](../features/sequence_parallel.md) + +**Quick setup:** + +1. Add `_sp_plan` class attribute to transformer +2. Specify where to shard/gather tensors + +**Usage:** Set `ulysses_degree` and `ring_degree` when initializing: +```python +omni = Omni(model="your-model", ulysses_degree=2, ring_degree=2) +``` + +### Cache Acceleration + +#### TeaCache + +See detailed guide: [How to add TeaCache support](../features/teacache.md) + +**Quick setup:** + +1. Write extractor function +2. Register in `EXTRACTOR_REGISTRY` +3. Add polynomial coefficients + +**Usage:** Set `cache_backend` and `cache_config` when initializing: +```python +omni = Omni(model="your-model", + cache_backend="tea_cache", + cache_config={"rel_l1_thresh": 0.2} +) + +``` + + +#### Cache-DiT + +See detailed guide: [How to add Cache-DiT support](../features/cache_dit.md) + +**Quick setup:** + +- For standard models: Works automatically +- For complex architectures: Write custom cache config + +**Usage:** Set `cache_backend` and `cache_config` when initializing: +```python +omni = Omni(model="your-model", + cache_backend="cache_dit", + cache_config={ + "Fn_compute_blocks": 1, + "Bn_compute_blocks": 0, + "max_warmup_steps": 4, + } +) +``` + +--- + +## Troubleshooting + + +**Issue: ImportError when loading model** + +**Symptoms:** `ModuleNotFoundError` or `ImportError` when calling `Omni(model="your-model")` + +**Causes:** + +1. Model not registered in `registry.py` +2. Wrong class name in registry +3. Missing `__init__.py` exports + + +**Issue: Shape mismatch in attention** + +**Symptoms:** `RuntimeError: shape mismatch` in attention forward + +**Cause:** Incorrect tensor reshaping for vLLM-Omni's attention interface + +**Solution:** Ensure correct shapes: + +```python +# vLLM-Omni expects: [batch, seq_len, num_heads, head_dim] +query = query.view(batch_size, seq_len, self.num_heads, self.head_dim) +key = key.view(batch_size, kv_seq_len, self.num_kv_heads, self.head_dim) +value = value.view(batch_size, kv_seq_len, self.num_kv_heads, self.head_dim) + +hidden_states = self.attn(query, key, value, attn_metadata=attn_metadata) + +# Reshape back: [batch, seq_len, num_heads, head_dim] → [batch, seq_len, hidden_size] +hidden_states = hidden_states.reshape(batch_size, seq_len, -1) +``` + +**Issue: Different outputs compared to Diffusers** + +**Symptoms:** Generated images look different from Diffusers + +**Causes:** + +1. Attention backend differences (FlashAttention vs PyTorch SDPA) +2. Missing normalization or scaling + +**4. Issue: Out of memory (OOM)** + +**Symptoms:** CUDA out of memory errors + +**Solutions:** + +1. **Reduce batch size:** + ```python + omni.generate(prompts=[...], max_batch_size=2) + ``` + +2. **Use smaller image size:** + ```python + sampling_params = OmniDiffusionSamplingParams(height=512, width=512) + ``` + +3. **Enable model offloading:** + ```python + omni = Omni(model="...", enable_cpu_offload=True) + ``` + +4. **Apply vae tiling and slicing** + ```python + omni = Omni(model="...", vae_use_slicing=True, vae_use_tiling=True,) + ``` + +--- + +## Pull Request Checklist + +When submitting a PR to add your model, include: + +**1. Implementation Files** + +- ✅ Transformer model (`xxx_transformer.py`) +- ✅ Pipeline (`pipeline_xxx.py`) +- ✅ Registry entries in `registry.py` +- ✅ `__init__.py` with proper exports + +**2. Example and Tests** + +- ✅ Example script in `examples/` +- ✅ Test file in `tests/e2e/` +- ✅ Documentation (`docs/`) creation or updates + +_Note: End-to-end test files in `tests/e2e/` are optional but strongly recommended. README updates are required for all new models._ + +**3. Documentation Updates** + +- ✅ Add model to supported models table in `docs/models/supported_models.md` +- ✅ If supporting acceleration features (e.g., sequence parallelism, CFG parallel), update acceleration feature tables in: + - `docs/user_guide/diffusion_acceleration.md` + - `docs/user_guide/diffusion/parallelism_acceleration.md` + +--- + +## Model Recipe -## Adding a Model Recipe After implementing and testing your model, please add a model recipe to the [vllm-project/recipes](https://github.com/vllm-project/recipes) repository. This helps other users understand how to use your model with vLLM-Omni. + +**What to Include** + +Your recipe should include: + +1. **Model Overview**: Brief description of the model and its capabilities +2. **Installation Instructions**: Step-by-step setup instructions including: + - Installing vllm-omni and dependencies + - Installing any additional required packages (e.g., xformers, diffusers) + - Any version requirements +3. **Usage Examples**: Command-line examples demonstrating how to run the model +4. **Configuration Details**: Important configuration parameters and their meanings + +**Example** + +For reference, see the [LongCat recipe example](https://github.com/vllm-project/recipes/pull/179) which demonstrates the expected format and structure. + +**Recipe Location** + +Create your recipe file in the appropriate directory structure: +- For organization-specific models: `OrganizationName/ModelName.md` +- For general models: `ModelName.md` + +The recipe should be a Markdown file that provides clear, reproducible instructions for users to get started with your model. + +--- + +## Reference Implementations + +Study these complete examples: + +| Model | Architecture | Key Features | Files | +|-------|--------------|--------------|-------| +| **Qwen-Image** | Dual-stream transformer | CFG-Parallel, SP, TP, Cache | `vllm_omni/diffusion/models/qwen_image/` | +| **Wan2.2** | Video transformer | Dual transformers, SP, CFG-Parallel | `vllm_omni/diffusion/models/wan2_2/` | + +--- + +## Summary + +Adding a diffusion model to vLLM-Omni involves: + +1. ✅ **Adapt transformer** - Replace attention, remove mixins, add config support +2. ✅ **Adapt pipeline** - Change interface, add request handling, extract processing +3. ✅ **Register model** - Add entries to `registry.py` +4. ✅ **Add examples** - Provide runnable scripts +5. ✅ **Test thoroughly** - Verify correctness and performance +6. ✅ **Add advanced features** - Enable parallelism and acceleration (optional) +7. ✅ **Submit PR** - Include verification results and documentation + +**Need help?** Check reference implementations or ask in [slack.vllm.ai](https://slack.vllm.ai) or vLLM user forum at [discuss.vllm.ai](https://discuss.vllm.ai). diff --git a/docs/user_guide/diffusion/parallelism_acceleration.md b/docs/user_guide/diffusion/parallelism_acceleration.md index f91a626e0..d536f4bc7 100644 --- a/docs/user_guide/diffusion/parallelism_acceleration.md +++ b/docs/user_guide/diffusion/parallelism_acceleration.md @@ -233,143 +233,6 @@ To measure the parallelism methods, we run benchmarks with **Qwen/Qwen-Image** m | Hybrid Ulysses + Ring | 2 | 2 | 24.3s | 1.87x | -##### How to parallelize a new model - -NOTE: "Terminology: SP vs CP" - Our "Sequence Parallelism" (SP) corresponds to "Context Parallelism" (CP) in the [diffusers library](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/_modeling_parallel.py). - We use "Sequence Parallelism" to align with vLLM-Omni's terminology. - ---- - -###### Non-intrusive `_sp_plan` (Recommended) - -The `_sp_plan` mechanism allows SP without modifying `forward()` logic. The framework automatically registers hooks to shard inputs and gather outputs at module boundaries. - -**Requirements for `forward()` function:** - -- Tensor operations that need sharding/gathering must happen at **`nn.Module` boundaries** (not inline Python operations) -- If your `forward()` contains inline tensor operations (e.g., `torch.cat`, `pad_sequence`) that need sharding, **extract them into a submodule** - -**When to create a submodule:** - -```python -# ❌ BAD: Inline operations - hooks cannot intercept -def forward(self, x, cap_feats): - unified = torch.cat([x, cap_feats], dim=1) # Cannot be sharded via _sp_plan - ... - -# ✅ GOOD: Extract into a submodule -class UnifiedPrepare(nn.Module): - def forward(self, x, cap_feats): - return torch.cat([x, cap_feats], dim=1) # Now can be sharded via _sp_plan - -class MyModel(nn.Module): - def __init__(self): - self.unified_prepare = UnifiedPrepare() # Submodule - - def forward(self, x, cap_feats): - unified = self.unified_prepare(x, cap_feats) # Hook can intercept here -``` - ---- - -###### Defining `_sp_plan` - -**Type definitions** (see [diffusers `_modeling_parallel.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/_modeling_parallel.py) for reference): - -```python -from vllm_omni.diffusion.distributed.sp_plan import ( - SequenceParallelInput, # Corresponds to diffusers' ContextParallelInput - SequenceParallelOutput, # Corresponds to diffusers' ContextParallelOutput -) -``` - -| Parameter | Description | -|-----------|-------------| -| `split_dim` | Dimension to split/gather (usually `1` for sequence) | -| `expected_dims` | Expected tensor rank for validation (optional) | -| `split_output` | `False`: shard **input** parameters; `True`: shard **output** tensors | -| `auto_pad` | Auto-pad if sequence not divisible by world_size (Ulysses only) | - -**Key naming convention:** - -| Key | Meaning | Python equivalent | -|-----|---------|-------------------| -| `""` | Root model | `model` | -| `"blocks.0"` | First element of ModuleList | `model.blocks[0]` | -| `"blocks.*"` | All elements of ModuleList | `for b in model.blocks` | -| `"outputs.main"` | ModuleDict entry | `model.outputs["main"]` | - -**Dictionary key types:** - -| Key type | `split_output` | Description | -|----------|----------------|-------------| -| `"param_name"` (str) | `False` | Shard **input parameter** by name | -| `0`, `1` (int) | `True` | Shard **output tuple** by index | - -**Example** (similar to [diffusers `transformer_wan.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_wan.py)): - -```python -class MyTransformer(nn.Module): - _sp_plan = { - # Shard rope module OUTPUTS (returns tuple) - "rope": { - 0: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), # cos - 1: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True), # sin - }, - # Shard transformer block INPUT parameter - "blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), - }, - # Gather at final projection - "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), - } -``` - ---- - -###### Hook flow - -``` -Input → [SequenceParallelSplitHook: pre_forward] → Module.forward() → [post_forward] → ... - ↓ -... → [SequenceParallelGatherHook: post_forward] → Output -``` - -1. **SplitHook** shards tensors before/after the target module -2. **Attention layers** handle Ulysses/Ring communication internally -3. **GatherHook** collects sharded outputs - -The framework automatically applies these hooks when `sequence_parallel_size > 1`. - ---- - -###### Method 2: Intrusive modification (For complex cases) - -For models with dynamic sharding logic that cannot be expressed via `_sp_plan`: - -```python -from vllm_omni.diffusion.distributed.sp_sharding import sp_shard, sp_gather - -def forward(self, hidden_states, ...): - if self.parallel_config.sequence_parallel_size > 1: - hidden_states = sp_shard(hidden_states, dim=1) - # ... computation ... - output = sp_gather(output, dim=1) - return output -``` - ---- - -###### Choosing the right approach - -| Scenario | Approach | -|----------|----------| -| Standard transformer | `_sp_plan` | -| Inline tensor ops need sharding | Extract to submodule + `_sp_plan` | -| Dynamic/conditional sharding | Intrusive modification | - - ### CFG-Parallel #### Offline Inference @@ -426,142 +289,3 @@ You can enable CFG-Parallel in online serving for diffusion models via `--cfg-pa ```bash vllm serve Qwen/Qwen-Image-Edit --omni --port 8091 --cfg-parallel-size 2 ``` - -#### How to parallelize a pipeline - -This section describes how to add CFG-Parallel to a diffusion **pipeline**. We use the Qwen-Image pipeline (`vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image.py`) as the reference implementation. - -In `QwenImagePipeline`, each diffusion step runs two denoiser forward passes sequentially: - -- positive (prompt-conditioned) -- negative (negative-prompt-conditioned) - -CFG-Parallel assigns these two branches to different ranks in the **CFG group** and synchronizes the results. - -vLLM-omni provides `CFGParallelMixin` base class that encapsulates the CFG parallel logic. By inheriting from this mixin and calling its methods, pipelines can easily implement CFG parallel without writing repetitive code. - -**Key Methods in CFGParallelMixin:** -- `predict_noise_maybe_with_cfg()`: Automatically handles CFG parallel noise prediction -- `scheduler_step_maybe_with_cfg()`: Scheduler step with automatic CFG rank synchronization - -**Example Implementation:** - -```python -class QwenImageCFGParallelMixin(CFGParallelMixin): - """ - Base Mixin class for Qwen Image pipelines providing shared CFG methods. - """ - - def diffuse( - self, - prompt_embeds: torch.Tensor, - prompt_embeds_mask: torch.Tensor, - negative_prompt_embeds: torch.Tensor, - negative_prompt_embeds_mask: torch.Tensor, - latents: torch.Tensor, - img_shapes: torch.Tensor, - txt_seq_lens: torch.Tensor, - negative_txt_seq_lens: torch.Tensor, - timesteps: torch.Tensor, - do_true_cfg: bool, - guidance: torch.Tensor, - true_cfg_scale: float, - image_latents: torch.Tensor | None = None, - cfg_normalize: bool = True, - additional_transformer_kwargs: dict[str, Any] | None = None, - ) -> torch.Tensor: - self.transformer.do_true_cfg = do_true_cfg - - for i, t in enumerate(timesteps): - timestep = t.expand(latents.shape[0]).to(device=latents.device, dtype=latents.dtype) - - # Prepare kwargs for positive (conditional) prediction - positive_kwargs = { - "hidden_states": latents, - "timestep": timestep / 1000, - "guidance": guidance, - "encoder_hidden_states_mask": prompt_embeds_mask, - "encoder_hidden_states": prompt_embeds, - "img_shapes": img_shapes, - "txt_seq_lens": txt_seq_lens, - } - - # Prepare kwargs for negative (unconditional) prediction - if do_true_cfg: - negative_kwargs = { - "hidden_states": latents, - "timestep": timestep / 1000, - "guidance": guidance, - "encoder_hidden_states_mask": negative_prompt_embeds_mask, - "encoder_hidden_states": negative_prompt_embeds, - "img_shapes": img_shapes, - "txt_seq_lens": negative_txt_seq_lens, - } - else: - negative_kwargs = None - - # Predict noise with automatic CFG parallel handling - # - In CFG parallel mode: rank0 computes positive, rank1 computes negative - # - Automatically gathers results and combines them on rank0 - noise_pred = self.predict_noise_maybe_with_cfg( - do_true_cfg=do_true_cfg, - true_cfg_scale=true_cfg_scale, - positive_kwargs=positive_kwargs, - negative_kwargs=negative_kwargs, - cfg_normalize=cfg_normalize, - ) - - # Step scheduler with automatic CFG synchronization - # - Only rank0 computes the scheduler step - # - Automatically broadcasts updated latents to all ranks - latents = self.scheduler_step_maybe_with_cfg( - noise_pred, t, latents, do_true_cfg - ) - - return latents -``` - -**How it works:** -1. Prepare separate `positive_kwargs` and `negative_kwargs` for conditional and unconditional predictions -2. Call `predict_noise_maybe_with_cfg()` which: - - Detects if CFG parallel is enabled (`get_classifier_free_guidance_world_size() > 1`) - - Distributes computation: rank0 processes positive, rank1 processes negative - - Gathers predictions and combines them using `combine_cfg_noise()` on rank0 - - Returns combined noise prediction (only valid on rank0) -3. Call `scheduler_step_maybe_with_cfg()` which: - - Only rank0 computes the scheduler step - - Broadcasts the updated latents to all ranks for synchronization - -**How to customize** - -Some pipelines may need to customize the following functions in `CFGParallelMixin`: -1. You may need to edit `predict_noise` function for custom behaviors. -```python -def predict_noise(self, *args, **kwargs): - """ - Forward pass through transformer to predict noise. - - Subclasses should override this if they need custom behavior, - but the default implementation calls self.transformer. - """ - return self.transformer(*args, **kwargs)[0] - -``` -2. The default normalization function after combining the noise predictions from both branches is as follows. You may need to customize it. -```python -def cfg_normalize_function(self, noise_pred, comb_pred): - """ - Normalize the combined noise prediction. - - Args: - noise_pred: positive noise prediction - comb_pred: combined noise prediction after CFG - - Returns: - Normalized noise prediction tensor - """ - cond_norm = torch.norm(noise_pred, dim=-1, keepdim=True) - noise_norm = torch.norm(comb_pred, dim=-1, keepdim=True) - noise_pred = comb_pred * (cond_norm / noise_norm) - return noise_pred -``` From cdde401813befd29dc5180cc34d3577410832940 Mon Sep 17 00:00:00 2001 From: Alicia <115451386+congw729@users.noreply.github.com> Date: Mon, 9 Feb 2026 16:40:13 +0800 Subject: [PATCH 04/10] [CI] Add env variable check for nightly CI (#1281) Signed-off-by: Alicia <115451386+congw729@users.noreply.github.com> --- .buildkite/test-nightly.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/test-nightly.yaml b/.buildkite/test-nightly.yaml index 27fdc8378..b234bdf8e 100644 --- a/.buildkite/test-nightly.yaml +++ b/.buildkite/test-nightly.yaml @@ -12,6 +12,7 @@ steps: - label: "Omni Model Test with H100" timeout_in_minutes: 180 depends_on: image-build + if: build.env("NIGHTLY") == "1" commands: - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/online_serving/test_qwen3_omni_expansion.py From d3ea94309d54a197b993dda67223fda4bbf4c5d6 Mon Sep 17 00:00:00 2001 From: Alicia <115451386+congw729@users.noreply.github.com> Date: Mon, 9 Feb 2026 16:49:45 +0800 Subject: [PATCH 05/10] [CI] Add pytest markers to current tests and update the doc. (#577) Signed-off-by: Alicia <115451386+congw729@users.noreply.github.com> Co-authored-by: Hongsheng Liu --- .buildkite/pipeline.yml | 16 +---- .buildkite/test-amd.yaml | 2 +- docs/contributing/ci/tests_markers.md | 58 +++++++++---------- pyproject.toml | 4 ++ tests/benchmarks/test_serve_cli.py | 4 ++ tests/diffusion/cache/test_cache_backends.py | 2 + tests/diffusion/lora/test_base_linear.py | 3 + tests/diffusion/lora/test_lora_manager.py | 3 + tests/diffusion/test_diffusion_worker.py | 2 + .../omni_connectors/test_kv_flow.py | 26 ++------- tests/e2e/offline_inference/test_cache_dit.py | 5 ++ .../test_diffusion_cpu_offload.py | 5 +- .../offline_inference/test_qwen2_5_omni.py | 10 +++- .../e2e/offline_inference/test_qwen3_omni.py | 4 ++ .../test_sequence_parallel.py | 17 ++++-- .../test_stable_audio_model.py | 4 ++ tests/e2e/offline_inference/test_t2i_model.py | 4 ++ tests/e2e/offline_inference/test_teacache.py | 5 ++ .../test_zimage_tensor_parallel.py | 15 +++-- tests/e2e/online_serving/test_async_omni.py | 7 +++ .../e2e/online_serving/test_image_gen_edit.py | 5 ++ .../test_images_generations_lora.py | 4 ++ tests/e2e/online_serving/test_qwen3_omni.py | 7 +++ .../openai_api/test_image_server.py | 2 + .../test_serving_chat_sampling_params.py | 2 + .../openai_api/test_serving_speech.py | 2 + .../test_async_omni_diffusion_config.py | 4 ++ tests/entrypoints/test_omni_diffusion.py | 2 + .../test_omni_input_preprocessor.py | 4 ++ tests/entrypoints/test_omni_llm.py | 2 + .../entrypoints/test_omni_new_request_data.py | 3 + .../test_omni_stage_diffusion_config.py | 4 ++ tests/entrypoints/test_stage_utils.py | 2 + .../models/qwen2_5_omni/test_audio_length.py | 2 + tests/utils.py | 12 +--- .../test_gpu_generation_model_runner.py | 3 + tests/worker/test_omni_gpu_model_runner.py | 3 + 37 files changed, 165 insertions(+), 94 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index e02d49472..56feccbd6 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -20,19 +20,7 @@ steps: - label: "Simple Unit Test" depends_on: image-build commands: - - | - pytest -v -s \ - tests/entrypoints/ \ - tests/diffusion/cache/ \ - tests/diffusion/lora/ \ - tests/model_executor/models/qwen2_5_omni/test_audio_length.py \ - tests/worker/ \ - tests/distributed/omni_connectors/test_kv_flow.py \ - --cov=vllm_omni \ - --cov-branch \ - --cov-report=term-missing \ - --cov-report=html \ - --cov-report=xml + - "pytest -v -s -m 'core_model and cpu' --cov=vllm_omni --cov-branch --cov-report=term-missing --cov-report=html --cov-report=xml" agents: queue: "gpu_1_queue" plugins: @@ -118,7 +106,7 @@ steps: timeout_in_minutes: 15 depends_on: image-build commands: - - pytest -s -v tests/e2e/offline_inference/test_cache_dit.py tests/e2e/offline_inference/test_teacache.py + - pytest -s -v -m 'core_model and cache and diffusion and not distributed_cuda and L4' agents: queue: "gpu_1_queue" # g6.4xlarge instance on AWS, has 1 L4 GPU plugins: diff --git a/.buildkite/test-amd.yaml b/.buildkite/test-amd.yaml index fac5c7268..e08562ea6 100644 --- a/.buildkite/test-amd.yaml +++ b/.buildkite/test-amd.yaml @@ -44,7 +44,7 @@ steps: - export GPU_ARCHS=gfx942 - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/offline_inference/test_cache_dit.py tests/e2e/offline_inference/test_teacache.py + - pytest -s -v -m 'core_model and cache and diffusion and not distributed_rocm and MI325' - label: "Diffusion Sequence Parallelism Test" timeout_in_minutes: 20 diff --git a/docs/contributing/ci/tests_markers.md b/docs/contributing/ci/tests_markers.md index bf56914f8..2afff8460 100644 --- a/docs/contributing/ci/tests_markers.md +++ b/docs/contributing/ci/tests_markers.md @@ -5,33 +5,33 @@ By adding markers before test functions, tests can later be executed uniformly b ## Current Markers Defined in `pyproject.toml`: -| Marker | Description | -| ------------------ | ------------------------------------------------------- | -| `core_model` | Core model tests (run in each PR) | -| `diffusion` | Diffusion model tests | -| `omni` | Omni model tests | -| `cache` | Cache backend tests | -| `parallel` | Parallelism/distributed tests | -| `cpu` | Tests that run on CPU | -| `gpu` | Tests that run on GPU (auto-added) | -| `cuda` | Tests that run on CUDA (auto-added) | -| `rocm` | Tests that run on AMD/ROCm (auto-added) | -| `npu` | Tests that run on NPU/Ascend (auto-added) | -| `H100` | Tests that require H100 GPU | -| `L4` | Tests that require L4 GPU | -| `MI325` | Tests that require MI325 GPU (AMD/ROCm) | -| `A2` | Tests that require A2 NPU | -| `A3` | Tests that require A3 NPU | -| `distributed_cuda` | Tests that require multi cards on CUDA platform | -| `distributed_rocm` | Tests that require multi cards on ROCm platform | -| `distributed_npu` | Tests that require multi cards on NPU platform | -| `skipif_cuda` | Skip if the num of CUDA cards is less than the required | -| `skipif_rocm` | Skip if the num of ROCm cards is less than the required | -| `skipif_npu` | Skip if the num of NPU cards is less than the required | -| `slow` | Slow tests (may skip in quick CI) | -| `benchmark` | Benchmark tests | +| Marker | Description | +| ------------------ | --------------------------------------------------------- | +| `core_model` | Core model tests (run in each PR) | +| `diffusion` | Diffusion model tests | +| `omni` | Omni model tests | +| `cache` | Cache backend tests | +| `parallel` | Parallelism/distributed tests | +| `cpu` | Tests that run on CPU | +| `gpu` | Tests that run on GPU * | +| `cuda` | Tests that run on CUDA * | +| `rocm` | Tests that run on AMD/ROCm * | +| `npu` | Tests that run on NPU/Ascend * | +| `H100` | Tests that require H100 GPU * | +| `L4` | Tests that require L4 GPU * | +| `MI325` | Tests that require MI325 GPU (AMD/ROCm) * | +| `A2` | Tests that require A2 NPU * | +| `A3` | Tests that require A3 NPU * | +| `distributed_cuda` | Tests that require multi cards on CUDA platform * | +| `distributed_rocm` | Tests that require multi cards on ROCm platform * | +| `distributed_npu` | Tests that require multi cards on NPU platform * | +| `skipif_cuda` | Skip if the num of CUDA cards is less than the required * | +| `skipif_rocm` | Skip if the num of ROCm cards is less than the required * | +| `skipif_npu` | Skip if the num of NPU cards is less than the required * | +| `slow` | Slow tests (may skip in quick CI) | +| `benchmark` | Benchmark tests | -For those markers shown as auto-added, they will be added by the `@hardware_test` decorator. +\* Means those markers are auto-added, and they will be added by the `@hardware_test` decorator. ### Example usage for markers @@ -71,10 +71,7 @@ This decorator is intended to make hardware-aware, cross-platform test authoring Support for `skipif_rocm` and `skipif_npu` will be implemented later. -5. **Runs each test in a new process** - Automatically wraps the distributed test with a decorator (`@create_new_process_for_each_test`) to ensure isolation and compatibility with multi-process hardware backends. - -6. **Works with pytest filtering** +5. **Works with pytest filtering** Allows tests to be filtered and selected at runtime using standard pytest marker expressions (e.g., `-m "distributed_cuda and L4"`). #### Example usage for decorator @@ -94,7 +91,6 @@ This decorator is intended to make hardware-aware, cross-platform test authoring ``` - `res` must be a dict; supported resources: CUDA (L4/H100), ROCm (MI325), NPU (A2/A3) - `num_cards` can be int (all platforms) or dict (per platform); defaults to 1 when missing -- `hardware_test` automatically applies `@create_new_process_for_each_test` for distributed tests. - Distributed markers (`distributed_cuda`, `distributed_rocm`, `distributed_npu`) are auto-added for multi-card cases - Filtering examples: - CUDA only: `pytest -m "distributed_cuda and L4"` diff --git a/pyproject.toml b/pyproject.toml index 706d0152e..483f7625a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -175,6 +175,10 @@ markers = [ "slow: Slow tests (may skip in quick CI)", "benchmark: Benchmark tests", ] +filterwarnings = [ + "ignore:.*does not have '__test__' attribute.*:UserWarning", + "ignore:.*does not have '__bases__' attribute.*:UserWarning", +] [tool.typos.default] extend-ignore-identifiers-re = [ diff --git a/tests/benchmarks/test_serve_cli.py b/tests/benchmarks/test_serve_cli.py index 2c624b8e7..40244eb57 100644 --- a/tests/benchmarks/test_serve_cli.py +++ b/tests/benchmarks/test_serve_cli.py @@ -4,6 +4,7 @@ from pathlib import Path import pytest from tests.conftest import OmniServer +from tests.utils import hardware_test models = ["Qwen/Qwen3-Omni-30B-A3B-Instruct"] stage_configs = [str(Path(__file__).parent.parent / "e2e" / "stage_configs" / "qwen3_omni_ci.yaml")] @@ -29,6 +30,9 @@ def omni_server(request): print("OmniServer stopped") +@pytest.mark.core_model +@pytest.mark.benchmark +@hardware_test(res={"cuda": "H100"}, num_cards=2) @pytest.mark.parametrize("omni_server", test_params, indirect=True) def test_bench_serve_chat(omni_server): command = [ diff --git a/tests/diffusion/cache/test_cache_backends.py b/tests/diffusion/cache/test_cache_backends.py index ed9301410..a9312f4b1 100644 --- a/tests/diffusion/cache/test_cache_backends.py +++ b/tests/diffusion/cache/test_cache_backends.py @@ -22,6 +22,8 @@ from vllm_omni.diffusion.cache.selector import get_cache_backend from vllm_omni.diffusion.cache.teacache.backend import TeaCacheBackend from vllm_omni.diffusion.data import DiffusionCacheConfig +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + class TestCacheDiTBackend: """Test CacheDiTBackend implementation.""" diff --git a/tests/diffusion/lora/test_base_linear.py b/tests/diffusion/lora/test_base_linear.py index 42bdf6526..9386d0909 100644 --- a/tests/diffusion/lora/test_base_linear.py +++ b/tests/diffusion/lora/test_base_linear.py @@ -5,10 +5,13 @@ from __future__ import annotations from dataclasses import dataclass +import pytest import torch from vllm_omni.diffusion.lora.layers.base_linear import DiffusionBaseLinearLayerWithLoRA +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + @dataclass class _DummyLoRAConfig: diff --git a/tests/diffusion/lora/test_lora_manager.py b/tests/diffusion/lora/test_lora_manager.py index 84fafe3bc..e5f1c4700 100644 --- a/tests/diffusion/lora/test_lora_manager.py +++ b/tests/diffusion/lora/test_lora_manager.py @@ -3,6 +3,7 @@ from __future__ import annotations +import pytest import torch from vllm.lora.lora_weights import LoRALayerWeights from vllm.lora.utils import get_supported_lora_modules @@ -11,6 +12,8 @@ from vllm.model_executor.layers.linear import LinearBase from vllm_omni.diffusion.lora.manager import DiffusionLoRAManager from vllm_omni.lora.request import LoRARequest +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + class _DummyLoRALayer: def __init__(self, n_slices: int, output_slices: tuple[int, ...]): diff --git a/tests/diffusion/test_diffusion_worker.py b/tests/diffusion/test_diffusion_worker.py index 220f210a3..6e57355a2 100644 --- a/tests/diffusion/test_diffusion_worker.py +++ b/tests/diffusion/test_diffusion_worker.py @@ -17,6 +17,8 @@ import torch from vllm_omni.diffusion.worker.diffusion_worker import DiffusionWorker +pytestmark = [pytest.mark.core_model, pytest.mark.diffusion, pytest.mark.cpu] + @pytest.fixture def mock_od_config(): diff --git a/tests/distributed/omni_connectors/test_kv_flow.py b/tests/distributed/omni_connectors/test_kv_flow.py index 8c7ff79ca..2b35718e7 100644 --- a/tests/distributed/omni_connectors/test_kv_flow.py +++ b/tests/distributed/omni_connectors/test_kv_flow.py @@ -1,7 +1,6 @@ import pytest import torch -from tests.utils import hardware_test from vllm_omni.diffusion.request import OmniDiffusionRequest from vllm_omni.distributed.omni_connectors.kv_transfer_manager import ( OmniKVCacheConfig, @@ -9,6 +8,8 @@ from vllm_omni.distributed.omni_connectors.kv_transfer_manager import ( ) from vllm_omni.inputs.data import OmniDiffusionSamplingParams +pytestmark = [pytest.mark.core_model, pytest.mark.cpu, pytest.mark.cache] + class MockConnector: def __init__(self): @@ -58,11 +59,6 @@ def common_constants(): } -@pytest.mark.cache -@hardware_test( - res={"cuda": "L4"}, - num_cards=2, -) def test_manager_extraction(kv_config, mock_connector, common_constants): """Test extraction and sending logic in OmniKVTransferManager.""" num_layers = common_constants["num_layers"] @@ -109,11 +105,6 @@ def test_manager_extraction(kv_config, mock_connector, common_constants): assert data["layer_blocks"]["key_cache"][0].shape == expected_shape -@pytest.mark.cache -@hardware_test( - res={"cuda": "L4"}, - num_cards=2, -) def test_manager_reception(kv_config, mock_connector, common_constants): """Test reception and injection logic in OmniKVTransferManager.""" num_layers = common_constants["num_layers"] @@ -171,11 +162,6 @@ def test_manager_reception(kv_config, mock_connector, common_constants): assert req.kv_metadata["seq_len"] == seq_len -@pytest.mark.cache -@hardware_test( - res={"cuda": "L4"}, - num_cards=2, -) def test_integration_flow(common_constants): """Simulate extraction -> connector -> reception.""" num_layers = common_constants["num_layers"] @@ -211,7 +197,8 @@ def test_integration_flow(common_constants): recv_timeout=1.0, ) receiver_manager = OmniKVTransferManager(receiver_config) - receiver_manager._connector = connector # Share the same mock connector instance + # Share the same mock connector instance + receiver_manager._connector = connector req = OmniDiffusionRequest( prompts=["test_integ"], @@ -228,11 +215,6 @@ def test_integration_flow(common_constants): assert req.kv_metadata["seq_len"] == 10 -@pytest.mark.cache -@hardware_test( - res={"cuda": "L4"}, - num_cards=2, -) def test_manager_extraction_no_connector(kv_config, common_constants): """Test extraction when connector is unavailable (should still return IDs).""" block_size = common_constants["block_size"] diff --git a/tests/e2e/offline_inference/test_cache_dit.py b/tests/e2e/offline_inference/test_cache_dit.py index 281ac48dc..65c59c6f7 100644 --- a/tests/e2e/offline_inference/test_cache_dit.py +++ b/tests/e2e/offline_inference/test_cache_dit.py @@ -15,6 +15,7 @@ from pathlib import Path import pytest import torch +from tests.utils import hardware_test from vllm_omni.inputs.data import OmniDiffusionSamplingParams # ruff: noqa: E402 @@ -32,6 +33,10 @@ os.environ["VLLM_TEST_CLEAN_GPU_MEMORY"] = "1" models = ["riverclouds/qwen_image_random"] +@pytest.mark.core_model +@pytest.mark.diffusion +@pytest.mark.cache +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}) @pytest.mark.parametrize("model_name", models) def test_cache_dit(model_name: str): """Test cache-dit backend with diffusion model.""" diff --git a/tests/e2e/offline_inference/test_diffusion_cpu_offload.py b/tests/e2e/offline_inference/test_diffusion_cpu_offload.py index 35e106df8..e46d7ec96 100644 --- a/tests/e2e/offline_inference/test_diffusion_cpu_offload.py +++ b/tests/e2e/offline_inference/test_diffusion_cpu_offload.py @@ -5,7 +5,7 @@ import pytest import torch from vllm.distributed.parallel_state import cleanup_dist_env_and_memory -from tests.utils import GPUMemoryMonitor +from tests.utils import GPUMemoryMonitor, hardware_test from vllm_omni.inputs.data import OmniDiffusionSamplingParams from vllm_omni.platforms import current_omni_platform @@ -45,6 +45,9 @@ def inference(model_name: str, offload: bool = True): return peak +@pytest.mark.core_model +@pytest.mark.diffusion +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}) @pytest.mark.skipif(current_omni_platform.is_npu() or current_omni_platform.is_rocm(), reason="Hardware not supported") @pytest.mark.parametrize("model_name", models) def test_cpu_offload_diffusion_model(model_name: str): diff --git a/tests/e2e/offline_inference/test_qwen2_5_omni.py b/tests/e2e/offline_inference/test_qwen2_5_omni.py index af9d793c1..eda2f28b5 100644 --- a/tests/e2e/offline_inference/test_qwen2_5_omni.py +++ b/tests/e2e/offline_inference/test_qwen2_5_omni.py @@ -13,10 +13,10 @@ from vllm.assets.video import VideoAsset from vllm.envs import VLLM_USE_MODELSCOPE from vllm.multimodal.image import convert_image_mode +from tests.utils import create_new_process_for_each_test, hardware_test from vllm_omni.platforms import current_omni_platform from .conftest import OmniRunner -from .utils import create_new_process_for_each_test models = ["Qwen/Qwen2.5-Omni-3B"] @@ -34,8 +34,10 @@ test_params = [(model, stage_config) for model in models] @pytest.mark.core_model -@pytest.mark.parametrize("test_config", test_params) +@pytest.mark.omni +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 4, "rocm": 2}) @create_new_process_for_each_test("spawn") +@pytest.mark.parametrize("test_config", test_params) def test_mixed_modalities_to_audio(omni_runner: type[OmniRunner], test_config: tuple[str, str]) -> None: """Test processing audio, image, and video together, generating audio output.""" model, stage_config_path = test_config @@ -94,8 +96,10 @@ def test_mixed_modalities_to_audio(omni_runner: type[OmniRunner], test_config: t @pytest.mark.core_model -@pytest.mark.parametrize("test_config", test_params) +@pytest.mark.omni +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 4, "rocm": 2}) @create_new_process_for_each_test("spawn") +@pytest.mark.parametrize("test_config", test_params) def test_mixed_modalities_to_text_only(omni_runner: type[OmniRunner], test_config: tuple[str, str]) -> None: """Test processing audio, image, and video together, generating audio output.""" model, stage_config_path = test_config diff --git a/tests/e2e/offline_inference/test_qwen3_omni.py b/tests/e2e/offline_inference/test_qwen3_omni.py index 2c5c66fe3..ecd09fdd3 100644 --- a/tests/e2e/offline_inference/test_qwen3_omni.py +++ b/tests/e2e/offline_inference/test_qwen3_omni.py @@ -14,6 +14,7 @@ from pathlib import Path import pytest from vllm.assets.video import VideoAsset +from tests.utils import hardware_test from vllm_omni.platforms import current_omni_platform from .conftest import OmniRunner @@ -31,6 +32,9 @@ else: test_params = [(model, stage_config) for model in models for stage_config in stage_configs] +@pytest.mark.core_model +@pytest.mark.omni +@hardware_test(res={"cuda": "H100", "rocm": "MI325"}, num_cards=2) @pytest.mark.parametrize("test_config", test_params) def test_video_to_audio(omni_runner: type[OmniRunner], test_config) -> None: """Test processing video, generating audio output.""" diff --git a/tests/e2e/offline_inference/test_sequence_parallel.py b/tests/e2e/offline_inference/test_sequence_parallel.py index 3e7bb5617..866c2c6a1 100644 --- a/tests/e2e/offline_inference/test_sequence_parallel.py +++ b/tests/e2e/offline_inference/test_sequence_parallel.py @@ -20,16 +20,17 @@ import torch import torch.distributed as dist from PIL import Image +from tests.utils import hardware_test +from vllm_omni import Omni +from vllm_omni.diffusion.data import DiffusionParallelConfig from vllm_omni.inputs.data import OmniDiffusionSamplingParams +from vllm_omni.platforms import current_omni_platform # ruff: noqa: E402 REPO_ROOT = Path(__file__).resolve().parents[3] if str(REPO_ROOT) not in sys.path: sys.path.insert(0, str(REPO_ROOT)) -from vllm_omni import Omni -from vllm_omni.diffusion.data import DiffusionParallelConfig -from vllm_omni.platforms import current_omni_platform # Test configuration MODELS = ["riverclouds/qwen_image_random"] @@ -145,9 +146,11 @@ def _run_inference( # - warmup: whether to run warmup for this SP config # - is_perf_test: whether this is a performance test (show speedup metrics) SP_CONFIGS = [ - (2, 1, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), # Ulysses-2 - performance test + # Ulysses-2 - performance test + (2, 1, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), (1, 2, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), # Ring-2 - performance test - (2, 2, DEFAULT_HEIGHT, DEFAULT_WIDTH, False, False), # Hybrid - correctness only + # Hybrid - correctness only + (2, 2, DEFAULT_HEIGHT, DEFAULT_WIDTH, False, False), (4, 1, 272, 272, False, False), # Ulysses-4 - shape and correctness ] @@ -162,6 +165,10 @@ def _get_sp_mode(ulysses_degree: int, ring_degree: int) -> str: return f"hybrid-{ulysses_degree}x{ring_degree}" +@pytest.mark.core_model +@pytest.mark.diffusion +@pytest.mark.parallel +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 4, "rocm": 2}) @pytest.mark.parametrize("model_name", MODELS) def test_sp_correctness(model_name: str): """Test that SP inference produces correct outputs and measure performance. diff --git a/tests/e2e/offline_inference/test_stable_audio_model.py b/tests/e2e/offline_inference/test_stable_audio_model.py index df2ca5e42..ad879d751 100644 --- a/tests/e2e/offline_inference/test_stable_audio_model.py +++ b/tests/e2e/offline_inference/test_stable_audio_model.py @@ -5,6 +5,7 @@ import numpy as np import pytest import torch +from tests.utils import hardware_test from vllm_omni.inputs.data import OmniDiffusionSamplingParams from vllm_omni.outputs import OmniRequestOutput @@ -19,6 +20,9 @@ from vllm_omni import Omni models = ["linyueqian/stable_audio_random"] +@pytest.mark.core_model +@pytest.mark.diffusion +@hardware_test(res={"cuda": "L4"}) @pytest.mark.parametrize("model_name", models) def test_stable_audio_model(model_name: str): m = Omni(model=model_name) diff --git a/tests/e2e/offline_inference/test_t2i_model.py b/tests/e2e/offline_inference/test_t2i_model.py index 74c1bd1ce..e2cb09f30 100644 --- a/tests/e2e/offline_inference/test_t2i_model.py +++ b/tests/e2e/offline_inference/test_t2i_model.py @@ -5,6 +5,7 @@ from pathlib import Path import pytest import torch +from tests.utils import hardware_test from vllm_omni.inputs.data import OmniDiffusionSamplingParams from vllm_omni.outputs import OmniRequestOutput from vllm_omni.platforms import current_omni_platform @@ -32,6 +33,9 @@ elif current_omni_platform.is_rocm(): models = ["Tongyi-MAI/Z-Image-Turbo"] +@pytest.mark.core_model +@pytest.mark.diffusion +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 1, "rocm": 2}) @pytest.mark.parametrize("model_name", models) def test_diffusion_model(model_name: str): m = None diff --git a/tests/e2e/offline_inference/test_teacache.py b/tests/e2e/offline_inference/test_teacache.py index 7d6261388..d97991779 100644 --- a/tests/e2e/offline_inference/test_teacache.py +++ b/tests/e2e/offline_inference/test_teacache.py @@ -15,6 +15,7 @@ from pathlib import Path import pytest import torch +from tests.utils import hardware_test from vllm_omni.inputs.data import OmniDiffusionSamplingParams # ruff: noqa: E402 @@ -31,6 +32,10 @@ os.environ["VLLM_TEST_CLEAN_GPU_MEMORY"] = "1" models = ["riverclouds/qwen_image_random"] +@pytest.mark.core_model +@pytest.mark.diffusion +@pytest.mark.cache +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}) @pytest.mark.parametrize("model_name", models) def test_teacache(model_name: str): """Test TeaCache backend with diffusion model.""" diff --git a/tests/e2e/offline_inference/test_zimage_tensor_parallel.py b/tests/e2e/offline_inference/test_zimage_tensor_parallel.py index 0e3b97ec3..2d051e5aa 100644 --- a/tests/e2e/offline_inference/test_zimage_tensor_parallel.py +++ b/tests/e2e/offline_inference/test_zimage_tensor_parallel.py @@ -12,18 +12,18 @@ import torch from PIL import Image from vllm.distributed.parallel_state import cleanup_dist_env_and_memory +from tests.utils import GPUMemoryMonitor, hardware_test +from vllm_omni import Omni +from vllm_omni.diffusion.data import DiffusionParallelConfig from vllm_omni.inputs.data import OmniDiffusionSamplingParams +from vllm_omni.outputs import OmniRequestOutput +from vllm_omni.platforms import current_omni_platform # ruff: noqa: E402 REPO_ROOT = Path(__file__).resolve().parents[2] if str(REPO_ROOT) not in sys.path: sys.path.insert(0, str(REPO_ROOT)) -from tests.utils import GPUMemoryMonitor -from vllm_omni import Omni -from vllm_omni.diffusion.data import DiffusionParallelConfig -from vllm_omni.outputs import OmniRequestOutput -from vllm_omni.platforms import current_omni_platform # os.environ["VLLM_TEST_CLEAN_GPU_MEMORY"] = "1" os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" @@ -127,7 +127,10 @@ def _run_zimage_generate( cleanup_dist_env_and_memory() -@pytest.mark.integration +@pytest.mark.core_model +@pytest.mark.diffusion +@pytest.mark.parallel +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 4, "rocm": 2}) def test_zimage_tensor_parallel_tp2(tmp_path: Path): if current_omni_platform.is_npu() or current_omni_platform.is_rocm(): pytest.skip("Z-Image TP e2e test is only supported on CUDA for now.") diff --git a/tests/e2e/online_serving/test_async_omni.py b/tests/e2e/online_serving/test_async_omni.py index d90727e1b..ba5084ad4 100644 --- a/tests/e2e/online_serving/test_async_omni.py +++ b/tests/e2e/online_serving/test_async_omni.py @@ -8,6 +8,7 @@ import pytest from vllm import SamplingParams from vllm.inputs import PromptType +from tests.utils import hardware_test from vllm_omni.entrypoints.async_omni import AsyncOmni, ClientRequestState os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" @@ -57,6 +58,9 @@ async def generate( return count, request_id +@pytest.mark.core_model +@pytest.mark.omni +@hardware_test(res={"cuda": "H100", "rocm": "MI325"}, num_cards=2) @pytest.mark.asyncio async def test_abort(): with ExitStack() as after: @@ -113,6 +117,9 @@ async def test_abort(): await asyncio.sleep(5) +@pytest.mark.core_model +@pytest.mark.omni +@hardware_test(res={"cuda": "H100", "rocm": "MI325"}, num_cards=2) @pytest.mark.asyncio async def test_build_and_log_summary(monkeypatch): from vllm_omni.entrypoints.utils import get_final_stage_id_for_e2e diff --git a/tests/e2e/online_serving/test_image_gen_edit.py b/tests/e2e/online_serving/test_image_gen_edit.py index 8db0d50fb..7db740f20 100644 --- a/tests/e2e/online_serving/test_image_gen_edit.py +++ b/tests/e2e/online_serving/test_image_gen_edit.py @@ -22,6 +22,8 @@ from PIL import Image from vllm.assets.image import ImageAsset from vllm.utils.network_utils import get_open_port +from tests.utils import hardware_test + os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" # Increase timeout for downloading assets from S3 (default 5s is too short for CI) os.environ.setdefault("VLLM_IMAGE_FETCH_TIMEOUT", "60") @@ -178,6 +180,9 @@ def _decode_data_url_to_image_bytes(data_url: str) -> bytes: return base64.b64decode(b64_data) +@pytest.mark.core_model +@pytest.mark.diffusion +@hardware_test(res={"cuda": "H100", "rocm": "MI325"}) @pytest.mark.parametrize("omni_server", test_params, indirect=True) def test_i2i_multi_image_input_qwen_image_edit_2509( omni_server, diff --git a/tests/e2e/online_serving/test_images_generations_lora.py b/tests/e2e/online_serving/test_images_generations_lora.py index e912c420d..85b80cafb 100644 --- a/tests/e2e/online_serving/test_images_generations_lora.py +++ b/tests/e2e/online_serving/test_images_generations_lora.py @@ -23,6 +23,7 @@ from PIL import Image from safetensors.torch import save_file from tests.conftest import OmniServer +from tests.utils import hardware_test os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" @@ -144,6 +145,9 @@ def _basic_payload() -> dict: } +@pytest.mark.core_model +@pytest.mark.diffusion +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}) def test_images_generations_per_request_lora_switching(omni_server: OmniServer, tmp_path: Path) -> None: # Base generation. base_img = _post_images(omni_server, _basic_payload()) diff --git a/tests/e2e/online_serving/test_qwen3_omni.py b/tests/e2e/online_serving/test_qwen3_omni.py index 073419fb8..7f879939f 100644 --- a/tests/e2e/online_serving/test_qwen3_omni.py +++ b/tests/e2e/online_serving/test_qwen3_omni.py @@ -28,6 +28,7 @@ from tests.conftest import ( merge_base64_and_convert_to_text, modify_stage_config, ) +from tests.utils import hardware_test from vllm_omni.platforms import current_omni_platform models = ["Qwen/Qwen3-Omni-30B-A3B-Instruct"] @@ -145,6 +146,9 @@ def get_max_batch_size(size_type="few"): return batch_sizes.get(size_type, 5) +@pytest.mark.core_model +@pytest.mark.omni +@hardware_test(res={"cuda": "H100", "rocm": "MI325"}, num_cards=2) @pytest.mark.parametrize("omni_server", test_params, indirect=True) def test_mix_to_text_audio_001(client: openai.OpenAI, omni_server, request) -> None: """ @@ -215,6 +219,9 @@ def test_mix_to_text_audio_001(client: openai.OpenAI, omni_server, request) -> N assert similarity > 0.9, "The audio content is not same as the text" +@pytest.mark.core_model +@pytest.mark.omni +@hardware_test(res={"cuda": "H100", "rocm": "MI325"}, num_cards=2) @pytest.mark.parametrize("omni_server", test_params, indirect=True) def test_text_to_text_audio_001(client: openai.OpenAI, omni_server) -> None: """ diff --git a/tests/entrypoints/openai_api/test_image_server.py b/tests/entrypoints/openai_api/test_image_server.py index 6ff6782ae..0c6479cce 100644 --- a/tests/entrypoints/openai_api/test_image_server.py +++ b/tests/entrypoints/openai_api/test_image_server.py @@ -23,6 +23,8 @@ from vllm_omni.entrypoints.openai.image_api_utils import ( ) from vllm_omni.inputs.data import OmniDiffusionSamplingParams +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + # Unit Tests diff --git a/tests/entrypoints/openai_api/test_serving_chat_sampling_params.py b/tests/entrypoints/openai_api/test_serving_chat_sampling_params.py index 240fd2051..58d4d253f 100644 --- a/tests/entrypoints/openai_api/test_serving_chat_sampling_params.py +++ b/tests/entrypoints/openai_api/test_serving_chat_sampling_params.py @@ -11,6 +11,8 @@ from unittest.mock import MagicMock import pytest from vllm.sampling_params import SamplingParams +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + @pytest.fixture def mock_comprehension_stage(): diff --git a/tests/entrypoints/openai_api/test_serving_speech.py b/tests/entrypoints/openai_api/test_serving_speech.py index da73acb5a..2db98c068 100644 --- a/tests/entrypoints/openai_api/test_serving_speech.py +++ b/tests/entrypoints/openai_api/test_serving_speech.py @@ -16,6 +16,8 @@ from vllm_omni.entrypoints.openai.serving_speech import ( ) from vllm_omni.outputs import OmniRequestOutput +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + logger = logging.getLogger(__name__) diff --git a/tests/entrypoints/test_async_omni_diffusion_config.py b/tests/entrypoints/test_async_omni_diffusion_config.py index 6b49eba2c..ba0390040 100644 --- a/tests/entrypoints/test_async_omni_diffusion_config.py +++ b/tests/entrypoints/test_async_omni_diffusion_config.py @@ -1,9 +1,13 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project +import pytest + from vllm_omni.entrypoints import omni as omni_module from vllm_omni.entrypoints.async_omni import AsyncOmni +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + def test_default_stage_config_includes_cache_backend(monkeypatch): """Ensure cache_backend/cache_config are preserved in default diffusion stage.""" diff --git a/tests/entrypoints/test_omni_diffusion.py b/tests/entrypoints/test_omni_diffusion.py index c4884e3ab..ab1194a25 100644 --- a/tests/entrypoints/test_omni_diffusion.py +++ b/tests/entrypoints/test_omni_diffusion.py @@ -9,6 +9,8 @@ import pytest from vllm_omni.entrypoints.stage_utils import SHUTDOWN_TASK from vllm_omni.inputs.data import OmniDiffusionSamplingParams +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + # Suppress noisy DeprecationWarnings from optional Swig bindings imported by vLLM dependencies. warnings.filterwarnings( "ignore", diff --git a/tests/entrypoints/test_omni_input_preprocessor.py b/tests/entrypoints/test_omni_input_preprocessor.py index 77c84f06b..422154bf9 100644 --- a/tests/entrypoints/test_omni_input_preprocessor.py +++ b/tests/entrypoints/test_omni_input_preprocessor.py @@ -1,5 +1,9 @@ +import pytest + from vllm_omni.inputs.preprocess import OmniInputPreprocessor +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + def _make_preprocessor(monkeypatch): preprocessor = object.__new__(OmniInputPreprocessor) diff --git a/tests/entrypoints/test_omni_llm.py b/tests/entrypoints/test_omni_llm.py index f99c6d833..f33ca6d59 100644 --- a/tests/entrypoints/test_omni_llm.py +++ b/tests/entrypoints/test_omni_llm.py @@ -9,6 +9,8 @@ from vllm import SamplingParams from vllm_omni.entrypoints.stage_utils import SHUTDOWN_TASK +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + # Suppress noisy DeprecationWarnings from optional Swig bindings imported by vLLM dependencies. warnings.filterwarnings( "ignore", diff --git a/tests/entrypoints/test_omni_new_request_data.py b/tests/entrypoints/test_omni_new_request_data.py index 776509d5b..b1ad56cdd 100644 --- a/tests/entrypoints/test_omni_new_request_data.py +++ b/tests/entrypoints/test_omni_new_request_data.py @@ -1,9 +1,12 @@ from types import SimpleNamespace +import pytest import torch from vllm_omni.core.sched.output import OmniNewRequestData +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + def test_omni_new_request_data_copies_payloads(): prompt_embeds = torch.randn(2, 3) diff --git a/tests/entrypoints/test_omni_stage_diffusion_config.py b/tests/entrypoints/test_omni_stage_diffusion_config.py index 5fe04cbbd..f464c55fd 100644 --- a/tests/entrypoints/test_omni_stage_diffusion_config.py +++ b/tests/entrypoints/test_omni_stage_diffusion_config.py @@ -1,8 +1,12 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project +import pytest + from vllm_omni.entrypoints.omni_stage import _build_od_config +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + def test_build_od_config_includes_diffusion_fields(): engine_args = { diff --git a/tests/entrypoints/test_stage_utils.py b/tests/entrypoints/test_stage_utils.py index ac503639b..ab7358d9f 100644 --- a/tests/entrypoints/test_stage_utils.py +++ b/tests/entrypoints/test_stage_utils.py @@ -6,6 +6,8 @@ import pytest from vllm_omni.entrypoints.stage_utils import set_stage_devices +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + def _make_dummy_torch(call_log): class _Props: diff --git a/tests/model_executor/models/qwen2_5_omni/test_audio_length.py b/tests/model_executor/models/qwen2_5_omni/test_audio_length.py index dd5f09817..6156ed3a9 100644 --- a/tests/model_executor/models/qwen2_5_omni/test_audio_length.py +++ b/tests/model_executor/models/qwen2_5_omni/test_audio_length.py @@ -3,6 +3,8 @@ import pytest +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + def test_resolve_max_mel_frames_default(): from vllm_omni.model_executor.models.qwen2_5_omni.audio_length import resolve_max_mel_frames diff --git a/tests/utils.py b/tests/utils.py index f5c513a4d..3219821b6 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -495,18 +495,8 @@ def hardware_test(*, res: dict[str, str], num_cards: int | dict[str, int] = 1): raise ValueError(f"Unsupported platform: {platform}") all_marks.extend(marks) - create_new_process_flag = False - for cards in num_cards_dict.values(): - if cards > 1: - create_new_process_flag = True - break - def wrapper(f: Callable[_P, None]) -> Callable[_P, None]: - if create_new_process_flag: - # only for distributed tests - func = create_new_process_for_each_test()(f) - else: - func = f + func = f for mark in reversed(all_marks): func = mark(func) return func diff --git a/tests/worker/test_gpu_generation_model_runner.py b/tests/worker/test_gpu_generation_model_runner.py index 25ed1ae86..5c44889a4 100644 --- a/tests/worker/test_gpu_generation_model_runner.py +++ b/tests/worker/test_gpu_generation_model_runner.py @@ -1,7 +1,10 @@ +import pytest import torch from vllm_omni.worker.gpu_generation_model_runner import GPUGenerationModelRunner +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + class _DummyInputBatch: def __init__(self): diff --git a/tests/worker/test_omni_gpu_model_runner.py b/tests/worker/test_omni_gpu_model_runner.py index eb1adf227..c7836123a 100644 --- a/tests/worker/test_omni_gpu_model_runner.py +++ b/tests/worker/test_omni_gpu_model_runner.py @@ -1,10 +1,13 @@ from contextlib import contextmanager from types import SimpleNamespace +import pytest import torch from vllm_omni.worker.gpu_model_runner import OmniGPUModelRunner +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + class DummyBuffer: """A minimal buffer wrapper that exposes the `.gpu` attribute.""" From ac397ae2a0b05a4bec3996c94f36c8bfd49c27f5 Mon Sep 17 00:00:00 2001 From: XU Mingshi <91017482+mxuax@users.noreply.github.com> Date: Mon, 9 Feb 2026 19:10:10 +0800 Subject: [PATCH 06/10] [Diffusion][Perf] Remove Redundant Communication Cost by Refining SP Hook Design (#1275) Signed-off-by: mxuax Signed-off-by: XU Mingshi <91017482+mxuax@users.noreply.github.com> --- vllm_omni/diffusion/attention/layer.py | 27 ++++++++++++++++--- vllm_omni/diffusion/forward_context.py | 10 +++++++ .../diffusion/hooks/sequence_parallel.py | 20 +++++++++++++- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/vllm_omni/diffusion/attention/layer.py b/vllm_omni/diffusion/attention/layer.py index 83cfe84d7..f83bb294d 100644 --- a/vllm_omni/diffusion/attention/layer.py +++ b/vllm_omni/diffusion/attention/layer.py @@ -14,10 +14,11 @@ from vllm.logger import init_logger from vllm_omni.diffusion.attention.backends.abstract import AttentionMetadata from vllm_omni.diffusion.attention.backends.sdpa import SDPABackend from vllm_omni.diffusion.attention.parallel import build_parallel_attention_strategy +from vllm_omni.diffusion.attention.parallel.base import NoParallelAttention from vllm_omni.diffusion.attention.parallel.ring import RingParallelAttention from vllm_omni.diffusion.attention.selector import get_attn_backend from vllm_omni.diffusion.distributed.parallel_state import get_sp_group -from vllm_omni.diffusion.forward_context import get_forward_context +from vllm_omni.diffusion.forward_context import get_forward_context, is_forward_context_available logger = init_logger(__name__) @@ -87,6 +88,21 @@ class Attention(nn.Module): gather_idx=gather_idx, use_sync=use_sync, ) + # Fallback strategy when SP is not active (outside sharded regions) + self._no_parallel_strategy = NoParallelAttention() + + def _get_active_parallel_strategy(self): + """Get the parallel strategy based on current SP active state. + + Returns NoParallelAttention if we're outside an SP sharded region + (e.g., in noise_refiner/context_refiner before unified_prepare in Z-Image). + This avoids unnecessary SP communication for layers not covered by _sp_plan. + """ + if is_forward_context_available(): + ctx = get_forward_context() + if not ctx.sp_active: + return self._no_parallel_strategy + return self.parallel_strategy def forward( self, @@ -95,20 +111,23 @@ class Attention(nn.Module): value: torch.Tensor, attn_metadata: AttentionMetadata = None, ) -> torch.Tensor: + # Get the appropriate parallel strategy based on SP active state + strategy = self._get_active_parallel_strategy() + # 1. Prepare inputs (Communication / Resharding) # For Ulysses: AllToAll Q/K/V; Slicing joint_q/k/v # For Ring: Concat joint_q - query, key, value, attn_metadata, ctx = self.parallel_strategy.pre_attention(query, key, value, attn_metadata) + query, key, value, attn_metadata, ctx = strategy.pre_attention(query, key, value, attn_metadata) # 2. Kernel Execution (Computation) - if self.use_ring: + if self.use_ring and strategy is not self._no_parallel_strategy: out = self._run_ring_attention(query, key, value, attn_metadata) else: out = self._run_local_attention(query, key, value, attn_metadata) # 3. Post-processing (Reverse Communication) # For Ulysses: AllToAll Output, and AllGather Joint Output - out = self.parallel_strategy.post_attention(out, ctx) + out = strategy.post_attention(out, ctx) return out diff --git a/vllm_omni/diffusion/forward_context.py b/vllm_omni/diffusion/forward_context.py index 02082e7b1..d2e68c8be 100644 --- a/vllm_omni/diffusion/forward_context.py +++ b/vllm_omni/diffusion/forward_context.py @@ -31,6 +31,16 @@ class ForwardContext: # Original sequence length before padding (for removing padding in gather) sp_original_seq_len: int | None = None + # SP active scope tracking + # Tracks the depth of SP sharding - incremented on shard, decremented on gather + # Used by attention layers to determine if SP communication should be enabled + _sp_shard_depth: int = 0 + + @property + def sp_active(self) -> bool: + """Returns True when inside an SP sharded region (between shard and gather).""" + return self._sp_shard_depth > 0 + def __post_init__(self): pass diff --git a/vllm_omni/diffusion/hooks/sequence_parallel.py b/vllm_omni/diffusion/hooks/sequence_parallel.py index 8f2c2b755..7044a3aa6 100644 --- a/vllm_omni/diffusion/hooks/sequence_parallel.py +++ b/vllm_omni/diffusion/hooks/sequence_parallel.py @@ -235,6 +235,8 @@ class SequenceParallelSplitHook(ModelHook): def post_forward(self, module: nn.Module, output: Any) -> Any: """Shard outputs for split_output=True entries.""" + from vllm_omni.diffusion.forward_context import get_forward_context, is_forward_context_available + is_tensor = isinstance(output, torch.Tensor) is_tensor_list = isinstance(output, (list, tuple)) and all(isinstance(x, torch.Tensor) for x in output) @@ -243,6 +245,7 @@ class SequenceParallelSplitHook(ModelHook): return output output_list = [output] if is_tensor else list(output) + actually_sharded = False for index, spm in self.metadata.items(): if not isinstance(index, int): @@ -252,7 +255,14 @@ class SequenceParallelSplitHook(ModelHook): if index >= len(output_list): raise ValueError(f"Index {index} out of bounds for output of length {len(output_list)}.") - output_list[index] = self._prepare_sp_input(output_list[index], spm, self._last_args, self._last_kwargs) + original = output_list[index] + output_list[index] = self._prepare_sp_input(original, spm, self._last_args, self._last_kwargs) + if output_list[index] is not original: + actually_sharded = True + + # Mark SP as active only if at least one tensor was actually sharded + if actually_sharded and is_forward_context_available(): + get_forward_context()._sp_shard_depth += 1 return output_list[0] if is_tensor else type(output)(output_list) @@ -445,6 +455,8 @@ class SequenceParallelGatherHook(ModelHook): ctx = get_forward_context() original_seq_len = ctx.sp_original_seq_len + actually_gathered = False + for i, spm in enumerate(self.metadata): if spm is None: continue @@ -465,6 +477,12 @@ class SequenceParallelGatherHook(ModelHook): logger.debug(f"Removed padding: gathered shape {gathered.shape} (original_seq_len={original_seq_len})") output[i] = gathered + actually_gathered = True + + # Mark SP as inactive only if at least one tensor was actually gathered + if actually_gathered and is_forward_context_available(): + ctx = get_forward_context() + ctx._sp_shard_depth = max(0, ctx._sp_shard_depth - 1) return output[0] if is_tensor else type(output)(output) From 9af6fb9a1faac677aea3caa76796b39ee5b3c61e Mon Sep 17 00:00:00 2001 From: Junhong Liu Date: Mon, 9 Feb 2026 19:17:32 +0800 Subject: [PATCH 07/10] [Feature] Opt metrics structure (#891) Signed-off-by: Junhong Liu <98734602+LJH-LBJ@users.noreply.github.com> Signed-off-by: Junhong Liu Co-authored-by: Hongsheng Liu --- benchmarks/qwen3-omni/README.md | 2 +- .../vllm_omni/eval_qwen3_moe_omni.sh | 2 +- docs/api/README.md | 8 +- docs/contributing/metrics.md | 165 +++++ examples/offline_inference/bagel/end2end.py | 4 +- .../offline_inference/qwen2_5_omni/end2end.py | 4 +- .../offline_inference/qwen3_omni/end2end.py | 4 +- .../offline_inference/qwen3_tts/end2end.py | 4 +- requirements/common.txt | 1 + tests/e2e/online_serving/test_async_omni.py | 53 +- tests/entrypoints/test_omni_llm.py | 6 +- tests/metrics/test_stats.py | 157 +++++ vllm_omni/diffusion/diffusion_engine.py | 16 +- .../distributed/omni_connectors/adapter.py | 3 +- vllm_omni/entrypoints/async_omni.py | 66 +- vllm_omni/entrypoints/client_request_state.py | 4 +- vllm_omni/entrypoints/log_utils.py | 591 ------------------ vllm_omni/entrypoints/omni.py | 58 +- vllm_omni/entrypoints/omni_llm.py | 2 +- vllm_omni/entrypoints/omni_stage.py | 16 +- vllm_omni/metrics/__init__.py | 9 + vllm_omni/metrics/stats.py | 561 +++++++++++++++++ vllm_omni/metrics/utils.py | 143 +++++ 23 files changed, 1151 insertions(+), 728 deletions(-) create mode 100644 docs/contributing/metrics.md create mode 100644 tests/metrics/test_stats.py delete mode 100644 vllm_omni/entrypoints/log_utils.py create mode 100644 vllm_omni/metrics/__init__.py create mode 100644 vllm_omni/metrics/stats.py create mode 100644 vllm_omni/metrics/utils.py diff --git a/benchmarks/qwen3-omni/README.md b/benchmarks/qwen3-omni/README.md index fdc385445..c76fea895 100644 --- a/benchmarks/qwen3-omni/README.md +++ b/benchmarks/qwen3-omni/README.md @@ -53,7 +53,7 @@ bash benchmarks/qwen3-omni/vllm_omni/eval_qwen3_moe_omni.sh ``` What it does: -- Runs `examples/offline_inference/qwen3_omni/end2end.py` with `--enable-stats`. +- Runs `examples/offline_inference/qwen3_omni/end2end.py` with `--log-stats`. - Uses `benchmarks/build_dataset/top100.txt` and writes to: - Logs: `benchmarks/qwen3-omni/vllm_omni/logs/` - `omni_llm_pipeline_text.orchestrator.stats.jsonl` — per-stage latency stats. diff --git a/benchmarks/qwen3-omni/vllm_omni/eval_qwen3_moe_omni.sh b/benchmarks/qwen3-omni/vllm_omni/eval_qwen3_moe_omni.sh index 61e46f8c3..935753605 100644 --- a/benchmarks/qwen3-omni/vllm_omni/eval_qwen3_moe_omni.sh +++ b/benchmarks/qwen3-omni/vllm_omni/eval_qwen3_moe_omni.sh @@ -23,7 +23,7 @@ else python $end2end_script_path --output-wav $outputs_dir \ --query-type text \ --txt-prompts $build_dataset_path \ - --enable-stats \ + --log-stats \ --log-dir $log_dir echo "Logs and outputs are saved in ${log_dir} and ${outputs_dir} respectively:" echo " - omni_llm_pipeline_text run dir/base name" diff --git a/docs/api/README.md b/docs/api/README.md index 6219aee40..eb3a40950 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -15,9 +15,6 @@ Main entry points for vLLM-Omni inference and serving. - [vllm_omni.entrypoints.cli.benchmark.serve.OmniBenchmarkServingSubcommand][] - [vllm_omni.entrypoints.cli.serve.OmniServeCommand][] - [vllm_omni.entrypoints.client_request_state.ClientRequestState][] -- [vllm_omni.entrypoints.log_utils.OrchestratorMetrics][] -- [vllm_omni.entrypoints.log_utils.StageRequestMetrics][] -- [vllm_omni.entrypoints.log_utils.StageStats][] - [vllm_omni.entrypoints.omni.Omni][] - [vllm_omni.entrypoints.omni.OmniBase][] - [vllm_omni.entrypoints.omni_diffusion.OmniDiffusion][] @@ -114,3 +111,8 @@ Worker classes and model runners for distributed inference. - [vllm_omni.worker.gpu_generation_worker.GPUGenerationWorker][] - [vllm_omni.worker.gpu_model_runner.OmniGPUModelRunner][] - [vllm_omni.worker.mixins.OmniWorkerMixin][] + + +## Metrics + +- [vllm_omni.metrics.OrchestratorAggregator][] diff --git a/docs/contributing/metrics.md b/docs/contributing/metrics.md new file mode 100644 index 000000000..7a46a2861 --- /dev/null +++ b/docs/contributing/metrics.md @@ -0,0 +1,165 @@ + +# Metrics vLLM-Omni: + +You can use these metrics in production to monitor the health and performance of the vLLM-omni system. Typical scenarios include: +- **Performance Monitoring**: Track throughput (e.g., `e2e_avg_tokens_per_s`), latency (e.g., `e2e_total_ms`), and resource utilization to verify that the system meets expected standards. +- **Debugging and Troubleshooting**: Use detailed per-request metrics to diagnose issues, such as high transfer times or unexpected token counts. + +## How to Enable and View Metrics + +### 1. Start the Service with Metrics Logging + +```bash +vllm serve /workspace/models/Qwen3-Omni-30B-A3B-Instruct --omni --port 8014 --log-stats +``` + +### 2. Send a Request + +```bash +python openai_chat_completion_client_for_multimodal_generation.py --query-type use_image +``` + +### 3. What You Will See + +With `--log-stats` enabled, the server will output detailed metrics logs after each request. Example output: + + +#### Overall Summary + +| Field | Value | +|-----------------------------|--------------| +| e2e_requests | 1 | +| e2e_wall_time_ms | 41,299.190 | +| e2e_total_tokens | 5,202 | +| e2e_avg_time_per_request_ms | 41,299.190 | +| e2e_avg_tokens_per_s | 125.959 | +| e2e_stage_0_wall_time_ms | 10,192.289 | +| e2e_stage_1_wall_time_ms | 30,541.409 | +| e2e_stage_2_wall_time_ms | 207.496 | + +#### RequestE2EStats + +| Field | Value | +|-------------------------|------------| +| e2e_total_ms | 41,299.133 | +| e2e_total_tokens | 5,202 | +| transfers_total_time_ms | 245.895 | +| transfers_total_kbytes | 138,089.939| + +#### StageRequestStats + +| Field | 0 | 1 | 2 | +|------------------------|--------|--------|--------| +| audio_generated_frames | 0 | 0 | 525,525| +| batch_id | 38 | 274 | 0 | +| batch_size | 1 | 1 | 1 | +| num_tokens_in | 4,860 | 4,826 | 4,384 | +| num_tokens_out | 67 | 275 | 0 | +| postprocess_time_ms | 256.158| 0.491 | 0.000 | +| stage_gen_time_ms | 9,910.007|30,379.198|160.745| + +#### TransferEdgeStats + +| Field | 0->1 | 1->2 | +|---------------------|-------------|------------| +| size_kbytes | 109,277.349 | 28,812.591 | +| tx_time_ms | 78.701 | 18.790 | +| rx_decode_time_ms | 111.865 | 31.706 | +| in_flight_time_ms | 2.015 | 2.819 | + + +These logs include: +- **Overall summary**: total requests, wall time, average tokens/sec, etc. +- **E2E table**: per-request latency and token counts. +- **Stage table**: per-stage batch and timing details. +- **Transfer table**: data transfer and timing for each edge. + +You can use these logs to monitor system health, debug performance, and analyze request-level metrics as described above. + + +## Metrics Scope: Offline vs Online Inference + +For **offline inference** (batch mode), the summary includes both system-level metrics (aggregated across all requests) and per-request metrics. In this case, `e2e_requests` can be greater than 1, reflecting multiple completed requests in a batch. + +For **online inference** (serving mode), the summary is always per-request. `e2e_requests` is always 1, and only request-level metrics are reported for each completion. + +--- + +## Parameter Details + +| Field | Meaning | +|---------------------------|----------------------------------------------------------------------------------------------| +| `e2e_requests` | Number of completed requests. | +| `e2e_wall_time_ms` | Wall-clock time span from run start to last completion, in ms. | +| `e2e_total_tokens` | Total tokens counted across all completed requests (stage0 input + all stage outputs). | +| `e2e_avg_time_per_request_ms` | Average wall time per request: `e2e_wall_time_ms / e2e_requests`. | +| `e2e_avg_tokens_per_s` | Average token throughput over wall time: `e2e_total_tokens * 1000 / e2e_wall_time_ms`. | +| `e2e_stage_{i}_wall_time_ms` | Wall-clock time span for stage i, in ms. Each stage's wall time is reported as a separate field, e.g., `e2e_stage_0_wall_time_ms`, `e2e_stage_1_wall_time_ms`, etc. | + +--- + +## E2E Table (per request) + +| Field | Meaning | +|---------------------------|-----------------------------------------------------------------------| +| `e2e_total_ms` | End-to-end latency in ms. | +| `e2e_total_tokens` | Total tokens for the request (stage0 input + all stage outputs). | +| `transfers_total_time_ms` | Sum of transfer edge `total_time_ms` for this request. | +| `transfers_total_kbytes` | Sum of transfer kbytes for this request. | + + +--- + +## Stage Table (per stage event / request) + +| Field | Meaning | +|---------------------------|-------------------------------------------------------------------------------------------------| +| `batch_id` | Batch index. | +| `batch_size` | Batch size. | +| `num_tokens_in` | Input tokens to the stage. | +| `num_tokens_out` | Output tokens from the stage. | +| `stage_gen_time_ms` | Stage compute time in ms, excluding postprocessing time (reported separately as `postprocess_time_ms`). | +| `image_num` | Number of images generated (for diffusion/image stages). | +| `resolution` | Image resolution (for diffusion/image stages). | +| `postprocess_time_ms` | Diffusion/image: post-processing time in ms. | + +--- + +## Transfer Table (per edge / request) + +| Field | Meaning | +|----------------------|---------------------------------------------------------------------------| +| `size_kbytes` | Total kbytes transferred. | +| `tx_time_ms` | Sender transfer time in ms. | +| `rx_decode_time_ms` | Receiver decode time in ms. | +| `in_flight_time_ms` | In-flight time in ms. | + + +## Expectation of the Numbers (Verification) + +**Formulas:** +- `e2e_total_tokens = Stage0's num_tokens_in + sum(all stages' num_tokens_out)` +- `transfers_total_time_ms = sum(tx_time_ms + rx_decode_time_ms + in_flight_time_ms)` for every edge + +**Using the example above:** + +### e2e_total_tokens +- Stage0's `num_tokens_in`: **4,860** +- Stage0's `num_tokens_out`: **67** +- Stage1's `num_tokens_out`: **275** +- Stage2's `num_tokens_out`: **0** + +So, +``` +e2e_total_tokens = 4,860 + 67 + 275 + 0 = 5,202 +``` +This matches the table value: `e2e_total_tokens = 5,202`. + +### transfers_total_time_ms +For each edge: +- 0->1: tx_time_ms (**78.701**) + rx_decode_time_ms (**111.865**) + in_flight_time_ms (**2.015**) = **192.581** +- 1->2: tx_time_ms (**18.790**) + rx_decode_time_ms (**31.706**) + in_flight_time_ms (**2.819**) = **53.315** + +Sum: 192.581 + 53.315 = **245.896** + +The table shows `transfers_total_time_ms = 245.895`, which matches the calculation (difference is due to rounding). diff --git a/examples/offline_inference/bagel/end2end.py b/examples/offline_inference/bagel/end2end.py index 397fd333e..8fa412065 100644 --- a/examples/offline_inference/bagel/end2end.py +++ b/examples/offline_inference/bagel/end2end.py @@ -36,7 +36,7 @@ def parse_args(): ) # OmniLLM init args - parser.add_argument("--enable-stats", action="store_true", default=False) + parser.add_argument("--log-stats", action="store_true", default=False) parser.add_argument("--init-sleep-seconds", type=int, default=20) parser.add_argument("--batch-timeout", type=int, default=5) parser.add_argument("--init-timeout", type=int, default=300) @@ -120,7 +120,7 @@ def main(): omni_kwargs.update( { - "log_stats": args.enable_stats, + "log_stats": args.log_stats, "init_sleep_seconds": args.init_sleep_seconds, "batch_timeout": args.batch_timeout, "init_timeout": args.init_timeout, diff --git a/examples/offline_inference/qwen2_5_omni/end2end.py b/examples/offline_inference/qwen2_5_omni/end2end.py index 63b08202a..7cd8e1873 100644 --- a/examples/offline_inference/qwen2_5_omni/end2end.py +++ b/examples/offline_inference/qwen2_5_omni/end2end.py @@ -322,7 +322,7 @@ def main(args): query_result = query_func() omni_llm = Omni( model=model_name, - log_stats=args.enable_stats, + log_stats=args.log_stats, stage_init_timeout=args.stage_init_timeout, batch_timeout=args.batch_timeout, init_timeout=args.init_timeout, @@ -439,7 +439,7 @@ def parse_args(): help="Query type.", ) parser.add_argument( - "--enable-stats", + "--log-stats", action="store_true", default=False, help="Enable writing detailed statistics (default: disabled)", diff --git a/examples/offline_inference/qwen3_omni/end2end.py b/examples/offline_inference/qwen3_omni/end2end.py index 0b484c507..263377762 100644 --- a/examples/offline_inference/qwen3_omni/end2end.py +++ b/examples/offline_inference/qwen3_omni/end2end.py @@ -328,7 +328,7 @@ def main(args): omni_llm = Omni( model=model_name, stage_configs_path=args.stage_configs_path, - log_stats=args.enable_stats, + log_stats=args.log_stats, stage_init_timeout=args.stage_init_timeout, ) @@ -455,7 +455,7 @@ def parse_args(): help="Query type.", ) parser.add_argument( - "--enable-stats", + "--log-stats", action="store_true", default=False, help="Enable writing detailed statistics (default: disabled)", diff --git a/examples/offline_inference/qwen3_tts/end2end.py b/examples/offline_inference/qwen3_tts/end2end.py index 18bb9dedc..93aeba3ca 100644 --- a/examples/offline_inference/qwen3_tts/end2end.py +++ b/examples/offline_inference/qwen3_tts/end2end.py @@ -219,7 +219,7 @@ def main(args): omni = Omni( model=model_name, stage_configs_path=args.stage_configs_path, - log_stats=args.enable_stats, + log_stats=args.log_stats, stage_init_timeout=args.stage_init_timeout, ) @@ -275,7 +275,7 @@ def parse_args(): help="Query type.", ) parser.add_argument( - "--enable-stats", + "--log-stats", action="store_true", default=False, help="Enable writing detailed statistics (default: disabled)", diff --git a/requirements/common.txt b/requirements/common.txt index 19ebca949..2331e0f5d 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -12,3 +12,4 @@ torchsde>=0.2.6 openai-whisper>=20250625 imageio[ffmpeg]>=2.37.2 sox>=1.5.0 +prettytable>=3.8.0 diff --git a/tests/e2e/online_serving/test_async_omni.py b/tests/e2e/online_serving/test_async_omni.py index ba5084ad4..cab3e6e22 100644 --- a/tests/e2e/online_serving/test_async_omni.py +++ b/tests/e2e/online_serving/test_async_omni.py @@ -9,7 +9,7 @@ from vllm import SamplingParams from vllm.inputs import PromptType from tests.utils import hardware_test -from vllm_omni.entrypoints.async_omni import AsyncOmni, ClientRequestState +from vllm_omni.entrypoints.async_omni import AsyncOmni os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" @@ -115,54 +115,3 @@ async def test_abort(): num_generated_tokens, request_id = await task assert num_generated_tokens == NUM_EXPECTED_TOKENS await asyncio.sleep(5) - - -@pytest.mark.core_model -@pytest.mark.omni -@hardware_test(res={"cuda": "H100", "rocm": "MI325"}, num_cards=2) -@pytest.mark.asyncio -async def test_build_and_log_summary(monkeypatch): - from vllm_omni.entrypoints.utils import get_final_stage_id_for_e2e - - RealCRS = ClientRequestState - capture_metrics = {} - - class MockCRS(RealCRS): - def __init__(self, request_id: str): - super().__init__(request_id) - capture_metrics[request_id] = self - - monkeypatch.setattr("vllm_omni.entrypoints.async_omni.ClientRequestState", MockCRS) - monkeypatch.setattr("vllm_omni.entrypoints.client_request_state.ClientRequestState", MockCRS) - - with ExitStack() as after: - # Avoid SHM IPC in tests to prevent /dev/shm exhaustion and SIGBUS. - engine = AsyncOmni( - model=model, - stage_configs_path=stage_config, - shm_threshold_bytes=sys.maxsize, - ) - after.callback(engine.shutdown) - prompt = "Hello my name is Robert and " - NUM_EXPECTED_TOKENS = 64 - NUM_REQUESTS = 3 - request_ids = [f"request-{i}" for i in range(NUM_REQUESTS)] - - # Create concurrent requests. - tasks: list[asyncio.Task] = [] - for idx, request_id in enumerate(request_ids): - tasks.append(asyncio.create_task(generate(engine, request_id, prompt, NUM_EXPECTED_TOKENS))) - - # Confirm the requests are okay. - for idx, task in enumerate(tasks): - await task - output_modalities = ["text"] - final_stage_id_for_e2e = get_final_stage_id_for_e2e( - output_modalities, engine.output_modalities, engine.stage_list - ) - summary = capture_metrics[request_ids[idx]].metrics.build_and_log_summary(final_stage_id_for_e2e) - - # Check that total tokens matches sum of stage tokens. - assert summary["e2e_total_tokens"] == sum(stage["tokens"] for stage in summary["stages"]) - # Check that total time matches sum of stage times. - assert summary["e2e_total_time_ms"] >= sum(stage["total_time_ms"] for stage in summary["stages"]) diff --git a/tests/entrypoints/test_omni_llm.py b/tests/entrypoints/test_omni_llm.py index f33ca6d59..4f05575ca 100644 --- a/tests/entrypoints/test_omni_llm.py +++ b/tests/entrypoints/test_omni_llm.py @@ -298,9 +298,9 @@ def _setup_log_mocks(monkeypatch): # Mock OrchestratorMetrics to be a simple class that doesn't require file operations class _FakeOrchestratorMetrics: - def __init__(self, num_stages, enable_stats, wall_start_ts): + def __init__(self, num_stages, log_stats, wall_start_ts): self.num_stages = num_stages - self.enable_stats = enable_stats + self.log_stats = log_stats self.stage_first_ts = [None] * num_stages self.stage_last_ts = [None] * num_stages self.e2e_done = set() @@ -318,7 +318,7 @@ def _setup_log_mocks(monkeypatch): return "Fake summary" monkeypatch.setattr( - "vllm_omni.entrypoints.omni.OrchestratorMetrics", + "vllm_omni.entrypoints.omni.OrchestratorAggregator", _FakeOrchestratorMetrics, raising=False, ) diff --git a/tests/metrics/test_stats.py b/tests/metrics/test_stats.py new file mode 100644 index 000000000..8b18c5dff --- /dev/null +++ b/tests/metrics/test_stats.py @@ -0,0 +1,157 @@ +from __future__ import annotations + +import pytest + +from vllm_omni.metrics import OrchestratorAggregator +from vllm_omni.metrics.stats import RequestE2EStats, StageRequestStats, StageStats + +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + + +def _get_request_entry(table: list[dict], request_id: str) -> dict: + for entry in table: + if entry.get("request_id") == request_id: + return entry + raise AssertionError(f"request_id={request_id} not found") + + +def test_orchestrator_aggregator_builds_summary() -> None: + agg = OrchestratorAggregator(num_stages=2, log_stats=True, wall_start_ts=0.0, final_stage_id_for_e2e=1) + agg.stage_first_ts[0] = 0.0 + agg.stage_last_ts[0] = 0.03 + agg.stage_first_ts[1] = 0.05 + agg.stage_last_ts[1] = 0.07 + + agg.on_forward(0, 1, "r1", size_bytes=1024, tx_ms=5.0, used_shm=False) + + agg.on_stage_metrics( + 0, + "r1", + StageRequestStats( + batch_id=1, + batch_size=1, + num_tokens_in=3, + num_tokens_out=3, + stage_gen_time_ms=30.0, + rx_transfer_bytes=0, + rx_decode_time_ms=0.0, + rx_in_flight_time_ms=0.0, + stage_stats=StageStats(), + ), + ) + agg.on_stage_metrics( + 1, + "r1", + StageRequestStats( + batch_id=1, + batch_size=1, + num_tokens_in=0, + num_tokens_out=4, + stage_gen_time_ms=20.0, + rx_transfer_bytes=1024, + rx_decode_time_ms=5.0, + rx_in_flight_time_ms=2.0, + stage_stats=StageStats(), + ), + ) + agg.on_finalize_request(1, "r1", req_start_ts=0.0) + + summary = agg.build_and_log_summary() + overall = summary["overall_summary"] + assert overall["e2e_requests"] == 1 + + stage_entry = _get_request_entry(summary["stage_table"], "r1") + stage_ids = [row["stage_id"] for row in stage_entry["stages"]] + assert stage_ids == [0, 1] + + transfer_entry = _get_request_entry(summary["trans_table"], "r1") + assert transfer_entry["transfers"][0]["edge"] == "0->1" + assert transfer_entry["transfers"][0]["size_kbytes"] == 1.0 + + e2e_entry = _get_request_entry(summary["e2e_table"], "r1") + assert e2e_entry["e2e_total_tokens"] == 10 + + +def test_build_and_log_summary_e2e_only() -> None: + agg = OrchestratorAggregator(num_stages=1, log_stats=True, wall_start_ts=0.0, final_stage_id_for_e2e=0) + agg.e2e_events.append( + RequestE2EStats( + request_id="r", + e2e_total_ms=10.0, + e2e_total_tokens=5, + transfers_total_time_ms=0.0, + transfers_total_bytes=0, + ) + ) + + summary = agg.build_and_log_summary() + e2e_entry = _get_request_entry(summary["e2e_table"], "r") + assert e2e_entry["e2e_total_tokens"] == 5 + stage_entry = _get_request_entry(summary["stage_table"], "r") + assert stage_entry["stages"] == [] + + +def test_build_and_log_summary_multiple_requests() -> None: + agg = OrchestratorAggregator( + num_stages=2, log_stats=True, wall_start_ts=0.0, final_stage_id_for_e2e={"r1": 1, "r2": 0} + ) + + # Request r1 goes through both stages + agg.on_stage_metrics( + 0, + "r1", + StageRequestStats( + batch_id=1, + batch_size=1, + num_tokens_in=2, + num_tokens_out=4, + stage_gen_time_ms=10.0, + rx_transfer_bytes=0, + rx_decode_time_ms=0.0, + rx_in_flight_time_ms=0.0, + stage_stats=StageStats(), + ), + ) + agg.on_stage_metrics( + 1, + "r1", + StageRequestStats( + batch_id=1, + batch_size=1, + num_tokens_in=4, + num_tokens_out=5, + stage_gen_time_ms=8.0, + rx_transfer_bytes=0, + rx_decode_time_ms=0.0, + rx_in_flight_time_ms=0.0, + stage_stats=StageStats(), + ), + ) + agg.on_finalize_request(1, "r1", req_start_ts=0.0) + + # Request r2 only goes through stage 0 + agg.on_stage_metrics( + 0, + "r2", + StageRequestStats( + batch_id=2, + batch_size=1, + num_tokens_in=1, + num_tokens_out=2, + stage_gen_time_ms=12.0, + rx_transfer_bytes=0, + rx_decode_time_ms=0.0, + rx_in_flight_time_ms=0.0, + stage_stats=StageStats(), + ), + ) + agg.on_finalize_request(0, "r2", req_start_ts=0.0) + + summary = agg.build_and_log_summary() + assert len(summary["stage_table"]) == 2 + assert {entry["request_id"] for entry in summary["e2e_table"]} == {"r1", "r2"} + # Check that r1 has two stages and r2 has one + r1_stage_entry = next(e for e in summary["stage_table"] if e["request_id"] == "r1") + r2_stage_entry = next(e for e in summary["stage_table"] if e["request_id"] == "r2") + assert len(r1_stage_entry["stages"]) == 2 + assert len(r2_stage_entry["stages"]) == 1 diff --git a/vllm_omni/diffusion/diffusion_engine.py b/vllm_omni/diffusion/diffusion_engine.py index 8e19f1242..2ab94d5b7 100644 --- a/vllm_omni/diffusion/diffusion_engine.py +++ b/vllm_omni/diffusion/diffusion_engine.py @@ -102,16 +102,20 @@ class DiffusionEngine: if not isinstance(outputs, list): outputs = [outputs] if outputs is not None else [] + metrics = { + "image_num": int(request.sampling_params.num_outputs_per_prompt), + "resolution": int(request.sampling_params.resolution), + "postprocess_time_ms": postprocess_time * 1000, + } + if self.pre_process_func is not None: + metrics["preprocessing_time_ms"] = preprocess_time * 1000 + # Handle single request or multiple requests if len(request.prompts) == 1: # Single request: return single OmniRequestOutput prompt = request.prompts[0] request_id = request.request_ids[0] if request.request_ids else "" - metrics = {} - if output.trajectory_timesteps is not None: - metrics["trajectory_timesteps"] = output.trajectory_timesteps - if supports_audio_output(self.od_config.model_class_name): audio_payload = outputs[0] if len(outputs) == 1 else outputs return [ @@ -149,10 +153,6 @@ class DiffusionEngine: request_outputs = outputs[output_idx : output_idx + num_outputs] if output_idx < len(outputs) else [] output_idx += num_outputs - metrics = {} - if output.trajectory_timesteps is not None: - metrics["trajectory_timesteps"] = output.trajectory_timesteps - if supports_audio_output(self.od_config.model_class_name): audio_payload = request_outputs[0] if len(request_outputs) == 1 else request_outputs results.append( diff --git a/vllm_omni/distributed/omni_connectors/adapter.py b/vllm_omni/distributed/omni_connectors/adapter.py index 4cd225078..66aebddc1 100644 --- a/vllm_omni/distributed/omni_connectors/adapter.py +++ b/vllm_omni/distributed/omni_connectors/adapter.py @@ -15,6 +15,7 @@ if TYPE_CHECKING: from .connectors.base import OmniConnectorBase from vllm_omni.entrypoints.stage_utils import OmniStageTaskType +from vllm_omni.metrics import OrchestratorAggregator from .utils.logging import get_connector_logger @@ -30,7 +31,7 @@ def try_send_via_connector( sampling_params: Any, original_prompt: Any, next_stage_queue_submit_fn: Callable[[dict[str, Any]], None], - metrics: Any, + metrics: OrchestratorAggregator, ) -> bool: """ Attempts to send data via OmniConnector. diff --git a/vllm_omni/entrypoints/async_omni.py b/vllm_omni/entrypoints/async_omni.py index 1545e17a1..6a3d7393a 100644 --- a/vllm_omni/entrypoints/async_omni.py +++ b/vllm_omni/entrypoints/async_omni.py @@ -5,8 +5,6 @@ import copy import time import weakref from collections.abc import AsyncGenerator, Iterable, Sequence -from dataclasses import asdict -from pprint import pformat from typing import Any from vllm.config import VllmConfig @@ -23,9 +21,6 @@ from vllm_omni.distributed.omni_connectors.adapter import compute_talker_prompt_ from vllm_omni.distributed.ray_utils.utils import try_close_ray from vllm_omni.engine.input_processor import OmniInputProcessor from vllm_omni.entrypoints.client_request_state import ClientRequestState -from vllm_omni.entrypoints.log_utils import ( - OrchestratorMetrics, -) from vllm_omni.entrypoints.omni import OmniBase from vllm_omni.entrypoints.omni_stage import OmniStage from vllm_omni.entrypoints.stage_utils import SHUTDOWN_TASK, OmniStageTaskType @@ -37,6 +32,7 @@ from vllm_omni.inputs.data import OmniPromptType, OmniSamplingParams # Internal imports (our code) from vllm_omni.lora.request import LoRARequest +from vllm_omni.metrics import OrchestratorAggregator, StageRequestStats from vllm_omni.outputs import OmniRequestOutput logger = init_logger(__name__) @@ -298,10 +294,11 @@ class AsyncOmni(OmniBase): ) # Metrics/aggregation helper - metrics = OrchestratorMetrics( - num_stages, - self._enable_stats, - _wall_start_ts, + metrics = OrchestratorAggregator( + num_stages=num_stages, + log_stats=self.log_stats, + wall_start_ts=_wall_start_ts, + final_stage_id_for_e2e=final_stage_id_for_e2e, ) req_state = ClientRequestState(request_id) req_state.metrics = metrics @@ -328,8 +325,6 @@ class AsyncOmni(OmniBase): req_state, metrics, final_stage_id_for_e2e, - _req_start_ts, - _wall_start_ts, ): yield output else: @@ -338,8 +333,6 @@ class AsyncOmni(OmniBase): req_state, metrics, final_stage_id_for_e2e, - _req_start_ts, - _wall_start_ts, sampling_params_list, prompt, ): @@ -348,17 +341,15 @@ class AsyncOmni(OmniBase): logger.debug(f"[{self._name}] Request {request_id} finalized at stage-{final_stage_id_for_e2e}") try: # Finalize E2E metrics if not already done - if str(request_id) not in metrics.e2e_done: - metrics.on_finalize_request( - final_stage_id_for_e2e, - request_id, - _req_start_ts.get(request_id, _wall_start_ts), - ) + metrics.on_finalize_request( + final_stage_id_for_e2e, + request_id, + _req_start_ts.get(request_id, _wall_start_ts), + ) logger.debug(f"[{self._name}] All requests completed") # Summarize and print stats - summary = metrics.build_and_log_summary(final_stage_id_for_e2e) - logger.info("[Summary] %s", pformat(summary, sort_dicts=False)) + metrics.build_and_log_summary() except Exception as e: logger.exception(f"[{self._name}] Request {request_id} Failed to finalized/build/log summary: {e}") finally: @@ -374,10 +365,8 @@ class AsyncOmni(OmniBase): prompt: Any, sampling_params_list: list[SamplingParams], req_state: ClientRequestState, - metrics: OrchestratorMetrics, + metrics: OrchestratorAggregator, final_stage_id_for_e2e: int, - req_start_ts: dict[int, float], - wall_start_ts: float, ) -> AsyncGenerator[OmniRequestOutput, None]: all_stages_finished = {stage_id: False for stage_id in range(final_stage_id_for_e2e + 1)} submit_flag = True @@ -413,16 +402,17 @@ class AsyncOmni(OmniBase): all_stages_finished[stage_id] = finished if output_to_yield: + metrics.record_audio_generated_frames( + output_to_yield, engine_outputs.finished, stage_id, request_id + ) yield output_to_yield async def _process_sequential_results( self, request_id: str, req_state: ClientRequestState, - metrics: OrchestratorMetrics, + metrics: OrchestratorAggregator, final_stage_id_for_e2e: int, - req_start_ts: dict[int, float], - wall_start_ts: float, sampling_params_list: list[SamplingParams], prompt: Any, ) -> AsyncGenerator[OmniRequestOutput, None]: @@ -438,6 +428,9 @@ class AsyncOmni(OmniBase): metrics, ) if output_to_yield: + metrics.record_audio_generated_frames( + output_to_yield, engine_outputs.finished, stage_id, request_id + ) yield output_to_yield if not isinstance(engine_outputs, list): engine_outputs = [engine_outputs] @@ -446,7 +439,9 @@ class AsyncOmni(OmniBase): next_stage_id = stage_id + 1 if next_stage_id <= final_stage_id_for_e2e: next_stage: OmniStage = self.stage_list[next_stage_id] - next_inputs = next_stage.process_engine_inputs(self.stage_list, prompt) + # Derive inputs for the next stage, record postprocess time + with metrics.stage_postprocess_timer(stage_id, request_id): + next_inputs = next_stage.process_engine_inputs(self.stage_list, prompt) sp_next: SamplingParams = sampling_params_list[next_stage_id] # Check if we have a connector for this edge @@ -487,7 +482,7 @@ class AsyncOmni(OmniBase): result: dict[str, Any], stage: OmniStage, stage_id: int, - metrics: OrchestratorMetrics, + metrics: OrchestratorAggregator, ) -> tuple[Any, bool, OmniRequestOutput | None]: """ Process a single result dictionary from a stage. @@ -513,9 +508,16 @@ class AsyncOmni(OmniBase): metrics.stage_last_ts[stage_id] = max(metrics.stage_last_ts[stage_id] or 0.0, time.time()) try: - _m = asdict(result.get("metrics")) - if _m is not None and finished: - metrics.on_stage_metrics(stage_id, req_id, _m) + _m: StageRequestStats = result.get("metrics") + if _m is not None: + # Accumulate generation time + metrics.accumulated_gen_time_ms[req_id][stage_id] += _m.stage_gen_time_ms + + # For diffusion stages, we also accumulate diffusion time + metrics.accumulate_diffusion_metrics(stage.stage_type, req_id, engine_outputs) + + if finished: + metrics.on_stage_metrics(stage_id, req_id, _m, stage.final_output_type) except Exception as e: logger.exception( f"[{self._name}] Failed to process metrics for stage {stage_id}, req {req_id}: {e}", diff --git a/vllm_omni/entrypoints/client_request_state.py b/vllm_omni/entrypoints/client_request_state.py index 3e68abb17..1c9103f79 100644 --- a/vllm_omni/entrypoints/client_request_state.py +++ b/vllm_omni/entrypoints/client_request_state.py @@ -1,6 +1,6 @@ import asyncio -from vllm_omni.entrypoints.log_utils import OrchestratorMetrics +from vllm_omni.metrics import OrchestratorAggregator class ClientRequestState: @@ -10,4 +10,4 @@ class ClientRequestState: self.request_id = request_id self.stage_id: int | None = None self.queue = queue if queue is not None else asyncio.Queue() - self.metrics: OrchestratorMetrics | None = None + self.metrics: OrchestratorAggregator | None = None diff --git a/vllm_omni/entrypoints/log_utils.py b/vllm_omni/entrypoints/log_utils.py deleted file mode 100644 index 2031038da..000000000 --- a/vllm_omni/entrypoints/log_utils.py +++ /dev/null @@ -1,591 +0,0 @@ -from __future__ import annotations - -import time -from dataclasses import dataclass -from pprint import pformat -from typing import Any - -from vllm.logger import init_logger - -logger = init_logger(__name__) - - -def log_transfer_tx( - from_stage: int, - to_stage: int, - request_id: Any, - size_bytes: int, - tx_time_ms: float, - used_shm: bool, -) -> None: - logger.info( - pformat( - { - "type": "transfer_stats", - "from_stage": from_stage, - "to_stage": to_stage, - "request_id": request_id, - "size_bytes": int(size_bytes), - "tx_time_ms": float(tx_time_ms), - "tx_mbps": (float(size_bytes) * 8.0) / (max(tx_time_ms, 1e-6) * 1000.0), - "used_shm": bool(used_shm), - }, - sort_dicts=False, - ) - ) - - -def log_transfer_rx( - from_stage: int, - to_stage: int, - request_id: Any, - rx_bytes: int, - rx_decode_time_ms: float, - in_flight_time_ms: float, -) -> None: - logger.info( - pformat( - { - "type": "transfer_rx_stats", - "from_stage": from_stage, - "to_stage": to_stage, - "request_id": request_id, - "rx_bytes": int(rx_bytes), - "rx_decode_time_ms": float(rx_decode_time_ms), - "in_flight_time_ms": float(in_flight_time_ms), - "rx_time_per_kb_ms": ( - (float(rx_decode_time_ms) / max(float(rx_bytes) / 1024.0, 1e-6)) if rx_bytes > 0 else 0.0 - ), - }, - sort_dicts=False, - ) - ) - - -def log_transfer_total( - from_stage: int, - to_stage: int, - request_id: Any, - size_bytes: int, - tx_time_ms: float, - in_flight_time_ms: float, - rx_decode_time_ms: float, - total_time_ms: float, -) -> None: - logger.info( - pformat( - { - "type": "transfer_total_stats", - "from_stage": from_stage, - "to_stage": to_stage, - "request_id": request_id, - "size_bytes": int(size_bytes), - "tx_time_ms": float(tx_time_ms), - "in_flight_time_ms": float(in_flight_time_ms), - "rx_decode_time_ms": float(rx_decode_time_ms), - "total_time_ms": float(total_time_ms), - "total_time_per_kb_ms": ( - float(total_time_ms) / max(float(size_bytes) / 1024.0, 1e-6) if size_bytes > 0 else 0.0 - ), - }, - sort_dicts=False, - ) - ) - - -def log_stage_request_stats( - stage_id: int, - request_id: Any, - batch_size: int, - num_tokens_out: int, - stage_gen_time_ms: float, - tokens_per_s: float, - rx_transfer_bytes: int, - rx_decode_time_ms: float, - rx_mbps: float, -) -> None: - logger.info( - pformat( - { - "type": "Request_stage_stats", - "stage_id": stage_id, - "request_id": request_id, - "batch_size": int(batch_size), - "num_tokens_out": int(num_tokens_out), - "stage_gen_time_ms": float(stage_gen_time_ms), - "tokens_per_s": float(tokens_per_s), - "rx_transfer_bytes": int(rx_transfer_bytes), - "rx_decode_time_ms": float(rx_decode_time_ms), - "rx_mbps": float(rx_mbps), - }, - sort_dicts=False, - ) - ) - - -def compute_and_log_stage_request_stats( - stage_id: int, - request_id: Any, - batch_size: int, - num_engine_outputs: int, - stage_gen_time_ms: float, - rx_transfer_bytes: int, - rx_decode_time_ms: float, -) -> None: - """Compute per-request metrics and log them in one call.""" - tokens_per_s = (num_engine_outputs * 1000.0 / stage_gen_time_ms) if stage_gen_time_ms > 0 else 0.0 - rx_mbps = ( - (float(rx_transfer_bytes) * 8.0) / (max(float(rx_decode_time_ms), 1e-6) * 1000.0) - if rx_transfer_bytes > 0 - else 0.0 - ) - log_stage_request_stats( - stage_id, - request_id, - int(batch_size), - int(num_engine_outputs), - float(stage_gen_time_ms), - float(tokens_per_s), - int(rx_transfer_bytes), - float(rx_decode_time_ms), - float(rx_mbps), - ) - - -# ----------------- Aggregation helpers for orchestrator ----------------- - - -def record_stage_metrics( - per_request: dict[str, dict[str, Any]], - stage_req_counts: list[int], - stage_total_time_ms: list[float], - stage_total_tokens: list[int], - stage_id: int, - req_id: Any, - metrics: dict[str, Any], -) -> None: - try: - stage_req_counts[stage_id] += 1 - stage_total_tokens[stage_id] += int(metrics.get("num_tokens_out", 0)) - rid_key = str(req_id) - pr = per_request.setdefault(rid_key, {"stages": {}, "transfers_ms": 0.0, "transfers_bytes": 0}) - pr_stages = pr["stages"] # type: ignore[index] - stage_data: dict[str, Any] = { - "stage_gen_time_ms": float(metrics.get("stage_gen_time_ms", 0.0)), - "num_tokens_out": int(metrics.get("num_tokens_out", 0)), - } - # Only record num_tokens_in for stage 0 (initial prompt) - if stage_id == 0: - stage_data["num_tokens_in"] = int(metrics.get("num_tokens_in", 0)) - stage_total_tokens[stage_id] += int(metrics.get("num_tokens_in", 0)) - pr_stages[stage_id] = stage_data - except Exception: - pass - - -def aggregate_rx_and_maybe_total( - transfer_edge_req: dict[tuple[int, int, str], dict[str, float]], - transfer_agg: dict[tuple[int, int], dict[str, float]], - per_request: dict[str, dict[str, Any]], - stage_id: int, - req_id: Any, - rx_bytes: float, - rx_ms: float, - in_flight_ms: float, -) -> tuple[int, float, float] | None: - try: - # Update RX aggregates for (stage_id-1 -> stage_id) - if stage_id > 0: - key = (stage_id - 1, stage_id) - agg = transfer_agg.get(key) - if agg is None: - agg = { - "sum_bytes": 0.0, - "sum_ms": 0.0, - "count": 0.0, - "sum_rx_bytes": 0.0, - "sum_rx_ms": 0.0, - "rx_count": 0.0, - "sum_total_ms": 0.0, - "total_count": 0.0, - } - transfer_agg[key] = agg - agg["sum_rx_bytes"] += float(rx_bytes) - agg["sum_rx_ms"] += float(rx_ms) - agg["rx_count"] += 1.0 - - # Try combine with sender-side timing if present - rid_key = str(req_id) - s = transfer_edge_req.get((stage_id - 1, stage_id, rid_key)) - if s is None: - return None - tx_ms = float(s.get("tx_ms", 0.0)) - size_b = float(s.get("size_bytes", rx_bytes)) - total_ms = tx_ms + float(in_flight_ms) + float(rx_ms) - agg["sum_total_ms"] += total_ms - agg["total_count"] += 1.0 - # accumulate per-request transfer totals - try: - pr = per_request.setdefault(rid_key, {"stages": {}, "transfers_ms": 0.0, "transfers_bytes": 0}) - pr["transfers_ms"] = float(pr.get("transfers_ms", 0.0)) + total_ms # type: ignore[index] - pr["transfers_bytes"] = int(pr.get("transfers_bytes", 0)) + int(rx_bytes) # type: ignore[index] - except Exception: - pass - return int(size_b), float(tx_ms), float(total_ms) - return None - except Exception: - return None - - -def record_sender_transfer_agg( - transfer_agg: dict[tuple[int, int], dict[str, float]], - transfer_edge_req: dict[tuple[int, int, str], dict[str, float]], - from_stage: int, - to_stage: int, - req_id: Any, - size_bytes: int, - tx_ms: float, -) -> None: - try: - key = (from_stage, to_stage) - agg = transfer_agg.get(key) - if agg is None: - agg = { - "sum_bytes": 0.0, - "sum_ms": 0.0, - "count": 0.0, - "sum_rx_bytes": 0.0, - "sum_rx_ms": 0.0, - "rx_count": 0.0, - "sum_total_ms": 0.0, - "total_count": 0.0, - } - transfer_agg[key] = agg - agg["sum_bytes"] += float(size_bytes) - agg["sum_ms"] += float(tx_ms) - agg["count"] += 1.0 - # Store sender-side timing for per-request combination - rid_key = str(req_id) - transfer_edge_req[(from_stage, to_stage, rid_key)] = { - "tx_ms": float(tx_ms), - "size_bytes": float(size_bytes), - } - except Exception: - pass - - -def count_tokens_from_outputs(engine_outputs: list[Any]) -> int: - total = 0 - for _ro in engine_outputs: - try: - outs = getattr(_ro, "outputs", None) - if outs and len(outs) > 0: - tokens = getattr(outs[0], "token_ids", None) - if tokens is not None: - total += len(tokens) - except Exception: - pass - return total - - -def build_stage_summary( - stage_req_counts: list[int], - stage_total_tokens: list[int], - stage_total_time_ms: list[float], -) -> list[dict[str, Any]]: - summary: list[dict[str, Any]] = [] - for sid in range(len(stage_req_counts)): - reqs = stage_req_counts[sid] - tokens = stage_total_tokens[sid] - total_ms = float(stage_total_time_ms[sid]) - avg_req = (total_ms / reqs) if reqs > 0 else 0.0 - avg_tok = (tokens * 1000.0 / total_ms) if total_ms > 0 else 0.0 - summary.append( - { - "stage_id": sid, - "requests": int(reqs), - "tokens": int(tokens), - "total_time_ms": total_ms, - "avg_time_per_request_ms": avg_req, - "avg_tokens_per_s": avg_tok, - } - ) - return summary - - -def build_transfer_summary( - transfer_agg: dict[tuple[int, int], dict[str, float]], -) -> list[dict[str, Any]]: - summary: list[dict[str, Any]] = [] - for (src, dst), agg in transfer_agg.items(): - sum_bytes = float(agg.get("sum_bytes", 0.0)) - sum_ms = float(agg.get("sum_ms", 0.0)) - samples = int(agg.get("count", 0.0)) - tx_mbps = (sum_bytes * 8.0) / (max(sum_ms, 1e-6) * 1000.0) if sum_bytes > 0 else 0.0 - sum_rx_bytes = float(agg.get("sum_rx_bytes", 0.0)) - sum_rx_ms = float(agg.get("sum_rx_ms", 0.0)) - samples_rx = int(agg.get("rx_count", 0.0)) - rx_mbps = (sum_rx_bytes * 8.0) / (max(sum_rx_ms, 1e-6) * 1000.0) if sum_rx_bytes > 0 else 0.0 - sum_total_ms = float(agg.get("sum_total_ms", 0.0)) - samples_total = int(agg.get("total_count", 0.0)) - total_mbps = (sum_bytes * 8.0) / (max(sum_total_ms, 1e-6) * 1000.0) if sum_bytes > 0 else 0.0 - summary.append( - { - "from_stage": src, - "to_stage": dst, - "samples": samples, - "total_bytes": int(sum_bytes), - "total_time_ms": sum_ms, - "tx_mbps": tx_mbps, - "rx_samples": samples_rx, - "rx_total_bytes": int(sum_rx_bytes), - "rx_total_time_ms": sum_rx_ms, - "rx_mbps": rx_mbps, - "total_samples": samples_total, - "total_transfer_time_ms": sum_total_ms, - "total_mbps": total_mbps, - } - ) - return summary - - -@dataclass -class StageStats: - total_token: int - total_gen_time: float - - -@dataclass -class StageRequestMetrics: - num_tokens_in: int - num_tokens_out: int - stage_gen_time_ms: float - batch_id: int - batch_size: int - rx_decode_time_ms: float - rx_transfer_bytes: int - rx_in_flight_time_ms: float - - stage_stats: StageStats - - -class OrchestratorMetrics: - def __init__( - self, - num_stages: int, - enable_stats: bool, - wall_start_ts: float, - ) -> None: - self.num_stages = int(num_stages) - self.enable_stats = bool(enable_stats) - self.stage_total_time_ms: list[float] = [0.0 for _ in range(self.num_stages)] - self.stage_total_tokens: list[int] = [0 for _ in range(self.num_stages)] - self.stage_req_counts: list[int] = [0 for _ in range(self.num_stages)] - self.transfer_agg: dict[tuple[int, int], dict[str, float]] = {} - self.transfer_edge_req: dict[tuple[int, int, str], dict[str, float]] = {} - self.e2e_total_ms: float = 0.0 - self.e2e_total_tokens: int = 0 - self.e2e_count: int = 0 - self.e2e_done: set[str] = set() - self.per_request: dict[str, dict[str, Any]] = {} - self.sum_per_request_transfer_ms: float = 0.0 - self.wall_start_ts: float = float(wall_start_ts) - self.last_finish_ts: float = float(wall_start_ts) - self.stage_seen_batches: dict[int, set] = {sid: set() for sid in range(self.num_stages)} - self.stage_first_ts: list[float | None] = [None for _ in range(self.num_stages)] - self.stage_last_ts: list[float | None] = [None for _ in range(self.num_stages)] - - def on_stage_metrics(self, stage_id: int, req_id: Any, metrics: dict[str, Any]) -> None: - record_stage_metrics( - self.per_request, - self.stage_req_counts, - self.stage_total_time_ms, - self.stage_total_tokens, - stage_id, - req_id, - metrics, - ) - if self.enable_stats: - compute_and_log_stage_request_stats( - stage_id=stage_id, - request_id=req_id, - batch_size=metrics.get("batch_size"), - num_engine_outputs=metrics.get("num_tokens_out"), - stage_gen_time_ms=metrics.get("stage_gen_time_ms"), - rx_decode_time_ms=metrics.get("rx_decode_time_ms"), - rx_transfer_bytes=metrics.get("rx_transfer_bytes"), - ) - if stage_stats := metrics.get("stage_stats", None): - total_token = int(stage_stats.get("total_token")) - total_gen_time = float(stage_stats.get("total_gen_time")) - _avg_tokens_per_s = (total_token * 1000.0 / total_gen_time) if total_gen_time > 0 else 0.0 - logger.info( - pformat( - { - "type": "Stage_running_avg", - "stage_id": stage_id, - "total_tokens": total_token, - "total_gen_time_ms": total_gen_time, - "avg_tokens_per_s": _avg_tokens_per_s, - }, - sort_dicts=False, - ) - ) - try: - batch_id_raw = metrics.get("batch_id", None) - if batch_id_raw is not None: - batch_id = int(batch_id_raw) - if batch_id not in self.stage_seen_batches[stage_id]: - self.stage_total_time_ms[stage_id] += float(metrics.get("stage_gen_time_ms", 0.0)) - self.stage_seen_batches[stage_id].add(batch_id) - except Exception: - pass - rx_b = float(metrics.get("rx_transfer_bytes", 0.0)) - rx_ms = float(metrics.get("rx_decode_time_ms", 0.0)) - in_flight_ms = float(metrics.get("rx_in_flight_time_ms", 0.0)) - combined = aggregate_rx_and_maybe_total( - self.transfer_edge_req, - self.transfer_agg, - self.per_request, - stage_id, - req_id, - rx_b, - rx_ms, - in_flight_ms, - ) - if self.enable_stats and stage_id > 0: - log_transfer_rx( - stage_id - 1, - stage_id, - req_id, - int(rx_b), - float(rx_ms), - float(in_flight_ms), - ) - if combined is not None: - size_b_c, tx_ms_c, total_ms_c = combined - log_transfer_total( - stage_id - 1, - stage_id, - req_id, - int(size_b_c), - float(tx_ms_c), - float(in_flight_ms), - float(rx_ms), - float(total_ms_c), - ) - - def on_forward( - self, - from_stage: int, - to_stage: int, - req_id: Any, - size_bytes: int, - tx_ms: float, - used_shm: bool, - ) -> None: - # Mark first input time for the destination stage if not set - if self.stage_first_ts[to_stage] is None: - self.stage_first_ts[to_stage] = time.time() - if self.enable_stats: - log_transfer_tx( - from_stage, - to_stage, - req_id, - int(size_bytes), - float(tx_ms), - bool(used_shm), - ) - record_sender_transfer_agg( - self.transfer_agg, - self.transfer_edge_req, - from_stage, - to_stage, - req_id, - int(size_bytes), - float(tx_ms), - ) - - def on_finalize_request( - self, - stage_id: int, - req_id: Any, - req_start_ts: float, - ) -> None: - rid_key = str(req_id) - _t0 = float(req_start_ts) - _t1 = time.time() - # Update last output time for this stage - prev_last = self.stage_last_ts[stage_id] - self.stage_last_ts[stage_id] = _t1 if prev_last is None else max(prev_last, _t1) - self.last_finish_ts = max(self.last_finish_ts, _t1) - e2e_ms = (_t1 - _t0) * 1000.0 - - # Sum tokens from all stages for this request - # Include input tokens from stage 0 + output tokens from all stages - pr = self.per_request.setdefault(rid_key, {"stages": {}, "transfers_ms": 0.0, "transfers_bytes": 0}) - total_tokens = 0 - stages_info = pr.get("stages", {}) - for sid, stage_data in stages_info.items(): - # Add input tokens only from stage 0 (initial prompt) - if sid == 0: - total_tokens += int(stage_data.get("num_tokens_in", 0)) - total_tokens += int(stage_data.get("num_tokens_out", 0)) - - self.e2e_total_ms += e2e_ms - self.e2e_total_tokens += total_tokens - self.e2e_count += 1 - self.e2e_done.add(rid_key) - per_req_record = { - "type": "request_level_metrics", - "request_id": rid_key, - "e2e_time_ms": e2e_ms, - "e2e_tpt": (e2e_ms / total_tokens) if total_tokens > 0 else 0.0, - "e2e_total_tokens": total_tokens, - "transfers_total_time_ms": float(pr.get("transfers_ms", 0.0)), - "transfers_total_bytes": int(pr.get("transfers_bytes", 0)), - "stages": stages_info, - } - self.sum_per_request_transfer_ms += float(pr.get("transfers_ms", 0.0)) - logger.info(pformat(per_req_record, sort_dicts=False)) - - def build_and_log_summary(self, final_stage_id_to_prompt: dict[str, int]) -> dict[str, Any]: - # Compute stage summary using wall time between first input and last output per stage - stage_summary: list[dict[str, Any]] = [] - for sid in range(self.num_stages): - first_ts = self.stage_first_ts[sid] - last_ts = self.stage_last_ts[sid] - total_ms = ( - (max(0.0, (last_ts - first_ts)) * 1000.0) if (first_ts is not None and last_ts is not None) else 0.0 - ) - reqs = self.stage_req_counts[sid] - tokens = self.stage_total_tokens[sid] - avg_req = (total_ms / reqs) if reqs > 0 else 0.0 - avg_tok = (tokens * 1000.0 / total_ms) if total_ms > 0 else 0.0 - stage_summary.append( - { - "stage_id": sid, - "requests": int(reqs), - "tokens": int(tokens), - "total_time_ms": float(total_ms), - "avg_time_per_request_ms": float(avg_req), - "avg_tokens_per_s": float(avg_tok), - } - ) - transfer_summary = build_transfer_summary(self.transfer_agg) - e2e_avg_req = (self.e2e_total_ms / self.e2e_count) if self.e2e_count > 0 else 0.0 - e2e_avg_tok = (self.e2e_total_tokens * 1000.0 / self.e2e_total_ms) if self.e2e_total_ms > 0 else 0.0 - wall_time_ms = max(0.0, (self.last_finish_ts - self.wall_start_ts) * 1000.0) - summary: dict[str, Any] = { - "e2e_requests": int(self.e2e_count), - "e2e_total_time_ms": float(wall_time_ms), - "e2e_sum_time_ms": float(self.e2e_total_ms), - "e2e_total_tokens": int(self.e2e_total_tokens), - "e2e_avg_time_per_request_ms": e2e_avg_req, - "e2e_avg_tokens_per_s": e2e_avg_tok, - "wall_time_ms": wall_time_ms, - "final_stage_id": final_stage_id_to_prompt, - "stages": stage_summary, - "transfers": transfer_summary, - } - return summary diff --git a/vllm_omni/entrypoints/omni.py b/vllm_omni/entrypoints/omni.py index 97357dc3b..9e49f951e 100644 --- a/vllm_omni/entrypoints/omni.py +++ b/vllm_omni/entrypoints/omni.py @@ -8,8 +8,6 @@ import uuid import weakref from collections.abc import Callable, Generator, Sequence from concurrent.futures import ThreadPoolExecutor, as_completed -from dataclasses import asdict -from pprint import pformat from typing import Any, Literal, overload from omegaconf import OmegaConf @@ -30,7 +28,6 @@ from vllm_omni.distributed.ray_utils.utils import ( get_ray_queue_class, try_close_ray, ) -from vllm_omni.entrypoints.log_utils import OrchestratorMetrics from vllm_omni.entrypoints.omni_stage import OmniStage from vllm_omni.entrypoints.stage_utils import SHUTDOWN_TASK, OmniStageTaskType from vllm_omni.entrypoints.stage_utils import maybe_load_from_ipc as _load @@ -42,6 +39,7 @@ from vllm_omni.entrypoints.utils import ( resolve_model_config_path, ) from vllm_omni.inputs.data import OmniDiffusionSamplingParams, OmniPromptType, OmniSamplingParams +from vllm_omni.metrics import OrchestratorAggregator, StageRequestStats from vllm_omni.outputs import OmniRequestOutput logger = init_logger(__name__) @@ -240,7 +238,7 @@ class OmniBase: ) # Initialize stats paths - self._enable_stats: bool = bool(log_stats) + self.log_stats: bool = bool(log_stats) self.worker_backend = worker_backend self.ray_address = ray_address @@ -670,10 +668,11 @@ class Omni(OmniBase): final_stage_id_to_prompt[rid] = final_stage_id_for_e2e # Metrics/aggregation helper - metrics = OrchestratorMetrics( + metrics = OrchestratorAggregator( num_stages, - self._enable_stats, + self.log_stats, _wall_start_ts, + final_stage_id_to_prompt, ) it = request_id_to_prompt.items() @@ -740,11 +739,15 @@ class Omni(OmniBase): # Mark last output time for this stage whenever we receive outputs metrics.stage_last_ts[stage_id] = max(metrics.stage_last_ts[stage_id] or 0.0, time.time()) try: - _m = result.get("metrics") + _m: StageRequestStats = result.get("metrics") if _m is not None: - if not isinstance(_m, dict): - _m = asdict(_m) - metrics.on_stage_metrics(stage_id, req_id, _m) + # Accumulate generation time + metrics.accumulated_gen_time_ms[req_id][stage_id] += _m.stage_gen_time_ms + + # For diffusion stages, we also accumulate diffusion time + metrics.accumulate_diffusion_metrics(stage.stage_type, req_id, engine_outputs) + + metrics.on_stage_metrics(stage_id, req_id, _m, stage.final_output_type) if pbar: elapsed = pbar.format_dict["elapsed"] or 1e-6 # Aggregate total tokens/images across all stages @@ -781,8 +784,7 @@ class Omni(OmniBase): # End-to-end timing and time-per-token for final output # (only once per request at the designated final stage) try: - rid_key = str(req_id) - if stage_id == final_stage_id_to_prompt[req_id] and rid_key not in metrics.e2e_done: + if stage_id == final_stage_id_to_prompt[req_id]: metrics.on_finalize_request( stage_id, req_id, @@ -792,17 +794,42 @@ class Omni(OmniBase): logger.exception( f"[{self._name}] Finalize request handling error for req {req_id} at stage {stage_id}: {e}", ) - yield OmniRequestOutput( + output_to_yield = OmniRequestOutput( stage_id=stage_id, final_output_type=stage.final_output_type, # type: ignore[attr-defined] request_output=engine_outputs, ) + # Record audio generated frames with unified signature + try: + finished = ( + engine_outputs.finished + if hasattr(engine_outputs, "finished") + else ( + engine_outputs[0].finished + if isinstance(engine_outputs, list) + and engine_outputs + and hasattr(engine_outputs[0], "finished") + else False + ) + ) + metrics.record_audio_generated_frames(output_to_yield, finished, stage_id, req_id) + except Exception as e: + logger.exception( + f"[{self._name}] Failed to record audio metrics for req {req_id} at stage {stage_id}: {e}", + ) + + yield output_to_yield + next_stage_id = stage_id + 1 if next_stage_id <= final_stage_id_to_prompt[req_id]: next_stage: OmniStage = self.stage_list[next_stage_id] try: - next_inputs = next_stage.process_engine_inputs(self.stage_list, [request_id_to_prompt[req_id]]) + # Derive inputs for the next stage, record preprocess time + with metrics.stage_postprocess_timer(stage_id, req_id): + next_inputs = next_stage.process_engine_inputs( + self.stage_list, [request_id_to_prompt[req_id]] + ) except Exception as e: logger.exception( f"[{self._name}] Process engine inputs error for req {req_id}" @@ -856,8 +883,7 @@ class Omni(OmniBase): # Summarize and print stats try: - summary = metrics.build_and_log_summary(final_stage_id_to_prompt) - logger.info("[Summary] %s", pformat(summary, sort_dicts=False)) + metrics.build_and_log_summary() except Exception as e: logger.exception(f"[{self._name}] Failed to build/log summary: {e}") diff --git a/vllm_omni/entrypoints/omni_llm.py b/vllm_omni/entrypoints/omni_llm.py index 0356ea231..118a0ba7f 100644 --- a/vllm_omni/entrypoints/omni_llm.py +++ b/vllm_omni/entrypoints/omni_llm.py @@ -81,7 +81,7 @@ class OmniLLM(LLM): self.worker_backend = kwargs.get("worker_backend", "multi_process") self.ray_address = kwargs.get("ray_address", None) self.batch_timeout = batch_timeout - self._enable_stats: bool = bool(log_stats) + self.log_stats: bool = bool(log_stats) # Load stage configurations if stage_configs_path is None: diff --git a/vllm_omni/entrypoints/omni_stage.py b/vllm_omni/entrypoints/omni_stage.py index 4935c43cc..ca5b2f43e 100644 --- a/vllm_omni/entrypoints/omni_stage.py +++ b/vllm_omni/entrypoints/omni_stage.py @@ -39,7 +39,6 @@ from vllm_omni.distributed.ray_utils.utils import kill_ray_actor, start_ray_acto from vllm_omni.engine.arg_utils import AsyncOmniEngineArgs from vllm_omni.entrypoints.async_omni_diffusion import AsyncOmniDiffusion from vllm_omni.entrypoints.async_omni_llm import AsyncOmniLLM -from vllm_omni.entrypoints.log_utils import count_tokens_from_outputs from vllm_omni.entrypoints.omni_diffusion import OmniDiffusion from vllm_omni.entrypoints.omni_llm import OmniLLM from vllm_omni.entrypoints.stage_utils import ( @@ -51,6 +50,7 @@ from vllm_omni.entrypoints.stage_utils import ( set_stage_devices, ) from vllm_omni.inputs.data import OmniDiffusionSamplingParams, OmniPromptType, OmniSamplingParams, OmniTokensPrompt +from vllm_omni.metrics import count_tokens_from_outputs from vllm_omni.outputs import OmniRequestOutput logger = init_logger(__name__) @@ -844,7 +844,7 @@ def _stage_worker( try: sent_ts = float(t.get("sent_ts", None)) if isinstance(t, dict) else None if sent_ts is not None: - _in_flight_ms_by_rid[rid] = (_recv_dequeue_ts - sent_ts) * 1000.0 + _in_flight_ms_by_rid[rid] = max(0.0, (_recv_dequeue_ts - sent_ts) * 1000.0) else: _in_flight_ms_by_rid[rid] = 0.0 except Exception: @@ -1205,7 +1205,7 @@ async def _stage_worker_async( try: sent_ts = float(task.get("sent_ts", None)) if isinstance(task, dict) else None if sent_ts is not None: - _in_flight_ms_by_rid[rid] = (_recv_dequeue_ts - sent_ts) * 1000.0 + _in_flight_ms_by_rid[rid] = max(0.0, (_recv_dequeue_ts - sent_ts) * 1000.0) else: _in_flight_ms_by_rid[rid] = 0.0 except Exception: @@ -1384,13 +1384,11 @@ def make_request_stats( rx_transfer_bytes: int, rx_in_flight_time_ms: float, ): - from vllm_omni.entrypoints.log_utils import ( - StageRequestMetrics, - ) + from vllm_omni.metrics import StageRequestStats num_tokens_in = count_prompt_tokens_from_outputs(req_output) num_tokens_out = count_tokens_from_outputs(req_output) - return StageRequestMetrics( + return StageRequestStats( num_tokens_in=num_tokens_in, num_tokens_out=num_tokens_out, stage_gen_time_ms=stage_gen_time_ms, @@ -1404,9 +1402,9 @@ def make_request_stats( def make_stage_stats(_agg_total_tokens: int, _agg_total_gen_time_ms: float): - from vllm_omni.entrypoints.log_utils import StageStats + from vllm_omni.metrics import StageStats - return StageStats(total_token=_agg_total_tokens, total_gen_time=_agg_total_gen_time_ms) + return StageStats(total_token=_agg_total_tokens, total_gen_time_ms=_agg_total_gen_time_ms) def output_strip(r_output: RequestOutput | OmniRequestOutput, omni_stage: OmniStage): diff --git a/vllm_omni/metrics/__init__.py b/vllm_omni/metrics/__init__.py new file mode 100644 index 000000000..deceb2333 --- /dev/null +++ b/vllm_omni/metrics/__init__.py @@ -0,0 +1,9 @@ +from .stats import OrchestratorAggregator, StageRequestStats, StageStats +from .utils import count_tokens_from_outputs + +__all__ = [ + "OrchestratorAggregator", + "StageStats", + "StageRequestStats", + "count_tokens_from_outputs", +] diff --git a/vllm_omni/metrics/stats.py b/vllm_omni/metrics/stats.py new file mode 100644 index 000000000..037db2ea8 --- /dev/null +++ b/vllm_omni/metrics/stats.py @@ -0,0 +1,561 @@ +from __future__ import annotations + +import time +from collections import defaultdict +from collections.abc import Callable +from contextlib import contextmanager +from dataclasses import dataclass +from typing import Any + +from vllm.logger import init_logger + +from vllm_omni.metrics.utils import _build_field_defs, _build_row, _format_table + +logger = init_logger(__name__) + + +@dataclass +class StageStats: + total_token: int = 0 + total_gen_time_ms: float = 0.0 + + @property + def avg_tokens_per_s(self) -> float: + return (self.total_token * 1000.0 / self.total_gen_time_ms) if self.total_gen_time_ms > 0 else 0.0 + + +@dataclass +class StageRequestStats: + batch_id: int + batch_size: int + num_tokens_in: int + num_tokens_out: int + stage_gen_time_ms: float + rx_transfer_bytes: int + rx_decode_time_ms: float + rx_in_flight_time_ms: float + stage_stats: StageStats + stage_id: int | None = None + final_output_type: str | None = None + request_id: str | None = None + postprocess_time_ms: float = 0.0 + diffusion_metrics: dict[str, int] = None + audio_generated_frames: int = 0 + + @property + def rx_mbps(self) -> float: + return ( + (float(self.rx_transfer_bytes) * 8.0) / (max(float(self.rx_decode_time_ms), 1e-6) * 1000.0) + if self.rx_transfer_bytes > 0 + else 0.0 + ) + + @property + def tokens_per_s(self) -> float: + return (self.num_tokens_out * 1000.0 / self.stage_gen_time_ms) if (self.stage_gen_time_ms > 0) else 0.0 + + +@dataclass +class TransferEdgeStats: + from_stage: int + to_stage: int + request_id: str + size_bytes: int + tx_time_ms: float + used_shm: bool = False + rx_decode_time_ms: float = 0.0 + in_flight_time_ms: float = 0.0 + + @property + def total_time_ms(self) -> float: + return float(self.tx_time_ms) + float(self.rx_decode_time_ms) + float(self.in_flight_time_ms) + + +@dataclass +class RequestE2EStats: + request_id: str + e2e_total_ms: float + e2e_total_tokens: int + transfers_total_time_ms: float + transfers_total_bytes: int + + @property + def e2e_tpt(self) -> float: + return (self.e2e_total_ms / self.e2e_total_tokens) if self.e2e_total_tokens > 0 else 0.0 + + +# === Field Configuration === +# Fields requiring unit conversion: original_field_name -> (display_name, transform_fn) +FIELD_TRANSFORMS: dict[str, tuple[str, Callable[[Any], Any]]] = { + "rx_transfer_bytes": ("rx_transfer_kbytes", lambda v: v / 1024.0), + "size_bytes": ("size_kbytes", lambda v: v / 1024.0), + "transfers_total_bytes": ("transfers_total_kbytes", lambda v: v / 1024.0), +} + +# Fields to exclude from table display for each event type +STAGE_EXCLUDE = { + "stage_stats", + "stage_id", + "request_id", + "rx_transfer_bytes", + "rx_decode_time_ms", + "rx_in_flight_time_ms", + "final_output_type", +} +TRANSFER_EXCLUDE = {"from_stage", "to_stage", "request_id", "used_shm"} +E2E_EXCLUDE = {"request_id"} + +# Decide the order of overall summary fields, or None for auto +OVERALL_FIELDS: list[str] | None = None +STAGE_FIELDS = _build_field_defs(StageRequestStats, STAGE_EXCLUDE, FIELD_TRANSFORMS) +TRANSFER_FIELDS = _build_field_defs(TransferEdgeStats, TRANSFER_EXCLUDE, FIELD_TRANSFORMS) +E2E_FIELDS = _build_field_defs(RequestE2EStats, E2E_EXCLUDE, FIELD_TRANSFORMS) + + +class OrchestratorAggregator: + def __init__( + self, + num_stages: int, + log_stats: bool, + wall_start_ts: float, + final_stage_id_for_e2e: dict[str, int] | int, + ) -> None: + self.num_stages = int(num_stages) + self.log_stats = bool(log_stats) + self.final_stage_id_for_e2e = final_stage_id_for_e2e + self.init_run_state(wall_start_ts) + self.stage_events: dict[str, list[StageRequestStats]] = {} + self.transfer_events: dict[ + tuple[int, int, str], TransferEdgeStats + ] = {} # Key: (from_stage, to_stage, request_id) + self.e2e_events: list[RequestE2EStats] = [] + + def init_run_state(self, wall_start_ts: float) -> None: + # Per-run aggregates and timing state + self.stage_total_tokens = [0 for _ in range(self.num_stages)] + self.e2e_total_ms = 0.0 + self.e2e_total_tokens = 0 + self.e2e_count = 0 + self.e2e_done = set() + self.wall_start_ts = float(wall_start_ts) + self.last_finish_ts = float(wall_start_ts) + self.stage_first_ts = [None for _ in range(self.num_stages)] + self.stage_last_ts = [None for _ in range(self.num_stages)] + self.accumulated_gen_time_ms: defaultdict[str, defaultdict[int, float]] = defaultdict( + lambda: defaultdict(float) + ) # {request_id: {stage_id:accumulated_gen_time_ms}} + self.diffusion_metrics: defaultdict[str, defaultdict[str, float]] = defaultdict( + lambda: defaultdict(float) + ) # {request_id: {diffusion_metrics_key: accumulated_metrics_data}} + + def _get_or_create_transfer_event( + self, + from_stage: int, + to_stage: int, + request_id: str, + ) -> TransferEdgeStats: + key = (from_stage, to_stage, request_id) + evt = self.transfer_events.get(key) + if evt is None: + evt = TransferEdgeStats( + from_stage=from_stage, + to_stage=to_stage, + request_id=request_id, + size_bytes=0, + tx_time_ms=0.0, + used_shm=False, + rx_decode_time_ms=0.0, + in_flight_time_ms=0.0, + ) + self.transfer_events[key] = evt + return evt + + def record_transfer_tx( + self, + from_stage: int, + to_stage: int, + request_id: Any, + size_bytes: int, + tx_time_ms: float, + used_shm: bool, + ) -> TransferEdgeStats | None: + try: + evt = self._get_or_create_transfer_event( + int(from_stage), + int(to_stage), + str(request_id), + ) + # Accumulate tx metrics + evt.size_bytes += int(size_bytes) + evt.tx_time_ms += float(tx_time_ms) + evt.used_shm = evt.used_shm or bool(used_shm) + return evt + except Exception: + return None + + def record_transfer_rx( + self, + stats: StageRequestStats, + ) -> TransferEdgeStats | None: + try: + if stats.stage_id is None or stats.stage_id <= 0: + return None + from_stage = int(stats.stage_id) - 1 + to_stage = int(stats.stage_id) + rid_key = str(stats.request_id) + evt = self._get_or_create_transfer_event(from_stage, to_stage, rid_key) + # Accumulate rx metrics + if evt.size_bytes == 0: + # size_bytes has been recorded in tx phase + evt.size_bytes = int(stats.rx_transfer_bytes) + evt.rx_decode_time_ms += float(stats.rx_decode_time_ms) + evt.in_flight_time_ms += float(stats.rx_in_flight_time_ms) + return evt + except Exception: + return None + + def record_audio_generated_frames( + self, + output_to_yield: Any, + finished: bool, + stage_id: int, + request_id: str, + ) -> None: + if ( + output_to_yield.final_output_type == "audio" + and finished + and (multimodal_output := output_to_yield.multimodal_output.get("audio")) is not None + ): + nframes = int(multimodal_output[-1].shape[0]) + stage_events_for_req = self.stage_events.get(request_id, []) + if stage_events_for_req: + for stage_event in stage_events_for_req: + if stage_event.stage_id == stage_id: + stage_event.audio_generated_frames += nframes + break + else: + logger.warning( + "Failed to record audio generated frames for request %s at stage %s: no stage event found", + request_id, + stage_id, + ) + + def _as_stage_request_stats( + self, + stage_id: int, + req_id: str, + metrics: StageRequestStats, + final_output_type: str | None = None, + ) -> StageRequestStats: + "Convert dict to StageRequestStats if needed." + stats = metrics + stats.stage_id = stage_id + stats.request_id = req_id + stats.final_output_type = final_output_type + stats.diffusion_metrics = ( + {k: int(v) for k, v in self.diffusion_metrics.pop(req_id, {}).items()} + if req_id in self.diffusion_metrics + else None + ) + return stats + + def on_stage_metrics( + self, + stage_id: int, + req_id: Any, + metrics: StageRequestStats, + final_output_type: str | None = None, + ) -> None: + stats = self._as_stage_request_stats(stage_id, req_id, metrics, final_output_type) + self.stage_total_tokens[stats.stage_id] += int(stats.num_tokens_out) + if stats.stage_id == 0: + self.stage_total_tokens[stats.stage_id] += int(stats.num_tokens_in) + self.stage_events.setdefault(str(stats.request_id), []).append(stats) + + self.record_transfer_rx(stats) + + def record_stage_postprocess_time(self, stage_id: int, req_id: Any, postproc_time_ms: float) -> None: + if req_id in self.stage_events: + for stats in self.stage_events[req_id]: + if stats.stage_id == stage_id: + stats.postprocess_time_ms = float(postproc_time_ms) + break + else: + logger.warning( + "Failed to record postprocess time for request %s at stage %s: no stage event found", + req_id, + stage_id, + ) + + @contextmanager + def stage_postprocess_timer(self, stage_id: int, req_id: Any): + """Context manager for measuring and recording stage postprocessing time. + + Usage: + with metrics.stage_postprocess_timer(stage_id, request_id): + next_inputs = next_stage.process_engine_inputs(...) + """ + _t0 = time.perf_counter() + try: + yield + finally: + _postproc_ms = (time.perf_counter() - _t0) * 1000.0 + self.record_stage_postprocess_time(stage_id, req_id, _postproc_ms) + + def accumulate_diffusion_metrics(self, stage_type: str, req_id: Any, engine_outputs: Any) -> None: + """Accumulate diffusion metrics for a request. + + Handles extraction and accumulation of diffusion stage metrics. + + Args: + req_id: Request ID + engine_outputs: Engine output object containing metrics + """ + if stage_type != "diffusion": + return + engine_output = engine_outputs[0] if isinstance(engine_outputs, list) and engine_outputs else engine_outputs + diffusion_metrics: dict = getattr(engine_output, "metrics", {}) + if isinstance(diffusion_metrics, list): + diffusion_metrics = diffusion_metrics[0] + if diffusion_metrics: + for key, value in diffusion_metrics.items(): + self.diffusion_metrics[req_id][key] += value + + def on_forward( + self, + from_stage: int, + to_stage: int, + req_id: Any, + size_bytes: int, + tx_ms: float, + used_shm: bool, + ) -> None: + # Mark first input time for the destination stage if not set + if self.stage_first_ts[to_stage] is None: + self.stage_first_ts[to_stage] = time.time() + self.record_transfer_tx( + from_stage=from_stage, + to_stage=to_stage, + request_id=req_id, + size_bytes=size_bytes, + tx_time_ms=tx_ms, + used_shm=used_shm, + ) + + def on_finalize_request( + self, + stage_id: int, + req_id: Any, + req_start_ts: float, + ) -> None: + rid_key = str(req_id) + if rid_key in self.e2e_done: + return # Already finalized + _t0 = float(req_start_ts) + _t1 = time.time() + # Update last output time for this stage + prev_last = self.stage_last_ts[stage_id] + self.stage_last_ts[stage_id] = _t1 if prev_last is None else max(prev_last, _t1) + self.last_finish_ts = max(self.last_finish_ts, _t1) + e2e_ms = (_t1 - _t0) * 1000.0 + + # Sum tokens from all stages for this request + # Include input tokens from stage 0 + output tokens from all stages + total_tokens = 0 + if rid_key in self.stage_events: + for evt in self.stage_events[rid_key]: + if evt.stage_id == 0: + total_tokens += int(evt.num_tokens_in) + total_tokens += int(evt.num_tokens_out) + + self.e2e_total_ms += e2e_ms + self.e2e_total_tokens += total_tokens + self.e2e_count += 1 + self.e2e_done.add(rid_key) + per_req_record = RequestE2EStats( + request_id=rid_key, + e2e_total_ms=e2e_ms, + e2e_total_tokens=total_tokens, + transfers_total_time_ms=float( + sum(evt.total_time_ms for evt in self.transfer_events.values() if evt.request_id == rid_key) + ), + transfers_total_bytes=int( + sum(evt.size_bytes for evt in self.transfer_events.values() if evt.request_id == rid_key) + ), + ) + self.e2e_events.append(per_req_record) + + def build_and_log_summary(self) -> dict[str, Any]: + if not self.log_stats: + return {} + wall_time_ms = max(0.0, (self.last_finish_ts - self.wall_start_ts) * 1000.0) + e2e_avg_req = (wall_time_ms / self.e2e_count) if self.e2e_count > 0 else 0.0 + e2e_avg_tok = (self.e2e_total_tokens * 1000.0 / wall_time_ms) if wall_time_ms > 0 else 0.0 + + if isinstance(self.final_stage_id_for_e2e, int): + final_stage_id_map: dict[str, int] = {"*": int(self.final_stage_id_for_e2e)} + else: + final_stage_id_map = self.final_stage_id_for_e2e + + stage_wall_time_ms = [ + ((self.stage_last_ts[i] - self.stage_first_ts[i]) * 1000.0) + if (self.stage_first_ts[i] is not None and self.stage_last_ts[i] is not None) + else 0.0 + for i in range(self.num_stages) + ] + + overall_summary = { + "e2e_requests": int(self.e2e_count), + "e2e_wall_time_ms": float(wall_time_ms), + "e2e_total_tokens": int(self.e2e_total_tokens), + "e2e_avg_time_per_request_ms": float(e2e_avg_req), + "e2e_avg_tokens_per_s": float(e2e_avg_tok), + } + # Add stage_wall_time_ms as separate fields for each stage + for idx, wall_time in enumerate(stage_wall_time_ms): + overall_summary[f"e2e_stage_{idx}_wall_time_ms"] = wall_time + + # Print overall summary + # filter out all-zero fields for logging + overall_fields = [] + for k in OVERALL_FIELDS or list(overall_summary.keys()): + v = overall_summary.get(k, None) + if v not in (0, 0.0, 0.000, None, ""): + overall_fields.append(k) + if overall_fields: + logger.info( + "\n%s", + _format_table("Overall Summary", overall_summary, overall_fields), + ) + + all_request_ids = sorted(set(self.stage_events.keys()) | {e.request_id for e in self.e2e_events}) + + result_stage_table = [] + result_trans_table = [] + result_e2e_table = [] + + for rid in all_request_ids: + # === E2E table (single column) === + e2e_evt = next((e for e in self.e2e_events if e.request_id == rid), None) + if e2e_evt: + e2e_data = _build_row(e2e_evt, E2E_FIELDS) + result_e2e_table.append({"request_id": rid, **e2e_data}) + + # filter out all-zero fields for logging + nonzero_e2e_fields = set() + for k, v in e2e_data.items(): + if v not in (0, 0.000, None, ""): + nonzero_e2e_fields.add(k) + value_fields_e2e = sorted(nonzero_e2e_fields) + + if value_fields_e2e: + logger.info( + "\n%s", + _format_table( + f"RequestE2EStats [request_id={rid}]", + e2e_data, + value_fields=value_fields_e2e, + ), + ) + + # === Stage table (columns = stage_id) === + stage_evts = sorted( + self.stage_events.get(rid, []), + key=lambda e: e.stage_id if e.stage_id is not None else -1, + ) + # if any stage has diffusion_metrics, remove postprocess_time_ms field + # because it is already included in diffusion_metrics + local_exclude = STAGE_EXCLUDE.copy() + has_diffusion_metrics = any(getattr(evt, "diffusion_metrics", None) for evt in stage_evts) + if has_diffusion_metrics: + local_exclude.add("postprocess_time_ms") + local_stage_fields = _build_field_defs(StageRequestStats, local_exclude, FIELD_TRANSFORMS) + + # if diffusion_metrics is present, expand it into multiple columns + # then remove diffusion_metrics from the table + stage_rows = [] + for evt in stage_evts: + row = {"stage_id": evt.stage_id, **_build_row(evt, local_stage_fields)} + if evt.diffusion_metrics: + row.update(evt.diffusion_metrics) + row.pop("diffusion_metrics", None) # Remove the dict itself + stage_rows.append(row) + + result_stage_table.append({"request_id": rid, "stages": stage_rows}) + + if stage_rows: + # filter out all-zero fields for logging + all_value_fields = set() + for row in stage_rows: + for k in row.keys(): + if k != "stage_id": + all_value_fields.add(k) + value_fields_list = [] + for field in sorted(all_value_fields): + all_zero = True + for row in stage_rows: + v = row.get(field, None) + if v not in (0, 0.0, 0.000, None, ""): + all_zero = False + break + if not all_zero: + value_fields_list.append(field) + + if value_fields_list: + logger.info( + "\n%s", + _format_table( + f"StageRequestStats [request_id={rid}]", + stage_rows, + column_key="stage_id", + value_fields=value_fields_list, + ), + ) + + # === Transfer table (columns = edge) === + transfer_evts = sorted( + [e for e in self.transfer_events.values() if e.request_id == rid], + key=lambda e: (e.from_stage, e.to_stage), + ) + transfer_rows = [ + {"edge": f"{evt.from_stage}->{evt.to_stage}", **_build_row(evt, TRANSFER_FIELDS)} + for evt in transfer_evts + ] + result_trans_table.append({"request_id": rid, "transfers": transfer_rows}) + + if transfer_rows: + # filter out all-zero fields for logging + all_value_fields = set() + for row in transfer_rows: + for k in row.keys(): + if k != "edge": + all_value_fields.add(k) + value_fields_list = [] + for field in sorted(all_value_fields): + all_zero = True + for row in transfer_rows: + v = row.get(field, None) + if v not in (0, 0.0, 0.000, None, ""): + all_zero = False + break + if not all_zero: + value_fields_list.append(field) + + if value_fields_list: + logger.info( + "\n%s", + _format_table( + f"TransferEdgeStats [request_id={rid}]", + transfer_rows, + column_key="edge", + value_fields=value_fields_list, + ), + ) + + return { + "final_stage_id": final_stage_id_map, + "overall_summary": overall_summary, + "stage_table": result_stage_table, + "trans_table": result_trans_table, + "e2e_table": result_e2e_table, + } diff --git a/vllm_omni/metrics/utils.py b/vllm_omni/metrics/utils.py new file mode 100644 index 000000000..ea83d959e --- /dev/null +++ b/vllm_omni/metrics/utils.py @@ -0,0 +1,143 @@ +from collections.abc import Callable +from dataclasses import fields +from typing import Any + +from prettytable import PrettyTable + + +def _build_field_defs( + cls: type, + exclude: set[str], + transforms: dict[str, tuple[str, Callable]] | None = None, +) -> list[tuple[str, Callable[[Any], Any]]]: + """Auto-generate field definitions from a dataclass. + + Args: + cls: The dataclass type to extract fields from. + exclude: Set of field names to exclude from output. + transforms: Optional mapping of field transformations. + Format: {original_name: (display_name, transform_fn)} + + Returns: + List of (display_name, getter_fn) tuples for table generation. + """ + transforms = transforms or {} + result = [] + for f in fields(cls): + if f.name in exclude: + continue + if f.name in transforms: + display_name, transform_fn = transforms[f.name] + # Capture variables in closure to avoid late binding issues + result.append((display_name, lambda e, fn=transform_fn, n=f.name: fn(getattr(e, n)))) + else: + result.append((f.name, lambda e, n=f.name: getattr(e, n))) + return result + + +def _build_row(evt: Any, field_defs: list[tuple[str, Callable]]) -> dict[str, Any]: + """Build a row dict from an event object using field definitions. + + Args: + evt: The event object (dataclass instance). + field_defs: List of (field_name, getter_fn) tuples. + + Returns: + Dict mapping field names to their values. + """ + return {name: getter(evt) for name, getter in field_defs} + + +def _get_field_names(field_defs: list[tuple[str, Callable]]) -> list[str]: + """Extract field names from field definitions. + + Args: + field_defs: List of (field_name, getter_fn) tuples. + + Returns: + List of field names. + """ + return [name for name, _ in field_defs] + + +def _format_table( + title: str, + data: dict[str, Any] | list[dict[str, Any]], + value_fields: list[str], + column_key: str | None = None, + column_prefix: str = "", +) -> str: + """Format a table for display. + + Supports two modes: + 1. Single-column mode: data is a dict, displays as Field | Value + 2. Multi-column mode: data is a list of dicts, displays as Field | col1 | col2 | ... + + Args: + title: Table title. + data: Either a single dict (single-column) or list of dicts (multi-column). + value_fields: List of field names to display as rows. + column_key: Key in each dict used as column header (required for multi-column mode). + column_prefix: Optional prefix for column headers (multi-column mode only). + + Returns: + Formatted table string. + """ + if not data: + return f"[{title}] " + + def _format_value(value: Any) -> str: + if isinstance(value, bool): + return str(value) + if isinstance(value, int): + return f"{value:,}" + if isinstance(value, float): + return f"{value:,.3f}" + if isinstance(value, list): + return ", ".join(str(f"{v:,.3f}") for v in value) + return str(value) + + table = PrettyTable() + + # Single-column mode: data is a dict + if isinstance(data, dict): + table.field_names = ["Field", "Value"] + table.align["Field"] = "l" + table.align["Value"] = "r" + for field in value_fields: + if field in data: + if isinstance(data[field], dict): + for sub_key, sub_value in data[field].items(): + table.add_row([f"{sub_key}", _format_value(sub_value)]) + else: + table.add_row([field, _format_value(data[field])]) + + # Multi-column mode: data is a list of dicts + else: + if column_key is None: + raise ValueError("column_key is required for multi-column mode") + col_headers = [f"{column_prefix}{row.get(column_key, '?')}" for row in data] + table.field_names = ["Field"] + col_headers + table.align["Field"] = "l" + for col in col_headers: + table.align[col] = "r" + for field in value_fields: + row_values = [_format_value(r.get(field, "")) for r in data] + table.add_row([field] + row_values) + + return "\n".join([f"[{title}]", table.get_string()]) + + +def count_tokens_from_outputs(engine_outputs: list[Any]) -> int: + total = 0 + for _ro in engine_outputs: + try: + outs = getattr(_ro, "outputs", None) + if outs and len(outs) > 0: + tokens = getattr(outs[0], "token_ids", None) + if tokens is not None: + total += len(tokens) + except Exception: + # Ignore any issues with individual outputs to keep token counting best-effort. + pass + return total From b81e0a8abf8ce11958329d0df58989b84dba877d Mon Sep 17 00:00:00 2001 From: wangyu <53896905+yenuo26@users.noreply.github.com> Date: Mon, 9 Feb 2026 20:08:46 +0800 Subject: [PATCH 08/10] [Test] Add example test cases for omni online (#1086) Signed-off-by: wangyu31577 Signed-off-by: Hongsheng Liu Signed-off-by: yenuo26 <410167048@qq.com> Co-authored-by: wangyu31577 Co-authored-by: Hongsheng Liu Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .buildkite/test-nightly.yaml | 24 +- tests/conftest.py | 33 ++- tests/e2e/stage_configs/qwen2_5_omni_ci.yaml | 106 +++++++ .../online_serving/test_qwen2_5_omni.py | 271 ++++++++++++++++++ .../online_serving/test_qwen3_omni.py | 230 +++++++++++++++ 5 files changed, 648 insertions(+), 16 deletions(-) create mode 100644 tests/e2e/stage_configs/qwen2_5_omni_ci.yaml create mode 100644 tests/examples/online_serving/test_qwen2_5_omni.py create mode 100644 tests/examples/online_serving/test_qwen3_omni.py diff --git a/.buildkite/test-nightly.yaml b/.buildkite/test-nightly.yaml index b234bdf8e..d985c36f6 100644 --- a/.buildkite/test-nightly.yaml +++ b/.buildkite/test-nightly.yaml @@ -10,12 +10,13 @@ steps: queue: "cpu_queue_premerge" - label: "Omni Model Test with H100" - timeout_in_minutes: 180 + timeout_in_minutes: 60 depends_on: image-build if: build.env("NIGHTLY") == "1" commands: - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/online_serving/test_qwen3_omni_expansion.py + - pytest -s -v tests/examples/online_serving/test_qwen3_omni.py agents: queue: "mithril-h100-pool" plugins: @@ -44,3 +45,24 @@ steps: hostPath: path: /mnt/hf-cache type: DirectoryOrCreate + + + + - label: "Omni Model Test" + timeout_in_minutes: 60 + depends_on: image-build + commands: + - export VLLM_LOGGING_LEVEL=DEBUG + - export VLLM_WORKER_MULTIPROC_METHOD=spawn + - pytest -s -v tests/examples/online_serving/test_qwen2_5_omni.py + agents: + queue: "gpu_4_queue" # g6.12xlarge instance on AWS, has 4 L4 GPU + plugins: + - docker#v5.2.0: + image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT + always-pull: true + propagate-environment: true + environment: + - "HF_HOME=/fsx/hf_cache" + volumes: + - "/fsx/hf_cache:/fsx/hf_cache" diff --git a/tests/conftest.py b/tests/conftest.py index 84fbb91b7..98a21d43c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -588,8 +588,6 @@ def convert_audio_to_text(audio_data): """ Convert base64 encoded audio data to text using speech recognition. """ - import whisper - audio_data = base64.b64decode(audio_data) output_path = f"./test_{int(time.time())}" with open(output_path, "wb") as audio_file: @@ -597,6 +595,13 @@ def convert_audio_to_text(audio_data): print(f"audio data is saved: {output_path}") + text = convert_audio_file_to_text(output_path=output_path) + return text + + +def convert_audio_file_to_text(output_path): + import whisper + model = whisper.load_model("base") text = model.transcribe( output_path, @@ -604,6 +609,10 @@ def convert_audio_to_text(audio_data): word_timestamps=True, condition_on_previous_text=False, )["text"] + del model + if torch.cuda.is_available(): + gc.collect() + torch.cuda.empty_cache() if text: return text else: @@ -614,7 +623,6 @@ def merge_base64_and_convert_to_text(base64_list): """ Merge a list of base64 encoded audio data and convert to text. """ - import whisper from pydub import AudioSegment merged_audio = None @@ -627,17 +635,8 @@ def merge_base64_and_convert_to_text(base64_list): merged_audio += seg output_path = f"./test_{int(time.time())}" merged_audio.export(output_path, format="wav") - model = whisper.load_model("base") - text = model.transcribe( - output_path, - temperature=0.0, - word_timestamps=True, - condition_on_previous_text=False, - )["text"] - if text: - return text - else: - return "" + text = convert_audio_file_to_text(output_path) + return text def modify_stage_config( @@ -886,6 +885,7 @@ class OmniServer: model: str, serve_args: list[str], *, + port: int | None = None, env_dict: dict[str, str] | None = None, ) -> None: _run_pre_test_cleanup(enable_force=True) @@ -896,7 +896,10 @@ class OmniServer: self.env_dict = env_dict self.proc: subprocess.Popen | None = None self.host = "127.0.0.1" - self.port = get_open_port() + if port is None: + self.port = get_open_port() + else: + self.port = port def _start_server(self) -> None: """Start the vLLM-Omni server subprocess.""" diff --git a/tests/e2e/stage_configs/qwen2_5_omni_ci.yaml b/tests/e2e/stage_configs/qwen2_5_omni_ci.yaml new file mode 100644 index 000000000..aaed4de92 --- /dev/null +++ b/tests/e2e/stage_configs/qwen2_5_omni_ci.yaml @@ -0,0 +1,106 @@ +# stage config for running qwen2.5-omni with architecture of OmniLLM. + +# The following config has been verified on 2x 24GB GPU (L4/RTX3090/RTX4090). +# This config is optimized for CI e2e tests. +stage_args: + - stage_id: 0 + runtime: + process: true # Run this stage in a separate process + devices: "0" # Visible devices for this stage (CUDA_VISIBLE_DEVICES/torch.cuda.set_device) + max_batch_size: 1 + engine_args: + model_stage: thinker + model_arch: Qwen2_5OmniForConditionalGeneration + worker_cls: vllm_omni.worker.gpu_ar_worker.GPUARWorker + scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler + max_model_len: 32768 + max_num_batched_tokens: 32768 + max_num_seqs: 1 + gpu_memory_utilization: 0.8 + skip_mm_profiling: true + enforce_eager: true # Now we only support eager mode + trust_remote_code: true + engine_output_type: latent + enable_prefix_caching: false + is_comprehension: true + final_output: true + final_output_type: text + default_sampling_params: + temperature: 0.0 + top_p: 1.0 + top_k: -1 + max_tokens: 128 + seed: 42 + detokenize: True + repetition_penalty: 1.1 + - stage_id: 1 + runtime: + process: true + devices: "1" + max_batch_size: 1 + engine_args: + model_stage: talker + model_arch: Qwen2_5OmniForConditionalGeneration + worker_cls: vllm_omni.worker.gpu_ar_worker.GPUARWorker + scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler + max_model_len: 32768 + max_num_batched_tokens: 32768 + max_num_seqs: 1 + gpu_memory_utilization: 0.8 + skip_mm_profiling: true + enforce_eager: true + trust_remote_code: true + enable_prefix_caching: false + engine_output_type: latent + engine_input_source: [0] + custom_process_input_func: vllm_omni.model_executor.stage_input_processors.qwen2_5_omni.thinker2talker + default_sampling_params: + temperature: 0.9 + top_p: 0.8 + top_k: 40 + max_tokens: 128 + seed: 42 + detokenize: True + repetition_penalty: 1.05 + stop_token_ids: [8294] + - stage_id: 2 + runtime: + process: true + devices: "0" # Example: use a different GPU than the previous stage; use "0" if single GPU + max_batch_size: 1 + engine_args: + model_stage: code2wav + model_arch: Qwen2_5OmniForConditionalGeneration + worker_cls: vllm_omni.worker.gpu_generation_worker.GPUGenerationWorker + scheduler_cls: vllm_omni.core.sched.omni_generation_scheduler.OmniGenerationScheduler + gpu_memory_utilization: 0.15 + enforce_eager: true + trust_remote_code: true + enable_prefix_caching: false + engine_output_type: audio + max_num_batched_tokens: 4069 + engine_input_source: [1] + final_output: true + final_output_type: audio + default_sampling_params: + temperature: 0.0 + top_p: 1.0 + top_k: -1 + max_tokens: 128 + seed: 42 + detokenize: True + repetition_penalty: 1.1 + +# Top-level runtime config (concise): default windows and stage edges +runtime: + enabled: true + defaults: + window_size: -1 # Simplified: trigger downstream only after full upstream completion + max_inflight: 1 # Simplified: process serially within each stage + edges: + - from: 0 # thinker → talker: trigger only after receiving full input (-1) + to: 1 + window_size: -1 + - from: 1 # talker → code2wav: trigger only after receiving full input (-1) + to: 2 + window_size: -1 diff --git a/tests/examples/online_serving/test_qwen2_5_omni.py b/tests/examples/online_serving/test_qwen2_5_omni.py new file mode 100644 index 000000000..5a529662b --- /dev/null +++ b/tests/examples/online_serving/test_qwen2_5_omni.py @@ -0,0 +1,271 @@ +""" +Example online tests for Qwen2.5-Omni-7B model. +""" + +import os + +os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" + +import re +import subprocess +from pathlib import Path + +import pytest + +from tests.conftest import OmniServer, convert_audio_file_to_text, cosine_similarity_text + +models = ["Qwen/Qwen2.5-Omni-7B"] + + +stage_configs = [str(Path(__file__).parent.parent.parent / "e2e" / "stage_configs" / "qwen2_5_omni_ci.yaml")] + +example_dir = str(Path(__file__).parent.parent.parent.parent / "examples" / "online_serving" / "qwen2_5_omni") +# Create parameter combinations for model and stage config +test_params = [(model, stage_config) for model in models for stage_config in stage_configs] + + +@pytest.fixture(scope="module") +def omni_server(request): + """Start vLLM-Omni server as a subprocess with actual model weights. + Uses module scope so the server starts only once per test module. + Multi-stage initialization can take 10-20+ minutes. + """ + model, stage_config_path = request.param + + print(f"Starting OmniServer with model: {model}") + print("This may take 10-20+ minutes for initialization...") + + with OmniServer( + model, ["--stage-configs-path", stage_config_path, "--stage-init-timeout", "120"], port=8091 + ) as server: + print("OmniServer started successfully") + yield server + print("OmniServer stopped") + + +def run_cmd(command): + result = subprocess.run( + command, + capture_output=True, + text=True, + ) + + if result.returncode != 0: + print(f"STDERR: {result.stderr}") + raise subprocess.CalledProcessError(result.returncode, command) + + all_output = result.stdout + print(f"All output:\n{all_output}") + return all_output + + +def extract_content_after_keyword(keywords, text): + matches = re.findall(rf"{keywords}\s*(.+)", text, re.DOTALL) + + if not matches: + raise AssertionError(f"Keywords {keywords} not found in provided text output") + return matches[0] + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_send_multimodal_request_001(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "mixed_modalities", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + print(f"audio content is: {audio_content}") + + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in text_content, "The output does not contain any of the keywords in image description." + assert "lamb" in text_content, "The output does not contain any of the keywords in audio description." + + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_send_multimodal_request_002(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "mixed_modalities", + "--prompt", + "Analyze all the media content and provide a comprehensive summary.", + ] + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in text_content, "The output does not contain any of the keywords in image description." + assert "lamb" in text_content, "The output does not contain any of the keywords in audio description." + + print(f"audio content is: {audio_content}") + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_send_multimodal_request_003(omni_server) -> None: + command = ["bash", os.path.join(example_dir, "run_curl_multimodal_generation.sh"), "mixed_modalities"] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Output of request:", result) + + # Verify text output same as audio output + print(f"text content is: {text_content}") + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in text_content, "The output does not contain any of the keywords in image description." + assert "lamb" in text_content, "The output does not contain any of the keywords in audio description." + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_modality_control_001(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "mixed_modalities", + "--modalities", + "text", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output + print(f"text content is: {text_content}") + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in text_content, "The output does not contain any of the keywords in image description." + assert "lamb" in text_content, "The output does not contain any of the keywords in audio description." + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_modality_control_002(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "mixed_modalities", + "--modalities", + "audio", + ] + + run_cmd(command) + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"audio content is: {audio_content}") + assert all(keyword in audio_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in audio_content, "The output does not contain any of the keywords in image description." + assert "lamb" in audio_content, "The output does not contain any of the keywords in audio description." + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_modality_control_003(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "mixed_modalities", + "--modalities", + "audio,text", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in text_content, "The output does not contain any of the keywords in image description." + assert "lamb" in text_content, "The output does not contain any of the keywords in audio description." + + print(f"audio content is: {audio_content}") + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.skip(reason="There is a known issue with stream error.") +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_stream_001(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "mixed_modalities", + "--stream", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("content:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords in video description." + ) + # There is currently an issue with incorrect image descriptions. + # assert "cherry blossom" in text_content, "The output does not contain any of the keywords in image description." + assert "lamb" in text_content, "The output does not contain any of the keywords in audio description." + + print(f"audio content is: {audio_content}") + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + # TODO: Verify the E2E latency after confirmation baseline. + + +# TODO: test local web ui diff --git a/tests/examples/online_serving/test_qwen3_omni.py b/tests/examples/online_serving/test_qwen3_omni.py new file mode 100644 index 000000000..675146ff5 --- /dev/null +++ b/tests/examples/online_serving/test_qwen3_omni.py @@ -0,0 +1,230 @@ +""" +Example Online tests for Qwen3-Omni model. +""" + +import os + +os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" + +import re +import subprocess +from pathlib import Path + +import pytest + +from tests.conftest import OmniServer, convert_audio_file_to_text, cosine_similarity_text + +models = ["Qwen/Qwen3-Omni-30B-A3B-Instruct"] + + +stage_configs = [str(Path(__file__).parent.parent.parent / "e2e" / "stage_configs" / "qwen3_omni_ci.yaml")] + +example_dir = str(Path(__file__).parent.parent.parent.parent / "examples" / "online_serving" / "qwen3_omni") +# Create parameter combinations for model and stage config +test_params = [(model, stage_config) for model in models for stage_config in stage_configs] + + +@pytest.fixture(scope="module") +def omni_server(request): + """Start vLLM-Omni server as a subprocess with actual model weights. + Uses module scope so the server starts only once per test module.. + Multi-stage initialization can take 10-20+ minutes. + """ + model, stage_config_path = request.param + + print(f"Starting OmniServer with model: {model}") + print("This may take 10-20+ minutes for initialization...") + + with OmniServer( + model, ["--stage-configs-path", stage_config_path, "--stage-init-timeout", "120"], port=8091 + ) as server: + print("OmniServer started successfully") + yield server + print("OmniServer stopped") + + +def run_cmd(command): + result = subprocess.run( + command, + capture_output=True, + text=True, + ) + + if result.returncode != 0: + print(f"STDERR: {result.stderr}") + raise subprocess.CalledProcessError(result.returncode, command) + + all_output = result.stdout + print(f"All output:\n{all_output}") + return all_output + + +def extract_content_after_keyword(keywords, text): + matches = re.findall(rf"{keywords}\s*(.+)", text, re.DOTALL) + + if not matches: + raise AssertionError(f"Keywords {keywords} not found in provided text output") + return matches[0] + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_send_multimodal_request_001(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "use_image", + ] + + result = run_cmd(command) + text_content = extract_content_after_keyword("Chat completion output from text:", result) + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + print(f"audio content is: {audio_content}") + + assert "cherry blossom" in text_content, "The output does not contain any of the keywords." + + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_send_multimodal_request_002(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "use_video", + "--prompt", + "What are the main activities shown in this video?", + ] + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + print(f"audio content is: {audio_content}") + assert all(keyword in text_content for keyword in ["baby", "book"]), ( + "The output does not contain any of the keywords." + ) + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_send_multimodal_request_003(omni_server) -> None: + command = ["bash", os.path.join(example_dir, "run_curl_multimodal_generation.sh"), "use_image"] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Output of request:", result) + + # Verify text output same as audio output + print(f"text content is: {text_content}") + assert "cherry blossom" in text_content, "The output does not contain any of the keywords." + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_modality_control_001(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "use_image", + "--modalities", + "text", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output + print(f"text content is: {text_content}") + assert "cherry blossom" in text_content, "The output does not contain any of the keywords." + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_modality_control_002(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "use_image", + "--modalities", + "audio", + ] + + run_cmd(command) + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"audio content is: {audio_content}") + assert "cherry blossom" in audio_content, "The output does not contain any of the keywords." + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_modality_control_003(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "use_image", + "--modalities", + "audio,text", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("Chat completion output from text:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + assert "cherry blossom" in audio_content, "The output does not contain any of the keywords." + print(f"audio content is: {audio_content}") + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + + # TODO: Verify the E2E latency after confirmation baseline. + + +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +def test_stream_001(omni_server) -> None: + command = [ + "python", + os.path.join(example_dir, "openai_chat_completion_client_for_multimodal_generation.py"), + "--query-type", + "use_image", + "--stream", + ] + + result = run_cmd(command) + + text_content = extract_content_after_keyword("content:", result) + + # Verify text output same as audio output + audio_content = convert_audio_file_to_text(output_path="./audio_0.wav") + print(f"text content is: {text_content}") + assert "cherry blossom" in audio_content, "The output does not contain any of the keywords." + print(f"audio content is: {audio_content}") + similarity = cosine_similarity_text(audio_content.lower(), text_content.lower()) + print(f"similarity is: {similarity}") + assert similarity > 0.9, "The audio content is not same as the text" + # TODO: Verify the E2E latency after confirmation baseline. + + +# TODO: test local web ui From 26ba1e4de8767aaaefb531d24ee8f195f57814e6 Mon Sep 17 00:00:00 2001 From: Alicia <115451386+congw729@users.noreply.github.com> Date: Mon, 9 Feb 2026 20:48:04 +0800 Subject: [PATCH 09/10] [CI] Reduce the time for Diffusion Sequence Parallelism Test (#1283) Signed-off-by: Alicia <115451386+congw729@users.noreply.github.com> --- .buildkite/pipeline.yml | 2 +- .buildkite/test-amd.yaml | 2 +- .../test_sequence_parallel.py | 137 +++++++++++++++++- 3 files changed, 136 insertions(+), 5 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 56feccbd6..01897db96 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -123,7 +123,7 @@ steps: timeout_in_minutes: 20 depends_on: image-build commands: - - pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py + - pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py -m core_model agents: queue: "gpu_4_queue" # g6.12xlarge instance on AWS, has 4 L4 GPU plugins: diff --git a/.buildkite/test-amd.yaml b/.buildkite/test-amd.yaml index e08562ea6..773748c17 100644 --- a/.buildkite/test-amd.yaml +++ b/.buildkite/test-amd.yaml @@ -56,7 +56,7 @@ steps: - export GPU_ARCHS=gfx942 - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py + - pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py -m core_model - label: "Diffusion Tensor Parallelism Test" timeout_in_minutes: 20 diff --git a/tests/e2e/offline_inference/test_sequence_parallel.py b/tests/e2e/offline_inference/test_sequence_parallel.py index 866c2c6a1..d66104aa1 100644 --- a/tests/e2e/offline_inference/test_sequence_parallel.py +++ b/tests/e2e/offline_inference/test_sequence_parallel.py @@ -145,7 +145,15 @@ def _run_inference( # SP configurations: (ulysses_degree, ring_degree, height, width, warmup, is_perf_test) # - warmup: whether to run warmup for this SP config # - is_perf_test: whether this is a performance test (show speedup metrics) -SP_CONFIGS = [ +SP_CONFIGS_L2 = [ + # Ulysses-2 - performance test + (2, 1, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), + (1, 2, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), # Ring-2 - performance test + # Hybrid - correctness only + (2, 2, DEFAULT_HEIGHT, DEFAULT_WIDTH, False, False), +] + +SP_CONFIGS_L3 = [ # Ulysses-2 - performance test (2, 1, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), (1, 2, DEFAULT_HEIGHT, DEFAULT_WIDTH, True, True), # Ring-2 - performance test @@ -168,7 +176,7 @@ def _get_sp_mode(ulysses_degree: int, ring_degree: int) -> str: @pytest.mark.core_model @pytest.mark.diffusion @pytest.mark.parallel -@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 4, "rocm": 2}) +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 2, "rocm": 2}) @pytest.mark.parametrize("model_name", MODELS) def test_sp_correctness(model_name: str): """Test that SP inference produces correct outputs and measure performance. @@ -191,7 +199,130 @@ def test_sp_correctness(model_name: str): print(f"Available GPUs: {device_count}") print("=" * 70) - for ulysses_degree, ring_degree, height, width, sp_warmup, is_perf_test in SP_CONFIGS: + for ulysses_degree, ring_degree, height, width, sp_warmup, is_perf_test in SP_CONFIGS_L2: + sp_size = ulysses_degree * ring_degree + sp_mode = _get_sp_mode(ulysses_degree, ring_degree) + + if device_count < sp_size: + print(f"\n[{sp_mode}] SKIPPED (requires {sp_size} GPUs)") + continue + + # Determine baseline warmup: only for default size (performance tests) + cache_key = (height, width) + baseline_warmup = height == DEFAULT_HEIGHT and width == DEFAULT_WIDTH + + # Get or compute baseline for this (height, width) + if cache_key not in baseline_cache: + print(f"\n--- Running baseline {height}x{width} (warmup={baseline_warmup}) ---") + baseline = _run_inference( + model_name, + torch.bfloat16, + "sdpa", + height=height, + width=width, + warmup=baseline_warmup, + ) + assert len(baseline.images) == 1 + baseline_cache[cache_key] = baseline + print(f"[baseline] {height}x{width}: {baseline.elapsed_ms:.0f}ms") + else: + baseline = baseline_cache[cache_key] + + # Run SP + print(f"\n--- Running {sp_mode} (warmup={sp_warmup}) ---") + sp_result = _run_inference( + model_name, + torch.bfloat16, + "sdpa", + ulysses_degree=ulysses_degree, + ring_degree=ring_degree, + height=height, + width=width, + warmup=sp_warmup, + ) + assert len(sp_result.images) == 1 + + # Compare outputs (correctness) + mean_diff, max_diff = _diff_metrics(baseline.images[0], sp_result.images[0]) + + # Build result entry + result = { + "mode": sp_mode, + "sp_size": sp_size, + "height": height, + "width": width, + "baseline_ms": baseline.elapsed_ms, + "sp_ms": sp_result.elapsed_ms, + "mean_diff": mean_diff, + "max_diff": max_diff, + "is_perf_test": is_perf_test, + } + results.append(result) + + # Output based on test type + if is_perf_test: + speedup = baseline.elapsed_ms / sp_result.elapsed_ms if sp_result.elapsed_ms > 0 else 0 + result["speedup"] = speedup + print( + f"[{sp_mode}] {sp_size} GPUs | " + f"baseline: {baseline.elapsed_ms:.0f}ms, sp: {sp_result.elapsed_ms:.0f}ms, " + f"speedup: {speedup:.2f}x" + ) + else: + print(f"[{sp_mode}] {sp_size} GPUs | sp: {sp_result.elapsed_ms:.0f}ms (correctness only)") + + print(f"[{sp_mode}] diff: mean={mean_diff:.6e}, max={max_diff:.6e}") + + # Assert correctness + assert mean_diff <= DIFF_MEAN_THRESHOLD and max_diff <= DIFF_MAX_THRESHOLD, ( + f"[{sp_mode}] SP output differs from baseline: mean={mean_diff:.6e}, max={max_diff:.6e}" + ) + + # Summary + print("\n" + "=" * 70) + print("SUMMARY") + print("=" * 70) + print(f"{'Mode':<15} {'GPUs':<6} {'Size':<10} {'Baseline':<12} {'SP':<12} {'Speedup':<10} {'Status'}") + print("-" * 70) + for r in results: + speedup_str = f"{r['speedup']:.2f}x" if r.get("speedup") else "N/A" + baseline_str = f"{r['baseline_ms']:.0f}ms" if r["is_perf_test"] else "N/A" + status = "PASS" if r["mean_diff"] <= DIFF_MEAN_THRESHOLD else "FAIL" + print( + f"{r['mode']:<15} {r['sp_size']:<6} {r['height']}x{r['width']:<5} " + f"{baseline_str:<12} {r['sp_ms']:.0f}ms{'':<7} {speedup_str:<10} {status}" + ) + print("=" * 70) + + +# TODO: After PR#1272 is merged, add markers +# @pytest.mark.advanced_model +@pytest.mark.diffusion +@pytest.mark.parallel +@hardware_test(res={"cuda": "L4", "rocm": "MI325"}, num_cards={"cuda": 4, "rocm": 2}) +@pytest.mark.parametrize("model_name", MODELS) +def test_sp_correctness_advanced(model_name: str): + """Test that SP inference produces correct outputs and measure performance. + + Runs baseline once per unique (height, width), then tests all SP configs. + + Note: Run with `pytest -v -s` to see detailed output. + """ + device_count = current_omni_platform.get_device_count() + + # Cache baseline results by (height, width) + # Key: (height, width), Value: (result, warmup_used) + baseline_cache: dict[tuple[int, int], InferenceResult] = {} + + # Collect results for summary + results: list[dict] = [] + + print("\n" + "=" * 70) + print(f"Sequence Parallel Test - Model: {model_name}") + print(f"Available GPUs: {device_count}") + print("=" * 70) + + for ulysses_degree, ring_degree, height, width, sp_warmup, is_perf_test in SP_CONFIGS_L3: sp_size = ulysses_degree * ring_degree sp_mode = _get_sp_mode(ulysses_degree, ring_degree) From 5fea4823b7dd3015c5731722c7aeff2bb73fc54b Mon Sep 17 00:00:00 2001 From: Jiaping Wu <53215702+ElleElleWu@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:03:44 +0800 Subject: [PATCH 10/10] [Model] SupportHunyuanImage3 Diffusion Model in vllm-omni (#1085) Signed-off-by: Semmer2 --- docs/models/supported_models.md | 1 + pyproject.toml | 1 + .../diffusion/distributed/parallel_state.py | 2 + .../models/hunyuan_image_3/__init__.py | 17 + .../models/hunyuan_image_3/autoencoder.py | 668 ++++ .../hunyuan_image_3_tokenizer.py | 1155 +++++++ .../hunyuan_image_3_transformer.py | 2796 +++++++++++++++++ .../pipeline_hunyuan_image_3.py | 1017 ++++++ vllm_omni/diffusion/registry.py | 5 + .../worker/diffusion_model_runner.py | 21 +- .../diffusion/worker/diffusion_worker.py | 29 +- vllm_omni/entrypoints/async_omni_diffusion.py | 4 + vllm_omni/entrypoints/omni_diffusion.py | 2 + 13 files changed, 5695 insertions(+), 23 deletions(-) create mode 100644 vllm_omni/diffusion/models/hunyuan_image_3/__init__.py create mode 100644 vllm_omni/diffusion/models/hunyuan_image_3/autoencoder.py create mode 100644 vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_tokenizer.py create mode 100644 vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_transformer.py create mode 100644 vllm_omni/diffusion/models/hunyuan_image_3/pipeline_hunyuan_image_3.py diff --git a/docs/models/supported_models.md b/docs/models/supported_models.md index 0ba642c92..0fbbe6eb7 100644 --- a/docs/models/supported_models.md +++ b/docs/models/supported_models.md @@ -20,6 +20,7 @@ th { | `Qwen3OmniMoeForConditionalGeneration` | Qwen3-Omni | `Qwen/Qwen3-Omni-30B-A3B-Instruct` | | `Qwen2_5OmniForConditionalGeneration` | Qwen2.5-Omni | `Qwen/Qwen2.5-Omni-7B`, `Qwen/Qwen2.5-Omni-3B` | | `BagelForConditionalGeneration` | BAGEL (DiT-only) | `ByteDance-Seed/BAGEL-7B-MoT` | +| `HunyuanImage3ForCausalMM` | HunyuanImage3.0 (DiT-only) | `tencent/HunyuanImage-3.0`, `tencent/HunyuanImage-3.0-Instruct` | | `QwenImagePipeline` | Qwen-Image | `Qwen/Qwen-Image` | | `QwenImagePipeline` | Qwen-Image-2512 | `Qwen/Qwen-Image-2512` | | `QwenImageEditPipeline` | Qwen-Image-Edit | `Qwen/Qwen-Image-Edit` | diff --git a/pyproject.toml b/pyproject.toml index 483f7625a..0748b7eab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -188,6 +188,7 @@ extend-ignore-identifiers-re = [ ".*arange", ".*MoBA", ".*temperal_downsample", + ".*_nd", ".*nothink.*", ".*NOTHINK.*", ".*nin.*", diff --git a/vllm_omni/diffusion/distributed/parallel_state.py b/vllm_omni/diffusion/distributed/parallel_state.py index 9fa0a5bfc..12da9c43b 100644 --- a/vllm_omni/diffusion/distributed/parallel_state.py +++ b/vllm_omni/diffusion/distributed/parallel_state.py @@ -757,6 +757,7 @@ def initialize_model_parallel( backend=backend, parallel_mode="data", ) + vllm_parallel_state._DP = _DP global _CFG assert _CFG is None, "classifier_free_guidance group is already initialized" @@ -774,6 +775,7 @@ def initialize_model_parallel( backend=backend, parallel_mode="pipeline", ) + vllm_parallel_state._PP = _PP global _SP assert _SP is None, "sequence parallel group is already initialized" diff --git a/vllm_omni/diffusion/models/hunyuan_image_3/__init__.py b/vllm_omni/diffusion/models/hunyuan_image_3/__init__.py new file mode 100644 index 000000000..98a3ac07b --- /dev/null +++ b/vllm_omni/diffusion/models/hunyuan_image_3/__init__.py @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project +"""Hunyuan Image 3 diffusion model components.""" + +from vllm_omni.diffusion.models.hunyuan_image_3.hunyuan_image_3_transformer import ( + HunyuanImage3Model, + HunyuanImage3Text2ImagePipeline, +) +from vllm_omni.diffusion.models.hunyuan_image_3.pipeline_hunyuan_image_3 import ( + HunyuanImage3Pipeline, +) + +__all__ = [ + "HunyuanImage3Pipeline", + "HunyuanImage3Model", + "HunyuanImage3Text2ImagePipeline", +] diff --git a/vllm_omni/diffusion/models/hunyuan_image_3/autoencoder.py b/vllm_omni/diffusion/models/hunyuan_image_3/autoencoder.py new file mode 100644 index 000000000..efba2f274 --- /dev/null +++ b/vllm_omni/diffusion/models/hunyuan_image_3/autoencoder.py @@ -0,0 +1,668 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + +import math +from dataclasses import dataclass + +import numpy as np +import torch +import torch.nn.functional as F +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.models.modeling_outputs import AutoencoderKLOutput +from diffusers.models.modeling_utils import ModelMixin +from diffusers.utils import BaseOutput +from diffusers.utils.torch_utils import randn_tensor +from einops import rearrange +from torch import Tensor, nn + + +class DiagonalGaussianDistribution: + def __init__(self, parameters: torch.Tensor, deterministic: bool = False): + if parameters.ndim == 3: + dim = 2 # (B, L, C) + elif parameters.ndim == 5 or parameters.ndim == 4: + dim = 1 # (B, C, T, H ,W) / (B, C, H, W) + else: + raise NotImplementedError + self.parameters = parameters + self.mean, self.logvar = torch.chunk(parameters, 2, dim=dim) + self.logvar = torch.clamp(self.logvar, -30.0, 20.0) + self.deterministic = deterministic + self.std = torch.exp(0.5 * self.logvar) + self.var = torch.exp(self.logvar) + if self.deterministic: + self.var = self.std = torch.zeros_like( + self.mean, device=self.parameters.device, dtype=self.parameters.dtype + ) + + def sample(self, generator: torch.Generator | None = None) -> torch.FloatTensor: + # make sure sample is on the same device as the parameters and has same dtype + sample = randn_tensor( + self.mean.shape, + generator=generator, + device=self.parameters.device, + dtype=self.parameters.dtype, + ) + x = self.mean + self.std * sample + return x + + +@dataclass +class DecoderOutput(BaseOutput): + sample: torch.FloatTensor + posterior: DiagonalGaussianDistribution | None = None + + +def swish(x: Tensor) -> Tensor: + return x * torch.sigmoid(x) + + +def forward_with_checkpointing(module, *inputs, use_checkpointing=False): + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if use_checkpointing: + return torch.utils.checkpoint.checkpoint(create_custom_forward(module), *inputs, use_reentrant=False) + else: + return module(*inputs) + + +class Conv3d(nn.Conv3d): + """ + Perform Conv3d on patches with numerical differences from nn.Conv3d within 1e-5. + Only symmetric padding is supported. + """ + + def forward(self, input): + B, C, T, H, W = input.shape + memory_count = (C * T * H * W) * 2 / 1024**3 + if memory_count > 2: + n_split = math.ceil(memory_count / 2) + assert n_split >= 2 + chunks = torch.chunk(input, chunks=n_split, dim=-3) + padded_chunks = [] + for i in range(len(chunks)): + if self.padding[0] > 0: + padded_chunk = F.pad( + chunks[i], + (0, 0, 0, 0, self.padding[0], self.padding[0]), + mode="constant" if self.padding_mode == "zeros" else self.padding_mode, + value=0, + ) + if i > 0: + padded_chunk[:, :, : self.padding[0]] = chunks[i - 1][:, :, -self.padding[0] :] + if i < len(chunks) - 1: + padded_chunk[:, :, -self.padding[0] :] = chunks[i + 1][:, :, : self.padding[0]] + else: + padded_chunk = chunks[i] + padded_chunks.append(padded_chunk) + padding_bak = self.padding + self.padding = (0, self.padding[1], self.padding[2]) + outputs = [] + for i in range(len(padded_chunks)): + outputs.append(super().forward(padded_chunks[i])) + self.padding = padding_bak + return torch.cat(outputs, dim=-3) + else: + return super().forward(input) + + +class AttnBlock(nn.Module): + """Attention with torch sdpa implementation.""" + + def __init__(self, in_channels: int): + super().__init__() + self.in_channels = in_channels + + self.norm = nn.GroupNorm(num_groups=32, num_channels=in_channels, eps=1e-6, affine=True) + + self.q = Conv3d(in_channels, in_channels, kernel_size=1) + self.k = Conv3d(in_channels, in_channels, kernel_size=1) + self.v = Conv3d(in_channels, in_channels, kernel_size=1) + self.proj_out = Conv3d(in_channels, in_channels, kernel_size=1) + + def attention(self, h_: Tensor) -> Tensor: + h_ = self.norm(h_) + q = self.q(h_) + k = self.k(h_) + v = self.v(h_) + + b, c, f, h, w = q.shape + q = rearrange(q, "b c f h w -> b 1 (f h w) c").contiguous() + k = rearrange(k, "b c f h w -> b 1 (f h w) c").contiguous() + v = rearrange(v, "b c f h w -> b 1 (f h w) c").contiguous() + h_ = nn.functional.scaled_dot_product_attention(q, k, v) + + return rearrange(h_, "b 1 (f h w) c -> b c f h w", f=f, h=h, w=w, c=c, b=b) + + def forward(self, x: Tensor) -> Tensor: + return x + self.proj_out(self.attention(x)) + + +class ResnetBlock(nn.Module): + def __init__(self, in_channels: int, out_channels: int): + super().__init__() + self.in_channels = in_channels + out_channels = in_channels if out_channels is None else out_channels + self.out_channels = out_channels + + self.norm1 = nn.GroupNorm(num_groups=32, num_channels=in_channels, eps=1e-6, affine=True) + self.conv1 = Conv3d(in_channels, out_channels, kernel_size=3, stride=1, padding=1) + self.norm2 = nn.GroupNorm(num_groups=32, num_channels=out_channels, eps=1e-6, affine=True) + self.conv2 = Conv3d(out_channels, out_channels, kernel_size=3, stride=1, padding=1) + if self.in_channels != self.out_channels: + self.nin_shortcut = Conv3d(in_channels, out_channels, kernel_size=1, stride=1, padding=0) + + def forward(self, x): + h = x + h = self.norm1(h) + h = swish(h) + h = self.conv1(h) + + h = self.norm2(h) + h = swish(h) + h = self.conv2(h) + + if self.in_channels != self.out_channels: + x = self.nin_shortcut(x) + return x + h + + +class DownsampleDCAE(nn.Module): + def __init__(self, in_channels: int, out_channels: int, add_temporal_downsample: bool = True): + super().__init__() + factor = 2 * 2 * 2 if add_temporal_downsample else 1 * 2 * 2 + assert out_channels % factor == 0 + self.conv = Conv3d(in_channels, out_channels // factor, kernel_size=3, stride=1, padding=1) + + self.add_temporal_downsample = add_temporal_downsample + self.group_size = factor * in_channels // out_channels + + def forward(self, x: Tensor): + r1 = 2 if self.add_temporal_downsample else 1 + h = self.conv(x) + h = rearrange(h, "b c (f r1) (h r2) (w r3) -> b (r1 r2 r3 c) f h w", r1=r1, r2=2, r3=2) + shortcut = rearrange(x, "b c (f r1) (h r2) (w r3) -> b (r1 r2 r3 c) f h w", r1=r1, r2=2, r3=2) + + B, C, T, H, W = shortcut.shape + shortcut = shortcut.view(B, h.shape[1], self.group_size, T, H, W).mean(dim=2) + return h + shortcut + + +class UpsampleDCAE(nn.Module): + def __init__(self, in_channels: int, out_channels: int, add_temporal_upsample: bool = True): + super().__init__() + factor = 2 * 2 * 2 if add_temporal_upsample else 1 * 2 * 2 + self.conv = Conv3d(in_channels, out_channels * factor, kernel_size=3, stride=1, padding=1) + + self.add_temporal_upsample = add_temporal_upsample + self.repeats = factor * out_channels // in_channels + + def forward(self, x: Tensor): + r1 = 2 if self.add_temporal_upsample else 1 + h = self.conv(x) + h = rearrange(h, "b (r1 r2 r3 c) f h w -> b c (f r1) (h r2) (w r3)", r1=r1, r2=2, r3=2) + shortcut = x.repeat_interleave(repeats=self.repeats, dim=1) + shortcut = rearrange(shortcut, "b (r1 r2 r3 c) f h w -> b c (f r1) (h r2) (w r3)", r1=r1, r2=2, r3=2) + return h + shortcut + + +class Encoder(nn.Module): + """ + The encoder network of AutoencoderKLConv3D. + """ + + def __init__( + self, + in_channels: int, + z_channels: int, + block_out_channels: tuple[int, ...], + num_res_blocks: int, + ffactor_spatial: int, + ffactor_temporal: int, + downsample_match_channel: bool = True, + ): + super().__init__() + assert block_out_channels[-1] % (2 * z_channels) == 0 + + self.z_channels = z_channels + self.block_out_channels = block_out_channels + self.num_res_blocks = num_res_blocks + + # downsampling + self.conv_in = Conv3d(in_channels, block_out_channels[0], kernel_size=3, stride=1, padding=1) + + self.down = nn.ModuleList() + block_in = block_out_channels[0] + for i_level, ch in enumerate(block_out_channels): + block = nn.ModuleList() + block_out = ch + for _ in range(self.num_res_blocks): + block.append(ResnetBlock(in_channels=block_in, out_channels=block_out)) + block_in = block_out + down = nn.Module() + down.block = block + + add_spatial_downsample = bool(i_level < np.log2(ffactor_spatial)) + add_temporal_downsample = add_spatial_downsample and bool( + i_level >= np.log2(ffactor_spatial // ffactor_temporal) + ) + if add_spatial_downsample or add_temporal_downsample: + assert i_level < len(block_out_channels) - 1 + block_out = block_out_channels[i_level + 1] if downsample_match_channel else block_in + down.downsample = DownsampleDCAE(block_in, block_out, add_temporal_downsample) + block_in = block_out + self.down.append(down) + + # middle + self.mid = nn.Module() + self.mid.block_1 = ResnetBlock(in_channels=block_in, out_channels=block_in) + self.mid.attn_1 = AttnBlock(block_in) + self.mid.block_2 = ResnetBlock(in_channels=block_in, out_channels=block_in) + + # end + self.norm_out = nn.GroupNorm(num_groups=32, num_channels=block_in, eps=1e-6, affine=True) + self.conv_out = Conv3d(block_in, 2 * z_channels, kernel_size=3, stride=1, padding=1) + + self.gradient_checkpointing = False + + def forward(self, x: Tensor) -> Tensor: + use_checkpointing = bool(self.training and self.gradient_checkpointing) + + # downsampling + h = self.conv_in(x) + for i_level in range(len(self.block_out_channels)): + for i_block in range(self.num_res_blocks): + h = forward_with_checkpointing( + self.down[i_level].block[i_block], h, use_checkpointing=use_checkpointing + ) + if hasattr(self.down[i_level], "downsample"): + h = forward_with_checkpointing(self.down[i_level].downsample, h, use_checkpointing=use_checkpointing) + + # middle + h = forward_with_checkpointing(self.mid.block_1, h, use_checkpointing=use_checkpointing) + h = forward_with_checkpointing(self.mid.attn_1, h, use_checkpointing=use_checkpointing) + h = forward_with_checkpointing(self.mid.block_2, h, use_checkpointing=use_checkpointing) + + # end + group_size = self.block_out_channels[-1] // (2 * self.z_channels) + shortcut = rearrange(h, "b (c r) f h w -> b c r f h w", r=group_size).mean(dim=2) + h = self.norm_out(h) + h = swish(h) + h = self.conv_out(h) + h += shortcut + return h + + +class Decoder(nn.Module): + """ + The decoder network of AutoencoderKLConv3D. + """ + + def __init__( + self, + z_channels: int, + out_channels: int, + block_out_channels: tuple[int, ...], + num_res_blocks: int, + ffactor_spatial: int, + ffactor_temporal: int, + upsample_match_channel: bool = True, + ): + super().__init__() + assert block_out_channels[0] % z_channels == 0 + + self.z_channels = z_channels + self.block_out_channels = block_out_channels + self.num_res_blocks = num_res_blocks + + # z to block_in + block_in = block_out_channels[0] + self.conv_in = Conv3d(z_channels, block_in, kernel_size=3, stride=1, padding=1) + + # middle + self.mid = nn.Module() + self.mid.block_1 = ResnetBlock(in_channels=block_in, out_channels=block_in) + self.mid.attn_1 = AttnBlock(block_in) + self.mid.block_2 = ResnetBlock(in_channels=block_in, out_channels=block_in) + + # upsampling + self.up = nn.ModuleList() + for i_level, ch in enumerate(block_out_channels): + block = nn.ModuleList() + block_out = ch + for _ in range(self.num_res_blocks + 1): + block.append(ResnetBlock(in_channels=block_in, out_channels=block_out)) + block_in = block_out + up = nn.Module() + up.block = block + + add_spatial_upsample = bool(i_level < np.log2(ffactor_spatial)) + add_temporal_upsample = bool(i_level < np.log2(ffactor_temporal)) + if add_spatial_upsample or add_temporal_upsample: + assert i_level < len(block_out_channels) - 1 + block_out = block_out_channels[i_level + 1] if upsample_match_channel else block_in + up.upsample = UpsampleDCAE(block_in, block_out, add_temporal_upsample) + block_in = block_out + self.up.append(up) + + # end + self.norm_out = nn.GroupNorm(num_groups=32, num_channels=block_in, eps=1e-6, affine=True) + self.conv_out = Conv3d(block_in, out_channels, kernel_size=3, stride=1, padding=1) + + self.gradient_checkpointing = False + + def forward(self, z: Tensor) -> Tensor: + use_checkpointing = bool(self.training and self.gradient_checkpointing) + + # z to block_in + repeats = self.block_out_channels[0] // (self.z_channels) + h = self.conv_in(z) + z.repeat_interleave(repeats=repeats, dim=1) + + # middle + h = forward_with_checkpointing(self.mid.block_1, h, use_checkpointing=use_checkpointing) + h = forward_with_checkpointing(self.mid.attn_1, h, use_checkpointing=use_checkpointing) + h = forward_with_checkpointing(self.mid.block_2, h, use_checkpointing=use_checkpointing) + + # upsampling + for i_level in range(len(self.block_out_channels)): + for i_block in range(self.num_res_blocks + 1): + h = forward_with_checkpointing(self.up[i_level].block[i_block], h, use_checkpointing=use_checkpointing) + if hasattr(self.up[i_level], "upsample"): + h = forward_with_checkpointing(self.up[i_level].upsample, h, use_checkpointing=use_checkpointing) + + # end + h = self.norm_out(h) + h = swish(h) + h = self.conv_out(h) + return h + + +class AutoencoderKLConv3D(ModelMixin, ConfigMixin): + """ + Autoencoder model with KL-regularized latent space based on 3D convolutions. + """ + + _supports_gradient_checkpointing = True + + @register_to_config + def __init__( + self, + in_channels: int, + out_channels: int, + latent_channels: int, + block_out_channels: tuple[int, ...], + layers_per_block: int, + ffactor_spatial: int, + ffactor_temporal: int, + sample_size: int, + sample_tsize: int, + scaling_factor: float | None = None, + shift_factor: float | None = None, + downsample_match_channel: bool = True, + upsample_match_channel: bool = True, + only_encoder: bool = False, # only build encoder for saving memory + only_decoder: bool = False, # only build decoder for saving memory + ): + super().__init__() + self.ffactor_spatial = ffactor_spatial + self.ffactor_temporal = ffactor_temporal + self.scaling_factor = scaling_factor + self.shift_factor = shift_factor + + # build model + if not only_decoder: + self.encoder = Encoder( + in_channels=in_channels, + z_channels=latent_channels, + block_out_channels=block_out_channels, + num_res_blocks=layers_per_block, + ffactor_spatial=ffactor_spatial, + ffactor_temporal=ffactor_temporal, + downsample_match_channel=downsample_match_channel, + ) + if not only_encoder: + self.decoder = Decoder( + z_channels=latent_channels, + out_channels=out_channels, + block_out_channels=list(reversed(block_out_channels)), + num_res_blocks=layers_per_block, + ffactor_spatial=ffactor_spatial, + ffactor_temporal=ffactor_temporal, + upsample_match_channel=upsample_match_channel, + ) + + # slicing and tiling related + self.use_slicing = False + self.slicing_bsz = 1 + self.use_spatial_tiling = False + self.use_temporal_tiling = False + self.use_tiling_during_training = False + + # only relevant if vae tiling is enabled + self.tile_sample_min_size = sample_size + self.tile_latent_min_size = sample_size // ffactor_spatial + self.tile_sample_min_tsize = sample_tsize + self.tile_latent_min_tsize = sample_tsize // ffactor_temporal + self.tile_overlap_factor = 0.25 + + # use torch.compile for faster encode speed + self.use_compile = False + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, (Encoder, Decoder)): + module.gradient_checkpointing = value + + def blend_h(self, a: torch.Tensor, b: torch.Tensor, blend_extent: int): + blend_extent = min(a.shape[-1], b.shape[-1], blend_extent) + for x in range(blend_extent): + b[:, :, :, :, x] = a[:, :, :, :, -blend_extent + x] * (1 - x / blend_extent) + b[:, :, :, :, x] * ( + x / blend_extent + ) + return b + + def blend_v(self, a: torch.Tensor, b: torch.Tensor, blend_extent: int): + blend_extent = min(a.shape[-2], b.shape[-2], blend_extent) + for y in range(blend_extent): + b[:, :, :, y, :] = a[:, :, :, -blend_extent + y, :] * (1 - y / blend_extent) + b[:, :, :, y, :] * ( + y / blend_extent + ) + return b + + def blend_t(self, a: torch.Tensor, b: torch.Tensor, blend_extent: int): + blend_extent = min(a.shape[-3], b.shape[-3], blend_extent) + for x in range(blend_extent): + b[:, :, x, :, :] = a[:, :, -blend_extent + x, :, :] * (1 - x / blend_extent) + b[:, :, x, :, :] * ( + x / blend_extent + ) + return b + + def spatial_tiled_encode(self, x: torch.Tensor): + """spatial tailing for frames""" + B, C, T, H, W = x.shape + overlap_size = int(self.tile_sample_min_size * (1 - self.tile_overlap_factor)) # 256 * (1 - 0.25) = 192 + blend_extent = int(self.tile_latent_min_size * self.tile_overlap_factor) # 8 * 0.25 = 2 + row_limit = self.tile_latent_min_size - blend_extent # 8 - 2 = 6 + + rows = [] + for i in range(0, H, overlap_size): + row = [] + for j in range(0, W, overlap_size): + tile = x[:, :, :, i : i + self.tile_sample_min_size, j : j + self.tile_sample_min_size] + tile = self.encoder(tile) + row.append(tile) + rows.append(row) + result_rows = [] + for i, row in enumerate(rows): + result_row = [] + for j, tile in enumerate(row): + if i > 0: + tile = self.blend_v(rows[i - 1][j], tile, blend_extent) + if j > 0: + tile = self.blend_h(row[j - 1], tile, blend_extent) + result_row.append(tile[:, :, :, :row_limit, :row_limit]) + result_rows.append(torch.cat(result_row, dim=-1)) + moments = torch.cat(result_rows, dim=-2) + return moments + + def temporal_tiled_encode(self, x: torch.Tensor): + """temporal tailing for frames""" + B, C, T, H, W = x.shape + overlap_size = int(self.tile_sample_min_tsize * (1 - self.tile_overlap_factor)) # 64 * (1 - 0.25) = 48 + blend_extent = int(self.tile_latent_min_tsize * self.tile_overlap_factor) # 8 * 0.25 = 2 + t_limit = self.tile_latent_min_tsize - blend_extent # 8 - 2 = 6 + + row = [] + for i in range(0, T, overlap_size): + tile = x[:, :, i : i + self.tile_sample_min_tsize, :, :] + if self.use_spatial_tiling and ( + tile.shape[-1] > self.tile_sample_min_size or tile.shape[-2] > self.tile_sample_min_size + ): + tile = self.spatial_tiled_encode(tile) + else: + tile = self.encoder(tile) + row.append(tile) + result_row = [] + for i, tile in enumerate(row): + if i > 0: + tile = self.blend_t(row[i - 1], tile, blend_extent) + result_row.append(tile[:, :, :t_limit, :, :]) + moments = torch.cat(result_row, dim=-3) + return moments + + def spatial_tiled_decode(self, z: torch.Tensor): + """spatial tailing for frames""" + B, C, T, H, W = z.shape + overlap_size = int(self.tile_latent_min_size * (1 - self.tile_overlap_factor)) # 8 * (1 - 0.25) = 6 + blend_extent = int(self.tile_sample_min_size * self.tile_overlap_factor) # 256 * 0.25 = 64 + row_limit = self.tile_sample_min_size - blend_extent # 256 - 64 = 192 + + rows = [] + for i in range(0, H, overlap_size): + row = [] + for j in range(0, W, overlap_size): + tile = z[:, :, :, i : i + self.tile_latent_min_size, j : j + self.tile_latent_min_size] + decoded = self.decoder(tile) + row.append(decoded) + rows.append(row) + + result_rows = [] + for i, row in enumerate(rows): + result_row = [] + for j, tile in enumerate(row): + if i > 0: + tile = self.blend_v(rows[i - 1][j], tile, blend_extent) + if j > 0: + tile = self.blend_h(row[j - 1], tile, blend_extent) + result_row.append(tile[:, :, :, :row_limit, :row_limit]) + result_rows.append(torch.cat(result_row, dim=-1)) + dec = torch.cat(result_rows, dim=-2) + return dec + + def temporal_tiled_decode(self, z: torch.Tensor): + """temporal tailing for frames""" + B, C, T, H, W = z.shape + overlap_size = int(self.tile_latent_min_tsize * (1 - self.tile_overlap_factor)) # 8 * (1 - 0.25) = 6 + blend_extent = int(self.tile_sample_min_tsize * self.tile_overlap_factor) # 64 * 0.25 = 16 + t_limit = self.tile_sample_min_tsize - blend_extent # 64 - 16 = 48 + assert 0 < overlap_size < self.tile_latent_min_tsize + + row = [] + for i in range(0, T, overlap_size): + tile = z[:, :, i : i + self.tile_latent_min_tsize, :, :] + if self.use_spatial_tiling and ( + tile.shape[-1] > self.tile_latent_min_size or tile.shape[-2] > self.tile_latent_min_size + ): + decoded = self.spatial_tiled_decode(tile) + else: + decoded = self.decoder(tile) + row.append(decoded) + + result_row = [] + for i, tile in enumerate(row): + if i > 0: + tile = self.blend_t(row[i - 1], tile, blend_extent) + result_row.append(tile[:, :, :t_limit, :, :]) + dec = torch.cat(result_row, dim=-3) + return dec + + def encode(self, x: Tensor, return_dict: bool = True): + """ + Encodes the input by passing through the encoder network. + Support slicing and tiling for memory efficiency. + """ + + def _encode(x): + if self.use_temporal_tiling and x.shape[-3] > self.tile_sample_min_tsize: + return self.temporal_tiled_encode(x) + if self.use_spatial_tiling and ( + x.shape[-1] > self.tile_sample_min_size or x.shape[-2] > self.tile_sample_min_size + ): + return self.spatial_tiled_encode(x) + + if self.use_compile: + + @torch.compile + def encoder(x): + return self.encoder(x) + + return encoder(x) + return self.encoder(x) + + if len(x.shape) != 5: # (B, C, T, H, W) + x = x[:, :, None] + assert len(x.shape) == 5 # (B, C, T, H, W) + if x.shape[2] == 1: + x = x.expand(-1, -1, self.ffactor_temporal, -1, -1) + else: + assert x.shape[2] != self.ffactor_temporal and x.shape[2] % self.ffactor_temporal == 0 + + if self.use_slicing and x.shape[0] > 1: + if self.slicing_bsz == 1: + encoded_slices = [_encode(x_slice) for x_slice in x.split(1)] + else: + sections = [self.slicing_bsz] * (x.shape[0] // self.slicing_bsz) + if x.shape[0] % self.slicing_bsz != 0: + sections.append(x.shape[0] % self.slicing_bsz) + encoded_slices = [_encode(x_slice) for x_slice in x.split(sections)] + h = torch.cat(encoded_slices) + else: + h = _encode(x) + posterior = DiagonalGaussianDistribution(h) + + if not return_dict: + return (posterior,) + + return AutoencoderKLOutput(latent_dist=posterior) + + def decode(self, z: Tensor, return_dict: bool = True, generator=None): + """ + Decodes the input by passing through the decoder network. + Support slicing and tiling for memory efficiency. + """ + + def _decode(z): + if self.use_temporal_tiling and z.shape[-3] > self.tile_latent_min_tsize: + return self.temporal_tiled_decode(z) + if self.use_spatial_tiling and ( + z.shape[-1] > self.tile_latent_min_size or z.shape[-2] > self.tile_latent_min_size + ): + return self.spatial_tiled_decode(z) + return self.decoder(z) + + if self.use_slicing and z.shape[0] > 1: + decoded_slices = [_decode(z_slice) for z_slice in z.split(1)] + decoded = torch.cat(decoded_slices) + else: + decoded = _decode(z) + + if z.shape[-3] == 1: + decoded = decoded[:, :, -1:] + + if not return_dict: + return (decoded,) + + return DecoderOutput(sample=decoded) diff --git a/vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_tokenizer.py b/vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_tokenizer.py new file mode 100644 index 000000000..360904b5e --- /dev/null +++ b/vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_tokenizer.py @@ -0,0 +1,1155 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + +import random +import warnings +from collections import defaultdict +from copy import deepcopy +from typing import Any + +import torch +import torch.nn.functional as F +from diffusers.utils.outputs import BaseOutput +from transformers import AutoTokenizer + +from .hunyuan_image_3_transformer import ImageInfo, JointImageInfo, default + + +class TokenizerEncodeOutput(BaseOutput): + tokens: torch.Tensor | None = None + timestep_scatter_index: torch.Tensor | None = None + guidance_scatter_index: torch.Tensor | None = None + text_slices: list[slice] | None = None + gen_image_slices: list[slice] | None = None + joint_image_slices: list[slice] | None = None + cond_vae_image_slices: list[slice] | None = None + cond_vit_image_slices: list[slice] | None = None + text_mask: torch.Tensor | None = None + gen_image_mask: torch.Tensor | None = None + cond_vae_image_mask: torch.Tensor | None = None + cond_vit_image_mask: torch.Tensor | None = None + real_pos: torch.Tensor | None = None + all_image_slices: list[slice] | None = None + cond_timestep_scatter_index: torch.Tensor | None = None + gen_timestep_scatter_index: torch.Tensor | None = None + + +class Conversation: + roles: list[str] = ["User", "Assistant"] + sep: str = "\n\n" + + +class TokenizerWrapper: + def __init__(self, tokenizer): + if isinstance(tokenizer, str): + self.tokenizer = AutoTokenizer.from_pretrained(tokenizer) + else: + self.tokenizer = tokenizer + + # Define short names + self.bos_token_id = self.tokenizer.bos_token_id + self.eos_token_id = self.tokenizer.eos_token_id + self.pad_token_id = self.tokenizer.pad_token_id + self.boi_token_id = self.tokenizer.convert_tokens_to_ids("") + self.eoi_token_id = self.tokenizer.convert_tokens_to_ids("") + self.img_token_id = self.tokenizer.convert_tokens_to_ids("") + self.cfg_token_id = self.tokenizer.convert_tokens_to_ids("") + self.end_answer_token_id = self.tokenizer.convert_tokens_to_ids("") + self.end_recaption_token_id = self.tokenizer.convert_tokens_to_ids("") + self.ratio_token_offset = self.tokenizer.convert_tokens_to_ids("") + self.special_token_map = self.tokenizer.added_tokens_encoder + + def pad(self, tensor_list, dim=0, pad_val=None): + if pad_val is None: + pad_val = self.pad_token_id + max_len = max([t.shape[dim] for t in tensor_list]) + padded_tensor_list = [] + for t in tensor_list: + if t.shape[dim] < max_len: + assert pad_val is not False, "Not allowed pad." + t = F.pad(t, (0, max_len - t.shape[dim]), value=pad_val) + padded_tensor_list.append(t) + return padded_tensor_list + + def encode(self, *args, **kwargs): + return self.tokenizer.encode(*args, **kwargs) + + def decode(self, *args, **kwargs): + return self.tokenizer.decode(*args, **kwargs) + + def encode_text( + self, + *texts, + uncond_enabled: bool | list[bool] | None = None, + uncond_p: float | None = None, + max_length: int | None = None, + pad: str | None = None, + return_lengths: bool = False, + ) -> list[torch.Tensor]: + r""" + Encode text and image for AR-like model training of the text-to-image/instruction tuning tasks. + Support encode multiple texts at once. Each text can be separately conditioned or unconditioned + based on the uncond_flags and a uniform uncond_p. + ** token is always prepended to the text tokens.** + + Args: + texts (`str` or `List[str]`): + List of texts to be encoded. + uncond_enabled (`bool` or `List[bool]`): + List of flags to indicate whether the text should be unconditioned. + If False, the text will never be unconditioned. + If True, the text will be unconditioned with uncond_p. + uncond_p (`float`): + Probability to the unconditional text. Only works when uncond_enabled is True. + max_length (`int`): + Maximum length of the encoded text. + pad (`str`, *optional*): + Padding method. Can be 'left' or 'right'. + return_lengths (`bool`): + Whether to return the length of each encoded text. + + Returns: + `tuple[torch.Tensor, List[int]]` or `torch.Tensor`: + If `return_lengths` is True, returns a tuple of (encoded_tokens, lengths). + If `return_lengths` is False, returns only the encoded_tokens. + """ + if pad is not None: + assert max_length is not None, "max_length should be provided when pad is not None." + + if uncond_enabled is None: + uncond_enabled = [True] * len(texts) + elif isinstance(uncond_enabled, bool): + uncond_enabled = [uncond_enabled] * len(texts) + if len(uncond_enabled) != len(texts): + print(uncond_enabled, texts) + assert len(uncond_enabled) == len(texts), ( + f"Length of uncond_flags should be equal to the number of texts, " + f"but got {len(uncond_enabled)} and {len(texts)}." + ) + + # Prepare text/uncond tokens + # TODO: If len(texts) > 1, such as instruction + prompt in inpainting, we need to determine how to do uncond. + # Now all texts will be cond or uncond at the same time. + do_uncond_drop = (uncond_p is not None) and (random.random() < uncond_p) + text_tokens, lengths = [], [] + cum_length = 0 + for text, uncond_flag in zip(texts, uncond_enabled): + # If reach the max_length and there still have unencoded texts, give a warning message and break the loop. + if max_length is not None and cum_length >= max_length: + warnings.warn( + f"Text length exceeds the max_length({max_length}). The remaining texts will be ignored: " + f"{text[:80]}..." + ) + break + # Set add_special_tokens=False to avoid adding token in some LLMs. + if isinstance(text, str): + text_token = self.tokenizer.encode(text, add_special_tokens=False) + else: + text_token = text + if uncond_flag and do_uncond_drop: + text_token = [self.cfg_token_id] * len(text_token) + # Cutoff the text by max_length if necessary + if max_length is not None and (cum_length + len(text_token)) > max_length: + text_token = text_token[: max_length - cum_length] + text_tokens.extend(text_token) + lengths.append(len(text_token)) + cum_length += len(text_token) + + # Prepend/Append tokens if applicable + if pad is not None and (pad_length := max_length - len(text_tokens)) > 0: + if pad == "left": + text_tokens = [self.pad_token_id] * pad_length + text_tokens + elif pad == "right": + text_tokens = text_tokens + [self.pad_token_id] * pad_length + else: + raise ValueError(f"Unsupported padding method: {pad}.") + + if return_lengths: + return text_tokens, lengths + return text_tokens + + @staticmethod + def _check_key_number_matched(keys, data): + # Assert keys and token_source are matched + assert set(keys) == set(data.keys()), ( + f"Keys in the template and token source should be matched, but got {set(keys)} and {list(data.keys())}." + ) + key_counts = {k: 0 for k in keys} + for key in keys: + key_counts[key] += 1 + for key, count in key_counts.items(): + assert len(data[key]) == count, ( + f"Number of `{key}` in the token source should be matched with the template, but got " + f"{data[key]}({len(data[key])}) and {count}." + ) + + def _add_image_meta_info_token( + self, + token_seq, + token_count, + extra_token_pos, + add_timestep_token=False, + add_image_shape_token=False, + base_size=None, + ratio_idx=None, + image_type=None, + add_guidance_token=False, + ): + if add_image_shape_token: + token_seq.extend( + [self.special_token_map[f""], self.special_token_map[f""]] + ) + token_count += 2 + if add_timestep_token: + token_seq.extend([self.special_token_map[""]]) + extra_token_pos["timestep"].append(token_count) + if image_type is not None: + if image_type == "gen_image": + extra_token_pos["gen_timestep"].append(token_count) + elif image_type in ["joint_image"]: + extra_token_pos["cond_timestep"].append(token_count) + else: + raise ValueError(f"Unsupported image type: {image_type}.") + token_count += 1 + if add_guidance_token: + token_seq.extend([self.special_token_map[""]]) + extra_token_pos["guidance"].append(token_count) + token_count += 1 + return token_count + + def encode_sequence( + self, + template: str, + token_source: dict[str, list], + total_length=None, + add_timestep_token=False, + add_guidance_token=False, + last_key_only_prefix=False, + add_eos=True, + use_front_boi_token=True, + add_pad=True, + add_bos=True, + drop_last: str | bool = "auto", + add_image_shape_token=False, + ) -> tuple[list, dict[str, list]]: + r""" + Encode a sequence based on the template (e.g., `text-image` for t2i, `text-image-image` for instruction tuning) + and token source. + + Args: + template (`str`): + Template of the sequence. E.g., "text-gen_image" means the sequence is composed of text and an image. + "text-text-gen_image" means the sequence is composed of two sections of text and an image. + token_source (`Dict[str, List]`): + Token source for each key in the template, in order. + - text: List[Dict]. + - gen_image: List[Dict]. + - joint_image: List[Dict]. + total_length (`int`): + Total length of the encoded sequence, include padding tokens. + add_timestep_token (`bool`): + Whether to add timestep token before the image tokens. + (Right after the tokens) + add_guidance_token (`bool`): + Whether to add guidance token before the image tokens. + last_key_only_prefix (`bool`): + Whether to only use the modal prefix in the last key. + add_eos (`bool` or `'auto'`): + Whether to add eos token at the end of the sequence. If True, always add eos token. If 'auto', + add eos token only when the total_length is not reached and the last token is not . + use_front_boi_token (`bool`): + Whether to put the token at the front of iw, ih and timestep tokens. + add_pad (`bool` or `'auto'`): + Whether to add padding tokens to the sequence. + add_bos (`bool`): + Whether to add bos token at the beginning of the sequence. + drop_last (`bool` or `'auto'`): + - If auto, drop last tokens exceeding the total_length if the total_length is provided. If cut point is + in the middle of the image tokens, an error will raised. + - If True, drop last tokens exceeding the total_length. + - If False, keep the last tokens exceeding the total_length, even if the total_length is reached. + add_image_shape_token (`bool`): + Whether to add image shape token before the image tokens. (Right before the token) + + Returns: + `tuple[list, dict]`: A tuple containing: + - token_seq (`list`): Encoded token sequence. + - extra_token_pos (`dict`): Positions of extra tokens. + """ + if last_key_only_prefix: + assert add_eos is not True, "add_eos should not be True when last_key_only_prefix is True." + if drop_last is True and total_length is None: + raise ValueError("total_length should be provided when drop_last is True.") + + keys = template.split("-") + modal_length = len(keys) + index_indicator = {k: 0 for k in token_source} + for k, v in token_source.items(): + assert isinstance(v, (list, tuple)), ( + f"Value of `{k}` in the token source should be a list or tuple, but got {type(v)}." + ) + self._check_key_number_matched(keys, token_source) + + token_seq = [] + token_count = 0 + extra_token_pos = defaultdict(list) + if add_bos: + token_seq.append(self.bos_token_id) + token_count += 1 + # If drop_last is True, we check the token_count on the fly and exit the loop if the total_length is reached. + # This check is only applied to the block tokens. Block tokens mean the tokens that are unsplittable, like + # image tokens. Text tokens are splittable, so we don't need to check the token_count for text. + # If the loop is broken by drop_last, we don't add the eos token at the end because the sequence is not + # complete. + drop_last_break = False + for i, key in enumerate(keys): + source = token_source[key][index_indicator[key]] + if key == "text": + token_seq.extend(source) # text token sequence + extra_token_pos["_start"].append(token_count) + token_count += len(source) + extra_token_pos["_end"].append(token_count - 1) + + elif key == "gen_image": + if isinstance(source, int): + source = {"length": source} + extra_count = ( + 2 + + (1 if source.get("timestep", add_timestep_token) else 0) + + (1 if source.get("guidance", add_guidance_token) else 0) + + (2 if source.get("image_shape", add_image_shape_token) else 0) + ) + if drop_last is True and token_count + extra_count + source["length"] > total_length: + drop_last_break = True + break + if source.get("front_boi", use_front_boi_token): + token_seq.append(self.boi_token_id) + extra_token_pos["boi"].append(token_count) + token_count += 1 + token_count = self._add_image_meta_info_token( + token_seq=token_seq, + token_count=token_count, + extra_token_pos=extra_token_pos, + add_timestep_token=source.get("timestep", add_timestep_token), + add_guidance_token=source.get("guidance", add_guidance_token), + add_image_shape_token=source.get("image_shape", add_image_shape_token), + base_size=source.get("base_size"), + ratio_idx=source.get("ratio_idx"), + image_type=key, + ) + if not source.get("front_boi", use_front_boi_token): + token_seq.append(self.boi_token_id) + extra_token_pos["boi"].append(token_count) + token_count += 1 + if last_key_only_prefix and i == modal_length - 1: + pass # for AR inference + else: + token_seq.extend( + [self.img_token_id] * source["length"] # token number + + [self.eoi_token_id] + ) + extra_token_pos["_start"].append(token_count) + extra_token_pos["_start"].append(token_count) + token_count += source["length"] + extra_token_pos["_end"].append(token_count - 1) + extra_token_pos["_end"].append(token_count - 1) + extra_token_pos["eoi"].append(token_count) + token_count += 1 # + + elif key == "joint_image": + assert isinstance(source["length"], list) and len(source["length"]) == 2, ( + "joint_image length should be a list of two integers" + ) + extra_count = ( + 2 + + 1 + + ( # boi, eoi, joint_img_sep + 1 if source.get("timestep", add_timestep_token) else 0 + ) + + (2 if source.get("image_shape", add_image_shape_token) else 0) + ) + if drop_last is True and token_count + extra_count + sum(source["length"]) > total_length: + drop_last_break = True + break + if source.get("front_boi", use_front_boi_token): + token_seq.append(self.boi_token_id) # Use patched boi for Janus, otherwise useing default + extra_token_pos["boi"].append(token_count) + token_count += 1 + token_count = self._add_image_meta_info_token( + token_seq=token_seq, + token_count=token_count, + extra_token_pos=extra_token_pos, + add_timestep_token=source.get("timestep", add_timestep_token), + add_image_shape_token=source.get("image_shape", add_image_shape_token), + base_size=source.get("base_size"), + ratio_idx=source.get("ratio_idx"), + image_type=key, + ) + if not source.get("front_boi", use_front_boi_token): + token_seq.append(self.boi_token_id) + extra_token_pos["boi"].append(token_count) + token_count += 1 + if last_key_only_prefix and i == modal_length - 1: + pass # for AR inference + else: + token_seq.extend([self.img_token_id] * source["length"][0]) + extra_token_pos["_start"].append(token_count) + extra_token_pos["_start"].append(token_count) + extra_token_pos["_start"].append(token_count) + token_count += source["length"][0] + extra_token_pos["_end"].append(token_count - 1) + extra_token_pos["_end"].append(token_count - 1) + + token_seq.extend([self.special_token_map[""]]) + extra_token_pos["joint_img_sep"].append(token_count) + token_count += 1 + + token_seq.extend([self.img_token_id] * source["length"][1]) + extra_token_pos["_start"].append(token_count) + extra_token_pos["_start"].append(token_count) + token_count += source["length"][1] + extra_token_pos["_end"].append(token_count - 1) + extra_token_pos["_end"].append(token_count - 1) + extra_token_pos["_end"].append(token_count - 1) + + token_seq.extend([self.eoi_token_id]) + extra_token_pos["eoi"].append(token_count) + token_count += 1 # + + else: + raise ValueError(f"Not supported key: {key}") + index_indicator[key] += 1 + + if add_eos is True and not drop_last_break: + # Typically used for t2i task. + token_seq.append(self.eos_token_id) + extra_token_pos["eos"].append(token_count) + token_count += 1 + elif add_eos == "auto" and not drop_last_break: + # Typically used for lm and mmu task. + if token_seq[-1] != self.eos_token_id and (total_length is None or token_count < total_length): + token_seq.append(self.eos_token_id) + extra_token_pos["eos"].append(token_count) + token_count += 1 + + if total_length: + # Check token count and clip sequence if necessary + if token_count > total_length and drop_last: + # Assert clip position is not in the middle of the block-wise tokens (gen_image, joint_image) + for start_key, end_key in [ + ("_start", "_end"), + ("_start", "_end"), + ("_start", "_end"), + ("_start", "_end"), + ]: + if start_key in extra_token_pos and end_key in extra_token_pos: + assert all( + (start > total_length or end + 1 < total_length) + for start, end in zip(extra_token_pos[start_key], extra_token_pos[end_key]) + ), ( + "Clip position should not be in the middle of the image tokens.\n" + f"Below is the text:\n{self._shorten_text(self.tokenizer.decode(token_seq))}" + ) + token_seq = token_seq[:total_length] + + # Pad the sequence if necessary + pad_num = max(0, total_length - len(token_seq)) + if add_pad and pad_num: + token_seq.extend([self.pad_token_id] * pad_num) + extra_token_pos["first_pad"].append(token_count) + + return token_seq, extra_token_pos + + def batch_gen_infer( + self, + infer_fn, + prompt_list: list, + negative_prompt_list: list | None = None, + infer_fn_kwargs_list: list[dict[str, int]] | None = None, + do_classifier_free_guidance=False, + condition_repeat_times: int = 1, + uncondition_repeat_times: int = 1, + ): + r""" + Batch inference for the AR-like model training of the text-to-image/instruction tuning tasks. + + Args: + infer_fn (`callable`): + Inference function to encode the prompt. + prompt_list (`list`): + List of prompts. Each element can be a single prompt or a list of prompts passed to the infer_fn. + negative_prompt_list (`list`, *optional*): + List of negative prompts. Only used when do_classifier_free_guidance is True. If None, will use + token sequence as negative prompt. + infer_fn_kwargs_list (`List[Dict[str, int]]`, *optional*): + List of keyword arguments for the infer_fn. + do_classifier_free_guidance (`bool`): + Whether to do classifier-free guidance. + condition_repeat_times (`int`): + Support multi-condition. + uncondition_repeat_times (`int`): + Support multi-uncondition. + """ + if infer_fn_kwargs_list is None: + infer_fn_kwargs_list = [{} for _ in prompt_list] + + # [n_output, bsz] + cond_results_list = None + uncond_results_list = None + output_type_list = [] + + for prompt_idx, (prompt, infer_fn_kwargs) in enumerate(zip(prompt_list, infer_fn_kwargs_list)): + if not isinstance(prompt, (list, tuple)): + prompt = [prompt] + cond_kwargs = {"uncond_p": 0.0} if do_classifier_free_guidance else {} + results = infer_fn( + *prompt, + **infer_fn_kwargs, + **cond_kwargs, + ) + output_type_list.append((type(results), len(results) if isinstance(results, (list, tuple)) else 1)) + if isinstance(results, dict): + raise ValueError("Make batch on dict is not supported. Please return list or tuple for infer_fn.") + if not isinstance(results, (list, tuple)): + results = (results,) + if cond_results_list is None: + cond_results_list = [[] for _ in results] + uncond_results_list = [[] for _ in results] + for i, result in enumerate(results): + cond_results_list[i].append(result) + + if do_classifier_free_guidance: + if negative_prompt_list is None: + uncond_kwargs = {"uncond_p": 1.0} + uncond_results = infer_fn( + *prompt, + **infer_fn_kwargs, + **uncond_kwargs, + ) + else: + negative_prompt = negative_prompt_list[prompt_idx] + if not isinstance(negative_prompt, (list, tuple)): + negative_prompt = [negative_prompt] + uncond_results = infer_fn( + *negative_prompt, + **infer_fn_kwargs, + ) + if isinstance(uncond_results, TokenizerEncodeOutput): + uncond_results_list.append(uncond_results) + else: + for i, result in enumerate(uncond_results): + uncond_results_list[i].append(result) + + assert all(output_type_list[0] == n for n in output_type_list), ( + f"Number of outputs should be equal for all samples, but got {output_type_list}." + ) + output_type, output_num = output_type_list[0] + + def make_batch(batch_cond_item, batch_uncond_item): + # Process each output item to make batch + first = batch_cond_item[0] # The first element in the batch + if isinstance(first, torch.Tensor): + stacked_item = torch.stack( + self.pad( + batch_cond_item * condition_repeat_times + batch_uncond_item * uncondition_repeat_times, + ) + ) + + elif first is None: + assert all(item is None for item in batch_cond_item + batch_uncond_item), ( + f"The first cond item is None, but some items are not None:\n\n" + f"condition: {batch_cond_item}\n\n" + f"uncondition: {batch_uncond_item}" + ) + stacked_item = None + + elif isinstance(first, (list, tuple)): + # If the output item is a list or tuple, we treat it as a whole, and won't make nested batch any more. + stacked_item = batch_cond_item * condition_repeat_times + batch_uncond_item * uncondition_repeat_times + + elif isinstance(first, TokenizerEncodeOutput): + stacked_item = {} + # Traverse not-None attributes + for key in list(first.keys()): + merged_list = [cond_item[key] for cond_item in batch_cond_item] * condition_repeat_times + [ + uncond_item[key] for uncond_item in batch_uncond_item + ] * uncondition_repeat_times + if isinstance(first[key], torch.Tensor): + if "mask" in key: + pad_val = 0.0 + elif key == "tokens": + pad_val = self.special_token_map[""] + else: + pad_val = False # Should not pad for other tensors + stacked_item[key] = torch.stack(self.pad(merged_list, pad_val=pad_val), dim=0) + elif isinstance(first[key], list): + stacked_item[key] = merged_list + elif first[key] is None: + pass + else: + raise ValueError(f"Unsupported type of {key}: {type(first[key])}.") + stacked_item = TokenizerEncodeOutput(stacked_item) + + else: + raise TypeError(f"Making batch on type {type(first)} is not supported.") + + return stacked_item + + stacked_outputs = [] + for cond_results, uncond_results in zip(cond_results_list, uncond_results_list): + stacked_outputs.append(make_batch(cond_results, uncond_results)) + + if output_type is list: + return stacked_outputs + elif output_type is tuple: + return tuple(stacked_outputs) + elif output_num == 1: + return stacked_outputs[0] + else: + raise ValueError(f"Unsupported output type: {output_type}.") + + @staticmethod + def parse_extra_token_pos(extra_token_pos, prefix, tokens, rng=None): + if rng is None: + rng = slice(None) + image_slices = ( + [ + slice(start, end + 1) + for start, end in zip( + extra_token_pos[f"<{prefix}>_start"][rng], extra_token_pos[f"<{prefix}>_end"][rng] + ) + ] + if f"<{prefix}>_start" in extra_token_pos and f"<{prefix}>_end" in extra_token_pos + else [] + ) + if image_slices: + image_mask = torch.zeros_like(tokens, dtype=torch.bool) + for image_slice in image_slices: + image_mask[image_slice] = True + else: + image_mask = None + return image_slices, image_mask + + def encode_general( + self, + sections: list[dict[str, Any]] | None = None, + max_token_length: int | None = None, + add_eos="auto", + use_text_mask=True, + add_pad="auto", + add_bos=True, + drop_last="auto", + ) -> TokenizerEncodeOutput: + r""" + General encode function to encode a sequence with multiple sections of text and images. + Each section is a dict with a `type` key and other keys depending on the type. + + Supported section types: + + - text: dict with keys: + - text (`str` or `List[int]`): Text to be encoded. Either `text` or `tokens` should be provided. + - tokens (`List[int]`): Pre-encoded text tokens. Either `text` or `tokens` should be provided. + - uncond_enabled (`bool`): Whether to enable uncondition for this text section. + - uncond_p (`float`): Probability to drop the text section for uncondition. + - max_length (`int`): Maximum length of the text section. + - ignore (`bool`): Whether to ignore this text section in the text mask. + - start_offset (`int`): Start offset of the text mask. + - end_offset (`int`): End offset of the text mask. + + - gen_image: dict with keys: + - token_length (`int`): Number of image tokens. + - add_timestep_token (`bool`): Whether to add timestep token before the image tokens. + - add_guidance_token (`bool`): Whether to add guidance token before the image tokens. + - use_front_boi_token (`bool`): Whether to put the token. + - add_image_shape_token (`bool`): Whether to add image shape token before the image tokens. + - base_size (`int`): Base size of the image. + - ratio_idx (`int`): Ratio index of the image. + + - joint_image: dict with keys: + - token_length (`List[int]`): Number of image tokens for the two images. + - add_timestep_token (`bool`): Whether to add timestep token before the image tokens. + - use_front_boi_token (`bool`): Whether to put the token. + - add_image_shape_token (`bool`): Whether to add image shape token before the image tokens. + - base_size (`int`): Base size of the image. + - ratio_idx (`int`): Ratio index of the image. + + Args: + sections (`List[Dict[str, Any]]`): + List of sections to be encoded. + max_token_length (`int`): + Maximum length of the encoded token sequence. + add_eos (`bool` or `'auto'`): + Whether to add eos token at the end of the sequence. + use_text_mask (`bool`): + Whether to generate text mask. + add_pad (`bool` or `'auto'`): + Whether to add padding tokens to the sequence. If True and total_length is not reached, + add padding tokens. + add_bos (`bool`): + Whether to add bos token at the beginning of the sequence. + drop_last (`bool` or `'auto'`): + - If auto, drop last tokens exceeding the total_length if the total_length is provided. + If cut point is in the middle of the image tokens, an error will raised. + - If True, drop last tokens exceeding the total_length. If cut point is in the + middle of the image tokens, all the successive image tokens will be dropped. + - If False, keep the last tokens exceeding the total_length, even if the total_length + is reached. + + Returns: + `TokenizerEncodeOutput`: Encoded token sequence and extra information. + """ + if sections is None: + raise ValueError("sections must be provided.") + template = "-".join([section["type"] for section in sections]) + + sections = deepcopy(sections) + token_source = defaultdict(list) + text_mask_specs = [] + for section in sections: + if section["type"] == "text": + text = self.encode_text( + section["text"] if "text" in section else section["tokens"], + uncond_enabled=section.get("uncond_enabled"), + uncond_p=section.get("uncond_p"), + max_length=section.get("max_length"), + ) + token_source["text"].append(text) + text_mask_specs.append( + dict( + ignore=section.get("ignore", False), + start_offset=section.get("start_offset", 0), + end_offset=section.get("end_offset", 0), + ) + ) + elif section["type"] == "gen_image": + token_source["gen_image"].append( + dict( + length=section["token_length"], + timestep=section.get("add_timestep_token", False), + guidance=section.get("add_guidance_token", False), + front_boi=section.get("use_front_boi_token", False), + image_shape=section.get("add_image_shape_token", False), + base_size=section.get("base_size"), + ratio_idx=section.get("ratio_idx"), + ) + ) + elif section["type"] == "joint_image": + token_source["joint_image"].append( + dict( + length=section["token_length"], + timestep=section.get("add_timestep_token", False), + front_boi=section.get("use_front_boi_token", False), + image_shape=section.get("add_image_shape_token", False), + base_size=section.get("base_size"), + ratio_idx=section.get("ratio_idx"), + ) + ) + else: + raise ValueError(f"Invalid section type: {section['type']}") + + # Combine text and image tokens + full_token_seq, extra_token_pos = self.encode_sequence( + template=template, + token_source=dict(token_source), + total_length=max_token_length, + add_eos=add_eos, + add_pad=add_pad, + add_bos=add_bos, + drop_last=drop_last, + ) + full_seq_token_tensor = torch.tensor(full_token_seq, dtype=torch.long) + + timestep_scatter_index = ( + torch.tensor(extra_token_pos["timestep"], dtype=torch.long) if "timestep" in extra_token_pos else None + ) + guidance_scatter_index = ( + torch.tensor(extra_token_pos["guidance"], dtype=torch.long) if "guidance" in extra_token_pos else None + ) + cond_timestep_scatter_index = ( + torch.tensor(extra_token_pos["cond_timestep"], dtype=torch.long) + if "cond_timestep" in extra_token_pos + else None + ) + gen_timestep_scatter_index = ( + torch.tensor(extra_token_pos["gen_timestep"], dtype=torch.long) + if "gen_timestep" in extra_token_pos + else None + ) + + # Gen image mask + gen_image_slices, gen_image_mask = self.parse_extra_token_pos(extra_token_pos, "img", full_seq_token_tensor) + # Joint image + joint_image_slices, _ = self.parse_extra_token_pos(extra_token_pos, "joint_img", full_seq_token_tensor) + # Conditional vae image + cond_vae_image_slices, cond_vae_image_mask = self.parse_extra_token_pos( + extra_token_pos, "vae_img", full_seq_token_tensor + ) + # Conditional vit image + cond_vit_image_slices, cond_vit_image_mask = self.parse_extra_token_pos( + extra_token_pos, "vit_img", full_seq_token_tensor + ) + # All image slices (gen_image, joint_image) + all_image_slices = ( + [ + slice(start, end + 1) + for start, end in zip(extra_token_pos["_start"], extra_token_pos["_end"]) + ] + if "_start" in extra_token_pos and "_end" in extra_token_pos + else [] + ) + + # Text mask + text_slices = ( + [ + slice(start, end + 1) + for start, end in zip(extra_token_pos["_start"], extra_token_pos["_end"]) + ] + if "_start" in extra_token_pos and "_end" in extra_token_pos + else [] + ) + assert len(text_slices) <= len(text_mask_specs), ( + f"Number of text slices ({len(text_slices)}) should be less than or equal to " + f"number of text mask specs ({len(text_mask_specs)})" + ) + if use_text_mask: + text_mask = torch.zeros_like(full_seq_token_tensor, dtype=torch.float32) + for text_slice, mask_spec in zip(text_slices, text_mask_specs): + if not mask_spec["ignore"]: + real_slice = slice( + text_slice.start + mask_spec["start_offset"], text_slice.stop + mask_spec["end_offset"] + ) + text_mask[real_slice] = 1.0 + else: + text_mask = None + + # real_pos is the first position of the token + real_pos = torch.tensor(extra_token_pos.get("first_pad", [full_seq_token_tensor.shape[0]]), dtype=torch.long) + + return TokenizerEncodeOutput( + tokens=full_seq_token_tensor, + timestep_scatter_index=timestep_scatter_index, + guidance_scatter_index=guidance_scatter_index, + text_slices=text_slices, + gen_image_slices=gen_image_slices, + joint_image_slices=joint_image_slices, + cond_vae_image_slices=cond_vae_image_slices, + cond_vit_image_slices=cond_vit_image_slices, + text_mask=text_mask, + gen_image_mask=gen_image_mask, + cond_vae_image_mask=cond_vae_image_mask, + cond_vit_image_mask=cond_vit_image_mask, + real_pos=real_pos, + all_image_slices=all_image_slices, + cond_timestep_scatter_index=cond_timestep_scatter_index, + gen_timestep_scatter_index=gen_timestep_scatter_index, + ) + + def get_cot_sections(self, cot_text, uncond_kwargs, cot_max_length=None, drop_think=False): + if not cot_text: # None or empty + return [] + if "" in cot_text and "" in cot_text: + before_think_sec = cot_text.split("")[0] + after_think_sec = cot_text.split("")[1] + think_sec = cot_text.split("")[1].split("")[0] + return ( + self.get_cot_sections(before_think_sec, uncond_kwargs, drop_think=drop_think) + + ( + [ + dict(type="text", text=""), + dict(type="text", text=think_sec, max_length=cot_max_length, **uncond_kwargs), + dict(type="text", text=""), + ] + if not drop_think + else [] + ) + + self.get_cot_sections(after_think_sec, uncond_kwargs, drop_think=drop_think) + ) + + if "" in cot_text and "" in cot_text: + before_recaption_sec = cot_text.split("")[0] + after_recaption_sec = cot_text.split("")[1] + recaption_sec = cot_text.split("")[1].split("")[0] + return ( + self.get_cot_sections(before_recaption_sec, uncond_kwargs, drop_think=drop_think) + + [ + dict(type="text", text=""), + dict(type="text", text=recaption_sec, max_length=cot_max_length, **uncond_kwargs), + dict(type="text", text=""), + ] + + self.get_cot_sections(after_recaption_sec, uncond_kwargs, drop_think=drop_think) + ) + + return [ + dict(type="text", text=cot_text, **uncond_kwargs), + ] + + def apply_general_template( + self, + message_list, + max_length=None, + add_assistant_prefix=False, + answer="auto", + bot_task="auto", + sequence_template="instruct", + uncond_p=0.0, + cfg_factor=1, + batchify=False, + image_base_size=1024, + drop_think=False, + ): + # If cfg_factor > 1, we need to repeat the unconditioned part + if batchify: + assert isinstance(message_list[0], list), ( + f"When batchify is True, message_list should be a list of list, but got [{type(message_list[0])}, ...]." + ) + return self.batch_gen_infer( + infer_fn=self.apply_general_template, + prompt_list=[[]], + infer_fn_kwargs_list=[ + dict( + message_list=message_list_i, + max_length=max_length, + add_assistant_prefix=add_assistant_prefix, + answer=answer, + bot_task=bot_task, + sequence_template=sequence_template, + image_base_size=image_base_size, + drop_think=drop_think, + ) + for message_list_i in message_list + ], + do_classifier_free_guidance=cfg_factor > 1, + condition_repeat_times=1, + uncondition_repeat_times=cfg_factor - 1, + ) + + conv = Conversation() + uncond_kwargs = dict(uncond_enabled=uncond_p == 1.0, uncond_p=uncond_p) + + def process_successive_message( + _message_list, _cur_message_idx, role, prefix, suffix, answer_prefix="", answer_suffix="" + ): + _sub_sections = [] + while _cur_message_idx < len(message_list) and _message_list[_cur_message_idx]["role"] == role: + message = _message_list[_cur_message_idx] + if message["type"] == "text": + text = message["content"] + if role == "system": + _sub_sections.append(dict(type="text", text=text)) + elif role == "assistant": + if ("" in text and "" in text) or ( + "" in text and "" in text + ): + _sub_sections.extend(self.get_cot_sections(text, uncond_kwargs, drop_think=drop_think)) + else: + _sub_sections.append(dict(type="text", text=text, **uncond_kwargs)) + else: + _sub_sections.append( + dict(type="text", text=f"{answer_prefix}{text}{answer_suffix}", **uncond_kwargs) + ) + elif message["type"] == "gen_image": + info = message["content"] + assert isinstance(info, ImageInfo), f"Expected ImageInfo, but got {type(info)}" + if role == "assistant": + _sub_sections.append(dict(type="text", text=answer_prefix)) + _sub_sections.append(dict(type=message["type"], **info.meta_info)) + if role == "assistant": + _sub_sections.append(dict(type="text", text=answer_suffix)) + elif message["type"] == "joint_image": + info = message["content"] + assert isinstance(info, JointImageInfo), f"Expected JointImageInfo, but got {type(info)}" + _sub_sections.append(dict(type=message["type"], **info.meta_info)) + else: + raise ValueError(f"Unknown message type: {message['type']}") + _cur_message_idx += 1 + if len(_sub_sections) > 0: + # Add role prefix and suffix + _sub_sections.insert(0, dict(type="text", text=prefix)) + _sub_sections.append(dict(type="text", text=suffix)) + return _sub_sections, _cur_message_idx + + # Define assistant prefix and suffix + if (answer == "auto" and sequence_template == "instruct") or answer is True: + answer_prefix, answer_suffix = "", "" + else: + answer_prefix, answer_suffix = "", "" + if sequence_template == "pretrain": + system_suffix = "" + user_prefix = "" + user_suffix = "" + bot_prefix = "" + bot_suffix = "" + else: + system_suffix = f"{conv.sep}" + user_prefix = f"{conv.roles[0]}: " + user_suffix = f"{conv.sep}" + bot_prefix = f"{conv.roles[1]}: " + bot_suffix = f"{conv.sep}" + + # Process successive user and assistant messages + sections = [] + cur_message_idx = 0 + final_role = None + while cur_message_idx < len(message_list): + # Process successive system messages + sub_sections, cur_message_idx = process_successive_message( + message_list, cur_message_idx, role="system", prefix="", suffix=system_suffix + ) + # Add to the template and sections + sections.extend(sub_sections) + if len(sub_sections) > 0: + final_role = "system" + + # Process successive user messages + sub_sections, cur_message_idx = process_successive_message( + message_list, cur_message_idx, role="user", prefix=user_prefix, suffix=user_suffix + ) + # Add to the template and sections + sections.extend(sub_sections) + if len(sub_sections) > 0: + final_role = "user" + + # Process successive assistant messages + sub_sections, cur_message_idx = process_successive_message( + message_list, + cur_message_idx, + role="assistant", + prefix=bot_prefix, + suffix=bot_suffix, + answer_prefix=answer_prefix, + answer_suffix=answer_suffix, + ) + # Add to the template and sections + sections.extend(sub_sections) + if len(sub_sections) > 0: + final_role = "assistant" + + if add_assistant_prefix: + if final_role == "assistant": + # Avoid adding prefix twice + _bot_prefix = "" + # Remove the final bot_suffix + if len(sections) > 0 and sections[-1]["type"] == "text" and sections[-1]["text"] == bot_suffix: + sections = sections[:-1] + else: + _bot_prefix = bot_prefix + # We can add special tokens for the bot latest message according to different tasks + bot_response_prefix = dict( + auto=_bot_prefix, + image="", + think=f"{_bot_prefix}", + recaption=f"{_bot_prefix}", + img_ratio=f"{_bot_prefix}{answer_prefix}", + )[bot_task] + sections.append(dict(type="text", text=bot_response_prefix)) + + output = self.encode_general( + sections=sections, + use_text_mask=False, + add_eos=False, + add_pad=False, + ) + + if max_length is not None: + if output.tokens.shape[-1] > max_length: + raise ValueError( + f"Encoded token length {output.tokens.shape[-1]} exceeds max_length {max_length}.\n" + f"Please set a larger max_length or check the input messages:\n{message_list}" + ) + + return output, sections + + def apply_chat_template( + self, + batch_prompt: list[str] | None = None, + batch_message_list: list[list[dict[str, Any]]] | None = None, + mode: str = "gen_text", + batch_gen_image_info: list[ImageInfo] | None = None, + batch_cond_image_info: list[JointImageInfo] | list[list[JointImageInfo]] | None = None, + batch_system_prompt: list[str] | None = None, + batch_cot_text: list[str] | None = None, + max_length: int | None = None, + bot_task: str = "auto", # auto/image/think/recaption/img_ratio + image_base_size: int = 1024, + sequence_template: str = "pretrain", + cfg_factor: int = 1, + add_assistant_prefix: bool | None = None, + drop_think: bool = False, + ) -> dict[str, Any]: + assert bot_task in ["image", "auto", "think", "recaption", "img_ratio"], ( + f"bot_task should be one of ['image', 'auto', 'think', 'recaption', 'img_ratio'], but got {bot_task}." + ) + + if batch_message_list is None: + # Simple text-to-image or text-cot-to-image task + batch_size = len(batch_prompt) + + # Batchify inputs + if not isinstance(batch_system_prompt, list): + batch_system_prompt = [batch_system_prompt] * batch_size + if not isinstance(batch_gen_image_info, list): + batch_gen_image_info = [batch_gen_image_info] * batch_size + if batch_cot_text is not None: + assert len(batch_cot_text) == batch_size, ( + f"batch_cot_text should have the same length as batch_size ({batch_size}), " + f"but got {len(batch_cot_text)}." + ) + else: + batch_cot_text = [None] * batch_size + if batch_cond_image_info is not None: + assert len(batch_cond_image_info) == batch_size, ( + f"batch_cond_image_info should have the same length as batch_size ({batch_size}), " + f"but got {len(batch_cond_image_info)}." + ) + batch_cond_image_info = [ + cond_image_info if isinstance(cond_image_info, list) else [cond_image_info] + for cond_image_info in batch_cond_image_info + ] + else: + batch_cond_image_info = [[] for _ in range(batch_size)] + + # Convert single round materials into standard message list + batch_message_list = [] + for prompt, system_prompt, cot_text, gen_image_info, cond_image_info_list in zip( + batch_prompt, + batch_system_prompt, + batch_cot_text, + batch_gen_image_info, + batch_cond_image_info, + ): + message_list = [] + # 1. system prompt section + if system_prompt: + message_list.append(dict(role="system", type="text", content=system_prompt, context_type="str")) + # 2. user inputs sections + # 2.1 image inputs + if len(cond_image_info_list) > 0: + message_list.extend( + [ + dict(role="user", type="joint_image", content=cond_image_info, context_type="image_info") + for cond_image_info in cond_image_info_list + ] + ) + # 2.2 text inputs + message_list.append(dict(role="user", type="text", content=prompt, context_type="str")) + # 3. assistant answer sections + if cot_text is not None: + message_list.append(dict(role="assistant", type="text", content=cot_text, context_type="str")) + if mode == "gen_image": + message_list.append( + dict(role="assistant", type="gen_image", content=gen_image_info, context_type="image_info") + ) + batch_message_list.append(message_list) + + output, sections = self.apply_general_template( + message_list=batch_message_list, + max_length=max_length, + add_assistant_prefix=default(add_assistant_prefix, mode != "gen_image"), + bot_task=bot_task, + sequence_template=sequence_template, + cfg_factor=cfg_factor, + batchify=True, + image_base_size=image_base_size, + drop_think=drop_think, + ) + return dict(output=output, sections=sections) diff --git a/vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_transformer.py b/vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_transformer.py new file mode 100644 index 000000000..adb582741 --- /dev/null +++ b/vllm_omni/diffusion/models/hunyuan_image_3/hunyuan_image_3_transformer.py @@ -0,0 +1,2796 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + +import glob +import inspect +import logging +import math +import os +from collections.abc import Callable, Iterable +from dataclasses import dataclass +from typing import Any, cast + +import numpy as np +import regex as re +import torch +import torch.nn.functional as F +from diffusers.callbacks import MultiPipelineCallbacks, PipelineCallback +from diffusers.image_processor import VaeImageProcessor +from diffusers.pipelines.pipeline_utils import DiffusionPipeline +from diffusers.schedulers.scheduling_utils import SchedulerMixin +from diffusers.utils.outputs import BaseOutput +from diffusers.utils.torch_utils import randn_tensor +from einops import rearrange +from PIL import Image +from safetensors.torch import load_file +from torch import nn +from torchvision import transforms +from transformers import PretrainedConfig, Siglip2ImageProcessorFast +from transformers.cache_utils import Cache +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from vllm.config import CacheConfig +from vllm.distributed import ( + get_tensor_model_parallel_world_size, + tensor_model_parallel_all_reduce, +) +from vllm.model_executor.layers.activation import SiluAndMul +from vllm.model_executor.layers.fused_moe import SharedFusedMoE +from vllm.model_executor.layers.layernorm import RMSNorm +from vllm.model_executor.layers.linear import ( + MergedColumnParallelLinear, + QKVParallelLinear, + ReplicatedLinear, + RowParallelLinear, +) +from vllm.model_executor.layers.quantization import QuantizationConfig +from vllm.model_executor.layers.rotary_embedding import get_rope +from vllm.model_executor.layers.vocab_parallel_embedding import ( + VocabParallelEmbedding, +) +from vllm.model_executor.model_loader.weight_utils import ( + default_weight_loader, + maybe_remap_kv_scale_name, +) +from vllm.model_executor.models.utils import ( + PPMissingLayer, + is_pp_missing_parameter, + make_layers, +) +from vllm.v1.attention.backend import AttentionType + +from vllm_omni.diffusion.attention.layer import Attention +from vllm_omni.diffusion.distributed.parallel_state import get_pp_group +from vllm_omni.diffusion.layers.rope import RotaryEmbedding + +logger = logging.getLogger(__name__) + + +def _is_moe(config: PretrainedConfig) -> bool: + num_experts = getattr(config, "num_experts", None) + if isinstance(num_experts, int): + return num_experts > 1 + if isinstance(num_experts, list) and num_experts: + # Ensure all elements are integers before calling max. + if all(isinstance(e, int) for e in num_experts): + return max(num_experts) > 1 + else: + return False + return False + + +def _get_cla_factor(config: PretrainedConfig) -> int: + if not getattr(config, "use_cla", False): + return 1 + return getattr(config, "cla_share_factor", 1) + + +def retrieve_timesteps( + scheduler, + num_inference_steps: int | None = None, + device: str | torch.device | None = None, + timesteps: list[int] | None = None, + sigmas: list[float] | None = None, + **kwargs, +) -> tuple[list[int], int]: + """ + Calls the scheduler's `set_timesteps` method and retrieves timesteps from the scheduler after the call. Handles + custom timesteps. Any kwargs will be supplied to `scheduler.set_timesteps`. + + Args: + scheduler (`SchedulerMixin`): + The scheduler to get timesteps from. + num_inference_steps (`int`): + The number of diffusion steps used when generating samples with a pre-trained model. If used, `timesteps` + must be `None`. + device (`str` or `torch.device`, *optional*): + The device to which the timesteps should be moved to. If `None`, the timesteps are not moved. + timesteps (`List[int]`, *optional*): + Custom timesteps used to override the timestep spacing strategy of the scheduler. If `timesteps` is passed, + `num_inference_steps` and `sigmas` must be `None`. + sigmas (`List[float]`, *optional*): + Custom sigmas used to override the timestep spacing strategy of the scheduler. If `sigmas` is passed, + `num_inference_steps` and `timesteps` must be `None`. + + Returns: + `Tuple[torch.Tensor, int]`: A tuple where the first element is the timestep schedule from the scheduler and the + second element is the number of inference steps. + """ + if timesteps is not None and sigmas is not None: + raise ValueError("Only one of `timesteps` or `sigmas` can be passed. Please choose one to set custom values") + if timesteps is not None: + accepts_timesteps = "timesteps" in set(inspect.signature(scheduler.set_timesteps).parameters.keys()) + if not accepts_timesteps: + raise ValueError( + f"The current scheduler class {scheduler.__class__}'s `set_timesteps` does not support custom" + f" timestep schedules. Please check whether you are using the correct scheduler." + ) + scheduler.set_timesteps(timesteps=timesteps, device=device, **kwargs) + timesteps = scheduler.timesteps + num_inference_steps = len(timesteps) + elif sigmas is not None: + accept_sigmas = "sigmas" in set(inspect.signature(scheduler.set_timesteps).parameters.keys()) + if not accept_sigmas: + raise ValueError( + f"The current scheduler class {scheduler.__class__}'s `set_timesteps` does not support custom" + f" sigmas schedules. Please check whether you are using the correct scheduler." + ) + scheduler.set_timesteps(sigmas=sigmas, device=device, **kwargs) + timesteps = scheduler.timesteps + num_inference_steps = len(timesteps) + else: + scheduler.set_timesteps(num_inference_steps, device=device, **kwargs) + timesteps = scheduler.timesteps + return timesteps, num_inference_steps + + +def real_batched_index_select(t, dim, idx): + """index_select for batched index and batched t""" + assert t.ndim >= 2 and idx.ndim >= 2, f"{t.ndim=} {idx.ndim=}" + assert len(t) == len(idx), f"{len(t)=} != {len(idx)=}" + return torch.stack([torch.index_select(t[i], dim - 1, idx[i]) for i in range(len(t))]) + + +def conv_nd(dims, *args, **kwargs): # noqa: N802 + """ + Create a 1D, 2D, or 3D convolution module. + """ + if dims == 1: + return nn.Conv1d(*args, **kwargs) + elif dims == 2: + return nn.Conv2d(*args, **kwargs) + elif dims == 3: + return nn.Conv3d(*args, **kwargs) + raise ValueError(f"unsupported dimensions: {dims}") + + +def normalization(channels, **kwargs): + """ + Make a standard normalization layer. + :param channels: number of input channels. + :return: a nn.Module for normalization. + """ + return nn.GroupNorm(32, channels, **kwargs) + + +def linear(*args, **kwargs): + """ + Create a linear module. + """ + return nn.Linear(*args, **kwargs) + + +def zero_module(module): + """ + Zero out the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().zero_() + return module + + +def _to_tuple(x, dim=2): + if isinstance(x, int): + return (x,) * dim + elif len(x) == dim: + return x + else: + raise ValueError(f"Expected length {dim} or int, but got {x}") + + +def get_meshgrid_nd(start, *args, dim=2): # noqa: N802 + if len(args) == 0: + # start is grid_size + num = _to_tuple(start, dim=dim) + start = (0,) * dim + stop = num + elif len(args) == 1: + # start is start, args[0] is stop, step is 1 + start = _to_tuple(start, dim=dim) + stop = _to_tuple(args[0], dim=dim) + num = [stop[i] - start[i] for i in range(dim)] + # assert num are all integers + num_int = [int(x) for x in num] + assert (torch.tensor(num) == torch.tensor(num_int)).all(), f"num should be int, but got {num}" + num = num_int + elif len(args) == 2: + # start is start, args[0] is stop, args[1] is num + start = _to_tuple(start, dim=dim) # Left-Top eg: 12,0 + stop = _to_tuple(args[0], dim=dim) # Right-Bottom eg: 20,32 + num = _to_tuple(args[1], dim=dim) # Target Size eg: 32,124 + else: + raise ValueError(f"len(args) should be 0, 1 or 2, but got {len(args)}") + + # PyTorch implement of np.linspace(start[i], stop[i], num[i], endpoint=False) + axis_grid = [] + for i in range(dim): + a, b, n = start[i], stop[i], num[i] + g = torch.linspace(a, b, n + 1, dtype=torch.float32)[:n] + axis_grid.append(g) + grid = torch.meshgrid(*axis_grid, indexing="ij") # dim x [H, W] + grid = torch.stack(grid, dim=0) # [dim, H, W] + + return grid + + +def build_2d_rope( + seq_len: int, + n_elem: int, + image_infos: list[tuple[slice, tuple[int, int]]] | None = None, + device: torch.device | None = None, + base: int = 10000, + base_rescale_factor: float = 1.0, + return_all_pos: bool = False, +): + assert n_elem % 4 == 0, f"n_elem must be divisible by 4, but got {n_elem}." + + # theta + if base_rescale_factor != 1.0: + base *= base_rescale_factor ** (n_elem / (n_elem - 2)) + theta = 1.0 / (base ** (torch.arange(0, n_elem, 2, device=device).float() / n_elem)) + theta = theta.reshape(1, n_elem // 4, 2) # [1, half_d, 2] + + # position indices + if image_infos is None: + image_infos = [] + + image_infos_list = [image_infos] + sample_seq_lens = [seq_len] + + # Prepare position indices for each sample + x_sections = [] + y_sections = [] + for sample_id, sample_image_infos in enumerate(image_infos_list): + last_pos = 0 + for sec_slice, (h, w) in sample_image_infos: + L = sec_slice.start # start from 0, so image_slice.start is just L + # previous text + if last_pos < L: + y_sections.append(torch.arange(last_pos, L)) + x_sections.append(torch.arange(last_pos, L)) + elif h is None: + # Interleave data has overlapped positions for tokens. + y_sections.append(torch.arange(sec_slice.start, sec_slice.stop)) + x_sections.append(torch.arange(sec_slice.start, sec_slice.stop)) + continue + else: + # Interleave data has overlapped positions for noised image and the successive clean image, + # leading to last_pos (= last text end L + noise w * h) > L (last text end L). + pass + # current image + beta_y = L + (w * h - h) / 2 + beta_x = L + (w * h - w) / 2 + grid = get_meshgrid_nd((beta_y, beta_x), (beta_y + h, beta_x + w)) # [2, h, w] # noqa: N802 + grid = grid.reshape(2, -1) # (y, x) + y_sections.append(grid[0]) + x_sections.append(grid[1]) + # step + last_pos = L + w * h + # final text + y_sections.append(torch.arange(last_pos, sample_seq_lens[sample_id])) + x_sections.append(torch.arange(last_pos, sample_seq_lens[sample_id])) + + x_pos = torch.cat(x_sections).long() + y_pos = torch.cat(y_sections).long() + # If there are overlap positions, we need to remove them. + x_pos = x_pos[:seq_len] + y_pos = y_pos[:seq_len] + all_pos = torch.stack((y_pos, x_pos), dim=1).unsqueeze(1).to(device) # [seq_len, 1, 2] + + # calc rope + idx_theta = (all_pos * theta).reshape(all_pos.shape[0], n_elem // 2).repeat(1, 1) + + cos = torch.cos(idx_theta) + sin = torch.sin(idx_theta) + + if return_all_pos: + return cos, sin, all_pos + + return cos, sin + + +def build_batch_2d_rope( + seq_len: int, + n_elem: int, + image_infos: list[list[tuple[slice, tuple[int, int]]]] | None = None, + device: torch.device | None = None, + base: int = 10000, + base_rescale_factor: float = 1.0, + return_all_pos: bool = False, +): + cos_list, sin_list, all_pos_list = [], [], [] + if image_infos is None: + image_infos = [None] + for i, image_info in enumerate(image_infos): + res = build_2d_rope( + seq_len, + n_elem, + image_infos=image_info, + device=device, + base=base, + base_rescale_factor=base_rescale_factor, + return_all_pos=return_all_pos, + ) + if isinstance(res, tuple) and len(res) == 3: + cos, sin, all_pos = res + elif isinstance(res, tuple) and len(res) == 2: + cos, sin = res + all_pos = None + else: + raise ValueError( + "build_2d_rope must return a tuple of length 2 or 3 " + f"when return_all_pos={return_all_pos}, got: {type(res)} with length " + f"{len(res) if isinstance(res, tuple) else 'N/A'}" + ) + cos_list.append(cos) + sin_list.append(sin) + all_pos_list.append(all_pos) + stacked_cos = torch.stack(cos_list, dim=0) + stacked_sin = torch.stack(sin_list, dim=0) + if return_all_pos: + return stacked_cos, stacked_sin, all_pos_list + + return stacked_cos, stacked_sin + + +def get_full_state_dict(model_path): + files = glob.glob(os.path.join(model_path, "*.safetensors")) + full_sd = {} + for f in files: + full_sd.update(load_file(f)) + return full_sd + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb( + q, k, cos, sin, position_ids=None, unsqueeze_dim=1, mla=False +) -> tuple[torch.Tensor, torch.Tensor]: + r""" + Applies Rotary Position Embedding to the query and key tensors. + + Args: + q (`torch.Tensor`): + The query tensor. + k (`torch.Tensor`): + The key tensor. + cos (`torch.Tensor`): + The cosine part of the rotary embedding. + sin (`torch.Tensor`): + The sine part of the rotary embedding. + position_ids (`torch.Tensor`): + The position indices of the tokens corresponding to the query and key tensors. For example, this can be + used to pass offsetted position ids when working with a KV-cache. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and + sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + + Returns: + `Tuple[torch.Tensor, torch.Tensor]`: + A tuple comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + if position_ids is not None: + cos = cos[position_ids] + sin = sin[position_ids] + + cos = cos.unsqueeze(unsqueeze_dim) + sin = sin.unsqueeze(unsqueeze_dim) + + if mla: + b, h, s, d = q.shape + q = q.reshape(b, h, s, d // 2, 2).transpose(4, 3).reshape(b, h, s, d) + + b, h, s, d = k.shape + k = k.reshape(b, h, s, d // 2, 2).transpose(4, 3).reshape(b, h, s, d) + + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +def default(value, default_value): + return value if value is not None else default_value + + +class Resolution: + def __init__(self, size, *args): + if isinstance(size, str): + if "x" in size: + size = size.split("x") + size = (int(size[0]), int(size[1])) + else: + size = int(size) + if len(args) > 0: + size = (size, args[0]) + if isinstance(size, int): + size = (size, size) + + self.h = self.height = size[0] + self.w = self.width = size[1] + self.r = self.ratio = self.height / self.width + + def __getitem__(self, idx): + if idx == 0: + return self.h + elif idx == 1: + return self.w + else: + raise IndexError(f"Index {idx} out of range") + + def __str__(self): + return f"{self.h}x{self.w}" + + +class ResolutionGroup: + def __init__(self, base_size=None, step=None, align=1): + self.align = align + self.base_size = base_size + assert base_size % align == 0, f"base_size {base_size} is not divisible by align {align}" + if base_size is not None and not isinstance(base_size, int): + raise ValueError(f"base_size must be None or int, but got {type(base_size)}") + if step is None: + step = base_size // 16 + if step is not None and step > base_size // 2: + raise ValueError(f"step must be smaller than base_size // 2, but got {step} > {base_size // 2}") + + self.step = step + self.data = self._calc_by_step() + + self.ratio = np.array([x.ratio for x in self.data]) + self.attr = ["" for _ in range(len(self.data))] + self.prefix_space = 0 + + def __len__(self): + return len(self.data) + + def __getitem__(self, idx): + return self.data[idx] + + def __repr__(self): + prefix = self.prefix_space * " " + prefix_close = (self.prefix_space - 4) * " " + res_str = f"ResolutionGroup(base_size={self.base_size}, step={self.step}, data=" + attr_maxlen = max([len(x) for x in self.attr] + [5]) + res_str += ( + f"\n{prefix}ID: height width ratio {' ' * max(0, attr_maxlen - 4)}count h/16 w/16 tokens\n{prefix}" + ) + res_str += ("\n" + prefix).join( + [ + f"{i:2d}: ({x.h:4d}, {x.w:4d}) {self.ratio[i]:.4f} {self.attr[i]:>{attr_maxlen}s} " + f"({x.h // 16:3d}, {x.w // 16:3d}) {x.h // 16 * x.w // 16:6d}" + for i, x in enumerate(self.data) + ] + ) + res_str += f"\n{prefix_close})" + return res_str + + def _calc_by_step(self): + assert self.align <= self.step, f"align {self.align} must be smaller than step {self.step}" + + min_height = self.base_size // 2 + min_width = self.base_size // 2 + max_height = self.base_size * 2 + max_width = self.base_size * 2 + + resolutions = [Resolution(self.base_size, self.base_size)] + + cur_height, cur_width = self.base_size, self.base_size + while True: + if cur_height >= max_height and cur_width <= min_width: + break + + cur_height = min(cur_height + self.step, max_height) + cur_width = max(cur_width - self.step, min_width) + resolutions.append(Resolution(cur_height // self.align * self.align, cur_width // self.align * self.align)) + + cur_height, cur_width = self.base_size, self.base_size + while True: + if cur_height <= min_height and cur_width >= max_width: + break + + cur_height = max(cur_height - self.step, min_height) + cur_width = min(cur_width + self.step, max_width) + resolutions.append(Resolution(cur_height // self.align * self.align, cur_width // self.align * self.align)) + + resolutions = sorted(resolutions, key=lambda x: x.ratio) + + return resolutions + + def get_target_size(self, width, height): + ratio = height / width + idx = np.argmin(np.abs(self.ratio - ratio)) + reso = self.data[idx] + return reso.w, reso.h + + def get_base_size_and_ratio_index(self, width, height): + ratio = height / width + idx = np.argmin(np.abs(self.ratio - ratio)) + return self.base_size, idx + + +class ImageInfo: + """Class to store image information for processing and generation.""" + + def __init__( + self, + image_type: str = None, + image_tensor: torch.Tensor = None, + image_width: int = None, + image_height: int = None, + token_width: int = None, + token_height: int = None, + image_token_length: int = None, + base_size: int = None, + ratio_index: int = None, + **kwargs, + ): + self.image_type = image_type + self.image_tensor = image_tensor + self.image_width = image_width + self.w = image_width + self.image_height = image_height + self.h = image_height + self.token_width = token_width + self.tk_w = token_width + self.token_height = token_height + self.tk_h = token_height + self.image_token_length = default( + image_token_length, + token_width * token_height if token_width is not None and token_height is not None else None, + ) + self.base_size = base_size + self.ratio_index = ratio_index + + self.add_timestep_token = kwargs.get("add_timestep_token", True) + self.add_guidance_token = kwargs.get("add_guidance_token", False) + self.use_front_boi_token = kwargs.get("use_front_boi_token", True) + self.add_image_shape_token = kwargs.get("add_image_shape_token", True) + + def __getitem__(self, key: str) -> Any: + """Allow dictionary-like access to attributes.""" + if hasattr(self, key): + return getattr(self, key) + raise KeyError(f"Key '{key}' not found in ImageInfo") + + def __setitem__(self, key: str, value: Any) -> None: + """Allow dictionary-like assignment to attributes.""" + if hasattr(self, key): + setattr(self, key, value) + else: + raise KeyError(f"Key '{key}' not found in ImageInfo") + + def __contains__(self, key: str) -> bool: + """Check if the key exists in the ImageInfo object.""" + return hasattr(self, key) + + def __repr__(self): + return ( + f"ImageInfo(image_type={self.image_type}, image_tensor={self.image_tensor}, " + f"image_width={self.image_width}, image_height={self.image_height}, " + f"token_width={self.token_width}, token_height={self.token_height}, " + f"image_token_length={self.image_token_length}, " + f"base_size={self.base_size}, ratio_index={self.ratio_index}" + ) + + @property + def meta_info(self): + # Used for image sections of tkwrapper.encode_general() + if self.image_type in ["vae", "gen_image"]: + return dict( + token_length=self.image_token_length, + add_timestep_token=self.add_timestep_token, + add_guidance_token=self.add_guidance_token, + use_front_boi_token=self.use_front_boi_token, + add_image_shape_token=self.add_image_shape_token, + base_size=self.base_size, + ratio_idx=self.ratio_index, + # for rope 2d + token_height=self.token_height, + token_width=self.token_width, + # for bc + image_height=self.image_height, + image_width=self.image_width, + ) + else: + raise ValueError(f"Unknown image type '{self.image_type}'") + + +class ImageTensor(torch.Tensor): + # This class is just for type hinting purposes. Attribute `i` should be defined + # as an instance attribute of the torch.Tensor instance, like: tensor.i = ImageInfo(...) + i: ImageInfo + vision_encoder_kwargs: dict + + +class JointImageInfo: + def __init__(self, vae_image_info: ImageInfo, vision_image_info: ImageInfo, vision_encoder_kwargs: dict = None): + self.vae_image_info = vae_image_info + self.vision_image_info = vision_image_info + self.vision_encoder_kwargs = vision_encoder_kwargs + + # Define key attributes to align with ImageInfo for uniformity + self.image_type = "joint_image" + self.image_token_length = vae_image_info.image_token_length + vision_image_info.image_token_length + + self.add_timestep_token = vae_image_info.add_timestep_token + self.use_front_boi_token = vae_image_info.use_front_boi_token + self.add_image_shape_token = vae_image_info.add_image_shape_token + + def __repr__(self): + return f"JointImageInfo(vae_image={self.vae_image_info}, vision_image={self.vision_image_info})" + + @property + def meta_info(self): + # Used for image sections of tkwrapper.encode_general() + return dict( + token_length=[self.vae_image_info.image_token_length, self.vision_image_info.image_token_length], + add_timestep_token=self.add_timestep_token, + use_front_boi_token=self.use_front_boi_token, + add_image_shape_token=self.add_image_shape_token, + base_size=self.vae_image_info.base_size, + ratio_idx=self.vae_image_info.ratio_index, + # for rope 2d + token_height=[self.vae_image_info.token_height, self.vision_image_info.token_height], + token_width=[self.vae_image_info.token_width, self.vision_image_info.token_width], + # for bc + image_height=[self.vae_image_info.image_height, self.vision_image_info.image_height], + image_width=[self.vae_image_info.image_width, self.vision_image_info.image_width], + ) + + @property + def num_special_tokens(self): + return ( + 2 # + + + (1 if self.add_timestep_token else 0) + + (2 if self.add_image_shape_token else 0) + + 1 # + ) + + def copy(self, copy_image_tensor=True): + if copy_image_tensor and ( + self.vae_image_info.image_tensor is None or self.vision_image_info.image_tensor is None + ): + raise ValueError("image_tensor is None, cannot copy") + return JointImageInfo( + self.vae_image_info.copy(copy_image_tensor), + self.vision_image_info.copy(copy_image_tensor), + self.vision_encoder_kwargs, + ) + + def zeros_(self): + self.vae_image_info.zeros_() + self.vision_image_info.zeros_() + + +class JointImage: + def __init__(self, vae_image: ImageTensor, vision_image: ImageTensor): + self.vae_image = vae_image + self.vision_image = vision_image + self.i = JointImageInfo(vae_image.i, vision_image.i) + + +class Config: + def __init__(self, config): + if config is not None: + for key, value in config.items(): + setattr(self, key, value) + + +class LightProjector(nn.Module): + def __init__(self, config): + config = Config(config) + super().__init__() + + if config.projector_type == "linear": + modules = nn.Linear(config.input_dim, config.n_embed) + + elif config.projector_type == "mlp_gelu": + modules = [nn.Linear(config.input_dim, config.n_embed)] + for _ in range(1, config.depth): + modules.append(nn.GELU()) + modules.append(nn.Linear(config.n_embed, config.n_embed)) + modules = nn.Sequential(*modules) + + else: + raise ValueError(f"Unknown projector type: {config.projector_type}") + + self.layers = modules + + +class HunYuanRotary2DEmbedder: + r""" + A RoPE wrapper specifically designed for HunYuan-Image attention. + + This class implements Rotary Position Embedding (RoPE) specifically optimized for + the HunYuan-Image model's attention mechanism. It handles the application of rotary + embeddings to query and key tensors with support for custom position embeddings + and attention metadata. + + Example: + ```python + embedder = HunYuanRotaryEmbedder(num_heads=num_h, num_kv_heads=num_kv, head_dim=h_d) + q, k = embedder(q, k, hidden_states, custom_pos_emb, first_step, attn_meta) + ``` + + Args: + num_heads (`int`): + Number of attention heads in the model. + num_kv_heads (`int`): + Number of key-value heads (for grouped-query attention). + head_dim (`int`): + Dimension of each attention head. + + Methods: + __call__: Applies rotary position embedding to query and key tensors. + """ + + def __init__(self, num_heads: int, num_kv_heads: int, head_dim: int): + self.num_heads = num_heads + self.num_kv_heads = num_kv_heads + self.head_dim = head_dim + self.custom_pos_emb: tuple[torch.Tensor, torch.Tensor] | None = None + self.rope = RotaryEmbedding(is_neox_style=True) + + def _prepare_cos_sin( + self, + custom_pos_emb: tuple[torch.Tensor, torch.Tensor], + first_step: bool, + device: torch.device, + ): + """Returns cos/sin on the target device based on first_step and caching strategy.""" + if first_step: + cos_input, sin_input = custom_pos_emb + cos = cos_input.to(device) + sin = sin_input.to(device) + self.custom_pos_emb = None + else: + if self.custom_pos_emb is None: + cos_input, sin_input = custom_pos_emb + cos = cos_input.to(device) + sin = sin_input.to(device) + self.custom_pos_emb = (cos, sin) + else: + cos, sin = self.custom_pos_emb + return cos, sin + + def __call__( + self, + q: torch.Tensor, + k: torch.Tensor, + hidden_states: torch.Tensor, + custom_pos_emb: tuple[torch.Tensor, torch.Tensor], + **kwargs, + ) -> tuple[torch.Tensor, torch.Tensor]: + hidden_states_shape = hidden_states.shape + hidden_states = hidden_states.reshape(-1, hidden_states_shape[-1]) + if kwargs.get("mode", "gen_text") != "gen_image": + return q, k + + first_step = kwargs.get("first_step", False) + device = q.device + # 1. Prepare cos/sin + cos, sin = self._prepare_cos_sin(custom_pos_emb, first_step, device) + + # 2. Shape validation + query_lens: list[int] = kwargs.get("query_lens") + bs = len(query_lens) + q_len = query_lens[0] + assert hidden_states.shape[0] == bs * q_len, f"{hidden_states.shape[0]} != {bs * q_len}" + + # 3. Reshape + transpose for apply_rotary_pos_emb + # Assume q shape [B*L, H*D] -> [2, L, H, D] -> [2, H, L, D] + q = q.reshape(bs, q_len, self.num_heads, self.head_dim) + k = k.reshape(bs, q_len, self.num_kv_heads, self.head_dim) + + q = self.rope(q.to(torch.float32), cos, sin) + k = self.rope(k.to(torch.float32), cos, sin) + + # 5. Restore original shape + convert to bfloat16 + q = q.reshape(hidden_states.shape[0], self.num_heads * self.head_dim).to(torch.bfloat16) + k = k.reshape(hidden_states.shape[0], self.num_kv_heads * self.head_dim).to(torch.bfloat16) + hidden_states = hidden_states.reshape(hidden_states_shape) + return q, k + + +class ImageKVCacheManager: + """ + Manages specialized caching and updating of KV-Cache for image tokens in multimodal models. + """ + + def __init__(self, image_token_len: int = 4097): + """ + Args: + image_token_len: Number of tokens per image (including special placeholders), + default 4097 (timestamp + 4096 image tokens). + """ + self.image_token_len: int = image_token_len + self.image_kv_cache: tuple[torch.Tensor, torch.Tensor] = None + + def _save_image_kv_caches( + self, + key: torch.Tensor, + value: torch.Tensor, + seq_len: int, + ) -> None: + bs, q_len, num_kv_heads, head_dim = key.shape + assert q_len == seq_len, f"for first-step, {q_len} != {seq_len}" + + key = key.reshape(-1, num_kv_heads, head_dim) + value = value.reshape(-1, num_kv_heads, head_dim) + + cached_prompt_len = seq_len - self.image_token_len - 1 + cached_key = [key[:cached_prompt_len], key[seq_len - 1 : seq_len]] + cached_value = [value[:cached_prompt_len], value[seq_len - 1 : seq_len]] + + if bs > 1: + assert bs == 2, "for cfg case, bs must be 2" + cached_key.append(key[seq_len : seq_len + cached_prompt_len]) + cached_key.append(key[-1:]) + + cached_value.append(value[seq_len : seq_len + cached_prompt_len]) + cached_value.append(value[-1:]) + + cached_key = torch.cat(cached_key, dim=0) + cached_value = torch.cat(cached_value, dim=0) + self.image_kv_cache_map = (cached_key, cached_value) + + def _update_image_kv_caches( + self, + key: torch.Tensor, + value: torch.Tensor, + seq_len: int, + ) -> tuple[torch.Tensor, torch.Tensor]: + cached_key, cached_value = self.image_kv_cache_map + bs, q_len, num_kv_heads, head_dim = key.shape + + cached_prompt_len = cached_key.shape[0] // bs - 1 + assert (cached_prompt_len + 1) == (seq_len - q_len), f"{cached_prompt_len + 1} != {seq_len - q_len}" + + key = key.reshape(-1, num_kv_heads, head_dim) + value = value.reshape(-1, num_kv_heads, head_dim) + + new_key = [ + cached_key[:cached_prompt_len], + key[:q_len], + cached_key[cached_prompt_len : cached_prompt_len + 1], + ] + new_value = [ + cached_value[:cached_prompt_len], + value[:q_len], + cached_value[cached_prompt_len : cached_prompt_len + 1], + ] + + if bs > 1: + assert bs == 2, "for cfg case, bs must be 2" + new_key.append(cached_key[cached_prompt_len + 1 : cached_prompt_len + 1 + cached_prompt_len]) + new_key.append(key[q_len:]) + new_key.append(cached_key[-1:]) + + new_value.append(cached_value[cached_prompt_len + 1 : cached_prompt_len + 1 + cached_prompt_len]) + new_value.append(value[q_len:]) + new_value.append(cached_value[-1:]) + + new_key = torch.cat(new_key, dim=0) + new_value = torch.cat(new_value, dim=0) + new_key = new_key.reshape(bs, seq_len, num_kv_heads, head_dim) + new_value = new_value.reshape(bs, seq_len, num_kv_heads, head_dim) + + return new_key.contiguous(), new_value.contiguous() + + def __call__( + self, + query: torch.Tensor, + key: torch.Tensor, + value: torch.Tensor, + attention_mask: torch.Tensor | None = None, + **kwargs, + ) -> torch.Tensor: + self.image_token_len = kwargs.get("num_image_tokens") + first_step = kwargs.get("first_step") + + query_lens = kwargs.get("query_lens") + seq_lens = kwargs.get("seq_lens") + bs = len(query_lens) + q_len = query_lens[0] + seq_len = seq_lens[0] + assert query.shape[0] == bs * q_len, f"{query.shape[0]} != {bs * q_len}" + + head_num_per_rank = query.shape[1] + kv_head_num_per_rank = key.shape[1] + repeat_num = head_num_per_rank // kv_head_num_per_rank + head_dim = query.shape[2] + + query = query.reshape(bs, q_len, head_num_per_rank, head_dim) + key = key.reshape(bs, q_len, kv_head_num_per_rank, head_dim) + value = value.reshape(bs, q_len, kv_head_num_per_rank, head_dim) + + if first_step: + self.image_kv_cache_map = None + self._save_image_kv_caches(key, value, seq_len) + else: + key, value = self._update_image_kv_caches(key, value, seq_len) + + query = query.transpose(1, 2).contiguous() + key = key.transpose(1, 2).contiguous() + value = value.transpose(1, 2).contiguous() + + key = repeat_kv(key, repeat_num) + value = repeat_kv(value, repeat_num) + + attention_mask = attention_mask.contiguous() + + attn_output = F.scaled_dot_product_attention(query, key, value, attn_mask=attention_mask, dropout_p=0.0) + + attn_output = attn_output.transpose(1, 2).contiguous() # [bs, q_len, heads, head_dim] + attn_output = attn_output.reshape(bs * q_len, head_num_per_rank, head_dim) + return attn_output + + +@dataclass +class CausalMMOutputWithPast(CausalLMOutputWithPast): + diffusion_prediction: torch.Tensor | None = None + + +class HunyuanImage3Config(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`HunyuanImage3Model`]. It is used to instantiate + an Hunyuan model according to the specified arguments, defining the model architecture. Instantiating a + configuration with the defaults will yield a similar configuration to that of the Hunyuan-7B. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 32000): + Vocabulary size of the Hunyuan Image 3 model. Defines the number of different tokens that can be + represented by the `inputs_ids` passed when calling [`HunyuanImage3Model`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 11008): + Dimension of the MLP representations or shared MLP representations. + moe_intermediate_size (`int` or `List`, *optional*, defaults to 11008): + Dimension of the MLP representations in MoE. Use a list if you want a different size per layer. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer decoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer decoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 2048): + The maximum sequence length that this model might ever be used with. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-06): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + pad_token_id (`int`, *optional*): + Padding token id. + bos_token_id (`int`, *optional*, defaults to 1): + Beginning of stream token id. + eos_token_id (`int`, *optional*, defaults to 2): + End of stream token id. + pretraining_tp (`int`, *optional*, defaults to 1): + Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this + document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is + necessary to ensure exact reproducibility of the pretraining results. Please refer to [this + issue](https://github.com/pytorch/pytorch/issues/76232). + tie_word_embeddings (`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_theta (`float`, *optional*, defaults to 10000.0): + The base period of the RoPE embeddings. + rope_scaling (`Dict`, *optional*): + Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports two scaling + strategies: linear and dynamic. Their scaling factor must be a float greater than 1. The expected format is + `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update + `max_position_embeddings` to the expected new maximum. See the following thread for more information on how + these scaling strategies behave: + https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an + experimental feature, subject to breaking API changes in future versions. + attention_bias (`bool`, defaults to `False`, *optional*, defaults to `False`): + Whether to use a bias in the query, key, value and output projection layers during self-attention. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio for the attention probabilities. + use_qk_norm (`bool`, *optional*, defaults to `False`): + Whether query and key in attention use norm + use_cla (`bool`, *optional*, defaults to `False`): + Whether to use CLA in attention + cla_share_factor (`int`, *optional*, defaults to 1): + The share factor of CLA + num_experts (`int` or `List`, *optional*, defaults to 1): + The number of experts for moe. If it is a list, it will be used as the number of experts for each layer. + num_shared_expert (`int` or `List`, *optional*, defaults to 1): + The number of shared experts for moe. If it is a list, it will be used as the number of shared experts + for each layer. + moe_topk (`int` or `List`, *optional*, defaults to 1): + The topk value for moe. If it is a list, it will be used as the topk value for each layer. + capacity_factor (Not used) (`float` or `List`, *optional*, defaults to 1.0): + The capacity factor for moe. If it is a list, it will be used as the capacity factor for each layer. + moe_layer_num_skipped (`int`, *optional*, defaults to 0): + First moe_layer_num_skipped layers do not use MoE. + """ + + model_type = "Hunyuan" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=290943, + hidden_size=4096, + intermediate_size: int = 11008, + moe_intermediate_size: int | list = None, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + attention_head_dim=None, + hidden_act="silu", + max_position_embeddings=2048, + initializer_range=0.02, + rms_norm_eps=1e-5, + use_cache=True, + pad_token_id=0, + bos_token_id=1, + eos_token_id=2, + eod_token_id=3, + im_start_id=4, + im_end_id=5, + text_start_id=6, + text_end_id=7, + image_token_id=8, + video_start_id=9, + video_end_id=10, + im_newline_id=11, + mask_init_id=12, + pretraining_tp=1, + tie_word_embeddings=False, + rope_theta=10000.0, + rope_scaling=None, + attention_bias=False, + mlp_bias=False, + attention_dropout=0.0, + use_qk_norm=False, + use_rotary_pos_emb=True, + use_cla=False, + cla_share_factor=1, + norm_type="hf_rms", + num_experts: int | list = 1, + use_mixed_mlp_moe=False, + num_shared_expert: int | list = 1, + moe_topk: int | list = 1, + capacity_factor: float | list = 1.0, + moe_drop_tokens=False, + moe_random_routing_dropped_token=False, + use_mla=False, + kv_lora_rank=512, + q_lora_rank=1536, + qk_rope_head_dim=64, + v_head_dim=128, + qk_nope_head_dim=128, + moe_layer_num_skipped=0, + norm_topk_prob=True, + routed_scaling_factor=1.0, + group_limited_greedy=False, + n_group=None, + topk_group=None, + add_classification_head=False, + class_num=0, + pool_type="last", + pad_id=-1, + # Added + moe_impl="eager", + vae_downsample_factor=(16, 16), # (h, w) + img_proj_type="unet", + patch_size=1, + patch_embed_hidden_dim=1024, + image_base_size=1024, + vae=None, + vit=None, + vit_processor=None, + vit_aligner=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.moe_intermediate_size = moe_intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.moe_impl = moe_impl + self.num_experts = num_experts + self.use_mixed_mlp_moe = use_mixed_mlp_moe + self.num_shared_expert = num_shared_expert + self.moe_topk = moe_topk + self.capacity_factor = capacity_factor + self.moe_drop_tokens = moe_drop_tokens + self.moe_random_routing_dropped_token = moe_random_routing_dropped_token + + if attention_head_dim is not None: + self.attention_head_dim = attention_head_dim + else: + self.attention_head_dim = self.hidden_size // num_attention_heads + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.pretraining_tp = pretraining_tp + self.use_cache = use_cache + self.rope_theta = rope_theta + self.rope_scaling = rope_scaling + self.attention_bias = attention_bias + self.mlp_bias = mlp_bias + self.attention_dropout = attention_dropout + self.use_qk_norm = use_qk_norm + self.use_rotary_pos_emb = use_rotary_pos_emb + self.use_cla = use_cla + self.cla_share_factor = cla_share_factor + self.norm_type = norm_type + # MLA args + self.use_mla = use_mla + self.kv_lora_rank = kv_lora_rank + self.q_lora_rank = q_lora_rank + self.qk_rope_head_dim = qk_rope_head_dim + self.qk_nope_head_dim = qk_nope_head_dim + self.v_head_dim = v_head_dim + + # DeepSeek related args + self.moe_layer_num_skipped = moe_layer_num_skipped + self.norm_topk_prob = norm_topk_prob + self.routed_scaling_factor = routed_scaling_factor + self.group_limited_greedy = group_limited_greedy + self.n_group = n_group + self.topk_group = topk_group + self.add_classification_head = add_classification_head + self.class_num = class_num + self.pool_type = pool_type + self.pad_id = pad_id + + if self.class_num is not None: + self.dense_list = [self.hidden_size, self.class_num] + + # ViT args + self.vit = vit + self.vit_processor = vit_processor + self.vit_aligner = vit_aligner + + # Image Gen args + self.vae = vae + self.vae_downsample_factor = vae_downsample_factor + self.img_proj_type = img_proj_type + self.patch_size = patch_size + self.patch_embed_hidden_dim = patch_embed_hidden_dim + self.image_base_size = image_base_size + + # token id + self.eod_token_id = eod_token_id + self.im_start_id = im_start_id + self.im_end_id = im_end_id + self.text_start_id = text_start_id + self.text_end_id = text_end_id + self.image_token_id = image_token_id + self.video_start_id = video_start_id + self.video_end_id = video_end_id + self.im_newline_id = im_newline_id + self.mask_init_id = mask_init_id + + super().__init__( + pad_token_id=pad_token_id, + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + +class HunyuanImage3ImageProcessor: + def __init__(self, config): + self.config = config + + self.reso_group = ResolutionGroup(base_size=config.image_base_size) + self.vae_processor = transforms.Compose( + [ + transforms.ToTensor(), + transforms.Normalize([0.5], [0.5]), # transform to [-1, 1] + ] + ) + self.vision_encoder_processor = Siglip2ImageProcessorFast.from_dict(config.vit_processor) + + def build_image_info(self, image_size): + # parse image size (HxW, H:W, or ) + if isinstance(image_size, str): + if image_size.startswith("")) + reso = self.reso_group[ratio_index] + image_size = reso.height, reso.width + elif "x" in image_size: + image_size = [int(s) for s in image_size.split("x")] + elif ":" in image_size: + image_size = [int(s) for s in image_size.split(":")] + else: + raise ValueError( + f"`image_size` should be in the format of 'HxW', 'H:W' or , got {image_size}." + ) + assert len(image_size) == 2, f"`image_size` should be in the format of 'HxW', got {image_size}." + elif isinstance(image_size, (list, tuple)): + assert len(image_size) == 2 and all(isinstance(s, int) for s in image_size), ( + f"`image_size` should be a tuple of two integers or a string in the format of 'HxW', got {image_size}." + ) + else: + raise ValueError( + f"`image_size` should be a tuple of two integers or a string in the format of 'WxH', got {image_size}." + ) + image_width, image_height = self.reso_group.get_target_size(image_size[1], image_size[0]) + token_height = image_height // (self.config.vae_downsample_factor[0] * self.config.patch_size) + token_width = image_width // (self.config.vae_downsample_factor[1] * self.config.patch_size) + base_size, ratio_idx = self.reso_group.get_base_size_and_ratio_index(image_size[1], image_size[0]) + image_info = ImageInfo( + image_type="gen_image", + image_width=image_width, + image_height=image_height, + token_width=token_width, + token_height=token_height, + base_size=base_size, + ratio_index=ratio_idx, + ) + return image_info + + +class HunYuanMLP(nn.Module): + def __init__( + self, + hidden_size: int, + intermediate_size: int, + hidden_act: str, + quant_config: QuantizationConfig | None = None, + bias: bool = False, + prefix: str = "", + reduce_results: bool = True, + ) -> None: + super().__init__() + self.gate_up_proj = MergedColumnParallelLinear( + input_size=hidden_size, + output_sizes=[intermediate_size] * 2, + bias=bias, + quant_config=quant_config, + prefix=f"{prefix}.gate_up_proj", + ) + self.down_proj = RowParallelLinear( + input_size=intermediate_size, + output_size=hidden_size, + bias=bias, + quant_config=quant_config, + prefix=f"{prefix}.down_proj", + reduce_results=reduce_results, + ) + if hidden_act != "silu": + raise ValueError(f"Unsupported activation: {hidden_act}. Only silu is supported for now.") + self.act_fn = SiluAndMul() + + def forward(self, x): + gate_up, _ = self.gate_up_proj(x) + x = self.act_fn(gate_up) + x, _ = self.down_proj(x) + return x + + +class HunYuanSparseMoeBlock(nn.Module): + def __init__( + self, + config: PretrainedConfig, + quant_config: QuantizationConfig | None = None, + layer_id: int = -1, + prefix: str = "", + enable_eplb: bool = False, + ): + super().__init__() + self.tp_size = get_tensor_model_parallel_world_size() + self.n_routed_experts = config.num_experts + + if self.tp_size > config.num_experts: + raise ValueError( + f"Tensor parallel size {self.tp_size} is greater than the number of experts {config.num_experts}." + ) + + # Get layer_id topk if config.moe_topk is a list + if isinstance(config.moe_topk, list): + assert layer_id >= 0 + assert len(config.moe_topk) > layer_id + top_k = config.moe_topk[layer_id] + else: + top_k = config.moe_topk + + # If it is moe, moe_intermediate_size is preferred + intermediate_size = config.intermediate_size + if config.moe_intermediate_size is not None: + intermediate_size = ( + config.moe_intermediate_size + if isinstance(config.moe_intermediate_size, int) + else config.moe_intermediate_size[layer_id] + ) + + self.enable_eplb = False + self.n_logical_experts = self.n_routed_experts + self.n_redundant_experts = 0 + + self.gate = ReplicatedLinear( + config.hidden_size, + config.num_experts, + bias=False, + quant_config=None, + prefix=f"{prefix}.gate", + ) + if config.use_mixed_mlp_moe > 0: + # Get layer_id num_shared_expert if config.num_shared_expert is + # a list. + if isinstance(config.num_shared_expert, list): + assert layer_id >= 0 + assert len(config.num_shared_expert) > layer_id + num_shared_expert = config.num_shared_expert[layer_id] + else: + num_shared_expert = config.num_shared_expert + + self.shared_mlp = HunYuanMLP( + hidden_size=config.hidden_size, + intermediate_size=config.intermediate_size * num_shared_expert, + hidden_act=config.hidden_act, + quant_config=quant_config, + reduce_results=False, + prefix=f"{prefix}.shared_mlp", + ) + else: + self.shared_mlp = None + + self.experts = HunyuanFusedMoE( + shared_experts=self.shared_mlp, + num_experts=self.n_routed_experts, + top_k=top_k, + hidden_size=config.hidden_size, + intermediate_size=intermediate_size, + reduce_results=False, + renormalize=top_k > 1, + quant_config=quant_config, + prefix=f"{prefix}.experts", + enable_eplb=self.enable_eplb, + num_redundant_experts=self.n_redundant_experts, + pcp_size=1, + ) + + def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: + # NOTE: hidden_states can have either 1D or 2D shape. + orig_shape = hidden_states.shape + hidden_dim = hidden_states.shape[-1] + hidden_states = hidden_states.view(-1, hidden_dim) + + # router_logits: (num_tokens, n_experts) + router_logits, _ = self.gate(hidden_states) + final_hidden_states = self.experts(hidden_states=hidden_states, router_logits=router_logits) + if self.shared_mlp is not None: + final_hidden_states = final_hidden_states[0] + final_hidden_states[1] + + if self.tp_size > 1: + final_hidden_states = tensor_model_parallel_all_reduce(final_hidden_states) + + return final_hidden_states.view(orig_shape) + + +class HunYuanAttention(nn.Module): + def __init__( + self, + config: PretrainedConfig, + hidden_size: int, + num_heads: int, + num_kv_heads: int, + rope_theta: float = 10000, + rope_scaling: dict[str, Any] | None = None, + max_position_embeddings: int = 8192, + quant_config: QuantizationConfig | None = None, + bias: bool = False, + cache_config: CacheConfig | None = None, + prefix: str = "", + layer_id: int = -1, + ) -> None: + super().__init__() + self.hidden_size = hidden_size + tp_size = get_tensor_model_parallel_world_size() + self.total_num_heads = num_heads + assert self.total_num_heads % tp_size == 0 + self.num_heads = self.total_num_heads // tp_size + self.num_key_value_heads = ( + config.num_key_value_heads // tp_size if config.num_key_value_heads else self.num_heads + ) + self.total_num_kv_heads = num_kv_heads + if self.total_num_kv_heads >= tp_size: + # Number of KV heads is greater than TP size, so we partition + # the KV heads across multiple tensor parallel GPUs. + assert self.total_num_kv_heads % tp_size == 0 + else: + # Number of KV heads is less than TP size, so we replicate + # the KV heads across multiple tensor parallel GPUs. + assert tp_size % self.total_num_kv_heads == 0 + self.num_kv_heads = max(1, self.total_num_kv_heads // tp_size) + + if hasattr(config, "head_dim") and config.head_dim: + self.head_dim = config.head_dim + elif hasattr(config, "attention_head_dim"): + self.head_dim = config.attention_head_dim + else: + self.head_dim = self.hidden_size // self.total_num_heads + self.q_size = self.num_heads * self.head_dim + self.kv_size = self.num_kv_heads * self.head_dim + self.scaling = self.head_dim**-0.5 + self.rope_theta = rope_theta + self.max_position_embeddings = max_position_embeddings + self.use_qk_norm = getattr(config, "use_qk_norm", False) + self.layer_id = layer_id + + self.qkv_proj = QKVParallelLinear( + hidden_size=hidden_size, + head_size=self.head_dim, + total_num_heads=self.total_num_heads, + total_num_kv_heads=self.total_num_kv_heads, + bias=bias, + quant_config=quant_config, + prefix=f"{prefix}.qkv_proj", + ) + + self.o_proj = RowParallelLinear( + input_size=self.total_num_heads * self.head_dim, + output_size=hidden_size, + bias=bias, + quant_config=quant_config, + prefix=f"{prefix}.o_proj", + ) + + if rope_scaling is not None: + # for t2t, fallback rotary_emb type from 'custom' to default. + rope_scaling["rope_type"] = "default" + self.rotary_emb = get_rope( + head_size=self.head_dim, + max_position=max_position_embeddings, + rope_parameters=rope_scaling, + is_neox_style=True, + ) + # which attention, from vllm or omni? + # try use Atten from diffusion + self.attn = Attention( + num_heads=self.num_heads, + head_size=self.head_dim, + causal=False, + softmax_scale=self.scaling, + num_kv_heads=self.num_kv_heads, + # cache_config=cache_config, + # quant_config=quant_config, + prefix=f"{prefix}.attn", + ) + + # default image_token_len = timestamp + 4096*image_tokes + self.image_attn = ImageKVCacheManager(image_token_len=4097) + self.image_rope2d_emb = HunYuanRotary2DEmbedder( + num_heads=self.num_heads, + num_kv_heads=self.num_kv_heads, + head_dim=self.head_dim, + ) + + if self.use_qk_norm: + self.query_layernorm = RMSNorm(self.head_dim, eps=config.rms_norm_eps) + self.key_layernorm = RMSNorm(self.head_dim, eps=config.rms_norm_eps) + + def forward( + self, + positions: torch.Tensor, + hidden_states: torch.Tensor, + kv_states: tuple[torch.Tensor] | None = None, + attention_mask: torch.Tensor | None = None, + custom_pos_emb: tuple[torch.FloatTensor] | None = None, + **kwargs, + ) -> torch.Tensor: + bsz, q_len, _ = hidden_states.size() + qkv, _ = self.qkv_proj(hidden_states) + q, k, v = qkv.split([self.q_size, self.kv_size, self.kv_size], dim=-1) + + past_key_value: Cache | None = kwargs.get("past_key_value", None) + if past_key_value is not None: + position_ids = kwargs.get("position_ids") + key_states = k.reshape(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = v.reshape(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + cache_kwargs = {"cache_position": position_ids} + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_id, cache_kwargs) + # for image_generation + if kwargs.get("mode", "gen_text") == "gen_image": + # assert positions is None, "positions should be None for image attention" + q, k = self.image_rope2d_emb(q, k, hidden_states, custom_pos_emb, **kwargs) + else: + q, k = self.rotary_emb(positions, q, k) + if self.use_qk_norm: + q = self.query_layernorm(q.view(-1, self.num_heads, self.head_dim).contiguous()) + k = self.key_layernorm(k.view(-1, self.num_kv_heads, self.head_dim).contiguous()) + # for image_generation + if kwargs.get("mode", "gen_text") == "gen_image": + attn_output = self.image_attn(q, k, v, attention_mask=attention_mask, **kwargs) + else: + attn_output = self.attn(q, k, v) + # For o_proj + attn_output = attn_output.view(q.shape[0], -1) + output, _ = self.o_proj(attn_output) + output = output.reshape(bsz, q_len, -1) + return output, None, past_key_value + + +class HunyuanFusedMoE(SharedFusedMoE): + def __init__(self, *, prefix: str = "", **kwargs): + super().__init__(prefix=prefix, **kwargs) + self._prefix = prefix + + self._init_hook_handle = self.register_forward_pre_hook(self._initialize_kernel_hook, with_kwargs=True) + + def _initialize_kernel_hook(self, module, args, kwargs): + if self.quant_method: + self.quant_method.process_weights_after_loading(self) + self._init_hook_handle.remove() + + def forward(self, hidden_states, router_logits): + from vllm.model_executor.layers.fused_moe.layer import get_forward_context + + ctx = get_forward_context() + if not ctx.remaining_moe_layers: + import re + + moe_names = [name for name in ctx.no_compile_layers.keys() if ".mlp.experts" in name] + + def get_layer_num(name): + match = re.search(r"layers\.(\d+)\.mlp", name) + return int(match.group(1)) if match else -1 + + moe_names.sort(key=get_layer_num, reverse=True) + ctx.remaining_moe_layers.extend(moe_names) + return super().forward(hidden_states, router_logits) + + +class HunyuanImage3DecoderLayer(nn.Module): + def __init__(self, config: HunyuanImage3Config, layer_idx: int, prefix: str = ""): + super().__init__() + self.hidden_size = config.hidden_size + self.layer_idx = layer_idx + self.intermediate_size = ( + config.intermediate_size + if isinstance(config.intermediate_size, int) + else config.intermediate_size[layer_idx] + ) + rope_theta = getattr(config, "rope_theta", 10000) + rope_scaling = getattr(config, "rope_scaling", None) + if rope_scaling is not None and getattr(config, "original_max_position_embeddings", None): + rope_scaling["original_max_position_embeddings"] = config.original_max_position_embeddings + max_position_embeddings = getattr(config, "max_position_embeddings", 8192) + attention_bias = getattr(config, "attention_bias", False) or getattr(config, "bias", False) + + cla_factor = _get_cla_factor(config) + attention_type = ( + AttentionType.ENCODER_DECODER if layer_idx >= 0 and layer_idx % cla_factor != 0 else AttentionType.DECODER + ) + if attention_type == AttentionType.DECODER: + self.self_attn = HunYuanAttention( + config=config, + hidden_size=self.hidden_size, + num_heads=config.num_attention_heads, + num_kv_heads=getattr(config, "num_key_value_heads", config.num_attention_heads), + rope_theta=rope_theta, + rope_scaling=rope_scaling, + max_position_embeddings=max_position_embeddings, + quant_config=None, + bias=attention_bias, + cache_config=None, + prefix=f"{prefix}.self_attn", + layer_id=layer_idx, + ) + else: + raise RuntimeError(f"Unsupported attention type: {attention_type}") + + if ( + (isinstance(config.num_experts, int) and config.num_experts > 1) + or (isinstance(config.num_experts, list) and max(config.num_experts) > 1) + ) and layer_idx >= config.moe_layer_num_skipped: + self.mlp = HunYuanSparseMoeBlock(config, layer_id=layer_idx, prefix=f"{prefix}.mlp") + else: + self.mlp = HunYuanMLP(self.hidden_size, self.intermediate_size, config.hidden_act) + + self.input_layernorm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor | None = None, + position_ids: torch.LongTensor | None = None, + past_key_value: tuple[torch.Tensor] | None = None, + output_attentions: bool | None = False, + use_cache: bool | None = False, + custom_pos_emb: tuple[torch.FloatTensor] | None = None, + **kwargs, + ) -> tuple[torch.FloatTensor | Any]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): + attention mask of size `(batch_size, sequence_length)` if flash attention is used or `(batch_size, 1, + query_sequence_length, key_sequence_length)` if default attention is used. + position_ids (`torch.LongTensor`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + custom_pos_emb (`Tuple[torch.FloatTensor]`, *optional*): custom position embedding for rotary + position embedding + """ + if "padding_mask" in kwargs: + logger.warning( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use " + "`attention_mask` instead.`" + ) + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + custom_pos_emb=custom_pos_emb, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + **kwargs, + ) + hidden_states = residual + hidden_states + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +class HunyuanImage3PreTrainedModel(PreTrainedModel): + config_class = HunyuanImage3Config + base_model_prefix = "" + supports_gradient_checkpointing = True + _no_split_modules = ["HunyuanImage3DecoderLayer"] + _skip_keys_device_placement = "past_key_values" + _supports_flash_attn_2 = True + _supports_sdpa = True + _supports_cache_class = True + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + +class HunyuanImage3Model(nn.Module): + def __init__(self, config: HunyuanImage3Config, prefix: str = ""): + super().__init__() + quant_config = None + lora_config = None + self.num_redundant_experts = 0 + self.config = config + self.quant_config = quant_config + self.padding_idx = config.pad_token_id + lora_vocab = (lora_config.lora_extra_vocab_size * (lora_config.max_loras or 1)) if lora_config else 0 + self.vocab_size = config.vocab_size + lora_vocab + self.org_vocab_size = config.vocab_size + self.wte = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + if get_pp_group().is_first_rank or (config.tie_word_embeddings and get_pp_group().is_last_rank): + self.embed_tokens = VocabParallelEmbedding( + self.vocab_size, + config.hidden_size, + org_num_embeddings=config.vocab_size, + quant_config=quant_config, + ) + else: + self.embed_tokens = PPMissingLayer() + # maybe should not use make_layers() + self.start_layer, self.end_layer, self.layers = make_layers( + config.num_hidden_layers, + lambda prefix: HunyuanImage3DecoderLayer( + config=config, + layer_idx=int(prefix.split(".")[-1]), + prefix=prefix, + ), + prefix=f"{prefix}.layers", + ) + if get_pp_group().is_last_rank: + self.norm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + else: + self.norm = PPMissingLayer() + + def _split_qkv_weight(self, qkv: torch.Tensor): + num_attention_heads = self.config.num_attention_heads + num_kv_heads = getattr(self.config, "num_key_value_heads", self.config.num_attention_heads) + num_key_value_groups = num_attention_heads // num_kv_heads + hidden_size = self.config.hidden_size + + if hasattr(self.config, "head_dim"): + attention_head_dim = self.config.head_dim + elif hasattr(self.config, "attention_head_dim"): + attention_head_dim = self.config.attention_head_dim + else: + attention_head_dim = self.config.hidden_size // num_attention_heads + + qkv = qkv.reshape(num_kv_heads, num_key_value_groups + 2, attention_head_dim, hidden_size) + q, k, v = torch.split(qkv, (num_key_value_groups, 1, 1), dim=1) + q = q.reshape(-1, hidden_size) + k = k.reshape(-1, hidden_size) + v = v.reshape(-1, hidden_size) + return torch.concat((q, k, v)) + + def get_expert_mapping(self) -> list[tuple[str, str, int, str]]: + if _is_moe(self.config): + # Params for weights, fp8 weight scales, fp8 activation scales + # (param_name, weight_name, expert_id, shard_id) + fused_moe_expert_mapping = HunyuanFusedMoE.make_expert_params_mapping( + self, + ckpt_gate_proj_name="gate_proj", + ckpt_down_proj_name="down_proj", + ckpt_up_proj_name="up_proj", + num_experts=self.config.num_experts, + num_redundant_experts=self.num_redundant_experts, + ) + expert_weights_remapping = { + "gate_proj": ("gate_and_up_proj", 1, 2), + "up_proj": ("gate_and_up_proj", 0, 2), + } + return fused_moe_expert_mapping, expert_weights_remapping + else: + return [], {} + + # rename for delay load + def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]): + cla_factor = _get_cla_factor(self.config) + stacked_params_mapping = [ + # (param_name, shard_name, shard_id) + (".qkv_proj", ".q_proj", "q"), + (".qkv_proj", ".k_proj", "k"), + (".qkv_proj", ".v_proj", "v"), + (".gate_up_proj", ".gate_proj", 0), + (".gate_up_proj", ".up_proj", 1), + ] + + num_attention_heads = self.config.num_attention_heads + num_kv_heads = getattr(self.config, "num_key_value_heads", self.config.num_attention_heads) + split_params_mapping = [ + (".gate_up_proj", ".gate_and_up_proj", 2, [(1, 1), (0, 1)], None), + ( + ".qkv_proj", + ".qkv_proj", + num_attention_heads + num_kv_heads * 2, + [("q", num_attention_heads), ("k", num_kv_heads), ("v", num_kv_heads)], + self._split_qkv_weight, + ), + ] + + params_dict = dict(self.named_parameters()) + loaded_params: set[str] = set() + expert_params_mapping, expert_weights_remapping = self.get_expert_mapping() + + # List of unexpected keywords in weight names + unexpected_keywords = [ + "vae", + "vision_aligner", + "vision_model", + "final_layer", + "patch_embed", + "timestep_emb", + "time_embed", + "time_embed_2", + "guidance_emb", + "timestep_r_emb", + ] + + def contains_unexpected_keyword(name, keywords): + """Check if the name contains any unexpected keywords""" + for keyword in keywords: + if keyword in name: + return True + return False + + for name, loaded_weight in weights: + # print(f"Loading weight name: {name}, tp_rank: {tp_rank}", flush=True) + if contains_unexpected_keyword(name, unexpected_keywords): + print(f"Skipping unexpected weight name: {name}") + continue + if "rotary_emb.inv_freq" in name: + continue + if "gate_proj_bias" in name: + name = name.replace("gate_proj_bias", "gate_proj.bias") + if "up_proj_bias" in name: + name = name.replace("up_proj_bias", "up_proj.bias") + if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name: + # Models trained using ColossalAI may include these tensors in + # the checkpoint. Skip them. + continue + # With tie_word_embeddings, we can skip lm_head.weight + # The weight might appear unnecessarily in the files if the model is + # processed with quantization, LoRA, fine-tuning, etc. + if self.config.tie_word_embeddings and "lm_head.weight" in name: + continue + if self.quant_config is not None and (scale_name := self.quant_config.get_cache_scale(name)): + # Loading kv cache scales for compressed-tensors quantization + param = params_dict[scale_name] + weight_loader = getattr(param, "weight_loader", default_weight_loader) + loaded_weight = loaded_weight[0] + weight_loader(param, loaded_weight) + continue + + is_found = False + for param_name, weight_name, shard_id in stacked_params_mapping: + if weight_name not in name: + continue + if "mlp.experts" in name: + continue + # cross layer only have q_proj, skip qkv pack + if weight_name == ".q_proj": + match = re.search(r"layers\.\d+", name) + if match: + layer_id = int(match.group(0).split(".")[-1]) + if cla_factor > 1 and layer_id % cla_factor != 0: + continue + name = name.replace(weight_name, param_name) + # Skip loading extra bias for GPTQ models. + if name.endswith(".bias") and name not in params_dict: + continue + if is_pp_missing_parameter(name, self): + continue + param = params_dict[name] + weight_loader = param.weight_loader + weight_loader(param, loaded_weight, shard_id) + loaded_params.add(name) + is_found = True + break + if is_found: + continue + + for ( + param_name, + weight_name, + den, + split_param, + func, + ) in split_params_mapping: + if weight_name not in name: + continue + if "mlp.experts" in name: + continue + name = name.replace(weight_name, param_name) + # Skip loading extra bias for GPTQ models. + if name.endswith(".bias") and name not in params_dict: + continue + + if is_pp_missing_parameter(name, self): + continue + + assert loaded_weight.shape[0] % den == 0 + units = loaded_weight.shape[0] // den + param = params_dict[name] + weight_loader = param.weight_loader + offset = 0 + for shard_id, num in split_param: + new_offset = offset + num * units + if func: + weight_loader(param, func(loaded_weight)[offset:new_offset], shard_id) + else: + weight_loader(param, loaded_weight[offset:new_offset], shard_id) + offset = new_offset + + break + else: + # Skip loading extra bias for GPTQ models. + if name.endswith(".bias") and name not in params_dict: + continue + is_expert_weight = False + is_found = False + found_num = 0 + for mapping in expert_params_mapping: + param_name, weight_name, expert_id, shard_id = mapping + offset = 0 + den = 1 + for ( + mapped_weight_substr, + origin_weight_info, + ) in expert_weights_remapping.items(): + if mapped_weight_substr in weight_name: + origin_weight_name, offset, den = origin_weight_info + weight_name = weight_name.replace(mapped_weight_substr, origin_weight_name) + break + if weight_name not in name: + continue + is_expert_weight = True + name_mapped = name.replace(weight_name, param_name) + found_num += 1 + if is_pp_missing_parameter(name_mapped, self): + continue + param = params_dict[name_mapped] + weight_loader = cast(Callable[..., bool], param.weight_loader) + assert loaded_weight.shape[0] % den == 0 + units = loaded_weight.shape[0] // den + + success = weight_loader( + param, + loaded_weight[offset * units : offset * units + units], + name_mapped, + shard_id=shard_id, + expert_id=expert_id, + return_success=True, + ) + if success: + loaded_params.add(name_mapped) + is_found = True + if found_num == den: + break + if is_found: + continue + if is_expert_weight: + # We've checked that this is an expert weight + # However it's not mapped locally to this rank + # So we simply skip it + continue + # Remapping the name of FP8 kv-scale. + name = maybe_remap_kv_scale_name(name, params_dict) + if name is None: + continue + + if is_pp_missing_parameter(name, self): + continue + + if "mlp.gate.wg." in name: + name = name.replace("wg.", "") + if name == "ln_f.weight": + name = "norm.weight" + if name == "wte.weight": + name = "embed_tokens.weight" + param = params_dict[name] + weight_loader = getattr(param, "weight_loader", default_weight_loader) + weight_loader(param, loaded_weight) + loaded_params.add(name) + return loaded_params + + def forward( + self, + input_ids: torch.LongTensor | None = None, + attention_mask: torch.Tensor | None = None, + position_ids: torch.LongTensor | None = None, + past_key_values: list[torch.FloatTensor] | None = None, + inputs_embeds: torch.FloatTensor | None = None, + use_cache: bool | None = None, + output_attentions: bool | None = None, + output_hidden_states: bool | None = None, + return_dict: bool | None = None, + custom_pos_emb: tuple[torch.FloatTensor] | None = None, + mode: str = "gen_text", + first_step: bool | None = None, + query_lens: list[int] | None = None, + seq_lens: list[int] | None = None, + num_image_tokens: int | None = None, + gen_timestep_scatter_index: torch.Tensor | None = None, + ) -> tuple | BaseModelOutputWithPast: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + + # embed positions + hidden_states = inputs_embeds + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = None + + for layer_idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + layer_outputs = decoder_layer( + positions=None, + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_values, + output_attentions=output_attentions, + use_cache=use_cache, + custom_pos_emb=custom_pos_emb, + mode=mode, + first_step=first_step, + query_lens=query_lens, + seq_lens=seq_lens, + num_image_tokens=num_image_tokens, + gen_timestep_scatter_index=gen_timestep_scatter_index, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache = layer_outputs[2 if output_attentions else 1] + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = None + if use_cache: + next_cache = next_decoder_cache + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class ClassifierFreeGuidance: + def __init__( + self, + use_original_formulation: bool = False, + start: float = 0.0, + stop: float = 1.0, + ): + super().__init__() + self.use_original_formulation = use_original_formulation + + def __call__( + self, + pred_cond: torch.Tensor, + pred_uncond: torch.Tensor | None, + guidance_scale: float, + step: int, + ) -> torch.Tensor: + shift = pred_cond - pred_uncond + pred = pred_cond if self.use_original_formulation else pred_uncond + pred = pred + guidance_scale * shift + + return pred + + +@dataclass +class HunyuanImage3Text2ImagePipelineOutput(BaseOutput): + samples: list[Any] | np.ndarray + + +class HunyuanImage3Text2ImagePipeline(DiffusionPipeline): + r""" + Pipeline for condition-to-sample generation using Stable Diffusion. + + This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods + implemented for all pipelines (downloading, saving, running on a particular device, etc.). + + Args: + model ([`ModelMixin`]): + A model to denoise the diffused latents. + scheduler ([`SchedulerMixin`]): + A scheduler to be used in combination with `diffusion_model` to denoise the diffused latents. Can be one of + [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. + """ + + model_cpu_offload_seq = "" + _optional_components = [] + _exclude_from_cpu_offload = [] + _callback_tensor_inputs = ["latents"] + + def __init__( + self, + model, + scheduler: SchedulerMixin, + vae, + progress_bar_config: dict[str, Any] | None = None, + ): + super().__init__() + + if progress_bar_config is None: + progress_bar_config = {} + if not hasattr(self, "_progress_bar_config"): + self._progress_bar_config = {} + self._progress_bar_config.update(progress_bar_config) + self.register_modules( + model=model, + scheduler=scheduler, + vae=vae, + ) + + # should be a tuple or a list corresponding to the size of latents (batch_size, channel, *size) + # if None, will be treated as a tuple of 1 + self.latent_scale_factor = self.model.config.vae_downsample_factor + self.image_processor = VaeImageProcessor(vae_scale_factor=self.latent_scale_factor) + + # Must start with APG_mode_ + self.cfg_operator = ClassifierFreeGuidance() + + @staticmethod + def denormalize(images: np.ndarray | torch.Tensor) -> np.ndarray | torch.Tensor: + """ + Denormalize an image array to [0,1]. + """ + return (images / 2 + 0.5).clamp(0, 1) + + @staticmethod + def pt_to_numpy(images: torch.Tensor) -> np.ndarray: + """ + Convert a PyTorch tensor to a NumPy image. + """ + images = images.cpu().permute(0, 2, 3, 1).float().numpy() + return images + + @staticmethod + def numpy_to_pil(images: np.ndarray): + """ + Convert a numpy image or a batch of images to a PIL image. + """ + if images.ndim == 3: + images = images[None, ...] + images = (images * 255).round().astype("uint8") + if images.shape[-1] == 1: + # special case for grayscale (single channel) images + pil_images = [Image.fromarray(image.squeeze(), mode="L") for image in images] + else: + pil_images = [Image.fromarray(image) for image in images] + + return pil_images + + def prepare_extra_func_kwargs(self, func, kwargs): + # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature + # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. + # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 + # and should be between [0, 1] + extra_kwargs = {} + + for k, v in kwargs.items(): + accepts = k in set(inspect.signature(func).parameters.keys()) + if accepts: + extra_kwargs[k] = v + return extra_kwargs + + def prepare_latents(self, batch_size, latent_channel, image_size, dtype, device, generator, latents=None): + if self.latent_scale_factor is None: + latent_scale_factor = (1,) * len(image_size) + elif isinstance(self.latent_scale_factor, int): + latent_scale_factor = (self.latent_scale_factor,) * len(image_size) + elif isinstance(self.latent_scale_factor, tuple) or isinstance(self.latent_scale_factor, list): + assert len(self.latent_scale_factor) == len(image_size), ( + "len(latent_scale_factor) should be the same as len(image_size)" + ) + latent_scale_factor = self.latent_scale_factor + else: + raise ValueError( + f"latent_scale_factor should be either None, int, tuple of int, or list of int, " + f"but got {self.latent_scale_factor}" + ) + + latents_shape = ( + batch_size, + latent_channel, + *[int(s) // f for s, f in zip(image_size, latent_scale_factor)], + ) + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if latents is None: + latents = randn_tensor(latents_shape, generator=generator, device=device, dtype=dtype) + else: + latents = latents.to(device) + + # Check existence to make it compatible with FlowMatchEulerDiscreteScheduler + if hasattr(self.scheduler, "init_noise_sigma"): + # scale the initial noise by the standard deviation required by the scheduler + latents = latents * self.scheduler.init_noise_sigma + + return latents + + @property + def guidance_scale(self): + return self._guidance_scale + + @property + def guidance_rescale(self): + return self._guidance_rescale + + # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + @property + def do_classifier_free_guidance(self): + return self._guidance_scale > 1.0 + + @property + def num_timesteps(self): + return self._num_timesteps + + def set_scheduler(self, new_scheduler): + self.register_modules(scheduler=new_scheduler) + + @torch.no_grad() + def __call__( + self, + batch_size: int, + image_size: list[int], + num_inference_steps: int = 50, + timesteps: list[int] | None = None, + sigmas: list[float] | None = None, + guidance_scale: float = 5.0, + generator: torch.Generator | list[torch.Generator] | None = None, + latents: torch.Tensor | None = None, + output_type: str | None = "pil", + return_dict: bool = True, + guidance_rescale: float = 0.0, + callback_on_step_end: Callable[[int, int, dict], None] + | PipelineCallback + | MultiPipelineCallbacks + | None = None, + callback_on_step_end_tensor_inputs: list[str] = ["latents"], + model_kwargs: dict[str, Any] | None = None, + **kwargs, + ): + r""" + The call function to the pipeline for generation. + + Args: + prompt (`str` or `List[str]`): + The text to guide image generation. + image_size (`Tuple[int]` or `List[int]`): + The size (height, width) of the generated image. + num_inference_steps (`int`, *optional*, defaults to 50): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. + timesteps (`List[int]`, *optional*): + Custom timesteps to use for the denoising process with schedulers which support a `timesteps` argument + in their `set_timesteps` method. If not defined, the default behavior when `num_inference_steps` is + passed will be used. Must be in descending order. + sigmas (`List[float]`, *optional*): + Custom sigmas to use for the denoising process with schedulers which support a `sigmas` argument in + their `set_timesteps` method. If not defined, the default behavior when `num_inference_steps` is passed + will be used. + guidance_scale (`float`, *optional*, defaults to 7.5): + A higher guidance scale value encourages the model to generate samples closely linked to the + `condition` at the expense of lower sample quality. Guidance scale is enabled when `guidance_scale > 1`. + generator (`torch.Generator` or `List[torch.Generator]`, *optional*): + A [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) to make + generation deterministic. + latents (`torch.Tensor`, *optional*): + Pre-generated noisy latents sampled from a Gaussian distribution, to be used as inputs for sample + generation. Can be used to tweak the same generation with different conditions. If not provided, + a latents tensor is generated by sampling using the supplied random `generator`. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generated sample. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~DiffusionPipelineOutput`] instead of a + plain tuple. + guidance_rescale (`float`, *optional*, defaults to 0.0): + Guidance rescale factor from [Common Diffusion Noise Schedules and Sample Steps are + Flawed](https://arxiv.org/pdf/2305.08891.pdf). Guidance rescale factor should fix overexposure when + using zero terminal SNR. + callback_on_step_end (`Callable`, `PipelineCallback`, `MultiPipelineCallbacks`, *optional*): + A function or a subclass of `PipelineCallback` or `MultiPipelineCallbacks` that is called at the end of + each denoising step during the inference. with the following arguments: `callback_on_step_end(self: + DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` will include a + list of all tensors as specified by `callback_on_step_end_tensor_inputs`. + callback_on_step_end_tensor_inputs (`List`, *optional*): + The list of tensor inputs for the `callback_on_step_end` function. The tensors specified in the list + will be passed as `callback_kwargs` argument. You will only be able to include variables listed in the + `._callback_tensor_inputs` attribute of your pipeline class. + + Examples: + + Returns: + [`~DiffusionPipelineOutput`] or `tuple`: + If `return_dict` is `True`, [`~DiffusionPipelineOutput`] is returned, + otherwise a `tuple` is returned where the first element is a list with the generated samples. + """ + callback_steps = kwargs.pop("callback_steps", None) + pbar_steps = kwargs.pop("pbar_steps", None) + + if isinstance(callback_on_step_end, (PipelineCallback, MultiPipelineCallbacks)): + callback_on_step_end_tensor_inputs = callback_on_step_end.tensor_inputs + + self._guidance_scale = guidance_scale + self._guidance_rescale = guidance_rescale + + cfg_factor = 1 + self.do_classifier_free_guidance + + # Define call parameters + device = self._execution_device + + # Prepare timesteps + timesteps, num_inference_steps = retrieve_timesteps( + self.scheduler, + num_inference_steps, + device, + timesteps, + sigmas, + ) + + # Prepare latent variables + latents = self.prepare_latents( + batch_size=batch_size, + latent_channel=self.model.config.vae["latent_channels"], + image_size=image_size, + dtype=torch.bfloat16, + device=device, + generator=generator, + latents=latents, + ) + + # Prepare extra step kwargs. + _scheduler_step_extra_kwargs = self.prepare_extra_func_kwargs(self.scheduler.step, {"generator": generator}) + + # Prepare model kwargs + input_ids = model_kwargs.pop("input_ids") + attention_mask = self.model._prepare_attention_mask_for_generation( # noqa + input_ids, + self.model.generation_config, + model_kwargs=model_kwargs, + ) + b, _, q_len1, seq_len = attention_mask.shape + query_lens = [q_len1] * b + seq_lens = [seq_len] * b + model_kwargs["query_lens"] = query_lens + model_kwargs["seq_lens"] = seq_lens + model_kwargs["attention_mask"] = attention_mask.to(latents.device) + + # Sampling loop + num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order + self._num_timesteps = len(timesteps) + + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat([latents] * cfg_factor) + # latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + t_expand = t.repeat(latent_model_input.shape[0]) + + model_inputs = self.model.prepare_inputs_for_generation( + input_ids, + images=latent_model_input, + timestep=t_expand, + **model_kwargs, + ) + + with torch.autocast(device_type="cuda", dtype=torch.bfloat16, enabled=True): + model_output = self.model.forward_call(**model_inputs, first_step=(i == 0)) + pred = model_output["diffusion_prediction"] + pred = pred.to(dtype=torch.float32) + + # perform guidance + if self.do_classifier_free_guidance: + pred_cond, pred_uncond = pred.chunk(2) + pred = self.cfg_operator(pred_cond, pred_uncond, self.guidance_scale, step=i) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step(pred, t, latents, **_scheduler_step_extra_kwargs, return_dict=False)[0] + + if i != len(timesteps) - 1: + model_kwargs = self.model._update_model_kwargs_for_generation( # noqa + model_output, + model_kwargs, + ) + if input_ids.shape[1] != model_kwargs["position_ids"].shape[1]: + input_ids = torch.gather(input_ids, 1, index=model_kwargs["position_ids"]) + attention_mask = model_kwargs.get("attention_mask") + b, _, q_len1, seq_len = attention_mask.shape + query_lens = [q_len1] * b + seq_lens = [seq_len] * b + model_kwargs["query_lens"] = query_lens + model_kwargs["seq_lens"] = seq_lens + + if callback_on_step_end is not None: + callback_kwargs = {} + for k in callback_on_step_end_tensor_inputs: + callback_kwargs[k] = locals()[k] + callback_outputs = callback_on_step_end(self, i, t, callback_kwargs) + + latents = callback_outputs.pop("latents", latents) + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): + progress_bar.update() + + if hasattr(self.vae.config, "scaling_factor") and self.vae.config.scaling_factor: + latents = latents / self.vae.config.scaling_factor + if hasattr(self.vae.config, "shift_factor") and self.vae.config.shift_factor: + latents = latents + self.vae.config.shift_factor + + if hasattr(self.vae, "ffactor_temporal"): + latents = latents.unsqueeze(2) + + with torch.autocast(device_type="cuda", dtype=torch.float16, enabled=True): + image = self.vae.decode(latents, return_dict=False, generator=generator)[0] + + if hasattr(self.vae, "ffactor_temporal"): + assert image.shape[2] == 1, "image should have shape [B, C, T, H, W] and T should be 1" + image = image.squeeze(2) + + do_denormalize = [True] * image.shape[0] + image = self.image_processor.postprocess(image, output_type=output_type, do_denormalize=do_denormalize) + + if not return_dict: + return (image,) + + return HunyuanImage3Text2ImagePipelineOutput(samples=image) + + +def timestep_embedding(t, dim, max_period=10000): + """ + Create sinusoidal timestep embeddings. + + Args: + t (torch.Tensor): a 1-D Tensor of N indices, one per batch element. These may be fractional. + dim (int): the dimension of the output. + max_period (int): controls the minimum frequency of the embeddings. + + Returns: + embedding (torch.Tensor): An (N, D) Tensor of positional embeddings. + + .. ref_link: https://github.com/openai/glide-text2im/blob/main/glide_text2im/nn.py + """ + half = dim // 2 + freqs = torch.exp(-math.log(max_period) * torch.arange(start=0, end=half, dtype=torch.float32) / half).to( + device=t.device + ) + args = t[:, None].float() * freqs[None] + embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1) + if dim % 2: + embedding = torch.cat([embedding, torch.zeros_like(embedding[:, :1])], dim=-1) + return embedding + + +class TimestepEmbedder(nn.Module): + """ + Embeds scalar timesteps into vector representations. + """ + + def __init__( + self, + hidden_size, + act_layer=nn.GELU, + frequency_embedding_size=256, + max_period=10000, + out_size=None, + dtype=None, + device=None, + ): + factory_kwargs = {"dtype": dtype, "device": device} + super().__init__() + self.frequency_embedding_size = frequency_embedding_size + self.max_period = max_period + if out_size is None: + out_size = hidden_size + + self.mlp = nn.Sequential( + nn.Linear(frequency_embedding_size, hidden_size, bias=True, **factory_kwargs), + act_layer(), + nn.Linear(hidden_size, out_size, bias=True, **factory_kwargs), + ) + nn.init.normal_(self.mlp[0].weight, std=0.02) + nn.init.normal_(self.mlp[2].weight, std=0.02) + + def forward(self, t): + t_freq = timestep_embedding(t, self.frequency_embedding_size, self.max_period).type(self.mlp[0].weight.dtype) + t_emb = self.mlp(t_freq) + return t_emb + + +class ResBlock(nn.Module): + r""" + A residual block that can optionally change the number of channels. + + Args: + in_channels (`int`): + The number of input channels. + emb_channels (`int`): + The number of timestep embedding channels. + dropout (`float`): + The rate of dropout. + out_channels (`int`, *optional*): + If specified, the number of output channels. + use_conv (`bool`, *optional*): + If True and out_channels is specified, use a spatial convolution instead of a + smaller 1x1 convolution to change the channels in the skip connection. + dims (`int`, *optional*): + Determines if the signal is 1D, 2D, or 3D. + up (`bool`, *optional*): + If True, use this block for upsampling. + down (`bool`, *optional*): + If True, use this block for downsampling. + + """ + + def __init__( + self, + in_channels, + emb_channels, + out_channels=None, + dropout=0.0, + use_conv=False, + dims=2, + up=False, + down=False, + device=None, + dtype=None, + ) -> None: + factory_kwargs = {"dtype": dtype, "device": device} + super().__init__() + self.in_channels = in_channels + self.dropout = dropout + self.out_channels = out_channels or self.in_channels + self.use_conv = use_conv + + self.in_layers = nn.Sequential( + normalization(self.in_channels, **factory_kwargs), + nn.SiLU(), + conv_nd(dims, self.in_channels, self.out_channels, 3, padding=1, **factory_kwargs), # noqa: N802 + ) + + self.updown = up or down + self.h_upd = self.x_upd = nn.Identity() + + self.emb_layers = nn.Sequential(nn.SiLU(), linear(emb_channels, 2 * self.out_channels, **factory_kwargs)) + + self.out_layers = nn.Sequential( + normalization(self.out_channels, **factory_kwargs), + nn.SiLU(), + nn.Dropout(p=dropout), + zero_module(conv_nd(dims, self.out_channels, self.out_channels, 3, padding=1, **factory_kwargs)), # noqa: N802 + ) + + if self.out_channels == self.in_channels: + self.skip_connection = nn.Identity() + elif use_conv: + self.skip_connection = conv_nd(dims, self.in_channels, self.out_channels, 3, padding=1, **factory_kwargs) # noqa: N802 + else: + self.skip_connection = conv_nd(dims, self.in_channels, self.out_channels, 1, **factory_kwargs) # noqa: N802 + + def forward(self, x, emb) -> torch.Tensor: + if self.updown: + in_rest, in_conv = self.in_layers[:-1], self.in_layers[-1] + h = in_rest(x) + h = self.h_upd(h) + x = self.x_upd(x) + h = in_conv(h) + else: + h = self.in_layers(x) + + emb_out = self.emb_layers(emb) + while len(emb_out.shape) < len(h.shape): + emb_out = emb_out[..., None] + + # Adaptive Group Normalization + out_norm, out_rest = self.out_layers[0], self.out_layers[1:] + scale, shift = torch.chunk(emb_out, 2, dim=1) + h = out_norm(h) * (1.0 + scale) + shift + h = out_rest(h) + + return self.skip_connection(x) + h + + +class UNetDown(nn.Module): + def __init__( + self, patch_size, in_channels, emb_channels, hidden_channels, out_channels, dropout=0.0, device=None, dtype=None + ): + factory_kwargs = {"dtype": dtype, "device": device} + super().__init__() + + self.patch_size = patch_size + assert self.patch_size in [1, 2, 4, 8] + + self.model = nn.ModuleList( + [ + conv_nd( + 2, in_channels=in_channels, out_channels=hidden_channels, kernel_size=3, padding=1, **factory_kwargs + ) # noqa: N802 + ] + ) + + if self.patch_size == 1: + self.model.append( + ResBlock( + in_channels=hidden_channels, + emb_channels=emb_channels, + out_channels=out_channels, + dropout=dropout, + **factory_kwargs, + ) + ) + else: + for i in range(self.patch_size // 2): + self.model.append( + ResBlock( + in_channels=hidden_channels, + emb_channels=emb_channels, + out_channels=hidden_channels if (i + 1) * 2 != self.patch_size else out_channels, + dropout=dropout, + down=True, + **factory_kwargs, + ) + ) + + def forward(self, x, t): + assert x.shape[2] % self.patch_size == 0 and x.shape[3] % self.patch_size == 0 + for module in self.model: + if isinstance(module, ResBlock): + x = module(x, t) + else: + x = module(x) + _, _, token_h, token_w = x.shape + x = rearrange(x, "b c h w -> b (h w) c") + return x, token_h, token_w + + +class UNetUp(nn.Module): + def __init__( + self, + patch_size, + in_channels, + emb_channels, + hidden_channels, + out_channels, + dropout=0.0, + device=None, + dtype=None, + out_norm=False, + ): + factory_kwargs = {"dtype": dtype, "device": device} + super().__init__() + + self.patch_size = patch_size + assert self.patch_size in [1, 2, 4, 8] + + self.model = nn.ModuleList() + + if self.patch_size == 1: + self.model.append( + ResBlock( + in_channels=in_channels, + emb_channels=emb_channels, + out_channels=hidden_channels, + dropout=dropout, + **factory_kwargs, + ) + ) + else: + for i in range(self.patch_size // 2): + self.model.append( + ResBlock( + in_channels=in_channels if i == 0 else hidden_channels, + emb_channels=emb_channels, + out_channels=hidden_channels, + dropout=dropout, + up=True, + **factory_kwargs, + ) + ) + + if out_norm: + self.model.append( + nn.Sequential( + normalization(hidden_channels, **factory_kwargs), + nn.SiLU(), + conv_nd( + 2, + in_channels=hidden_channels, + out_channels=out_channels, + kernel_size=3, + padding=1, + **factory_kwargs, + ), # noqa: N802 + ) + ) + else: + self.model.append( + conv_nd( + 2, + in_channels=hidden_channels, + out_channels=out_channels, + kernel_size=3, + padding=1, + **factory_kwargs, + ) # noqa: N802 + ) + + # batch_size, seq_len, model_dim + def forward(self, x, t, token_h, token_w): + x = rearrange(x, "b (h w) c -> b c h w", h=token_h, w=token_w) + for module in self.model: + if isinstance(module, ResBlock): + x = module(x, t) + else: + x = module(x) + return x diff --git a/vllm_omni/diffusion/models/hunyuan_image_3/pipeline_hunyuan_image_3.py b/vllm_omni/diffusion/models/hunyuan_image_3/pipeline_hunyuan_image_3.py new file mode 100644 index 000000000..9a8f26d38 --- /dev/null +++ b/vllm_omni/diffusion/models/hunyuan_image_3/pipeline_hunyuan_image_3.py @@ -0,0 +1,1017 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + +import logging +from collections.abc import Iterable +from typing import Any + +import numpy as np +import torch +import torch.nn as nn +from diffusers.schedulers.scheduling_flow_match_euler_discrete import FlowMatchEulerDiscreteScheduler +from transformers.generation.configuration_utils import GenerationConfig +from transformers.generation.utils import ALL_CACHE_NAMES, GenerationMixin +from transformers.models.siglip2 import Siglip2VisionConfig, Siglip2VisionModel +from transformers.utils.generic import ModelOutput +from vllm.config.vllm import get_current_vllm_config +from vllm.distributed import get_tensor_model_parallel_rank +from vllm.model_executor.models.utils import AutoWeightsLoader +from vllm.transformers_utils.config import get_config + +from vllm_omni.diffusion.data import DiffusionOutput, OmniDiffusionConfig +from vllm_omni.diffusion.model_loader.diffusers_loader import DiffusersPipelineLoader +from vllm_omni.diffusion.request import OmniDiffusionRequest + +from .autoencoder import AutoencoderKLConv3D +from .hunyuan_image_3_tokenizer import TokenizerWrapper +from .hunyuan_image_3_transformer import ( + CausalMMOutputWithPast, + HunyuanImage3ImageProcessor, + HunyuanImage3Model, + HunyuanImage3PreTrainedModel, + HunyuanImage3Text2ImagePipeline, + ImageInfo, + JointImageInfo, + LightProjector, + TimestepEmbedder, + UNetDown, + UNetUp, + build_batch_2d_rope, + get_full_state_dict, + real_batched_index_select, +) + +logger = logging.getLogger(__name__) + +BatchRaggedImages = torch.Tensor | list[torch.Tensor | list[torch.Tensor]] +BatchRaggedTensor = torch.Tensor | list[torch.Tensor] + + +def default(val, d): + return val if val is not None else d + + +def to_device(data, device): + if device is None: + return data + if isinstance(data, torch.Tensor): + return data.to(device) + elif isinstance(data, list): + return [to_device(x, device) for x in data] + else: + return data + + +class HunyuanImage3Pipeline(HunyuanImage3PreTrainedModel, GenerationMixin): + def __init__(self, od_config: OmniDiffusionConfig) -> None: + self.hf_config = get_config(od_config.model, trust_remote_code=True) + super().__init__(self.hf_config) + # update diffusion config + self.generation_config = GenerationConfig.from_pretrained(od_config.model) + self.od_config = od_config + self.weights_sources = [ + DiffusersPipelineLoader.ComponentSource( + model_or_path=od_config.model, + subfolder=None, + revision=od_config.revision, + prefix="", + fall_back_to_pt=True, + ) + ] + self.model = HunyuanImage3Model(self.hf_config) + self.vae = AutoencoderKLConv3D.from_config(self.hf_config.vae) + self._pipeline = None + self._tkwrapper = TokenizerWrapper(od_config.model) + self.image_processor = HunyuanImage3ImageProcessor(self.hf_config) + self.hf_config.vit.pop("use_return_dict", None) + vision_config = Siglip2VisionConfig(**self.hf_config.vit) + self.vision_model = Siglip2VisionModel(vision_config).vision_model + # self.vision_model = vision_model.vision_model + self.vision_aligner = LightProjector(self.hf_config.vit_aligner) + self.timestep_emb = TimestepEmbedder(hidden_size=self.hf_config.hidden_size) + if self.hf_config.img_proj_type != "unet": + raise ValueError(f"Unknown img_proj_type: {self.hf_config.img_proj_type}") + + self.patch_embed = UNetDown( + patch_size=self.hf_config.patch_size, + emb_channels=self.hf_config.hidden_size, + in_channels=self.hf_config.vae["latent_channels"], + hidden_channels=self.hf_config.patch_embed_hidden_dim, + out_channels=self.hf_config.hidden_size, + ) + self.time_embed = TimestepEmbedder(hidden_size=self.hf_config.hidden_size) + self.final_layer = UNetUp( + patch_size=self.hf_config.patch_size, + emb_channels=self.hf_config.hidden_size, + in_channels=self.hf_config.hidden_size, + hidden_channels=self.hf_config.patch_embed_hidden_dim, + out_channels=self.hf_config.vae["latent_channels"], + out_norm=True, + ) + self.time_embed_2 = TimestepEmbedder(hidden_size=self.hf_config.hidden_size) + self.lm_head = nn.Linear(self.hf_config.hidden_size, self.hf_config.vocab_size, bias=False) + self.vllm_config = get_current_vllm_config() + self.post_init() + + def pre_load(self): + tp_rank = get_tensor_model_parallel_rank() + state_dict = get_full_state_dict(self.od_config.model) + non_layer_prefixes = [ + "vae", + "vision_model", + "vision_aligner", + "lm_head", + "patch_embed", + "timestep_emb", + "model.wte", + "model.ln_f", + "time_embed", + "time_embed_2", + "final_layer.model", + ] + filtered_sd = {} + for k, v in state_dict.items(): + if any(k.startswith(prefix) for prefix in non_layer_prefixes): + filtered_sd[k] = v + + missing, unexpected = self.load_state_dict(filtered_sd, strict=False) + + for prefix in non_layer_prefixes: + if hasattr(self, prefix.split(".")[0]): + module = dict(self.named_modules()).get(prefix) + if module: + module.to(f"cuda:{tp_rank}") + + def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]: + self.pre_load() + skip_prefixes = ["lm_head."] if self.hf_config.tie_word_embeddings else [] + # List of unexpected keywords in weight names + unexpected_keywords = [ + "vae", + "vision_aligner", + "vision_model", + "final_layer", + "patch_embed", + "timestep_emb", + "time_embed", + "time_embed_2", + "guidance_emb", + "timestep_r_emb", + ] + skip_prefixes.extend(unexpected_keywords) + loader = AutoWeightsLoader( + self, + skip_prefixes=skip_prefixes, + ) + return loader.load_weights(weights) + + def prepare_seed(self, seed=None, batch_size=1): + # random seed + if seed is not None: + return [seed + i for i in range(batch_size)] + else: + import random + + return [random.randint(0, 2**32 - 1) for _ in range(batch_size)] + + @property + def pipeline(self): + if self._pipeline is None: + # shift hard code + self.scheduler = FlowMatchEulerDiscreteScheduler( + num_train_timesteps=1000, + shift=self.generation_config.flow_shift, + use_dynamic_shifting=False, + base_shift=0.5, + max_shift=1.15, + time_shift_type="exponential", + stochastic_sampling=False, + ) + self._pipeline = HunyuanImage3Text2ImagePipeline(model=self, scheduler=self.scheduler, vae=self.vae) + return self._pipeline + + @staticmethod + def get_pos_emb(custom_pos_emb, position_ids): + cos, sin = custom_pos_emb + cos = real_batched_index_select(cos, dim=1, idx=position_ids) + sin = real_batched_index_select(sin, dim=1, idx=position_ids) + return cos, sin + + def instantiate_vae_image_tokens( + self, + x: torch.Tensor, + images: BatchRaggedImages, + ts: BatchRaggedTensor, + image_mask: torch.Tensor, + ): + r""" + Instantiate the VAE image embeddings into the input embedding sequence. + Args: + x (`torch.Tensor`): + Input sequence tensor with shape `(batch_size, seq_len, n_embd)`. + images (`BatchRaggedImages`): + Batch of images to embed. Can be: + - A 4-D tensor (batch, channels, height, width) + - A list of 4-D tensors (variable number of images per batch) + - A list of lists of 3-D tensors (ragged batch structure) + ts (`BatchRaggedTensor`, *optional*): + Timestep tensor(s) for conditioning. Can be: + - A 1-D tensor (single timestep per batch) + - A list of 1-D tensors (variable timesteps per batch) + image_mask (`torch.Tensor`, *optional*): + Boolean mask tensor with shape `(batch_size, seq_len)` indicating which positions + should be replaced with image embeddings. + """ + batch_size, seq_len, n_embd = x.shape + + if isinstance(images, list): + index = torch.arange(seq_len, device=x.device).unsqueeze(0).repeat(batch_size, 1) + t_emb = [] + for i, (image_i, t_i) in enumerate(zip(images, ts)): + if isinstance(image_i, torch.Tensor): + # time_embed needs a 1-D tensor as input + t_i_emb = self.time_embed(t_i) + # n_{i} x one_image_seq_len x n_embd + image_i_seq, _, _ = self.patch_embed(image_i, t_i_emb) + # 1 x (n_{i} * one_image_seq_len) + image_i_scatter_index = index[i : i + 1].masked_select(image_mask[i : i + 1].bool()).reshape(1, -1) + x[i : i + 1].scatter_( + dim=1, + index=image_i_scatter_index.unsqueeze(-1).repeat(1, 1, n_embd), + # 1 x (n_{i} * one_image_seq_len) x n_embd + src=image_i_seq.reshape(1, -1, n_embd), # 1 x (n_{i} * one_image_seq_len) x n_embd + ) + t_emb.append(t_i_emb) + elif isinstance(image_i, list): + # time_embed needs a 1-D tensor as input + t_i_emb = self.time_embed(t_i) # n_{i} x d + image_i_seq_list = [] + for j in range(len(image_i)): + image_ij = image_i[j] + if image_ij.dim() == 4: + assert image_i[j].shape[0] == 1, "image_i[j] should have a batch dimension of 1" + elif image_ij.dim() == 3: + image_ij = image_ij.unsqueeze(0) + else: + raise ValueError(f"image_i[j] should have 3 or 4 dimensions, got {image_ij.dim()}") + # 1 x one_image_seq_len_{j} x n_embd + image_i_seq_j, _, _ = self.patch_embed(image_ij, t_i_emb[j : j + 1]) + image_i_seq_list.append(image_i_seq_j) + # 1 x sum_{j}(one_image_seq_len_{j}) x n_embd + image_i_seq = torch.cat(image_i_seq_list, dim=1) + # 1 x sum_{j}(one_image_seq_len_{j}) + image_i_scatter_index = index[i : i + 1].masked_select(image_mask[i : i + 1].bool()).reshape(1, -1) + x[i : i + 1].scatter_( + dim=1, + index=image_i_scatter_index.unsqueeze(-1).repeat(1, 1, n_embd), + # 1 x sum_{j}(one_image_seq_len_{j}) x n_embd + src=image_i_seq.reshape(1, -1, n_embd), # 1 x sum_{j}(one_image_seq_len_{j}) x n_embd + ) + t_emb.append(t_i_emb) + else: + raise TypeError(f"image_i should be a torch.Tensor or a list, got {type(image_i)}") + token_h, token_w = None, None + else: + # images is a 4-D tensor + batch_size, seq_len, n_embd = x.shape + index = torch.arange(seq_len, device=x.device).unsqueeze(0).repeat(batch_size, 1) + t_emb = self.time_embed(ts) + image_seq, token_h, token_w = self.patch_embed(images, t_emb) + image_scatter_index = index.masked_select(image_mask.bool()).reshape(batch_size, -1) + x.scatter_( + dim=1, + index=image_scatter_index.unsqueeze(-1).repeat(1, 1, n_embd), + src=image_seq, + ) + + return x, token_h, token_w + + def instantiate_timestep_tokens( + self, + x: torch.Tensor, + t: BatchRaggedTensor, + timestep_scatter_index: BatchRaggedTensor, + ): + batch_size, seq_len, n_embd = x.shape + # batch_size x n x n_embd + timestep_scatter_src = self.timestep_emb(t.reshape(-1)).reshape(batch_size, -1, n_embd) + x.scatter_( + dim=1, + index=timestep_scatter_index.unsqueeze(-1).repeat(1, 1, n_embd), + src=timestep_scatter_src, + ) + + return x + + def instantiate_vit_image_tokens( + self, + x: torch.Tensor, + cond_vit_images: torch.Tensor | list[torch.Tensor], + cond_vit_image_mask: torch.Tensor, + vit_kwargs: dict[str, Any], + ): + # 1. Forward the vit encoder and vit aligner to get the vit image embeddings and align them to the + # transformer hidden size + cond_vit_image_embeds = [] + for batch_idx, image in enumerate(cond_vit_images): + cur_kwargs = {k: v[batch_idx] for k, v in vit_kwargs.items()} + image_embed = self.vision_model(image, **cur_kwargs).last_hidden_state + image_embed = self.vision_aligner(image_embed) + n, seq_len, dim = image_embed.shape + image_embed = image_embed.reshape(n * seq_len, dim) + cond_vit_image_embeds.append(image_embed) + + # 2. Instantiate the vit image embeddings into the input sequence + batch_size, seq_len, n_embd = x.shape + index = torch.arange(seq_len, device=x.device).unsqueeze(0).repeat(batch_size, 1) + + for i, (image_embed, mask) in enumerate(zip(cond_vit_image_embeds, cond_vit_image_mask)): + image_scatter_index = index[i : i + 1].masked_select(mask.bool()).reshape(1, -1) + x[i : i + 1].scatter_( + dim=1, + index=image_scatter_index.unsqueeze(-1).repeat(1, 1, n_embd), + src=image_embed.reshape(1, -1, n_embd), + ) + + return x + + def ragged_final_layer(self, x, image_mask, timestep, token_h, token_w, first_step): + bsz, seq_len, n_embd = x.shape + if first_step: + image_output = x.masked_select(image_mask.unsqueeze(-1).bool()).reshape(bsz, -1, n_embd) + else: + image_output = x[:, 1:, :] + timestep_emb = self.time_embed_2(timestep) + pred = self.final_layer(image_output, timestep_emb, token_h, token_w) + return pred + + @staticmethod + def build_batch_rope_image_info(output, sections): + rope_image_info = [] + for image_slices, sections_i in zip(output.all_image_slices, sections): + image_shapes = [] + for section in sections_i: + if "image" in section["type"]: + if isinstance(section["token_height"], list): + assert len(section["token_height"]) == len(section["token_width"]), ( + f"token_height and token_width should have the same length, " + f"but got {len(section['token_height'])} and {len(section['token_width'])}" + ) + image_shapes.extend(list(zip(section["token_height"], section["token_width"]))) + else: + image_shapes.append((section["token_height"], section["token_width"])) + assert len(image_slices) == len(image_shapes), ( + f"Size miss matching: Image slices({len(image_slices)}) != image shapes({len(image_shapes)})" + ) + rope_image_info.append(list(zip(image_slices, image_shapes))) + return rope_image_info + + def vae_encode(self, image, cfg_factor=1): + config = self.vae.config + + with torch.autocast(device_type="cuda", dtype=torch.float16, enabled=True): + vae_encode_result = self.vae.encode(image) + if isinstance(vae_encode_result, torch.Tensor): + latents = vae_encode_result + else: + latents = vae_encode_result.latent_dist.sample() + if hasattr(config, "shift_factor") and config.shift_factor: + latents.sub_(config.shift_factor) + if hasattr(config, "scaling_factor") and config.scaling_factor: + latents.mul_(config.scaling_factor) + + if hasattr(self.vae, "ffactor_temporal"): + assert latents.shape[2] == 1, "latents should have shape [B, C, T, H, W] and T should be 1" + latents = latents.squeeze(2) + + # Here we always use t=0 to declare it is a clean conditional image + t = torch.zeros((latents.shape[0],)) + + if cfg_factor > 1: + t = t.repeat(cfg_factor) + latents = latents.repeat(cfg_factor, 1, 1, 1) + + return t, latents + + def _encode_cond_image( + self, + batch_cond_image_info_list: list[list[JointImageInfo]], + cfg_factor: int = 1, + ): + # VAE encode one by one, as we assume cond images have different sizes + batch_cond_vae_images, batch_cond_t, batch_cond_vit_images = [], [], [] + for cond_image_info_list in batch_cond_image_info_list: + cond_vae_image_list, cond_t_list, cond_vit_image_list = [], [], [] + for image_info in cond_image_info_list: + cond_t_, cond_vae_image_ = self.vae_encode( + image_info.vae_image_info.image_tensor.to(self.device), + ) + cond_vit_image_list.append(image_info.vision_image_info.image_tensor) + cond_vae_image_list.append(cond_vae_image_.squeeze(0)) + cond_t_list.append(cond_t_) + batch_cond_vae_images.append(cond_vae_image_list) + batch_cond_t.append(cond_t_list) + batch_cond_vit_images.append(torch.cat(cond_vit_image_list, dim=0)) + + # If only one cond image for each sample and all have the same size, we can batch them together + # In this case, cond_vae_images is a 4-D tensor. + if all([len(items) == 1 for items in batch_cond_vae_images]) and all( + items[0].shape == batch_cond_vae_images[0][0].shape for items in batch_cond_vae_images + ): + cond_vae_images = torch.stack([items[0] for items in batch_cond_vae_images], dim=0) + cond_t = torch.cat([items[0] for items in batch_cond_t], dim=0) + if cfg_factor > 1: + cond_t = cond_t.repeat(cfg_factor) + cond_vae_images = cond_vae_images.repeat(cfg_factor, 1, 1, 1) + else: + # In this case, cond_vae_images is a list of 4-D tensors or a list of lists of 3-D tensors. + cond_t = [torch.cat(item, dim=0) for item in batch_cond_t] + cond_vae_images = [] + for items in batch_cond_vae_images: + if all(items[0].shape == item.shape for item in items): + cond_vae_images.append(torch.stack(items, dim=0)) + else: + cond_vae_images.append(items) + if cfg_factor > 1: + cond_t = cond_t * cfg_factor + cond_vae_images = cond_vae_images * cfg_factor + + if cfg_factor > 1: + batch_cond_vit_images = batch_cond_vit_images * cfg_factor + + return cond_vae_images, cond_t, batch_cond_vit_images + + @staticmethod + def check_inputs(prompt=None, message_list=None): + if prompt is None and message_list is None: + raise ValueError("Either `prompt` or `message_list` should be provided.") + if prompt is not None and message_list is not None: + raise ValueError("Only one of `prompt` or `message_list` should be provided.") + if prompt is not None: + assert isinstance(prompt, str) or isinstance(prompt, list), ( + f"`prompt` should be a string or a list of strings, but got {type(prompt)}." + ) + if isinstance(prompt, list): + assert len(prompt) > 0 and all(isinstance(p, str) for p in prompt), ( + "`prompt` should be a non-empty list of strings." + ) + if message_list is not None: + if not isinstance(message_list, list): + raise ValueError(f"`message_list` should be a list of messages, but got {type(message_list)}.") + assert len(message_list) > 0, "`message_list` should be a non-empty list." + for message in message_list: + assert isinstance(message, list) or isinstance(message, dict), ( + f"Each message should be a list of dicts or a dict, but got {type(message)}." + ) + + def prepare_model_inputs( + self, + prompt=None, + mode="gen_image", + system_prompt=None, + cot_text=None, + num_inference_steps=50, + guidance_scale=5.0, + image_size="auto", + message_list=None, + device=None, + max_new_tokens=None, + **kwargs, + ): + # 1. Sanity check + self.check_inputs(prompt, message_list) + device = default(device, self.device) + + # 2. Format inputs + batch_message_list = message_list + batch_prompt = prompt + batch_cot_text = cot_text + batch_system_prompt = system_prompt + batch_gen_image_info = None + # TODO: construct with user input images + batch_cond_image_info = None + + # -- 2.1 message_list + if batch_message_list is not None: + if isinstance(batch_message_list[0], dict): + batch_message_list = [batch_message_list] + batch_size = len(batch_message_list) + + batch_gen_image_info = [ + [message["content"] for message in message_list_ if message["type"] == "gen_image"] + for message_list_ in batch_message_list + ] + # At most one gen_image is allowed for each message_list + batch_gen_image_info = [info[-1] if len(info) > 0 else None for info in batch_gen_image_info] + # Multiple cond images are allowed. + batch_cond_image_info = [ + [message["content"] for message in message_list_ if message["type"] == "joint_image"] + for message_list_ in batch_message_list + ] + + # -- 2.2 Prompt, cot text, system prompt + else: + if isinstance(batch_prompt, str): + batch_prompt = [batch_prompt] + batch_size = len(batch_prompt) + + if batch_cot_text is not None: + if isinstance(batch_cot_text, str): + batch_cot_text = [batch_cot_text] + else: + assert isinstance(batch_cot_text, list) and len(batch_cot_text) == batch_size, ( + "`cot_text` should be a string or a list of strings with the same length as `prompt`." + ) + + if batch_system_prompt is not None: + if isinstance(batch_system_prompt, str): + batch_system_prompt = [batch_system_prompt] + else: + assert isinstance(batch_system_prompt, list) and len(batch_system_prompt) == batch_size, ( + "`system_prompts` should be a string or a list of strings with the same length as `prompt`." + ) + + if mode == "gen_image": + batch_gen_image_info = [self.image_processor.build_image_info(image_size) for _ in range(batch_size)] + + # -- 2.3 seed + generator = kwargs.get("generator", None) + if generator is None: + seeds = self.prepare_seed(seed=kwargs.get("seed"), batch_size=batch_size) + generator = [torch.Generator(self.device).manual_seed(seed) for seed in seeds] + + # 3. apply chat template + cfg_factor = {"gen_text": 1, "gen_image": 2} + bot_task = kwargs.pop("bot_task", "auto") + # If `drop_think` enabled, always drop parts in the context. + drop_think = kwargs.get("drop_think", self.generation_config.drop_think) + # Apply batched prompt or batched message_list to build input sequence with associated info. + out = self._tkwrapper.apply_chat_template( + batch_prompt=batch_prompt, + batch_message_list=batch_message_list, + mode=mode, + batch_gen_image_info=batch_gen_image_info, + batch_cond_image_info=batch_cond_image_info, + batch_system_prompt=batch_system_prompt, + batch_cot_text=batch_cot_text, + max_length=kwargs.get("max_length"), + bot_task=bot_task, + image_base_size=self.config.image_base_size, + sequence_template="pretrain", + cfg_factor=cfg_factor[mode], + drop_think=drop_think, + ) + output, sections = out["output"], out["sections"] + + # 4. Encode conditional images + if batch_cond_image_info is not None and len(batch_cond_image_info[0]) > 0: + cond_vae_images, cond_timestep, cond_vit_images = self._encode_cond_image( + batch_cond_image_info, cfg_factor[mode] + ) + # Pack vit kwargs. Siglip2-so requires spatial_shapes and attention_mask for inference. + vit_kwargs = {"spatial_shapes": [], "attention_mask": []} + for cond_image_info in batch_cond_image_info: + vit_kwargs["spatial_shapes"].append( + torch.stack([item.vision_encoder_kwargs["spatial_shapes"] for item in cond_image_info]) + ) + vit_kwargs["attention_mask"].append( + torch.stack([item.vision_encoder_kwargs["pixel_attention_mask"] for item in cond_image_info]) + ) + if cfg_factor[mode] > 1: + vit_kwargs["spatial_shapes"] = vit_kwargs["spatial_shapes"] * cfg_factor[mode] + vit_kwargs["attention_mask"] = vit_kwargs["attention_mask"] * cfg_factor[mode] + else: + cond_vae_images, cond_timestep, cond_vit_images = None, None, None + vit_kwargs = None + + # 5. Build position embeddings + rope_image_info = self.build_batch_rope_image_info(output, sections) + if mode == "gen_text": + seq_len = self.generation_config.max_length + else: + seq_len = output.tokens.shape[1] + cos, sin = build_batch_2d_rope( + image_infos=rope_image_info, + seq_len=seq_len, + n_elem=self.config.attention_head_dim, + device=device, + base=self.config.rope_theta, + ) + + # 6. Build kv cache + if bot_task == "img_ratio": + max_new_tokens = 1 + + # 7. Build position ids + batch_input_pos = torch.arange(0, output.tokens.shape[1], dtype=torch.long, device=device)[None].expand( + batch_size * cfg_factor[mode], -1 + ) # use expand to share indices to save memory + + # 8. Build model input kwargs + tkw = self._tkwrapper + if image_size == "auto": + extra_auto_stops = [tkw.special_token_map[f""] for i in range(33)] + else: + extra_auto_stops = [tkw.boi_token_id] + stop_token_id = dict( + auto=[tkw.eos_token_id] + extra_auto_stops, + image=[tkw.eos_token_id], + recaption=[tkw.end_recaption_token_id, tkw.end_answer_token_id, tkw.eos_token_id], + think=[tkw.end_recaption_token_id, tkw.end_answer_token_id, tkw.eos_token_id], + img_ratio=extra_auto_stops, + ) + model_input_kwargs = dict( + input_ids=output.tokens.to(device), + position_ids=batch_input_pos, + past_key_values=None, + custom_pos_emb=(cos, sin), + mode=mode, + num_inference_steps=num_inference_steps, + guidance_scale=guidance_scale, + image_mask=to_device(output.gen_image_mask, device), + gen_timestep_scatter_index=to_device(output.gen_timestep_scatter_index, device), + cond_vae_images=to_device(cond_vae_images, device), + cond_timestep=to_device(cond_timestep, device), + cond_vae_image_mask=to_device(output.cond_vae_image_mask, device), + cond_vit_images=to_device(cond_vit_images, device), + cond_vit_image_mask=to_device(output.cond_vit_image_mask, device), + vit_kwargs={k: to_device(v, self.device) for k, v in vit_kwargs.items()} + if vit_kwargs is not None + else None, + cond_timestep_scatter_index=to_device(output.cond_timestep_scatter_index, device), + # for inner usage + tokenizer_output=output, + batch_gen_image_info=batch_gen_image_info, + generator=generator, + # generation config + eos_token_id=stop_token_id[bot_task], + max_new_tokens=max_new_tokens, + ) + + return model_input_kwargs + + def _prepare_attention_mask_for_generation( + self, + inputs_tensor: torch.Tensor, + generation_config: GenerationConfig, + model_kwargs: dict[str, Any], + ) -> torch.Tensor: + # create `4d` bool attention mask (b, 1, seqlen, seqlen) using this implementation to bypass the 2d requirement + # in the `transformers.generation_utils.GenerationMixin.generate`. + # This implementation can handle sequences with text and image modalities, where text tokens use causal + # attention and image tokens use full attention. + bsz, seq_len = inputs_tensor.shape + tokenizer_output = model_kwargs["tokenizer_output"] + batch_image_slices = [ + tokenizer_output.joint_image_slices[i] + tokenizer_output.gen_image_slices[i] for i in range(bsz) + ] + attention_mask = torch.ones(seq_len, seq_len, dtype=torch.bool).tril(diagonal=0).repeat(bsz, 1, 1) + for i in range(bsz): + for j, image_slice in enumerate(batch_image_slices[i]): + attention_mask[i, image_slice, image_slice] = True + attention_mask = attention_mask.unsqueeze(1) + return attention_mask + + def prepare_inputs_for_generation( + self, + input_ids, + past_key_values=None, + attention_mask=None, + inputs_embeds=None, + tokenizer_output=None, + batch_gen_image_info=None, + generator=None, + **kwargs, + ): + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + if input_ids.shape[1] != kwargs["position_ids"].shape[1]: # in decode steps + input_ids = torch.gather(input_ids, dim=1, index=kwargs["position_ids"]) + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "attention_mask": attention_mask, + "position_ids": kwargs["position_ids"], + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "custom_pos_emb": kwargs["custom_pos_emb"], + "mode": kwargs["mode"], + "images": kwargs.get("images"), + "image_mask": kwargs.get("image_mask"), + "timestep": kwargs.get("timestep"), + "gen_timestep_scatter_index": kwargs.get("gen_timestep_scatter_index"), + "cond_vae_images": kwargs.get("cond_vae_images"), + "cond_timestep": kwargs.get("cond_timestep"), + "cond_vae_image_mask": kwargs.get("cond_vae_image_mask"), + "cond_vit_images": kwargs.get("cond_vit_images"), + "cond_vit_image_mask": kwargs.get("cond_vit_image_mask"), + "vit_kwargs": kwargs.get("vit_kwargs"), + "cond_timestep_scatter_index": kwargs.get("cond_timestep_scatter_index"), + "query_lens": kwargs.get("query_lens"), + "seq_lens": kwargs.get("seq_lens"), + "num_image_tokens": kwargs.get("num_image_tokens"), + } + ) + return model_inputs + + def _update_model_kwargs_for_generation( + self, + outputs: ModelOutput, + model_kwargs: dict[str, Any], + is_encoder_decoder: bool = False, + num_new_tokens: int = 1, + ) -> dict[str, Any]: + mode = model_kwargs["mode"] + + updated_model_kwargs = { + "mode": mode, + "custom_pos_emb": model_kwargs["custom_pos_emb"], + } + + # update past_key_values keeping its naming used in model code + for possible_cache_name in ALL_CACHE_NAMES: + if possible_cache_name in outputs: + # TODO (joao): remove output/input mismatch when these old models (xlnet, reformer) are deprecated + if possible_cache_name in ("past_buckets_states", "mems"): + cache_name = "past_key_values" + else: + cache_name = possible_cache_name + updated_model_kwargs[cache_name] = getattr(outputs, possible_cache_name) + break + + if "tokenizer_output" in model_kwargs: + if mode == "gen_text": + # When enable batching, we use right padding, which requires a real_pos to index the valid + # end position of the sequence. If tokenizer_output in model_kwargs, it means we are in the + # prefill step of generation. + real_pos = to_device(model_kwargs["tokenizer_output"].real_pos, self.device) + updated_model_kwargs["position_ids"] = real_pos + else: + # position ids + image_mask = model_kwargs["image_mask"] + bsz, seq_len = image_mask.shape + index = torch.arange(seq_len, device=image_mask.device).unsqueeze(0).repeat(bsz, 1) + position_ids = index.masked_select(image_mask.bool()).reshape(bsz, -1) + timestep_position_ids = index[ + torch.arange(bsz), model_kwargs["gen_timestep_scatter_index"][:, -1] + ].unsqueeze(-1) + updated_model_kwargs["position_ids"] = torch.cat([timestep_position_ids, position_ids], dim=1) + + # attention mask + mask_list = [] + for attention_mask_i, position_ids_i in zip( + model_kwargs["attention_mask"], updated_model_kwargs["position_ids"] + ): + mask_list.append(torch.index_select(attention_mask_i, dim=1, index=position_ids_i.reshape(-1))) + attention_mask = torch.stack(mask_list, dim=0) + updated_model_kwargs["attention_mask"] = attention_mask + updated_model_kwargs["gen_timestep_scatter_index"] = model_kwargs["gen_timestep_scatter_index"] + + else: + if mode == "gen_text": + # Now we are in the decode steps. + updated_model_kwargs["position_ids"] = model_kwargs["position_ids"] + 1 + else: + updated_model_kwargs["position_ids"] = model_kwargs["position_ids"] + updated_model_kwargs["attention_mask"] = model_kwargs["attention_mask"] + updated_model_kwargs["gen_timestep_scatter_index"] = model_kwargs["gen_timestep_scatter_index"] + + return updated_model_kwargs + + def _generate( + self, + generator: list[torch.Generator] | None = None, + **kwargs, + ): + mode = kwargs.get("mode", "gen_text") + # verbose > 1 not support + if mode == "gen_text": + raise NotImplementedError("Not support gen text for hunyuan image") + + elif mode == "gen_image": + batch_gen_image_info: list[ImageInfo] = kwargs.get("batch_gen_image_info") + if batch_gen_image_info is None: + raise ValueError("`batch_gen_image_info` should be provided when `mode` is `gen_image`.") + + image_info: ImageInfo = batch_gen_image_info[0] + num_image_tokens = ( + image_info.image_token_length + + (1 if image_info.add_timestep_token else 0) + + (1 if image_info.add_guidance_token else 0) + ) + kwargs["num_image_tokens"] = num_image_tokens + # 50 and 5.0 hard code + from vllm.forward_context import set_forward_context + + with set_forward_context(None, self.vllm_config): + results = self.pipeline( + batch_size=len(batch_gen_image_info), + image_size=[batch_gen_image_info[0].image_height, batch_gen_image_info[0].image_width], + num_inference_steps=kwargs.get("num_inference_steps", 50), + guidance_scale=kwargs.get("guidance_scale", 5.0), + generator=generator, + model_kwargs=kwargs, + ) + samples = results[0] + return samples + + else: + raise ValueError(f"Unknown mode {mode}, only `gen_text` and `gen_image` are supported.") + + @staticmethod + def _check_inputs(cond, target, check_list): + if cond: + for name, item in check_list: + assert item is not None, f"`{name}` should be provided when `{target}`." + + def forward_call( + self, + input_ids: torch.LongTensor | None = None, + attention_mask: torch.Tensor | None = None, + position_ids: torch.LongTensor | None = None, + past_key_values: list[torch.FloatTensor] | None = None, + use_cache: bool | None = None, + output_attentions: bool | None = None, + output_hidden_states: bool | None = None, + return_dict: bool | None = None, + custom_pos_emb: tuple[torch.FloatTensor] | None = None, + mode: str = "gen_text", + first_step: bool | None = None, + # for gen image + images: BatchRaggedImages | None = None, + image_mask: torch.Tensor | None = None, + timestep: BatchRaggedTensor | None = None, + gen_timestep_scatter_index: torch.Tensor | None = None, + # for cond image + cond_vae_images: BatchRaggedImages | None = None, + cond_timestep: BatchRaggedTensor | None = None, + cond_vae_image_mask: torch.Tensor | None = None, + cond_vit_images: BatchRaggedImages | None = None, + cond_vit_image_mask: torch.Tensor | None = None, + vit_kwargs: dict[str, Any] | None = None, + cond_timestep_scatter_index: torch.Tensor | None = None, + query_lens: list[int] | None = None, + seq_lens: list[int] | None = None, + num_image_tokens: int | None = None, + ) -> tuple | CausalMMOutputWithPast: + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + # Sanity Check of Inputs + self._check_inputs( + mode == "gen_image", + "in `gen_image` mode", + [ + ("images", images), + ("timestep", timestep), + ("gen_timestep_scatter_index", gen_timestep_scatter_index), + ], + ) + self._check_inputs( + mode == "gen_image" and first_step, + "in `gen_image` mode at the first step", + [ + ("image_mask", image_mask), + ], + ) + self._check_inputs( + cond_vae_images is not None, + "`cond_vae_images` is provided", + [ + ("cond_timestep", cond_timestep), + ("cond_vae_image_mask", cond_vae_image_mask), + ("cond_timestep_scatter_index", cond_timestep_scatter_index), + ], + ) + self._check_inputs( + cond_vit_images is not None, + "`cond_vit_images` is provided", + [ + ("cond_vit_image_mask", cond_vit_image_mask), + ("vit_kwargs", vit_kwargs), + ], + ) + + custom_pos_emb = self.get_pos_emb(custom_pos_emb, position_ids) + + inputs_embeds = self.model.wte(input_ids) + + bsz, seq_len, n_embd = inputs_embeds.shape + + # Instantiate placeholder tokens: , for the gen image + if mode == "gen_text": + # For gen_text, make sure gen_timestep_scatter_index is None + gen_timestep_scatter_index = None + token_h, token_w = None, None + else: + if first_step: + inputs_embeds, token_h, token_w = self.instantiate_vae_image_tokens( + inputs_embeds, images, timestep, image_mask + ) + inputs_embeds = self.instantiate_timestep_tokens(inputs_embeds, timestep, gen_timestep_scatter_index) + else: + t_emb = self.time_embed(timestep) + image_emb, token_h, token_w = self.patch_embed(images, t_emb) + timestep_emb = self.timestep_emb(timestep).reshape(bsz, -1, n_embd) + inputs_embeds = torch.cat([timestep_emb, image_emb], dim=1) + + # Instantiate placeholder tokens: , for cond images + # Should only run once with kv-cache enabled. + if cond_vae_images is not None: + inputs_embeds, _, _ = self.instantiate_vae_image_tokens( + inputs_embeds, cond_vae_images, cond_timestep, cond_vae_image_mask + ) + inputs_embeds = self.instantiate_timestep_tokens(inputs_embeds, cond_timestep, cond_timestep_scatter_index) + if cond_vit_images is not None: + inputs_embeds = self.instantiate_vit_image_tokens( + inputs_embeds, cond_vit_images, cond_vit_image_mask, vit_kwargs + ) + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + custom_pos_emb=custom_pos_emb, + mode=mode, + first_step=first_step, + query_lens=query_lens, + seq_lens=seq_lens, + num_image_tokens=num_image_tokens, + gen_timestep_scatter_index=gen_timestep_scatter_index, + ) + hidden_states = outputs[0] + + if mode == "gen_text": + hidden_states = self.model.ln_f(hidden_states) + logits = self.lm_head(hidden_states) + logits = logits.float() + diffusion_prediction = None + else: + logits = None + hidden_states = hidden_states.to(input_ids.device) + assert hidden_states.numel() == bsz * seq_len * n_embd, ( + f"Shape mismatch: {hidden_states.shape} cannot reshape to ({bsz}, {seq_len}, {n_embd})" + ) + hidden_states = hidden_states.reshape(bsz, seq_len, n_embd) + diffusion_prediction = self.ragged_final_layer( + hidden_states, image_mask, timestep, token_h, token_w, first_step + ) + + if not return_dict: + output = (logits,) + outputs[1:] + (diffusion_prediction,) + return output + + output = CausalMMOutputWithPast( + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + diffusion_prediction=diffusion_prediction, + ) + + return output + + def forward( + self, + req: OmniDiffusionRequest, + prompt: str | list[str] = "", + image_size="auto", + height: int = 1024, + width: int = 1024, + num_inference_steps: int = 50, + guidance_scale: float = 5.0, + system_prompt: str | None = None, + generator: torch.Generator | list[torch.Generator] | None = None, + **kwargs, + ) -> DiffusionOutput: + prompt = [p if isinstance(p, str) else (p.get("prompt") or "") for p in req.prompts] or prompt + generator = req.sampling_params.generator or generator + height = req.sampling_params.height or height + width = req.sampling_params.width or width + num_inference_steps = req.sampling_params.num_inference_steps or num_inference_steps + if req.sampling_params.guidance_scale_provided: + guidance_scale = req.sampling_params.guidance_scale + if guidance_scale <= 1.0: + logger.warning("HunyuanImage3.0 does not support guidance_scale <= 1.0, will set it to 1.0 + epsilon.") + guidance_scale = 1.0 + np.finfo(float).eps + image_size = (height, width) + model_inputs = self.prepare_model_inputs( + prompt=prompt, + cot_text=None, + system_prompt=system_prompt, + mode="gen_image", + generator=generator, + image_size=image_size, + num_inference_steps=num_inference_steps, + guidance_scale=guidance_scale, + ) + outputs = self._generate(**model_inputs, **kwargs) + return DiffusionOutput(output=outputs[0]) diff --git a/vllm_omni/diffusion/registry.py b/vllm_omni/diffusion/registry.py index 024352479..3d236ac31 100644 --- a/vllm_omni/diffusion/registry.py +++ b/vllm_omni/diffusion/registry.py @@ -85,6 +85,11 @@ _DIFFUSION_MODELS = { "pipeline_sd3", "StableDiffusion3Pipeline", ), + "HunyuanImage3ForCausalMM": ( + "hunyuan_image_3", + "pipeline_hunyuan_image_3", + "HunyuanImage3Pipeline", + ), "Flux2KleinPipeline": ( "flux2_klein", "pipeline_flux2_klein", diff --git a/vllm_omni/diffusion/worker/diffusion_model_runner.py b/vllm_omni/diffusion/worker/diffusion_model_runner.py index 38f438062..0e12460e8 100644 --- a/vllm_omni/diffusion/worker/diffusion_model_runner.py +++ b/vllm_omni/diffusion/worker/diffusion_model_runner.py @@ -87,18 +87,17 @@ class DiffusionModelRunner: return nullcontext() # Load model within forward context - with set_forward_context(vllm_config=self.vllm_config, omni_diffusion_config=self.od_config): - load_config = LoadConfig() - model_loader = DiffusersPipelineLoader(load_config) - time_before_load = time.perf_counter() + load_config = LoadConfig() + model_loader = DiffusersPipelineLoader(load_config) + time_before_load = time.perf_counter() - with get_memory_context(): - with DeviceMemoryProfiler() as m: - self.pipeline = model_loader.load_model( - od_config=self.od_config, - load_device=load_device, - ) - time_after_load = time.perf_counter() + with get_memory_context(): + with DeviceMemoryProfiler() as m: + self.pipeline = model_loader.load_model( + od_config=self.od_config, + load_device=load_device, + ) + time_after_load = time.perf_counter() logger.info( "Model loading took %.4f GiB and %.6f seconds", diff --git a/vllm_omni/diffusion/worker/diffusion_worker.py b/vllm_omni/diffusion/worker/diffusion_worker.py index 0fad90a5b..6f5bd00e6 100644 --- a/vllm_omni/diffusion/worker/diffusion_worker.py +++ b/vllm_omni/diffusion/worker/diffusion_worker.py @@ -13,10 +13,11 @@ from contextlib import AbstractContextManager, nullcontext import torch import zmq -from vllm.config import VllmConfig +from vllm.config import CompilationConfig, VllmConfig, set_current_vllm_config from vllm.distributed.device_communicators.shm_broadcast import MessageQueue from vllm.logger import init_logger from vllm.utils.mem_utils import GiB_bytes +from vllm.v1.worker.workspace import init_workspace_manager from vllm_omni.diffusion.data import ( DiffusionOutput, @@ -84,13 +85,16 @@ class DiffusionWorker: current_omni_platform.set_device(self.device) # Create vllm_config for parallel configuration - vllm_config = VllmConfig() + vllm_config = VllmConfig(compilation_config=CompilationConfig()) vllm_config.parallel_config.tensor_parallel_size = self.od_config.parallel_config.tensor_parallel_size vllm_config.parallel_config.data_parallel_size = self.od_config.parallel_config.data_parallel_size self.vllm_config = vllm_config # Initialize distributed environment - with set_forward_context(vllm_config=vllm_config, omni_diffusion_config=self.od_config): + with ( + set_forward_context(vllm_config=self.vllm_config, omni_diffusion_config=self.od_config), + set_current_vllm_config(self.vllm_config), + ): init_distributed_environment(world_size=world_size, rank=rank) logger.info(f"Worker {self.rank}: Initialized device and distributed environment.") @@ -104,16 +108,17 @@ class DiffusionWorker: tensor_parallel_size=parallel_config.tensor_parallel_size, pipeline_parallel_size=parallel_config.pipeline_parallel_size, ) + init_workspace_manager(self.device) - # Create model runner and load model - self.model_runner = DiffusionModelRunner( - vllm_config=self.vllm_config, - od_config=self.od_config, - device=self.device, - ) - self.model_runner.load_model( - memory_pool_context_fn=self._maybe_get_memory_pool_context, - ) + # Create model runner and load model + self.model_runner = DiffusionModelRunner( + vllm_config=self.vllm_config, + od_config=self.od_config, + device=self.device, + ) + self.model_runner.load_model( + memory_pool_context_fn=self._maybe_get_memory_pool_context, + ) assert self.model_runner.pipeline is not None self.lora_manager = DiffusionLoRAManager( pipeline=self.model_runner.pipeline, diff --git a/vllm_omni/entrypoints/async_omni_diffusion.py b/vllm_omni/entrypoints/async_omni_diffusion.py index 535f04f7d..11a3c07e1 100644 --- a/vllm_omni/entrypoints/async_omni_diffusion.py +++ b/vllm_omni/entrypoints/async_omni_diffusion.py @@ -98,6 +98,10 @@ class AsyncOmniDiffusion: od_config.model_class_name = "BagelPipeline" od_config.tf_model_config = TransformerConfig() od_config.update_multimodal_support() + elif architectures and len(architectures) == 1: + od_config.model_class_name = architectures[0] + else: + raise # Initialize engine self.engine: DiffusionEngine = DiffusionEngine.make_engine(od_config) diff --git a/vllm_omni/entrypoints/omni_diffusion.py b/vllm_omni/entrypoints/omni_diffusion.py index 5ad9a91c8..9f6dde15b 100644 --- a/vllm_omni/entrypoints/omni_diffusion.py +++ b/vllm_omni/entrypoints/omni_diffusion.py @@ -80,6 +80,8 @@ class OmniDiffusion: od_config.model_class_name = "BagelPipeline" od_config.tf_model_config = TransformerConfig() od_config.update_multimodal_support() + elif architectures and len(architectures) == 1: + od_config.model_class_name = architectures[0] else: raise