From 70d7bcfc66f9b0b69a1ef90d7004320a0c07846c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 22:45:58 +0000 Subject: [PATCH 1/2] Initial plan From a97a4da92b39dd25154e5a711b3d5de899d94fe5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 22:47:14 +0000 Subject: [PATCH 2/2] Revert "[Config Refactor] Derive deploy override fields from stage config (#3162)" This reverts commit 01ebc0cdf542bb46db90ca8ecb641f26ca9247a0. Signed-off-by: GitHub Co-authored-by: Gaohan123 <20148503+Gaohan123@users.noreply.github.com> --- .buildkite/bootstrap-amd-omni.sh | 246 -- .buildkite/bootstrap-intel-omni.sh | 51 - .buildkite/nightly-release-pipeline.yaml | 20 - .buildkite/pipeline-intel.yaml | 16 - .buildkite/pipeline.yml | 76 - .buildkite/release-pipeline.yaml | 38 - .buildkite/scripts/docker_login_ecr_public.sh | 73 - .../generate-and-upload-nightly-index.sh | 88 - .buildkite/scripts/generate-nightly-index.py | 192 - .../scripts/hardware_ci/run-amd-test.sh | 154 - .../scripts/hardware_ci/run-xpu-test.sh | 56 - .../scripts/hardware_ci/run_npu_test.sh | 145 - .buildkite/scripts/upload-nightly-wheels.sh | 33 - .../scripts/upload_pipeline_with_skip_ci.sh | 137 - .buildkite/test-amd-merge.yml | 223 -- .buildkite/test-amd-ready.yaml | 229 -- .buildkite/test-amd.yaml | 133 - .buildkite/test-merge.yml | 487 --- .buildkite/test-nightly.yml | 807 ----- .buildkite/test-ready.yml | 621 ---- .buildkite/test-template-amd-omni.j2 | 62 - .buildkite/test-weekly.yml | 85 - .claude/skills/add-diffusion-model/SKILL.md | 575 --- .../references/cache-dit-patterns.md | 254 -- .../references/custom-model-patterns.md | 273 -- .../references/parallelism-patterns.md | 571 --- .../references/transformer-adaptation.md | 218 -- .../references/troubleshooting.md | 178 - .claude/skills/add-tts-model/SKILL.md | 504 --- .../references/cuda-graph-example.md | 42 - .../add-tts-model/references/optional-deps.md | 47 - .../add-tts-model/references/precommit-dco.md | 54 - .../references/single-stage-ar.md | 108 - .claude/skills/readme.md | 34 - .claude/skills/vllm-omni-npu-upgrade/SKILL.md | 300 -- .../references/gpu-to-npu-translation.md | 335 -- .../references/omni-specific-blocks.md | 374 -- .../references/workflow-checklist.md | 222 -- .gitattributes | 45 - .github/CODEOWNERS | 17 - .github/ISSUE_TEMPLATE/100-documentation.yml | 29 - .github/ISSUE_TEMPLATE/200-installation.yml | 47 - .github/ISSUE_TEMPLATE/400-bug-report.yml | 129 - .../ISSUE_TEMPLATE/500-feature-request.yml | 38 - .github/ISSUE_TEMPLATE/600-new-model.yml | 45 - .../700-performance-discussion.yml | 59 - .github/ISSUE_TEMPLATE/750-RFC.yml | 54 - .github/ISSUE_TEMPLATE/config.yml | 5 - .github/PULL_REQUEST_TEMPLATE.md | 21 - .github/mergify.yml | 223 -- .github/scripts/detect_changed_tests.sh | 89 - .github/workflows/build_wheel.yml | 63 - .github/workflows/pre-commit.yml | 26 - .gitignore | 271 -- .pre-commit-config.yaml | 71 - .readthedocs.yml | 24 - CONTRIBUTING.md | 3 - LICENSE | 201 -- README.md | 97 - apps/ComfyUI-vLLM-Omni/.gitignore | 115 - apps/ComfyUI-vLLM-Omni/LICENSE | 15 - apps/ComfyUI-vLLM-Omni/README.md | 184 - apps/ComfyUI-vLLM-Omni/__init__.py | 61 - .../comfyui_vllm_omni/__init__.py | 1 - .../comfyui_vllm_omni/nodes.py | 736 ---- .../comfyui_vllm_omni/utils/api_client.py | 585 --- .../comfyui_vllm_omni/utils/format.py | 304 -- .../comfyui_vllm_omni/utils/logger.py | 125 - .../comfyui_vllm_omni/utils/models.py | 118 - .../comfyui_vllm_omni/utils/types.py | 55 - .../comfyui_vllm_omni/utils/validators.py | 93 - .../docs/images/comfyui-chaining-services.jpg | Bin 265984 -> 0 bytes .../docs/images/comfyui-image-generation.jpg | Bin 135014 -> 0 bytes .../docs/images/comfyui-multi-stage.jpg | Bin 217410 -> 0 bytes .../docs/images/comfyui-tts.jpg | Bin 309855 -> 0 bytes .../docs/images/comfyui-understanding.jpg | Bin 423088 -> 0 bytes .../docs/images/comfyui-video-generation.jpg | Bin 132038 -> 0 bytes .../vLLM-Omni Chaining Services.json | 552 --- .../vLLM-Omni Image Generation.json | 1 - .../vLLM-Omni Multimodal Understanding.json | 761 ---- .../example_workflows/vLLM-Omni TTS.json | 1 - .../vLLM-Omni Video Generation.json | 513 --- apps/ComfyUI-vLLM-Omni/web/main.js | 21 - benchmarks/README.md | 44 - benchmarks/__init__.py | 1 - benchmarks/accuracy/README.md | 27 - benchmarks/accuracy/__init__.py | 1 - benchmarks/accuracy/common.py | 199 - benchmarks/accuracy/image_to_image/README.md | 103 - .../accuracy/image_to_image/__init__.py | 1 - .../accuracy/image_to_image/gedit_bench.py | 718 ---- .../image_to_image/run_gedit_bench.py | 13 - benchmarks/accuracy/text_to_image/README.md | 103 - benchmarks/accuracy/text_to_image/__init__.py | 1 - benchmarks/accuracy/text_to_image/gbench.py | 927 ----- .../accuracy/text_to_image/run_gebench.py | 13 - .../download_process_data_seedtts.md | 82 - .../build_dataset/extract_tts_prompts.py | 73 - .../build_dataset/seed_tts_design/en/meta.lst | 20 - .../build_dataset/seed_tts_smoke/en/meta.lst | 20 - benchmarks/diffusion/README.md | 138 - benchmarks/diffusion/backends.py | 359 -- .../diffusion/diffusion_benchmark_serving.py | 1139 ------ .../qwen_image_serving_performance.md | 169 - .../wan_2_2_serving_performance.md | 170 - benchmarks/diffusion/quantization_quality.py | 460 --- .../distributed/omni_connectors/README.md | 397 -- .../cross_node_mooncake_transfer_engine.py | 644 ---- benchmarks/fish-speech/bench_voice_cache.py | 290 -- benchmarks/fish-speech/fish_bench_utils.py | 501 --- benchmarks/glm_image/README.md | 157 - benchmarks/glm_image/__init__.py | 0 benchmarks/glm_image/benchmark_glm_image.py | 464 --- benchmarks/glm_image/huggingface/inference.py | 291 -- benchmarks/glm_image/vllm-omni/inference.py | 505 --- benchmarks/tts/README.md | 227 -- benchmarks/tts/bench_tts.py | 308 -- benchmarks/tts/bench_voxcpm_offline.py | 922 ----- benchmarks/tts/model_configs.yaml | 39 - benchmarks/tts/plot_results.py | 324 -- collect_env.py | 760 ---- docker/Dockerfile.ci | 18 - docker/Dockerfile.cuda | 22 - docker/Dockerfile.npu | 31 - docker/Dockerfile.npu.a3 | 31 - docker/Dockerfile.rocm | 73 - docker/Dockerfile.xpu | 150 - docs/.nav.yml | 134 - docs/README.md | 64 - docs/api/README.md | 154 - docs/assets/WeChat.jpg | Bin 183932 -> 0 bytes docs/cli/README.md | 42 - docs/cli/bench/serve.md | 359 -- docs/cli/serve.md | 65 - docs/community/contact_us.md | 5 - docs/community/governance.md | 54 - docs/community/meetups.md | 1 - docs/community/volunteers.md | 12 - docs/configuration/README.md | 23 - docs/configuration/gpu_memory_utilization.md | 207 -- docs/configuration/pd_disaggregation.md | 171 - docs/configuration/stage_configs.md | 509 --- docs/contributing/DOCS_GUIDE.md | 139 - docs/contributing/README.md | 151 - docs/contributing/ci/.nav.yaml | 6 - docs/contributing/ci/CI_5levels.md | 725 ---- docs/contributing/ci/failures.md | 106 - .../test_examples/l4_doc_example_tests.inc.md | 49 - .../l4_functionality_tests.inc.md | 46 - .../test_examples/l4_performance_tests.inc.md | 89 - docs/contributing/ci/test_guide.md | 106 - docs/contributing/ci/tests_markers.md | 179 - docs/contributing/ci/tests_style.md | 467 --- docs/contributing/metrics.md | 173 - docs/contributing/model/README.md | 15 - .../model/adding_diffusion_model.md | 1071 ------ docs/contributing/model/adding_omni_model.md | 624 ---- docs/contributing/model/adding_tts_model.md | 968 ----- docs/contributing/profiling.md | 286 -- docs/design/architecture_overview.md | 202 -- docs/design/feature/async_chunk.md | 275 -- docs/design/feature/cache_dit.md | 286 -- docs/design/feature/cfg_parallel.md | 350 -- .../feature/diffusion_step_execution.md | 121 - .../design/feature/disaggregated_inference.md | 108 - docs/design/feature/expert_parallel.md | 221 -- docs/design/feature/hsdp.md | 146 - .../mooncake_store_connector.md | 312 -- .../mooncake_transfer_engine_connector.md | 793 ---- .../shared_memory_connector.md | 259 -- .../omni_connectors/yuanrong_connector.md | 358 -- docs/design/feature/prefix_caching.md | 164 - docs/design/feature/ray_based_execution.md | 59 - docs/design/feature/sequence_parallel.md | 531 --- docs/design/feature/teacache.md | 491 --- docs/design/feature/tensor_parallel.md | 279 -- docs/design/feature/vae_parallel.md | 459 --- .../omni/E2EL_s_vllm_omni_vs_transformers.png | Bin 63871 -> 0 bytes .../omni/Mean_AUDIO_RTF_Baseline_vs_Batch.png | Bin 80513 -> 0 bytes ...IO_RTF_Batch_CUDA_Graph_vs_Async_Chunk.png | Bin 105443 -> 0 bytes ...an_AUDIO_RTF_Batch_vs_Batch_CUDA_Graph.png | Bin 83563 -> 0 bytes .../Mean_AUDIO_TTFP_ms_Baseline_vs_Batch.png | Bin 99062 -> 0 bytes ...TFP_ms_Batch_CUDA_Graph_vs_Async_Chunk.png | Bin 133057 -> 0 bytes ...UDIO_TTFP_ms_Batch_vs_Batch_CUDA_Graph.png | Bin 122692 -> 0 bytes .../omni/Mean_E2EL_ms_Baseline_vs_Batch.png | Bin 91868 -> 0 bytes ...2EL_ms_Batch_CUDA_Graph_vs_Async_Chunk.png | Bin 128096 -> 0 bytes ...Mean_E2EL_ms_Batch_vs_Batch_CUDA_Graph.png | Bin 113942 -> 0 bytes .../omni/RTF_vllm_omni_vs_transformers.png | Bin 79240 -> 0 bytes .../omni/Summary_E2EL_ms_vs_features.png | Bin 122120 -> 0 bytes .../figures/omni/Summary_RTF_vs_features.png | Bin 121480 -> 0 bytes .../omni/Summary_TTFP_ms_vs_features.png | Bin 137299 -> 0 bytes .../omni/TTFP_s_vllm_omni_vs_transformers.png | Bin 74184 -> 0 bytes ...an_AUDIO_RTF_vllm_omni_vs_transformers.png | Bin 38116 -> 0 bytes ...IO_TTFP_(ms)_vllm_omni_vs_transformers.png | Bin 36456 -> 0 bytes ...an_E2EL_(ms)_vllm_omni_vs_transformers.png | Bin 41027 -> 0 bytes .../Mean_mean_e2e_ms_baseline_vs_batch.png | Bin 49409 -> 0 bytes .../Mean_mean_e2e_ms_batch_vs_cuda_graph.png | Bin 54071 -> 0 bytes ..._mean_e2e_ms_cuda_graph_vs_async_chunk.png | Bin 57813 -> 0 bytes .../tts/Mean_mean_rtf_baseline_vs_batch.png | Bin 42613 -> 0 bytes .../tts/Mean_mean_rtf_batch_vs_cuda_graph.png | Bin 51213 -> 0 bytes ...ean_mean_rtf_cuda_graph_vs_async_chunk.png | Bin 57362 -> 0 bytes .../Mean_mean_ttfp_ms_baseline_vs_batch.png | Bin 52794 -> 0 bytes .../Mean_mean_ttfp_ms_batch_vs_cuda_graph.png | Bin 57641 -> 0 bytes ...mean_ttfp_ms_cuda_graph_vs_async_chunk.png | Bin 60567 -> 0 bytes .../tts/Summary_mean_e2e_ms_vs_features.png | Bin 93599 -> 0 bytes .../tts/Summary_mean_rtf_vs_features.png | Bin 92452 -> 0 bytes .../tts/Summary_mean_ttfp_ms_vs_features.png | Bin 99973 -> 0 bytes docs/design/index.md | 18 - docs/design/module/ar_module.md | 387 -- docs/design/module/async_omni_architecture.md | 203 -- docs/design/module/dit_module.md | 945 ----- docs/design/module/entrypoint_module.md | 1 - ...qwen3_omni_tts_performance_optimization.md | 539 --- docs/examples/README.md | 6 - docs/features/comfyui.md | 71 - docs/features/custom_pipeline.md | 151 - docs/features/sleep_mode.md | 243 -- docs/getting_started/installation/.nav.yml | 4 - docs/getting_started/installation/README.md | 10 - docs/getting_started/installation/gpu.md | 107 - .../installation/gpu/cuda.inc.md | 112 - .../installation/gpu/musa.inc.md | 65 - .../installation/gpu/rocm.inc.md | 155 - .../installation/gpu/xpu.inc.md | 48 - docs/getting_started/installation/npu.md | 33 - .../installation/npu/npu.inc.md | 129 - .../installation/python_env_setup.inc.md | 6 - docs/getting_started/quickstart.md | 122 - docs/mkdocs/hooks/generate_api_readme.py | 280 -- docs/mkdocs/hooks/generate_argparse.py | 260 -- docs/mkdocs/hooks/generate_examples.py | 346 -- docs/mkdocs/hooks/url_schemes.py | 121 - docs/mkdocs/javascript/edit_and_feedback.js | 47 - docs/mkdocs/javascript/mathjax.js | 20 - docs/mkdocs/javascript/mermaid.js | 21 - docs/mkdocs/javascript/slack_and_forum.js | 56 - docs/mkdocs/overrides/main.html | 1 - docs/mkdocs/overrides/partials/toc-item.html | 21 - docs/mkdocs/stylesheets/extra.css | 221 -- docs/models/supported_models.md | 70 - docs/serving/audio_generate_api.md | 338 -- docs/serving/diffusion_chat_api.md | 78 - docs/serving/image_edit_api.md | 207 -- docs/serving/image_generation_api.md | 249 -- docs/serving/speech_api.md | 616 ---- docs/serving/video_stream_api.md | 93 - .../architecture/ar-dit-main-architecture.png | Bin 109126 -> 0 bytes .../architecture/ar-main-architecture.png | Bin 98888 -> 0 bytes .../architecture/async-chunk-architecture.png | Bin 231325 -> 0 bytes .../architecture/dit-main-architecture.png | Bin 129195 -> 0 bytes .../omni-modality-model-architecture.png | Bin 54056 -> 0 bytes .../architecture/qwen3-omni-async-chunk.png | Bin 68497 -> 0 bytes .../qwen3-omni-non-async-chunk.png | Bin 49242 -> 0 bytes .../vllm-omni-dataflow-between-stages.png | Bin 155207 -> 0 bytes .../architecture/vllm-omni-diffusion-flow.png | Bin 323599 -> 0 bytes .../vllm-omni-main-architecture.png | Bin 375707 -> 0 bytes .../architecture/vllm-omni-user-interface.png | Bin 491204 -> 0 bytes docs/source/logos/vllm-logo-only-light.ico | Bin 16958 -> 0 bytes docs/source/logos/vllm-omni-logo.png | Bin 41964 -> 0 bytes .../qwen3-omni_e2e_performance.png | Bin 34631 -> 0 bytes .../qwen3-omni_rtf_performance.png | Bin 37994 -> 0 bytes .../qwen3-omni_ttfp_performance.png | Bin 45694 -> 0 bytes docs/usage/faq.md | 21 - .../diffusion/attention_backends.md | 120 - .../diffusion/cache_acceleration/cache_dit.md | 292 -- .../diffusion/cache_acceleration/teacache.md | 194 - .../diffusion/cpu_offload_diffusion.md | 202 -- .../diffusion/frame_interpolation.md | 92 - docs/user_guide/diffusion/lora.md | 149 - .../diffusion/parallelism/cfg_parallel.md | 169 - .../diffusion/parallelism/expert_parallel.md | 87 - docs/user_guide/diffusion/parallelism/hsdp.md | 149 - .../diffusion/parallelism/overview.md | 16 - .../parallelism/sequence_parallel.md | 233 -- .../diffusion/parallelism/tensor_parallel.md | 151 - .../parallelism/vae_patch_parallel.md | 200 -- docs/user_guide/diffusion/step_execution.md | 61 - docs/user_guide/diffusion_features.md | 281 -- .../examples/offline_inference/bagel.md | 287 -- .../examples/offline_inference/cosyvoice3.md | 81 - .../examples/offline_inference/fish_speech.md | 85 - .../examples/offline_inference/glm_image.md | 87 - .../examples/offline_inference/helios.md | 203 -- .../offline_inference/hunyuan_image3.md | 35 - .../offline_inference/image_to_image.md | 69 - .../offline_inference/image_to_video.md | 90 - .../offline_inference/internvla_a1.md | 205 -- .../mammothmodal2_preview.md | 46 - .../examples/offline_inference/mimo_audio.md | 219 -- .../offline_inference/qwen2_5_omni.md | 84 - .../examples/offline_inference/qwen3_omni.md | 148 - .../examples/offline_inference/qwen3_tts.md | 172 - .../offline_inference/text_to_audio.md | 66 - .../offline_inference/text_to_image.md | 285 -- .../offline_inference/text_to_video.md | 156 - .../examples/offline_inference/voxtral_tts.md | 69 - .../offline_inference/x_to_video_audio.md | 94 - .../examples/online_serving/bagel.md | 339 -- .../examples/online_serving/chart-helm.md | 226 -- .../diffusers_pipeline_adapter.md | 93 - .../examples/online_serving/fish_speech.md | 199 - .../examples/online_serving/glm_image.md | 189 - .../examples/online_serving/image_to_image.md | 444 --- .../examples/online_serving/image_to_video.md | 284 -- .../examples/online_serving/mimo_audio.md | 72 - .../examples/online_serving/qwen2_5_omni.md | 234 -- .../examples/online_serving/qwen3_omni.md | 306 -- .../examples/online_serving/qwen3_tts.md | 451 --- .../examples/online_serving/text_to_audio.md | 193 - .../examples/online_serving/text_to_image.md | 314 -- .../examples/online_serving/text_to_video.md | 394 -- docs/user_guide/feature_compatibility.md | 218 -- docs/user_guide/quantization/autoround.md | 127 - docs/user_guide/quantization/fp8.md | 121 - docs/user_guide/quantization/gguf.md | 107 - docs/user_guide/quantization/int8.md | 107 - docs/user_guide/quantization/msmodelslim.md | 95 - docs/user_guide/quantization/online.md | 93 - docs/user_guide/quantization/overview.md | 134 - examples/offline_inference/bagel/README.md | 277 -- examples/offline_inference/bagel/end2end.py | 292 -- .../offline_inference/cosyvoice3/README.md | 71 - .../cosyvoice3/verify_e2e_cosyvoice.py | 179 - .../image_to_image/custom_pipeline.py | 80 - .../image_to_image/image_edit.py | 281 -- .../custom_pipeline/image_to_image/run.sh | 6 - .../offline_inference/dynin_omni/README.md | 110 - .../offline_inference/dynin_omni/end2end.py | 1451 -------- .../offline_inference/fish_speech/README.md | 75 - .../offline_inference/fish_speech/end2end.py | 277 -- examples/offline_inference/helios/README.md | 193 - examples/offline_inference/helios/end2end.py | 355 -- .../hunyuan_image3/README.md | 161 - .../hunyuan_image3/end2end.py | 265 -- .../image_to_image/image_edit.py | 566 --- .../image_to_image/image_to_image.md | 56 - .../run_qwen_image_edit_2511.sh | 8 - .../image_to_video/README.md | 80 - .../image_to_video/image_to_video.py | 558 --- .../offline_inference/internvla_a1/README.md | 30 - .../internvla_a1/collect_results.sh | 220 -- .../offline_inference/internvla_a1/end2end.py | 327 -- .../internvla_a1/internvla_a1_common.py | 471 --- .../offline_inference/internvla_a1/run.sh | 23 - .../offline_inference/magi_human/README.md | 72 - .../offline_inference/magi_human/end2end.py | 122 - .../mammothmodal2_preview/README.md | 32 - .../run_mammothmoda2_image_summarize.py | 121 - .../run_mammothmoda2_t2i.py | 250 -- .../offline_inference/mimo_audio/README.md | 201 -- .../offline_inference/mimo_audio/end2end.py | 446 --- .../mimo_audio/message_base64_wav.json | 56 - .../mimo_audio/message_convert.py | 714 ---- .../mimo_audio/process_speechdata.py | 261 -- .../ming_flash_omni/README.md | 92 - .../ming_flash_omni/end2end.py | 507 --- .../ming_flash_omni_tts/README.md | 47 - .../ming_flash_omni_tts/end2end.py | 128 - .../offline_inference/moss_tts_nano/README.md | 101 - .../moss_tts_nano/end2end.py | 180 - .../offline_inference/omnivoice/README.md | 73 - .../offline_inference/omnivoice/end2end.py | 163 - .../offline_inference/qwen2_5_omni/README.md | 62 - .../offline_inference/qwen2_5_omni/end2end.py | 558 --- .../qwen2_5_omni/extract_prompts.py | 44 - .../qwen2_5_omni/run_multiple_prompts.sh | 4 - .../qwen2_5_omni/run_single_prompt.sh | 2 - .../offline_inference/qwen3_omni/README.md | 110 - .../offline_inference/qwen3_omni/end2end.py | 560 --- .../qwen3_omni/end2end_async_chunk.py | 619 ---- .../qwen3_omni/run_multiple_prompts.sh | 4 - .../run_multiple_prompts_async_chunk.sh | 23 - .../qwen3_omni/run_single_prompt.sh | 2 - .../run_single_prompt_async_chunk.sh | 26 - .../qwen3_omni/run_single_prompt_tp.sh | 5 - .../qwen3_omni/text_prompts_10.txt | 10 - .../offline_inference/qwen3_tts/README.md | 121 - .../qwen3_tts/benchmark_prompts.txt | 12 - .../offline_inference/qwen3_tts/end2end.py | 552 --- .../offline_inference/text_to_audio/README.md | 58 - .../text_to_audio/text_to_audio.py | 320 -- .../offline_inference/text_to_image/README.md | 282 -- .../text_to_image/gradio_demo.py | 240 -- .../text_to_image/text_to_image.py | 528 --- .../text_to_video/text_to_video.md | 144 - .../text_to_video/text_to_video.py | 525 --- .../vace/vace_video_generation.md | 88 - .../vace/vace_video_generation.py | 209 -- examples/offline_inference/voxcpm/README.md | 123 - examples/offline_inference/voxcpm/end2end.py | 206 -- examples/offline_inference/voxcpm2/README.md | 83 - examples/offline_inference/voxcpm2/end2end.py | 171 - .../offline_inference/voxtral_tts/README.md | 59 - .../offline_inference/voxtral_tts/end2end.py | 391 -- .../x_to_video_audio/download_dreamid_omni.py | 108 - .../x_to_video_audio/x_to_video_audio.md | 82 - .../x_to_video_audio/x_to_video_audio.py | 176 - examples/online_serving/bagel/README.md | 322 -- .../bagel/openai_chat_client.py | 184 - examples/online_serving/bagel/run_server.sh | 12 - .../bagel/run_server_stage_cli.sh | 164 - .../online_serving/chart-helm/.helmignore | 6 - examples/online_serving/chart-helm/Chart.yaml | 15 - examples/online_serving/chart-helm/README.md | 144 - examples/online_serving/chart-helm/ct.yaml | 3 - .../online_serving/chart-helm/lintconf.yaml | 42 - .../chart-helm/templates/_helpers.tpl | 203 -- .../chart-helm/templates/configmap.yaml | 11 - .../chart-helm/templates/custom-objects.yaml | 6 - .../chart-helm/templates/deployment.yaml | 106 - .../chart-helm/templates/hpa.yaml | 31 - .../chart-helm/templates/ingress.yaml | 32 - .../templates/poddisruptionbudget.yaml | 12 - .../chart-helm/templates/pvc.yaml | 16 - .../chart-helm/templates/secrets.yaml | 23 - .../chart-helm/templates/service.yaml | 14 - .../chart-helm/tests/deployment_test.yaml | 181 - .../chart-helm/tests/ingress_test.yaml | 86 - .../chart-helm/tests/pvc_test.yaml | 73 - .../chart-helm/tests/secrets_test.yaml | 48 - .../online_serving/chart-helm/values.yaml | 197 - .../diffusers_pipeline_adapter/README.md | 83 - .../stage_config.yaml | 31 - examples/online_serving/dynin_omni/README.md | 97 - ...letion_client_for_multimodal_generation.py | 342 -- examples/online_serving/fish_speech/README.md | 169 - .../online_serving/fish_speech/gradio_demo.py | 275 -- .../fish_speech/run_gradio_demo.sh | 43 - .../online_serving/fish_speech/run_server.sh | 19 - .../fish_speech/speech_client.py | 129 - examples/online_serving/helios/README.md | 175 - .../online_serving/helios/helios_client.py | 212 -- .../helios/run_helios_distilled.sh | 79 - .../helios/run_helios_mid_stage2.sh | 81 - .../online_serving/helios/run_helios_t2v.sh | 69 - .../online_serving/image_to_image/README.md | 363 -- .../image_to_image/gradio_demo.py | 204 -- .../image_to_image/openai_chat_client.py | 168 - .../image_to_image/run_curl_image_edit.sh | 61 - .../image_to_image/run_server.sh | 12 - .../online_serving/image_to_video/README.md | 279 -- .../run_curl_hunyuan_video_15.sh | 68 - .../image_to_video/run_curl_image_to_video.sh | 80 - .../image_to_video/run_server.sh | 25 - .../run_server_hunyuan_video_15.sh | 31 - examples/online_serving/mimo_audio/README.md | 61 - .../mimo_audio/chat_template.jinja | 86 - ...letion_client_for_multimodal_generation.py | 545 --- .../online_serving/ming_flash_omni/README.md | 95 - .../run_curl_multimodal_generation.sh | 145 - .../ming_flash_omni_tts/README.md | 54 - .../ming_flash_omni_tts/run_server.sh | 25 - .../ming_flash_omni_tts/speech_client.py | 93 - .../online_serving/moss_tts_nano/README.md | 158 - .../moss_tts_nano/gradio_demo.py | 690 ---- .../moss_tts_nano/run_gradio_demo.sh | 43 - .../moss_tts_nano/run_server.sh | 19 - examples/online_serving/omnivoice/README.md | 131 - .../online_serving/omnivoice/run_server.sh | 19 - .../online_serving/omnivoice/speech_client.py | 84 - ...letion_client_for_multimodal_generation.py | 590 --- .../online_serving/qwen2_5_omni/README.md | 210 -- .../qwen2_5_omni/gradio_demo.py | 592 --- .../run_curl_multimodal_generation.sh | 194 - .../qwen2_5_omni/run_gradio_demo.sh | 212 -- examples/online_serving/qwen3_omni/README.md | 526 --- .../online_serving/qwen3_omni/gradio_demo.py | 586 --- .../qwen3_omni/openai_realtime_client.py | 332 -- .../qwen3_omni/qwen3_omni_moe_thinking.yaml | 36 - .../run_curl_multimodal_generation.sh | 172 - .../qwen3_omni/run_gradio_demo.sh | 212 -- .../qwen3_omni/streaming_video_client.py | 208 -- examples/online_serving/qwen3_tts/README.md | 455 --- .../qwen3_tts/batch_speech_client.py | 163 - .../online_serving/qwen3_tts/gradio_demo.py | 804 ----- .../qwen3_tts/openai_speech_client.py | 262 -- .../qwen3_tts/run_gradio_demo.sh | 202 -- .../online_serving/qwen3_tts/run_server.sh | 39 - .../speaker_embedding_interpolation.py | 379 -- .../qwen3_tts/streaming_speech_client.py | 249 -- .../online_serving/qwen3_tts/tts_common.py | 223 -- .../online_serving/stable_audio/README.md | 234 -- .../stable_audio/curl_examples.sh | 54 - .../stable_audio/stable_audio_client.py | 170 - .../online_serving/text_to_image/README.md | 275 -- .../text_to_image/gradio_demo.py | 189 - .../text_to_image/openai_chat_client.py | 183 - .../text_to_image/run_curl_text_to_image.sh | 10 - .../text_to_image/run_server.sh | 12 - .../online_serving/text_to_video/README.md | 322 -- .../run_curl_hunyuan_video_15.sh | 60 - .../text_to_video/run_curl_ltx2.sh | 66 - .../text_to_video/run_curl_text_to_video.sh | 63 - .../text_to_video/run_server.sh | 31 - .../run_server_hunyuan_video_15.sh | 31 - .../text_to_video/run_server_ltx2.sh | 84 - examples/online_serving/voxcpm/README.md | 166 - .../voxcpm/openai_speech_client.py | 155 - examples/online_serving/voxcpm/run_server.sh | 38 - examples/online_serving/voxcpm2/README.md | 43 - .../online_serving/voxcpm2/gradio_demo.py | 599 ---- .../voxcpm2/openai_speech_client.py | 105 - .../online_serving/voxtral_tts/gradio_demo.py | 522 --- .../voxtral_tts/text_preprocess.py | 404 --- mkdocs.yml | 173 - pyproject.toml | 238 -- recipes/LTX/LTX-2.3.md | 112 - recipes/Qwen/Qwen3-Omni.md | 245 -- recipes/README.md | 39 - recipes/TEMPLATE.md | 82 - recipes/Wan-AI/Wan2.2-I2V.md | 136 - recipes/inclusionAI/Ming-flash-omni-2.0.md | 210 -- requirements/common.txt | 18 - requirements/cpu.txt | 2 - requirements/cuda.txt | 5 - requirements/musa.txt | 6 - requirements/npu.txt | 3 - requirements/rocm.txt | 2 - requirements/xpu.txt | 2 - scripts/build_wheel.sh | 139 - setup.py | 244 -- tests/__init__.py | 6 - tests/assets/cosyvoice3/zero_shot_prompt.wav | Bin 334138 -> 0 bytes tests/assets/qwen3_tts/clone_2.wav | Bin 775738 -> 0 bytes tests/benchmarks/conftest.py | 103 - tests/benchmarks/metrics/test_metrics.py | 67 - tests/benchmarks/patch/test_patch.py | 632 ---- tests/benchmarks/test_accuracy_bench_utils.py | 747 ---- tests/benchmarks/test_bench_tts_cli.py | 139 - .../test_diffusion_backends_metrics.py | 107 - .../test_seed_tts_dataset_variants.py | 226 -- tests/benchmarks/test_serve_cli.py | 143 - tests/comfyui/conftest.py | 89 - tests/comfyui/test_comfyui_integration.py | 786 ---- tests/config/__init__.py | 0 tests/config/test_pipeline_registry.py | 99 - tests/conftest.py | 62 - .../test_chunk_scheduling_coordinator.py | 690 ---- .../test_generation_scheduler_restore.py | 105 - tests/core/sched/test_omni_scheduler_mixin.py | 129 - tests/core/test_prefix_cache.py | 349 -- tests/dfx/conftest.py | 412 --- .../scripts/diffusion_result_template.json | 86 - .../perf/scripts/result_omni_template.json | 55 - tests/dfx/perf/scripts/run_benchmark.py | 398 -- .../perf/scripts/run_diffusion_benchmark.py | 742 ---- tests/dfx/perf/tests/test_ltx2_vllm_omni.json | 217 -- .../test_qwen_image_edit_2509_vllm_omni.json | 167 - .../tests/test_qwen_image_edit_vllm_omni.json | 161 - .../test_qwen_image_layered_vllm_omni.json | 49 - .../perf/tests/test_qwen_image_vllm_omni.json | 185 - tests/dfx/perf/tests/test_qwen_omni.json | 315 -- tests/dfx/perf/tests/test_runner_metadata.py | 79 - tests/dfx/perf/tests/test_tts.json | 155 - .../perf/tests/test_wan22_i2v_vllm_omni.json | 107 - tests/dfx/reliability/README.md | 14 - tests/dfx/reliability/conftest.py | 29 - tests/dfx/reliability/helpers.py | 567 --- .../test_reliability_qwen3_omni.py | 682 ---- .../dfx/reliability/test_reliability_wan22.py | 411 --- tests/dfx/stability/README.md | 90 - tests/dfx/stability/conftest.py | 125 - tests/dfx/stability/helpers.py | 504 --- tests/dfx/stability/scripts/__init__.py | 1 - .../dfx/stability/scripts/generate_report.py | 364 -- .../dfx/stability/scripts/resource_monitor.sh | 329 -- .../scripts/test_stability_qwen3_omni.py | 68 - .../scripts/test_stability_qwen3_tts.py | 68 - .../scripts/test_stability_qwen_image.py | 68 - .../stability/scripts/test_stability_wan22.py | 68 - .../dfx/stability/tests/test_qwen3_omni.json | 97 - tests/dfx/stability/tests/test_qwen3_tts.json | 56 - .../dfx/stability/tests/test_qwen_image.json | 28 - tests/dfx/stability/tests/test_wan22.json | 31 - .../diffusion/attention/test_attention_sp.py | 529 --- tests/diffusion/attention/test_flash_attn.py | 293 -- tests/diffusion/attention/test_ulysses_uaa.py | 308 -- tests/diffusion/cache/__init__.py | 6 - tests/diffusion/cache/test_cache_backends.py | 270 -- tests/diffusion/cache/test_cache_dit.py | 40 - .../cache/test_teacache_extractors.py | 422 --- .../distributed/test_autoencoder_kl_wan.py | 43 - .../test_autoencoder_kl_wan_encode.py | 273 -- .../distributed/test_cfg_parallel.py | 769 ---- tests/diffusion/distributed/test_comm.py | 406 --- .../test_distributed_vae_executor.py | 159 - tests/diffusion/distributed/test_hsdp.py | 386 -- .../test_parallel_state_sp_groups.py | 68 - .../distributed/test_sp_plan_hooks.py | 1064 ------ .../distributed/test_ulysses_uaa_perf.py | 235 -- .../distributed/test_vae_patch_parallel.py | 224 -- tests/diffusion/hooks/test_hook_registry.py | 164 - tests/diffusion/layers/__init__.py | 0 tests/diffusion/layers/test_adalayernorm.py | 237 -- tests/diffusion/layers/test_norm.py | 453 --- .../layers/test_rotary_emb_equivalence.py | 112 - tests/diffusion/lora/helpers.py | 56 - tests/diffusion/lora/test_base_linear.py | 174 - tests/diffusion/lora/test_lora_manager.py | 577 --- .../test_flux2_klein_gguf_adapter.py | 112 - .../test_qwen_image_gguf_adapter.py | 184 - .../test_z_image_gguf_adapter.py | 83 - .../model_loader/test_diffusers_loader.py | 95 - .../test_diffusers_loader_gguf.py | 268 -- tests/diffusion/models/bagel/__init__.py | 0 .../diffusion/models/bagel/test_bagel_lora.py | 248 -- .../models/bagel/test_combine_cfg.py | 316 -- .../models/bagel/test_trajectory_recording.py | 293 -- tests/diffusion/models/dmd2/__init__.py | 0 .../dmd2/test_dmd2_request_sanitization.py | 180 - .../models/dmd2/test_dmd2_scheduler.py | 93 - tests/diffusion/models/flux/__init__.py | 0 .../flux/test_flux_prefix_propagation.py | 134 - .../models/flux2/test_flux2_transformer_tp.py | 255 -- .../models/glm_image/test_glm_image_sp.py | 132 - .../hunyuan_image3/test_hunyuan_fused_moe.py | 155 - .../test_hunyuan_image3_sampler.py | 190 - .../models/ltx2/test_ltx2_3_pipeline.py | 230 -- .../ltx2/test_ltx2_cfg_parallel_adaptation.py | 58 - tests/diffusion/models/ltx2/test_ltx2_hsdp.py | 25 - .../test_nextstep_cfg_parallel_layout.py | 219 -- .../qwen_image/test_qwen_image_edit_plus.py | 38 - .../test_qwen_image_max_sequence_length.py | 260 -- .../qwen_image/test_qwen_image_size_utils.py | 26 - .../stable_audio/test_stable_audio_hsdp.py | 25 - .../t5_encoder/test_t5_encoder_prefix.py | 164 - .../models/t5_encoder/test_t5_encoder_tp.py | 161 - tests/diffusion/models/wan2_2/__init__.py | 0 tests/diffusion/models/wan2_2/conftest.py | 80 - .../models/wan2_2/test_wan22_i2v_pipeline.py | 125 - .../wan2_2/test_wan22_pipeline_diffuse.py | 155 - .../wan2_2/test_wan22_pipeline_helpers.py | 81 - .../models/wan2_2/test_wan22_ti2v_pipeline.py | 97 - .../models/wan2_2/test_wan22_vace_pipeline.py | 137 - .../z_image/test_zimage_tp_constraints.py | 46 - .../offloader/test_layerwise_backend.py | 242 -- .../offloader/test_module_collector.py | 240 -- .../offloader/test_sequential_backend.py | 126 - tests/diffusion/quantization/__init__.py | 2 - .../quantization/test_component_routing.py | 408 --- .../diffusion/quantization/test_fp8_config.py | 366 -- .../quantization/test_gguf_config.py | 128 - .../diffusion/quantization/test_inc_config.py | 147 - .../quantization/test_int8_config.py | 436 --- .../quantization/test_quantization_quality.py | 244 -- tests/diffusion/test_data_is_moe.py | 78 - tests/diffusion/test_diffusers_adapter.py | 186 - .../test_diffusion_engine_metrics.py | 105 - .../diffusion/test_diffusion_model_runner.py | 173 - tests/diffusion/test_diffusion_request.py | 30 - tests/diffusion/test_diffusion_scheduler.py | 659 ---- .../diffusion/test_diffusion_step_pipeline.py | 773 ---- tests/diffusion/test_diffusion_worker.py | 323 -- .../test_diffusion_worker_cuda_profiler.py | 101 - .../test_inline_stage_diffusion_client.py | 96 - .../test_multiproc_engine_concurrency.py | 791 ---- tests/diffusion/test_stage_diffusion_proc.py | 75 - tests/diffusion/test_worker_wrapper_base.py | 546 --- .../omni_connectors/test_adapter_and_flow.py | 237 -- .../omni_connectors/test_basic_connectors.py | 180 - .../test_chunk_transfer_adapter.py | 606 ---- .../omni_connectors/test_kv_flow.py | 546 --- .../test_mooncake_transfer_engine_buffer.py | 227 -- .../test_mooncake_transfer_engine_rdma.py | 752 ---- .../test_omni_connector_configs.py | 66 - .../omni_connectors/test_shm_connector.py | 184 - .../omni_connectors/test_tp_rank_aware.py | 716 ---- .../omni_coordinator/test_load_balancer.py | 234 -- .../test_omni_coord_client_for_hub.py | 121 - .../test_omni_coord_client_for_stage.py | 312 -- .../omni_coordinator/test_omni_coordinator.py | 280 -- tests/e2e/__init__.py | 0 tests/e2e/accuracy/conftest.py | 284 -- tests/e2e/accuracy/helpers.py | 115 - tests/e2e/accuracy/qwen3_omni/__init__.py | 2 - .../qwen3_omni/qwen3_omni_acc_bench_core.py | 201 -- .../qwen3_omni/run_qwen_omni_acc_benchmark.py | 428 --- .../accuracy/qwen3_omni/test_qwen3_omni.py | 137 - tests/e2e/accuracy/test_gebench_h100_smoke.py | 96 - .../accuracy/test_gedit_bench_h100_smoke.py | 114 - .../accuracy/test_ltx2_3_video_similarity.py | 410 --- tests/e2e/accuracy/test_qwen_image.py | 122 - tests/e2e/accuracy/test_qwen_image_edit.py | 228 -- tests/e2e/accuracy/test_qwen_image_layered.py | 149 - tests/e2e/accuracy/wan22_i2v/__init__.py | 0 .../wan22_i2v/run_wan22_i2v_diffusers_cp.py | 165 - .../test_wan22_i2v_video_similarity.py | 668 ---- .../wan22_i2v_video_similarity_common.py | 24 - tests/e2e/offline_inference/__init__.py | 0 tests/e2e/offline_inference/compute_lpips.py | 129 - .../custom_pipeline/__init__.py | 14 - .../flow_match_sde_scheduler.py | 220 -- .../qwen_image_pipeline_with_logprob.py | 406 --- .../test_async_omni_collective_rpc.py | 152 - .../test_async_omni_qwen_image_generate.py | 251 -- .../custom_pipeline/test_worker_extension.py | 56 - .../custom_pipeline/worker_extension.py | 21 - .../offline_inference/run_quantization_e2e.sh | 200 -- .../offline_inference/test_bagel_img2img.py | 220 -- .../e2e/offline_inference/test_bagel_lora.py | 195 - .../offline_inference/test_bagel_text2img.py | 369 -- .../test_bagel_understanding.py | 135 - tests/e2e/offline_inference/test_cache_dit.py | 77 - .../e2e/offline_inference/test_cosyvoice3.py | 199 - .../test_diffusion_cpu_offload.py | 72 - .../test_diffusion_layerwise_offload.py | 89 - .../offline_inference/test_diffusion_lora.py | 136 - .../e2e/offline_inference/test_dynin_omni.py | 374 -- .../offline_inference/test_expert_parallel.py | 247 -- tests/e2e/offline_inference/test_flux.py | 37 - .../e2e/offline_inference/test_flux2_klein.py | 227 -- .../test_flux_autoround_w4a16.py | 116 - .../offline_inference/test_flux_kontext.py | 107 - .../test_hunyuanimage3_text2img.py | 343 -- .../offline_inference/test_internvla_a1.py | 90 - .../test_ltx2_cfg_parallel_parity.py | 243 -- .../e2e/offline_inference/test_magi_human.py | 141 - .../offline_inference/test_mammoth_moda2.py | 212 -- .../offline_inference/test_ming_flash_omni.py | 195 - .../offline_inference/test_moss_tts_nano.py | 131 - .../offline_inference/test_omni_sleep_mode.py | 159 - tests/e2e/offline_inference/test_omnivoice.py | 79 - .../e2e/offline_inference/test_ovis_image.py | 292 -- .../test_quantization_fp8.py | 319 -- .../test_qwen2_5_omni_autoround_w4a16.py | 170 - .../test_qwen2_5_omni_expansion.py | 101 - .../e2e/offline_inference/test_qwen3_omni.py | 64 - .../test_qwen3_omni_autoround_w4a16.py | 205 -- .../offline_inference/test_qwen3_tts_base.py | 91 - .../test_qwen3_tts_customvoice.py | 80 - .../test_qwen_image_diffusion_batching.py | 626 ---- .../test_sequence_parallel.py | 414 --- .../test_stable_audio_expansion.py | 99 - tests/e2e/offline_inference/test_t2i_model.py | 75 - tests/e2e/offline_inference/test_t2v_model.py | 56 - tests/e2e/offline_inference/test_teacache.py | 73 - .../test_vae_decode_parallelism.py | 152 - tests/e2e/offline_inference/test_voxcpm.py | 156 - tests/e2e/offline_inference/test_voxcpm2.py | 122 - .../e2e/offline_inference/test_voxtral_tts.py | 192 - .../test_zimage_parallelism.py | 275 -- tests/e2e/online_serving/__init__.py | 0 .../online_serving/test_bagel_expansion.py | 196 - tests/e2e/online_serving/test_bagel_online.py | 125 - .../e2e/online_serving/test_cosyvoice3_tts.py | 136 - .../online_serving/test_diffusers_adapter.py | 56 - .../test_dynin_omni_expansion.py | 93 - .../online_serving/test_flux2_expansion.py | 112 - .../test_flux2_klein_inpaint_expansion.py | 156 - .../test_flux_2_dev_expansion.py | 85 - .../test_flux_kontext_expansion.py | 153 - .../test_hunyuan_video_15_expansion.py | 93 - .../e2e/online_serving/test_image_gen_edit.py | 278 -- .../test_images_generations_lora.py | 208 -- .../test_longcat_image_edit_expansion.py | 78 - .../test_longcat_image_expansion.py | 78 - tests/e2e/online_serving/test_mimo_audio.py | 137 - .../online_serving/test_ming_flash_omni.py | 246 -- .../e2e/online_serving/test_moss_tts_nano.py | 117 - .../online_serving/test_nextstep_expansion.py | 71 - tests/e2e/online_serving/test_omnivoice.py | 201 -- .../test_qwen2_5_omni_expansion.py | 118 - tests/e2e/online_serving/test_qwen3_omni.py | 218 -- .../test_qwen3_omni_expansion.py | 550 --- .../e2e/online_serving/test_qwen3_tts_base.py | 108 - .../test_qwen3_tts_base_expansion.py | 114 - .../online_serving/test_qwen3_tts_batch.py | 433 --- .../test_qwen3_tts_customvoice.py | 99 - .../test_qwen3_tts_customvoice_expansion.py | 161 - .../test_qwen3_tts_speaker_embedding.py | 248 -- .../test_qwen3_tts_websocket.py | 145 - .../test_qwen_image_edit_expansion.py | 169 - .../test_qwen_image_expansion.py | 165 - .../test_qwen_image_layered_expansion.py | 243 -- .../e2e/online_serving/test_sd3_expansion.py | 61 - .../test_video_generation_api.py | 260 -- tests/e2e/online_serving/test_voxtral_tts.py | 213 -- .../online_serving/test_wan22_expansion.py | 127 - .../test_wan_2_1_vace_expansion.py | 157 - .../online_serving/test_zimage_expansion.py | 128 - .../bailingmm_moe_v2_lite_ci.yaml | 75 - ...bailingmm_moe_v2_lite_thinker_only_ci.yaml | 35 - tests/e2e/stage_configs/dynin_omni_ci.yaml | 79 - tests/engine/__init__.py | 0 tests/engine/test_arg_utils.py | 316 -- tests/engine/test_async_omni_engine_abort.py | 120 - tests/engine/test_async_omni_engine_input.py | 90 - .../engine/test_async_omni_engine_outputs.py | 101 - .../test_async_omni_engine_stage_init.py | 449 --- tests/engine/test_cfg_companion_tracker.py | 82 - tests/engine/test_cross_stage_lora.py | 44 - tests/engine/test_orchestrator.py | 604 ---- .../test_orchestrator_error_handling.py | 160 - .../test_orchestrator_kv_sender_info.py | 254 -- tests/engine/test_output_modality.py | 154 - tests/engine/test_output_processor.py | 211 -- tests/engine/test_single_stage_mode.py | 1887 ---------- tests/engine/test_stage_engine_core_client.py | 46 - tests/entrypoints/openai_api/__init__.py | 0 .../entrypoints/openai_api/conftest_video.py | 31 - .../openai_api/test_image_server.py | 1651 --------- .../test_qwen3_omni_realtime_websocket.py | 207 -- .../openai_api/test_serving_audio_generate.py | 509 --- .../openai_api/test_serving_chat_metrics.py | 87 - ...test_serving_chat_multistage_generation.py | 93 - .../test_serving_chat_sampling_params.py | 708 ---- .../openai_api/test_serving_chat_speaker.py | 111 - .../openai_api/test_serving_speech.py | 2385 ------------ .../openai_api/test_serving_speech_stream.py | 409 --- .../openai_api/test_serving_speech_voxcpm.py | 143 - .../openai_api/test_serving_video_stream.py | 650 ---- .../openai_api/test_stage_params.py | 84 - .../openai_api/test_text_splitter.py | 253 -- .../openai_api/test_video_api_utils.py | 93 - .../openai_api/test_video_frame_filter.py | 89 - .../openai_api/test_video_server.py | 1293 ------- .../openai_api/test_video_stream_handler.py | 595 --- .../openai_api/test_video_stream_session.py | 289 -- tests/entrypoints/test_async_omni.py | 134 - .../test_async_omni_diffusion_config.py | 178 - tests/entrypoints/test_omni_base_profiler.py | 260 -- tests/entrypoints/test_omni_entrypoints.py | 996 ----- .../entrypoints/test_omni_new_request_data.py | 54 - tests/entrypoints/test_omni_sleep_mode.py | 336 -- tests/entrypoints/test_pd_disaggregation.py | 1222 ------- .../test_realtime_connection_helpers.py | 86 - tests/entrypoints/test_serve.py | 211 -- tests/entrypoints/test_stage_utils.py | 135 - tests/entrypoints/test_utils.py | 469 --- tests/examples/conftest.py | 3 - tests/examples/helpers.py | 383 -- tests/examples/offline_inference/__init__.py | 0 .../test_qwen3_tts_estimator.py | 121 - .../offline_inference/test_text_to_image.py | 38 - tests/examples/online_serving/__init__.py | 0 .../online_serving/test_qwen2_5_omni.py | 265 -- .../online_serving/test_qwen3_omni.py | 220 -- .../online_serving/test_text_to_image.py | 137 - tests/examples/test_slerp_interpolation.py | 55 - tests/helpers/__init__.py | 8 - tests/helpers/assertions.py | 522 --- tests/helpers/env.py | 280 -- tests/helpers/fixtures/__init__.py | 1 - tests/helpers/fixtures/env.py | 59 - tests/helpers/fixtures/log.py | 7 - tests/helpers/fixtures/run_args.py | 17 - tests/helpers/fixtures/runtime.py | 84 - tests/helpers/mark.py | 136 - tests/helpers/media.py | 686 ---- tests/helpers/process.py | 134 - tests/helpers/runtime.py | 1526 -------- tests/helpers/stage_config.py | 549 --- tests/metrics/test_stats.py | 157 - .../cosyvoice3/test_cosyvoice3_components.py | 306 -- .../test_cosyvoice3_model_helpers.py | 463 --- .../cosyvoice3/test_cosyvoice3_utils.py | 232 -- .../dynin_omni/test_dynin_omni_token2audio.py | 22 - .../models/glm_image/test_glm_image_ar.py | 352 -- .../test_mimo_audio_code2wav_batch_decode.py | 227 -- .../models/ming_flash_omni/test_talker_cfm.py | 146 - .../ming_flash_omni/test_talker_modules.py | 162 - .../models/qwen2_5_omni/test_audio_length.py | 55 - .../qwen2_5_omni/test_qwen2_5_omni_embed.py | 319 -- .../models/qwen3_tts/__init__.py | 0 .../qwen3_tts/test_code_predictor_dtype.py | 335 -- .../qwen3_tts/test_cuda_graph_decoder.py | 332 -- .../qwen3_tts/test_qwen3_tts_code2wav.py | 65 - tests/model_executor/models/registry.py | 179 - .../models/test_encoder_quant_config.py | 77 - .../models/test_fish_speech_regressions.py | 106 - .../models/test_fish_speech_voice_cache.py | 218 -- .../models/test_omni_processing.py | 328 -- .../model_executor/models/voxcpm2/__init__.py | 2 - .../voxcpm2/test_talker_state_eviction.py | 120 - .../models/voxtral_tts/__init__.py | 0 .../test_audio_tokenizer_parsing.py | 161 - .../test_cuda_graph_acoustic_transformer.py | 346 -- .../voxtral_tts/test_text_preprocess.py | 74 - .../test_cosyvoice3_stage_input_processors.py | 267 -- .../stage_input_processors/test_glm_image.py | 403 --- .../test_mimo_audio_flush_remaining_codes.py | 78 - .../test_mimo_audio_llm2code2wav.py | 72 - .../test_qwen3_omni_streaming_helpers.py | 81 - .../test_qwen3_tts_async_chunk.py | 397 -- .../test_voxcpm_async_chunk.py | 87 - .../test_voxtral_tts_async_chunk.py | 279 -- tests/profile/test_omni_torch_profiler.py | 582 --- tests/test_arg_utils.py | 488 --- tests/test_config_factory.py | 1401 -------- tests/test_data_entry_keys.py | 252 -- tests/test_diffusion_config_fields.py | 68 - tests/test_diffusion_config_propagation.py | 121 - tests/test_fish_speech_voice_cache.py | 227 -- tests/test_generate_nightly_perf_excel.py | 71 - tests/test_generate_nightly_perf_html.py | 54 - tests/test_outputs.py | 174 - tests/test_version.py | 58 - tests/test_voice_cache.py | 129 - tests/utils/test_audio.py | 79 - .../test_gpu_generation_model_runner.py | 80 - tests/worker/test_omni_connector_mixin.py | 1417 -------- tests/worker/test_omni_gpu_model_runner.py | 329 -- tests/worker/test_process_gpu_memory.py | 148 - tools/configure_stage_memory.py | 367 -- .../nightly/buildkite_testcase_statistics.py | 808 ----- tools/nightly/generate_nightly_perf_excel.py | 872 ----- tools/nightly/generate_nightly_perf_html.py | 1851 ---------- tools/nightly/send_nightly_email.py | 351 -- tools/pre_commit/check_pickle_imports.py | 83 - tools/wan22/assemble_wan22_i2v_diffusers.py | 385 -- vllm_omni/__init__.py | 63 - vllm_omni/assets/video.py | 16 - vllm_omni/benchmarks/data_modules/__init__.py | 0 .../data_modules/daily_omni_dataset.py | 1013 ------ .../data_modules/daily_omni_eval.py | 417 --- .../data_modules/daily_omni_text_audio.py | 255 -- .../random_multi_modal_dataset.py | 152 - .../data_modules/seed_tts_dataset.py | 481 --- .../benchmarks/data_modules/seed_tts_eval.py | 751 ---- vllm_omni/benchmarks/metrics/__init__.py | 0 vllm_omni/benchmarks/metrics/metrics.py | 354 -- vllm_omni/benchmarks/patch/__init__.py | 3 - vllm_omni/benchmarks/patch/patch.py | 1012 ------ vllm_omni/benchmarks/serve.py | 21 - vllm_omni/config/__init__.py | 47 - vllm_omni/config/lora.py | 8 - vllm_omni/config/model.py | 319 -- vllm_omni/config/pipeline_registry.py | 92 - vllm_omni/config/stage_config.py | 1448 -------- vllm_omni/config/yaml_util.py | 65 - vllm_omni/core/__init__.py | 0 vllm_omni/core/prefix_cache.py | 264 -- vllm_omni/core/sched/__init__.py | 13 - vllm_omni/core/sched/omni_ar_scheduler.py | 758 ---- .../core/sched/omni_generation_scheduler.py | 600 ---- vllm_omni/core/sched/omni_scheduler_mixin.py | 33 - .../core/sched/omni_scheduling_coordinator.py | 380 -- vllm_omni/core/sched/output.py | 77 - vllm_omni/data_entry_keys.py | 277 -- vllm_omni/deploy/bagel.yaml | 48 - vllm_omni/deploy/bagel_single_stage.yaml | 22 - vllm_omni/deploy/bagel_think.yaml | 16 - vllm_omni/deploy/cosyvoice3.yaml | 58 - vllm_omni/deploy/fish_qwen3_omni.yaml | 61 - vllm_omni/deploy/glm_image.yaml | 43 - vllm_omni/deploy/mimo_audio.yaml | 57 - vllm_omni/deploy/moss_tts_nano.yaml | 31 - vllm_omni/deploy/qwen2_5_omni.yaml | 94 - vllm_omni/deploy/qwen3_omni_moe.yaml | 100 - vllm_omni/deploy/qwen3_tts.yaml | 74 - vllm_omni/deploy/voxcpm2.yaml | 30 - vllm_omni/deploy/voxtral_tts.yaml | 69 - vllm_omni/diffusion/__init__.py | 0 vllm_omni/diffusion/attention/__init__.py | 2 - .../diffusion/attention/backends/__init__.py | 2 - .../diffusion/attention/backends/abstract.py | 152 - .../attention/backends/flash_attn.py | 211 -- .../diffusion/attention/backends/registry.py | 152 - .../attention/backends/ring/__init__.py | 1 - .../attention/backends/ring/ring_globals.py | 89 - .../attention/backends/ring/ring_kernels.py | 264 -- .../attention/backends/ring/ring_selector.py | 159 - .../attention/backends/ring/ring_utils.py | 176 - .../attention/backends/ring_flash_attn.py | 316 -- .../attention/backends/ring_pytorch_attn.py | 128 - .../diffusion/attention/backends/sage_attn.py | 72 - .../diffusion/attention/backends/sdpa.py | 153 - .../attention/backends/utils/__init__.py | 13 - .../diffusion/attention/backends/utils/fa.py | 311 -- vllm_omni/diffusion/attention/layer.py | 156 - .../diffusion/attention/parallel/__init__.py | 22 - .../diffusion/attention/parallel/base.py | 82 - .../diffusion/attention/parallel/factory.py | 71 - .../diffusion/attention/parallel/ring.py | 175 - .../diffusion/attention/parallel/ulysses.py | 473 --- vllm_omni/diffusion/attention/selector.py | 85 - vllm_omni/diffusion/cache/__init__.py | 27 - vllm_omni/diffusion/cache/base.py | 112 - .../diffusion/cache/cache_dit_backend.py | 1460 -------- vllm_omni/diffusion/cache/selector.py | 38 - .../diffusion/cache/teacache/__init__.py | 45 - vllm_omni/diffusion/cache/teacache/backend.py | 195 - .../cache/teacache/coefficient_estimator.py | 234 -- vllm_omni/diffusion/cache/teacache/config.py | 122 - .../diffusion/cache/teacache/extractors.py | 1281 ------- vllm_omni/diffusion/cache/teacache/hook.py | 278 -- vllm_omni/diffusion/cache/teacache/state.py | 38 - vllm_omni/diffusion/compile.py | 41 - vllm_omni/diffusion/data.py | 888 ----- vllm_omni/diffusion/diffusion_engine.py | 556 --- vllm_omni/diffusion/distributed/__init__.py | 53 - .../distributed/autoencoders/__init__.py | 0 .../autoencoders/autoencoder_kl.py | 210 -- .../autoencoders/autoencoder_kl_qwenimage.py | 120 - .../autoencoders/autoencoder_kl_wan.py | 307 -- .../autoencoders/distributed_vae_executor.py | 193 - .../diffusion/distributed/cfg_parallel.py | 535 --- vllm_omni/diffusion/distributed/comm.py | 276 -- .../distributed/group_coordinator.py | 939 ----- vllm_omni/diffusion/distributed/hsdp.py | 202 -- vllm_omni/diffusion/distributed/hsdp_utils.py | 9 - .../diffusion/distributed/parallel_state.py | 917 ----- vllm_omni/diffusion/distributed/sp_plan.py | 457 --- .../diffusion/distributed/sp_sharding.py | 273 -- vllm_omni/diffusion/distributed/utils.py | 14 - .../distributed/vae_patch_parallel.py | 477 --- vllm_omni/diffusion/envs.py | 72 - vllm_omni/diffusion/executor/__init__.py | 0 vllm_omni/diffusion/executor/abstract.py | 107 - .../diffusion/executor/multiproc_executor.py | 404 --- vllm_omni/diffusion/forward_context.py | 156 - vllm_omni/diffusion/hooks/__init__.py | 33 - vllm_omni/diffusion/hooks/base.py | 292 -- .../diffusion/hooks/sequence_parallel.py | 748 ---- .../inline_stage_diffusion_client.py | 355 -- vllm_omni/diffusion/ipc.py | 138 - vllm_omni/diffusion/layers/__init__.py | 0 vllm_omni/diffusion/layers/adalayernorm.py | 186 - vllm_omni/diffusion/layers/custom_op.py | 59 - vllm_omni/diffusion/layers/norm.py | 188 - vllm_omni/diffusion/layers/rope.py | 243 -- vllm_omni/diffusion/lora/__init__.py | 6 - vllm_omni/diffusion/lora/layers/__init__.py | 22 - .../diffusion/lora/layers/base_linear.py | 152 - .../lora/layers/column_parallel_linear.py | 61 - .../lora/layers/replicated_linear.py | 20 - .../lora/layers/row_parallel_linear.py | 20 - vllm_omni/diffusion/lora/manager.py | 719 ---- vllm_omni/diffusion/lora/utils.py | 88 - vllm_omni/diffusion/model_loader/__init__.py | 0 .../model_loader/diffusers_loader.py | 578 --- .../model_loader/gguf_adapters/__init__.py | 47 - .../model_loader/gguf_adapters/base.py | 96 - .../model_loader/gguf_adapters/flux2_klein.py | 98 - .../model_loader/gguf_adapters/qwen_image.py | 27 - .../model_loader/gguf_adapters/z_image.py | 43 - .../diffusion/model_loader/hub_prefetch.py | 314 -- vllm_omni/diffusion/model_metadata.py | 31 - vllm_omni/diffusion/models/__init__.py | 3 - vllm_omni/diffusion/models/bagel/__init__.py | 0 .../diffusion/models/bagel/autoencoder.py | 324 -- .../models/bagel/bagel_transformer.py | 2510 ------------- .../diffusion/models/bagel/pipeline_bagel.py | 962 ----- .../models/cosyvoice3_audio/__init__.py | 2 - .../models/cosyvoice3_audio/cosyvoice3_dit.py | 446 --- .../models/diffusers_adapter/__init__.py | 12 - .../pipeline_diffusers_adapter.py | 358 -- vllm_omni/diffusion/models/dmd2/__init__.py | 8 - vllm_omni/diffusion/models/dmd2/mixin.py | 88 - .../diffusion/models/dreamid_omni/__init__.py | 8 - .../diffusion/models/dreamid_omni/fusion.py | 401 --- .../dreamid_omni/pipeline_dreamid_omni.py | 502 --- .../diffusion/models/dreamid_omni/wan2_2.py | 506 --- vllm_omni/diffusion/models/flux/__init__.py | 25 - .../models/flux/flux_pipeline_mixin.py | 114 - .../diffusion/models/flux/flux_transformer.py | 851 ----- .../diffusion/models/flux/pipeline_flux.py | 667 ---- .../models/flux/pipeline_flux_kontext.py | 707 ---- vllm_omni/diffusion/models/flux2/__init__.py | 17 - .../models/flux2/flux2_transformer.py | 779 ---- .../diffusion/models/flux2/pipeline_flux2.py | 1163 ------ .../diffusion/models/flux2_klein/__init__.py | 17 - .../flux2_klein/flux2_klein_transformer.py | 1017 ------ .../flux2_klein/pipeline_flux2_klein.py | 1205 ------- .../diffusion/models/glm_image/__init__.py | 21 - .../models/glm_image/glm_image_transformer.py | 1205 ------- .../models/glm_image/pipeline_glm_image.py | 916 ----- vllm_omni/diffusion/models/helios/__init__.py | 19 - .../models/helios/helios_transformer.py | 955 ----- .../models/helios/pipeline_helios.py | 1106 ------ .../models/helios/scheduling_helios.py | 801 ----- .../models/hunyuan_image3/__init__.py | 14 - .../models/hunyuan_image3/autoencoder.py | 668 ---- .../hunyuan_image3/hunyuan_fused_moe.py | 73 - .../hunyuan_image3_tokenizer.py | 1158 ------ .../hunyuan_image3_transformer.py | 3167 ---------------- .../hunyuan_image3/pipeline_hunyuan_image3.py | 1035 ------ .../models/hunyuan_image3/system_prompt.py | 215 -- .../models/hunyuan_video/__init__.py | 25 - .../hunyuan_video_15_transformer.py | 788 ---- .../pipeline_hunyuan_video_1_5.py | 527 --- .../pipeline_hunyuan_video_1_5_i2v.py | 605 ---- vllm_omni/diffusion/models/interface.py | 85 - .../diffusion/models/internvla_a1/__init__.py | 25 - .../models/internvla_a1/adapter_qwen3_vl.py | 252 -- .../diffusion/models/internvla_a1/config.py | 126 - .../models/internvla_a1/cosmos_ci_torch.py | 416 --- .../models/internvla_a1/model_cosmos.py | 97 - .../models/internvla_a1/model_internvla_a1.py | 962 ----- .../internvla_a1/pipeline_internvla_a1.py | 257 -- .../models/longcat_image/__init__.py | 13 - .../longcat_image_transformer.py | 782 ---- .../longcat_image/pipeline_longcat_image.py | 684 ---- .../pipeline_longcat_image_edit.py | 717 ---- vllm_omni/diffusion/models/ltx2/__init__.py | 38 - .../diffusion/models/ltx2/ltx2_transformer.py | 1974 ---------- .../diffusion/models/ltx2/pipeline_ltx2.py | 1320 ------- .../diffusion/models/ltx2/pipeline_ltx2_3.py | 998 ------ .../ltx2/pipeline_ltx2_3_image2video.py | 18 - .../models/ltx2/pipeline_ltx2_image2video.py | 905 ----- .../ltx2/pipeline_ltx2_latent_upsample.py | 262 -- .../diffusion/models/magi_human/__init__.py | 1 - .../models/magi_human/magi_human_dit.py | 1624 --------- .../models/magi_human/pipeline_magi_human.py | 2282 ------------ .../mammoth_moda2/mammothmoda2_dit_model.py | 809 ----- .../pipeline_mammothmoda2_dit.py | 298 -- .../models/mammoth_moda2/rope_real.py | 252 -- .../models/mammoth_moda2/schedulers.py | 137 - .../diffusion/models/nextstep_1_1/__init__.py | 12 - .../models/nextstep_1_1/modeling_flux_vae.py | 479 --- .../models/nextstep_1_1/modeling_nextstep.py | 448 --- .../nextstep_1_1/modeling_nextstep_heads.py | 309 -- .../nextstep_1_1/modeling_nextstep_llama.py | 315 -- .../nextstep_1_1/pipeline_nextstep_1_1.py | 716 ---- .../diffusion/models/omnigen2/__init__.py | 0 .../models/omnigen2/omnigen2_transformer.py | 1313 ------- .../models/omnigen2/pipeline_omnigen2.py | 1295 ------- .../diffusion/models/omnivoice/__init__.py | 2 - .../models/omnivoice/pipeline_omnivoice.py | 260 -- .../diffusion/models/ovis_image/__init__.py | 17 - .../ovis_image/ovis_image_transformer.py | 543 --- .../models/ovis_image/pipeline_ovis_image.py | 748 ---- vllm_omni/diffusion/models/progress_bar.py | 53 - .../diffusion/models/qwen_image/__init__.py | 21 - .../qwen_image/autoencoder_kl_qwenimage.py | 1054 ------ .../models/qwen_image/cfg_parallel.py | 164 - .../models/qwen_image/pipeline_qwen_image.py | 1042 ------ .../qwen_image/pipeline_qwen_image_edit.py | 876 ----- .../pipeline_qwen_image_edit_plus.py | 848 ----- .../qwen_image/pipeline_qwen_image_layered.py | 900 ----- .../qwen_image/qwen_image_transformer.py | 1201 ------- .../diffusion/models/schedulers/__init__.py | 12 - vllm_omni/diffusion/models/schedulers/base.py | 48 - .../schedulers/scheduling_dmd2_euler.py | 23 - .../scheduling_flow_unipc_multistep.py | 741 ---- vllm_omni/diffusion/models/sd3/__init__.py | 15 - .../diffusion/models/sd3/pipeline_sd3.py | 751 ---- .../diffusion/models/sd3/sd3_transformer.py | 548 --- .../diffusion/models/stable_audio/__init__.py | 18 - .../stable_audio/pipeline_stable_audio.py | 585 --- .../stable_audio/stable_audio_transformer.py | 606 ---- .../diffusion/models/t5_encoder/__init__.py | 7 - .../diffusion/models/t5_encoder/t5_encoder.py | 423 --- .../models/t5_encoder/t5_gemma_encoder.py | 309 -- vllm_omni/diffusion/models/utils.py | 21 - vllm_omni/diffusion/models/wan2_2/__init__.py | 56 - .../models/wan2_2/patch_diffusers.py | 18 - .../models/wan2_2/pipeline_wan2_2.py | 972 ----- .../models/wan2_2/pipeline_wan2_2_i2v.py | 900 ----- .../models/wan2_2/pipeline_wan2_2_ti2v.py | 721 ---- .../models/wan2_2/pipeline_wan2_2_vace.py | 670 ---- .../models/wan2_2/scheduling_wan_euler.py | 147 - .../models/wan2_2/wan2_2_transformer.py | 1048 ------ .../models/wan2_2/wan2_2_vace_transformer.py | 265 -- .../diffusion/models/z_image/__init__.py | 0 .../models/z_image/pipeline_z_image.py | 814 ----- .../models/z_image/z_image_transformer.py | 1045 ------ vllm_omni/diffusion/offloader/__init__.py | 80 - vllm_omni/diffusion/offloader/base.py | 99 - .../diffusion/offloader/layerwise_backend.py | 494 --- .../diffusion/offloader/module_collector.py | 132 - .../diffusion/offloader/sequential_backend.py | 248 -- vllm_omni/diffusion/postprocess/__init__.py | 10 - .../postprocess/rife_interpolator.py | 443 --- vllm_omni/diffusion/profiler/__init__.py | 8 - .../profiler/diffusion_pipeline_profiler.py | 113 - vllm_omni/diffusion/registry.py | 489 --- vllm_omni/diffusion/request.py | 58 - vllm_omni/diffusion/sched/__init__.py | 27 - vllm_omni/diffusion/sched/base_scheduler.py | 225 -- vllm_omni/diffusion/sched/interface.py | 177 - .../diffusion/sched/request_scheduler.py | 50 - vllm_omni/diffusion/sched/step_scheduler.py | 129 - vllm_omni/diffusion/stage_diffusion_client.py | 486 --- vllm_omni/diffusion/stage_diffusion_proc.py | 632 ---- vllm_omni/diffusion/utils/__init__.py | 0 vllm_omni/diffusion/utils/hf_utils.py | 77 - vllm_omni/diffusion/utils/media_utils.py | 80 - vllm_omni/diffusion/utils/network_utils.py | 19 - vllm_omni/diffusion/utils/prompt_utils.py | 38 - vllm_omni/diffusion/utils/size_utils.py | 20 - vllm_omni/diffusion/utils/tf_utils.py | 78 - vllm_omni/diffusion/worker/__init__.py | 32 - .../worker/diffusion_model_runner.py | 399 -- .../diffusion/worker/diffusion_worker.py | 925 ----- vllm_omni/diffusion/worker/utils.py | 124 - vllm_omni/distributed/__init__.py | 31 - vllm_omni/distributed/kv_transfer/__init__.py | 13 - .../distributed/kv_transfer/monkey_patch.py | 193 - .../distributed/omni_connectors/__init__.py | 50 - .../distributed/omni_connectors/adapter.py | 216 -- .../omni_connectors/connectors/__init__.py | 2 - .../omni_connectors/connectors/base.py | 112 - .../connectors/mooncake_store_connector.py | 198 - .../mooncake_transfer_engine_connector.py | 1266 ------- .../connectors/shm_connector.py | 210 -- .../connectors/yuanrong_connector.py | 136 - .../distributed/omni_connectors/factory.py | 111 - .../omni_connectors/kv_transfer_manager.py | 1320 ------- .../transfer_adapter/__init__.py | 2 - .../omni_connectors/transfer_adapter/base.py | 140 - .../chunk_transfer_adapter.py | 458 --- .../omni_connectors/utils/__init__.py | 2 - .../omni_connectors/utils/config.py | 40 - .../omni_connectors/utils/initialization.py | 510 --- .../omni_connectors/utils/kv_utils.py | 450 --- .../omni_connectors/utils/logging.py | 14 - .../omni_connectors/utils/serialization.py | 342 -- .../distributed/omni_coordinator/__init__.py | 31 - .../omni_coordinator/load_balancer.py | 148 - .../distributed/omni_coordinator/messages.py | 61 - .../omni_coord_client_for_hub.py | 164 - .../omni_coord_client_for_stage.py | 214 -- .../omni_coordinator/omni_coordinator.py | 339 -- vllm_omni/distributed/ray_utils/__init__.py | 10 - vllm_omni/distributed/ray_utils/utils.py | 201 -- vllm_omni/engine/__init__.py | 89 - vllm_omni/engine/arg_utils.py | 633 ---- vllm_omni/engine/async_omni_engine.py | 1815 ---------- vllm_omni/engine/cfg_companion_tracker.py | 125 - vllm_omni/engine/mm_outputs.py | 90 - vllm_omni/engine/orchestrator.py | 1215 ------- vllm_omni/engine/output_modality.py | 118 - vllm_omni/engine/output_processor.py | 382 -- vllm_omni/engine/serialization.py | 42 - vllm_omni/engine/stage_engine_core_client.py | 464 --- vllm_omni/engine/stage_engine_core_proc.py | 221 -- vllm_omni/engine/stage_engine_startup.py | 608 ---- vllm_omni/engine/stage_init_utils.py | 826 ----- vllm_omni/entrypoints/__init__.py | 27 - vllm_omni/entrypoints/async_omni.py | 955 ----- vllm_omni/entrypoints/chat_utils.py | 62 - vllm_omni/entrypoints/cli/__init__.py | 13 - .../entrypoints/cli/benchmark/__init__.py | 0 vllm_omni/entrypoints/cli/benchmark/base.py | 23 - vllm_omni/entrypoints/cli/benchmark/main.py | 55 - vllm_omni/entrypoints/cli/benchmark/serve.py | 196 - vllm_omni/entrypoints/cli/logo.py | 45 - vllm_omni/entrypoints/cli/main.py | 63 - vllm_omni/entrypoints/cli/serve.py | 733 ---- vllm_omni/entrypoints/client_request_state.py | 13 - vllm_omni/entrypoints/omni.py | 203 -- vllm_omni/entrypoints/omni_base.py | 494 --- vllm_omni/entrypoints/openai/__init__.py | 26 - vllm_omni/entrypoints/openai/api_server.py | 2933 --------------- .../entrypoints/openai/audio_utils_mixin.py | 127 - vllm_omni/entrypoints/openai/errors.py | 3 - .../entrypoints/openai/image_api_utils.py | 81 - .../entrypoints/openai/protocol/__init__.py | 26 - .../entrypoints/openai/protocol/audio.py | 298 -- .../openai/protocol/chat_completion.py | 12 - .../entrypoints/openai/protocol/images.py | 167 - .../entrypoints/openai/protocol/videos.py | 313 -- .../entrypoints/openai/realtime_connection.py | 203 -- .../openai/serving_audio_generate.py | 168 - vllm_omni/entrypoints/openai/serving_chat.py | 2735 -------------- .../entrypoints/openai/serving_speech.py | 2226 ------------ .../openai/serving_speech_stream.py | 290 -- vllm_omni/entrypoints/openai/serving_video.py | 576 --- .../openai/serving_video_stream.py | 971 ----- vllm_omni/entrypoints/openai/stage_params.py | 85 - vllm_omni/entrypoints/openai/storage.py | 70 - vllm_omni/entrypoints/openai/stores.py | 74 - vllm_omni/entrypoints/openai/text_splitter.py | 120 - vllm_omni/entrypoints/openai/utils.py | 85 - .../entrypoints/openai/video_api_utils.py | 255 -- .../entrypoints/openai/video_frame_filter.py | 116 - .../openai/video_stream_context.py | 28 - .../entrypoints/openai/video_stream_envs.py | 62 - .../openai/video_stream_session.py | 439 --- vllm_omni/entrypoints/pd_utils.py | 352 -- vllm_omni/entrypoints/stage_utils.py | 228 -- vllm_omni/entrypoints/utils.py | 891 ----- vllm_omni/inputs/__init__.py | 0 vllm_omni/inputs/data.py | 345 -- vllm_omni/inputs/preprocess.py | 182 - vllm_omni/logger.py | 22 - vllm_omni/lora/__init__.py | 0 vllm_omni/lora/request.py | 8 - vllm_omni/lora/utils.py | 22 - vllm_omni/metrics/__init__.py | 9 - vllm_omni/metrics/stats.py | 678 ---- vllm_omni/metrics/utils.py | 143 - vllm_omni/model_executor/__init__.py | 0 .../model_executor/custom_process_mixin.py | 44 - vllm_omni/model_executor/layers/__init__.py | 0 .../layers/rotary_embedding/__init__.py | 6 - .../layers/rotary_embedding/mrope.py | 553 --- .../model_executor/model_loader/__init__.py | 0 .../model_loader/weight_utils.py | 87 - vllm_omni/model_executor/models/__init__.py | 10 - .../model_executor/models/bagel/__init__.py | 3 - .../model_executor/models/bagel/bagel.py | 1132 ------ .../model_executor/models/bagel/pipeline.py | 111 - .../model_executor/models/common/__init__.py | 0 .../models/common/qwen3_code_predictor.py | 764 ---- .../models/cosyvoice3/__init__.py | 0 .../cosyvoice3/code2wav_core/__init__.py | 2 - .../models/cosyvoice3/code2wav_core/cfm.py | 325 -- .../cosyvoice3/code2wav_core/hifigan.py | 951 ----- .../models/cosyvoice3/code2wav_core/layers.py | 61 - .../models/cosyvoice3/config.py | 133 - .../models/cosyvoice3/cosyvoice3.py | 839 ----- .../models/cosyvoice3/cosyvoice3_code2wav.py | 345 -- .../models/cosyvoice3/cosyvoice3_talker.py | 158 - .../models/cosyvoice3/pipeline.py | 50 - .../models/cosyvoice3/tokenizer.py | 356 -- .../model_executor/models/cosyvoice3/utils.py | 259 -- .../models/dynin_omni/__init__.py | 59 - .../models/dynin_omni/dynin_omni.py | 744 ---- .../models/dynin_omni/dynin_omni_common.py | 1241 ------- .../dynin_omni/dynin_omni_token2audio.py | 310 -- .../dynin_omni/dynin_omni_token2image.py | 150 - .../dynin_omni/dynin_omni_token2text.py | 1640 --------- .../models/fish_speech/__init__.py | 0 .../fish_speech/configuration_fish_speech.py | 154 - .../models/fish_speech/dac_encoder.py | 158 - .../models/fish_speech/dac_utils.py | 92 - .../fish_speech/fish_speech_dac_decoder.py | 348 -- .../models/fish_speech/fish_speech_fast_ar.py | 540 --- .../models/fish_speech/fish_speech_slow_ar.py | 826 ----- .../models/fish_speech/pipeline.py | 51 - .../models/fish_speech/prompt_utils.py | 144 - .../models/glm_image/__init__.py | 16 - .../models/glm_image/glm_image_ar.py | 3193 ----------------- .../models/glm_image/pipeline.py | 47 - .../models/hunyuan_image3/__init__.py | 6 - .../hunyuan_image3/autoencoder_kl_3d.py | 936 ----- .../models/hunyuan_image3/hunyuan_image3.py | 1879 ---------- .../models/hunyuan_image3/siglip2.py | 561 --- .../models/mammoth_moda2/__init__.py | 17 - .../models/mammoth_moda2/mammoth_moda2.py | 827 ----- .../pipeline_mammothmoda2_dit.py | 15 - .../models/mimo_audio/__init__.py | 0 .../models/mimo_audio/config_mimo_audio.py | 206 -- .../models/mimo_audio/mimo_audio.py | 911 ----- .../models/mimo_audio/mimo_audio_code2wav.py | 937 ----- .../models/mimo_audio/mimo_audio_llm.py | 1460 -------- .../mimo_audio/modeling_audio_tokenizer.py | 955 ----- .../models/mimo_audio/modeling_rope_utils.py | 703 ---- .../models/mimo_audio/pipeline.py | 62 - .../models/mimo_audio/quantization.py | 450 --- .../models/ming_flash_omni/__init__.py | 20 - .../models/ming_flash_omni/audio_encoder.py | 246 -- .../models/ming_flash_omni/audio_vae.py | 390 -- .../models/ming_flash_omni/ming_flash_omni.py | 209 -- .../ming_flash_omni/ming_flash_omni_talker.py | 586 --- .../ming_flash_omni_thinker.py | 893 ----- .../modeling_bailing_moe_v2.py | 888 ----- .../models/ming_flash_omni/projectors.py | 184 - .../models/ming_flash_omni/prompt_utils.py | 50 - .../models/ming_flash_omni/spk_embedding.py | 44 - .../models/ming_flash_omni/talker_module.py | 1151 ------ .../models/ming_flash_omni/text_processing.py | 535 --- .../models/ming_flash_omni/vision_encoder.py | 125 - .../models/ming_flash_omni/voice_presets.py | 289 -- .../models/moss_tts_nano/__init__.py | 5 - .../configuration_moss_tts_nano.py | 60 - .../moss_tts_nano/modeling_moss_tts_nano.py | 515 --- .../models/moss_tts_nano/pipeline.py | 40 - .../models/omnivoice/__init__.py | 2 - .../model_executor/models/omnivoice/config.py | 81 - .../models/omnivoice/duration.py | 281 -- .../models/omnivoice/omnivoice.py | 507 --- .../models/omnivoice/omnivoice_decoder.py | 211 -- .../models/omnivoice/omnivoice_generator.py | 588 --- .../model_executor/models/output_templates.py | 15 - .../models/qwen2_5_omni/__init__.py | 0 .../models/qwen2_5_omni/audio_length.py | 69 - .../models/qwen2_5_omni/pipeline.py | 78 - .../models/qwen2_5_omni/qwen2_5_omni.py | 1063 ------ .../qwen2_5_omni/qwen2_5_omni_talker.py | 253 -- .../qwen2_5_omni/qwen2_5_omni_thinker.py | 702 ---- .../qwen2_5_omni/qwen2_5_omni_token2wav.py | 1881 ---------- .../models/qwen2_5_omni/qwen2_old.py | 456 --- .../models/qwen3_omni/__init__.py | 3 - .../models/qwen3_omni/pipeline.py | 63 - .../models/qwen3_omni/qwen3_moe.py | 173 - .../models/qwen3_omni/qwen3_omni.py | 1303 ------- .../models/qwen3_omni/qwen3_omni_code2wav.py | 283 -- .../qwen3_omni_moe_code_predictor_mtp.py | 29 - .../qwen3_omni/qwen3_omni_moe_talker.py | 532 --- .../qwen3_omni/qwen3_omni_moe_thinker.py | 1764 --------- .../models/qwen3_tts/__init__.py | 0 .../qwen3_tts/configuration_qwen3_tts.py | 543 --- .../qwen3_tts/cuda_graph_decoder_wrapper.py | 187 - .../models/qwen3_tts/pipeline.py | 48 - .../models/qwen3_tts/qwen3_tts_code2wav.py | 367 -- .../qwen3_tts_code_predictor_vllm.py | 54 - .../models/qwen3_tts/qwen3_tts_talker.py | 1715 --------- .../models/qwen3_tts/qwen3_tts_tokenizer.py | 420 --- .../qwen3_tts/tokenizer_12hz/__init__.py | 1 - .../configuration_qwen3_tts_tokenizer_v2.py | 171 - .../modeling_qwen3_tts_tokenizer_v2.py | 1170 ------ .../qwen3_tts/tokenizer_25hz/__init__.py | 1 - .../configuration_qwen3_tts_tokenizer_v1.py | 328 -- .../modeling_qwen3_tts_tokenizer_v1.py | 1524 -------- .../qwen3_tts/tokenizer_25hz/vq/__init__.py | 1 - .../qwen3_tts/tokenizer_25hz/vq/core_vq.py | 518 --- .../qwen3_tts/tokenizer_25hz/vq/speech_vq.py | 396 -- .../tokenizer_25hz/vq/whisper_encoder.py | 310 -- vllm_omni/model_executor/models/registry.py | 235 -- vllm_omni/model_executor/models/utils.py | 39 - .../model_executor/models/voxcpm/__init__.py | 7 - .../models/voxcpm/configuration_voxcpm.py | 3 - .../model_executor/models/voxcpm/voxcpm.py | 886 ----- .../models/voxcpm/voxcpm_loader.py | 247 -- .../models/voxcpm/voxcpm_runtime_utils.py | 44 - .../models/voxcpm/voxcpm_stage_wrappers.py | 185 - .../model_executor/models/voxcpm2/__init__.py | 5 - .../models/voxcpm2/minicpm4_hf_compat.py | 114 - .../models/voxcpm2/minicpm4_paged.py | 457 --- .../model_executor/models/voxcpm2/pipeline.py | 35 - .../models/voxcpm2/voxcpm2_import_utils.py | 82 - .../models/voxcpm2/voxcpm2_talker.py | 1290 ------- .../models/voxtral_tts/__init__.py | 0 ...cuda_graph_acoustic_transformer_wrapper.py | 269 -- .../models/voxtral_tts/pipeline.py | 45 - .../models/voxtral_tts/voxtral_tts.py | 407 --- .../voxtral_tts_audio_generation.py | 1112 ------ .../voxtral_tts_audio_tokenizer.py | 1118 ------ .../model_executor/models/whisper_utils.py | 39 - .../model_executor/stage_configs/__init__.py | 0 .../stage_configs/bailingmm_moe_v2_lite.yaml | 46 - .../stage_configs/dynin_omni.yaml | 75 - .../dynin_omni_multiconnector.yaml | 109 - .../stage_configs/hunyuan_image3_i2t.yaml | 41 - .../stage_configs/hunyuan_image3_it2i.yaml | 74 - .../stage_configs/hunyuan_image3_moe.yaml | 96 - .../hunyuan_image3_moe_dit_2gpu_fp8.yaml | 32 - .../stage_configs/hunyuan_image3_t2i.yaml | 31 - .../hunyuan_image3_t2i_2gpu.yaml | 41 - .../stage_configs/hunyuan_image3_t2t.yaml | 42 - .../stage_configs/mammoth_moda2.yaml | 42 - .../stage_configs/mammoth_moda2_ar.yaml | 24 - .../stage_configs/ming_flash_omni.yaml | 70 - .../stage_configs/ming_flash_omni_tts.yaml | 32 - .../stage_configs/omnivoice.yaml | 18 - .../stage_configs/qwen3_tts_uniproc.yaml | 93 - .../model_executor/stage_configs/voxcpm.yaml | 69 - .../stage_configs/voxcpm_async_chunk.yaml | 98 - .../stage_input_processors/__init__.py | 0 .../stage_input_processors/bagel.py | 308 -- .../chunk_size_utils.py | 33 - .../stage_input_processors/cosyvoice3.py | 249 -- .../stage_input_processors/dynin_omni.py | 164 - .../stage_input_processors/fish_speech.py | 148 - .../stage_input_processors/glm_image.py | 412 --- .../stage_input_processors/hunyuan_image3.py | 123 - .../stage_input_processors/mammoth_moda2.py | 99 - .../stage_input_processors/mimo_audio.py | 276 -- .../stage_input_processors/ming_flash_omni.py | 104 - .../stage_input_processors/omnivoice.py | 41 - .../stage_input_processors/qwen2_5_omni.py | 66 - .../stage_input_processors/qwen3_omni.py | 617 ---- .../stage_input_processors/qwen3_tts.py | 273 -- .../stage_input_processors/tts_utils.py | 183 - .../stage_input_processors/voxcpm.py | 128 - .../stage_input_processors/voxtral_tts.py | 110 - vllm_omni/outputs.py | 358 -- vllm_omni/patch.py | 125 - vllm_omni/platforms/__init__.py | 206 -- vllm_omni/platforms/cuda/__init__.py | 6 - vllm_omni/platforms/cuda/platform.py | 131 - vllm_omni/platforms/interface.py | 183 - vllm_omni/platforms/musa/__init__.py | 6 - vllm_omni/platforms/musa/platform.py | 162 - vllm_omni/platforms/npu/__init__.py | 6 - vllm_omni/platforms/npu/models/__init__.py | 2 - .../platforms/npu/models/hunyuan_fused_moe.py | 123 - vllm_omni/platforms/npu/platform.py | 147 - vllm_omni/platforms/npu/profiler.py | 93 - .../npu/stage_configs/hunyuan_image3_t2i.yaml | 35 - .../platforms/npu/stage_configs/voxcpm.yaml | 67 - .../npu/stage_configs/voxcpm_async_chunk.yaml | 89 - vllm_omni/platforms/npu/worker/__init__.py | 0 vllm_omni/platforms/npu/worker/base.py | 56 - .../npu/worker/npu_ar_model_runner.py | 765 ---- .../platforms/npu/worker/npu_ar_worker.py | 19 - .../npu/worker/npu_generation_model_runner.py | 843 ----- .../npu/worker/npu_generation_worker.py | 19 - .../platforms/npu/worker/npu_model_runner.py | 472 --- vllm_omni/platforms/rocm/__init__.py | 6 - vllm_omni/platforms/rocm/platform.py | 149 - vllm_omni/platforms/xpu/__init__.py | 6 - vllm_omni/platforms/xpu/platform.py | 76 - .../xpu/stage_configs/hunyuan_image3_t2i.yaml | 80 - .../xpu/stage_configs/voxtral_tts.yaml | 107 - vllm_omni/platforms/xpu/utils.py | 16 - vllm_omni/platforms/xpu/worker/__init__.py | 0 .../xpu/worker/xpu_ar_model_runner.py | 19 - .../platforms/xpu/worker/xpu_ar_worker.py | 15 - .../xpu/worker/xpu_generation_model_runner.py | 19 - .../xpu/worker/xpu_generation_worker.py | 15 - vllm_omni/plugins/__init__.py | 81 - vllm_omni/profiler/__init__.py | 6 - vllm_omni/profiler/omni_torch_profiler.py | 530 --- vllm_omni/quantization/__init__.py | 26 - vllm_omni/quantization/component_config.py | 108 - vllm_omni/quantization/factory.py | 177 - vllm_omni/quantization/gguf_config.py | 79 - vllm_omni/quantization/inc_config.py | 140 - vllm_omni/quantization/int8_config.py | 452 --- vllm_omni/request.py | 128 - vllm_omni/sample/__init__.py | 0 vllm_omni/tokenizers/__init__.py | 0 .../tokenizers/mammoth_moda2_tokenizer.py | 401 --- vllm_omni/transformers_utils/__init__.py | 2 - .../transformers_utils/configs/__init__.py | 69 - .../transformers_utils/configs/fish_speech.py | 24 - .../configs/mammoth_moda2.py | 283 -- .../configs/ming_flash_omni.py | 352 -- .../transformers_utils/configs/voxcpm.py | 68 - .../transformers_utils/configs/voxcpm2.py | 153 - .../transformers_utils/configs/voxtral_tts.py | 42 - .../transformers_utils/parsers/__init__.py | 29 - .../transformers_utils/parsers/voxtral_tts.py | 106 - .../transformers_utils/processors/__init__.py | 12 - .../transformers_utils/processors/ming.py | 430 --- vllm_omni/utils/__init__.py | 0 vllm_omni/utils/audio.py | 68 - vllm_omni/utils/mm_outputs.py | 93 - vllm_omni/utils/voice_cache.py | 89 - vllm_omni/version.py | 58 - vllm_omni/worker/__init__.py | 0 vllm_omni/worker/base.py | 307 -- vllm_omni/worker/gpu_ar_model_runner.py | 972 ----- vllm_omni/worker/gpu_ar_worker.py | 127 - .../worker/gpu_generation_model_runner.py | 874 ----- vllm_omni/worker/gpu_generation_worker.py | 105 - vllm_omni/worker/gpu_memory_utils.py | 124 - vllm_omni/worker/gpu_model_runner.py | 1524 -------- vllm_omni/worker/mixins.py | 13 - .../omni_connector_model_runner_mixin.py | 2155 ----------- vllm_omni/worker/payload_span.py | 64 - 1535 files changed, 388795 deletions(-) delete mode 100755 .buildkite/bootstrap-amd-omni.sh delete mode 100755 .buildkite/bootstrap-intel-omni.sh delete mode 100644 .buildkite/nightly-release-pipeline.yaml delete mode 100644 .buildkite/pipeline-intel.yaml delete mode 100644 .buildkite/pipeline.yml delete mode 100644 .buildkite/release-pipeline.yaml delete mode 100755 .buildkite/scripts/docker_login_ecr_public.sh delete mode 100755 .buildkite/scripts/generate-and-upload-nightly-index.sh delete mode 100755 .buildkite/scripts/generate-nightly-index.py delete mode 100755 .buildkite/scripts/hardware_ci/run-amd-test.sh delete mode 100755 .buildkite/scripts/hardware_ci/run-xpu-test.sh delete mode 100644 .buildkite/scripts/hardware_ci/run_npu_test.sh delete mode 100755 .buildkite/scripts/upload-nightly-wheels.sh delete mode 100644 .buildkite/scripts/upload_pipeline_with_skip_ci.sh delete mode 100644 .buildkite/test-amd-merge.yml delete mode 100644 .buildkite/test-amd-ready.yaml delete mode 100644 .buildkite/test-amd.yaml delete mode 100644 .buildkite/test-merge.yml delete mode 100644 .buildkite/test-nightly.yml delete mode 100644 .buildkite/test-ready.yml delete mode 100644 .buildkite/test-template-amd-omni.j2 delete mode 100644 .buildkite/test-weekly.yml delete mode 100644 .claude/skills/add-diffusion-model/SKILL.md delete mode 100644 .claude/skills/add-diffusion-model/references/cache-dit-patterns.md delete mode 100644 .claude/skills/add-diffusion-model/references/custom-model-patterns.md delete mode 100644 .claude/skills/add-diffusion-model/references/parallelism-patterns.md delete mode 100644 .claude/skills/add-diffusion-model/references/transformer-adaptation.md delete mode 100644 .claude/skills/add-diffusion-model/references/troubleshooting.md delete mode 100644 .claude/skills/add-tts-model/SKILL.md delete mode 100644 .claude/skills/add-tts-model/references/cuda-graph-example.md delete mode 100644 .claude/skills/add-tts-model/references/optional-deps.md delete mode 100644 .claude/skills/add-tts-model/references/precommit-dco.md delete mode 100644 .claude/skills/add-tts-model/references/single-stage-ar.md delete mode 100644 .claude/skills/readme.md delete mode 100644 .claude/skills/vllm-omni-npu-upgrade/SKILL.md delete mode 100644 .claude/skills/vllm-omni-npu-upgrade/references/gpu-to-npu-translation.md delete mode 100644 .claude/skills/vllm-omni-npu-upgrade/references/omni-specific-blocks.md delete mode 100644 .claude/skills/vllm-omni-npu-upgrade/references/workflow-checklist.md delete mode 100644 .gitattributes delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/ISSUE_TEMPLATE/100-documentation.yml delete mode 100644 .github/ISSUE_TEMPLATE/200-installation.yml delete mode 100644 .github/ISSUE_TEMPLATE/400-bug-report.yml delete mode 100644 .github/ISSUE_TEMPLATE/500-feature-request.yml delete mode 100644 .github/ISSUE_TEMPLATE/600-new-model.yml delete mode 100644 .github/ISSUE_TEMPLATE/700-performance-discussion.yml delete mode 100644 .github/ISSUE_TEMPLATE/750-RFC.yml delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/mergify.yml delete mode 100755 .github/scripts/detect_changed_tests.sh delete mode 100644 .github/workflows/build_wheel.yml delete mode 100644 .github/workflows/pre-commit.yml delete mode 100644 .gitignore delete mode 100644 .pre-commit-config.yaml delete mode 100644 .readthedocs.yml delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 apps/ComfyUI-vLLM-Omni/.gitignore delete mode 100644 apps/ComfyUI-vLLM-Omni/LICENSE delete mode 100644 apps/ComfyUI-vLLM-Omni/README.md delete mode 100644 apps/ComfyUI-vLLM-Omni/__init__.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/__init__.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/nodes.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/api_client.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/format.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/logger.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/models.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/types.py delete mode 100644 apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/validators.py delete mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-chaining-services.jpg delete mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-image-generation.jpg delete mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-multi-stage.jpg delete mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-tts.jpg delete mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-understanding.jpg delete mode 100644 apps/ComfyUI-vLLM-Omni/docs/images/comfyui-video-generation.jpg delete mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Chaining Services.json delete mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Image Generation.json delete mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Multimodal Understanding.json delete mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni TTS.json delete mode 100644 apps/ComfyUI-vLLM-Omni/example_workflows/vLLM-Omni Video Generation.json delete mode 100644 apps/ComfyUI-vLLM-Omni/web/main.js delete mode 100644 benchmarks/README.md delete mode 100644 benchmarks/__init__.py delete mode 100644 benchmarks/accuracy/README.md delete mode 100644 benchmarks/accuracy/__init__.py delete mode 100644 benchmarks/accuracy/common.py delete mode 100644 benchmarks/accuracy/image_to_image/README.md delete mode 100644 benchmarks/accuracy/image_to_image/__init__.py delete mode 100644 benchmarks/accuracy/image_to_image/gedit_bench.py delete mode 100644 benchmarks/accuracy/image_to_image/run_gedit_bench.py delete mode 100644 benchmarks/accuracy/text_to_image/README.md delete mode 100644 benchmarks/accuracy/text_to_image/__init__.py delete mode 100644 benchmarks/accuracy/text_to_image/gbench.py delete mode 100644 benchmarks/accuracy/text_to_image/run_gebench.py delete mode 100644 benchmarks/build_dataset/download_process_data_seedtts.md delete mode 100644 benchmarks/build_dataset/extract_tts_prompts.py delete mode 100644 benchmarks/build_dataset/seed_tts_design/en/meta.lst delete mode 100644 benchmarks/build_dataset/seed_tts_smoke/en/meta.lst delete mode 100644 benchmarks/diffusion/README.md delete mode 100644 benchmarks/diffusion/backends.py delete mode 100644 benchmarks/diffusion/diffusion_benchmark_serving.py delete mode 100644 benchmarks/diffusion/performance_dashboard/qwen_image_serving_performance.md delete mode 100644 benchmarks/diffusion/performance_dashboard/wan_2_2_serving_performance.md delete mode 100644 benchmarks/diffusion/quantization_quality.py delete mode 100644 benchmarks/distributed/omni_connectors/README.md delete mode 100644 benchmarks/distributed/omni_connectors/cross_node_mooncake_transfer_engine.py delete mode 100644 benchmarks/fish-speech/bench_voice_cache.py delete mode 100644 benchmarks/fish-speech/fish_bench_utils.py delete mode 100644 benchmarks/glm_image/README.md delete mode 100644 benchmarks/glm_image/__init__.py delete mode 100644 benchmarks/glm_image/benchmark_glm_image.py delete mode 100644 benchmarks/glm_image/huggingface/inference.py delete mode 100644 benchmarks/glm_image/vllm-omni/inference.py delete mode 100644 benchmarks/tts/README.md delete mode 100644 benchmarks/tts/bench_tts.py delete mode 100644 benchmarks/tts/bench_voxcpm_offline.py delete mode 100644 benchmarks/tts/model_configs.yaml delete mode 100644 benchmarks/tts/plot_results.py delete mode 100644 collect_env.py delete mode 100644 docker/Dockerfile.ci delete mode 100644 docker/Dockerfile.cuda delete mode 100644 docker/Dockerfile.npu delete mode 100644 docker/Dockerfile.npu.a3 delete mode 100644 docker/Dockerfile.rocm delete mode 100644 docker/Dockerfile.xpu delete mode 100644 docs/.nav.yml delete mode 100644 docs/README.md delete mode 100644 docs/api/README.md delete mode 100644 docs/assets/WeChat.jpg delete mode 100644 docs/cli/README.md delete mode 100644 docs/cli/bench/serve.md delete mode 100644 docs/cli/serve.md delete mode 100644 docs/community/contact_us.md delete mode 100644 docs/community/governance.md delete mode 100644 docs/community/meetups.md delete mode 100644 docs/community/volunteers.md delete mode 100644 docs/configuration/README.md delete mode 100644 docs/configuration/gpu_memory_utilization.md delete mode 100644 docs/configuration/pd_disaggregation.md delete mode 100644 docs/configuration/stage_configs.md delete mode 100644 docs/contributing/DOCS_GUIDE.md delete mode 100644 docs/contributing/README.md delete mode 100644 docs/contributing/ci/.nav.yaml delete mode 100644 docs/contributing/ci/CI_5levels.md delete mode 100644 docs/contributing/ci/failures.md delete mode 100644 docs/contributing/ci/test_examples/l4_doc_example_tests.inc.md delete mode 100644 docs/contributing/ci/test_examples/l4_functionality_tests.inc.md delete mode 100644 docs/contributing/ci/test_examples/l4_performance_tests.inc.md delete mode 100644 docs/contributing/ci/test_guide.md delete mode 100644 docs/contributing/ci/tests_markers.md delete mode 100644 docs/contributing/ci/tests_style.md delete mode 100644 docs/contributing/metrics.md delete mode 100644 docs/contributing/model/README.md delete mode 100644 docs/contributing/model/adding_diffusion_model.md delete mode 100644 docs/contributing/model/adding_omni_model.md delete mode 100644 docs/contributing/model/adding_tts_model.md delete mode 100644 docs/contributing/profiling.md delete mode 100644 docs/design/architecture_overview.md delete mode 100644 docs/design/feature/async_chunk.md delete mode 100644 docs/design/feature/cache_dit.md delete mode 100644 docs/design/feature/cfg_parallel.md delete mode 100644 docs/design/feature/diffusion_step_execution.md delete mode 100644 docs/design/feature/disaggregated_inference.md delete mode 100644 docs/design/feature/expert_parallel.md delete mode 100644 docs/design/feature/hsdp.md delete mode 100644 docs/design/feature/omni_connectors/mooncake_store_connector.md delete mode 100644 docs/design/feature/omni_connectors/mooncake_transfer_engine_connector.md delete mode 100644 docs/design/feature/omni_connectors/shared_memory_connector.md delete mode 100644 docs/design/feature/omni_connectors/yuanrong_connector.md delete mode 100644 docs/design/feature/prefix_caching.md delete mode 100644 docs/design/feature/ray_based_execution.md delete mode 100644 docs/design/feature/sequence_parallel.md delete mode 100644 docs/design/feature/teacache.md delete mode 100644 docs/design/feature/tensor_parallel.md delete mode 100644 docs/design/feature/vae_parallel.md delete mode 100644 docs/design/figures/omni/E2EL_s_vllm_omni_vs_transformers.png delete mode 100644 docs/design/figures/omni/Mean_AUDIO_RTF_Baseline_vs_Batch.png delete mode 100644 docs/design/figures/omni/Mean_AUDIO_RTF_Batch_CUDA_Graph_vs_Async_Chunk.png delete mode 100644 docs/design/figures/omni/Mean_AUDIO_RTF_Batch_vs_Batch_CUDA_Graph.png delete mode 100644 docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Baseline_vs_Batch.png delete mode 100644 docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Batch_CUDA_Graph_vs_Async_Chunk.png delete mode 100644 docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Batch_vs_Batch_CUDA_Graph.png delete mode 100644 docs/design/figures/omni/Mean_E2EL_ms_Baseline_vs_Batch.png delete mode 100644 docs/design/figures/omni/Mean_E2EL_ms_Batch_CUDA_Graph_vs_Async_Chunk.png delete mode 100644 docs/design/figures/omni/Mean_E2EL_ms_Batch_vs_Batch_CUDA_Graph.png delete mode 100644 docs/design/figures/omni/RTF_vllm_omni_vs_transformers.png delete mode 100644 docs/design/figures/omni/Summary_E2EL_ms_vs_features.png delete mode 100644 docs/design/figures/omni/Summary_RTF_vs_features.png delete mode 100644 docs/design/figures/omni/Summary_TTFP_ms_vs_features.png delete mode 100644 docs/design/figures/omni/TTFP_s_vllm_omni_vs_transformers.png delete mode 100644 docs/design/figures/tts/Mean_AUDIO_RTF_vllm_omni_vs_transformers.png delete mode 100644 docs/design/figures/tts/Mean_AUDIO_TTFP_(ms)_vllm_omni_vs_transformers.png delete mode 100644 docs/design/figures/tts/Mean_E2EL_(ms)_vllm_omni_vs_transformers.png delete mode 100644 docs/design/figures/tts/Mean_mean_e2e_ms_baseline_vs_batch.png delete mode 100644 docs/design/figures/tts/Mean_mean_e2e_ms_batch_vs_cuda_graph.png delete mode 100644 docs/design/figures/tts/Mean_mean_e2e_ms_cuda_graph_vs_async_chunk.png delete mode 100644 docs/design/figures/tts/Mean_mean_rtf_baseline_vs_batch.png delete mode 100644 docs/design/figures/tts/Mean_mean_rtf_batch_vs_cuda_graph.png delete mode 100644 docs/design/figures/tts/Mean_mean_rtf_cuda_graph_vs_async_chunk.png delete mode 100644 docs/design/figures/tts/Mean_mean_ttfp_ms_baseline_vs_batch.png delete mode 100644 docs/design/figures/tts/Mean_mean_ttfp_ms_batch_vs_cuda_graph.png delete mode 100644 docs/design/figures/tts/Mean_mean_ttfp_ms_cuda_graph_vs_async_chunk.png delete mode 100644 docs/design/figures/tts/Summary_mean_e2e_ms_vs_features.png delete mode 100644 docs/design/figures/tts/Summary_mean_rtf_vs_features.png delete mode 100644 docs/design/figures/tts/Summary_mean_ttfp_ms_vs_features.png delete mode 100644 docs/design/index.md delete mode 100644 docs/design/module/ar_module.md delete mode 100644 docs/design/module/async_omni_architecture.md delete mode 100644 docs/design/module/dit_module.md delete mode 100644 docs/design/module/entrypoint_module.md delete mode 100644 docs/design/qwen3_omni_tts_performance_optimization.md delete mode 100644 docs/examples/README.md delete mode 100644 docs/features/comfyui.md delete mode 100644 docs/features/custom_pipeline.md delete mode 100644 docs/features/sleep_mode.md delete mode 100644 docs/getting_started/installation/.nav.yml delete mode 100644 docs/getting_started/installation/README.md delete mode 100644 docs/getting_started/installation/gpu.md delete mode 100644 docs/getting_started/installation/gpu/cuda.inc.md delete mode 100644 docs/getting_started/installation/gpu/musa.inc.md delete mode 100644 docs/getting_started/installation/gpu/rocm.inc.md delete mode 100644 docs/getting_started/installation/gpu/xpu.inc.md delete mode 100644 docs/getting_started/installation/npu.md delete mode 100644 docs/getting_started/installation/npu/npu.inc.md delete mode 100644 docs/getting_started/installation/python_env_setup.inc.md delete mode 100644 docs/getting_started/quickstart.md delete mode 100644 docs/mkdocs/hooks/generate_api_readme.py delete mode 100644 docs/mkdocs/hooks/generate_argparse.py delete mode 100644 docs/mkdocs/hooks/generate_examples.py delete mode 100644 docs/mkdocs/hooks/url_schemes.py delete mode 100644 docs/mkdocs/javascript/edit_and_feedback.js delete mode 100644 docs/mkdocs/javascript/mathjax.js delete mode 100644 docs/mkdocs/javascript/mermaid.js delete mode 100644 docs/mkdocs/javascript/slack_and_forum.js delete mode 100644 docs/mkdocs/overrides/main.html delete mode 100644 docs/mkdocs/overrides/partials/toc-item.html delete mode 100644 docs/mkdocs/stylesheets/extra.css delete mode 100644 docs/models/supported_models.md delete mode 100644 docs/serving/audio_generate_api.md delete mode 100644 docs/serving/diffusion_chat_api.md delete mode 100644 docs/serving/image_edit_api.md delete mode 100644 docs/serving/image_generation_api.md delete mode 100644 docs/serving/speech_api.md delete mode 100644 docs/serving/video_stream_api.md delete mode 100644 docs/source/architecture/ar-dit-main-architecture.png delete mode 100644 docs/source/architecture/ar-main-architecture.png delete mode 100644 docs/source/architecture/async-chunk-architecture.png delete mode 100644 docs/source/architecture/dit-main-architecture.png delete mode 100644 docs/source/architecture/omni-modality-model-architecture.png delete mode 100644 docs/source/architecture/qwen3-omni-async-chunk.png delete mode 100644 docs/source/architecture/qwen3-omni-non-async-chunk.png delete mode 100644 docs/source/architecture/vllm-omni-dataflow-between-stages.png delete mode 100644 docs/source/architecture/vllm-omni-diffusion-flow.png delete mode 100644 docs/source/architecture/vllm-omni-main-architecture.png delete mode 100644 docs/source/architecture/vllm-omni-user-interface.png delete mode 100644 docs/source/logos/vllm-logo-only-light.ico delete mode 100644 docs/source/logos/vllm-omni-logo.png delete mode 100644 docs/source/performance/qwen3-omni_e2e_performance.png delete mode 100644 docs/source/performance/qwen3-omni_rtf_performance.png delete mode 100644 docs/source/performance/qwen3-omni_ttfp_performance.png delete mode 100644 docs/usage/faq.md delete mode 100644 docs/user_guide/diffusion/attention_backends.md delete mode 100644 docs/user_guide/diffusion/cache_acceleration/cache_dit.md delete mode 100644 docs/user_guide/diffusion/cache_acceleration/teacache.md delete mode 100644 docs/user_guide/diffusion/cpu_offload_diffusion.md delete mode 100644 docs/user_guide/diffusion/frame_interpolation.md delete mode 100644 docs/user_guide/diffusion/lora.md delete mode 100644 docs/user_guide/diffusion/parallelism/cfg_parallel.md delete mode 100644 docs/user_guide/diffusion/parallelism/expert_parallel.md delete mode 100644 docs/user_guide/diffusion/parallelism/hsdp.md delete mode 100644 docs/user_guide/diffusion/parallelism/overview.md delete mode 100644 docs/user_guide/diffusion/parallelism/sequence_parallel.md delete mode 100644 docs/user_guide/diffusion/parallelism/tensor_parallel.md delete mode 100644 docs/user_guide/diffusion/parallelism/vae_patch_parallel.md delete mode 100644 docs/user_guide/diffusion/step_execution.md delete mode 100644 docs/user_guide/diffusion_features.md delete mode 100644 docs/user_guide/examples/offline_inference/bagel.md delete mode 100644 docs/user_guide/examples/offline_inference/cosyvoice3.md delete mode 100644 docs/user_guide/examples/offline_inference/fish_speech.md delete mode 100644 docs/user_guide/examples/offline_inference/glm_image.md delete mode 100644 docs/user_guide/examples/offline_inference/helios.md delete mode 100644 docs/user_guide/examples/offline_inference/hunyuan_image3.md delete mode 100644 docs/user_guide/examples/offline_inference/image_to_image.md delete mode 100644 docs/user_guide/examples/offline_inference/image_to_video.md delete mode 100644 docs/user_guide/examples/offline_inference/internvla_a1.md delete mode 100644 docs/user_guide/examples/offline_inference/mammothmodal2_preview.md delete mode 100644 docs/user_guide/examples/offline_inference/mimo_audio.md delete mode 100644 docs/user_guide/examples/offline_inference/qwen2_5_omni.md delete mode 100644 docs/user_guide/examples/offline_inference/qwen3_omni.md delete mode 100644 docs/user_guide/examples/offline_inference/qwen3_tts.md delete mode 100644 docs/user_guide/examples/offline_inference/text_to_audio.md delete mode 100644 docs/user_guide/examples/offline_inference/text_to_image.md delete mode 100644 docs/user_guide/examples/offline_inference/text_to_video.md delete mode 100644 docs/user_guide/examples/offline_inference/voxtral_tts.md delete mode 100644 docs/user_guide/examples/offline_inference/x_to_video_audio.md delete mode 100644 docs/user_guide/examples/online_serving/bagel.md delete mode 100644 docs/user_guide/examples/online_serving/chart-helm.md delete mode 100644 docs/user_guide/examples/online_serving/diffusers_pipeline_adapter.md delete mode 100644 docs/user_guide/examples/online_serving/fish_speech.md delete mode 100644 docs/user_guide/examples/online_serving/glm_image.md delete mode 100644 docs/user_guide/examples/online_serving/image_to_image.md delete mode 100644 docs/user_guide/examples/online_serving/image_to_video.md delete mode 100644 docs/user_guide/examples/online_serving/mimo_audio.md delete mode 100644 docs/user_guide/examples/online_serving/qwen2_5_omni.md delete mode 100644 docs/user_guide/examples/online_serving/qwen3_omni.md delete mode 100644 docs/user_guide/examples/online_serving/qwen3_tts.md delete mode 100644 docs/user_guide/examples/online_serving/text_to_audio.md delete mode 100644 docs/user_guide/examples/online_serving/text_to_image.md delete mode 100644 docs/user_guide/examples/online_serving/text_to_video.md delete mode 100644 docs/user_guide/feature_compatibility.md delete mode 100644 docs/user_guide/quantization/autoround.md delete mode 100644 docs/user_guide/quantization/fp8.md delete mode 100644 docs/user_guide/quantization/gguf.md delete mode 100644 docs/user_guide/quantization/int8.md delete mode 100644 docs/user_guide/quantization/msmodelslim.md delete mode 100644 docs/user_guide/quantization/online.md delete mode 100644 docs/user_guide/quantization/overview.md delete mode 100644 examples/offline_inference/bagel/README.md delete mode 100644 examples/offline_inference/bagel/end2end.py delete mode 100644 examples/offline_inference/cosyvoice3/README.md delete mode 100644 examples/offline_inference/cosyvoice3/verify_e2e_cosyvoice.py delete mode 100644 examples/offline_inference/custom_pipeline/image_to_image/custom_pipeline.py delete mode 100644 examples/offline_inference/custom_pipeline/image_to_image/image_edit.py delete mode 100644 examples/offline_inference/custom_pipeline/image_to_image/run.sh delete mode 100644 examples/offline_inference/dynin_omni/README.md delete mode 100644 examples/offline_inference/dynin_omni/end2end.py delete mode 100644 examples/offline_inference/fish_speech/README.md delete mode 100644 examples/offline_inference/fish_speech/end2end.py delete mode 100644 examples/offline_inference/helios/README.md delete mode 100644 examples/offline_inference/helios/end2end.py delete mode 100644 examples/offline_inference/hunyuan_image3/README.md delete mode 100644 examples/offline_inference/hunyuan_image3/end2end.py delete mode 100644 examples/offline_inference/image_to_image/image_edit.py delete mode 100644 examples/offline_inference/image_to_image/image_to_image.md delete mode 100644 examples/offline_inference/image_to_image/run_qwen_image_edit_2511.sh delete mode 100644 examples/offline_inference/image_to_video/README.md delete mode 100644 examples/offline_inference/image_to_video/image_to_video.py delete mode 100644 examples/offline_inference/internvla_a1/README.md delete mode 100644 examples/offline_inference/internvla_a1/collect_results.sh delete mode 100755 examples/offline_inference/internvla_a1/end2end.py delete mode 100644 examples/offline_inference/internvla_a1/internvla_a1_common.py delete mode 100755 examples/offline_inference/internvla_a1/run.sh delete mode 100644 examples/offline_inference/magi_human/README.md delete mode 100644 examples/offline_inference/magi_human/end2end.py delete mode 100644 examples/offline_inference/mammothmodal2_preview/README.md delete mode 100644 examples/offline_inference/mammothmodal2_preview/run_mammothmoda2_image_summarize.py delete mode 100644 examples/offline_inference/mammothmodal2_preview/run_mammothmoda2_t2i.py delete mode 100644 examples/offline_inference/mimo_audio/README.md delete mode 100644 examples/offline_inference/mimo_audio/end2end.py delete mode 100644 examples/offline_inference/mimo_audio/message_base64_wav.json delete mode 100644 examples/offline_inference/mimo_audio/message_convert.py delete mode 100644 examples/offline_inference/mimo_audio/process_speechdata.py delete mode 100644 examples/offline_inference/ming_flash_omni/README.md delete mode 100644 examples/offline_inference/ming_flash_omni/end2end.py delete mode 100644 examples/offline_inference/ming_flash_omni_tts/README.md delete mode 100644 examples/offline_inference/ming_flash_omni_tts/end2end.py delete mode 100644 examples/offline_inference/moss_tts_nano/README.md delete mode 100644 examples/offline_inference/moss_tts_nano/end2end.py delete mode 100644 examples/offline_inference/omnivoice/README.md delete mode 100644 examples/offline_inference/omnivoice/end2end.py delete mode 100644 examples/offline_inference/qwen2_5_omni/README.md delete mode 100644 examples/offline_inference/qwen2_5_omni/end2end.py delete mode 100644 examples/offline_inference/qwen2_5_omni/extract_prompts.py delete mode 100644 examples/offline_inference/qwen2_5_omni/run_multiple_prompts.sh delete mode 100644 examples/offline_inference/qwen2_5_omni/run_single_prompt.sh delete mode 100644 examples/offline_inference/qwen3_omni/README.md delete mode 100644 examples/offline_inference/qwen3_omni/end2end.py delete mode 100644 examples/offline_inference/qwen3_omni/end2end_async_chunk.py delete mode 100644 examples/offline_inference/qwen3_omni/run_multiple_prompts.sh delete mode 100755 examples/offline_inference/qwen3_omni/run_multiple_prompts_async_chunk.sh delete mode 100644 examples/offline_inference/qwen3_omni/run_single_prompt.sh delete mode 100755 examples/offline_inference/qwen3_omni/run_single_prompt_async_chunk.sh delete mode 100644 examples/offline_inference/qwen3_omni/run_single_prompt_tp.sh delete mode 100644 examples/offline_inference/qwen3_omni/text_prompts_10.txt delete mode 100644 examples/offline_inference/qwen3_tts/README.md delete mode 100644 examples/offline_inference/qwen3_tts/benchmark_prompts.txt delete mode 100644 examples/offline_inference/qwen3_tts/end2end.py delete mode 100644 examples/offline_inference/text_to_audio/README.md delete mode 100644 examples/offline_inference/text_to_audio/text_to_audio.py delete mode 100644 examples/offline_inference/text_to_image/README.md delete mode 100644 examples/offline_inference/text_to_image/gradio_demo.py delete mode 100644 examples/offline_inference/text_to_image/text_to_image.py delete mode 100644 examples/offline_inference/text_to_video/text_to_video.md delete mode 100644 examples/offline_inference/text_to_video/text_to_video.py delete mode 100644 examples/offline_inference/vace/vace_video_generation.md delete mode 100644 examples/offline_inference/vace/vace_video_generation.py delete mode 100644 examples/offline_inference/voxcpm/README.md delete mode 100644 examples/offline_inference/voxcpm/end2end.py delete mode 100644 examples/offline_inference/voxcpm2/README.md delete mode 100644 examples/offline_inference/voxcpm2/end2end.py delete mode 100644 examples/offline_inference/voxtral_tts/README.md delete mode 100644 examples/offline_inference/voxtral_tts/end2end.py delete mode 100644 examples/offline_inference/x_to_video_audio/download_dreamid_omni.py delete mode 100644 examples/offline_inference/x_to_video_audio/x_to_video_audio.md delete mode 100644 examples/offline_inference/x_to_video_audio/x_to_video_audio.py delete mode 100644 examples/online_serving/bagel/README.md delete mode 100755 examples/online_serving/bagel/openai_chat_client.py delete mode 100755 examples/online_serving/bagel/run_server.sh delete mode 100644 examples/online_serving/bagel/run_server_stage_cli.sh delete mode 100644 examples/online_serving/chart-helm/.helmignore delete mode 100644 examples/online_serving/chart-helm/Chart.yaml delete mode 100644 examples/online_serving/chart-helm/README.md delete mode 100644 examples/online_serving/chart-helm/ct.yaml delete mode 100644 examples/online_serving/chart-helm/lintconf.yaml delete mode 100644 examples/online_serving/chart-helm/templates/_helpers.tpl delete mode 100644 examples/online_serving/chart-helm/templates/configmap.yaml delete mode 100644 examples/online_serving/chart-helm/templates/custom-objects.yaml delete mode 100644 examples/online_serving/chart-helm/templates/deployment.yaml delete mode 100644 examples/online_serving/chart-helm/templates/hpa.yaml delete mode 100644 examples/online_serving/chart-helm/templates/ingress.yaml delete mode 100644 examples/online_serving/chart-helm/templates/poddisruptionbudget.yaml delete mode 100644 examples/online_serving/chart-helm/templates/pvc.yaml delete mode 100644 examples/online_serving/chart-helm/templates/secrets.yaml delete mode 100644 examples/online_serving/chart-helm/templates/service.yaml delete mode 100644 examples/online_serving/chart-helm/tests/deployment_test.yaml delete mode 100644 examples/online_serving/chart-helm/tests/ingress_test.yaml delete mode 100644 examples/online_serving/chart-helm/tests/pvc_test.yaml delete mode 100644 examples/online_serving/chart-helm/tests/secrets_test.yaml delete mode 100644 examples/online_serving/chart-helm/values.yaml delete mode 100644 examples/online_serving/diffusers_pipeline_adapter/README.md delete mode 100644 examples/online_serving/diffusers_pipeline_adapter/stage_config.yaml delete mode 100644 examples/online_serving/dynin_omni/README.md delete mode 100644 examples/online_serving/dynin_omni/openai_chat_completion_client_for_multimodal_generation.py delete mode 100644 examples/online_serving/fish_speech/README.md delete mode 100644 examples/online_serving/fish_speech/gradio_demo.py delete mode 100755 examples/online_serving/fish_speech/run_gradio_demo.sh delete mode 100755 examples/online_serving/fish_speech/run_server.sh delete mode 100644 examples/online_serving/fish_speech/speech_client.py delete mode 100644 examples/online_serving/helios/README.md delete mode 100644 examples/online_serving/helios/helios_client.py delete mode 100644 examples/online_serving/helios/run_helios_distilled.sh delete mode 100644 examples/online_serving/helios/run_helios_mid_stage2.sh delete mode 100644 examples/online_serving/helios/run_helios_t2v.sh delete mode 100644 examples/online_serving/image_to_image/README.md delete mode 100644 examples/online_serving/image_to_image/gradio_demo.py delete mode 100644 examples/online_serving/image_to_image/openai_chat_client.py delete mode 100644 examples/online_serving/image_to_image/run_curl_image_edit.sh delete mode 100755 examples/online_serving/image_to_image/run_server.sh delete mode 100644 examples/online_serving/image_to_video/README.md delete mode 100644 examples/online_serving/image_to_video/run_curl_hunyuan_video_15.sh delete mode 100644 examples/online_serving/image_to_video/run_curl_image_to_video.sh delete mode 100644 examples/online_serving/image_to_video/run_server.sh delete mode 100644 examples/online_serving/image_to_video/run_server_hunyuan_video_15.sh delete mode 100644 examples/online_serving/mimo_audio/README.md delete mode 100644 examples/online_serving/mimo_audio/chat_template.jinja delete mode 100644 examples/online_serving/mimo_audio/openai_chat_completion_client_for_multimodal_generation.py delete mode 100644 examples/online_serving/ming_flash_omni/README.md delete mode 100755 examples/online_serving/ming_flash_omni/run_curl_multimodal_generation.sh delete mode 100644 examples/online_serving/ming_flash_omni_tts/README.md delete mode 100755 examples/online_serving/ming_flash_omni_tts/run_server.sh delete mode 100644 examples/online_serving/ming_flash_omni_tts/speech_client.py delete mode 100644 examples/online_serving/moss_tts_nano/README.md delete mode 100644 examples/online_serving/moss_tts_nano/gradio_demo.py delete mode 100755 examples/online_serving/moss_tts_nano/run_gradio_demo.sh delete mode 100755 examples/online_serving/moss_tts_nano/run_server.sh delete mode 100644 examples/online_serving/omnivoice/README.md delete mode 100755 examples/online_serving/omnivoice/run_server.sh delete mode 100644 examples/online_serving/omnivoice/speech_client.py delete mode 100644 examples/online_serving/openai_chat_completion_client_for_multimodal_generation.py delete mode 100644 examples/online_serving/qwen2_5_omni/README.md delete mode 100644 examples/online_serving/qwen2_5_omni/gradio_demo.py delete mode 100644 examples/online_serving/qwen2_5_omni/run_curl_multimodal_generation.sh delete mode 100755 examples/online_serving/qwen2_5_omni/run_gradio_demo.sh delete mode 100644 examples/online_serving/qwen3_omni/README.md delete mode 100644 examples/online_serving/qwen3_omni/gradio_demo.py delete mode 100644 examples/online_serving/qwen3_omni/openai_realtime_client.py delete mode 100644 examples/online_serving/qwen3_omni/qwen3_omni_moe_thinking.yaml delete mode 100644 examples/online_serving/qwen3_omni/run_curl_multimodal_generation.sh delete mode 100755 examples/online_serving/qwen3_omni/run_gradio_demo.sh delete mode 100644 examples/online_serving/qwen3_omni/streaming_video_client.py delete mode 100644 examples/online_serving/qwen3_tts/README.md delete mode 100644 examples/online_serving/qwen3_tts/batch_speech_client.py delete mode 100644 examples/online_serving/qwen3_tts/gradio_demo.py delete mode 100644 examples/online_serving/qwen3_tts/openai_speech_client.py delete mode 100644 examples/online_serving/qwen3_tts/run_gradio_demo.sh delete mode 100755 examples/online_serving/qwen3_tts/run_server.sh delete mode 100644 examples/online_serving/qwen3_tts/speaker_embedding_interpolation.py delete mode 100644 examples/online_serving/qwen3_tts/streaming_speech_client.py delete mode 100644 examples/online_serving/qwen3_tts/tts_common.py delete mode 100644 examples/online_serving/stable_audio/README.md delete mode 100755 examples/online_serving/stable_audio/curl_examples.sh delete mode 100755 examples/online_serving/stable_audio/stable_audio_client.py delete mode 100644 examples/online_serving/text_to_image/README.md delete mode 100644 examples/online_serving/text_to_image/gradio_demo.py delete mode 100644 examples/online_serving/text_to_image/openai_chat_client.py delete mode 100755 examples/online_serving/text_to_image/run_curl_text_to_image.sh delete mode 100755 examples/online_serving/text_to_image/run_server.sh delete mode 100644 examples/online_serving/text_to_video/README.md delete mode 100644 examples/online_serving/text_to_video/run_curl_hunyuan_video_15.sh delete mode 100644 examples/online_serving/text_to_video/run_curl_ltx2.sh delete mode 100644 examples/online_serving/text_to_video/run_curl_text_to_video.sh delete mode 100644 examples/online_serving/text_to_video/run_server.sh delete mode 100644 examples/online_serving/text_to_video/run_server_hunyuan_video_15.sh delete mode 100644 examples/online_serving/text_to_video/run_server_ltx2.sh delete mode 100644 examples/online_serving/voxcpm/README.md delete mode 100644 examples/online_serving/voxcpm/openai_speech_client.py delete mode 100755 examples/online_serving/voxcpm/run_server.sh delete mode 100644 examples/online_serving/voxcpm2/README.md delete mode 100644 examples/online_serving/voxcpm2/gradio_demo.py delete mode 100644 examples/online_serving/voxcpm2/openai_speech_client.py delete mode 100644 examples/online_serving/voxtral_tts/gradio_demo.py delete mode 100644 examples/online_serving/voxtral_tts/text_preprocess.py delete mode 100644 mkdocs.yml delete mode 100644 pyproject.toml delete mode 100644 recipes/LTX/LTX-2.3.md delete mode 100644 recipes/Qwen/Qwen3-Omni.md delete mode 100644 recipes/README.md delete mode 100644 recipes/TEMPLATE.md delete mode 100644 recipes/Wan-AI/Wan2.2-I2V.md delete mode 100644 recipes/inclusionAI/Ming-flash-omni-2.0.md delete mode 100644 requirements/common.txt delete mode 100644 requirements/cpu.txt delete mode 100644 requirements/cuda.txt delete mode 100644 requirements/musa.txt delete mode 100644 requirements/npu.txt delete mode 100644 requirements/rocm.txt delete mode 100644 requirements/xpu.txt delete mode 100755 scripts/build_wheel.sh delete mode 100644 setup.py delete mode 100644 tests/__init__.py delete mode 100644 tests/assets/cosyvoice3/zero_shot_prompt.wav delete mode 100644 tests/assets/qwen3_tts/clone_2.wav delete mode 100644 tests/benchmarks/conftest.py delete mode 100644 tests/benchmarks/metrics/test_metrics.py delete mode 100644 tests/benchmarks/patch/test_patch.py delete mode 100644 tests/benchmarks/test_accuracy_bench_utils.py delete mode 100644 tests/benchmarks/test_bench_tts_cli.py delete mode 100644 tests/benchmarks/test_diffusion_backends_metrics.py delete mode 100644 tests/benchmarks/test_seed_tts_dataset_variants.py delete mode 100644 tests/benchmarks/test_serve_cli.py delete mode 100644 tests/comfyui/conftest.py delete mode 100644 tests/comfyui/test_comfyui_integration.py delete mode 100644 tests/config/__init__.py delete mode 100644 tests/config/test_pipeline_registry.py delete mode 100644 tests/conftest.py delete mode 100644 tests/core/sched/test_chunk_scheduling_coordinator.py delete mode 100644 tests/core/sched/test_generation_scheduler_restore.py delete mode 100644 tests/core/sched/test_omni_scheduler_mixin.py delete mode 100644 tests/core/test_prefix_cache.py delete mode 100644 tests/dfx/conftest.py delete mode 100644 tests/dfx/perf/scripts/diffusion_result_template.json delete mode 100644 tests/dfx/perf/scripts/result_omni_template.json delete mode 100644 tests/dfx/perf/scripts/run_benchmark.py delete mode 100644 tests/dfx/perf/scripts/run_diffusion_benchmark.py delete mode 100644 tests/dfx/perf/tests/test_ltx2_vllm_omni.json delete mode 100644 tests/dfx/perf/tests/test_qwen_image_edit_2509_vllm_omni.json delete mode 100644 tests/dfx/perf/tests/test_qwen_image_edit_vllm_omni.json delete mode 100644 tests/dfx/perf/tests/test_qwen_image_layered_vllm_omni.json delete mode 100644 tests/dfx/perf/tests/test_qwen_image_vllm_omni.json delete mode 100644 tests/dfx/perf/tests/test_qwen_omni.json delete mode 100644 tests/dfx/perf/tests/test_runner_metadata.py delete mode 100644 tests/dfx/perf/tests/test_tts.json delete mode 100644 tests/dfx/perf/tests/test_wan22_i2v_vllm_omni.json delete mode 100644 tests/dfx/reliability/README.md delete mode 100644 tests/dfx/reliability/conftest.py delete mode 100644 tests/dfx/reliability/helpers.py delete mode 100644 tests/dfx/reliability/test_reliability_qwen3_omni.py delete mode 100644 tests/dfx/reliability/test_reliability_wan22.py delete mode 100644 tests/dfx/stability/README.md delete mode 100644 tests/dfx/stability/conftest.py delete mode 100644 tests/dfx/stability/helpers.py delete mode 100644 tests/dfx/stability/scripts/__init__.py delete mode 100644 tests/dfx/stability/scripts/generate_report.py delete mode 100644 tests/dfx/stability/scripts/resource_monitor.sh delete mode 100644 tests/dfx/stability/scripts/test_stability_qwen3_omni.py delete mode 100644 tests/dfx/stability/scripts/test_stability_qwen3_tts.py delete mode 100644 tests/dfx/stability/scripts/test_stability_qwen_image.py delete mode 100644 tests/dfx/stability/scripts/test_stability_wan22.py delete mode 100644 tests/dfx/stability/tests/test_qwen3_omni.json delete mode 100644 tests/dfx/stability/tests/test_qwen3_tts.json delete mode 100644 tests/dfx/stability/tests/test_qwen_image.json delete mode 100644 tests/dfx/stability/tests/test_wan22.json delete mode 100644 tests/diffusion/attention/test_attention_sp.py delete mode 100644 tests/diffusion/attention/test_flash_attn.py delete mode 100644 tests/diffusion/attention/test_ulysses_uaa.py delete mode 100644 tests/diffusion/cache/__init__.py delete mode 100644 tests/diffusion/cache/test_cache_backends.py delete mode 100644 tests/diffusion/cache/test_cache_dit.py delete mode 100644 tests/diffusion/cache/test_teacache_extractors.py delete mode 100644 tests/diffusion/distributed/test_autoencoder_kl_wan.py delete mode 100644 tests/diffusion/distributed/test_autoencoder_kl_wan_encode.py delete mode 100644 tests/diffusion/distributed/test_cfg_parallel.py delete mode 100644 tests/diffusion/distributed/test_comm.py delete mode 100644 tests/diffusion/distributed/test_distributed_vae_executor.py delete mode 100644 tests/diffusion/distributed/test_hsdp.py delete mode 100644 tests/diffusion/distributed/test_parallel_state_sp_groups.py delete mode 100644 tests/diffusion/distributed/test_sp_plan_hooks.py delete mode 100644 tests/diffusion/distributed/test_ulysses_uaa_perf.py delete mode 100644 tests/diffusion/distributed/test_vae_patch_parallel.py delete mode 100644 tests/diffusion/hooks/test_hook_registry.py delete mode 100644 tests/diffusion/layers/__init__.py delete mode 100644 tests/diffusion/layers/test_adalayernorm.py delete mode 100644 tests/diffusion/layers/test_norm.py delete mode 100644 tests/diffusion/layers/test_rotary_emb_equivalence.py delete mode 100644 tests/diffusion/lora/helpers.py delete mode 100644 tests/diffusion/lora/test_base_linear.py delete mode 100644 tests/diffusion/lora/test_lora_manager.py delete mode 100644 tests/diffusion/model_loader/gguf_adapters/test_flux2_klein_gguf_adapter.py delete mode 100644 tests/diffusion/model_loader/gguf_adapters/test_qwen_image_gguf_adapter.py delete mode 100644 tests/diffusion/model_loader/gguf_adapters/test_z_image_gguf_adapter.py delete mode 100644 tests/diffusion/model_loader/test_diffusers_loader.py delete mode 100644 tests/diffusion/model_loader/test_diffusers_loader_gguf.py delete mode 100644 tests/diffusion/models/bagel/__init__.py delete mode 100644 tests/diffusion/models/bagel/test_bagel_lora.py delete mode 100644 tests/diffusion/models/bagel/test_combine_cfg.py delete mode 100644 tests/diffusion/models/bagel/test_trajectory_recording.py delete mode 100644 tests/diffusion/models/dmd2/__init__.py delete mode 100644 tests/diffusion/models/dmd2/test_dmd2_request_sanitization.py delete mode 100644 tests/diffusion/models/dmd2/test_dmd2_scheduler.py delete mode 100644 tests/diffusion/models/flux/__init__.py delete mode 100644 tests/diffusion/models/flux/test_flux_prefix_propagation.py delete mode 100644 tests/diffusion/models/flux2/test_flux2_transformer_tp.py delete mode 100644 tests/diffusion/models/glm_image/test_glm_image_sp.py delete mode 100644 tests/diffusion/models/hunyuan_image3/test_hunyuan_fused_moe.py delete mode 100644 tests/diffusion/models/hunyuan_image3/test_hunyuan_image3_sampler.py delete mode 100644 tests/diffusion/models/ltx2/test_ltx2_3_pipeline.py delete mode 100644 tests/diffusion/models/ltx2/test_ltx2_cfg_parallel_adaptation.py delete mode 100644 tests/diffusion/models/ltx2/test_ltx2_hsdp.py delete mode 100644 tests/diffusion/models/nextstep_1_1/test_nextstep_cfg_parallel_layout.py delete mode 100644 tests/diffusion/models/qwen_image/test_qwen_image_edit_plus.py delete mode 100644 tests/diffusion/models/qwen_image/test_qwen_image_max_sequence_length.py delete mode 100644 tests/diffusion/models/qwen_image/test_qwen_image_size_utils.py delete mode 100644 tests/diffusion/models/stable_audio/test_stable_audio_hsdp.py delete mode 100644 tests/diffusion/models/t5_encoder/test_t5_encoder_prefix.py delete mode 100644 tests/diffusion/models/t5_encoder/test_t5_encoder_tp.py delete mode 100644 tests/diffusion/models/wan2_2/__init__.py delete mode 100644 tests/diffusion/models/wan2_2/conftest.py delete mode 100644 tests/diffusion/models/wan2_2/test_wan22_i2v_pipeline.py delete mode 100644 tests/diffusion/models/wan2_2/test_wan22_pipeline_diffuse.py delete mode 100644 tests/diffusion/models/wan2_2/test_wan22_pipeline_helpers.py delete mode 100644 tests/diffusion/models/wan2_2/test_wan22_ti2v_pipeline.py delete mode 100644 tests/diffusion/models/wan2_2/test_wan22_vace_pipeline.py delete mode 100644 tests/diffusion/models/z_image/test_zimage_tp_constraints.py delete mode 100644 tests/diffusion/offloader/test_layerwise_backend.py delete mode 100644 tests/diffusion/offloader/test_module_collector.py delete mode 100644 tests/diffusion/offloader/test_sequential_backend.py delete mode 100644 tests/diffusion/quantization/__init__.py delete mode 100644 tests/diffusion/quantization/test_component_routing.py delete mode 100644 tests/diffusion/quantization/test_fp8_config.py delete mode 100644 tests/diffusion/quantization/test_gguf_config.py delete mode 100644 tests/diffusion/quantization/test_inc_config.py delete mode 100644 tests/diffusion/quantization/test_int8_config.py delete mode 100644 tests/diffusion/quantization/test_quantization_quality.py delete mode 100644 tests/diffusion/test_data_is_moe.py delete mode 100644 tests/diffusion/test_diffusers_adapter.py delete mode 100644 tests/diffusion/test_diffusion_engine_metrics.py delete mode 100644 tests/diffusion/test_diffusion_model_runner.py delete mode 100644 tests/diffusion/test_diffusion_request.py delete mode 100644 tests/diffusion/test_diffusion_scheduler.py delete mode 100644 tests/diffusion/test_diffusion_step_pipeline.py delete mode 100644 tests/diffusion/test_diffusion_worker.py delete mode 100644 tests/diffusion/test_diffusion_worker_cuda_profiler.py delete mode 100644 tests/diffusion/test_inline_stage_diffusion_client.py delete mode 100644 tests/diffusion/test_multiproc_engine_concurrency.py delete mode 100644 tests/diffusion/test_stage_diffusion_proc.py delete mode 100644 tests/diffusion/test_worker_wrapper_base.py delete mode 100644 tests/distributed/omni_connectors/test_adapter_and_flow.py delete mode 100644 tests/distributed/omni_connectors/test_basic_connectors.py delete mode 100644 tests/distributed/omni_connectors/test_chunk_transfer_adapter.py delete mode 100644 tests/distributed/omni_connectors/test_kv_flow.py delete mode 100755 tests/distributed/omni_connectors/test_mooncake_transfer_engine_buffer.py delete mode 100755 tests/distributed/omni_connectors/test_mooncake_transfer_engine_rdma.py delete mode 100644 tests/distributed/omni_connectors/test_omni_connector_configs.py delete mode 100644 tests/distributed/omni_connectors/test_shm_connector.py delete mode 100644 tests/distributed/omni_connectors/test_tp_rank_aware.py delete mode 100644 tests/distributed/omni_coordinator/test_load_balancer.py delete mode 100644 tests/distributed/omni_coordinator/test_omni_coord_client_for_hub.py delete mode 100644 tests/distributed/omni_coordinator/test_omni_coord_client_for_stage.py delete mode 100644 tests/distributed/omni_coordinator/test_omni_coordinator.py delete mode 100644 tests/e2e/__init__.py delete mode 100644 tests/e2e/accuracy/conftest.py delete mode 100644 tests/e2e/accuracy/helpers.py delete mode 100644 tests/e2e/accuracy/qwen3_omni/__init__.py delete mode 100644 tests/e2e/accuracy/qwen3_omni/qwen3_omni_acc_bench_core.py delete mode 100644 tests/e2e/accuracy/qwen3_omni/run_qwen_omni_acc_benchmark.py delete mode 100644 tests/e2e/accuracy/qwen3_omni/test_qwen3_omni.py delete mode 100644 tests/e2e/accuracy/test_gebench_h100_smoke.py delete mode 100644 tests/e2e/accuracy/test_gedit_bench_h100_smoke.py delete mode 100644 tests/e2e/accuracy/test_ltx2_3_video_similarity.py delete mode 100644 tests/e2e/accuracy/test_qwen_image.py delete mode 100644 tests/e2e/accuracy/test_qwen_image_edit.py delete mode 100644 tests/e2e/accuracy/test_qwen_image_layered.py delete mode 100644 tests/e2e/accuracy/wan22_i2v/__init__.py delete mode 100644 tests/e2e/accuracy/wan22_i2v/run_wan22_i2v_diffusers_cp.py delete mode 100644 tests/e2e/accuracy/wan22_i2v/test_wan22_i2v_video_similarity.py delete mode 100644 tests/e2e/accuracy/wan22_i2v/wan22_i2v_video_similarity_common.py delete mode 100644 tests/e2e/offline_inference/__init__.py delete mode 100644 tests/e2e/offline_inference/compute_lpips.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/__init__.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/flow_match_sde_scheduler.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/qwen_image_pipeline_with_logprob.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/test_async_omni_collective_rpc.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/test_async_omni_qwen_image_generate.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/test_worker_extension.py delete mode 100644 tests/e2e/offline_inference/custom_pipeline/worker_extension.py delete mode 100644 tests/e2e/offline_inference/run_quantization_e2e.sh delete mode 100644 tests/e2e/offline_inference/test_bagel_img2img.py delete mode 100644 tests/e2e/offline_inference/test_bagel_lora.py delete mode 100644 tests/e2e/offline_inference/test_bagel_text2img.py delete mode 100644 tests/e2e/offline_inference/test_bagel_understanding.py delete mode 100644 tests/e2e/offline_inference/test_cache_dit.py delete mode 100644 tests/e2e/offline_inference/test_cosyvoice3.py delete mode 100644 tests/e2e/offline_inference/test_diffusion_cpu_offload.py delete mode 100644 tests/e2e/offline_inference/test_diffusion_layerwise_offload.py delete mode 100644 tests/e2e/offline_inference/test_diffusion_lora.py delete mode 100644 tests/e2e/offline_inference/test_dynin_omni.py delete mode 100644 tests/e2e/offline_inference/test_expert_parallel.py delete mode 100644 tests/e2e/offline_inference/test_flux.py delete mode 100644 tests/e2e/offline_inference/test_flux2_klein.py delete mode 100644 tests/e2e/offline_inference/test_flux_autoround_w4a16.py delete mode 100644 tests/e2e/offline_inference/test_flux_kontext.py delete mode 100644 tests/e2e/offline_inference/test_hunyuanimage3_text2img.py delete mode 100644 tests/e2e/offline_inference/test_internvla_a1.py delete mode 100644 tests/e2e/offline_inference/test_ltx2_cfg_parallel_parity.py delete mode 100644 tests/e2e/offline_inference/test_magi_human.py delete mode 100644 tests/e2e/offline_inference/test_mammoth_moda2.py delete mode 100644 tests/e2e/offline_inference/test_ming_flash_omni.py delete mode 100644 tests/e2e/offline_inference/test_moss_tts_nano.py delete mode 100644 tests/e2e/offline_inference/test_omni_sleep_mode.py delete mode 100644 tests/e2e/offline_inference/test_omnivoice.py delete mode 100644 tests/e2e/offline_inference/test_ovis_image.py delete mode 100644 tests/e2e/offline_inference/test_quantization_fp8.py delete mode 100644 tests/e2e/offline_inference/test_qwen2_5_omni_autoround_w4a16.py delete mode 100644 tests/e2e/offline_inference/test_qwen2_5_omni_expansion.py delete mode 100644 tests/e2e/offline_inference/test_qwen3_omni.py delete mode 100644 tests/e2e/offline_inference/test_qwen3_omni_autoround_w4a16.py delete mode 100644 tests/e2e/offline_inference/test_qwen3_tts_base.py delete mode 100644 tests/e2e/offline_inference/test_qwen3_tts_customvoice.py delete mode 100644 tests/e2e/offline_inference/test_qwen_image_diffusion_batching.py delete mode 100644 tests/e2e/offline_inference/test_sequence_parallel.py delete mode 100644 tests/e2e/offline_inference/test_stable_audio_expansion.py delete mode 100644 tests/e2e/offline_inference/test_t2i_model.py delete mode 100644 tests/e2e/offline_inference/test_t2v_model.py delete mode 100644 tests/e2e/offline_inference/test_teacache.py delete mode 100644 tests/e2e/offline_inference/test_vae_decode_parallelism.py delete mode 100644 tests/e2e/offline_inference/test_voxcpm.py delete mode 100644 tests/e2e/offline_inference/test_voxcpm2.py delete mode 100644 tests/e2e/offline_inference/test_voxtral_tts.py delete mode 100644 tests/e2e/offline_inference/test_zimage_parallelism.py delete mode 100644 tests/e2e/online_serving/__init__.py delete mode 100644 tests/e2e/online_serving/test_bagel_expansion.py delete mode 100644 tests/e2e/online_serving/test_bagel_online.py delete mode 100644 tests/e2e/online_serving/test_cosyvoice3_tts.py delete mode 100644 tests/e2e/online_serving/test_diffusers_adapter.py delete mode 100644 tests/e2e/online_serving/test_dynin_omni_expansion.py delete mode 100644 tests/e2e/online_serving/test_flux2_expansion.py delete mode 100644 tests/e2e/online_serving/test_flux2_klein_inpaint_expansion.py delete mode 100644 tests/e2e/online_serving/test_flux_2_dev_expansion.py delete mode 100644 tests/e2e/online_serving/test_flux_kontext_expansion.py delete mode 100644 tests/e2e/online_serving/test_hunyuan_video_15_expansion.py delete mode 100644 tests/e2e/online_serving/test_image_gen_edit.py delete mode 100644 tests/e2e/online_serving/test_images_generations_lora.py delete mode 100644 tests/e2e/online_serving/test_longcat_image_edit_expansion.py delete mode 100644 tests/e2e/online_serving/test_longcat_image_expansion.py delete mode 100644 tests/e2e/online_serving/test_mimo_audio.py delete mode 100644 tests/e2e/online_serving/test_ming_flash_omni.py delete mode 100644 tests/e2e/online_serving/test_moss_tts_nano.py delete mode 100644 tests/e2e/online_serving/test_nextstep_expansion.py delete mode 100644 tests/e2e/online_serving/test_omnivoice.py delete mode 100644 tests/e2e/online_serving/test_qwen2_5_omni_expansion.py delete mode 100644 tests/e2e/online_serving/test_qwen3_omni.py delete mode 100644 tests/e2e/online_serving/test_qwen3_omni_expansion.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_base.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_base_expansion.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_batch.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_customvoice.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_customvoice_expansion.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_speaker_embedding.py delete mode 100644 tests/e2e/online_serving/test_qwen3_tts_websocket.py delete mode 100644 tests/e2e/online_serving/test_qwen_image_edit_expansion.py delete mode 100644 tests/e2e/online_serving/test_qwen_image_expansion.py delete mode 100644 tests/e2e/online_serving/test_qwen_image_layered_expansion.py delete mode 100644 tests/e2e/online_serving/test_sd3_expansion.py delete mode 100644 tests/e2e/online_serving/test_video_generation_api.py delete mode 100644 tests/e2e/online_serving/test_voxtral_tts.py delete mode 100644 tests/e2e/online_serving/test_wan22_expansion.py delete mode 100644 tests/e2e/online_serving/test_wan_2_1_vace_expansion.py delete mode 100644 tests/e2e/online_serving/test_zimage_expansion.py delete mode 100644 tests/e2e/stage_configs/bailingmm_moe_v2_lite_ci.yaml delete mode 100644 tests/e2e/stage_configs/bailingmm_moe_v2_lite_thinker_only_ci.yaml delete mode 100644 tests/e2e/stage_configs/dynin_omni_ci.yaml delete mode 100644 tests/engine/__init__.py delete mode 100644 tests/engine/test_arg_utils.py delete mode 100644 tests/engine/test_async_omni_engine_abort.py delete mode 100644 tests/engine/test_async_omni_engine_input.py delete mode 100644 tests/engine/test_async_omni_engine_outputs.py delete mode 100644 tests/engine/test_async_omni_engine_stage_init.py delete mode 100644 tests/engine/test_cfg_companion_tracker.py delete mode 100644 tests/engine/test_cross_stage_lora.py delete mode 100644 tests/engine/test_orchestrator.py delete mode 100644 tests/engine/test_orchestrator_error_handling.py delete mode 100644 tests/engine/test_orchestrator_kv_sender_info.py delete mode 100644 tests/engine/test_output_modality.py delete mode 100644 tests/engine/test_output_processor.py delete mode 100644 tests/engine/test_single_stage_mode.py delete mode 100644 tests/engine/test_stage_engine_core_client.py delete mode 100644 tests/entrypoints/openai_api/__init__.py delete mode 100644 tests/entrypoints/openai_api/conftest_video.py delete mode 100644 tests/entrypoints/openai_api/test_image_server.py delete mode 100644 tests/entrypoints/openai_api/test_qwen3_omni_realtime_websocket.py delete mode 100644 tests/entrypoints/openai_api/test_serving_audio_generate.py delete mode 100644 tests/entrypoints/openai_api/test_serving_chat_metrics.py delete mode 100644 tests/entrypoints/openai_api/test_serving_chat_multistage_generation.py delete mode 100644 tests/entrypoints/openai_api/test_serving_chat_sampling_params.py delete mode 100644 tests/entrypoints/openai_api/test_serving_chat_speaker.py delete mode 100644 tests/entrypoints/openai_api/test_serving_speech.py delete mode 100644 tests/entrypoints/openai_api/test_serving_speech_stream.py delete mode 100644 tests/entrypoints/openai_api/test_serving_speech_voxcpm.py delete mode 100644 tests/entrypoints/openai_api/test_serving_video_stream.py delete mode 100644 tests/entrypoints/openai_api/test_stage_params.py delete mode 100644 tests/entrypoints/openai_api/test_text_splitter.py delete mode 100644 tests/entrypoints/openai_api/test_video_api_utils.py delete mode 100644 tests/entrypoints/openai_api/test_video_frame_filter.py delete mode 100644 tests/entrypoints/openai_api/test_video_server.py delete mode 100644 tests/entrypoints/openai_api/test_video_stream_handler.py delete mode 100644 tests/entrypoints/openai_api/test_video_stream_session.py delete mode 100644 tests/entrypoints/test_async_omni.py delete mode 100644 tests/entrypoints/test_async_omni_diffusion_config.py delete mode 100644 tests/entrypoints/test_omni_base_profiler.py delete mode 100644 tests/entrypoints/test_omni_entrypoints.py delete mode 100644 tests/entrypoints/test_omni_new_request_data.py delete mode 100644 tests/entrypoints/test_omni_sleep_mode.py delete mode 100644 tests/entrypoints/test_pd_disaggregation.py delete mode 100644 tests/entrypoints/test_realtime_connection_helpers.py delete mode 100644 tests/entrypoints/test_serve.py delete mode 100644 tests/entrypoints/test_stage_utils.py delete mode 100644 tests/entrypoints/test_utils.py delete mode 100644 tests/examples/conftest.py delete mode 100644 tests/examples/helpers.py delete mode 100644 tests/examples/offline_inference/__init__.py delete mode 100644 tests/examples/offline_inference/test_qwen3_tts_estimator.py delete mode 100644 tests/examples/offline_inference/test_text_to_image.py delete mode 100644 tests/examples/online_serving/__init__.py delete mode 100644 tests/examples/online_serving/test_qwen2_5_omni.py delete mode 100644 tests/examples/online_serving/test_qwen3_omni.py delete mode 100644 tests/examples/online_serving/test_text_to_image.py delete mode 100644 tests/examples/test_slerp_interpolation.py delete mode 100644 tests/helpers/__init__.py delete mode 100644 tests/helpers/assertions.py delete mode 100644 tests/helpers/env.py delete mode 100644 tests/helpers/fixtures/__init__.py delete mode 100644 tests/helpers/fixtures/env.py delete mode 100644 tests/helpers/fixtures/log.py delete mode 100644 tests/helpers/fixtures/run_args.py delete mode 100644 tests/helpers/fixtures/runtime.py delete mode 100644 tests/helpers/mark.py delete mode 100644 tests/helpers/media.py delete mode 100644 tests/helpers/process.py delete mode 100644 tests/helpers/runtime.py delete mode 100644 tests/helpers/stage_config.py delete mode 100644 tests/metrics/test_stats.py delete mode 100644 tests/model_executor/models/cosyvoice3/test_cosyvoice3_components.py delete mode 100644 tests/model_executor/models/cosyvoice3/test_cosyvoice3_model_helpers.py delete mode 100644 tests/model_executor/models/cosyvoice3/test_cosyvoice3_utils.py delete mode 100644 tests/model_executor/models/dynin_omni/test_dynin_omni_token2audio.py delete mode 100644 tests/model_executor/models/glm_image/test_glm_image_ar.py delete mode 100644 tests/model_executor/models/mimo_audio/test_mimo_audio_code2wav_batch_decode.py delete mode 100644 tests/model_executor/models/ming_flash_omni/test_talker_cfm.py delete mode 100644 tests/model_executor/models/ming_flash_omni/test_talker_modules.py delete mode 100644 tests/model_executor/models/qwen2_5_omni/test_audio_length.py delete mode 100644 tests/model_executor/models/qwen2_5_omni/test_qwen2_5_omni_embed.py delete mode 100644 tests/model_executor/models/qwen3_tts/__init__.py delete mode 100644 tests/model_executor/models/qwen3_tts/test_code_predictor_dtype.py delete mode 100644 tests/model_executor/models/qwen3_tts/test_cuda_graph_decoder.py delete mode 100644 tests/model_executor/models/qwen3_tts/test_qwen3_tts_code2wav.py delete mode 100644 tests/model_executor/models/registry.py delete mode 100644 tests/model_executor/models/test_encoder_quant_config.py delete mode 100644 tests/model_executor/models/test_fish_speech_regressions.py delete mode 100644 tests/model_executor/models/test_fish_speech_voice_cache.py delete mode 100644 tests/model_executor/models/test_omni_processing.py delete mode 100644 tests/model_executor/models/voxcpm2/__init__.py delete mode 100644 tests/model_executor/models/voxcpm2/test_talker_state_eviction.py delete mode 100644 tests/model_executor/models/voxtral_tts/__init__.py delete mode 100644 tests/model_executor/models/voxtral_tts/test_audio_tokenizer_parsing.py delete mode 100644 tests/model_executor/models/voxtral_tts/test_cuda_graph_acoustic_transformer.py delete mode 100644 tests/model_executor/models/voxtral_tts/test_text_preprocess.py delete mode 100644 tests/model_executor/stage_input_processors/test_cosyvoice3_stage_input_processors.py delete mode 100644 tests/model_executor/stage_input_processors/test_glm_image.py delete mode 100644 tests/model_executor/stage_input_processors/test_mimo_audio_flush_remaining_codes.py delete mode 100644 tests/model_executor/stage_input_processors/test_mimo_audio_llm2code2wav.py delete mode 100644 tests/model_executor/stage_input_processors/test_qwen3_omni_streaming_helpers.py delete mode 100644 tests/model_executor/stage_input_processors/test_qwen3_tts_async_chunk.py delete mode 100644 tests/model_executor/stage_input_processors/test_voxcpm_async_chunk.py delete mode 100644 tests/model_executor/stage_input_processors/test_voxtral_tts_async_chunk.py delete mode 100644 tests/profile/test_omni_torch_profiler.py delete mode 100644 tests/test_arg_utils.py delete mode 100644 tests/test_config_factory.py delete mode 100644 tests/test_data_entry_keys.py delete mode 100644 tests/test_diffusion_config_fields.py delete mode 100644 tests/test_diffusion_config_propagation.py delete mode 100644 tests/test_fish_speech_voice_cache.py delete mode 100644 tests/test_generate_nightly_perf_excel.py delete mode 100644 tests/test_generate_nightly_perf_html.py delete mode 100644 tests/test_outputs.py delete mode 100644 tests/test_version.py delete mode 100644 tests/test_voice_cache.py delete mode 100644 tests/utils/test_audio.py delete mode 100644 tests/worker/test_gpu_generation_model_runner.py delete mode 100644 tests/worker/test_omni_connector_mixin.py delete mode 100644 tests/worker/test_omni_gpu_model_runner.py delete mode 100644 tests/worker/test_process_gpu_memory.py delete mode 100644 tools/configure_stage_memory.py delete mode 100644 tools/nightly/buildkite_testcase_statistics.py delete mode 100644 tools/nightly/generate_nightly_perf_excel.py delete mode 100644 tools/nightly/generate_nightly_perf_html.py delete mode 100644 tools/nightly/send_nightly_email.py delete mode 100644 tools/pre_commit/check_pickle_imports.py delete mode 100644 tools/wan22/assemble_wan22_i2v_diffusers.py delete mode 100644 vllm_omni/__init__.py delete mode 100644 vllm_omni/assets/video.py delete mode 100644 vllm_omni/benchmarks/data_modules/__init__.py delete mode 100644 vllm_omni/benchmarks/data_modules/daily_omni_dataset.py delete mode 100644 vllm_omni/benchmarks/data_modules/daily_omni_eval.py delete mode 100644 vllm_omni/benchmarks/data_modules/daily_omni_text_audio.py delete mode 100644 vllm_omni/benchmarks/data_modules/random_multi_modal_dataset.py delete mode 100644 vllm_omni/benchmarks/data_modules/seed_tts_dataset.py delete mode 100644 vllm_omni/benchmarks/data_modules/seed_tts_eval.py delete mode 100644 vllm_omni/benchmarks/metrics/__init__.py delete mode 100644 vllm_omni/benchmarks/metrics/metrics.py delete mode 100644 vllm_omni/benchmarks/patch/__init__.py delete mode 100644 vllm_omni/benchmarks/patch/patch.py delete mode 100644 vllm_omni/benchmarks/serve.py delete mode 100644 vllm_omni/config/__init__.py delete mode 100644 vllm_omni/config/lora.py delete mode 100644 vllm_omni/config/model.py delete mode 100644 vllm_omni/config/pipeline_registry.py delete mode 100644 vllm_omni/config/stage_config.py delete mode 100644 vllm_omni/config/yaml_util.py delete mode 100644 vllm_omni/core/__init__.py delete mode 100644 vllm_omni/core/prefix_cache.py delete mode 100644 vllm_omni/core/sched/__init__.py delete mode 100644 vllm_omni/core/sched/omni_ar_scheduler.py delete mode 100644 vllm_omni/core/sched/omni_generation_scheduler.py delete mode 100644 vllm_omni/core/sched/omni_scheduler_mixin.py delete mode 100644 vllm_omni/core/sched/omni_scheduling_coordinator.py delete mode 100644 vllm_omni/core/sched/output.py delete mode 100644 vllm_omni/data_entry_keys.py delete mode 100644 vllm_omni/deploy/bagel.yaml delete mode 100644 vllm_omni/deploy/bagel_single_stage.yaml delete mode 100644 vllm_omni/deploy/bagel_think.yaml delete mode 100644 vllm_omni/deploy/cosyvoice3.yaml delete mode 100644 vllm_omni/deploy/fish_qwen3_omni.yaml delete mode 100644 vllm_omni/deploy/glm_image.yaml delete mode 100644 vllm_omni/deploy/mimo_audio.yaml delete mode 100644 vllm_omni/deploy/moss_tts_nano.yaml delete mode 100644 vllm_omni/deploy/qwen2_5_omni.yaml delete mode 100644 vllm_omni/deploy/qwen3_omni_moe.yaml delete mode 100644 vllm_omni/deploy/qwen3_tts.yaml delete mode 100644 vllm_omni/deploy/voxcpm2.yaml delete mode 100644 vllm_omni/deploy/voxtral_tts.yaml delete mode 100644 vllm_omni/diffusion/__init__.py delete mode 100644 vllm_omni/diffusion/attention/__init__.py delete mode 100644 vllm_omni/diffusion/attention/backends/__init__.py delete mode 100644 vllm_omni/diffusion/attention/backends/abstract.py delete mode 100644 vllm_omni/diffusion/attention/backends/flash_attn.py delete mode 100644 vllm_omni/diffusion/attention/backends/registry.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring/__init__.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring/ring_globals.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring/ring_kernels.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring/ring_selector.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring/ring_utils.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring_flash_attn.py delete mode 100644 vllm_omni/diffusion/attention/backends/ring_pytorch_attn.py delete mode 100644 vllm_omni/diffusion/attention/backends/sage_attn.py delete mode 100644 vllm_omni/diffusion/attention/backends/sdpa.py delete mode 100644 vllm_omni/diffusion/attention/backends/utils/__init__.py delete mode 100644 vllm_omni/diffusion/attention/backends/utils/fa.py delete mode 100644 vllm_omni/diffusion/attention/layer.py delete mode 100644 vllm_omni/diffusion/attention/parallel/__init__.py delete mode 100644 vllm_omni/diffusion/attention/parallel/base.py delete mode 100644 vllm_omni/diffusion/attention/parallel/factory.py delete mode 100644 vllm_omni/diffusion/attention/parallel/ring.py delete mode 100644 vllm_omni/diffusion/attention/parallel/ulysses.py delete mode 100644 vllm_omni/diffusion/attention/selector.py delete mode 100644 vllm_omni/diffusion/cache/__init__.py delete mode 100644 vllm_omni/diffusion/cache/base.py delete mode 100644 vllm_omni/diffusion/cache/cache_dit_backend.py delete mode 100644 vllm_omni/diffusion/cache/selector.py delete mode 100644 vllm_omni/diffusion/cache/teacache/__init__.py delete mode 100644 vllm_omni/diffusion/cache/teacache/backend.py delete mode 100644 vllm_omni/diffusion/cache/teacache/coefficient_estimator.py delete mode 100644 vllm_omni/diffusion/cache/teacache/config.py delete mode 100644 vllm_omni/diffusion/cache/teacache/extractors.py delete mode 100644 vllm_omni/diffusion/cache/teacache/hook.py delete mode 100644 vllm_omni/diffusion/cache/teacache/state.py delete mode 100644 vllm_omni/diffusion/compile.py delete mode 100644 vllm_omni/diffusion/data.py delete mode 100644 vllm_omni/diffusion/diffusion_engine.py delete mode 100644 vllm_omni/diffusion/distributed/__init__.py delete mode 100644 vllm_omni/diffusion/distributed/autoencoders/__init__.py delete mode 100644 vllm_omni/diffusion/distributed/autoencoders/autoencoder_kl.py delete mode 100644 vllm_omni/diffusion/distributed/autoencoders/autoencoder_kl_qwenimage.py delete mode 100644 vllm_omni/diffusion/distributed/autoencoders/autoencoder_kl_wan.py delete mode 100644 vllm_omni/diffusion/distributed/autoencoders/distributed_vae_executor.py delete mode 100644 vllm_omni/diffusion/distributed/cfg_parallel.py delete mode 100644 vllm_omni/diffusion/distributed/comm.py delete mode 100644 vllm_omni/diffusion/distributed/group_coordinator.py delete mode 100644 vllm_omni/diffusion/distributed/hsdp.py delete mode 100644 vllm_omni/diffusion/distributed/hsdp_utils.py delete mode 100644 vllm_omni/diffusion/distributed/parallel_state.py delete mode 100644 vllm_omni/diffusion/distributed/sp_plan.py delete mode 100644 vllm_omni/diffusion/distributed/sp_sharding.py delete mode 100644 vllm_omni/diffusion/distributed/utils.py delete mode 100644 vllm_omni/diffusion/distributed/vae_patch_parallel.py delete mode 100644 vllm_omni/diffusion/envs.py delete mode 100644 vllm_omni/diffusion/executor/__init__.py delete mode 100644 vllm_omni/diffusion/executor/abstract.py delete mode 100644 vllm_omni/diffusion/executor/multiproc_executor.py delete mode 100644 vllm_omni/diffusion/forward_context.py delete mode 100644 vllm_omni/diffusion/hooks/__init__.py delete mode 100644 vllm_omni/diffusion/hooks/base.py delete mode 100644 vllm_omni/diffusion/hooks/sequence_parallel.py delete mode 100644 vllm_omni/diffusion/inline_stage_diffusion_client.py delete mode 100644 vllm_omni/diffusion/ipc.py delete mode 100644 vllm_omni/diffusion/layers/__init__.py delete mode 100644 vllm_omni/diffusion/layers/adalayernorm.py delete mode 100644 vllm_omni/diffusion/layers/custom_op.py delete mode 100644 vllm_omni/diffusion/layers/norm.py delete mode 100644 vllm_omni/diffusion/layers/rope.py delete mode 100644 vllm_omni/diffusion/lora/__init__.py delete mode 100644 vllm_omni/diffusion/lora/layers/__init__.py delete mode 100644 vllm_omni/diffusion/lora/layers/base_linear.py delete mode 100644 vllm_omni/diffusion/lora/layers/column_parallel_linear.py delete mode 100644 vllm_omni/diffusion/lora/layers/replicated_linear.py delete mode 100644 vllm_omni/diffusion/lora/layers/row_parallel_linear.py delete mode 100644 vllm_omni/diffusion/lora/manager.py delete mode 100644 vllm_omni/diffusion/lora/utils.py delete mode 100644 vllm_omni/diffusion/model_loader/__init__.py delete mode 100644 vllm_omni/diffusion/model_loader/diffusers_loader.py delete mode 100644 vllm_omni/diffusion/model_loader/gguf_adapters/__init__.py delete mode 100644 vllm_omni/diffusion/model_loader/gguf_adapters/base.py delete mode 100644 vllm_omni/diffusion/model_loader/gguf_adapters/flux2_klein.py delete mode 100644 vllm_omni/diffusion/model_loader/gguf_adapters/qwen_image.py delete mode 100644 vllm_omni/diffusion/model_loader/gguf_adapters/z_image.py delete mode 100644 vllm_omni/diffusion/model_loader/hub_prefetch.py delete mode 100644 vllm_omni/diffusion/model_metadata.py delete mode 100644 vllm_omni/diffusion/models/__init__.py delete mode 100644 vllm_omni/diffusion/models/bagel/__init__.py delete mode 100644 vllm_omni/diffusion/models/bagel/autoencoder.py delete mode 100644 vllm_omni/diffusion/models/bagel/bagel_transformer.py delete mode 100644 vllm_omni/diffusion/models/bagel/pipeline_bagel.py delete mode 100644 vllm_omni/diffusion/models/cosyvoice3_audio/__init__.py delete mode 100644 vllm_omni/diffusion/models/cosyvoice3_audio/cosyvoice3_dit.py delete mode 100644 vllm_omni/diffusion/models/diffusers_adapter/__init__.py delete mode 100644 vllm_omni/diffusion/models/diffusers_adapter/pipeline_diffusers_adapter.py delete mode 100644 vllm_omni/diffusion/models/dmd2/__init__.py delete mode 100644 vllm_omni/diffusion/models/dmd2/mixin.py delete mode 100644 vllm_omni/diffusion/models/dreamid_omni/__init__.py delete mode 100644 vllm_omni/diffusion/models/dreamid_omni/fusion.py delete mode 100644 vllm_omni/diffusion/models/dreamid_omni/pipeline_dreamid_omni.py delete mode 100644 vllm_omni/diffusion/models/dreamid_omni/wan2_2.py delete mode 100644 vllm_omni/diffusion/models/flux/__init__.py delete mode 100644 vllm_omni/diffusion/models/flux/flux_pipeline_mixin.py delete mode 100644 vllm_omni/diffusion/models/flux/flux_transformer.py delete mode 100644 vllm_omni/diffusion/models/flux/pipeline_flux.py delete mode 100644 vllm_omni/diffusion/models/flux/pipeline_flux_kontext.py delete mode 100644 vllm_omni/diffusion/models/flux2/__init__.py delete mode 100644 vllm_omni/diffusion/models/flux2/flux2_transformer.py delete mode 100644 vllm_omni/diffusion/models/flux2/pipeline_flux2.py delete mode 100644 vllm_omni/diffusion/models/flux2_klein/__init__.py delete mode 100644 vllm_omni/diffusion/models/flux2_klein/flux2_klein_transformer.py delete mode 100644 vllm_omni/diffusion/models/flux2_klein/pipeline_flux2_klein.py delete mode 100644 vllm_omni/diffusion/models/glm_image/__init__.py delete mode 100644 vllm_omni/diffusion/models/glm_image/glm_image_transformer.py delete mode 100644 vllm_omni/diffusion/models/glm_image/pipeline_glm_image.py delete mode 100644 vllm_omni/diffusion/models/helios/__init__.py delete mode 100644 vllm_omni/diffusion/models/helios/helios_transformer.py delete mode 100644 vllm_omni/diffusion/models/helios/pipeline_helios.py delete mode 100644 vllm_omni/diffusion/models/helios/scheduling_helios.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/__init__.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/autoencoder.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/hunyuan_fused_moe.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_tokenizer.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/pipeline_hunyuan_image3.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_image3/system_prompt.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_video/__init__.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_video/hunyuan_video_15_transformer.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_video/pipeline_hunyuan_video_1_5.py delete mode 100644 vllm_omni/diffusion/models/hunyuan_video/pipeline_hunyuan_video_1_5_i2v.py delete mode 100644 vllm_omni/diffusion/models/interface.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/__init__.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/adapter_qwen3_vl.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/config.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/cosmos_ci_torch.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/model_cosmos.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/model_internvla_a1.py delete mode 100644 vllm_omni/diffusion/models/internvla_a1/pipeline_internvla_a1.py delete mode 100644 vllm_omni/diffusion/models/longcat_image/__init__.py delete mode 100644 vllm_omni/diffusion/models/longcat_image/longcat_image_transformer.py delete mode 100644 vllm_omni/diffusion/models/longcat_image/pipeline_longcat_image.py delete mode 100644 vllm_omni/diffusion/models/longcat_image/pipeline_longcat_image_edit.py delete mode 100644 vllm_omni/diffusion/models/ltx2/__init__.py delete mode 100644 vllm_omni/diffusion/models/ltx2/ltx2_transformer.py delete mode 100644 vllm_omni/diffusion/models/ltx2/pipeline_ltx2.py delete mode 100644 vllm_omni/diffusion/models/ltx2/pipeline_ltx2_3.py delete mode 100644 vllm_omni/diffusion/models/ltx2/pipeline_ltx2_3_image2video.py delete mode 100644 vllm_omni/diffusion/models/ltx2/pipeline_ltx2_image2video.py delete mode 100644 vllm_omni/diffusion/models/ltx2/pipeline_ltx2_latent_upsample.py delete mode 100644 vllm_omni/diffusion/models/magi_human/__init__.py delete mode 100644 vllm_omni/diffusion/models/magi_human/magi_human_dit.py delete mode 100644 vllm_omni/diffusion/models/magi_human/pipeline_magi_human.py delete mode 100644 vllm_omni/diffusion/models/mammoth_moda2/mammothmoda2_dit_model.py delete mode 100644 vllm_omni/diffusion/models/mammoth_moda2/pipeline_mammothmoda2_dit.py delete mode 100644 vllm_omni/diffusion/models/mammoth_moda2/rope_real.py delete mode 100644 vllm_omni/diffusion/models/mammoth_moda2/schedulers.py delete mode 100644 vllm_omni/diffusion/models/nextstep_1_1/__init__.py delete mode 100644 vllm_omni/diffusion/models/nextstep_1_1/modeling_flux_vae.py delete mode 100644 vllm_omni/diffusion/models/nextstep_1_1/modeling_nextstep.py delete mode 100644 vllm_omni/diffusion/models/nextstep_1_1/modeling_nextstep_heads.py delete mode 100644 vllm_omni/diffusion/models/nextstep_1_1/modeling_nextstep_llama.py delete mode 100644 vllm_omni/diffusion/models/nextstep_1_1/pipeline_nextstep_1_1.py delete mode 100644 vllm_omni/diffusion/models/omnigen2/__init__.py delete mode 100644 vllm_omni/diffusion/models/omnigen2/omnigen2_transformer.py delete mode 100644 vllm_omni/diffusion/models/omnigen2/pipeline_omnigen2.py delete mode 100644 vllm_omni/diffusion/models/omnivoice/__init__.py delete mode 100644 vllm_omni/diffusion/models/omnivoice/pipeline_omnivoice.py delete mode 100644 vllm_omni/diffusion/models/ovis_image/__init__.py delete mode 100644 vllm_omni/diffusion/models/ovis_image/ovis_image_transformer.py delete mode 100644 vllm_omni/diffusion/models/ovis_image/pipeline_ovis_image.py delete mode 100644 vllm_omni/diffusion/models/progress_bar.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/__init__.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/autoencoder_kl_qwenimage.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/cfg_parallel.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image_edit.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image_edit_plus.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image_layered.py delete mode 100644 vllm_omni/diffusion/models/qwen_image/qwen_image_transformer.py delete mode 100644 vllm_omni/diffusion/models/schedulers/__init__.py delete mode 100644 vllm_omni/diffusion/models/schedulers/base.py delete mode 100644 vllm_omni/diffusion/models/schedulers/scheduling_dmd2_euler.py delete mode 100644 vllm_omni/diffusion/models/schedulers/scheduling_flow_unipc_multistep.py delete mode 100644 vllm_omni/diffusion/models/sd3/__init__.py delete mode 100644 vllm_omni/diffusion/models/sd3/pipeline_sd3.py delete mode 100644 vllm_omni/diffusion/models/sd3/sd3_transformer.py delete mode 100644 vllm_omni/diffusion/models/stable_audio/__init__.py delete mode 100644 vllm_omni/diffusion/models/stable_audio/pipeline_stable_audio.py delete mode 100644 vllm_omni/diffusion/models/stable_audio/stable_audio_transformer.py delete mode 100644 vllm_omni/diffusion/models/t5_encoder/__init__.py delete mode 100644 vllm_omni/diffusion/models/t5_encoder/t5_encoder.py delete mode 100644 vllm_omni/diffusion/models/t5_encoder/t5_gemma_encoder.py delete mode 100644 vllm_omni/diffusion/models/utils.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/__init__.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/patch_diffusers.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2_i2v.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2_ti2v.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2_vace.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/scheduling_wan_euler.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py delete mode 100644 vllm_omni/diffusion/models/wan2_2/wan2_2_vace_transformer.py delete mode 100644 vllm_omni/diffusion/models/z_image/__init__.py delete mode 100644 vllm_omni/diffusion/models/z_image/pipeline_z_image.py delete mode 100644 vllm_omni/diffusion/models/z_image/z_image_transformer.py delete mode 100644 vllm_omni/diffusion/offloader/__init__.py delete mode 100644 vllm_omni/diffusion/offloader/base.py delete mode 100644 vllm_omni/diffusion/offloader/layerwise_backend.py delete mode 100644 vllm_omni/diffusion/offloader/module_collector.py delete mode 100644 vllm_omni/diffusion/offloader/sequential_backend.py delete mode 100644 vllm_omni/diffusion/postprocess/__init__.py delete mode 100644 vllm_omni/diffusion/postprocess/rife_interpolator.py delete mode 100644 vllm_omni/diffusion/profiler/__init__.py delete mode 100644 vllm_omni/diffusion/profiler/diffusion_pipeline_profiler.py delete mode 100644 vllm_omni/diffusion/registry.py delete mode 100644 vllm_omni/diffusion/request.py delete mode 100644 vllm_omni/diffusion/sched/__init__.py delete mode 100644 vllm_omni/diffusion/sched/base_scheduler.py delete mode 100644 vllm_omni/diffusion/sched/interface.py delete mode 100644 vllm_omni/diffusion/sched/request_scheduler.py delete mode 100644 vllm_omni/diffusion/sched/step_scheduler.py delete mode 100644 vllm_omni/diffusion/stage_diffusion_client.py delete mode 100644 vllm_omni/diffusion/stage_diffusion_proc.py delete mode 100644 vllm_omni/diffusion/utils/__init__.py delete mode 100644 vllm_omni/diffusion/utils/hf_utils.py delete mode 100644 vllm_omni/diffusion/utils/media_utils.py delete mode 100644 vllm_omni/diffusion/utils/network_utils.py delete mode 100644 vllm_omni/diffusion/utils/prompt_utils.py delete mode 100644 vllm_omni/diffusion/utils/size_utils.py delete mode 100644 vllm_omni/diffusion/utils/tf_utils.py delete mode 100644 vllm_omni/diffusion/worker/__init__.py delete mode 100644 vllm_omni/diffusion/worker/diffusion_model_runner.py delete mode 100644 vllm_omni/diffusion/worker/diffusion_worker.py delete mode 100644 vllm_omni/diffusion/worker/utils.py delete mode 100644 vllm_omni/distributed/__init__.py delete mode 100644 vllm_omni/distributed/kv_transfer/__init__.py delete mode 100644 vllm_omni/distributed/kv_transfer/monkey_patch.py delete mode 100644 vllm_omni/distributed/omni_connectors/__init__.py delete mode 100644 vllm_omni/distributed/omni_connectors/adapter.py delete mode 100644 vllm_omni/distributed/omni_connectors/connectors/__init__.py delete mode 100644 vllm_omni/distributed/omni_connectors/connectors/base.py delete mode 100644 vllm_omni/distributed/omni_connectors/connectors/mooncake_store_connector.py delete mode 100644 vllm_omni/distributed/omni_connectors/connectors/mooncake_transfer_engine_connector.py delete mode 100644 vllm_omni/distributed/omni_connectors/connectors/shm_connector.py delete mode 100644 vllm_omni/distributed/omni_connectors/connectors/yuanrong_connector.py delete mode 100644 vllm_omni/distributed/omni_connectors/factory.py delete mode 100644 vllm_omni/distributed/omni_connectors/kv_transfer_manager.py delete mode 100644 vllm_omni/distributed/omni_connectors/transfer_adapter/__init__.py delete mode 100644 vllm_omni/distributed/omni_connectors/transfer_adapter/base.py delete mode 100644 vllm_omni/distributed/omni_connectors/transfer_adapter/chunk_transfer_adapter.py delete mode 100644 vllm_omni/distributed/omni_connectors/utils/__init__.py delete mode 100644 vllm_omni/distributed/omni_connectors/utils/config.py delete mode 100644 vllm_omni/distributed/omni_connectors/utils/initialization.py delete mode 100644 vllm_omni/distributed/omni_connectors/utils/kv_utils.py delete mode 100644 vllm_omni/distributed/omni_connectors/utils/logging.py delete mode 100644 vllm_omni/distributed/omni_connectors/utils/serialization.py delete mode 100644 vllm_omni/distributed/omni_coordinator/__init__.py delete mode 100644 vllm_omni/distributed/omni_coordinator/load_balancer.py delete mode 100644 vllm_omni/distributed/omni_coordinator/messages.py delete mode 100644 vllm_omni/distributed/omni_coordinator/omni_coord_client_for_hub.py delete mode 100644 vllm_omni/distributed/omni_coordinator/omni_coord_client_for_stage.py delete mode 100644 vllm_omni/distributed/omni_coordinator/omni_coordinator.py delete mode 100644 vllm_omni/distributed/ray_utils/__init__.py delete mode 100644 vllm_omni/distributed/ray_utils/utils.py delete mode 100644 vllm_omni/engine/__init__.py delete mode 100644 vllm_omni/engine/arg_utils.py delete mode 100644 vllm_omni/engine/async_omni_engine.py delete mode 100644 vllm_omni/engine/cfg_companion_tracker.py delete mode 100644 vllm_omni/engine/mm_outputs.py delete mode 100644 vllm_omni/engine/orchestrator.py delete mode 100644 vllm_omni/engine/output_modality.py delete mode 100644 vllm_omni/engine/output_processor.py delete mode 100644 vllm_omni/engine/serialization.py delete mode 100644 vllm_omni/engine/stage_engine_core_client.py delete mode 100644 vllm_omni/engine/stage_engine_core_proc.py delete mode 100644 vllm_omni/engine/stage_engine_startup.py delete mode 100644 vllm_omni/engine/stage_init_utils.py delete mode 100644 vllm_omni/entrypoints/__init__.py delete mode 100644 vllm_omni/entrypoints/async_omni.py delete mode 100644 vllm_omni/entrypoints/chat_utils.py delete mode 100644 vllm_omni/entrypoints/cli/__init__.py delete mode 100644 vllm_omni/entrypoints/cli/benchmark/__init__.py delete mode 100644 vllm_omni/entrypoints/cli/benchmark/base.py delete mode 100644 vllm_omni/entrypoints/cli/benchmark/main.py delete mode 100644 vllm_omni/entrypoints/cli/benchmark/serve.py delete mode 100644 vllm_omni/entrypoints/cli/logo.py delete mode 100644 vllm_omni/entrypoints/cli/main.py delete mode 100644 vllm_omni/entrypoints/cli/serve.py delete mode 100644 vllm_omni/entrypoints/client_request_state.py delete mode 100644 vllm_omni/entrypoints/omni.py delete mode 100644 vllm_omni/entrypoints/omni_base.py delete mode 100644 vllm_omni/entrypoints/openai/__init__.py delete mode 100644 vllm_omni/entrypoints/openai/api_server.py delete mode 100644 vllm_omni/entrypoints/openai/audio_utils_mixin.py delete mode 100644 vllm_omni/entrypoints/openai/errors.py delete mode 100644 vllm_omni/entrypoints/openai/image_api_utils.py delete mode 100644 vllm_omni/entrypoints/openai/protocol/__init__.py delete mode 100644 vllm_omni/entrypoints/openai/protocol/audio.py delete mode 100644 vllm_omni/entrypoints/openai/protocol/chat_completion.py delete mode 100644 vllm_omni/entrypoints/openai/protocol/images.py delete mode 100644 vllm_omni/entrypoints/openai/protocol/videos.py delete mode 100644 vllm_omni/entrypoints/openai/realtime_connection.py delete mode 100644 vllm_omni/entrypoints/openai/serving_audio_generate.py delete mode 100644 vllm_omni/entrypoints/openai/serving_chat.py delete mode 100644 vllm_omni/entrypoints/openai/serving_speech.py delete mode 100644 vllm_omni/entrypoints/openai/serving_speech_stream.py delete mode 100644 vllm_omni/entrypoints/openai/serving_video.py delete mode 100644 vllm_omni/entrypoints/openai/serving_video_stream.py delete mode 100644 vllm_omni/entrypoints/openai/stage_params.py delete mode 100644 vllm_omni/entrypoints/openai/storage.py delete mode 100644 vllm_omni/entrypoints/openai/stores.py delete mode 100644 vllm_omni/entrypoints/openai/text_splitter.py delete mode 100644 vllm_omni/entrypoints/openai/utils.py delete mode 100644 vllm_omni/entrypoints/openai/video_api_utils.py delete mode 100644 vllm_omni/entrypoints/openai/video_frame_filter.py delete mode 100644 vllm_omni/entrypoints/openai/video_stream_context.py delete mode 100644 vllm_omni/entrypoints/openai/video_stream_envs.py delete mode 100644 vllm_omni/entrypoints/openai/video_stream_session.py delete mode 100644 vllm_omni/entrypoints/pd_utils.py delete mode 100644 vllm_omni/entrypoints/stage_utils.py delete mode 100644 vllm_omni/entrypoints/utils.py delete mode 100644 vllm_omni/inputs/__init__.py delete mode 100644 vllm_omni/inputs/data.py delete mode 100644 vllm_omni/inputs/preprocess.py delete mode 100644 vllm_omni/logger.py delete mode 100644 vllm_omni/lora/__init__.py delete mode 100644 vllm_omni/lora/request.py delete mode 100644 vllm_omni/lora/utils.py delete mode 100644 vllm_omni/metrics/__init__.py delete mode 100644 vllm_omni/metrics/stats.py delete mode 100644 vllm_omni/metrics/utils.py delete mode 100644 vllm_omni/model_executor/__init__.py delete mode 100644 vllm_omni/model_executor/custom_process_mixin.py delete mode 100644 vllm_omni/model_executor/layers/__init__.py delete mode 100644 vllm_omni/model_executor/layers/rotary_embedding/__init__.py delete mode 100644 vllm_omni/model_executor/layers/rotary_embedding/mrope.py delete mode 100644 vllm_omni/model_executor/model_loader/__init__.py delete mode 100644 vllm_omni/model_executor/model_loader/weight_utils.py delete mode 100644 vllm_omni/model_executor/models/__init__.py delete mode 100644 vllm_omni/model_executor/models/bagel/__init__.py delete mode 100644 vllm_omni/model_executor/models/bagel/bagel.py delete mode 100644 vllm_omni/model_executor/models/bagel/pipeline.py delete mode 100644 vllm_omni/model_executor/models/common/__init__.py delete mode 100644 vllm_omni/model_executor/models/common/qwen3_code_predictor.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/__init__.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/code2wav_core/__init__.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/code2wav_core/cfm.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/code2wav_core/hifigan.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/code2wav_core/layers.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/config.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/cosyvoice3.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/cosyvoice3_code2wav.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/cosyvoice3_talker.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/pipeline.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/tokenizer.py delete mode 100644 vllm_omni/model_executor/models/cosyvoice3/utils.py delete mode 100644 vllm_omni/model_executor/models/dynin_omni/__init__.py delete mode 100644 vllm_omni/model_executor/models/dynin_omni/dynin_omni.py delete mode 100644 vllm_omni/model_executor/models/dynin_omni/dynin_omni_common.py delete mode 100644 vllm_omni/model_executor/models/dynin_omni/dynin_omni_token2audio.py delete mode 100644 vllm_omni/model_executor/models/dynin_omni/dynin_omni_token2image.py delete mode 100644 vllm_omni/model_executor/models/dynin_omni/dynin_omni_token2text.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/__init__.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/configuration_fish_speech.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/dac_encoder.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/dac_utils.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/fish_speech_dac_decoder.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/fish_speech_fast_ar.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/fish_speech_slow_ar.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/pipeline.py delete mode 100644 vllm_omni/model_executor/models/fish_speech/prompt_utils.py delete mode 100644 vllm_omni/model_executor/models/glm_image/__init__.py delete mode 100644 vllm_omni/model_executor/models/glm_image/glm_image_ar.py delete mode 100644 vllm_omni/model_executor/models/glm_image/pipeline.py delete mode 100644 vllm_omni/model_executor/models/hunyuan_image3/__init__.py delete mode 100644 vllm_omni/model_executor/models/hunyuan_image3/autoencoder_kl_3d.py delete mode 100644 vllm_omni/model_executor/models/hunyuan_image3/hunyuan_image3.py delete mode 100644 vllm_omni/model_executor/models/hunyuan_image3/siglip2.py delete mode 100644 vllm_omni/model_executor/models/mammoth_moda2/__init__.py delete mode 100644 vllm_omni/model_executor/models/mammoth_moda2/mammoth_moda2.py delete mode 100644 vllm_omni/model_executor/models/mammoth_moda2/pipeline_mammothmoda2_dit.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/__init__.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/config_mimo_audio.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/mimo_audio.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/mimo_audio_code2wav.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/mimo_audio_llm.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/modeling_audio_tokenizer.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/modeling_rope_utils.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/pipeline.py delete mode 100644 vllm_omni/model_executor/models/mimo_audio/quantization.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/__init__.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/audio_encoder.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/audio_vae.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/ming_flash_omni.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/ming_flash_omni_talker.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/ming_flash_omni_thinker.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/modeling_bailing_moe_v2.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/projectors.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/prompt_utils.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/spk_embedding.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/talker_module.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/text_processing.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/vision_encoder.py delete mode 100644 vllm_omni/model_executor/models/ming_flash_omni/voice_presets.py delete mode 100644 vllm_omni/model_executor/models/moss_tts_nano/__init__.py delete mode 100644 vllm_omni/model_executor/models/moss_tts_nano/configuration_moss_tts_nano.py delete mode 100644 vllm_omni/model_executor/models/moss_tts_nano/modeling_moss_tts_nano.py delete mode 100644 vllm_omni/model_executor/models/moss_tts_nano/pipeline.py delete mode 100644 vllm_omni/model_executor/models/omnivoice/__init__.py delete mode 100644 vllm_omni/model_executor/models/omnivoice/config.py delete mode 100644 vllm_omni/model_executor/models/omnivoice/duration.py delete mode 100644 vllm_omni/model_executor/models/omnivoice/omnivoice.py delete mode 100644 vllm_omni/model_executor/models/omnivoice/omnivoice_decoder.py delete mode 100644 vllm_omni/model_executor/models/omnivoice/omnivoice_generator.py delete mode 100644 vllm_omni/model_executor/models/output_templates.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/__init__.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/audio_length.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni_talker.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni_thinker.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni_token2wav.py delete mode 100644 vllm_omni/model_executor/models/qwen2_5_omni/qwen2_old.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/__init__.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/pipeline.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/qwen3_moe.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/qwen3_omni.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_code2wav.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_moe_code_predictor_mtp.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_moe_talker.py delete mode 100644 vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_moe_thinker.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/__init__.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/cuda_graph_decoder_wrapper.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/pipeline.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_code2wav.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_code_predictor_vllm.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_talker.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_tokenizer.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_12hz/__init__.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_12hz/configuration_qwen3_tts_tokenizer_v2.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_12hz/modeling_qwen3_tts_tokenizer_v2.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/__init__.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/configuration_qwen3_tts_tokenizer_v1.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/modeling_qwen3_tts_tokenizer_v1.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/vq/__init__.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/vq/core_vq.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/vq/speech_vq.py delete mode 100644 vllm_omni/model_executor/models/qwen3_tts/tokenizer_25hz/vq/whisper_encoder.py delete mode 100644 vllm_omni/model_executor/models/registry.py delete mode 100644 vllm_omni/model_executor/models/utils.py delete mode 100644 vllm_omni/model_executor/models/voxcpm/__init__.py delete mode 100644 vllm_omni/model_executor/models/voxcpm/configuration_voxcpm.py delete mode 100644 vllm_omni/model_executor/models/voxcpm/voxcpm.py delete mode 100644 vllm_omni/model_executor/models/voxcpm/voxcpm_loader.py delete mode 100644 vllm_omni/model_executor/models/voxcpm/voxcpm_runtime_utils.py delete mode 100644 vllm_omni/model_executor/models/voxcpm/voxcpm_stage_wrappers.py delete mode 100644 vllm_omni/model_executor/models/voxcpm2/__init__.py delete mode 100644 vllm_omni/model_executor/models/voxcpm2/minicpm4_hf_compat.py delete mode 100644 vllm_omni/model_executor/models/voxcpm2/minicpm4_paged.py delete mode 100644 vllm_omni/model_executor/models/voxcpm2/pipeline.py delete mode 100644 vllm_omni/model_executor/models/voxcpm2/voxcpm2_import_utils.py delete mode 100644 vllm_omni/model_executor/models/voxcpm2/voxcpm2_talker.py delete mode 100644 vllm_omni/model_executor/models/voxtral_tts/__init__.py delete mode 100644 vllm_omni/model_executor/models/voxtral_tts/cuda_graph_acoustic_transformer_wrapper.py delete mode 100644 vllm_omni/model_executor/models/voxtral_tts/pipeline.py delete mode 100644 vllm_omni/model_executor/models/voxtral_tts/voxtral_tts.py delete mode 100644 vllm_omni/model_executor/models/voxtral_tts/voxtral_tts_audio_generation.py delete mode 100644 vllm_omni/model_executor/models/voxtral_tts/voxtral_tts_audio_tokenizer.py delete mode 100644 vllm_omni/model_executor/models/whisper_utils.py delete mode 100644 vllm_omni/model_executor/stage_configs/__init__.py delete mode 100644 vllm_omni/model_executor/stage_configs/bailingmm_moe_v2_lite.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/dynin_omni.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/dynin_omni_multiconnector.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_i2t.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_it2i.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_moe.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_moe_dit_2gpu_fp8.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_t2i.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_t2i_2gpu.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/hunyuan_image3_t2t.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/mammoth_moda2.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/mammoth_moda2_ar.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/ming_flash_omni.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/ming_flash_omni_tts.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/omnivoice.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/qwen3_tts_uniproc.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/voxcpm.yaml delete mode 100644 vllm_omni/model_executor/stage_configs/voxcpm_async_chunk.yaml delete mode 100644 vllm_omni/model_executor/stage_input_processors/__init__.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/bagel.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/chunk_size_utils.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/cosyvoice3.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/dynin_omni.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/fish_speech.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/glm_image.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/hunyuan_image3.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/mammoth_moda2.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/mimo_audio.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/ming_flash_omni.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/omnivoice.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/qwen2_5_omni.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/qwen3_omni.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/qwen3_tts.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/tts_utils.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/voxcpm.py delete mode 100644 vllm_omni/model_executor/stage_input_processors/voxtral_tts.py delete mode 100644 vllm_omni/outputs.py delete mode 100644 vllm_omni/patch.py delete mode 100644 vllm_omni/platforms/__init__.py delete mode 100644 vllm_omni/platforms/cuda/__init__.py delete mode 100644 vllm_omni/platforms/cuda/platform.py delete mode 100644 vllm_omni/platforms/interface.py delete mode 100644 vllm_omni/platforms/musa/__init__.py delete mode 100644 vllm_omni/platforms/musa/platform.py delete mode 100644 vllm_omni/platforms/npu/__init__.py delete mode 100644 vllm_omni/platforms/npu/models/__init__.py delete mode 100644 vllm_omni/platforms/npu/models/hunyuan_fused_moe.py delete mode 100644 vllm_omni/platforms/npu/platform.py delete mode 100644 vllm_omni/platforms/npu/profiler.py delete mode 100644 vllm_omni/platforms/npu/stage_configs/hunyuan_image3_t2i.yaml delete mode 100644 vllm_omni/platforms/npu/stage_configs/voxcpm.yaml delete mode 100644 vllm_omni/platforms/npu/stage_configs/voxcpm_async_chunk.yaml delete mode 100644 vllm_omni/platforms/npu/worker/__init__.py delete mode 100644 vllm_omni/platforms/npu/worker/base.py delete mode 100644 vllm_omni/platforms/npu/worker/npu_ar_model_runner.py delete mode 100644 vllm_omni/platforms/npu/worker/npu_ar_worker.py delete mode 100644 vllm_omni/platforms/npu/worker/npu_generation_model_runner.py delete mode 100644 vllm_omni/platforms/npu/worker/npu_generation_worker.py delete mode 100644 vllm_omni/platforms/npu/worker/npu_model_runner.py delete mode 100644 vllm_omni/platforms/rocm/__init__.py delete mode 100644 vllm_omni/platforms/rocm/platform.py delete mode 100644 vllm_omni/platforms/xpu/__init__.py delete mode 100644 vllm_omni/platforms/xpu/platform.py delete mode 100644 vllm_omni/platforms/xpu/stage_configs/hunyuan_image3_t2i.yaml delete mode 100644 vllm_omni/platforms/xpu/stage_configs/voxtral_tts.yaml delete mode 100644 vllm_omni/platforms/xpu/utils.py delete mode 100644 vllm_omni/platforms/xpu/worker/__init__.py delete mode 100644 vllm_omni/platforms/xpu/worker/xpu_ar_model_runner.py delete mode 100644 vllm_omni/platforms/xpu/worker/xpu_ar_worker.py delete mode 100644 vllm_omni/platforms/xpu/worker/xpu_generation_model_runner.py delete mode 100644 vllm_omni/platforms/xpu/worker/xpu_generation_worker.py delete mode 100644 vllm_omni/plugins/__init__.py delete mode 100644 vllm_omni/profiler/__init__.py delete mode 100644 vllm_omni/profiler/omni_torch_profiler.py delete mode 100644 vllm_omni/quantization/__init__.py delete mode 100644 vllm_omni/quantization/component_config.py delete mode 100644 vllm_omni/quantization/factory.py delete mode 100644 vllm_omni/quantization/gguf_config.py delete mode 100644 vllm_omni/quantization/inc_config.py delete mode 100644 vllm_omni/quantization/int8_config.py delete mode 100644 vllm_omni/request.py delete mode 100644 vllm_omni/sample/__init__.py delete mode 100644 vllm_omni/tokenizers/__init__.py delete mode 100644 vllm_omni/tokenizers/mammoth_moda2_tokenizer.py delete mode 100644 vllm_omni/transformers_utils/__init__.py delete mode 100644 vllm_omni/transformers_utils/configs/__init__.py delete mode 100644 vllm_omni/transformers_utils/configs/fish_speech.py delete mode 100644 vllm_omni/transformers_utils/configs/mammoth_moda2.py delete mode 100644 vllm_omni/transformers_utils/configs/ming_flash_omni.py delete mode 100644 vllm_omni/transformers_utils/configs/voxcpm.py delete mode 100644 vllm_omni/transformers_utils/configs/voxcpm2.py delete mode 100644 vllm_omni/transformers_utils/configs/voxtral_tts.py delete mode 100644 vllm_omni/transformers_utils/parsers/__init__.py delete mode 100644 vllm_omni/transformers_utils/parsers/voxtral_tts.py delete mode 100644 vllm_omni/transformers_utils/processors/__init__.py delete mode 100644 vllm_omni/transformers_utils/processors/ming.py delete mode 100644 vllm_omni/utils/__init__.py delete mode 100644 vllm_omni/utils/audio.py delete mode 100644 vllm_omni/utils/mm_outputs.py delete mode 100644 vllm_omni/utils/voice_cache.py delete mode 100644 vllm_omni/version.py delete mode 100644 vllm_omni/worker/__init__.py delete mode 100644 vllm_omni/worker/base.py delete mode 100644 vllm_omni/worker/gpu_ar_model_runner.py delete mode 100644 vllm_omni/worker/gpu_ar_worker.py delete mode 100644 vllm_omni/worker/gpu_generation_model_runner.py delete mode 100644 vllm_omni/worker/gpu_generation_worker.py delete mode 100644 vllm_omni/worker/gpu_memory_utils.py delete mode 100644 vllm_omni/worker/gpu_model_runner.py delete mode 100644 vllm_omni/worker/mixins.py delete mode 100644 vllm_omni/worker/omni_connector_model_runner_mixin.py delete mode 100644 vllm_omni/worker/payload_span.py diff --git a/.buildkite/bootstrap-amd-omni.sh b/.buildkite/bootstrap-amd-omni.sh deleted file mode 100755 index 9e7021493c5..00000000000 --- a/.buildkite/bootstrap-amd-omni.sh +++ /dev/null @@ -1,246 +0,0 @@ -#!/bin/bash -# vllm-omni customized version -# Based on: https://github.com/vllm-project/ci-infra/blob/main/buildkite/bootstrap-amd.sh -# Last synced: 2025-12-15 -# Modifications: Use local template file instead of downloading from ci-infra - -set -euo pipefail - -if [[ -z "${RUN_ALL:-}" ]]; then - RUN_ALL=0 -fi - -if [[ -z "${NIGHTLY:-}" ]]; then - NIGHTLY=0 -fi - -if [[ -z "${VLLM_CI_BRANCH:-}" ]]; then - VLLM_CI_BRANCH="main" -fi - -if [[ -z "${AMD_MIRROR_HW:-}" ]]; then - AMD_MIRROR_HW="amdproduction" -fi - -if [[ -z "${DOCS_ONLY_DISABLE:-}" ]]; then - DOCS_ONLY_DISABLE=0 -fi - -fail_fast() { - DISABLE_LABEL="ci-no-fail-fast" - # If BUILDKITE_PULL_REQUEST != "false", then we check the PR labels using curl and jq - if [ "$BUILDKITE_PULL_REQUEST" != "false" ]; then - PR_LABELS=$(curl -s "https://api.github.com/repos/vllm-project/vllm-omni/pulls/$BUILDKITE_PULL_REQUEST" | jq -r '.labels[].name') - if [[ $PR_LABELS == *"$DISABLE_LABEL"* ]]; then - echo false - else - echo true - fi - else - echo false # not a PR or BUILDKITE_PULL_REQUEST not set - fi -} - -check_run_all_label() { - RUN_ALL_LABEL="ready-run-all-tests" - # If BUILDKITE_PULL_REQUEST != "false", then we check the PR labels using curl and jq - if [ "$BUILDKITE_PULL_REQUEST" != "false" ]; then - PR_LABELS=$(curl -s "https://api.github.com/repos/vllm-project/vllm-omni/pulls/$BUILDKITE_PULL_REQUEST" | jq -r '.labels[].name') - if [[ $PR_LABELS == *"$RUN_ALL_LABEL"* ]]; then - echo true - else - echo false - fi - else - echo false # not a PR or BUILDKITE_PULL_REQUEST not set - fi -} - -if [[ -z "${COV_ENABLED:-}" ]]; then - COV_ENABLED=0 -fi - -upload_pipeline() { - echo "Uploading pipeline..." - # Install minijinja - ls .buildkite || buildkite-agent annotate --style error 'Please merge upstream main branch for buildkite CI' - curl -sSfL https://github.com/mitsuhiko/minijinja/releases/download/2.3.1/minijinja-cli-installer.sh | sh - source /var/lib/buildkite-agent/.cargo/env - - if [[ $BUILDKITE_PIPELINE_SLUG == "fastcheck" ]]; then - AMD_MIRROR_HW="amdtentative" - fi - - # Use local template file for vllm-omni - cp .buildkite/test-template-amd-omni.j2 .buildkite/test-template.j2 - - - # (WIP) Use pipeline generator instead of jinja template - if [ -e ".buildkite/pipeline_generator/pipeline_generator.py" ]; then - python -m pip install click pydantic - python .buildkite/pipeline_generator/pipeline_generator.py --run_all=$RUN_ALL --list_file_diff="$LIST_FILE_DIFF" --nightly="$NIGHTLY" --mirror_hw="$AMD_MIRROR_HW" - buildkite-agent pipeline upload .buildkite/pipeline.yaml - exit 0 - fi - echo "List file diff: $LIST_FILE_DIFF" - echo "Run all: $RUN_ALL" - echo "Nightly: $NIGHTLY" - echo "AMD Mirror HW: $AMD_MIRROR_HW" - - FAIL_FAST=$(fail_fast) - - cd .buildkite - - # Select test definition file: merge suite for main, ready suite for PRs - if [[ $BUILDKITE_BRANCH == "main" ]]; then - TEST_YAML="test-amd-merge.yml" - else - TEST_YAML="test-amd-ready.yaml" - fi - - ( - set -x - # Output pipeline.yaml with all blank lines removed - minijinja-cli test-template.j2 "$TEST_YAML" \ - -D branch="$BUILDKITE_BRANCH" \ - -D list_file_diff="$LIST_FILE_DIFF" \ - -D run_all="$RUN_ALL" \ - -D nightly="$NIGHTLY" \ - -D mirror_hw="$AMD_MIRROR_HW" \ - -D fail_fast="$FAIL_FAST" \ - -D vllm_use_precompiled="$VLLM_USE_PRECOMPILED" \ - -D vllm_merge_base_commit="$(git merge-base origin/main HEAD)" \ - -D cov_enabled="$COV_ENABLED" \ - -D vllm_ci_branch="$VLLM_CI_BRANCH" \ - | sed '/^[[:space:]]*$/d' \ - > pipeline.yaml - ) - cat pipeline.yaml - buildkite-agent artifact upload pipeline.yaml - buildkite-agent pipeline upload pipeline.yaml - exit 0 -} - -get_diff() { - $(git add .) - echo $(git diff --name-only --diff-filter=ACMDR $(git merge-base origin/main HEAD)) -} - -get_diff_main() { - $(git add .) - echo $(git diff --name-only --diff-filter=ACMDR HEAD~1) -} - -file_diff=$(get_diff) -if [[ $BUILDKITE_BRANCH == "main" ]]; then - file_diff=$(get_diff_main) -fi - -# ---------------------------------------------------------------------- -# Early exit start: skip pipeline if conditions are met -# ---------------------------------------------------------------------- - -# skip pipeline if all changed files are under docs/ -if [[ "${DOCS_ONLY_DISABLE}" != "1" ]]; then - if [[ -n "${file_diff:-}" ]]; then - docs_only=1 - # Robust iteration over newline-separated file_diff - while IFS= read -r f; do - [[ -z "$f" ]] && continue - # **Policy:** only skip if *every* path starts with docs/ - if [[ "$f" != docs/* ]]; then - docs_only=0 - break - fi - done < <(printf '%s\n' "$file_diff" | tr ' ' '\n' | tr -d '\r') - - if [[ "$docs_only" -eq 1 ]]; then - buildkite-agent annotate ":memo: CI skipped — docs/** only changes detected - -\`\`\` -${file_diff} -\`\`\`" --style "info" || true - echo "[docs-only] All changes are under docs/. Exiting before pipeline upload." - exit 0 - fi - fi -fi - -# ---------------------------------------------------------------------- -# Early exit end -# ---------------------------------------------------------------------- - -patterns=( - "docker/Dockerfile" - "CMakeLists.txt" - "requirements/common.txt" - "requirements/cuda.txt" - "requirements/build.txt" - "requirements/test.txt" - "setup.py" - "csrc/" - "cmake/" -) - -ignore_patterns=( - "docker/Dockerfile." - "csrc/cpu" - "csrc/rocm" - "cmake/hipify.py" - "cmake/cpu_extension.cmake" -) - -for file in $file_diff; do - # First check if file matches any pattern - matches_pattern=0 - for pattern in "${patterns[@]}"; do - if [[ $file == $pattern* ]] || [[ $file == $pattern ]]; then - matches_pattern=1 - break - fi - done - - # If file matches pattern, check it's not in ignore patterns - if [[ $matches_pattern -eq 1 ]]; then - matches_ignore=0 - for ignore in "${ignore_patterns[@]}"; do - if [[ $file == $ignore* ]] || [[ $file == $ignore ]]; then - matches_ignore=1 - break - fi - done - - if [[ $matches_ignore -eq 0 ]]; then - RUN_ALL=1 - echo "Found changes: $file. Run all tests" - break - fi - fi -done - -# Check for ready-run-all-tests label -LABEL_RUN_ALL=$(check_run_all_label) -if [[ $LABEL_RUN_ALL == true ]]; then - RUN_ALL=1 - NIGHTLY=1 - echo "Found 'ready-run-all-tests' label. Running all tests including optional tests." -fi - -# Decide whether to use precompiled wheels -# Relies on existing patterns array as a basis. -if [[ -n "${VLLM_USE_PRECOMPILED:-}" ]]; then - echo "VLLM_USE_PRECOMPILED is already set to: $VLLM_USE_PRECOMPILED" -elif [[ $RUN_ALL -eq 1 ]]; then - export VLLM_USE_PRECOMPILED=0 - echo "Detected critical changes, building wheels from source" -else - export VLLM_USE_PRECOMPILED=1 - echo "No critical changes, using precompiled wheels" -fi - - -LIST_FILE_DIFF=$(get_diff | tr ' ' '|') -if [[ $BUILDKITE_BRANCH == "main" ]]; then - LIST_FILE_DIFF=$(get_diff_main | tr ' ' '|') -fi -upload_pipeline diff --git a/.buildkite/bootstrap-intel-omni.sh b/.buildkite/bootstrap-intel-omni.sh deleted file mode 100755 index b99568141b2..00000000000 --- a/.buildkite/bootstrap-intel-omni.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# vllm-omni Intel bootstrap -# Uses static pipeline-intel.yaml for Intel XPU tests -# Based on: bootstrap-amd-omni.sh - -set -euo pipefail - -if [[ -z "${DOCS_ONLY_DISABLE:-}" ]]; then - DOCS_ONLY_DISABLE=0 -fi - -upload_pipeline() { - echo "--- 🛠 Preparing Intel pipeline" - buildkite-agent pipeline upload .buildkite/pipeline-intel.yaml -} - -get_diff() { - $(git add .) - echo $(git diff --name-only --diff-filter=ACMDR $(git merge-base origin/main HEAD)) -} - -get_diff_main() { - $(git add .) - echo $(git diff --name-only --diff-filter=ACMDR HEAD~1) -} - -file_diff=$(get_diff) -if [[ $BUILDKITE_BRANCH == "main" ]]; then - file_diff=$(get_diff_main) -fi - -# ---------------------------------------------------------------------- -# Early exit: skip pipeline if all changed files are under docs/ -# ---------------------------------------------------------------------- -if [[ "${DOCS_ONLY_DISABLE}" != "1" ]] && [[ -n "${file_diff:-}" ]]; then - docs_only=1 - while IFS= read -r f; do - [[ -z "$f" ]] && continue - if [[ "$f" != docs/* ]]; then - docs_only=0 - break - fi - done < <(printf '%s\n' "$file_diff" | tr ' ' '\n' | tr -d '\r') - - if [[ "$docs_only" -eq 1 ]]; then - buildkite-agent annotate ":memo: CI skipped — docs only" --style "info" - exit 0 - fi -fi - -upload_pipeline diff --git a/.buildkite/nightly-release-pipeline.yaml b/.buildkite/nightly-release-pipeline.yaml deleted file mode 100644 index 25c52ba3b45..00000000000 --- a/.buildkite/nightly-release-pipeline.yaml +++ /dev/null @@ -1,20 +0,0 @@ -steps: - - label: "Build and upload wheel" - key: "build-wheel" - agents: - queue: cpu_queue_release - commands: - - "curl -LsSf https://astral.sh/uv/install.sh | sh" - - 'export PATH="$HOME/.local/bin:$PATH"' - - "uv venv --python=3.12 && source .venv/bin/activate" - - "uv pip install --upgrade build" - - "python3 -m build" - - "bash .buildkite/scripts/upload-nightly-wheels.sh" - - - label: "Generate and upload wheel indices" - depends_on: "build-wheel" - allow_dependency_failure: true - agents: - queue: small_cpu_queue_release - commands: - - "bash .buildkite/scripts/generate-and-upload-nightly-index.sh" diff --git a/.buildkite/pipeline-intel.yaml b/.buildkite/pipeline-intel.yaml deleted file mode 100644 index 3f14fd263bc..00000000000 --- a/.buildkite/pipeline-intel.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# .buildkite/pipeline-intel.yaml -steps: - - group: "INTEL Tests" - steps: - - label: "Intel: XPU Test" - command: "bash .buildkite/scripts/hardware_ci/run-xpu-test.sh" - agents: - queue: "intel-gpu-omni" - env: - DOCKER_BUILDKIT: "1" - # Buildkite will automatically replace this with the actual commit hash - VLLM_IMAGE_TAG: "${BUILDKITE_COMMIT}" - VLLM_VERSION: "v0.20.0" - priority: 100 - timeout_in_minutes: 60 - soft_fail: true diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml deleted file mode 100644 index 96aa9e8ba81..00000000000 --- a/.buildkite/pipeline.yml +++ /dev/null @@ -1,76 +0,0 @@ -# Document 1: Buildkite loads only this block on first parse. The next step resolves docs-only skip-ci -# from git diff, then uploads document 2. When docs-only skip applies, image-build still runs for the nightly -# exception in upload_pipeline_with_skip_ci.sh (nightly-test label or main NIGHTLY=1); otherwise upload-nightly -# can be skipped together with test-ready/test-merge. Weekly uploads also depend on image-build. - -# Document 2: appended after `---`; same file, read by upload_pipeline_with_skip_ci.sh (not evaluated as a second pipeline by Buildkite). Child uploads include test-ready.yml, test-merge.yml, test-nightly.yml, and test-weekly.yml. -steps: - - label: ":github: Resolve skip-ci & upload pipeline" - key: upload-ci-pipeline - commands: - - "bash .buildkite/scripts/upload_pipeline_with_skip_ci.sh" - agents: - queue: "cpu_queue_premerge" - ---- -steps: - - label: ":docker: Build image" - key: image-build - if: __IMAGE_BUILD_IF__ - commands: - - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "docker build --progress=plain --file docker/Dockerfile.ci -t vllm-omni-ci ." - - "docker tag vllm-omni-ci public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT" - - "docker push public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT" - agents: - queue: "cpu_queue_premerge" - - # L2 Test - - label: "Upload Ready Pipeline" - depends_on: image-build - key: upload-ready-pipeline - if: __UPLOAD_READY_IF__ - commands: - - buildkite-agent pipeline upload .buildkite/test-ready.yml - agents: - queue: "cpu_queue_premerge" - - # L3 Test - - label: "Upload Merge Pipeline" - depends_on: image-build - key: upload-merge-pipeline - if: __UPLOAD_MERGE_IF__ - commands: - - buildkite-agent pipeline upload .buildkite/test-merge.yml - agents: - queue: "cpu_queue_premerge" - - # L4 Test — main+NIGHTLY=1 (scheduled), or PR with specific label (e.g. add label then Rebuild) - - label: "Upload Nightly Pipeline" - depends_on: image-build - key: upload-nightly-pipeline - if: >- - (build.branch == "main" && build.env("NIGHTLY") == "1") || - (build.branch != "main" && ( - build.pull_request.labels includes "nightly-test" || - build.pull_request.labels includes "omni-test" || - build.pull_request.labels includes "tts-test" || - build.pull_request.labels includes "diffusion-x2iat-test" || - build.pull_request.labels includes "diffusion-x2v-test" - )) - commands: - - buildkite-agent pipeline upload .buildkite/test-nightly.yml - agents: - queue: "cpu_queue_premerge" - - # L5 Test — main+WEEKLY=1 (scheduled), or PR with weekly-test label - - label: "Upload Weekly Pipeline" - depends_on: image-build - key: upload-weekly-pipeline - if: >- - (build.branch == "main" && build.env("WEEKLY") == "1") || - (build.branch != "main" && build.pull_request.labels includes "weekly-test") - commands: - - buildkite-agent pipeline upload .buildkite/test-weekly.yml - agents: - queue: "cpu_queue_premerge" diff --git a/.buildkite/release-pipeline.yaml b/.buildkite/release-pipeline.yaml deleted file mode 100644 index edd98fafdb3..00000000000 --- a/.buildkite/release-pipeline.yaml +++ /dev/null @@ -1,38 +0,0 @@ -steps: - - label: ":docker: Build image" - key: image-build - commands: - - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "docker build --progress=plain --file docker/Dockerfile.ci -t vllm-omni-ci ." - - "docker tag vllm-omni-ci public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT" - - "docker push public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT" - agents: - queue: "cpu_queue_premerge" - - # L2 Test - - label: "Upload Ready Pipeline" - depends_on: image-build - key: upload-ready-pipeline - commands: - - buildkite-agent pipeline upload .buildkite/test-ready.yml - agents: - queue: "cpu_queue_premerge" - - # L3 Test - - label: "Upload Merge Pipeline" - depends_on: image-build - key: upload-merge-pipeline - commands: - - buildkite-agent pipeline upload .buildkite/test-merge.yml - agents: - queue: "cpu_queue_premerge" - - # L4 Test - - label: "Upload Nightly Pipeline" - depends_on: image-build - key: upload-nightly-pipeline - if: build.env("NIGHTLY") == "1" - commands: - - buildkite-agent pipeline upload .buildkite/test-nightly.yml - agents: - queue: "cpu_queue_premerge" diff --git a/.buildkite/scripts/docker_login_ecr_public.sh b/.buildkite/scripts/docker_login_ecr_public.sh deleted file mode 100755 index 51c5e1a5d5d..00000000000 --- a/.buildkite/scripts/docker_login_ecr_public.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -# Helper function to safely login to ECR Public with per-job config isolation -# Uses DOCKER_CONFIG environment variable to prevent race conditions -# -# This script prevents the "device or resource busy" error by giving each -# Buildkite job its own isolated Docker config directory. -# -# Usage: -# source docker_login_ecr_public.sh && safe_docker_login_ecr_public - -set -euo pipefail - -# Configuration -ECR_REGISTRY="public.ecr.aws" - -setup_isolated_docker_config() { - # Use BUILDKITE_JOB_ID for job-specific isolation - # Fallback to PID if running outside Buildkite - local job_id="${BUILDKITE_JOB_ID:-$$}" - - # Set Docker config to job-specific directory - export DOCKER_CONFIG="/tmp/docker-config-${job_id}" - - # Create directory if it doesn't exist - mkdir -p "$DOCKER_CONFIG" - - echo "[docker-config] Using isolated Docker config: $DOCKER_CONFIG" -} - -check_docker_auth() { - # Check if already authenticated to the given registry - # Returns 0 if authenticated, 1 if not - local registry="$1" - - # Check if credentials exist in the isolated config - if [[ -f "$DOCKER_CONFIG/config.json" ]]; then - # Check if registry is present in config - if grep -q "$registry" "$DOCKER_CONFIG/config.json" 2>/dev/null; then - return 0 - fi - fi - - return 1 -} - -safe_docker_login_ecr_public() { - # Setup isolated config first - setup_isolated_docker_config - - local registry="$ECR_REGISTRY" - - # Check if already authenticated (within this job) - if check_docker_auth "$registry"; then - echo "[docker-login] Already authenticated to $registry in this job" - return 0 - fi - - # Perform login to isolated config directory - echo "[docker-login] Logging in to $ECR_REGISTRY (isolated config)..." - if aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$ECR_REGISTRY"; then - echo "[docker-login] Login successful (config: $DOCKER_CONFIG)" - return 0 - else - local exit_code=$? - echo "[docker-login] ERROR: Login failed with exit code $exit_code" >&2 - return $exit_code - fi -} - -# Execute if run as script (not sourced) -if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then - safe_docker_login_ecr_public -fi diff --git a/.buildkite/scripts/generate-and-upload-nightly-index.sh b/.buildkite/scripts/generate-and-upload-nightly-index.sh deleted file mode 100755 index b09c13f5cf9..00000000000 --- a/.buildkite/scripts/generate-and-upload-nightly-index.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -# Generate and upload wheel indices for all vllm-omni wheels in the commit directory. -# This script should run once after all wheels have been built and uploaded. -# All paths are under the omni/ prefix in the vllm-wheels S3 bucket. - -# ======== setup ======== - -BUCKET="vllm-wheels" -INDICES_OUTPUT_DIR="indices" -PYTHON="${PYTHON_PROG:-python3}" -SUBPATH="omni/$BUILDKITE_COMMIT" -S3_COMMIT_PREFIX="s3://$BUCKET/$SUBPATH/" - -# detect if python3.12+ is available -has_new_python=$($PYTHON -c "print(1 if __import__('sys').version_info >= (3,12) else 0)") -if [[ "$has_new_python" -eq 0 ]]; then - # use new python from docker - docker pull python:3-slim - PYTHON="docker run --rm --user $(id -u):$(id -g) -v $(pwd):/app -w /app python:3-slim python3" -fi - -echo "Using python interpreter: $PYTHON" -echo "Python version: $($PYTHON --version)" - -# ======== generate and upload indices ======== - -# list all wheels in the commit directory -echo "Existing wheels on S3:" -aws s3 ls "$S3_COMMIT_PREFIX" || echo "(no objects found)" -obj_json="objects.json" -aws s3api list-objects-v2 --bucket "$BUCKET" --prefix "$SUBPATH/" --delimiter / --output json > "$obj_json" -mkdir -p "$INDICES_OUTPUT_DIR" - -# HACK: we do not need regex module here, but it is required by pre-commit hook -# To avoid any external dependency, we simply replace it back to the stdlib re module -sed -i.bak 's/import regex as re/import re/g' .buildkite/scripts/generate-nightly-index.py && rm -f .buildkite/scripts/generate-nightly-index.py.bak - -# Generate indices -- the version is just the commit hash (not omni/{commit}) -# because relative paths are computed between the index and wheel directories, -# both of which live under the omni/ prefix in S3. -$PYTHON .buildkite/scripts/generate-nightly-index.py \ - --version "$BUILDKITE_COMMIT" \ - --current-objects "$obj_json" \ - --output-dir "$INDICES_OUTPUT_DIR" \ - --comment "commit $BUILDKITE_COMMIT" - -# copy indices to /omni/{commit}/ unconditionally -echo "Uploading indices to $S3_COMMIT_PREFIX" -aws s3 cp --recursive "$INDICES_OUTPUT_DIR/" "$S3_COMMIT_PREFIX" - -# copy to /omni/nightly/ when NIGHTLY=1 -if [[ "${NIGHTLY:-}" == "1" ]]; then - echo "Uploading indices to overwrite /omni/nightly/" - aws s3 cp --recursive "$INDICES_OUTPUT_DIR/" "s3://$BUCKET/omni/nightly/" -fi - -# detect version from any wheel in the commit directory -first_wheel_key=$($PYTHON -c "import json; obj=json.load(open('$obj_json')); print(next((c['Key'] for c in obj.get('Contents', []) if c['Key'].endswith('.whl')), ''))") -if [[ -z "$first_wheel_key" ]]; then - echo "Error: No wheels found in $S3_COMMIT_PREFIX" - exit 1 -fi -first_wheel=$(basename "$first_wheel_key") -aws s3 cp "s3://$BUCKET/${first_wheel_key}" "/tmp/${first_wheel}" -version=$(unzip -p "/tmp/${first_wheel}" '**/METADATA' | grep '^Version: ' | cut -d' ' -f2) -rm -f "/tmp/${first_wheel}" -echo "Version in wheel: $version" -pure_version="${version%%+*}" -echo "Pure version (without variant): $pure_version" - -# re-generate and copy to /omni/{version}/ only if it does not have "dev" in the version -if [[ "$version" != *"dev"* ]]; then - s3_version="v$pure_version" - echo "Re-generating indices for /omni/$s3_version/" - rm -rf "${INDICES_OUTPUT_DIR:?}" - mkdir -p "$INDICES_OUTPUT_DIR" - # wheel-dir is overridden to be the commit directory, so that the indices point to the correct wheel path - $PYTHON .buildkite/scripts/generate-nightly-index.py \ - --version "$s3_version" \ - --wheel-dir "$BUILDKITE_COMMIT" \ - --current-objects "$obj_json" \ - --output-dir "$INDICES_OUTPUT_DIR" \ - --comment "version $pure_version" - aws s3 cp --recursive "$INDICES_OUTPUT_DIR/" "s3://$BUCKET/omni/$s3_version/" -fi diff --git a/.buildkite/scripts/generate-nightly-index.py b/.buildkite/scripts/generate-nightly-index.py deleted file mode 100755 index bb4a74a7044..00000000000 --- a/.buildkite/scripts/generate-nightly-index.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python3 -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -import argparse -import json -import re -import sys -from dataclasses import asdict, dataclass -from datetime import datetime -from pathlib import Path -from typing import Any -from urllib.parse import quote - - -def normalize_package_name(name: str) -> str: - """Normalize package name per PEP 503.""" - return re.sub(r"[-_.]+", "-", name).lower() - - -if not sys.version_info >= (3, 12): - raise RuntimeError("This script requires Python 3.12 or higher.") - -INDEX_HTML_TEMPLATE = """ - - - - -{items} - - -""" - - -@dataclass -class WheelFileInfo: - package_name: str - version: str - build_tag: str | None - python_tag: str - abi_tag: str - platform_tag: str - filename: str - - -def parse_from_filename(file: str) -> WheelFileInfo: - """ - Parse wheel filename per PEP 427: - {package_name}-{version}(-{build_tag})?-{python_tag}-{abi_tag}-{platform_tag}.whl - """ - wheel_file_re = re.compile( - r"^(?P.+)-(?P[^-]+?)(-(?P[^-]+))?-(?P[^-]+)-(?P[^-]+)-(?P[^-]+)\.whl$" - ) - match = wheel_file_re.match(file) - if not match: - raise ValueError(f"Invalid wheel file name: {file}") - - return WheelFileInfo( - package_name=match.group("package_name"), - version=match.group("version"), - build_tag=match.group("build_tag"), - python_tag=match.group("python_tag"), - abi_tag=match.group("abi_tag"), - platform_tag=match.group("platform_tag"), - filename=file, - ) - - -def generate_project_list(package_names: list[str], comment: str = "") -> str: - """Generate top-level PEP 503 project list HTML.""" - href_tags = [] - for name in sorted(package_names): - href_tags.append(f' {name}/
') - return INDEX_HTML_TEMPLATE.format(items="\n".join(href_tags), comment=comment) - - -def generate_package_index( - wheel_files: list[WheelFileInfo], - wheel_base_dir: Path, - index_base_dir: Path, - comment: str = "", -) -> tuple[str, str]: - """Generate package index HTML and metadata JSON linking to wheel files.""" - href_tags = [] - metadata = [] - for file in sorted(wheel_files, key=lambda x: x.filename): - relative_path = wheel_base_dir.relative_to(index_base_dir, walk_up=True) / file.filename - # handle '+' in URL; avoid double-encoding '/' and '%2B' (AWS S3 behavior) - file_path_quoted = quote(relative_path.as_posix(), safe=":%/") - href_tags.append(f' {file.filename}
') - file_meta = asdict(file) - file_meta["path"] = file_path_quoted - metadata.append(file_meta) - index_str = INDEX_HTML_TEMPLATE.format(items="\n".join(href_tags), comment=comment) - metadata_str = json.dumps(metadata, indent=2) - return index_str, metadata_str - - -def generate_index( - whl_files: list[str], - wheel_base_dir: Path, - index_base_dir: Path, - comment: str = "", -): - """ - Generate PEP 503 index for all wheel files. - - Output structure: - index_base_dir/ - index.html # project list linking to vllm-omni/ - vllm-omni/ - index.html # package index linking to wheel files - metadata.json # machine-readable metadata - """ - parsed_files = [parse_from_filename(f) for f in whl_files] - - if not parsed_files: - print("No wheel files found, skipping index generation.") - return - - comment_str = f" ({comment})" if comment else "" - comment_tmpl = f"Generated on {datetime.now().isoformat()}{comment_str}" - - # Group by normalized package name - packages: dict[str, list[WheelFileInfo]] = {} - for file in parsed_files: - name = normalize_package_name(file.package_name) - packages.setdefault(name, []).append(file) - - print(f"Found packages: {list(packages.keys())}") - - # Generate per-package index - for package, files in packages.items(): - package_dir = index_base_dir / package - package_dir.mkdir(parents=True, exist_ok=True) - index_str, metadata_str = generate_package_index(files, wheel_base_dir, package_dir, comment) - with open(package_dir / "index.html", "w") as f: - f.write(index_str) - with open(package_dir / "metadata.json", "w") as f: - f.write(metadata_str) - - # Generate top-level project list - project_list_str = generate_project_list(sorted(packages.keys()), comment_tmpl) - with open(index_base_dir / "index.html", "w") as f: - f.write(project_list_str) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Generate PEP 503 wheel index from S3 object listing.") - parser.add_argument("--version", type=str, required=True, help="Version string (e.g., commit hash)") - parser.add_argument("--current-objects", type=str, required=True, help="Path to JSON from S3 list-objects-v2") - parser.add_argument("--output-dir", type=str, required=True, help="Directory to write index files") - parser.add_argument("--wheel-dir", type=str, default=None, help="Wheel directory (defaults to --version)") - parser.add_argument("--comment", type=str, default="", help="Comment for generated HTML") - - args = parser.parse_args() - - version = args.version - if "\\" in version or "/" in version: - raise ValueError("Version string must not contain slashes or backslashes.") - - output_dir = Path(args.output_dir) - output_dir.mkdir(parents=True, exist_ok=True) - - with open(args.current_objects) as f: - current_objects: dict[str, list[dict[str, Any]]] = json.load(f) - - wheel_files = [ - item["Key"].split("/")[-1] for item in current_objects.get("Contents", []) if item["Key"].endswith(".whl") - ] - - print(f"Found {len(wheel_files)} wheel files for version {version}: {wheel_files}") - - # For release versions, filter to only matching non-dev wheels - PY_VERSION_RE = re.compile(r"^\d+\.\d+\.\d+([a-zA-Z0-9.+-]*)?$") - if PY_VERSION_RE.match(version): - wheel_files = [f for f in wheel_files if version in f and "dev" not in f] - print(f"Non-nightly version detected, wheel files used: {wheel_files}") - else: - print("Nightly version detected, keeping all wheel files.") - - wheel_dir = (args.wheel_dir or version).strip().rstrip("/") - wheel_base_dir = Path(output_dir).parent / wheel_dir - index_base_dir = Path(output_dir) - - generate_index( - whl_files=wheel_files, - wheel_base_dir=wheel_base_dir, - index_base_dir=index_base_dir, - comment=args.comment.strip(), - ) - print(f"Successfully generated index in {output_dir}") diff --git a/.buildkite/scripts/hardware_ci/run-amd-test.sh b/.buildkite/scripts/hardware_ci/run-amd-test.sh deleted file mode 100755 index 96c139c8f7b..00000000000 --- a/.buildkite/scripts/hardware_ci/run-amd-test.sh +++ /dev/null @@ -1,154 +0,0 @@ -#!/bin/bash -# vllm-omni customized version -# Based on: vllm/.buildkite/scripts/hardware_ci/run-amd-test.sh -# Last synced: 2025-12-15 -# Modifications: docker image name for vllm-omni - -# This script runs test inside the corresponding ROCm docker container. -set -o pipefail - -# Export Python path -export PYTHONPATH=".." - -# Print ROCm version -echo "--- ROCm info" -rocminfo - -# cleanup older docker images -cleanup_docker() { - # Get Docker's root directory - docker_root=$(docker info -f '{{.DockerRootDir}}') - if [ -z "$docker_root" ]; then - echo "Failed to determine Docker root directory." - exit 1 - fi - echo "Docker root directory: $docker_root" - # Check disk usage of the filesystem where Docker's root directory is located - disk_usage=$(df "$docker_root" | tail -1 | awk '{print $5}' | sed 's/%//') - # Define the threshold - threshold=70 - if [ "$disk_usage" -gt "$threshold" ]; then - echo "Disk usage is above $threshold%. Cleaning up Docker images and volumes..." - # Remove dangling images (those that are not tagged and not used by any container) - docker image prune -f - # Remove unused volumes / force the system prune for old images as well. - docker volume prune -f && docker system prune --force --filter "until=72h" --all - echo "Docker images and volumes cleanup completed." - else - echo "Disk usage is below $threshold%. No cleanup needed." - fi -} - -# Call the cleanup docker function -cleanup_docker - -echo "--- Pulling container" -## Temporary change to use AMD Docker Hub to store the vllm-omni image -# to bypass the rate limit issue with ECR Public Gallery. -# Images are now stored in a separate repository for vllm-omni, instead of vllm-ci. -# TODO: @tjtanaa point back to ECR Public Gallery -# once the amd agents are configured to use ECR Public Gallery. -# image_name="public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:${BUILDKITE_COMMIT}-rocm-omni" -image_name="rocm/vllm-omni:${BUILDKITE_COMMIT}" -container_name="rocm_${BUILDKITE_COMMIT}_$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10; echo)" - -# TODO: @tjtanaa uncomment this once the amd agents are configured to use ECR Public Gallery. -# # Install AWS CLI to authenticate to ECR Public Gallery to get higher rate limit for pulling images -# sudo apt-get update && sudo apt-get install -y awscli -## Use safe docker login helper to prevent race conditions -# source "$(dirname "${BASH_SOURCE[0]}")/../docker_login_ecr_public.sh" -# safe_docker_login_ecr_public - -## Pull the container from AMD Docker Hub - -docker pull "${image_name}" - -remove_docker_container() { - docker rm -f "${container_name}" || docker image rm -f "${image_name}" || true -} -trap remove_docker_container EXIT - -echo "--- Running container" - -HF_CACHE="$(realpath ~)/huggingface" -mkdir -p "${HF_CACHE}" -HF_MOUNT="/root/.cache/huggingface" - -if [[ -n "${TEST_COMMAND:-}" ]]; then - commands="$TEST_COMMAND" -else - commands="$@" -fi -echo "Commands:$commands" - -PARALLEL_JOB_COUNT=8 -MYPYTHONPATH=".." - -# Test that we're launching on the machine that has -# proper access to GPUs -render_gid=$(getent group render | cut -d: -f3) -if [[ -z "$render_gid" ]]; then - echo "Error: 'render' group not found. This is required for GPU access." >&2 - exit 1 -fi - -# check if the command contains shard flag, we will run all shards in parallel because the host have 8 GPUs. -# TODO: @tjtanaa reenable to run VLLM_ROCM_USE_AITER=1 when AITER is shipped with prebuilt kernels. -if [[ $commands == *"--shard-id="* ]]; then - # assign job count as the number of shards used - commands=$(echo "$commands" | sed -E "s/--num-shards[[:blank:]]*=[[:blank:]]*[0-9]*/--num-shards=${PARALLEL_JOB_COUNT} /g" | sed 's/ \\ / /g') - for GPU in $(seq 0 $(($PARALLEL_JOB_COUNT-1))); do - # assign shard-id for each shard - commands_gpu=$(echo "$commands" | sed -E "s/--shard-id[[:blank:]]*=[[:blank:]]*[0-9]*/--shard-id=${GPU} /g" | sed 's/ \\ / /g') - echo "Shard ${GPU} commands:$commands_gpu" - echo "Render devices: $BUILDKITE_AGENT_META_DATA_RENDER_DEVICES" - docker run \ - --device /dev/kfd $BUILDKITE_AGENT_META_DATA_RENDER_DEVICES \ - --network=host \ - --shm-size=16gb \ - --group-add "$render_gid" \ - --rm \ - -e MIOPEN_DEBUG_CONV_DIRECT=0 \ - -e MIOPEN_DEBUG_CONV_GEMM=0 \ - -e VLLM_ROCM_USE_AITER=0 \ - -e HIP_VISIBLE_DEVICES="${GPU}" \ - -e HF_TOKEN \ - -v "${HF_CACHE}:${HF_MOUNT}" \ - -e "HF_HOME=${HF_MOUNT}" \ - -e "PYTHONPATH=${MYPYTHONPATH}" \ - --name "${container_name}_${GPU}" \ - "${image_name}" \ - /bin/bash -c "${commands_gpu}" \ - |& while read -r line; do echo ">>Shard $GPU: $line"; done & - PIDS+=($!) - done - #wait for all processes to finish and collect exit codes - for pid in "${PIDS[@]}"; do - wait "${pid}" - STATUS+=($?) - done - for st in "${STATUS[@]}"; do - if [[ ${st} -ne 0 ]]; then - echo "One of the processes failed with $st" - exit "${st}" - fi - done -else - echo "Render devices: $BUILDKITE_AGENT_META_DATA_RENDER_DEVICES" - docker run \ - --device /dev/kfd $BUILDKITE_AGENT_META_DATA_RENDER_DEVICES \ - --network=host \ - --shm-size=16gb \ - --group-add "$render_gid" \ - --rm \ - -e MIOPEN_DEBUG_CONV_DIRECT=0 \ - -e MIOPEN_DEBUG_CONV_GEMM=0 \ - -e VLLM_ROCM_USE_AITER=0 \ - -e HF_TOKEN \ - -v "${HF_CACHE}:${HF_MOUNT}" \ - -e "HF_HOME=${HF_MOUNT}" \ - -e "PYTHONPATH=${MYPYTHONPATH}" \ - --name "${container_name}" \ - "${image_name}" \ - /bin/bash -c "${commands}" -fi diff --git a/.buildkite/scripts/hardware_ci/run-xpu-test.sh b/.buildkite/scripts/hardware_ci/run-xpu-test.sh deleted file mode 100755 index e1d464ef0bc..00000000000 --- a/.buildkite/scripts/hardware_ci/run-xpu-test.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# This script build the XPU docker image and run the offline inference inside the container. -set -ex - -omni_source_dir=$(git rev-parse --show-toplevel) - -base_image_name="xpu/vllm-omni-ci-base:${VLLM_VERSION:?VLLM_VERSION must be set}" -image_name="xpu/vllm-omni-ci:${BUILDKITE_COMMIT:?BUILDKITE_COMMIT must be set}" -container_name="xpu_${BUILDKITE_COMMIT}_$( - tr -dc A-Za-z0-9 =6.0 pytest-cov modelscope - -COPY . . - -# Install vllm-omni -WORKDIR /workspace -ARG VLLM_OMNI_REPO=https://github.com/vllm-project/vllm-omni.git -ARG VLLM_OMNI_TAG=main -ARG BUILDKITE_PULL_REQUEST -ARG BUILDKITE_PULL_REQUEST_REPO -RUN git config --global url."https://gh-proxy.test.osinfra.cn/https://github.com/".insteadOf "https://github.com/" && \ - if [ "\$BUILDKITE_PULL_REQUEST" != "false" ] && [ -n "\$BUILDKITE_PULL_REQUEST" ]; then \ - echo "Cloning and checking out PR #\$BUILDKITE_PULL_REQUEST..." && \ - git clone \$VLLM_OMNI_REPO /workspace/vllm-omni && \ - cd /workspace/vllm-omni && \ - git fetch origin pull/\$BUILDKITE_PULL_REQUEST/head:pr-\$BUILDKITE_PULL_REQUEST && \ - git checkout pr-\$BUILDKITE_PULL_REQUEST; \ - else \ - echo "Not a PR build, using main branch" && \ - git clone --depth 1 \$VLLM_OMNI_REPO /workspace/vllm-omni; \ - fi - -RUN --mount=type=cache,target=/root/.cache/pip \ - export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ - source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ - source /usr/local/Ascend/nnal/atb/set_env.sh && \ - export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ - python3 -m pip install -v -e /workspace/vllm-omni/ - -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -WORKDIR /workspace/vllm-omni -CMD ["/bin/bash"] - -EOF - -# Setup cleanup -remove_docker_container() { - docker rm -f "${container_name}" || true; - docker image rm -f "${image_name}" || true; - docker system prune -f || true; -} -trap remove_docker_container EXIT - -# Generate corresponding --device args based on BUILDKITE_AGENT_NAME -# Ascend NPU BUILDKITE_AGENT_NAME format is {hostname}-{agent_idx}-{npu_card_num}cards, and agent_idx starts from 1. -# e.g. atlas-a2-001-1-2cards means this is the 1-th agent on atlas-a2-001 host, and it has 2 NPU cards. -# returns --device /dev/davinci0 --device /dev/davinci1 -parse_and_gen_devices() { - local input="$1" - local index cards_num - if [[ "$input" =~ ([0-9]+)-([0-9]+)cards$ ]]; then - index="${BASH_REMATCH[1]}" - cards_num="${BASH_REMATCH[2]}" - else - echo "parse error" >&2 - return 1 - fi - - local devices="" - local i=0 - while (( i < cards_num )); do - local dev_idx=$(((index - 1)*cards_num + i )) - devices="$devices --device /dev/davinci${dev_idx}" - ((i++)) - done - - # trim leading space - devices="${devices#"${devices%%[![:space:]]*}"}" - # Output devices: assigned to the caller variable - printf '%s' "$devices" -} - -devices=$(parse_and_gen_devices "${BUILDKITE_AGENT_NAME}") || exit 1 - -# Run the image and execute the Out-Of-Tree (OOT) platform interface test case on Ascend NPU hardware. -# This test checks whether the OOT platform interface is functioning properly in conjunction with -# the hardware plugin vllm-ascend. -hf_model_cache_dir=/mnt/hf_cache${agent_idx} -ms_model_cache_dir=/mnt/modelscope${agent_idx} -mkdir -p ${hf_model_cache_dir} -mkdir -p ${ms_model_cache_dir} -docker run \ - --init \ - ${devices} \ - --device /dev/davinci_manager \ - --device /dev/devmm_svm \ - --device /dev/hisi_hdc \ - -v /usr/local/dcmi:/usr/local/dcmi \ - -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ - -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ - -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ - -v /etc/ascend_install.info:/etc/ascend_install.info \ - -v ${hf_model_cache_dir}:/root/.cache/huggingface \ - -v ${ms_model_cache_dir}:/root/.cache/modelscope \ - --network host \ - --entrypoint="" \ - --name "${container_name}" \ - "${image_name}" \ - bash -c ' - set -e - VLLM_USE_MODELSCOPE=True pytest -s -v tests/e2e/offline_inference/test_qwen2_5_omni_expansion.py -' diff --git a/.buildkite/scripts/upload-nightly-wheels.sh b/.buildkite/scripts/upload-nightly-wheels.sh deleted file mode 100755 index d50da1deda1..00000000000 --- a/.buildkite/scripts/upload-nightly-wheels.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -# Upload a single wheel to S3 under the omni/ prefix. -# Index generation is handled separately by generate-and-upload-nightly-index.sh. - -BUCKET="vllm-wheels" -SUBPATH="omni/$BUILDKITE_COMMIT" -S3_COMMIT_PREFIX="s3://$BUCKET/$SUBPATH/" - -# ========= collect & upload the wheel ========== - -# python3 -m build outputs to dist/ by default -wheel_files=(dist/*.whl) - -# Check that exactly one wheel is found -if [[ ${#wheel_files[@]} -ne 1 ]]; then - echo "Error: Expected exactly one wheel file in dist/, but found ${#wheel_files[@]}" - exit 1 -fi -wheel="${wheel_files[0]}" - -echo "Uploading wheel: $wheel" - -# Extract the version from the wheel -version=$(unzip -p "$wheel" '**/METADATA' | grep '^Version: ' | cut -d' ' -f2) -echo "Version in wheel: $version" - -# Upload wheel to S3 -aws s3 cp "$wheel" "$S3_COMMIT_PREFIX" - -echo "Wheel uploaded to $S3_COMMIT_PREFIX. Index generation is handled by a separate step." diff --git a/.buildkite/scripts/upload_pipeline_with_skip_ci.sh b/.buildkite/scripts/upload_pipeline_with_skip_ci.sh deleted file mode 100644 index 6259d39b290..00000000000 --- a/.buildkite/scripts/upload_pipeline_with_skip_ci.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env bash -# Evaluate docs-only skip-ci and upload continuation steps from the same `.buildkite/pipeline.yml` -# (YAML document after the first `---`). Buildkite `if` is evaluated at upload time. -set -euo pipefail - -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -PIPELINE_YML="${ROOT}/.buildkite/pipeline.yml" - -# Prints a single digit to stdout: 1 = skip image CI, 0 = run. Logs go to stderr. -is_docs_only_change() { - local file_path - local has_any=0 - - while IFS= read -r file_path; do - [[ -z "${file_path}" ]] && continue - has_any=1 - - if [[ "${file_path}" == docs/* ]]; then - continue - fi - if [[ "${file_path}" == *.md ]]; then - continue - fi - if [[ "${file_path}" == "mkdocs.yaml" ]]; then - continue - fi - return 1 - done - - [[ "${has_any}" -eq 1 ]] -} - -resolve_skip_ci() { - local is_pr_build=0 - local files - local base_branch base_ref - - if [[ "${BUILDKITE_PULL_REQUEST:-false}" != "false" && -n "${BUILDKITE_PULL_REQUEST:-}" ]]; then - is_pr_build=1 - fi - - if [[ "${is_pr_build}" -eq 1 ]]; then - base_branch="${BUILDKITE_PULL_REQUEST_BASE_BRANCH:-main}" - if ! git rev-parse --verify "origin/${base_branch}" >/dev/null 2>&1; then - echo "resolve_skip_ci: origin/${base_branch} not found locally; trying fetch" >&2 - git fetch --depth=200 origin "${base_branch}" >/dev/null 2>&1 || true - fi - - base_ref="" - if git rev-parse --verify "origin/${base_branch}" >/dev/null 2>&1; then - base_ref="origin/${base_branch}" - elif git rev-parse --verify "${base_branch}" >/dev/null 2>&1; then - base_ref="${base_branch}" - else - echo "resolve_skip_ci: cannot resolve PR base ${base_branch}; skip-ci=0" >&2 - echo -n 0 - return 0 - fi - - if ! files="$(git diff --name-only "${base_ref}...${BUILDKITE_COMMIT}" 2>/dev/null)"; then - echo "resolve_skip_ci: failed to compute PR changed files; skip-ci=0" >&2 - echo -n 0 - return 0 - fi - elif [[ "${BUILDKITE_BRANCH:-}" == "main" ]]; then - if ! git rev-parse --verify "${BUILDKITE_COMMIT}^" >/dev/null 2>&1; then - echo "resolve_skip_ci: commit has no parent on main; skip-ci=0" >&2 - echo -n 0 - return 0 - fi - if ! files="$(git diff --name-only "${BUILDKITE_COMMIT}^..${BUILDKITE_COMMIT}" 2>/dev/null)"; then - echo "resolve_skip_ci: failed to compute main changed files; skip-ci=0" >&2 - echo -n 0 - return 0 - fi - else - echo "resolve_skip_ci: not PR/main build; skip-ci=0" >&2 - echo -n 0 - return 0 - fi - - if is_docs_only_change <<< "${files}"; then - echo "resolve_skip_ci: docs-only change detected; skip-ci=1" >&2 - echo -n 1 - return 0 - fi - - echo "resolve_skip_ci: non-doc changes detected; skip-ci=0" >&2 - echo -n 0 -} - -SKIP_CI="$(resolve_skip_ci)" - -if [[ ! -f "${PIPELINE_YML}" ]]; then - echo "upload_pipeline_with_skip_ci: missing ${PIPELINE_YML}" >&2 - exit 1 -fi - -export ROOT SKIP_CI PIPELINE_YML -python3 <<'PY' | buildkite-agent pipeline upload -import os -import pathlib - -path = pathlib.Path(os.environ["PIPELINE_YML"]) -text = path.read_text(encoding="utf-8") -sep = "\n---\n" -if sep not in text: - raise SystemExit( - "upload_pipeline_with_skip_ci: .buildkite/pipeline.yml must contain a '\\n---\\n' separator " - "(document 1 = bootstrap, document 2 = uploaded steps)" - ) -_, continuation = text.split(sep, 1) - -skip = os.environ.get("SKIP_CI") == "1" -# When docs-only skip-ci: skip default CI image, but still build for L4 nightly (PR label nightly-test or -# main NIGHTLY=1), otherwise upload-nightly (depends_on image-build) would be skipped too. -nightly_only = ( - '(build.pull_request.labels includes "nightly-test") ' - '|| (build.branch == "main" && build.env("NIGHTLY") == "1")' -) -# Placeholder in pipeline.yml is `if: __IMAGE_BUILD_IF__` (valid YAML); replace value only. -if skip: - rep = f"'{nightly_only}'" - ready_rep = "'false'" - merge_rep = "'false'" -else: - rep = "'true'" - ready_rep = "'build.branch != \"main\" && build.pull_request.labels includes \"ready\"'" - merge_rep = "'(build.branch == \"main\" && build.env(\"NIGHTLY\") != \"1\") || (build.branch != \"main\" && build.pull_request.labels includes \"merge-test\")'" -rendered = ( - continuation - .replace("__IMAGE_BUILD_IF__", rep) - .replace("__UPLOAD_READY_IF__", ready_rep) - .replace("__UPLOAD_MERGE_IF__", merge_rep) -) -print(rendered, end="") -PY diff --git a/.buildkite/test-amd-merge.yml b/.buildkite/test-amd-merge.yml deleted file mode 100644 index aabff610d57..00000000000 --- a/.buildkite/test-amd-merge.yml +++ /dev/null @@ -1,223 +0,0 @@ -steps: - -- label: "Simple Unit Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_ROCM_USE_AITER=0 - # ignore test_teacache_extractors.py because it use rocm gemm kernel from vLLM - # that is not supported on CPU - - "timeout 20m pytest -v -s -m 'core_model and cpu' --ignore=tests/diffusion/cache/test_teacache_extractors.py --cov=vllm_omni --cov-branch --cov-report=term-missing --cov-report=html --cov-report=xml" - -- label: "Diffusion Model Test" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - timeout 20m pytest -s -v tests/e2e/offline_inference/test_t2i_model.py -m "advanced_model and diffusion" --run-level "advanced_model" - -- label: "Diffusion Images API LoRA E2E" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 20m pytest -s -v tests/e2e/online_serving/test_images_generations_lora.py - -- label: "Diffusion Model CPU offloading Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - | - timeout 20m bash -c ' - set +e - pytest -s -v tests/e2e/offline_inference/test_diffusion_cpu_offload.py - EXIT1=\$? - pytest -s -v tests/e2e/offline_inference/test_diffusion_layerwise_offload.py - EXIT2=\$? - exit \$((EXIT1 | EXIT2)) - ' - -## ISSUE depends on `diffusers` package: https://github.com/huggingface/diffusers/issues/13274 -# - label: "Audio Generation Model Test" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - timeout 20m pytest -s -v tests/e2e/offline_inference/test_stable_audio_expansion.py -m "advanced_model and diffusion and L4" --run-level advanced_model - -- label: "Diffusion Cache Backend Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 15m pytest -s -v -m "core_model and cache and diffusion and not distributed_cuda and L4" - -- label: "Diffusion Sequence Parallelism Test (Need 4 GPUs)" - agent_pool: mi325_4 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 20m pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py - - timeout 20m pytest -s -v tests/diffusion/distributed/test_ulysses_uaa_perf.py - -# merge-only tests -- label: "Diffusion Tensor Parallelism Test" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - pytest -s -v tests/e2e/offline_inference/test_zimage_parallelism.py - -- label: "Diffusion GPU Worker Test" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 20m pytest -s -v tests/diffusion/test_diffusion_worker.py - -- label: "Engine Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 20m pytest -s -v tests/engine/test_async_omni_engine_abort.py - -- label: "Omni Model Test Qwen2-5-Omni" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 20m pytest -s -v tests/e2e/offline_inference/test_qwen2_5_omni_expansion.py - - timeout 20m pytest -s -v tests/e2e/online_serving/test_qwen2_5_omni_expansion.py -m "advanced_model" --run-level "core_model" - -- label: "Omni Model Test Qwen3-Omni" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - export VLLM_TEST_CLEAN_GPU_MEMORY=1 - - timeout 30m pytest -s -v tests/e2e/offline_inference/test_qwen3_omni.py tests/e2e/online_serving/test_qwen3_omni.py tests/e2e/online_serving/test_mimo_audio.py -m "advanced_model" --run-level "advanced_model" - -- label: "Qwen3-TTS CustomVoice E2E Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py tests/e2e/offline_inference/test_qwen3_tts_customvoice.py -m "advanced_model" --run-level "advanced_model" - ' - -- label: "Qwen3-TTS Base E2E Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - | - timeout 30m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - pytest -s -v tests/e2e/online_serving/test_qwen3_tts_base.py tests/e2e/offline_inference/test_qwen3_tts_base.py -m "advanced_model" --run-level "advanced_model" - ' - -- label: "Diffusion Image Edit Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 20m pytest -s -v tests/e2e/online_serving/test_image_gen_edit.py - -# TODO: Bagel test on ROCm is very unstable. @tjtanaa -# Need to debug before reneable numerical changes across large PRs -# # split Bagel Model Test with H100 (Real Weights) into three tests -# - label: "Bagel Text2Img Model Test (1/3)" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_ROCM_USE_AITER_RMSNORM=0 -# - timeout 30m pytest -s -v tests/e2e/offline_inference/test_bagel_text2img.py -m "advanced_model" --run-level "advanced_model" -k "shared_memory" -k "rocm" - -# - label: "Bagel Img2Img Model Test (2/3)" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_ROCM_USE_AITER_RMSNORM=0 -# - timeout 30m pytest -s -v tests/e2e/offline_inference/test_bagel_img2img.py -m "advanced_model" --run-level "advanced_model" -k "rocm" - -# - label: "Bagel Online Serving Test (3/3)" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - export VLLM_IMAGE_FETCH_TIMEOUT=60 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_ROCM_USE_AITER_RMSNORM=0 -# - timeout 40m pytest -s -v tests/e2e/online_serving/test_bagel_online.py -m "advanced_model" --run-level "advanced_model" -k "rocm" - -- label: "Voxtral-TTS E2E Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/online_serving/test_voxtral_tts.py tests/e2e/offline_inference/test_voxtral_tts.py -m "advanced_model" --run-level "advanced_model" - ' diff --git a/.buildkite/test-amd-ready.yaml b/.buildkite/test-amd-ready.yaml deleted file mode 100644 index 597733cbb86..00000000000 --- a/.buildkite/test-amd-ready.yaml +++ /dev/null @@ -1,229 +0,0 @@ -steps: - -- label: "Simple Unit Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_ROCM_USE_AITER=0 - # ignore test_teacache_extractors.py because it use rocm gemm kernel from vLLM - # that is not supported on CPU - - "timeout 20m pytest -vvvv -s -m 'core_model and cpu' --ignore=tests/diffusion/cache/test_teacache_extractors.py --cov=vllm_omni --cov-branch --cov-report=term-missing --cov-report=html --cov-report=xml" - -- label: "Voxtral TTS CUDA Unit Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 10m pytest -s -v tests/model_executor/models/voxtral_tts/test_cuda_graph_acoustic_transformer.py - -- label: "Diffusion Model Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 30m pytest -s -v tests/e2e/offline_inference/test_t2i_model.py -m "core_model and diffusion" --run-level "core_model" - -- label: "Diffusion Batching Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 20m pytest -s -v tests/e2e/offline_inference/test_qwen_image_diffusion_batching.py -m "core_model and diffusion" --run-level "core_model" - -- label: "Custom Pipeline Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 20m pytest -s -v tests/e2e/offline_inference/custom_pipeline/ -m "core_model" - -- label: "Diffusion Model CPU offloading Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - | - timeout 20m bash -c ' - set +e - pytest -s -v tests/e2e/offline_inference/test_diffusion_cpu_offload.py - EXIT1=\$? - pytest -s -v tests/e2e/offline_inference/test_diffusion_layerwise_offload.py - EXIT2=\$? - exit \$((EXIT1 | EXIT2)) - ' - -## ISSUE depends on `diffusers` package: https://github.com/huggingface/diffusers/issues/13274 -# - label: "Audio Generation Model Test" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - timeout 20m pytest -s -v tests/e2e/offline_inference/test_stable_audio_expansion.py -m "advanced_model and diffusion and L4" --run-level advanced_model - -- label: "Diffusion Cache Backend Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 15m pytest -s -v -m "core_model and cache and diffusion and not distributed_cuda and L4" - -- label: "Diffusion Sequence Parallelism Test" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 20m pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py -m core_model - -- label: "Diffusion GPU Worker Test" - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - timeout 20m pytest -s -v tests/diffusion/test_diffusion_worker.py - -- label: "Engine Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - | - timeout 15m bash -c ' - pytest -s -v tests/engine/test_async_omni_engine_abort.py - ' - -# - label: "Omni Model Test Qwen3-Omni" -# agent_pool: mi325_2 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - timeout 10m pytest -s -v tests/e2e/offline_inference/test_qwen3_omni.py -# - timeout 20m pytest -s -v tests/e2e/online_serving/test_qwen3_omni.py -m "core_model" --run-level "core_model" - -- label: "MiMo-Audio E2E Test with H100" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - | - timeout 30m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/online_serving/test_mimo_audio.py -m "core_model" --run-level "core_model" - ' - -- label: "Qwen3-TTS E2E Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - - timeout 30m pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py -m "core_model" --run-level "core_model" - -- label: "Voxtral-TTS E2E Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/online_serving/test_voxtral_tts.py -m "advanced_model" --run-level "advanced_model" - pytest -s -v tests/e2e/offline_inference/test_voxtral_tts.py -m "advanced_model" --run-level "advanced_model" - ' - -- label: "Diffusion Image Edit Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - timeout 20m pytest -s -v tests/e2e/online_serving/test_image_gen_edit.py - -# TODO: Bagel test on ROCm is very unstable. @tjtanaa -# Need to debug before reneable numerical changes across large PRs -# - label: "Bagel Text2Img Model Test" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_ROCM_USE_AITER_RMSNORM=0 -# - timeout 30m pytest -s -v tests/e2e/offline_inference/test_bagel_text2img.py -m "core_model" --run-level "core_model" -k "rocm" - -# - label: "Bagel Img2Img Model Test" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_ROCM_USE_AITER_RMSNORM=0 -# - timeout 30m pytest -s -v tests/e2e/offline_inference/test_bagel_img2img.py -m "core_model" --run-level "core_model" -k "rocm" - -# - label: "Bagel Online Serving Test" -# agent_pool: mi325_1 -# depends_on: amd-build -# mirror_hardwares: [amdproduction] -# grade: Blocking -# commands: -# - export GPU_ARCHS=gfx942 -# - export VLLM_TEST_CLEAN_GPU_MEMORY=1 -# - export VLLM_IMAGE_FETCH_TIMEOUT=60 -# - export VLLM_LOGGING_LEVEL=DEBUG -# - export VLLM_WORKER_MULTIPROC_METHOD=spawn -# - export VLLM_ROCM_USE_AITER_RMSNORM=0 -# - timeout 40m pytest -s -v tests/e2e/online_serving/test_bagel_online.py -m "core_model" --run-level "core_model" -k "rocm" - -- label: "CosyVoice3-TTS E2E Test" - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - | - timeout 20m bash -c ' - pytest -s -v tests/e2e/online_serving/test_cosyvoice3_tts.py -m "core_model" --run-level "core_model" - ' diff --git a/.buildkite/test-amd.yaml b/.buildkite/test-amd.yaml deleted file mode 100644 index 8942b640744..00000000000 --- a/.buildkite/test-amd.yaml +++ /dev/null @@ -1,133 +0,0 @@ -steps: - -- label: "Diffusion Model Test" - timeout_in_minutes: 30 - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - pytest -s -v tests/e2e/offline_inference/test_t2i_model.py - -- label: "Diffusion Images API LoRA E2E" - timeout_in_minutes: 30 - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/online_serving/test_images_generations_lora.py - -- label: "Diffusion Model CPU offloading Test" - timeout_in_minutes: 20 - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/offline_inference/test_diffusion_cpu_offload.py - - pytest -s -v tests/e2e/offline_inference/test_diffusion_layerwise_offload.py - -- label: "Diffusion Cache Backend Test" - timeout_in_minutes: 15 - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - 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 - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - 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 -m core_model - -- label: "Diffusion Tensor Parallelism Test" - timeout_in_minutes: 20 - agent_pool: mi325_2 - depends_on: amd-build - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/offline_inference/test_zimage_parallelism.py - -- label: "Diffusion GPU Worker Test" - timeout_in_minutes: 20 - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - pytest -s -v tests/diffusion/test_diffusion_worker.py - -- label: "Omni Model Test Qwen2-5-Omni" - timeout_in_minutes: 15 - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/offline_inference/test_qwen2_5_omni_expansion.py - - pytest -s -v tests/engine/test_async_omni_engine_abort.py - -- label: "Omni Model Test Qwen3-Omni" - timeout_in_minutes: 15 - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - export VLLM_TEST_CLEAN_GPU_MEMORY="1" - - export VLLM_ROCM_USE_AITER=0 - - pytest -s -v tests/e2e/offline_inference/test_qwen3_omni.py - - pytest -s -v tests/e2e/online_serving/test_qwen3_omni.py - - -- label: "Diffusion Image Edit Test" - timeout_in_minutes: 15 - agent_pool: mi325_1 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - pytest -s -v tests/e2e/online_serving/test_image_gen_edit.py - - -- label: "Omni Sleep Mode Test" - timeout_in_minutes: 40 - agent_pool: mi325_2 - depends_on: amd-build - mirror_hardwares: [amdproduction] - grade: Blocking - commands: - - export GPU_ARCHS=gfx942 - - export VLLM_LOGGING_LEVEL=DEBUG - - export VLLM_WORKER_MULTIPROC_METHOD=spawn - - export VLLM_TEST_CLEAN_GPU_MEMORY="1" - - pytest -s -v tests/e2e/offline_inference/test_omni_sleep_mode.py -m "advanced_model and omni and MI325" --run-level "advanced_model" diff --git a/.buildkite/test-merge.yml b/.buildkite/test-merge.yml deleted file mode 100644 index f5afa7e8510..00000000000 --- a/.buildkite/test-merge.yml +++ /dev/null @@ -1,487 +0,0 @@ -env: - VLLM_WORKER_MULTIPROC_METHOD: spawn - HF_HUB_DOWNLOAD_TIMEOUT: 300 - HF_HUB_ETAG_TIMEOUT: 60 - -steps: - - label: "Simple Unit Test" - depends_on: upload-merge-pipeline - commands: - - "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: - - 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Model Test" - timeout_in_minutes: 30 - depends_on: upload-merge-pipeline - commands: - - pytest -s -v tests/e2e/offline_inference/test_t2i_model.py -m "advanced_model and diffusion" --run-level "advanced_model" - agents: - queue: "gpu_1_queue" # g6.4xlarge instance on AWS, has 1 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Images API LoRA E2E" - timeout_in_minutes: 30 - depends_on: upload-merge-pipeline - commands: - - pytest -s -v tests/e2e/online_serving/test_images_generations_lora.py - agents: - queue: "gpu_1_queue" # g6.4xlarge instance on AWS, has 1 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Model CPU offloading Test" - timeout_in_minutes: 20 - depends_on: upload-merge-pipeline - commands: - # Single pytest session for one combined summary at end of log. - - pytest -s -v tests/e2e/offline_inference/test_diffusion_cpu_offload.py tests/e2e/offline_inference/test_diffusion_layerwise_offload.py - agents: - queue: "gpu_1_queue" # g6.4xlarge instance on AWS, has 1 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Cache Backend Test" - timeout_in_minutes: 15 - depends_on: upload-merge-pipeline - commands: - - 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: - - 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Sequence Parallelism Test" - timeout_in_minutes: 25 - depends_on: upload-merge-pipeline - commands: - - pytest -s -v tests/e2e/offline_inference/test_sequence_parallel.py tests/diffusion/distributed/test_ulysses_uaa_perf.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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Tensor Parallelism Test" - timeout_in_minutes: 20 - depends_on: upload-merge-pipeline - commands: - - pytest -s -v tests/e2e/offline_inference/test_zimage_parallelism.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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion GPU Worker Test" - timeout_in_minutes: 20 - depends_on: upload-merge-pipeline - commands: - - pytest -s -v tests/diffusion/test_diffusion_worker.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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Engine Test" - depends_on: upload-merge-pipeline - commands: - - | - timeout 15m bash -c ' - pytest -s -v tests/engine/test_async_omni_engine_abort.py - ' - agents: - queue: "gpu_1_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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Qwen3-TTS CustomVoice E2E Test" - depends_on: upload-merge-pipeline - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py tests/e2e/offline_inference/test_qwen3_tts_customvoice.py -m "advanced_model" --run-level "advanced_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Qwen3-TTS Base E2E Test" - depends_on: upload-merge-pipeline - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - pytest -s -v tests/e2e/online_serving/test_qwen3_tts_base.py tests/e2e/offline_inference/test_qwen3_tts_base.py -m "advanced_model" --run-level "advanced_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - # - label: "MOSS-TTS-Nano E2E Test" - # depends_on: upload-merge-pipeline - # commands: - # - | - # timeout 20m bash -c ' - # export VLLM_LOGGING_LEVEL=DEBUG - # export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - # pytest -s -v tests/e2e/online_serving/test_moss_tts_nano.py tests/e2e/offline_inference/test_moss_tts_nano.py -m "advanced_model" --run-level "advanced_model" - # ' - # agents: - # queue: "gpu_1_queue" - # plugins: - # - docker#v5.2.0: - # image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - # always-pull: true - # propagate-environment: true - # shm-size: "8gb" - # environment: - # - "HF_HOME=/fsx/hf_cache" - # volumes: - # - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Omni Model Test with H100" - timeout_in_minutes: 30 - depends_on: upload-merge-pipeline - commands: - - export VLLM_TEST_CLEAN_GPU_MEMORY="1" - - pytest -s -v tests/e2e/offline_inference/test_qwen3_omni.py tests/e2e/online_serving/test_qwen3_omni.py tests/e2e/online_serving/test_mimo_audio.py -m "advanced_model" --run-level "advanced_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Audio Streaming Input Test with H100" - timeout_in_minutes: 30 - depends_on: upload-merge-pipeline - commands: - - export VLLM_TEST_CLEAN_GPU_MEMORY="1" - - pytest -s -v tests/entrypoints/openai_api/test_qwen3_omni_realtime_websocket.py -m "advanced_model" --run-level "advanced_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Diffusion Image Edit Test with H100 (1 GPU)" - timeout_in_minutes: 20 - depends_on: upload-merge-pipeline - commands: - - pytest -s -v tests/e2e/online_serving/test_image_gen_edit.py - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Bagel Model Test with H100 (Real Weights)" - timeout_in_minutes: 60 - depends_on: upload-merge-pipeline - commands: - - | - timeout 55m bash -c ' - set -e - export VLLM_TEST_CLEAN_GPU_MEMORY=1 - export VLLM_IMAGE_FETCH_TIMEOUT=60 - pytest -s -v tests/e2e/offline_inference/test_bagel_text2img.py -m "advanced_model" --run-level "advanced_model" - pytest -s -v tests/e2e/offline_inference/test_bagel_img2img.py tests/e2e/online_serving/test_bagel_online.py -m "advanced_model" --run-level "advanced_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Omni Sleep Mode Test with H100" - timeout_in_minutes: 30 - depends_on: upload-merge-pipeline - commands: - - export VLLM_TEST_CLEAN_GPU_MEMORY="1" - - pytest -s -v tests/e2e/offline_inference/test_omni_sleep_mode.py -m "advanced_model and H100 and omni" --run-level "advanced_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Voxtral-TTS E2E Test" - timeout_in_minutes: 20 - depends_on: upload-merge-pipeline - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - pytest -s -v tests/e2e/online_serving/test_voxtral_tts.py tests/e2e/offline_inference/test_voxtral_tts.py -m "advanced_model" --run-level "advanced_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate diff --git a/.buildkite/test-nightly.yml b/.buildkite/test-nightly.yml deleted file mode 100644 index 6f206422a4b..00000000000 --- a/.buildkite/test-nightly.yml +++ /dev/null @@ -1,807 +0,0 @@ -env: - VLLM_WORKER_MULTIPROC_METHOD: spawn - HF_HUB_DOWNLOAD_TIMEOUT: 300 - HF_HUB_ETAG_TIMEOUT: 60 - -steps: - # Group: collapses under one heading in the Buildkite UI; child steps still run in parallel. - - group: ":card_index_dividers: Omni Model Test" - key: nightly-omni-test-group - depends_on: upload-nightly-pipeline - if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" || build.pull_request.labels includes "omni-test" - steps: - - label: ":full_moon: Omni · Function Test with H100" - timeout_in_minutes: 90 - commands: - - pytest -s -v tests/e2e/ -m "full_model and H100 and omni" --run-level "full_model" --ignore=tests/e2e/accuracy - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Omni · Function Test with L4" - timeout_in_minutes: 90 - commands: - - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - - pytest -s -v tests/e2e/*/test_qwen2_5_omni_expansion.py --run-level "core_model" - 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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: ":full_moon: Omni · Doc Test with L4" - timeout_in_minutes: 90 - commands: - - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - - pytest -s -v tests/examples/ -m "full_model and omni and L4" --run-level "full_model" - 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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: ":full_moon: Omni · Doc Test with H100" - timeout_in_minutes: 90 - commands: - - pytest -s -v tests/examples/ -m "full_model and omni and H100" --run-level "full_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Omni · Accuracy Test" - timeout_in_minutes: 180 - commands: - - export SEED_TTS_WER_EVAL=1 - - export SEED_TTS_EVAL_DEVICE=cuda:1 - - | - set +e - pytest -s -v tests/e2e/accuracy/qwen3_omni/test_qwen3_omni.py -m "full_model" --run-level full_model - EXIT=$$? - buildkite-agent artifact upload "tests/e2e/accuracy/qwen3_omni/results/qwen_omni_acc/*.json" - exit $$EXIT - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Omni · Perf Test" - key: nightly-omni-performance - timeout_in_minutes: 180 - commands: - - export BENCHMARK_DIR=tests/dfx/perf/results - - | - set +e - pytest -s -v tests/dfx/perf/scripts/run_benchmark.py --test-config-file tests/dfx/perf/tests/test_qwen_omni.json - EXIT=$$? - buildkite-agent artifact upload "tests/dfx/perf/results/*.json" - exit $$EXIT - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - - group: ":card_index_dividers: TTS Model Test" - key: nightly-tts-test-group - depends_on: upload-nightly-pipeline - if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" || build.pull_request.labels includes "tts-test" - steps: - - label: ":full_moon: TTS · Function Test" - timeout_in_minutes: 90 - commands: - - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - - pytest -s -v tests/e2e/ -m "full_model and L4 and omni" -k "not test_qwen2_5" --run-level "full_model" --ignore=tests/e2e/accuracy - agents: - queue: "gpu_1_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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: ":full_moon: TTS · Perf Test" - key: nightly-tts-performance - timeout_in_minutes: 180 - commands: - - export BENCHMARK_DIR=tests/dfx/perf/results - - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - - | - set +e - pytest -s -v tests/dfx/perf/scripts/run_benchmark.py --test-config-file tests/dfx/perf/tests/test_tts.json - EXIT=$$? - buildkite-agent artifact upload "tests/dfx/perf/results/*.json" - exit $$EXIT - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - # Diffusion X2I suite: x2i / x2a / x2t and related non-video paths; x2v is only in "Diffusion X2V Model Test" below. - - group: ":card_index_dividers: Diffusion X2I(&A&T) Model Test" - key: nightly-diffusion-x2iat-group - depends_on: upload-nightly-pipeline - if: >- - build.env("NIGHTLY") == "1" || - build.pull_request.labels includes "nightly-test" || - build.pull_request.labels includes "diffusion-x2iat-test" - steps: - - label: ":full_moon: Diffusion X2I(&A&T) · Function Test with H100" - timeout_in_minutes: 120 - commands: - - pytest -sv tests/e2e/ -k "not test_wan and not test_bagel_expansion and not hunyuan" -m "full_model and diffusion and H100" --run-level "full_model" --ignore=tests/e2e/accuracy - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2I(&A&T) · Bagel Function Test with H100" - timeout_in_minutes: 120 - commands: - - pytest -sv tests/e2e/online_serving/test_bagel_expansion.py -m "full_model and diffusion and H100" --run-level "full_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 3 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2I(&A&T) · Function Test with L4" - timeout_in_minutes: 60 - commands: - - pytest -sv tests/e2e/ -k "not test_wan and not test_bagel_expansion and not hunyuan" -m "full_model and diffusion and L4" --run-level "full_model" --ignore=tests/e2e/accuracy - 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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: ":full_moon: Diffusion X2I(&A&T) · Doc Test" - timeout_in_minutes: 60 - commands: - - export VLLM_TEST_CLEAN_GPU_MEMORY="1" - - pytest -s -v tests/examples/*/test_text_to_image.py -m "full_model and example and H100" --run-level "full_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2I(&A&T) · GEBench Accuracy Test" - timeout_in_minutes: 60 - commands: - - pytest -s -v tests/e2e/accuracy/test_gebench_h100_smoke.py --run-level full_model --gebench-model Qwen/Qwen-Image-2512 --accuracy-judge-model QuantTrio/Qwen3-VL-30B-A3B-Instruct-AWQ --accuracy-gpu 0 --gebench-port 8093 --accuracy-workers 1 - - buildkite-agent artifact upload "tests/e2e/accuracy/artifacts/gebench_qwen-image-2512/summary*.json" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2I(&A&T) · GEdit-Bench Accuracy Test" - timeout_in_minutes: 60 - commands: - - pytest -s -v tests/e2e/accuracy/test_gedit_bench_h100_smoke.py --run-level full_model --gedit-model Qwen/Qwen-Image-Edit --accuracy-judge-model QuantTrio/Qwen3-VL-30B-A3B-Instruct-AWQ --accuracy-gpu 0 --gedit-port 8093 --gedit-samples-per-group 20 --accuracy-workers 1 - - buildkite-agent artifact upload "tests/e2e/accuracy/artifacts/gedit_scores_qwen-image-edit/qwen-image-edit_all_all_vie_score_*.csv" - - buildkite-agent artifact upload "tests/e2e/accuracy/artifacts/gedit_scores_qwen-image-edit/qwen-image-edit_all_all_summary_*.json" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: VLLM_HTTP_TIMEOUT_KEEP_ALIVE - value: "120" - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2I(&A&T) · Accuracy Test" - timeout_in_minutes: 180 - commands: - - pytest -s -v tests/e2e/accuracy/test_qwen_image*.py --run-level full_model - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: VLLM_HTTP_TIMEOUT_KEEP_ALIVE - value: "120" - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2I(&A&T) · Perf Test" - key: nightly-diffusion-x2iat-performance - timeout_in_minutes: 180 - commands: - - export DIFFUSION_BENCHMARK_DIR=tests/dfx/perf/results - - export DIFFUSION_ATTENTION_BACKEND=FLASH_ATTN - - export CACHE_DIT_VERSION=1.3.0 - # [HACK]: run upload in the same command block as pytest. - # Because `exit` aborts the entire commands list. - - | - set +e - pytest -s -v tests/dfx/perf/scripts/run_diffusion_benchmark.py --test-config-file tests/dfx/perf/tests/test_qwen_image_vllm_omni.json - EXIT1=$$? - pytest -s -v tests/dfx/perf/scripts/run_diffusion_benchmark.py --test-config-file tests/dfx/perf/tests/test_qwen_image_edit_vllm_omni.json - EXIT2=$$? - pytest -s -v tests/dfx/perf/scripts/run_diffusion_benchmark.py --test-config-file tests/dfx/perf/tests/test_qwen_image_edit_2509_vllm_omni.json - EXIT3=$$? - pytest -s -v tests/dfx/perf/scripts/run_diffusion_benchmark.py --test-config-file tests/dfx/perf/tests/test_qwen_image_layered_vllm_omni.json - EXIT4=$$? - buildkite-agent artifact upload "tests/dfx/perf/results/diffusion_result_*.json" - buildkite-agent artifact upload "tests/dfx/perf/results/logs/*.log" - exit $$((EXIT1 | EXIT2 | EXIT3 | EXIT4)) - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 4 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - # Diffusion x2v only (Wan, HunyuanVideo, …). x2i/x2a/x2t live in the X2I group above, not here. - - group: ":card_index_dividers: Diffusion X2V Model Test" - key: nightly-diffusion-x2v-group - depends_on: upload-nightly-pipeline - if: >- - build.env("NIGHTLY") == "1" || - build.pull_request.labels includes "nightly-test" || - build.pull_request.labels includes "diffusion-x2v-test" - steps: - - label: ":full_moon: Diffusion X2V · Function Test" - timeout_in_minutes: 90 - commands: - - pytest -s -v tests/e2e/online_serving/test_wan22_expansion.py tests/e2e/online_serving/test_wan_2_1_vace_expansion.py tests/e2e/online_serving/test_hunyuan_video_15_expansion.py --run-level "full_model" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2V · Accuracy Test" - timeout_in_minutes: 180 - commands: - - pytest -s -v tests/e2e/accuracy/wan22_i2v/test_wan22_i2v_video_similarity.py -m full_model --run-level full_model - - pytest -s -v tests/e2e/accuracy/test_ltx2_3_video_similarity.py -m advanced_model --run-level advanced_model - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":full_moon: Diffusion X2V · Perf Test" - key: nightly-diffusion-x2v-performance - timeout_in_minutes: 180 - commands: - - export DIFFUSION_BENCHMARK_DIR=tests/dfx/perf/results - - export DIFFUSION_ATTENTION_BACKEND=FLASH_ATTN - - | - set +e - pytest -s -v tests/dfx/perf/scripts/run_diffusion_benchmark.py --test-config-file tests/dfx/perf/tests/test_wan22_i2v_vllm_omni.json - EXIT1=$$? - buildkite-agent artifact upload "tests/dfx/perf/results/diffusion_result_*.json" - buildkite-agent artifact upload "tests/dfx/perf/results/logs/*.log" - exit $$EXIT1 - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: ":bar_chart: Testcase Statistics" - key: nightly-testcase-statistics - timeout_in_minutes: 120 - depends_on: upload-nightly-pipeline - if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" - commands: - - python tools/nightly/buildkite_testcase_statistics.py -o tests/dfx/perf/results/buildkite_testcase_statistics.html - - buildkite-agent artifact upload "tests/dfx/perf/results/*.html" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - # No need to run this step for PRs with label nightly-test - - label: ":email: Nightly Collection & Email" - key: nightly-perf-distribution - depends_on: - - nightly-omni-performance - - nightly-tts-performance - - nightly-diffusion-x2iat-performance - - nightly-diffusion-x2v-performance - - nightly-testcase-statistics - if: build.env("NIGHTLY") == "1" - commands: - - pip install openpyxl - - export DEFAULT_INPUT_DIR=tests/dfx/perf/results - - export DEFAULT_OUTPUT_DIR=tests/dfx/perf/results - - buildkite-agent artifact download "tests/dfx/perf/results/*.json" . --step nightly-tts-performance - - buildkite-agent artifact download "tests/dfx/perf/results/*.json" . --step nightly-omni-performance - - buildkite-agent artifact download "tests/dfx/perf/results/*.json" . --step nightly-diffusion-x2iat-performance - - buildkite-agent artifact download "tests/dfx/perf/results/*.json" . --step nightly-diffusion-x2v-performance - - buildkite-agent artifact download "tests/dfx/perf/results/*.html" . --step nightly-testcase-statistics - - python tools/nightly/generate_nightly_perf_excel.py - - python tools/nightly/generate_nightly_perf_html.py - - python tools/nightly/send_nightly_email.py --report-file "tests/dfx/perf/results/*.xlsx, tests/dfx/perf/results/*.html" - - buildkite-agent artifact upload "tests/dfx/perf/results/*.xlsx" - - buildkite-agent artifact upload "tests/dfx/perf/results/*.html" - agents: - queue: "cpu_queue_premerge" diff --git a/.buildkite/test-ready.yml b/.buildkite/test-ready.yml deleted file mode 100644 index 080f18885ef..00000000000 --- a/.buildkite/test-ready.yml +++ /dev/null @@ -1,621 +0,0 @@ -env: - VLLM_WORKER_MULTIPROC_METHOD: spawn - HF_HUB_DOWNLOAD_TIMEOUT: 300 - HF_HUB_ETAG_TIMEOUT: 60 - -steps: - - label: "Simple Unit Test" - depends_on: upload-ready-pipeline - commands: - - "timeout 20m 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: - - 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "CUDA Unit Test with single card" - depends_on: upload-ready-pipeline - commands: - - timeout 10m pytest -v -s -m 'core_model and cuda and L4 and not distributed_cuda' --ignore=tests/e2e --ignore=tests/engine/test_async_omni_engine_abort.py --cov=vllm_omni --cov-branch --cov-report=term-missing --cov-report=html --cov-report=xml - agents: - queue: "gpu_1_queue" - 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" - - - label: "CUDA Unit Test with multi cards" - depends_on: upload-ready-pipeline - commands: - - timeout 10m pytest -v -s -m 'core_model and cuda and L4 and distributed_cuda' --ignore=tests/e2e --cov=vllm_omni --cov-branch --cov-report=term-missing --cov-report=html --cov-report=xml - agents: - queue: "gpu_4_queue" - 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" - - - label: "Diffusion Model Test" - depends_on: upload-ready-pipeline - commands: - - timeout 30m pytest -s -v tests/e2e/offline_inference/test_t2i_model.py -m "core_model and diffusion" --run-level "core_model" - agents: - queue: "gpu_1_queue" - 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Batching Test" - depends_on: upload-ready-pipeline - commands: - - timeout 20m pytest -s -v tests/e2e/offline_inference/test_qwen_image_diffusion_batching.py -m "core_model and diffusion" --run-level "core_model" - agents: - queue: "gpu_1_queue" # g6.4xlarge instance on AWS, has 1 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Custom Pipeline Test" - depends_on: upload-ready-pipeline - commands: - - timeout 20m pytest -s -v tests/e2e/offline_inference/custom_pipeline/ -m "core_model" - agents: - queue: "gpu_1_queue" - 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" - - - label: "Diffusion Model CPU offloading Test" - depends_on: upload-ready-pipeline - commands: - - timeout 10m pytest -s -v tests/e2e/offline_inference/test_diffusion_cpu_offload.py - agents: - queue: "gpu_1_queue" # g6.4xlarge instance on AWS, has 1 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Cache Backend Test" - depends_on: upload-ready-pipeline - commands: - - timeout 15m 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: - - 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" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Diffusion Sequence Parallelism Test" - depends_on: upload-ready-pipeline - commands: - - timeout 20m 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: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - - label: "Engine Test" - depends_on: upload-ready-pipeline - commands: - - | - timeout 15m bash -c ' - pytest -s -v tests/engine/test_async_omni_engine_abort.py - ' - agents: - queue: "gpu_1_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 - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Omni Model Test with H100" - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - pytest -s -v tests/e2e/online_serving/test_qwen3_omni.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "MiMo-Audio E2E Test with H100" - depends_on: upload-ready-pipeline - commands: - - | - timeout 30m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - pytest -s -v tests/e2e/online_serving/test_mimo_audio.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Qwen3-TTS E2E Test" - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "VoxCPM E2E Test" - timeout_in_minutes: 20 - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - pip install voxcpm - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/offline_inference/test_voxcpm.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "VoxCPM2 Native AR E2E Test" - timeout_in_minutes: 20 - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - pip install voxcpm - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - pytest -s -v tests/e2e/offline_inference/test_voxcpm2.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "OmniVoice E2E Test" - timeout_in_minutes: 20 - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - pytest -s -v tests/e2e/online_serving/test_omnivoice.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Qwen3-TTS Base E2E Test (ModelRunner V2)" - depends_on: upload-ready-pipeline - soft_fail: - - exit_status: 1 - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - export VLLM_WORKER_MULTIPROC_METHOD=spawn - export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1" - export VLLM_OMNI_USE_V2_RUNNER="1" - pytest -s -v tests/e2e/online_serving/test_qwen3_tts_base.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "gpu_1_queue" - plugins: - - docker#v5.2.0: - image: public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - always-pull: true - propagate-environment: true - shm-size: "8gb" - environment: - - "HF_HOME=/fsx/hf_cache" - - "HF_TOKEN" - volumes: - - "/fsx/hf_cache:/fsx/hf_cache" - - - label: "Voxtral-TTS E2E Test" - timeout_in_minutes: 20 - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - export VLLM_LOGGING_LEVEL=DEBUG - pytest -s -v tests/e2e/online_serving/test_voxtral_tts.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - # - label: "Diffusion Image Edit Test with H100 (1 GPU)" - # depends_on: upload-ready-pipeline - # commands: - # - | - # timeout 20m bash -c ' - # pytest -s -v tests/e2e/online_serving/test_image_gen_edit.py - # ' - # agents: - # queue: "mithril-h100-pool" - # plugins: - # - kubernetes: - # podSpec: - # containers: - # - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - # resources: - # limits: - # nvidia.com/gpu: 1 - # volumeMounts: - # - name: devshm - # mountPath: /dev/shm - # - name: hf-cache - # mountPath: /root/.cache/huggingface - # env: - # - name: HF_HOME - # value: /root/.cache/huggingface - # nodeSelector: - # node.kubernetes.io/instance-type: gpu-h100-sxm - # volumes: - # - name: devshm - # emptyDir: - # medium: Memory - # - name: hf-cache - # hostPath: - # path: /mnt/hf-cache - # type: DirectoryOrCreate - - - label: "Bagel Text2Img Model Test with H100" - depends_on: upload-ready-pipeline - commands: - - | - timeout 30m bash -c ' - export VLLM_TEST_CLEAN_GPU_MEMORY=1 - pytest -s -v tests/e2e/offline_inference/test_bagel_text2img.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Bagel Img2Img Model Test with H100" - depends_on: upload-ready-pipeline - commands: - - | - timeout 30m bash -c ' - export VLLM_TEST_CLEAN_GPU_MEMORY=1 - pytest -s -v tests/e2e/offline_inference/test_bagel_img2img.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Bagel Online Serving Test with H100" - depends_on: upload-ready-pipeline - commands: - - | - timeout 40m bash -c ' - export VLLM_TEST_CLEAN_GPU_MEMORY=1 - export VLLM_IMAGE_FETCH_TIMEOUT=60 - pytest -s -v tests/e2e/online_serving/test_bagel_online.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "CosyVoice3-TTS E2E Test" - timeout_in_minutes: 20 - depends_on: upload-ready-pipeline - commands: - - | - timeout 20m bash -c ' - pytest -s -v tests/e2e/online_serving/test_cosyvoice3_tts.py -m "core_model" --run-level "core_model" - ' - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 1 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate diff --git a/.buildkite/test-template-amd-omni.j2 b/.buildkite/test-template-amd-omni.j2 deleted file mode 100644 index 78f47d1aec0..00000000000 --- a/.buildkite/test-template-amd-omni.j2 +++ /dev/null @@ -1,62 +0,0 @@ -{# vllm-omni customized version - Based on: https://github.com/vllm-project/ci-infra/blob/main/buildkite/test-template-amd.j2 - Last synced: 2025-12-15 - Modifications: Removed unused CUDA/NVIDIA logic, keeping only AMD tests -#} -{% set docker_image_amd = "rocm/vllm-omni:$BUILDKITE_COMMIT" %} -{% set default_working_dir = "/app/vllm-omni" %} - - - group: "AMD Tests" - depends_on: ~ - steps: - - label: "AMD: :docker: build image" - depends_on: ~ - soft_fail: false - commands: - - "docker build -f docker/Dockerfile.rocm -t {{ docker_image_amd }} --target test --build-arg ARG_PYTORCH_ROCM_ARCH=gfx942 --progress plain ." - - "docker push {{ docker_image_amd }}" - key: "amd-build" - env: - DOCKER_BUILDKIT: "1" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - exit_status: -10 # Agent was lost - limit: 2 - - exit_status: 128 # Git connectivity issues - limit: 2 - - exit_status: 1 # Machine occasionally fail - limit: 1 - agents: - queue: amd-cpu - - {% for step in steps %} - {% if step.mirror_hardwares and mirror_hw in step.mirror_hardwares %} - - label: "{{ step.agent_pool }}: {{ step.label }}" - depends_on: amd-build - agents: - {% if step.agent_pool %} - queue: amd_{{ step.agent_pool }} - {% else %} - queue: amd_mi325_1 - {% endif %} -{% set cmd_body = (step.command or (step.commands | join("\n"))) | trim %} -{% set indented_cmd = cmd_body | replace("\n", "\n ") %} - command: bash .buildkite/scripts/hardware_ci/run-amd-test.sh - env: - DOCKER_BUILDKIT: "1" - TEST_COMMAND: |- - (command rocm-smi || true) && cd {{ (step.working_dir or default_working_dir) | safe }} -{% if "mi250" in step.agent_pool %} - python3 -m pip uninstall -y amd-aiter -{% endif %} - {{ indented_cmd | safe }} - priority: 100 - {% if step.grade and step.grade == "Blocking" %} - soft_fail: false - {% else %} - soft_fail: true - {% endif%} - {% endif %} - {% endfor %} diff --git a/.buildkite/test-weekly.yml b/.buildkite/test-weekly.yml deleted file mode 100644 index dba64899605..00000000000 --- a/.buildkite/test-weekly.yml +++ /dev/null @@ -1,85 +0,0 @@ -env: - VLLM_WORKER_MULTIPROC_METHOD: spawn - HF_HUB_DOWNLOAD_TIMEOUT: 300 - HF_HUB_ETAG_TIMEOUT: 60 - -steps: - - label: "Reliability Test - qwen3-omni" - timeout_in_minutes: 180 - depends_on: upload-weekly-pipeline - if: build.env("WEEKLY") == "1" || build.pull_request.labels includes "weekly-test" - commands: - - pytest -s -v tests/dfx/reliability/test_reliability_qwen3_omni.py -m "slow" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate - - - label: "Reliability Test - wan22" - timeout_in_minutes: 180 - depends_on: upload-weekly-pipeline - if: build.env("WEEKLY") == "1" || build.pull_request.labels includes "weekly-test" - commands: - - pytest -s -v tests/dfx/reliability/test_reliability_wan22.py -m "slow" - agents: - queue: "mithril-h100-pool" - plugins: - - kubernetes: - podSpec: - containers: - - image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT - resources: - limits: - nvidia.com/gpu: 2 - volumeMounts: - - name: devshm - mountPath: /dev/shm - - name: hf-cache - mountPath: /root/.cache/huggingface - env: - - name: HF_HOME - value: /root/.cache/huggingface - - name: HF_TOKEN - valueFrom: - secretKeyRef: - name: hf-token-secret - key: token - nodeSelector: - node.kubernetes.io/instance-type: gpu-h100-sxm - volumes: - - name: devshm - emptyDir: - medium: Memory - - name: hf-cache - hostPath: - path: /mnt/hf-cache - type: DirectoryOrCreate diff --git a/.claude/skills/add-diffusion-model/SKILL.md b/.claude/skills/add-diffusion-model/SKILL.md deleted file mode 100644 index 212e8b02ced..00000000000 --- a/.claude/skills/add-diffusion-model/SKILL.md +++ /dev/null @@ -1,575 +0,0 @@ ---- -name: add-diffusion-model -description: Add a new diffusion model (text-to-image, text-to-video, image-to-video, text-to-audio, image editing) to vLLM-Omni, including Cache-DiT acceleration and parallelism support (TP, SP/USP, CFG-Parallel, HSDP). Use when integrating a new diffusion model, porting a diffusers pipeline or a custom model repo to vllm-omni, creating a new DiT transformer adapter, adding diffusion model support, or enabling multi-GPU parallelism and cache acceleration for an existing model. ---- - -# Adding a Diffusion Model to vLLM-Omni - -## Overview - -This skill guides you through adding a new diffusion model to vLLM-Omni. The model may come from HuggingFace Diffusers (structured pipeline) or from a private/custom repo. The workflow differs significantly depending on the source. - -## Prerequisites - -Before starting, determine: - -1. **Model category**: Text-to-Image, Text-to-Video, Image-to-Video, Image Editing, Text-to-Audio, or Omni -2. **Reference source**: Diffusers pipeline, custom repo, or a combination -3. **Model HuggingFace ID** or local checkpoint path -4. **Architecture**: Scheduler, text encoder, VAE, transformer/backbone - -## Step 0: Classify the Migration Path - -Check the model's HF repo for `model_index.json`. This determines your path: - -| Scenario | How to identify | Migration path | -|----------|----------------|----------------| -| **Already supported** | `_class_name` in `model_index.json` matches a key in `_DIFFUSION_MODELS` in `registry.py` | Skip to Step 5 (test) and Step 7 (docs) | -| **Diffusers-based** | Has standard `model_index.json` with `_diffusers_version`, subfolders for `transformer/`, `vae/`, etc. | Follow **Path A** below | -| **Custom/private repo** | No diffusers `model_index.json`, weights in non-standard format, custom model code in a separate git repo | Follow **Path B** below | -| **Hybrid** | Has some diffusers components (VAE) but custom transformer/fusion | Mix of Path A and Path B | - -## Path A: Diffusers-Based Model - -For models with a standard diffusers layout. See [references/transformer-adaptation.md](references/transformer-adaptation.md) for detailed code patterns. - -### A1. Analyze `model_index.json` - -Identify components: `transformer`, `scheduler`, `vae`, `text_encoder`, `tokenizer`. - -### A2. Create model directory - -``` -vllm_omni/diffusion/models/your_model_name/ -├── __init__.py -├── pipeline_your_model.py -└── your_model_transformer.py -``` - -### A3. Adapt transformer - -1. Copy from diffusers source. Remove mixins (`ModelMixin`, `ConfigMixin`, `AttentionModuleMixin`). -2. Replace attention with `vllm_omni.diffusion.attention.layer.Attention` (QKV shape: `[B, seq, heads, head_dim]`). -3. Add `od_config: OmniDiffusionConfig | None = None` to `__init__`. -4. Add `load_weights()` method mapping diffusers weight names to vllm-omni names. -5. Add class attributes: `_repeated_blocks`, `_layerwise_offload_blocks_attr`. - -### A4. Adapt pipeline - -Inherit from `nn.Module`. The key contract: - -```python -class YourPipeline(nn.Module): - def __init__(self, *, od_config: OmniDiffusionConfig, prefix: str = ""): - # Load VAE, text encoder, tokenizer via from_pretrained() - # Instantiate transformer (weights loaded later via weights_sources) - self.weights_sources = [ - DiffusersPipelineLoader.ComponentSource( - model_or_path=od_config.model, subfolder="transformer", - prefix="transformer.", fall_back_to_pt=True)] - - def forward(self, req: OmniDiffusionRequest) -> DiffusionOutput: - # Encode prompt → prepare latents → denoise loop → VAE decode - return DiffusionOutput(output=output) - - def load_weights(self, weights): - return AutoWeightsLoader(self).load_weights(weights) -``` - -Add post/pre-process functions in the same pipeline file. Register them in `registry.py`. - -### A5. Register, test, docs → continue at Step 4 below. - ---- - -## Path B: Custom/Private Repo Model - -For models without a diffusers pipeline — weights in custom format, model code in a private repo. Real examples: DreamID-Omni, BAGEL, HunyuanImage3. - -### B1. Understand the reference repo - -Study the original model's code to identify: -- **Model architecture files** (transformers, fusion modules, embeddings) -- **Weight format** (safetensors, `.pth`, custom checkpoint structure) -- **Weight loading helpers** (custom init functions, checkpoint loaders) -- **Pre/post-processing** (image/audio transforms, tokenization, VAE encode/decode) -- **External dependencies** (packages not on PyPI) -- **Config format** (JSON config files, hardcoded dicts) - -### B2. Decide what lives WHERE - -This is the key design decision for custom models. Follow these placement rules: - -| Code type | Where to place | Example | -|-----------|---------------|---------| -| **Pipeline orchestration** (init, forward, denoise loop) | `vllm_omni/diffusion/models//pipeline_.py` | Always required | -| **Custom transformer/backbone** (ported and adapted to vllm-omni) | `vllm_omni/diffusion/models//_transformer.py` or similar | `wan2_2.py`, `fusion.py`, `bagel_transformer.py` | -| **Custom sub-models** (VAE, fusion, autoencoder) | `vllm_omni/diffusion/models//` as separate files | `autoencoder.py`, `fusion.py` | -| **External dependency code** (original repo utilities) | **External repo**, installed via download script or pip | `dreamid_omni` package via git clone | -| **Hardcoded model configs** | Module-level dicts in pipeline file | `VIDEO_CONFIG`, `AUDIO_CONFIG` dicts | -| **Download/setup script** | `examples/offline_inference//download_.py` | `download_dreamid_omni.py` | -| **Custom `model_index.json`** | Generated by download script, placed at model root | Minimal: `{"_class_name": "YourPipeline", ...}` | - -### B3. Handle external dependencies - -If the model's code lives in a separate git repo: - -**Option 1: Import with graceful fallback** (recommended for models with external utils) - -```python -try: - from external_model.utils import init_vae, load_checkpoint -except ImportError: - raise ImportError( - "Failed to import from dependency 'external_model'. " - "Please run the download script first." - ) -``` - -**Option 2: Port the code directly** (preferred when feasible) - -Copy the essential model files into `vllm_omni/diffusion/models//` and adapt them. This avoids external dependencies. BAGEL does this — `autoencoder.py` and `bagel_transformer.py` are ported directly. - -**Decision criteria**: Port if the code is self-contained and won't diverge. Use external deps if the model repo is actively maintained and the code is complex. - -### B4. Handle custom weight loading - -Custom models have two patterns for weight loading: - -**Pattern 1: Bypass standard loader** (DreamID-Omni style) - -When the original model has complex custom init functions that load weights in `__init__`: - -```python -class CustomPipeline(nn.Module): - def __init__(self, *, od_config, prefix=""): - super().__init__() - model = od_config.model - # Load everything eagerly in __init__ using custom helpers - self.vae = custom_init_vae(model, device=self.device) - self.text_encoder = custom_init_text_encoder(model, device=self.device) - self.transformer = CustomFusionModel(CONFIG) - load_custom_checkpoint(self.transformer, - checkpoint_path=os.path.join(model, "model.safetensors")) - # NO weights_sources defined — bypasses standard loader - - def load_weights(self, weights): - pass # No-op — all weights loaded in __init__ -``` - -**Pattern 2: Use standard loader with custom `load_weights`** (BAGEL style) - -When weights are in safetensors format but need name remapping: - -```python -class CustomPipeline(nn.Module): - def __init__(self, *, od_config, prefix=""): - super().__init__() - # Instantiate model architecture without weights - self.bagel = BagelModel(config) - self.vae = AutoEncoder(ae_params) - - # Point loader at the safetensors in the model root - self.weights_sources = [ - DiffusersPipelineLoader.ComponentSource( - model_or_path=od_config.model, - subfolder=None, # weights at root, not in subfolder - prefix="", - fall_back_to_pt=False, - ) - ] - - def load_weights(self, weights): - # Custom name remapping for non-diffusers weight names - params = dict(self.named_parameters()) - loaded = set() - for name, tensor in weights: - # Remap original weight names to vllm-omni module names - name = self._remap_weight_name(name) - if name in params: - default_weight_loader(params[name], tensor) - loaded.add(name) - return loaded -``` - -### B5. Create the `model_index.json` - -Custom models need a `model_index.json` at the model root for vllm-omni to discover them. For custom models, this is minimal: - -```json -{ - "_class_name": "YourModelPipeline", - "custom_key": "path/to/custom_weights.safetensors" -} -``` - -The `_class_name` must match a key in `_DIFFUSION_MODELS` in `registry.py`. Additional keys are model-specific (accessed via `od_config.model_config`). - -If the model's weights come from multiple HF repos, write a **download script** that: -1. Downloads from each repo -2. Assembles into a single directory -3. Generates `model_index.json` -4. Installs any external dependencies (git clone + `.pth` file) - -Place at: `examples/offline_inference//download_.py` - -### B6. Handle multi-modal inputs - -If the model accepts images, audio, or other multi-modal inputs, implement the protocol classes from `vllm_omni/diffusion/models/interface.py`: - -```python -from vllm_omni.diffusion.models.interface import SupportImageInput, SupportAudioInput - -class MyPipeline(nn.Module, SupportImageInput, SupportAudioInput): - # Protocol markers — the engine uses these to enable proper input routing - pass -``` - -Preprocessing for custom models is typically done **inside `forward()`** rather than via registered pre-process functions, since the logic is often tightly coupled to the model. - -### B7. Continue at Step 4 below. - ---- - -## Common Steps (Both Paths) - -### Step 4: Register Model in registry.py - -Edit `vllm_omni/diffusion/registry.py`: - -```python -_DIFFUSION_MODELS = { - "YourModelPipeline": ("your_model_name", "pipeline_your_model", "YourModelPipeline"), -} -_DIFFUSION_POST_PROCESS_FUNCS = { - "YourModelPipeline": "get_your_model_post_process_func", # if applicable -} -_DIFFUSION_PRE_PROCESS_FUNCS = { - "YourModelPipeline": "get_your_model_pre_process_func", # if applicable -} -``` - -The registry key is the `_class_name` from `model_index.json`. The tuple is `(folder_name, module_file, class_name)`. - -Create `__init__.py` exporting the pipeline class and any factory functions. - -### Step 5: Run, Test, Debug - -Use the appropriate existing example script: - -| Category | Script | -|----------|--------| -| Text-to-Image | `examples/offline_inference/text_to_image/text_to_image.py` | -| Text-to-Video | `examples/offline_inference/text_to_video/text_to_video.py` | -| Image-to-Video | `examples/offline_inference/image_to_video/image_to_video.py` | -| Image-to-Image | `examples/offline_inference/image_to_image/image_edit.py` | -| Text-to-Audio | `examples/offline_inference/text_to_audio/text_to_audio.py` | - -For custom/Omni models that don't fit these categories, create a dedicated example script. - -**Validation**: No errors, output is meaningful, quality matches reference implementation. - -See [references/troubleshooting.md](references/troubleshooting.md) for common errors. - -### Step 6: Add Example Scripts - -For Omni or custom models, create: -- `examples/offline_inference/your_model_name/` — offline script + README -- `examples/online_serving/your_model_name/` — server script + client -- Download script if weights require assembly from multiple sources - -### Step 7: Update Documentation - -Required updates: -1. `docs/user_guide/diffusion/parallelism_acceleration.md` — parallelism support table -2. `docs/user_guide/diffusion/cpu_offload_diffusion.md` — if CPU offload supported (add to supported models table) -3. `docs/user_guide/diffusion/teacache.md` — if TeaCache supported -4. `docs/user_guide/diffusion/cache_dit_acceleration.md` — if Cache-DiT supported -5. `examples/offline_inference/xxx/README.md` — offline example docs -6. `examples/online_serve/xxx/README.md` — online serve docs - -### Step 8: Add E2E Tests (Recommended) - -Create `tests/e2e/online_serving/test_your_model_expansion.py`. - -### Step 9: Add Cache-DiT Acceleration - -Cache-DiT accelerates inference by caching intermediate computation results across denoising steps. After your model is working correctly on a single GPU, add cache-dit support. - -See [references/cache-dit-patterns.md](references/cache-dit-patterns.md) for detailed code patterns. - -#### 9a. Determine your model type - -| Model Type | Description | Action | -|------------|-------------|--------| -| **Standard single-transformer** | One transformer with one `ModuleList` of blocks | No code needed — `CacheDiTBackend` auto-detects via `enable_cache_for_dit()` | -| **Multi-block-list** | One transformer with multiple block lists (e.g., `transformer_blocks` + `single_transformer_blocks`) | Write custom enabler with `BlockAdapter` | -| **Dual-transformer** | Two transformers (e.g., high-noise + low-noise) | Write custom enabler with `BlockAdapter` wrapping both | - -#### 9b. Standard models — verify automatic support - -For standard single-transformer models, test directly: - -```python -omni = Omni( - model="your-model-name", - cache_backend="cache_dit", - cache_config={ - "Fn_compute_blocks": 1, - "Bn_compute_blocks": 0, - "max_warmup_steps": 4, - } -) -``` - -Check logs for "Cache-dit enabled successfully on xxx". If it works, skip to Step 9e. - -#### 9c. Custom architectures — write a custom enabler - -For multi-block-list or dual-transformer models, write a custom enabler function: - -```python -from cache_dit import BlockAdapter, ForwardPattern, ParamsModifier, DBCacheConfig - -def enable_cache_for_your_model(pipeline, cache_config): - db_cache_config = DBCacheConfig( - num_inference_steps=None, - 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, - ) - - cache_dit.enable_cache( - BlockAdapter( - transformer=pipeline.transformer, - blocks=[ - pipeline.transformer.transformer_blocks, - pipeline.transformer.single_transformer_blocks, - ], - forward_pattern=[ForwardPattern.Pattern_1, ForwardPattern.Pattern_1], - params_modifiers=[ParamsModifier(...)], - ), - cache_config=db_cache_config, - ) - - def refresh_cache_context(pipeline, num_inference_steps, verbose=True): - cache_dit.refresh_context( - pipeline.transformer, num_inference_steps=num_inference_steps, verbose=verbose - ) - return refresh_cache_context -``` - -#### 9d. Register the custom enabler - -Add your enabler to `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, - "YourModelPipeline": enable_cache_for_your_model, # Add here -} -``` - -#### 9e. Test Cache-DiT - -```python -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) logs show cache enabled, 2) 1.5-2x speedup, 3) output quality acceptable vs baseline. - -If quality degrades, lower `residual_diff_threshold` (try 0.12-0.18) or increase `max_warmup_steps` (try 6-8). - ---- - -### Step 10: Add Parallelism Support - -After the model works on a single GPU, add multi-GPU parallelism. Add each type incrementally, testing after each addition. - -See [references/parallelism-patterns.md](references/parallelism-patterns.md) for detailed code patterns and API reference. - -**Recommended order**: TP → SP/USP → CFG Parallel → HSDP - -#### 10a. Tensor Parallelism (TP) - -Shards DiT linear layers across GPUs. Requires code changes in the transformer. - -**What to change in the transformer**: -1. Replace `nn.Linear` with `ColumnParallelLinear` / `RowParallelLinear` / `QKVParallelLinear` -2. Update `load_weights()` to handle QKV fusion with `stacked_params_mapping` -3. Use `self.to_qkv.num_heads` (local heads) instead of total heads for split sizes - -```python -from vllm.model_executor.layers.linear import ( - QKVParallelLinear, RowParallelLinear, ColumnParallelLinear, -) - -# Attention: QKV → RowParallel output -self.to_qkv = QKVParallelLinear(dim, head_dim, num_heads, num_kv_heads) -self.to_out = RowParallelLinear(dim, dim, input_is_parallel=True) - -# FFN: ColumnParallel → RowParallel -self.w1 = ColumnParallelLinear(dim, ffn_dim) -self.w2 = RowParallelLinear(ffn_dim, dim, input_is_parallel=True) -``` - -**Constraints**: `num_heads % tp_size == 0` and `num_kv_heads % tp_size == 0`. - -**Test**: `--tensor-parallel-size 2` - -#### 10b. Sequence Parallelism (SP / USP) - -Splits sequence tokens across GPUs. Non-intrusive via `_sp_plan` on the transformer class — no changes to `forward()`. - -**What to change in the transformer**: - -Add `_sp_plan` class attribute: - -```python -from vllm_omni.diffusion.distributed.sp_plan import ( - SequenceParallelInput, SequenceParallelOutput, -) - -class YourTransformer(nn.Module): - _sp_plan = { - "blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), - }, - "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), - } -``` - -If inline tensor ops (e.g., `torch.cat`) exist between shard/gather points, extract them into `nn.Module` submodules so hooks can intercept them. - -For RoPE that needs splitting, add an entry for the RoPE module with `split_output=True`. - -**Test**: `--ulysses-degree 2` (offline) or `--usp 2` (online serving) - -#### 10c. CFG Parallel - -Distributes positive/negative CFG branches across 2 GPUs. Requires the pipeline to inherit `CFGParallelMixin`. - -**What to change in the pipeline**: - -```python -from vllm_omni.diffusion.distributed.cfg_parallel import CFGParallelMixin - -class YourPipeline(nn.Module, CFGParallelMixin): - def diffuse(self, ...) -> torch.Tensor: - for i, t in enumerate(timesteps): - positive_kwargs = {...} - negative_kwargs = {...} if do_true_cfg else None - noise_pred = self.predict_noise_maybe_with_cfg( - do_true_cfg=do_true_cfg, true_cfg_scale=cfg_scale, - positive_kwargs=positive_kwargs, negative_kwargs=negative_kwargs, - ) - latents = self.scheduler_step_maybe_with_cfg( - noise_pred, t, latents, do_true_cfg - ) - return latents -``` - -Override `predict_noise()` if your transformer call is non-standard. Override `combine_cfg_noise()` for multi-output models (e.g., video + audio). - -**Constraint**: Exactly 2 GPUs. Only for models using classifier-free guidance. - -**Test**: `--cfg-parallel-size 2` - -#### 10d. HSDP (Hybrid Sharded Data Parallel) - -Shards transformer weights via PyTorch FSDP2 to reduce per-GPU VRAM. No code changes to the forward pass — just add a class attribute. - -**What to change in the transformer**: - -```python -class YourTransformer(nn.Module): - @staticmethod - def _is_transformer_block(name: str, module) -> bool: - return "blocks" in name and name.split(".")[-1].isdigit() - - _hsdp_shard_conditions = [_is_transformer_block] -``` - -**Constraint**: Cannot combine with TP. For standalone HSDP, set `hsdp_shard_size` explicitly. - -**Test**: `--use-hsdp` or `DiffusionParallelConfig(use_hsdp=True)` - -#### 10e. Update parallelism documentation - -After adding parallelism support, update: -1. `docs/user_guide/diffusion/parallelism_acceleration.md` — add your model to the support table -2. Record which parallelism methods are supported (USP, Ring, CFG, TP, HSDP, VAE-Patch) - -### Step 11: Add CPU Offload Support - -Implement `SupportsModuleOffload` on your pipeline class to enable -`--enable-cpu-offload` and `--enable-layerwise-offload`. The protocol -declares which submodules the offloader should manage: - -```python -from typing import ClassVar -from vllm_omni.diffusion.models.interface import SupportsModuleOffload - -class YourPipeline(nn.Module, SupportsModuleOffload): - _dit_modules: ClassVar[list[str]] = ["transformer"] - _encoder_modules: ClassVar[list[str]] = ["text_encoder"] - _vae_modules: ClassVar[list[str]] = ["vae"] - _resident_modules: ClassVar[list[str]] = [] # optional -``` - -- `_dit_modules`: denoising submodules (kept on GPU during diffusion loop) -- `_encoder_modules`: encoder/vision submodules (offloaded to CPU during diffusion loop) -- `_vae_modules`: VAE(s) (handled by both sequential and layerwise backends) -- `_resident_modules`: additional modules to pin on GPU during layerwise - offloading (e.g. embedders, connectors). Only used by the layerwise - backend. Optional — defaults to `[]`. - -All attribute names support dotted paths for nested submodules -(e.g. `"pipe.transformer"`, `"bagel.time_embedder"`). - -Pipelines without `SupportsModuleOffload` fall back to scanning -well-known attribute names (`transformer`, `text_encoder`, `vae`, -etc.), which fails for non-standard names. - -### Step 12: Performance Profiling - -After verifying correctness and implementing parallelism/caching, profile the model's performance to identify bottlenecks and ensure optimal execution. - -See the [Profiling Single-Stage Diffusion](../../../docs/contributing/profiling.md#3-profiling-single-stage-diffusion) guide for detailed instructions on: -1. Using the PyTorch profiler (`profiler: "torch"`) to capture detailed CPU/CUDA traces. -2. Using Nsight Systems (`nsys`) with `profiler: "cuda"` for low-overhead CUDA traces. -3. Controlling profiling via `omni.start_profile()` and `omni.stop_profile()`. - ---- - -## Iterative Development Tips - -1. **Start minimal**: Basic generation first, no parallelism/caching -2. **Use `--enforce-eager`**: Disable torch.compile during debugging -3. **Use small models**: Test with smaller variants first -4. **Check tensor shapes**: Most errors are reshape mismatches in attention -5. **Add features incrementally**: Single GPU → TP → SP → CFG → HSDP → Cache-DiT -6. **For custom models**: Get the model running with the original code first, then progressively replace components with vllm-omni equivalents -7. **Cache-DiT before parallelism tuning**: Cache-DiT is lossy — verify quality at baseline before combining with parallelism -8. **Combine lossless + lossy**: e.g., TP + SP + Cache-DiT for maximum throughput - -## Reference Files - -- [Transformer Adaptation](references/transformer-adaptation.md) — porting transformers from diffusers -- [Custom Model Patterns](references/custom-model-patterns.md) — patterns for non-diffusers models -- [Parallelism Patterns](references/parallelism-patterns.md) — TP, SP/USP, CFG parallel, HSDP implementation details -- [Cache-DiT Patterns](references/cache-dit-patterns.md) — cache-dit acceleration for standard and custom architectures -- [Troubleshooting](references/troubleshooting.md) — common errors and fixes diff --git a/.claude/skills/add-diffusion-model/references/cache-dit-patterns.md b/.claude/skills/add-diffusion-model/references/cache-dit-patterns.md deleted file mode 100644 index d34ce0e0f43..00000000000 --- a/.claude/skills/add-diffusion-model/references/cache-dit-patterns.md +++ /dev/null @@ -1,254 +0,0 @@ -# Cache-DiT Patterns Reference - -## Overview - -Cache-DiT accelerates Diffusion Transformers by caching intermediate computation results across denoising steps. Adjacent steps produce similar features, so redundant computations can be skipped. - -Three caching strategies: -- **DBCache**: Dynamic block-level caching — selectively computes or caches transformer blocks based on residual differences -- **TaylorSeer**: Calibration-based prediction using Taylor expansion to estimate block outputs -- **SCM** (Step Computation Masking): Dynamic step skipping based on configurable policies - -**Typical speedup**: 1.5-2.5x depending on model and configuration. - -**Official docs**: https://docs.vllm.ai/projects/vllm-omni/en/latest/design/feature/cache_dit - -## Architecture - -vLLM-Omni integrates cache-dit through `CacheDiTBackend`: - -| Component | Purpose | -|-----------|---------| -| `CacheDiTBackend` | Unified backend — auto-selects enabler (standard or custom) | -| `enable_cache_for_dit()` | Default enabler for standard single-transformer models | -| `CUSTOM_DIT_ENABLERS` dict | Registry of custom enablers keyed by pipeline class name | -| `BlockAdapter` | Wraps complex architectures (multi-block-list or multi-transformer) | -| `ForwardPattern` | Specifies block forward signature: `Pattern_0`, `Pattern_1`, `Pattern_2` | -| `ParamsModifier` | Per-transformer or per-block-list config customization | -| `DBCacheConfig` | Configuration for DBCache parameters | -| `cache_dit.refresh_context()` | Updates cache context when `num_inference_steps` changes | - -**Source files**: -- `vllm_omni/diffusion/cache/cache_dit_backend.py` — `CacheDiTBackend`, enablers, `CUSTOM_DIT_ENABLERS` -- `vllm_omni/diffusion/cache/` — cache backend implementations - -## Standard Models: Automatic Support - -Most DiT models follow this pattern: -- Single transformer with one `nn.ModuleList` of blocks -- Standard forward signature -- Compatible with cache-dit's automatic detection - -**Examples**: Qwen-Image, Z-Image, FLUX - -No code changes needed. `CacheDiTBackend` automatically uses `enable_cache_for_dit()`: - -```python -from vllm_omni import Omni - -omni = Omni( - model="Qwen/Qwen-Image", - 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, cache_config): - db_cache_config = DBCacheConfig( - num_inference_steps=None, - 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, - ) - - cache_dit.enable_cache(pipeline.transformer, cache_config=db_cache_config) - - def refresh_cache_context(pipeline, num_inference_steps, verbose=True): - cache_dit.refresh_context( - pipeline.transformer, num_inference_steps=num_inference_steps, verbose=verbose - ) - return refresh_cache_context -``` - -## Custom Architectures: Writing Custom Enablers - -### When you need a custom enabler - -- Model has multiple block lists in one transformer (e.g., `transformer_blocks` + `single_transformer_blocks`) -- Model has two transformers (e.g., high-noise + low-noise like Wan2.2) -- Model uses non-standard block forward signature - -### Pattern 1: Multi-Block-List (LongCat-Image style) - -Single transformer with two block lists: - -```python -import cache_dit -from cache_dit import BlockAdapter, ForwardPattern, ParamsModifier, DBCacheConfig - -def enable_cache_for_your_model(pipeline, cache_config): - db_cache_config = DBCacheConfig( - num_inference_steps=None, - 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, - ) - - cache_dit.enable_cache( - BlockAdapter( - transformer=pipeline.transformer, - blocks=[ - pipeline.transformer.transformer_blocks, - pipeline.transformer.single_transformer_blocks, - ], - forward_pattern=[ForwardPattern.Pattern_1, ForwardPattern.Pattern_1], - params_modifiers=[ParamsModifier(...)], - ), - cache_config=db_cache_config, - ) - - def refresh_cache_context(pipeline, num_inference_steps, verbose=True): - cache_dit.refresh_context( - pipeline.transformer, num_inference_steps=num_inference_steps, verbose=verbose - ) - return refresh_cache_context -``` - -For single transformer with multiple block lists, `refresh_context` works the same as standard models — call it once on the transformer. - -### Pattern 2: Dual-Transformer (Wan2.2 style) - -Two transformers with separate configs: - -```python -def enable_cache_for_dual_transformer(pipeline, cache_config): - db_cache_config = DBCacheConfig(...) - - cache_dit.enable_cache( - BlockAdapter( - transformer=[pipeline.transformer, pipeline.transformer_2], - blocks=[pipeline.transformer.blocks, pipeline.transformer_2.blocks], - forward_pattern=[ForwardPattern.Pattern_2, ForwardPattern.Pattern_2], - params_modifiers=[ - ParamsModifier(...), # Config for transformer 1 - ParamsModifier(...), # Config for transformer 2 - ], - ), - cache_config=db_cache_config, - ) - - 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, verbose=verbose - ) - cache_dit.refresh_context( - pipeline.transformer_2, num_inference_steps=low_steps, verbose=verbose - ) - return refresh_cache_context -``` - -Key difference: `refresh_context` must be called on **each transformer separately** with its own step count. - -### Choosing the ForwardPattern - -| Pattern | Block forward signature | Example models | -|---------|------------------------|----------------| -| `Pattern_0` | `block(hidden_states, **kwargs)` → residual added inside block | Default | -| `Pattern_1` | `block(hidden_states, **kwargs)` → returns `(hidden_states, ...)` tuple | FLUX-style single blocks | -| `Pattern_2` | `block(hidden_states, **kwargs)` → `(hidden_states, ...)` with different residual pattern | Wan2.2 blocks | - -Inspect your block's `forward()` return type and residual connection pattern to choose the right one. See [Cache-DiT API Reference](https://cache-dit.readthedocs.io/en/latest/user_guide/CACHE_API/) for details. - -## Registering Custom Enablers - -Add your enabler to `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, - "YourModelPipeline": enable_cache_for_your_model, -} -``` - -The key must match `pipeline.__class__.__name__`. - -## Configuration Parameters - -| Parameter | Default | Description | -|-----------|---------|-------------| -| `Fn_compute_blocks` | 1 | Number of blocks to always compute at the front | -| `Bn_compute_blocks` | 0 | Number of blocks to always compute at the back | -| `max_warmup_steps` | 4 | Steps to run without caching at the beginning | -| `max_cached_steps` | — | Max total cached steps | -| `max_continuous_cached_steps` | — | Max consecutive cached steps | -| `residual_diff_threshold` | 0.24 | Threshold for deciding whether to cache a block | - -### Tuning for quality vs speed - -| Goal | Adjustments | -|------|-------------| -| **More speed, acceptable quality loss** | Higher `residual_diff_threshold` (0.24-0.4), lower `max_warmup_steps` (2-4) | -| **Better quality, less speed** | Lower `residual_diff_threshold` (0.12-0.18), higher `max_warmup_steps` (6-8), lower `max_continuous_cached_steps` (2) | - -## Testing - -```python -from vllm_omni import Omni -from vllm_omni.inputs.data import OmniDiffusionSamplingParams - -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), -) -``` - -CLI (online serving): - -```bash -vllm serve your-model --omni --port 8098 \ - --cache-backend cache_dit \ - --cache-config '{"Fn_compute_blocks": 1, "Bn_compute_blocks": 0, "max_warmup_steps": 4}' -``` - -**Verification checklist**: -1. Logs show "Cache-dit enabled successfully on xxx" -2. Performance: 1.5-2x speedup vs no cache -3. Quality: compare output with `cache_backend=None` - -## Excluded Models - -Models listed in `_NO_CACHE_ACCELERATION` in `vllm_omni/diffusion/registry.py` do not support cache-dit (e.g., `NextStep11Pipeline`, `StableDiffusionPipeline`). Check this set before attempting to enable cache-dit. - -## Reference Implementations - -| Model | Path | Notes | -|-------|------|-------| -| Standard DiT | `cache_dit_backend.py::enable_cache_for_dit` | Default enabler, automatic | -| Wan2.2 | `cache_dit_backend.py::enable_cache_for_wan22` | Dual-transformer, auto-detects mode | -| LongCat | `cache_dit_backend.py::enable_cache_for_longcat_image` | Multi-block-list | -| BAGEL | `cache_dit_backend.py::enable_cache_for_bagel` | Complex omni model | diff --git a/.claude/skills/add-diffusion-model/references/custom-model-patterns.md b/.claude/skills/add-diffusion-model/references/custom-model-patterns.md deleted file mode 100644 index 2434e0b5da0..00000000000 --- a/.claude/skills/add-diffusion-model/references/custom-model-patterns.md +++ /dev/null @@ -1,273 +0,0 @@ -# Custom Model Patterns Reference - -Patterns for adding models that don't come from the standard diffusers pipeline format. - -## Directory Structure Comparison - -### Diffusers-based model (e.g., Wan2.2) - -``` -vllm_omni/diffusion/models/wan2_2/ -├── __init__.py # Exports pipeline + transformer + helpers -├── pipeline_wan2_2.py # Pipeline: loads components via from_pretrained() -├── pipeline_wan2_2_i2v.py # Variant pipeline for image-to-video -└── wan2_2_transformer.py # Transformer: ported from diffusers, uses Attention layer -``` - -The transformer is loaded separately via `weights_sources` + `load_weights()`. Non-transformer components (VAE, text encoder) are loaded in `__init__` via `from_pretrained()`. - -### Custom model with external deps (e.g., DreamID-Omni) - -``` -vllm_omni/diffusion/models/dreamid_omni/ -├── __init__.py # Exports pipeline only -├── pipeline_dreamid_omni.py # Pipeline: loads ALL weights in __init__ via custom helpers -├── fusion.py # Custom fusion architecture (video + audio cross-attention) -└── wan2_2.py # Re-implemented Wan backbone with split API - -examples/offline_inference/x_to_video_audio/ -└── download_dreamid_omni.py # Downloads weights from 3 HF repos + clones code repo -``` - -All weights loaded eagerly in `__init__`. `load_weights()` is a no-op. External dependency (`dreamid_omni` package) imported with try/except. - -### Custom model with ported code (e.g., BAGEL) - -``` -vllm_omni/diffusion/models/bagel/ -├── __init__.py -├── pipeline_bagel.py # Pipeline: instantiates models, uses weights_sources -├── bagel_transformer.py # Full LLM backbone (Qwen2-MoT) ported into vllm-omni -└── autoencoder.py # Custom VAE ported from original repo -``` - -Model code is fully ported (no external dependency). Uses `weights_sources` and `load_weights()` with custom name remapping to handle non-diffusers safetensors format. - -## Weight Loading Patterns - -### Pattern 1: Standard diffusers flow (Wan2.2, Z-Image, FLUX) - -``` -init → create transformer (empty) → set weights_sources → [loader calls load_weights()] -``` - -- `weights_sources` points to safetensors in HF subfolder (e.g., `transformer/`) -- `load_weights()` receives `(name, tensor)` pairs from the loader -- Name remapping handles diffusers→vllm-omni differences (QKV fusion, Sequential index removal) - -### Pattern 2: Custom safetensors at root (BAGEL) - -``` -init → create all models (empty) → set weights_sources(subfolder=None) → [loader calls load_weights()] -``` - -- `weights_sources` points to **root** of model directory, not a subfolder -- Weights have non-diffusers names (e.g., `bagel.language_model.model.layers.0.self_attn.q_proj.weight`) -- `load_weights()` does heavy name normalization - -```python -self.weights_sources = [ - DiffusersPipelineLoader.ComponentSource( - model_or_path=od_config.model, - subfolder=None, # root directory - prefix="", # no prefix stripping - fall_back_to_pt=False, - ) -] -``` - -### Pattern 3: Fully custom loading (DreamID-Omni) - -``` -init → load ALL weights eagerly via custom helpers → load_weights() = no-op -``` - -- No `weights_sources` attribute — standard loader finds nothing to iterate -- Custom init functions (e.g., `init_wan_vae_2_2()`, `load_fusion_checkpoint()`) handle downloading and loading -- `load_weights()` is `pass` -- Weights may come from multiple HF repos in different formats (`.pth`, `.safetensors`) - -Use this when: -- The original model has complex, well-tested loading code you don't want to rewrite -- Weights span multiple HF repos -- Weight format is non-standard (e.g., a single `.pth` file, not sharded safetensors) - -## model_index.json for Custom Models - -Standard diffusers `model_index.json`: -```json -{ - "_class_name": "WanPipeline", - "_diffusers_version": "0.35.0.dev0", - "scheduler": ["diffusers", "UniPCMultistepScheduler"], - "transformer": ["diffusers", "WanTransformer3DModel"], - "vae": ["diffusers", "AutoencoderKLWan"] -} -``` - -Custom model `model_index.json` (minimal): -```json -{ - "_class_name": "DreamIDOmniPipeline", - "fusion": "DreamID-Omni/dreamid_omni.safetensors" -} -``` - -The only **required** field is `_class_name` — it must match a key in `_DIFFUSION_MODELS` in `registry.py`. Other fields are model-specific and accessible via `od_config.model_config` dict. - -## External Dependency Management - -### Git clone + .pth injection (DreamID-Omni pattern) - -```python -def download_dependency(): - CACHE_DIR.mkdir(parents=True, exist_ok=True) - with open(LOCK_FILE, "w") as f: - fcntl.flock(f, fcntl.LOCK_EX) - if not DEPENDENCY_DIR.exists(): - subprocess.run([ - "git", "clone", "--depth", "1", - REPO_URL, "--branch", BRANCH, - str(DEPENDENCY_DIR) - ], check=True) - fcntl.flock(f, fcntl.LOCK_UN) - - # Add to Python path via .pth file - site_packages = Path(site.getsitepackages()[0]) - pth_file = site_packages / "vllm_omni_dependency.pth" - pth_file.write_text(str(DEPENDENCY_DIR)) -``` - -### Direct port (BAGEL pattern) - -Copy essential files from the original repo into `vllm_omni/diffusion/models//`. Adapt imports to use vllm-omni utilities. Benefits: no external dependency, no git clone step. Drawback: must maintain the ported code. - -## Multi-Modal Input/Output Protocols - -Custom models that handle images, audio, or video I/O should implement protocol classes: - -```python -from vllm_omni.diffusion.models.interface import ( - SupportImageInput, # Model accepts image input - SupportAudioInput, # Model accepts audio input - SupportAudioOutput, # Model produces audio output -) - -class MyPipeline(nn.Module, SupportImageInput, SupportAudioInput, SupportAudioOutput): - pass # Protocol markers enable proper engine routing -``` - -The engine checks `isinstance(pipeline, SupportImageInput)` at startup to configure input validation and warmup behavior. - -## Hardcoded Config vs Config Files - -Diffusers models use `config.json` in each subfolder. Custom models often use: - -**Module-level config dicts** (DreamID-Omni): -```python -VIDEO_CONFIG = { - "patch_size": [1, 2, 2], "model_type": "ti2v", - "dim": 3072, "ffn_dim": 14336, "num_heads": 24, "num_layers": 30, ... -} -``` - -**Loaded from custom JSON** (BAGEL): -```python -cfg_path = os.path.join(model_path, "config.json") -with open(cfg_path) as f: - bagel_cfg = json.load(f) -vae_cfg = bagel_cfg.get("vae_config", {}) -``` - -## Custom Architecture Patterns - -### Split forward API (DreamID-Omni) - -When a fusion model needs to interleave blocks from two backbones: - -```python -class WanModel(nn.Module): - def prepare_transformer_block_kwargs(self, x, t, context, ...): - # Patch embed, time embed, text embed, RoPE - return x, e, kwargs - - def post_transformer_block_out(self, x, grid_sizes, e): - # Output projection, unpatchify - return output - - def forward(self, *args, **kwargs): - raise NotImplementedError # Fusion model handles block iteration -``` - -The `FusionModel` then iterates blocks in lock-step: -```python -for video_block, audio_block in zip(self.video_model.blocks, self.audio_model.blocks): - video_out = video_block(video_hidden, ...) - audio_out = audio_block(audio_hidden, ...) - # Cross-attend between modalities - video_out = cross_attention(video_out, audio_out) - audio_out = cross_attention(audio_out, video_out) -``` - -### LLM-as-denoiser (BAGEL) - -When the backbone is a language model that also does diffusion: - -```python -class BagelModel(nn.Module): - def __init__(self): - self.language_model = Qwen2MoTForCausalLM(config) - self.vit_model = SiglipVisionModel(vit_config) -``` - -The LLM processes both text tokens and latent image tokens in a single forward pass, using KV caching for the text portion. - -## Pre/Post Processing for Custom Models - -Custom models typically handle pre/post processing **inside `forward()`** rather than via registered functions, because the logic is tightly coupled: - -```python -def forward(self, req: OmniDiffusionRequest) -> DiffusionOutput: - # Inline preprocessing - image = self._load_and_resize_image(req.prompts[0].get("multi_modal_data", {}).get("image")) - image_latent = self._vae_encode(image) - - # ... denoising loop ... - - # Inline postprocessing - pil_image = self._decode_to_pil(latents) - return DiffusionOutput(output=[pil_image]) -``` - -If pre/post functions are not registered in `_DIFFUSION_PRE_PROCESS_FUNCS` / `_DIFFUSION_POST_PROCESS_FUNCS`, the engine simply skips those steps. - -## Download Script Template - -```python -# examples/offline_inference//download_.py -from huggingface_hub import snapshot_download -import json, os - -def main(output_dir): - # Download model weights from HF - snapshot_download(repo_id="org/model-weights", local_dir=os.path.join(output_dir, "weights")) - - # Download additional components if from separate repos - snapshot_download(repo_id="org/vae-weights", local_dir=os.path.join(output_dir, "vae"), - allow_patterns=["*.safetensors"]) - - # Generate model_index.json - config = {"_class_name": "YourPipeline", "custom_key": "weights/model.safetensors"} - with open(os.path.join(output_dir, "model_index.json"), "w") as f: - json.dump(config, f, indent=2) - - # Install external code dependency (if needed) - download_dependency() - -if __name__ == "__main__": - import argparse - parser = argparse.ArgumentParser() - parser.add_argument("--output-dir", default="./your_model") - args = parser.parse_args() - main(args.output_dir) -``` diff --git a/.claude/skills/add-diffusion-model/references/parallelism-patterns.md b/.claude/skills/add-diffusion-model/references/parallelism-patterns.md deleted file mode 100644 index 933e2d23204..00000000000 --- a/.claude/skills/add-diffusion-model/references/parallelism-patterns.md +++ /dev/null @@ -1,571 +0,0 @@ -# Parallelism Patterns Reference - -## Overview - -vLLM-Omni supports multiple parallelism strategies for diffusion models. Each targets a different bottleneck: - -| Strategy | Splits | Best For | Constraint | -|----------|--------|----------|------------| -| Tensor Parallel (TP) | Model layers across GPUs | Latency reduction, large models | Requires fast GPU interconnect, `num_heads % tp == 0` | -| Sequence Parallel (SP/USP) | Sequence tokens across GPUs | Long sequences (video, high-res) | Near-linear scaling | -| CFG Parallel | Positive/negative CFG branches | Models using classifier-free guidance | Exactly 2 GPUs | -| HSDP | Weight shards via FSDP2 | VRAM reduction | Cannot combine with TP | -| VAE Patch Parallel | VAE decode spatial tiles | Large VAE outputs | Auto-enables tiling | - -**Recommended integration order**: TP → SP → CFG Parallel → HSDP - -**Official design docs**: -- TP: https://docs.vllm.ai/projects/vllm-omni/en/latest/design/feature/tensor_parallel -- SP: https://docs.vllm.ai/projects/vllm-omni/en/latest/design/feature/sequence_parallel -- CFG: https://docs.vllm.ai/projects/vllm-omni/en/latest/design/feature/cfg_parallel -- HSDP: https://docs.vllm.ai/projects/vllm-omni/en/latest/design/feature/hsdp - ---- - -## Tensor Parallelism (TP) - -Replace standard `nn.Linear` with vLLM's parallel linear layers. This is the most invasive change but provides direct VRAM savings and compute speedup. - -### Layer replacement rules - -| Pattern | vLLM Layer | When to Use | -|---------|-----------|-------------| -| Fan-out (first in FFN) | `ColumnParallelLinear` | Projection that splits output across ranks | -| Fan-in (second in FFN) | `RowParallelLinear` | Projection that gathers across ranks | -| QKV projection | `QKVParallelLinear` | Fused Q/K/V for self-attention | -| Single Q or K or V | `ColumnParallelLinear` | Separate projections (cross-attention) | -| Attention output | `RowParallelLinear` | Output projection after attention | -| Must not shard | `ReplicatedLinear` | Layers that must stay replicated | - -### MLP Block (Up-Down Pattern) - -```python -from vllm.model_executor.layers.linear import ( - ColumnParallelLinear, RowParallelLinear, -) - -class TPFeedForward(nn.Module): - def __init__(self, dim, ffn_dim): - super().__init__() - self.fc1 = ColumnParallelLinear(dim, ffn_dim, bias=False, return_bias=False) - self.fc2 = RowParallelLinear( - ffn_dim, dim, bias=False, - input_is_parallel=True, # Input already sharded from fc1 - return_bias=False, - ) - - def forward(self, x): - x, _ = self.fc1(x) - x = torch.nn.functional.gelu(x) - x, _ = self.fc2(x) - return x -``` - -### Attention Block (QKV-Out Pattern) - -```python -from vllm.model_executor.layers.linear import QKVParallelLinear, RowParallelLinear -from vllm_omni.diffusion.attention.layer import Attention - -class TPSelfAttention(nn.Module): - def __init__(self, dim, num_heads, num_kv_heads=None): - super().__init__() - num_kv_heads = num_kv_heads or num_heads - self.head_dim = dim // num_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, - ) - self.to_out = RowParallelLinear( - dim, dim, bias=False, - input_is_parallel=True, - return_bias=False, - ) - self.attn = Attention( - num_heads=self.to_qkv.num_heads, # Local heads per GPU - 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, # Local KV heads per GPU - ) - - def forward(self, x): - qkv, _ = self.to_qkv(x) - q, k, v = qkv.split( - [self.to_qkv.num_heads * self.head_dim, - self.to_qkv.num_kv_heads * self.head_dim, - self.to_qkv.num_kv_heads * self.head_dim], - dim=-1, - ) - B, S, _ = x.shape - q = q.view(B, S, self.to_qkv.num_heads, self.head_dim) - k = k.view(B, S, self.to_qkv.num_kv_heads, self.head_dim) - v = v.view(B, S, self.to_qkv.num_kv_heads, self.head_dim) - out = self.attn(q, k, v) - out = out.reshape(B, S, -1) - out, _ = self.to_out(out) - return out -``` - -### QKV Fusion in load_weights - -When you fuse separate Q/K/V into `QKVParallelLinear`, map diffusers' separate weight names: - -```python -stacked_params_mapping = [ - ("to_qkv", "to_q", "q"), - ("to_qkv", "to_k", "k"), - ("to_qkv", "to_v", "v"), -] - -def load_weights(self, weights): - params = dict(self.named_parameters()) - loaded = set() - for name, tensor in weights: - for fused_name, orig_name, shard_id in stacked_params_mapping: - if orig_name in name: - name = name.replace(orig_name, fused_name) - param = params[name] - param.weight_loader(param, tensor, shard_id) - loaded.add(name) - break - else: - if name in params: - param = params[name] - if hasattr(param, "weight_loader"): - param.weight_loader(param, tensor) - else: - default_weight_loader(param, tensor) - loaded.add(name) - return loaded -``` - -### RMSNorm with TP - -When RMSNorm sits between TP-sharded dimensions, use `DistributedRMSNorm` — it computes global RMS via all-reduce across TP ranks. See the Wan2.2 implementation for the pattern. - -### TP Constraints - -- `num_heads % tp_size == 0` -- `num_kv_heads % tp_size == 0` -- Use `self.to_qkv.num_heads` (local per-GPU count), not total heads, for split sizes - -### Testing TP - -```bash -python text_to_image.py --model Your-org/your-model \ - --tensor-parallel-size 2 --output "tp_test.png" -``` - -**Verify**: speedup, memory reduction proportional to TP size, quality matches single-GPU. - -### Reference implementations - -| Model | Path | -|-------|------| -| Z-Image | `vllm_omni/diffusion/models/z_image/z_image_transformer.py` | -| FLUX | `vllm_omni/diffusion/models/flux/flux_transformer.py` | -| Qwen-Image | `vllm_omni/diffusion/models/qwen_image/qwen_image_transformer.py` | - ---- - -## Sequence Parallelism (SP / USP) - -SP splits sequence tokens across GPUs using Ulysses (all-to-all) or Ring (P2P) communication. It is applied non-intrusively via the `_sp_plan` dict — no changes to `forward()` logic. - -### Approach 1: Non-Intrusive `_sp_plan` (Recommended) - -The framework automatically registers hooks to shard inputs and gather outputs at `nn.Module` boundaries. - -#### Step 1: Identify module boundaries - -Find where tensors need sharding/gathering: - -```python -class MyTransformer(nn.Module): - def __init__(self): - self.patch_embed = PatchEmbed() # Before blocks - self.pos_embed = RoPE() # RoPE may need splitting - self.blocks = nn.ModuleList([...]) # Blocks process sharded x - self.norm_out = LayerNorm() - self.proj_out = Linear() # Gather after this - - def forward(self, x): - x = self.patch_embed(x) - pos = self.pos_embed(x) - for block in self.blocks: - x = block(x, pos) - x = self.norm_out(x) - return self.proj_out(x) -``` - -#### Step 2: Handle inline operations - -`_sp_plan` hooks only work at `nn.Module` boundaries. Inline ops like `torch.cat()` must be extracted into submodules: - -```python -# BAD: Inline — hooks can't intercept -unified = torch.cat([x, cap_feats], dim=1) - -# GOOD: Extract into submodule -class UnifiedPrepare(nn.Module): - def forward(self, x, cap_feats): - return torch.cat([x, cap_feats], dim=1) - -self.unified_prepare = UnifiedPrepare() -unified = self.unified_prepare(x, cap_feats) -``` - -Common cases: `torch.cat()`, `pad_sequence()`, `tensor.reshape()`, complex preprocessing. - -#### Step 3: Write `_sp_plan` - -**Pattern 1: Shard at first block, gather at output** (most common) - -```python -from vllm_omni.diffusion.distributed.sp_plan import ( - SequenceParallelInput, SequenceParallelOutput, -) - -class StandardTransformer(nn.Module): - _sp_plan = { - "blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), - }, - "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), - } -``` - -**Pattern 2: Shard RoPE outputs separately** - -```python -class TransformerWithRoPE(nn.Module): - _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), - }, - "blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), - }, - "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), - } -``` - -**Pattern 3: Dual-stream (shard image, replicate text)** - -```python -class DualStreamTransformer(nn.Module): - _sp_plan = { - "rope_preparer": { - 2: SequenceParallelInput(split_dim=0, expected_dims=2, split_output=True), - 3: SequenceParallelInput(split_dim=0, expected_dims=2, split_output=True), - }, - "transformer_blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), - }, - "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), - } -``` - -### API Reference - -**SequenceParallelInput**: - -| Parameter | Type | Description | -|-----------|------|-------------| -| `split_dim` | int | Dimension to split (usually 1 for sequence) | -| `expected_dims` | int/None | Expected tensor rank for validation | -| `split_output` | bool | `False`: shard input params; `True`: shard output tensors | -| `auto_pad` | bool | Auto-pad if sequence not divisible by world_size | - -**SequenceParallelOutput**: - -| Parameter | Type | Description | -|-----------|------|-------------| -| `gather_dim` | int | Dimension to gather (usually 1 for sequence) | -| `expected_dims` | int/None | Expected tensor rank for validation | - -**Module naming**: - -| Key | Meaning | -|-----|---------| -| `"blocks.0"` | First element of ModuleList | -| `"blocks.*"` | All elements of ModuleList | -| `"rope"` | Named submodule | - -**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 (Complex Cases) - -For dynamic sharding logic that can't 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) - for block in self.blocks: - hidden_states = block(hidden_states) - if self.parallel_config.sequence_parallel_size > 1: - hidden_states = sp_gather(hidden_states, dim=1) - return hidden_states -``` - -Use intrusive modification as a last resort — `_sp_plan` is preferred for maintainability. - -### UAA Mode (Experimental) - -`ulysses_mode="advanced_uaa"` handles arbitrary sequence lengths and head counts that aren't divisible by `ulysses_degree`. Uses variable all-to-all split sizes and temporary head padding. - -### Combining SP methods - -Ulysses and Ring can be combined: `ulysses_degree × ring_degree = total SP GPUs`. - -```python -DiffusionParallelConfig(ulysses_degree=2, ring_degree=2) # 4 GPUs total -``` - -### Testing SP - -```bash -# Offline -python text_to_image.py --model Your-model --ulysses-degree 2 - -# Online serving -vllm serve Your-model --omni --usp 2 -``` - -### Reference implementations - -| Model | Path | -|-------|------| -| Qwen-Image | `vllm_omni/diffusion/models/qwen_image/qwen_image_transformer.py` | -| Wan2.2 | `vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py` | -| Z-Image | `vllm_omni/diffusion/models/z_image/z_image_transformer.py` | - ---- - -## CFG Parallelism - -Distributes positive/negative Classifier-Free Guidance branches across 2 GPUs. - -### Implementation - -Inherit `CFGParallelMixin` and implement `diffuse()`: - -```python -from vllm_omni.diffusion.distributed.cfg_parallel import CFGParallelMixin - -class YourPipeline(nn.Module, CFGParallelMixin): - def diffuse(self, latents, timesteps, prompt_embeds, negative_embeds, - do_true_cfg, true_cfg_scale, **kwargs): - for i, t in enumerate(timesteps): - positive_kwargs = { - "hidden_states": latents, - "encoder_hidden_states": prompt_embeds, - "timestep": t, - } - negative_kwargs = { - "hidden_states": latents, - "encoder_hidden_states": negative_embeds, - "timestep": t, - } if do_true_cfg else None - - 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, - ) - latents = self.scheduler_step_maybe_with_cfg( - noise_pred, t, latents, do_true_cfg - ) - return latents -``` - -### Customization hooks - -| Method | Override when | -|--------|-------------| -| `predict_noise()` | Non-standard transformer call (e.g., dual-transformer like Wan2.2) | -| `cfg_normalize_function()` | Custom normalization (e.g., LongCat with clamping) | -| `combine_cfg_noise()` | Multi-output models (e.g., video + audio: CFG on video, positive-only on audio) | - -**Custom predict_noise** (Wan2.2 — selects active transformer): - -```python -def predict_noise(self, current_model=None, **kwargs): - if current_model is None: - current_model = self.transformer - return current_model(**kwargs)[0] -``` - -**Custom combine_cfg_noise** (multi-output): - -```python -def combine_cfg_noise(self, positive_pred, negative_pred, scale, normalize): - video_pos, audio_pos = positive_pred - video_neg, audio_neg = negative_pred - video_combined = super().combine_cfg_noise(video_pos, video_neg, scale, normalize) - return (video_combined, audio_pos) -``` - -### Composite scheduler for multi-output - -When each output has its own schedule: - -```python -class VideoAudioScheduler: - def __init__(self, video_scheduler, audio_scheduler): - self.video_scheduler = video_scheduler - self.audio_scheduler = audio_scheduler - - def step(self, noise_pred, t, latents, return_dict=False, generator=None): - video_out = self.video_scheduler.step( - noise_pred[0], t[0], latents[0], return_dict=False, generator=generator - )[0] - audio_out = self.audio_scheduler.step( - noise_pred[1], t[1], latents[1], return_dict=False, generator=generator - )[0] - return ((video_out, audio_out),) -``` - -### Testing CFG Parallel - -```bash -python text_to_image.py --model Your-model \ - --cfg-parallel-size 2 --cfg-scale 4.0 \ - --negative-prompt "ugly, unclear" -``` - -**Constraint**: `guidance_scale > 1.0` and negative prompt must be provided. - -### Reference implementations - -| Model | Path | -|-------|------| -| Qwen-Image | `vllm_omni/diffusion/models/qwen_image/cfg_parallel.py` | -| Wan2.2 | `vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.py` | -| Mixin base | `vllm_omni/diffusion/distributed/cfg_parallel.py` | - ---- - -## HSDP (Hybrid Sharded Data Parallel) - -Shards model weights across GPUs using PyTorch FSDP2. Reduces per-GPU VRAM without changing computation. - -### Implementation - -Add `_hsdp_shard_conditions` to the transformer class: - -```python -class YourTransformer(nn.Module): - @staticmethod - def _is_transformer_block(name: str, module) -> bool: - return "blocks" in name and name.split(".")[-1].isdigit() - - _hsdp_shard_conditions = [_is_transformer_block] -``` - -For MoE models, add additional conditions: - -```python -class MoETransformer(nn.Module): - @staticmethod - def _is_transformer_block(name, module): - return "blocks" in name and name.split(".")[-1].isdigit() - - @staticmethod - def _is_moe_expert(name, module): - return "experts" in name and name.split(".")[-1].isdigit() - - _hsdp_shard_conditions = [_is_transformer_block, _is_moe_expert] -``` - -A module is sharded if **any** condition returns `True`. - -### Constraints - -- Cannot combine with Tensor Parallelism -- For standalone HSDP (no other parallelism), `hsdp_shard_size` must be specified explicitly -- Can combine with SP: HSDP reduces memory while SP distributes sequence - -### Testing HSDP - -```python -from vllm_omni.diffusion.data import DiffusionParallelConfig - -parallel_config = DiffusionParallelConfig(use_hsdp=True, hsdp_shard_size=8) -omni = Omni(model="your-model", parallel_config=parallel_config) -``` - -Or CLI: - -```bash -vllm serve Your-model --omni --use-hsdp -``` - -**Verify**: logs show "HSDP Inference: replicate_size=..., shard_size=..." and "Sharded N modules + root". Check VRAM reduction. - -### Reference implementations - -| Model | Path | -|-------|------| -| Wan2.2 | `vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py` | -| HSDP Core | `vllm_omni/diffusion/distributed/hsdp.py` | - ---- - -## VAE Patch Parallelism - -Shards VAE decode spatially across ranks using tiling: - -```bash -python text_to_image.py --model Your-model --vae-patch-parallel-size 4 -``` - -Auto-enables `--vae-use-tiling`. Uses `DistributedAutoencoderKLWan` or similar distributed VAE. Set `vae_patch_parallel_size` in `DiffusionParallelConfig`. - ---- - -## Combining Parallelism Methods - -Common multi-GPU recipes: - -```bash -# 4 GPUs: CFG (2) × Ulysses (2) -python text_to_image.py --model Qwen/Qwen-Image \ - --cfg-parallel-size 2 --ulysses-degree 2 - -# 8 GPUs: Ulysses (4) × Ring (2) + VAE patch (8) -python text_to_video.py --model Wan-AI/Wan2.2-T2V-A14B-Diffusers \ - --ulysses-degree 4 --ring-degree 2 --vae-patch-parallel-size 8 - -# 2 GPUs: HSDP + Ulysses (cannot combine HSDP with TP) -vllm serve Your-model --omni --use-hsdp --usp 2 -``` - -## Discovering Parallelism Support - -Check which parallelism methods a model supports: - -| Check | How | -|-------|-----| -| **Ulysses / Ring SP** | Transformer defines `_sp_plan`. Search: `grep -r '_sp_plan' vllm_omni/diffusion/models/` | -| **CFG Parallel** | Pipeline inherits `CFGParallelMixin`. Search: `grep -r 'CFGParallelMixin' vllm_omni/diffusion/models/` | -| **TP** | Uses `ColumnParallelLinear` / `QKVParallelLinear`. Search: `grep -r 'ParallelLinear\|QKVParallel' vllm_omni/diffusion/models//` | -| **HSDP** | Transformer defines `_hsdp_shard_conditions`. Search: `grep -r '_hsdp_shard_conditions' vllm_omni/diffusion/models/` | - -The canonical per-model support table is in `docs/user_guide/diffusion/parallelism_acceleration.md`. diff --git a/.claude/skills/add-diffusion-model/references/transformer-adaptation.md b/.claude/skills/add-diffusion-model/references/transformer-adaptation.md deleted file mode 100644 index 6e344b6a66e..00000000000 --- a/.claude/skills/add-diffusion-model/references/transformer-adaptation.md +++ /dev/null @@ -1,218 +0,0 @@ -# Transformer Adaptation Reference - -## Adapting a Diffusers Transformer to vLLM-Omni - -### Step-by-step Checklist - -1. Copy the transformer class from diffusers source -2. Remove all mixin classes — inherit only from `nn.Module` -3. Replace attention dispatch with `vllm_omni.diffusion.attention.layer.Attention` -4. Replace logger with `vllm.logger.init_logger` -5. Add `od_config: OmniDiffusionConfig | None = None` to `__init__` -6. Remove training-only code (gradient checkpointing, dropout) -7. Add `load_weights()` method for weight loading from safetensors -8. Add class-level attributes for acceleration features - -### Mixin Removal - -Remove these diffusers mixins (and their imports): - -```python -# Remove all of these: -from diffusers.models.modeling_utils import ModelMixin -from diffusers.configuration_utils import ConfigMixin, register_to_config -from diffusers.models.attention_processor import AttentionModuleMixin -from diffusers.loaders import PeftAdapterMixin, FromOriginalModelMixin - -# Replace: -class MyTransformer(ModelMixin, ConfigMixin, AttentionModuleMixin): -# With: -class MyTransformer(nn.Module): -``` - -Also remove `@register_to_config` decorators from `__init__`. - -### Attention Replacement - -The vLLM-Omni `Attention` layer wraps backend selection (FlashAttention, SDPA, SageAttn, etc.) and supports sequence parallelism hooks. - -**QKV tensor shape must be `[batch, seq_len, num_heads, head_dim]`.** - -#### Self-Attention Pattern - -```python -from vllm_omni.diffusion.attention.layer import Attention -from vllm_omni.diffusion.attention.backends.abstract import AttentionMetadata - -class SelfAttentionBlock(nn.Module): - def __init__(self, dim, num_heads): - super().__init__() - self.num_heads = num_heads - self.head_dim = dim // num_heads - - self.to_q = nn.Linear(dim, dim) - self.to_k = nn.Linear(dim, dim) - self.to_v = nn.Linear(dim, dim) - self.to_out = nn.Linear(dim, dim) - - self.attn = Attention( - num_heads=num_heads, - head_size=self.head_dim, - softmax_scale=1.0 / (self.head_dim ** 0.5), - causal=False, - num_kv_heads=num_heads, - ) - - def forward(self, x, attn_mask=None): - B, S, _ = x.shape - q = self.to_q(x).view(B, S, self.num_heads, self.head_dim) - k = self.to_k(x).view(B, S, self.num_heads, self.head_dim) - v = self.to_v(x).view(B, S, self.num_heads, self.head_dim) - - attn_metadata = AttentionMetadata(attn_mask=attn_mask) - out = self.attn(q, k, v, attn_metadata=attn_metadata) - out = out.reshape(B, S, -1) - return self.to_out(out) -``` - -#### Fused QKV with TP (Advanced) - -For tensor parallelism, use vLLM's parallel linear layers: - -```python -from vllm.model_executor.layers.linear import ( - QKVParallelLinear, RowParallelLinear -) - -class TPSelfAttention(nn.Module): - def __init__(self, dim, num_heads): - super().__init__() - self.num_heads = num_heads - self.head_dim = dim // num_heads - - self.to_qkv = QKVParallelLinear( - hidden_size=dim, - head_size=self.head_dim, - total_num_heads=num_heads, - total_num_kv_heads=num_heads, - ) - self.to_out = RowParallelLinear(dim, dim) - - self.attn = Attention( - num_heads=num_heads, - head_size=self.head_dim, - softmax_scale=1.0 / (self.head_dim ** 0.5), - causal=False, - num_kv_heads=num_heads, - ) -``` - -### Logger Replacement - -```python -# Replace: -from diffusers.utils import logging -logger = logging.get_logger(__name__) - -# With: -from vllm.logger import init_logger -logger = init_logger(__name__) -``` - -### Custom Layers from vLLM-Omni - -Available utility layers: - -```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 -``` - -### Config Support - -```python -from vllm_omni.diffusion.data import OmniDiffusionConfig - -class MyTransformer(nn.Module): - def __init__(self, *, od_config=None, num_layers=28, hidden_size=3072, **kwargs): - super().__init__() - self.od_config = od_config - self.parallel_config = od_config.parallel_config if od_config else None - # ... build layers -``` - -The transformer config values come from `model_index.json` → `config.json` in the transformer subfolder. The pipeline uses `get_transformer_config_kwargs(od_config.tf_model_config, TransformerClass)` to filter config keys to match the `__init__` signature. - -### Weight Loading - -The `load_weights` method receives an iterable of `(name, tensor)` from safetensors files, with the prefix (e.g., `"transformer."`) already stripped by the loader. - -```python -from vllm.model_executor.model_loader.weight_utils import default_weight_loader - -class MyTransformer(nn.Module): - def load_weights(self, weights): - params = dict(self.named_parameters()) - loaded = set() - for name, tensor in weights: - # Optional: remap names from diffusers to vllm-omni naming - # e.g., "ff.net.0.proj" -> "ff.net_0.proj" - - if name in params: - param = params[name] - if hasattr(param, "weight_loader"): - param.weight_loader(param, tensor) - else: - default_weight_loader(param, tensor) - loaded.add(name) - return loaded -``` - -#### QKV Fusion in load_weights - -If you fused separate Q/K/V into a `QKVParallelLinear`, you need to map diffusers' separate weight names: - -```python -stacked_params_mapping = [ - ("to_qkv", "to_q", "q"), - ("to_qkv", "to_k", "k"), - ("to_qkv", "to_v", "v"), -] - -def load_weights(self, weights): - params = dict(self.named_parameters()) - loaded = set() - for name, tensor in weights: - for fused_name, orig_name, shard_id in stacked_params_mapping: - if orig_name in name: - name = name.replace(orig_name, fused_name) - param = params[name] - param.weight_loader(param, tensor, shard_id) - loaded.add(name) - break - else: - # Normal loading - ... - return loaded -``` - -### Class-Level Attributes for Features - -```python -class MyTransformer(nn.Module): - # torch.compile: list block class names that repeat and can be compiled - _repeated_blocks = ["MyTransformerBlock"] - - # CPU offload: attribute name of the nn.ModuleList containing blocks - _layerwise_offload_blocks_attr = "blocks" - - # LoRA: mapping of fused param names to original param names - packed_modules_mapping = {"to_qkv": ["to_q", "to_k", "to_v"]} - - # Sequence parallelism plan (advanced — add after basic impl works) - _sp_plan = { - "blocks.0": SequenceParallelInput(split_dim=1), - "proj_out": SequenceParallelOutput(gather_dim=1), - } -``` diff --git a/.claude/skills/add-diffusion-model/references/troubleshooting.md b/.claude/skills/add-diffusion-model/references/troubleshooting.md deleted file mode 100644 index 27acdd8d154..00000000000 --- a/.claude/skills/add-diffusion-model/references/troubleshooting.md +++ /dev/null @@ -1,178 +0,0 @@ -# Troubleshooting Reference - -## Common Errors When Adding a Diffusion Model - -### ImportError / ModuleNotFoundError - -**Cause**: Missing or incorrect registration. - -**Fix checklist**: -1. Model registered in `vllm_omni/diffusion/registry.py` `_DIFFUSION_MODELS` dict -2. `__init__.py` exports the pipeline class -3. Pipeline file exists at the correct path: `vllm_omni/diffusion/models/{folder}/{file}.py` -4. Class name in registry matches the actual class name in the file - -### Shape Mismatch in Attention - -**Symptom**: `RuntimeError: shape mismatch` or `expected 4D tensor` - -**Cause**: QKV tensors not reshaped to `[batch, seq_len, num_heads, head_dim]`. - -**Fix**: Before calling `self.attn(q, k, v, ...)`, ensure: -```python -q = q.view(batch, seq_len, self.num_heads, self.head_dim) -k = k.view(batch, kv_seq_len, self.num_kv_heads, self.head_dim) -v = v.view(batch, kv_seq_len, self.num_kv_heads, self.head_dim) -``` - -After attention, reshape back: -```python -out = out.reshape(batch, seq_len, -1) -``` - -### Weight Loading Failures - -**Symptom**: `RuntimeError: size mismatch for parameter ...` or missing keys - -**Debugging**: -1. Print diffusers weight names: `safetensors.safe_open(path, "pt").keys()` -2. Print model parameter names: `dict(model.named_parameters()).keys()` -3. Compare and add name remappings in `load_weights()` - -**Common remappings needed**: -- `ff.net.0.proj` → `ff.net_0.proj` (PyTorch Sequential indexing) -- `.to_out.0.` → `.to_out.` (Sequential unwrapping) -- `scale_shift_table` → moved to a wrapper module - -### Black/Blank/Noisy Output - -**Possible causes**: -1. **Wrong latent normalization**: Check VAE expects latents scaled by `vae.config.scaling_factor` -2. **Wrong scheduler**: Using the wrong scheduler class or wrong `flow_shift` -3. **Missing CFG**: Some models require `guidance_scale > 1.0` with negative prompt -4. **Wrong timestep format**: Some schedulers expect float, others expect int/long -5. **Missing post-processing**: Raw VAE output may need denormalization - -**Quick test**: Run with diffusers directly using the same seed and compare latents at each step. - -### OOM (Out of Memory) - -**Solutions** (in order of preference): -1. `--enforce-eager` to disable torch.compile (saves compile memory) -2. `--enable-cpu-offload` for model-level offload -3. `--enable-layerwise-offload` for block-level offload (better for large models) -4. `--vae-use-slicing --vae-use-tiling` for VAE memory reduction -5. Reduce resolution: `--height 480 --width 832` -6. Use TP: `--tensor-parallel-size 2` - -### Different Output vs Diffusers Reference - -**Common causes**: -1. **Attention backend difference**: FlashAttention vs SDPA may produce slightly different results. Set `DIFFUSION_ATTENTION_BACKEND=TORCH_SDPA` to match diffusers -2. **Float precision**: vLLM-Omni may use bfloat16 where diffusers uses float32 for some operations -3. **Missing normalization**: Check all LayerNorm/RMSNorm are preserved -4. **Scheduler rounding**: Some schedulers have numerical sensitivity - -### Tensor Parallel Errors - -**Symptom**: `AssertionError: not divisible` or incorrect output with TP>1 - -**Fix**: -1. Verify `num_heads % tp_size == 0` and `num_kv_heads % tp_size == 0` -2. Ensure `ColumnParallelLinear` / `RowParallelLinear` are used correctly -3. Check that norms between parallel layers use distributed norm if needed -4. Verify `load_weights` handles TP sharding for norm weights -5. Use `self.to_qkv.num_heads` (local heads per GPU) for QKV split sizes, not total heads - -**Missing `input_is_parallel=True`**: - -`RowParallelLinear` expects sharded input from `ColumnParallelLinear`: -```python -self.w1 = ColumnParallelLinear(dim, hidden_dim, return_bias=False) -self.w2 = RowParallelLinear(hidden_dim, dim, input_is_parallel=True, return_bias=False) -``` - -### Sequence Parallel Errors - -**Symptom**: Incorrect output or crashes with `--ulysses-degree N` or `--usp N` - -**Possible causes**: -1. **Inline operations between shard/gather points**: `torch.cat()`, `pad_sequence()` etc. not at `nn.Module` boundaries. Fix: extract into submodule. -2. **Wrong `split_dim`**: Check the tensor shape at the shard point. Sequence dimension is typically `dim=1` for `[B, S, D]` tensors. -3. **RoPE not sharded**: If RoPE is computed separately, add it to `_sp_plan` with `split_output=True`. -4. **Sequence not divisible by SP degree**: Use `auto_pad=True` in `SequenceParallelInput` or switch to `ulysses_mode="advanced_uaa"`. - -**Debugging**: Add `expected_dims=N` to `SequenceParallelInput`/`Output` for shape validation at runtime. - -### CFG Parallel Errors - -**Symptom**: CFG parallel not activating, no speedup - -**Fix checklist**: -1. Pipeline inherits `CFGParallelMixin` -2. `guidance_scale > 1.0` -3. Negative prompt provided (even if empty string) -4. `--cfg-parallel-size 2` specified -5. `diffuse()` method calls `predict_noise_maybe_with_cfg()` and `scheduler_step_maybe_with_cfg()` - -**Symptom**: Different output with CFG parallel vs sequential - -**Possible cause**: Non-deterministic scheduler. Fix: pass `generator=torch.Generator(device).manual_seed(seed)` to `scheduler_step_maybe_with_cfg()`. - -### HSDP Errors - -**Symptom**: HSDP not activating or errors during weight loading - -**Fix checklist**: -1. Transformer defines `_hsdp_shard_conditions` class attribute -2. Shard condition functions return `True` for correct modules (test with `model.named_modules()`) -3. Not combining with TP (HSDP and TP are incompatible) -4. For standalone HSDP, `hsdp_shard_size` is specified explicitly - -**Verify**: Check logs for "HSDP Inference: replicate_size=..., shard_size=..." and "Sharded N modules + root". - -### Cache-DiT Not Applied - -**Symptom**: No speedup, no cache-related log messages - -**Fix checklist**: -1. Model not in `_NO_CACHE_ACCELERATION` in `registry.py` -2. Pipeline class name matches `CUSTOM_DIT_ENABLERS` key (if using custom enabler) -3. `cache_backend="cache_dit"` specified -4. Check logs for "Cache-dit enabled successfully on xxx" - -**Verify pipeline name**: `print(pipeline.__class__.__name__)` — must match registry key. - -### Cache-DiT Quality Degradation - -**Symptom**: Artifacts or lower quality with cache-dit - -**Fix**: Reduce aggressiveness: -```python -cache_config={ - "residual_diff_threshold": 0.12, # Lower from 0.24 - "max_warmup_steps": 6, # Increase from 4 - "max_continuous_cached_steps": 2, # Reduce if higher -} -``` - -If quality is still poor, the model may need a custom enabler with per-block-list `ParamsModifier` tuning. - -### Model Not Detected / Wrong Pipeline Class - -**Symptom**: `ValueError: Model class ... not found in diffusion model registry` - -**Cause**: The model's `model_index.json` has a `_class_name` for the pipeline that doesn't match registry keys. - -**Fix**: The registry key must match the diffusers pipeline class name from `model_index.json`. If using a different name, map it in the registry: -```python -"DiffusersPipelineClassName": ("your_folder", "your_file", "YourVllmClassName"), -``` - -## Debugging Workflow - -1. **Add verbose logging**: Use `logger.info()` to print tensor shapes at each stage -2. **Compare step-by-step**: Run diffusers and vllm-omni side by side, comparing tensors after each major operation -3. **Use small configs**: Reduce `num_inference_steps=2`, small resolution for fast iteration -4. **Test transformer isolation**: Feed the same input to both diffusers and vllm-omni transformers, compare outputs -5. **Binary search for bugs**: Comment out blocks/layers to isolate where divergence starts diff --git a/.claude/skills/add-tts-model/SKILL.md b/.claude/skills/add-tts-model/SKILL.md deleted file mode 100644 index 963ffb4f64d..00000000000 --- a/.claude/skills/add-tts-model/SKILL.md +++ /dev/null @@ -1,504 +0,0 @@ ---- -name: add-tts-model -description: "Integrate a new text-to-speech model into vLLM-Omni from HuggingFace reference implementation through production-ready serving with streaming and CUDA graph acceleration. Use when adding a new TTS model, wiring stage separation for speech synthesis, enabling online voice generation serving, debugging TTS integration behavior, or building audio output pipelines." ---- - -# TTS Model Integration Workflow - -## Overview - -``` -HF Reference -> Stage Separation -> Online Serving -> Async Chunk -> CUDA Graph -> Pre-commit/DCO - (Phase 1) (Phase 2) (Phase 3) (Phase 4) (Phase 5) (Phase 6) -``` - -Three architecture patterns are supported: - -- **Two-stage pipeline** (e.g. Qwen3-TTS, Fish Speech, CosyVoice3): AR - code-predictor → audio decoder, connected via async_chunk for low-latency - streaming. Use this for maximum performance. -- **Single-stage AR via generator** (e.g. MOSS-TTS-Nano): entire model runs - inside one AR worker, streaming audio chunks through a per-request - `inference_stream()` generator. Use this when the upstream model bundles AR - + codec inseparably. See [references/single-stage-ar.md](references/single-stage-ar.md). -- **Single-stage, vLLM-native base LM + side computation** (e.g. VoxCPM2): - the base language model runs under vLLM's PagedAttention as a normal AR - model; diffusion / VAE / side computations run outside vLLM and are - attached via the runner post-processing hook. This is a distinct pattern - from the generator approach above — do not confuse the two. - -The single-stage variants skip Phase 4 (async_chunk) but Phase 5 (CUDA graph) -is still encouraged for the inner AR loop. - -## Cross-Cutting Invariants - -These rules apply to every TTS model regardless of architecture (AR vs AR+diffusion, single-stage vs two-stage, codec-based vs VAE-based). They surface repeatedly across PRs — check them at the end of every phase. - -### I1. Streaming output contract - -Pick exactly one per-step semantics for `forward()` and document it in the docstring: - -- **Delta**: yield only new audio samples produced this step. Preferred — linear cost, low memory. -- **Cumulative**: re-decode from step 0 every call. O(N²); only acceptable if the codec has no streaming decode path. - -If you choose **delta**, verify the full emit→consolidate→consume chain: - -1. `forward()` returns `{"model_outputs": , ...}` -2. `_consolidate_multimodal_tensors()` in `vllm_omni/engine/output_processor.py` concatenates the audio key into one tensor at finish. If it skips the key (`continue`), offline consumers receive only the final chunk. See `output_processor.py` for the concrete list of handled modality keys. -3. Streaming consumers (SSE, Gradio) receive per-step deltas; offline consumers (`engine.generate()`) receive a single concatenated tensor. - -Cumulative-vs-delta mismatch is the most common silent bug — offline RTF benchmarks pass, but users hear replays or truncation. - -### I2. Multimodal output consumer hygiene - -`outputs[0].outputs[0].multimodal_output[]` can be any of `Tensor`, `list[Tensor]` (pre-consolidation snapshot), `np.ndarray`, or scalar. When writing tests, examples, and benchmarks: - -- **Never** use `dict.get("a") or dict.get("b")` on tensor values — Python evaluates the tensor's boolean, raising `RuntimeError: Boolean value of Tensor with more than one value is ambiguous`. Use explicit `if x is None` chains. -- Always defensively handle the list form: `if isinstance(x, list): x = torch.cat([t.reshape(-1) for t in x], dim=0)`. -- Assert `shape` / `dtype` / `duration` explicitly; do not rely on truthiness for presence checks. - -### I3. Hot-loop GPU discipline - -Inside any per-step model loop (AR decode, diffusion solver, CFM Euler, vocoder block loop): - -- No `tensor.item()`, `.cpu()`, or `.tolist()` — each triggers a GPU→CPU sync; at 10 steps × 60 frames × 4 ops that is 2400 syncs per request. -- Prefer `dst.copy_(src)` over `dst.fill_(src.item())` when writing a scalar tensor into a buffer. -- Prefer `torch.compile(Model.forward, fullgraph=False)` on the whole forward over per-submodule compile — fewer dispatch boundaries, larger fusion regions. Measure before choosing granularity. -- No Python-side control flow that depends on tensor values; use `torch.where` / masking instead. - -Profile first, optimize second. See the profiling docs / project memory for the trace-analysis workflow. - -### I4. Validation pyramid - -Offline RTF alone is necessary but not sufficient. Every new TTS model must pass all three: - -| Layer | Catches | Tool | -|-------|---------|------| -| Offline RTF / duration check | Throughput regressions, missing audio, wrong sample rate | `end2end.py`, pytest e2e | -| Browser streaming playback | Delta/cumulative bugs, chunk boundary glitches, TTFP regressions | Gradio demo over `/v1/audio/speech?stream=true` | -| Concurrent requests | Per-request state leaks, codec window round-robin gaps | `max_num_seqs>1` smoke test with 4+ parallel prompts | - -Declaring a model "done" without all three has shipped regressions more than once. - -### I5. Per-request state is owned by the request, not the model - -If the model caches *anything* across `forward()` calls (streaming generators, codec buffers, sliding-window pads, CUDA graph state), key it by request ID: - -```python -self._state: dict[str, YourState] = {} # request_key → state -# fetch: request_key = str(info.get("_omni_req_id", "0")) -# free on finish: del self._state[request_key] -``` - -A shared buffer silently corrupts audio across concurrent requests — the symptom is crosstalk or truncation only under load. - -## Phase 1: HuggingFace Reference - -**Goal**: Understand the reference implementation and verify it produces correct audio. - -### Steps - -1. **Run the reference model** end-to-end using the official HuggingFace / GitHub code -2. **Document the architecture**: - - What are the sub-models? (AR decoder, codec decoder, vocoder, etc.) - - What is the token vocabulary? (semantic codes, RVQ codebooks, special tokens) - - What is the output format? (sample rate, channels, codec type) -3. **Capture reference outputs** for comparison during integration -4. **Identify the config structure**: `config.json` fields, `model_type`, sub-model configs - -### Key Questions - -- How many codebooks? What are the codebook sizes? -- What special tokens exist? (`<|voice|>`, `<|audio_start|>`, `<|im_end|>`, etc.) -- What is the token-to-ID mapping for codec codes? -- What is the hop length / frame rate of the codec? -- Does the model support voice cloning? How? (reference audio encoding, speaker embeddings, etc.) - -### Deliverables - -- Working reference script that produces audio -- Architecture diagram / notes -- Token vocabulary mapping -- Reference audio samples for regression testing - -## Phase 2: Stage Separation (Offline Inference) - -**Goal**: Split the model into vLLM-Omni stages and get offline inference working. - -### Steps - -1. **Register the model** in `vllm_omni/model_executor/models/registry.py` -2. **Create config classes** (`configuration_.py`) with `model_type` registration -3. **Implement Stage 0** (AR model): - - Subclass appropriate base (e.g., wrap Qwen3 decoder layers) - - Implement `forward()` for autoregressive token generation - - Handle special token logic (start/stop tokens, codec token mapping) - - If dual-AR (like Fish Speech), implement Fast AR as a nested module -4. **Implement Stage 1** (Decoder): - - Load codec weights (may need lazy loading from separate checkpoint) - - Implement `forward()`: codec codes -> audio waveform - - Return `OmniOutput` with `multimodal_outputs` -5. **Create stage config YAML** defining both stages, memory allocation, and model paths -6. **Create stage input processor** for prompt building -7. **Write end2end.py** test script - -### Critical Parameters to Get Right - -| Parameter | Impact if Wrong | -|-----------|----------------| -| Hop length | Audio duration wrong, streaming noise | -| Token ID mapping | Garbage codes -> noise output | -| Codebook count/size | Shape mismatch crashes | -| Stop token | Generation never stops or stops too early | -| dtype / autocast | Numerical issues, silent quality degradation | -| Repetition penalty | Must match reference (often 1.0 for TTS) | - -### Debugging Priority (from experience) - -When audio output is wrong, check in this order: - -1. **RoPE / attention**: Are position encodings correct? Is the attention mask right? -2. **Normalization**: RMSNorm epsilon, layer norm placement (pre vs post) -3. **Hop length**: Product of all upsample rates in the codec decoder -4. **Token mapping**: Are codec IDs correctly offset from the vocabulary base? -5. **Sampling parameters**: Temperature, top_k, top_p, repetition_penalty -6. **Tensor layout**: Codebook-major vs frame-major ordering -7. **dtype**: Float32 for codec decoders (autocast can corrupt audio) - -### Streaming Correctness Rules (single-stage and two-stage) - -These bugs appear in almost every new TTS PR. Check all before the first push. See also the cross-cutting invariants I1 (output contract) and I5 (per-request state) above — the rules below are the Phase 2-specific instances of those invariants: - -- **Accumulate codes across AR steps** — each `forward()` appends new codes; do not reset between steps or audio will be truncated (fish speech: `fix: accumulate audio_codes across steps`) -- **Emit delta audio, not full waveform** — in streaming mode yield only the new chunk per step, not the re-decoded full waveform from step 0 (fish speech: `fix: emit delta audio not full waveform`) -- **All return paths must emit `model_outputs`** — if any early-return branch skips setting `model_outputs`, the serving layer silently drops that step's audio (fish speech: `fix: ensure ALL return paths emit model_outputs`) -- **Per-request state isolation** — for batched concurrent requests, key all state by request ID; a shared buffer corrupts audio across requests (fish speech: `fix: per-request vocode + delta emission`) -- **Codec tensor device** — move codec codes to the codec decoder's device before calling decode; mismatches cause silent CPU fallback or crashes (fish speech: `fix: use model device for CUDA stream`) -- **AR stage `max_num_seqs`** — set to at least 4 in production configs; for single-stage models this is the only stage. For two-stage models, Stage 0 (AR) needs `max_num_seqs ≥ 4` to pipeline concurrent requests; Stage 1 (codec decoder) typically uses `max_num_seqs: 1` intentionally. Default of 1 everywhere causes audio gaps under concurrency because the codec window round-robins across requests (RFC #2568) - -### Optional Dependency Handling - -Patch optional dependencies (`torchaudio` / `torchcodec` / `soundfile`) at -the top of `load_weights()`, not at module import. Failures to do so cause -cryptic errors only on environments missing the optional package — after -the model is already deployed. See -[references/optional-deps.md](references/optional-deps.md) for the full -pattern, signature constraints, and MOSS-TTS-Nano reference. - -### Single-Stage AR Pattern (alternative to two-stage) - -When the upstream model cannot be cleanly split into an AR stage and a -separate decoder, run the full pipeline inside a single AR worker and -stream audio through a per-request `inference_stream()` generator keyed by -`_omni_req_id`. Stage config must set `worker_type: ar`, -`engine_output_type: audio`, `final_output: true`, `is_comprehension: true`, -and `async_chunk: false` at the top level. Only extract params from -`additional_information` that you actually forward, or pre-commit fails -`ruff F841`. - -Full walkthrough with the complete `forward()` / `_create_stream_gen()` -skeleton and stage-config fields: -[references/single-stage-ar.md](references/single-stage-ar.md). For an -in-tree reference, look for any single-stage AR model under -`vllm_omni/model_executor/models/` — e.g. the MOSS-TTS-Nano integration when -it lands. - -**VoxCPM2 is a different pattern** and should not reuse this skeleton — it -runs the base LM under vLLM PagedAttention with external side-computation. -See `plan/voxcpm2_native_ar_design.md`. - -### Deliverables - -- Model files in `vllm_omni/model_executor/models//` -- Stage config YAML -- Working `end2end.py` with correct audio output -- README.md in the example directory - -## Phase 3: Online Serving - -**Goal**: Expose the model via `/v1/audio/speech` API endpoint. - -### Steps - -1. **Register in `serving_speech.py`** — add all 5 points in a **single commit**; - partial integration causes hard-to-debug failures. This file is modified by every - model PR and is the most common source of rebase conflicts — see conflict note below. - - **Point 1** — stage constant (near the top, alongside the other `_*_TTS_MODEL_STAGES` sets): - ```python - _YOUR_MODEL_TTS_MODEL_STAGES = {"your_stage_key"} - ``` - - **Point 2** — union into `_TTS_MODEL_STAGES`: - ```python - _TTS_MODEL_STAGES: set[str] = ( - ... - | _YOUR_MODEL_TTS_MODEL_STAGES - ) - ``` - - **Point 3** — model type detection in `_detect_tts_model_type()`: - ```python - if model_stage in _YOUR_MODEL_TTS_MODEL_STAGES: - return "your_model" - ``` - - **Point 4** — validation dispatch in `_validate_tts_request()`: - ```python - if self._tts_model_type == "your_model": - return self._validate_your_model_request(request) - ``` - - **Point 5** — validation + parameter-builder methods: - ```python - def _validate_your_model_request(self, request) -> str | None: - if not request.input or not request.input.strip(): - return "Input text cannot be empty" - return None - - def _build_your_model_params(self, request) -> dict: - params = {"text": [request.input]} - if request.voice is not None: - params["voice"] = [request.voice] - return params - ``` - Wire `_build_your_model_params` into `_create_tts_request()` alongside the other - model-specific param builders. - - > **Two dispatch patterns coexist**: Fish Speech uses a `self._is_fish_speech` boolean - > instance attribute checked before `elif self._is_tts`, while all newer models - > (CosyVoice3, MOSS-TTS-Nano) use the `_tts_model_type` string returned by - > `_detect_tts_model_type()`. For new models, always use the `_tts_model_type` string - > pattern — do not add new `_is_*` flags. - - > **Unused variable rule**: only extract fields in `_build_your_model_params` that - > are actually forwarded to the model. Unused extractions fail `ruff F841`. - > For voice-cloning fields (`ref_audio` → `prompt_audio_path`, `ref_text` → - > `prompt_text`), add them to the param builder and verify they reach the model call. - - **Rebase conflict note**: when rebasing onto `main` after another model was merged, - `serving_speech.py` will conflict. Resolution: always keep *both* the upstream - model's additions and your own — never discard either side. - -2. **Handle model-specific parameters**: - - Voice cloning: `ref_audio` encoding and prompt injection - - `max_new_tokens` override in sampling params - - Model-specific default values -3. **Create client scripts**: `speech_client.py`, `run_server.sh` -4. **Test all response formats**: wav, mp3, flac, pcm -5. **Add Gradio demo**: Interactive web UI with streaming support - -### Voice Cloning Pattern - -```python -import base64 -from pathlib import Path - -def build_voice_clone_prompt(ref_audio_path: str, text: str, codec) -> list: - """Build prompt with reference audio for voice cloning in serving_speech.py.""" - audio_bytes = Path(ref_audio_path).read_bytes() - codes = codec.encode(audio_bytes) # Encode on CPU using model's codec (e.g., DAC) - token_ids = [code + codec.vocab_offset for code in codes.flatten().tolist()] - return [ - {"role": "system", "content": f"<|voice|>{''.join(chr(t) for t in token_ids)}"}, - {"role": "user", "content": text}, - ] -``` - -### Deliverables - -- Updated `serving_speech.py` with all 5 integration points (single commit) -- Client scripts and server launcher -- Gradio demo with streaming and voice cloning UI -- E2E online serving test (`tests/e2e/online_serving/test_.py`) -- Buildkite CI entry in `.buildkite/test-merge.yml` -- Documentation (offline + online serving docs) - -### E2E test pitfalls to avoid - -- **One `OmniServerParams` set per file.** `omni_server` is module-scoped; a second - id in the same file forces mid-module teardown/restart and exposes startup - races (`APIConnectionError` on the first request post-restart). Split variants - into separate files instead. -- **No external URL fetches from the server.** CI and some dev hosts can't - reach `raw.githubusercontent.com` over TLS. Inline ref audio as - `data:audio/wav;base64,...`; the serving layer accepts both URL and data URL. -- **Use the harness readiness gate.** The fixture waits for HTTP 200 on - `/health`; don't add `time.sleep` in tests. If warmup is incomplete, make - `/health` return non-200 until you're actually ready. -- **Mark with `@pytest.mark.core_model` + `hardware_test(res={"cuda": "H100"})`** - so the test lands in `test-ready.yml` (triggered by the `ready` label) rather - than only nightly. - -## Phase 4: Async Chunk (Streaming) - -**Goal**: Enable inter-stage streaming so audio chunks are produced while AR generation continues. - -### Steps - -1. **Update stage config YAML**: - ```yaml - async_chunk: true - codec_chunk_frames: 25 # frames per chunk - codec_left_context_frames: 25 # overlap for smooth boundaries - ``` -2. **Implement chunk handling in Stage 1**: - - Accept partial input (chunk of codec codes) - - Handle left context for smooth audio boundaries - - Return partial audio in `OmniOutput` -3. **Test streaming**: - - Verify audio quality matches non-streaming output - - Check for artifacts at chunk boundaries - - Measure TTFA (time to first audio) -4. **Update online serving** to support `stream=true` with PCM output - -### Streaming Architecture - -``` -Stage 0 (AR) Stage 1 (Decoder) - | | - |-- chunk 0 (25 frames) ------> decode -> audio chunk 0 -> client - |-- chunk 1 (25 frames) ------> decode -> audio chunk 1 -> client - |-- chunk 2 (25 frames) ------> decode -> audio chunk 2 -> client - ... -``` - -### Key Considerations - -- **Left context overlap**: Prevents audible artifacts at chunk boundaries -- **Hop length matters**: `context_audio_samples = context_frames * hop_length` -- **First chunk latency**: Can use larger initial chunk for better quality, then smaller chunks - -### Deliverables - -- Updated stage config with async_chunk enabled -- Smooth streaming audio without boundary artifacts -- TTFA metrics - -## Phase 5: CUDA Graph Acceleration - -**Goal**: Capture the AR loop as a CUDA graph for significant speedup. - -### Steps - -1. **Identify the hot loop**: The AR decoding loop that runs N steps per token -2. **Create static buffers**: - - KV caches with fixed max sequence length - - Pre-built causal masks and position tensors per step - - Static input/output tensors -3. **Implement graph capture**: - - Warm up with real data - - Capture the forward pass - - Replay with updated inputs -4. **Handle constraints**: - - Use `torch.argmax` instead of `torch.multinomial` (graph-safe) - - Fixed batch size (fall back to eager for other sizes) - - No dynamic control flow inside the graph - -See [references/cuda-graph-example.md](references/cuda-graph-example.md) for -a worked skeleton (Qwen3-TTS code predictor, 16-step AR loop), performance -expectations (3–5× on the graphed component for fixed batch_size=1), and the -graph-safety constraints you must honor inside the captured region. - -### Deliverables - -- CUDA graph implementation for the AR hot loop -- Benchmark script comparing eager vs graph performance -- Documentation of constraints and fallback behavior - -## Phase 6: Pre-commit and DCO - -**Goal**: Every commit passes `pre-commit` lint and carries a DCO -`Signed-off-by` line that matches the author email. - -- Install hooks once: `pre-commit install`. -- Run `pre-commit run --files ` before every push; accept any - auto-fixes, stage, re-commit. -- Sign every commit with `git commit -s`. DCO checks that author email and - `Signed-off-by` email match — `git config user.email` must match your - GitHub account email. - -Common pre-commit failures, recovery commands for missing sign-off, and the -full `pre-commit run` invocation for a TTS model: -[references/precommit-dco.md](references/precommit-dco.md). - -## Integration Checklist - -Use this checklist when integrating a new TTS model: - -### Cross-Cutting Invariants (verify at end of every phase) -- [ ] I1: `forward()` docstring states cumulative vs delta; consolidation path audited end-to-end -- [ ] I2: Tests / examples / benchmarks never use `dict.get(a) or dict.get(b)` on tensor values; list form handled -- [ ] I3: No `.item()` / `.cpu()` / Python branch on tensor values inside per-step loops -- [ ] I4: Offline RTF, browser streaming playback, and concurrent-request smoke test all pass -- [ ] I5: Any cross-step cache keyed by `_omni_req_id`; entries freed when the request finishes - -### Phase 1: HF Reference -- [ ] Reference model runs and produces correct audio -- [ ] Architecture documented (stages, codebooks, tokens, sample rate) -- [ ] Reference audio samples saved for comparison - -### Phase 2: Stage Separation -- [ ] Model registered in `registry.py` -- [ ] Config classes created with `model_type` registration -- [ ] Stage 0 (AR) implemented and generates correct tokens -- [ ] Stage 1 (Decoder) produces correct audio from tokens — dtype float32 for codec decoder -- [ ] Stage 1 `max_num_seqs` ≥ 4 in production config (default 1 causes gaps under concurrency) -- [ ] Optional dependency fallbacks handled at `load_weights()` time (torchaudio/soundfile/etc.) -- [ ] Streaming: codec codes accumulated across AR steps (not reset per step) -- [ ] Streaming: delta audio emitted per chunk, not full re-decoded waveform -- [ ] Streaming: all `forward()` return paths emit `model_outputs` -- [ ] Streaming: per-request state keyed by request ID (not shared across requests) -- [ ] Streaming: codec tensors moved to codec decoder device before decode -- [ ] Stage config YAML created -- [ ] `end2end.py` produces audio matching reference quality -- [ ] README.md written - -### Phase 3: Online Serving -- [ ] All 5 `serving_speech.py` integration points added in one commit -- [ ] Only extract params in `_build_*_params` that are forwarded to the model call (ruff F841) -- [ ] Prompt builder handles text input correctly -- [ ] Voice cloning works (if supported) -- [ ] All response formats work (wav, mp3, flac, pcm) -- [ ] Client scripts and server launcher created -- [ ] E2E online serving test written (`tests/e2e/online_serving/test_.py`) -- [ ] Buildkite CI entry added to `.buildkite/test-merge.yml` -- [ ] Gradio demo working -- [ ] Documentation added (offline + online docs, nav, supported models) - -### Phase 4: Async Chunk -- [ ] Stage config updated with `async_chunk: true` -- [ ] Stage 1 handles partial chunks correctly -- [ ] No audio artifacts at chunk boundaries -- [ ] Streaming via API (`stream=true`) works -- [ ] TTFA measured and acceptable - -### Phase 5: CUDA Graph -- [ ] Hot loop identified and profiled -- [ ] Static buffers allocated -- [ ] Graph captured and replays correctly -- [ ] Benchmark shows meaningful speedup -- [ ] Fallback to eager works for unsupported configs - -### Phase 6: Pre-commit and DCO -- [ ] `pre-commit run --files ` passes before every push -- [ ] Every commit has `Signed-off-by` matching the author email (`git commit -s`) -- [ ] `git config user.email` matches the email registered on your GitHub account -- [ ] Details and failure-recovery commands: [references/precommit-dco.md](references/precommit-dco.md) - -## References - -In-skill references (details split out of the main body): - -- [references/single-stage-ar.md](references/single-stage-ar.md) — full `forward()` / generator skeleton for the MOSS-TTS-Nano-style pattern -- [references/optional-deps.md](references/optional-deps.md) — torchaudio / torchcodec fallback pattern -- [references/cuda-graph-example.md](references/cuda-graph-example.md) — Qwen3-TTS code-predictor CUDA graph skeleton -- [references/precommit-dco.md](references/precommit-dco.md) — full pre-commit invocation, failure table, DCO recovery - -Project docs and adjacent skills: - -- [TTS audio skill](../vllm-omni-audio-tts/SKILL.md) — supported models and usage -- [Fish Speech integration](../vllm-omni-audio-tts/references/fish-speech.md) — complete example of Phases 1–3 -- [Qwen3-TTS reference](../vllm-omni-audio-tts/references/qwen-tts.md) — complete example of all 5 phases -- [Adding a TTS model (developer guide)](https://github.com/vllm-project/vllm-omni/blob/main/docs/contributing/model/adding_tts_model.md) -- `plan/voxcpm2_native_ar_design.md` — VoxCPM2's vLLM-native AR + side-computation pattern (distinct from the generator-based single-stage described above) diff --git a/.claude/skills/add-tts-model/references/cuda-graph-example.md b/.claude/skills/add-tts-model/references/cuda-graph-example.md deleted file mode 100644 index 6f4993b5c4c..00000000000 --- a/.claude/skills/add-tts-model/references/cuda-graph-example.md +++ /dev/null @@ -1,42 +0,0 @@ -# CUDA Graph Example: Qwen3-TTS Code Predictor - -Reference sketch for capturing the 16-step code-predictor AR loop as a single -CUDA graph. Adapt the shapes, number of steps, and KV-head layout to your -model. - -```python -import torch - -class CodePredictorGraph: - """Captures the 16-step code predictor AR loop as a single CUDA graph.""" - - def setup_graph(self, device: torch.device, kv_heads: int = 4, head_dim: int = 64): - self.num_steps = 16 - self.kv_cache = torch.zeros(1, kv_heads, self.num_steps, head_dim, device=device) - self.positions = torch.arange(self.num_steps, device=device) - self.causal_mask = torch.tril(torch.ones(self.num_steps, self.num_steps, device=device)) - self.input_buf = torch.zeros(1, 1, kv_heads * head_dim, device=device) - self.output_buf = torch.zeros(1, self.num_steps, device=device, dtype=torch.long) - # Warm up, then: self.graph = torch.cuda.CUDAGraph(); self.graph.capture(...) - - def run_graph(self, initial_input: torch.Tensor) -> torch.Tensor: - self.input_buf.copy_(initial_input) - self.graph.replay() - return self.output_buf.clone() -``` - -## Performance expectations (Qwen3-TTS code predictor) - -- **3–5× speedup** on the graphed component. -- Effective only for fixed batch sizes (typically `batch_size=1`). -- Fall back to eager for any shape/config that wasn't captured — do not try - to recapture per request. - -## Graph-safety constraints - -- `torch.argmax` instead of `torch.multinomial`. -- Fixed batch size. -- No Python control flow that branches on tensor values inside the captured - region (use `torch.where` / masks). -- No `.item()`, `.cpu()`, `.tolist()` — each would break the capture or - cause a GPU→CPU sync during replay. diff --git a/.claude/skills/add-tts-model/references/optional-deps.md b/.claude/skills/add-tts-model/references/optional-deps.md deleted file mode 100644 index 0a55f30f05c..00000000000 --- a/.claude/skills/add-tts-model/references/optional-deps.md +++ /dev/null @@ -1,47 +0,0 @@ -# Optional Dependency Handling - -Models that rely on `torchaudio`, `torchcodec`, `soundfile`, or other optional -packages must handle the missing-package case at import time, not at call -time. Failing to do this causes cryptic errors only on environments without -the optional package — after the model is already deployed. - -## Pattern (used in MOSS-TTS-Nano) - -```python -def _patch_torchaudio_load() -> None: - """Fallback torchaudio.load/save to soundfile if torchcodec is unavailable.""" - try: - import torchcodec # noqa: F401 - return # torchcodec present, torchaudio works as-is - except ImportError: - pass - - import soundfile as sf - import torchaudio - - def _sf_load(path, **kwargs): - data, sr = sf.read(str(path), dtype="float32", always_2d=True) - return torch.from_numpy(data).T, sr - - torchaudio.load = _sf_load - # patch .save similarly if needed -``` - -## Rules - -- Mirror the full signature of the replaced function. `torchaudio.load` - accepts `frame_offset`, `num_frames`, `normalize`, `channels_first`, - `format` — missing any of them causes `TypeError` from calling code. -- Catch `except Exception`, not just `ImportError`. `import torchaudio` - itself can fail with non-`ImportError` errors on broken installs. Log the - exception type and message (`logger.warning("torchaudio probe failed: %s: %s", - type(exc).__name__, exc)`) before falling back, so unrelated errors are not - silently swallowed. -- Call the patch function at the top of `load_weights()` before loading any - audio assets. Do not call it at module import time. - -## Reference implementation - -Any in-tree model that patches `torchaudio.load` in its `load_weights()` — -e.g. MOSS-TTS-Nano's `modeling_moss_tts_nano.py` once that integration -lands. diff --git a/.claude/skills/add-tts-model/references/precommit-dco.md b/.claude/skills/add-tts-model/references/precommit-dco.md deleted file mode 100644 index 86a1f42cefb..00000000000 --- a/.claude/skills/add-tts-model/references/precommit-dco.md +++ /dev/null @@ -1,54 +0,0 @@ -# Pre-commit and DCO - -Every commit must pass `pre-commit` lint and carry a `Signed-off-by` line -that matches the commit author email. - -## Pre-commit - -Install hooks once: - -```bash -pre-commit install -``` - -Run before every push on the files you changed: - -```bash -pre-commit run --files \ - vllm_omni/model_executor/models//*.py \ - vllm_omni/entrypoints/openai/serving_speech.py \ - vllm_omni/model_executor/models/registry.py \ - tests/e2e/offline_inference/test_.py \ - tests/e2e/online_serving/test_.py -``` - -When pre-commit **modifies files** (ruff format auto-fix), it exits non-zero -but the changes are correct — stage the modified files and re-commit. - -| Failure | Root cause | Fix | -|---------|-----------|-----| -| `ruff F841` | Variable extracted but never forwarded to model call | Remove the extraction or wire it through | -| `ruff E402` | Import added below function definitions | Move to top-level import block | -| `ruff format` | Line length, spacing, quote style | Accept auto-fix, stage, re-commit | - -## DCO sign-off - -Every commit must carry `Signed-off-by: Your Name `. Use -`-s`: - -```bash -git commit -s -m "feat(): add TTS support" -``` - -Or set it permanently: `git config format.signOff true`. - -The DCO check verifies that the commit author email matches the -`Signed-off-by` line. Confirm `git config user.email` matches your GitHub -account email before committing. - -Fix a missing or mismatched sign-off on the latest commit: - -```bash -git commit --amend -s --no-edit -git push origin --force-with-lease -``` diff --git a/.claude/skills/add-tts-model/references/single-stage-ar.md b/.claude/skills/add-tts-model/references/single-stage-ar.md deleted file mode 100644 index ed53d30261c..00000000000 --- a/.claude/skills/add-tts-model/references/single-stage-ar.md +++ /dev/null @@ -1,108 +0,0 @@ -# Single-Stage AR Pattern - -When the upstream model cannot be cleanly split into an AR stage and a separate -decoder (e.g. MOSS-TTS-Nano, or any model that bundles AR + codec via an -`inference_stream()` generator), run the whole pipeline inside a single AR -worker that yields audio chunks per request. - -This is distinct from VoxCPM2's pattern, which also runs in a single stage but -uses vLLM's native PagedAttention on the base language model with diffusion / -VAE side-computation outside vLLM — see -`plan/voxcpm2_native_ar_design.md` for that variant. - -## Implementation - -1. **Single model file** — load both AR LM and codec inside - `modeling_.py`. -2. **Load weights in `load_weights()`**, not `__init__()` — vLLM initializes - distributed state before any CUDA allocations. -3. **Stream via a per-request generator** stored in `self._stream_gens`: - -```python -class YourModelForCausalLM(nn.Module): - def __init__(self, *, vllm_config, prefix=""): - super().__init__() - self._lm = None # populated in load_weights() - self._stream_gens: dict = {} # request_key → generator - - def load_weights(self, weights): - # Load self._lm here, after vLLM distributed init - ... - - def forward( - self, - input_ids, - positions, - intermediate_tensors=None, - inputs_embeds=None, - runtime_additional_information: list[dict] | None = None, # one dict per request - **kwargs, - ) -> OmniOutput: - infos = runtime_additional_information or [{}] - # Skip dummy/profiling calls - if not runtime_additional_information or all(i.get("_is_dummy") for i in infos): - self._ar_emit_stop_token = True - return OmniOutput(...) # return empty outputs - - outputs, last_flags = [], [] - for info in infos: - request_key = str(info.get("_omni_req_id", "0")) # per-request ID from vLLM - if request_key not in self._stream_gens: - self._stream_gens[request_key] = self._create_stream_gen(info) - try: - chunk, is_last = next(self._stream_gens[request_key]) - except StopIteration: - chunk, is_last = torch.zeros(0), True - if is_last: - del self._stream_gens[request_key] - outputs.append(chunk) - last_flags.append(is_last) - - self._ar_emit_stop_token = all(last_flags) - return OmniOutput(multimodal_outputs={"model_outputs": outputs, ...}) - - def _create_stream_gen(self, info: dict): - """Yield (waveform_tensor, is_last) tuples from inference_stream().""" - for event in self._lm.inference_stream(...): - if event["type"] == "audio": - yield event["waveform"], False - elif event["type"] == "result": - # Fallback: some models emit a single "result" event instead of - # incremental "audio" events — handle both paths - yield event.get("waveform", torch.zeros(0)), True - return - yield torch.zeros(0), True - - def compute_logits(self, hidden_states, sampling_metadata): - # Emit EOS only after the last chunk so the AR scheduler ends the request - ... -``` - -## Key points - -- `runtime_additional_information` is the correct parameter name (not - `**kwargs`) — it carries one dict per request in the batch. -- The request ID is `info.get("_omni_req_id")` — set by vLLM, not by user code. -- Handle both `"audio"` (incremental) and `"result"` (final combined) event - types from upstream models. - -## Stage config - -Single stage with `worker_type: ar`, `engine_output_type: audio`, -`final_output: true`, `is_comprehension: true`, and `async_chunk: false` at -the top level. Omitting any of these causes silent misclassification in the -serving layer. - -## Lint discipline - -Only extract variables from `additional_information` that you actually -forward to the model call — unused extractions trip `ruff F841` in -pre-commit. - -## Reference implementation - -Look for any single-stage AR model under -`vllm_omni/model_executor/models/` — e.g. `moss_tts_nano/` when its -integration lands. If none is in tree yet, follow the skeleton above and -cross-check against the `is_comprehension: true` / `async_chunk: false` -dispatch in `vllm_omni/entrypoints/openai/serving_speech.py`. diff --git a/.claude/skills/readme.md b/.claude/skills/readme.md deleted file mode 100644 index b66f2ecd131..00000000000 --- a/.claude/skills/readme.md +++ /dev/null @@ -1,34 +0,0 @@ -# Claude Skills for vLLM-Omni - -This directory contains Claude Code skills maintained for the `vllm-omni` -repository. These skills capture repeatable workflows for common contributor -tasks such as model integration, pull request review, and release note -generation. - -## Directory Structure - -Each skill lives in its own directory under `.claude/skills/`. A skill may -include: - -- `SKILL.md`: the main workflow and operating instructions -- `references/`: focused reference material used by the skill -- `scripts/`: small helper scripts used by the skill - -## Available Skills - -- `add-diffusion-model`: guides integration of a new diffusion model into - `vllm-omni` -- `add-omni-model`: covers addition of new omni-modality model support -- `add-tts-model`: covers integration of new TTS models and related serving - workflows -- `generate-release-note`: helps prepare release notes for repository changes -- `review-pr`: provides a structured workflow for reviewing pull requests - -## Maintenance Guidelines - -- Keep skill names short and task-oriented. -- Prefer repository-local paths, commands, and examples. -- Avoid hardcoding fast-changing support matrices unless the skill is actively - maintained alongside those changes. -- Treat skills as contributor tooling: optimize for clarity, actionability, and - low maintenance overhead. diff --git a/.claude/skills/vllm-omni-npu-upgrade/SKILL.md b/.claude/skills/vllm-omni-npu-upgrade/SKILL.md deleted file mode 100644 index 1ef7ab39301..00000000000 --- a/.claude/skills/vllm-omni-npu-upgrade/SKILL.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -name: vllm-omni-npu-model-runner-upgrade -description: "Upgrade vllm-omni NPU model runners (OmniNPUModelRunner, NPUARModelRunner, NPUGenerationModelRunner) to align with the latest vllm-ascend NPUModelRunner while preserving omni-specific logic." ---- - -# vLLM-Omni NPU Model Runner Upgrade Skill - -## Overview - -This skill guides the process of upgrading vllm-omni's NPU model runners to align with the latest vllm-ascend codebase while preserving omni-specific enhancements. The NPU runners are designed to run omni multimodal models (like Qwen3-Omni, Bagel, MiMoAudio) on Ascend NPUs. - -## File Structure - -### NPU Model Runner Files -``` -vllm-omni/vllm_omni/platforms/npu/worker/ -├── __init__.py -├── npu_model_runner.py # OmniNPUModelRunner (base class) -├── npu_ar_model_runner.py # NPUARModelRunner (autoregressive) -├── npu_ar_worker.py # AR worker -├── npu_generation_model_runner.py # NPUGenerationModelRunner (diffusion/non-AR) -└── npu_generation_worker.py # Generation worker -``` - -### GPU Reference Files (for omni-specific logic sync) -``` -vllm-omni/vllm_omni/worker/ -├── __init__.py -├── gpu_model_runner.py # OmniGPUModelRunner -├── gpu_ar_model_runner.py # GPUARModelRunner -├── gpu_ar_worker.py -├── gpu_generation_model_runner.py -├── gpu_generation_worker.py -├── mixins.py -├── base.py -└── gpu_memory_utils.py -``` - -### vllm-ascend Reference Files -``` -vllm-ascend/vllm_ascend/worker/ -├── model_runner_v1.py # NPUModelRunner (base class to copy from) -├── npu_input_batch.py -├── block_table.py -├── pcp_utils.py -└── worker.py -``` - -## Inheritance Hierarchy - -``` - GPUModelRunner (vllm) - | - +----------------+----------------+ - | | - OmniGPUModelRunner NPUModelRunner (vllm-ascend) - (vllm_omni/worker) (vllm_ascend/worker) - | | - +----------- OmniNPUModelRunner --+ - (multiple inheritance) - | - +---------------+---------------+ - | | - NPUARModelRunner NPUGenerationModelRunner - (autoregressive) (non-autoregressive/diffusion) -``` - -## Omni-Specific Comment Markers - -Omni-specific logic is marked with comment blocks: -```python -# -------------------------------------- Omni-new ------------------------------------------------- -# ... omni-specific code ... -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -Or simpler variations: -```python -# -------------------------------------- Omni-new ------------------------------------------------- -# ------------------------------------------------------------------------------------------------ -``` - -**Important**: -- Always preserve and add these markers when modifying code. -- **The reference documents (`references/omni-specific-blocks.md`) may not be up-to-date.** Always grep for `Omni-new` in the GPU implementations to find the authoritative list of omni-specific blocks. -- When you discover new omni-specific code that is not documented in the references, please update the reference files. - -## Key Methods Requiring Attention - -### OmniNPUModelRunner (npu_model_runner.py) - -| Method | Description | Omni-Specific Logic | -|--------|-------------|---------------------| -| `load_model` | Load model and initialize talker_mtp | Uses `ACLGraphWrapper` instead of `CUDAGraphWrapper`, initializes talker buffers | -| `_dummy_run` | Warmup/profiling run | talker_mtp dummy forward, `extract_multimodal_outputs` | -| `_model_forward` | Forward pass wrapper | Injects `model_kwargs_extra`, wraps with `OmniOutput`, NPU-specific graph updates | -| `_talker_mtp_forward` | Talker MTP forward for Qwen3-Omni | Uses `set_ascend_forward_context` | - -### NPUARModelRunner (npu_ar_model_runner.py) - -| Method | Description | Omni-Specific Logic | -|--------|-------------|---------------------| -| `__init__` | Initialize with KV transfer manager | `OmniKVTransferManager` setup | -| `execute_model` | Main inference entry | KV transfer handling, `_update_states` override, `extract_multimodal_outputs` | -| `sample_tokens` | Token sampling | Hidden states extraction, multimodal outputs processing, `OmniModelRunnerOutput` | -| `_resolve_global_request_id` | Request ID resolution | For disaggregated inference | - -### NPUGenerationModelRunner (npu_generation_model_runner.py) - -| Method | Description | Omni-Specific Logic | -|--------|-------------|---------------------| -| `_update_request_states` | Update request states for async chunk | async_chunk handling | -| `execute_model` | Generation forward | async_chunk, `seq_token_counts`, `_run_generation_model` | -| `sample_tokens` | Output processing | multimodal output packaging to `OmniModelRunnerOutput` | -| `_dummy_run` | Dummy run override | model_kwargs initialization, multimodal extraction | -| `_run_generation_model` | Run generation model | Calls `_model_forward` with sampler | - -## Upgrade Workflow - -### Step 1: Preparation - -1. **Identify target versions**(Use gh cli to check): - - We're using vllm-omni main branch - - Check the last release of vllm-omni - - Target vllm-ascend version(Just directly use the local latest vllm-ascend code) - -2. **Check GPU-side changes** (since last release): - ```bash - cd /root/vllm-workspace/vllm-omni - git log --oneline --since="" -- vllm_omni/worker/ - ``` - -3. **Read latest vllm-ascend code**: - - We don't track vllm-ascend changes - just directly use the latest code from `/root/vllm-workspace/vllm-ascend/vllm_ascend/worker/model_runner_v1.py` - - Copy the relevant methods and re-insert omni-specific blocks - -### Step 2: Analyze Omni-Specific Logic - -For each NPU model runner file: - -1. **Extract existing omni-specific blocks**: - ```bash - grep -n "Omni-new" vllm_omni/platforms/npu/worker/npu_model_runner.py - ``` - -2. **Document each omni block**: - - Which method it belongs to - - What functionality it provides - - Dependencies on other omni code - -### Step 3: Update Base Class (OmniNPUModelRunner) - -**Note**: Always check the GPU implementation `gpu_model_runner.py` for any new omni logic not yet documented in references. - -1. **Read the latest vllm-ascend `NPUModelRunner.load_model`** -2. **Copy the method, keeping the structure** -3. **Re-insert omni-specific logic** (check GPU `gpu_model_runner.py` for authoritative list): - - Replace `CUDAGraphWrapper` with `ACLGraphWrapper` - - Keep talker_mtp initialization - - Preserve buffer allocations for talker - - Check for any new omni blocks added since last sync - -4. **Update `_dummy_run`**: - - Copy from vllm-ascend - - Compare with GPU `_dummy_run` for omni-specific blocks - - Re-insert all `Omni-new` marked code from GPU version - -5. **Update `_model_forward`**: - - Keep the omni wrapper logic - - Update NPU-specific parts (graph params, SP all-gather) - - Check GPU version for any new omni logic - -### Step 4: Update AR Model Runner - -1. **Compare with GPU `gpu_ar_model_runner.py`** for any new omni features -2. **Copy `execute_model` from vllm-ascend** -3. **Re-insert omni blocks** (reference `references/omni-specific-blocks.md`, but note it may be incomplete): - - **IMPORTANT**: Always check the GPU implementation `gpu_ar_model_runner.py` for all `Omni-new` marked code blocks - - The reference doc may not include newly added omni logic - treat it as a starting point, not exhaustive - - When discovering new omni code blocks, please update `references/omni-specific-blocks.md` - - Common omni blocks include but are not limited to: KV transfer, multimodal outputs, sampling_metadata handling, etc. - -4. **Update `sample_tokens`** (also compare with GPU implementation): - - Compare with `gpu_ar_model_runner.py`'s `sample_tokens` method - - Identify all `Omni-new` marked code blocks - - Ensure NPU version includes all omni-specific logic - -### Step 5: Update Generation Model Runner - -**Note**: Generation model runner may have unique omni logic for diffusion/non-AR models. - -1. **Compare with GPU `gpu_generation_model_runner.py`** - grep for all `Omni-new` blocks -2. **Update `execute_model`**: - - Check GPU version for all omni-specific blocks - - Keep async_chunk handling - - Keep `seq_token_counts` injection - - Update forward/context setup from vllm-ascend - - Look for any new omni logic not documented in references - -3. **Update `_dummy_run`**: - - Copy from vllm-ascend base - - Compare with GPU `_dummy_run` if exists - - Re-insert all omni-specific logic - -### Step 6: Update Imports - -Check and update imports at the top of each file: - -```python -# Common vllm-ascend imports -from vllm_ascend.ascend_forward_context import get_forward_context, set_ascend_forward_context -from vllm_ascend.attention.attention_v1 import AscendAttentionState -from vllm_ascend.attention.utils import using_paged_attention -from vllm_ascend.compilation.acl_graph import ACLGraphWrapper, update_full_graph_params -from vllm_ascend.ops.rotary_embedding import update_cos_sin -from vllm_ascend.utils import enable_sp, lmhead_tp_enable -from vllm_ascend.worker.model_runner_v1 import SEQ_LEN_WITH_MAX_PA_WORKSPACE, NPUModelRunner - -# Omni-specific imports -from vllm_omni.model_executor.models.output_templates import OmniOutput -from vllm_omni.worker.gpu_model_runner import OmniGPUModelRunner -from vllm_omni.outputs import OmniModelRunnerOutput -from vllm_omni.distributed.omni_connectors.kv_transfer_manager import OmniKVTransferManager -``` - -### Step 7: Sync GPU-Side Omni Changes - -1. **Check recent GPU worker changes**: - ```bash - git diff .. -- vllm_omni/worker/gpu_model_runner.py - git diff .. -- vllm_omni/worker/gpu_ar_model_runner.py - ``` - -2. **Identify new omni features** that need to be ported to NPU - -3. **Apply corresponding changes** to NPU runners - -### Step 8: Validation - -1. **Run type checking**: - ```bash - cd /root/vllm-workspace/vllm-omni - python -m py_compile vllm_omni/platforms/npu/worker/npu_model_runner.py - python -m py_compile vllm_omni/platforms/npu/worker/npu_ar_model_runner.py - python -m py_compile vllm_omni/platforms/npu/worker/npu_generation_model_runner.py - ``` - -2. **Run import test**: - ```bash - python -c "from vllm_omni.platforms.npu.worker import *" - ``` - -3. **Run model serving test** (if hardware available): - ```bash - vllm serve --trust-remote-code - ``` - -## Common Pitfalls - -### 1. Forward Context Differences -- GPU uses `set_forward_context` -- NPU uses `set_ascend_forward_context` -- Parameters may differ slightly - -### 2. Graph Wrapper Differences -- GPU: `CUDAGraphWrapper` -- NPU: `ACLGraphWrapper` -- Constructor parameters may differ - -### 3. Buffer Creation -- GPU: `_make_buffer` returns different structure -- NPU: May need numpy=True/False parameter - -### 4. Attention Metadata -- GPU: Uses vllm attention metadata builders -- NPU: Uses `AscendCommonAttentionMetadata` - -### 5. Sampling -- GPU: Uses vllm sampler -- NPU: Uses `AscendSampler` - -## Checklist Before Commit - -- [ ] All omni-specific comment markers preserved -- [ ] New omni logic from GPU side synced -- [ ] Imports updated to latest vllm-ascend -- [ ] No `CUDAGraphWrapper` references in NPU code -- [ ] `set_ascend_forward_context` used instead of `set_forward_context` -- [ ] `ACLGraphWrapper` used for talker_mtp wrapping -- [ ] Type hints match vllm-ascend signatures -- [ ] No duplicate code blocks -- [ ] Python syntax valid (py_compile passes) - -## Reference Files for Comparison - -When upgrading, keep these files open for reference: - -1. **vllm-ascend NPUModelRunner**: `/root/vllm-workspace/vllm-ascend/vllm_ascend/worker/model_runner_v1.py` -2. **vllm GPUModelRunner**: `/root/vllm-workspace/vllm/vllm/v1/worker/gpu_model_runner.py` -3. **vllm-omni OmniGPUModelRunner**: `/root/vllm-workspace/vllm-omni/vllm_omni/worker/gpu_model_runner.py` diff --git a/.claude/skills/vllm-omni-npu-upgrade/references/gpu-to-npu-translation.md b/.claude/skills/vllm-omni-npu-upgrade/references/gpu-to-npu-translation.md deleted file mode 100644 index 89067d37b2d..00000000000 --- a/.claude/skills/vllm-omni-npu-upgrade/references/gpu-to-npu-translation.md +++ /dev/null @@ -1,335 +0,0 @@ -# GPU to NPU Translation Patterns - -This document provides a quick reference for translating GPU code patterns to NPU equivalents when porting omni-specific logic. - -## Import Translations - -### Forward Context -```python -# GPU -from vllm.forward_context import set_forward_context - -# NPU -from vllm_ascend.ascend_forward_context import set_ascend_forward_context -``` - -### Graph Wrapper -```python -# GPU -from vllm.compilation.cuda_graph import CUDAGraphWrapper - -# NPU -from vllm_ascend.compilation.acl_graph import ACLGraphWrapper -``` - -### Attention State -```python -# GPU (no equivalent - uses FlashAttention states directly) - -# NPU -from vllm_ascend.attention.attention_v1 import AscendAttentionState -``` - -### Utilities -```python -# GPU -# (directly use torch.cuda functions) - -# NPU -from vllm_ascend.utils import enable_sp, lmhead_tp_enable -from vllm_ascend.ops.rotary_embedding import update_cos_sin -``` - -## Context Manager Translations - -### Forward Context Setup -```python -# GPU -with set_forward_context( - attn_metadata, - self.vllm_config, - num_tokens=num_tokens_padded, - num_tokens_across_dp=num_tokens_across_dp, - cudagraph_runtime_mode=cudagraph_mode, - batch_descriptor=batch_desc, -): - # forward pass - -# NPU -with set_ascend_forward_context( - attn_metadata, - self.vllm_config, - num_tokens=num_tokens_padded, - num_tokens_across_dp=num_tokens_across_dp, - aclgraph_runtime_mode=cudagraph_mode, # Note: 'aclgraph' not 'cudagraph' - batch_descriptor=batch_desc, - num_actual_tokens=scheduler_output.total_num_scheduled_tokens, - model_instance=self.model, -): - # forward pass -``` - -### Graph Capture Context -```python -# GPU -from vllm.compilation.cuda_graph import graph_capture as cuda_graph_capture -with cuda_graph_capture(self.device): - # capture - -# NPU -from vllm_ascend.worker.model_runner_v1 import graph_capture -with graph_capture(self.device): - # capture -``` - -## Graph Wrapper Usage - -### Creating Graph Wrapper -```python -# GPU -if cudagraph_mode.has_full_cudagraphs() and has_separate_talker: - self.talker_mtp = CUDAGraphWrapper( - talker_mtp, - self.vllm_config, - runtime_mode=CUDAGraphMode.FULL - ) - -# NPU -if cudagraph_mode.has_full_cudagraphs() and has_separate_talker: - self.talker_mtp = ACLGraphWrapper( - talker_mtp, - self.vllm_config, - runtime_mode=CUDAGraphMode.FULL - ) -``` - -### Checking Graph Wrapper Type -```python -# GPU -if not isinstance(self.talker_mtp, CUDAGraphWrapper): - _cudagraph_mode = CUDAGraphMode.NONE - -# NPU -if not isinstance(self.talker_mtp, ACLGraphWrapper): - _cudagraph_mode = CUDAGraphMode.NONE -``` - -## Device Operations - -### Synchronization -```python -# GPU -torch.cuda.synchronize() - -# NPU -torch.npu.synchronize() -``` - -### Stream Operations -```python -# GPU -stream = torch.cuda.Stream(device=device) -torch.cuda.current_stream() - -# NPU -stream = torch.npu.Stream(device=device) -torch.npu.current_stream() -``` - -## Attention Metadata - -### State Setting (NPU-specific) -```python -# GPU - handled internally by attention backends - -# NPU - explicit state setting required -self.attn_state = AscendAttentionState.DecodeOnly -if self.speculative_config and self.speculative_config.method == "mtp": - if self.vllm_config.model_config.use_mla: - self.attn_state = AscendAttentionState.SpecDecoding - else: - self.attn_state = AscendAttentionState.ChunkedPrefill -``` - -### Building Attention Metadata -```python -# GPU - uses vllm attention builders - -# NPU - may need additional parameters -(attn_metadata, spec_decode_common_attn_metadata) = self._build_attention_metadata( - num_tokens=num_tokens_unpadded, - num_tokens_padded=num_tokens_padded, - num_reqs=num_reqs, - num_reqs_padded=num_reqs_padded, - max_query_len=max_num_scheduled_tokens, - ubatch_slices=ubatch_slices_attn, - logits_indices=logits_indices, - use_spec_decode=use_spec_decode, - num_scheduled_tokens=scheduler_output.num_scheduled_tokens, - num_scheduled_tokens_np=num_scheduled_tokens_np, - cascade_attn_prefix_lens=cascade_attn_prefix_lens, -) -``` - -## Rotary Embedding - -### Update Cos/Sin Cache -```python -# GPU - typically handled inside attention - -# NPU - explicit update required before forward -from vllm_ascend.ops.rotary_embedding import update_cos_sin -update_cos_sin(positions) -``` - -## Sequence Parallelism - -### Enable SP Check -```python -# GPU - use vllm distributed utilities - -# NPU - use vllm-ascend wrapper -from vllm_ascend.utils import enable_sp - -if enable_sp(): - # sequence parallelism enabled -``` - -## Sampler - -### Sampler Type -```python -# GPU - uses vllm sampler -self.sampler = Sampler() - -# NPU - uses AscendSampler -from vllm_ascend.sample.sampler import AscendSampler -self.sampler = AscendSampler() -``` - -## Input Batch - -### Batch Class -```python -# GPU -from vllm.v1.worker.gpu_input_batch import InputBatch - -# NPU -from vllm_ascend.worker.npu_input_batch import NPUInputBatch -``` - -## Graph Parameter Updates - -### Full Graph Params Update (NPU-specific) -```python -# GPU - not needed - -# NPU - required for FULL graph mode -from vllm_ascend.compilation.acl_graph import update_full_graph_params - -forward_context = get_forward_context() -if ( - forward_context.cudagraph_runtime_mode == CUDAGraphMode.FULL - and not forward_context.capturing - and not self.use_sparse -): - update_full_graph_params( - self.attn_backend, - self.update_stream, - forward_context, - num_tokens_padded, - self.vllm_config, - self.speculative_config, - positions.shape[0], - ) -``` - -## Paged Attention Check - -```python -# GPU - not typically needed - -# NPU -from vllm_ascend.attention.utils import using_paged_attention - -if is_graph_capturing and using_paged_attention(num_tokens, self.vllm_config): - seq_lens = SEQ_LEN_WITH_MAX_PA_WORKSPACE -``` - -## Common Method Signature Differences - -### _dummy_run Parameters -```python -# GPU (v0.17.0) -def _dummy_run( - self, - num_tokens: int, - cudagraph_runtime_mode: CUDAGraphMode | None = None, - force_attention: bool = False, - uniform_decode: bool = False, - allow_microbatching: bool = True, - skip_eplb: bool = False, - is_profile: bool = False, - create_mixed_batch: bool = False, - remove_lora: bool = True, - is_graph_capturing: bool = False, - num_active_loras: int = 0, -) -> tuple[torch.Tensor, torch.Tensor]: - -# NPU (v0.17.0) - adds with_prefill, activate_lora -def _dummy_run( - self, - num_tokens: int, - with_prefill: bool = False, - cudagraph_runtime_mode: CUDAGraphMode | None = None, - force_attention: bool = False, - uniform_decode: bool = False, - is_profile: bool = False, - create_mixed_batch: bool = False, - allow_microbatching: bool = True, - skip_eplb: bool = False, - remove_lora: bool = True, - activate_lora: bool = False, - is_graph_capturing: bool = False, - num_active_loras: int = 0, -) -> tuple[torch.Tensor, torch.Tensor]: -``` - -### _model_forward Parameters -```python -# GPU - no num_tokens_padded -def _model_forward( - self, - input_ids: torch.Tensor | None = None, - positions: torch.Tensor | None = None, - intermediate_tensors: IntermediateTensors | None = None, - inputs_embeds: torch.Tensor | None = None, - **model_kwargs: dict[str, Any], -): - -# NPU - has num_tokens_padded as first parameter -def _model_forward( - self, - num_tokens_padded: int, - input_ids: torch.Tensor | None = None, - positions: torch.Tensor | None = None, - intermediate_tensors: IntermediateTensors | None = None, - inputs_embeds: torch.Tensor | None = None, - **model_kwargs: dict[str, Any], -): -``` - -## Quick Reference Table - -| Feature | GPU | NPU | -|---------|-----|-----| -| Graph wrapper | `CUDAGraphWrapper` | `ACLGraphWrapper` | -| Forward context | `set_forward_context` | `set_ascend_forward_context` | -| Runtime mode param | `cudagraph_runtime_mode` | `aclgraph_runtime_mode` | -| Device sync | `torch.cuda.synchronize()` | `torch.npu.synchronize()` | -| Stream | `torch.cuda.Stream` | `torch.npu.Stream` | -| Current stream | `torch.cuda.current_stream()` | `torch.npu.current_stream()` | -| Input batch | `InputBatch` | `NPUInputBatch` | -| Sampler | `Sampler` | `AscendSampler` | -| Attention state | N/A | `AscendAttentionState` | -| RoPE update | N/A | `update_cos_sin()` | diff --git a/.claude/skills/vllm-omni-npu-upgrade/references/omni-specific-blocks.md b/.claude/skills/vllm-omni-npu-upgrade/references/omni-specific-blocks.md deleted file mode 100644 index 8c5d32ab4c1..00000000000 --- a/.claude/skills/vllm-omni-npu-upgrade/references/omni-specific-blocks.md +++ /dev/null @@ -1,374 +0,0 @@ -# Omni-Specific Code Blocks Reference - -This document catalogs omni-specific code blocks in the NPU model runners, making it easier to identify what needs to be preserved during upgrades. - -> **IMPORTANT**: This document may not be complete or up-to-date! -> -> - Always grep for `Omni-new` in the GPU implementations (`vllm_omni/worker/`) to find the authoritative list -> - New omni features may be added that are not yet documented here -> - When you discover new omni-specific blocks during an upgrade, please update this document -> - Last verified: Check git history for this file - -## OmniNPUModelRunner (npu_model_runner.py) - -### load_model - Talker MTP Initialization - -```python -def load_model(self, *args, **kwargs) -> None: - NPUModelRunner.load_model(self, *args, **kwargs) - # Initialize enable_sp cache to avoid get_current_vllm_config() error - # in _pad_for_sequence_parallelism during execute_model. - # This is a workaround for vllm-ascend not passing vllm_config to enable_sp(). - enable_sp(self.vllm_config) - # TODO move this model specific logic to a separate class - # TTS model IS the talker (no .talker sub-attr); use getattr to support both Omni and TTS. - talker_mtp = getattr(self.model, "talker_mtp", None) - if talker_mtp is not None: - self.talker_mtp = talker_mtp # type: ignore[assignment] - cudagraph_mode = self.compilation_config.cudagraph_mode - assert cudagraph_mode is not None - # Only wrap talker_mtp in CUDAGraphWrapper for Omni models that - # have a separate .talker sub-module. TTS models' code predictor - # has internal AR loops / torch.multinomial — not graph-safe. - has_separate_talker = getattr(self.model, "talker", None) is not None - if cudagraph_mode.has_full_cudagraphs() and has_separate_talker: - # NOTE: Use ACLGraphWrapper on NPU, not CUDAGraphWrapper - self.talker_mtp = ACLGraphWrapper(talker_mtp, self.vllm_config, runtime_mode=CUDAGraphMode.FULL) - # TTS exposes mtp_hidden_size; Omni uses hf_text_config.hidden_size. - hidden_size = int( - getattr(self.model, "mtp_hidden_size", 0) or getattr(self.model_config.hf_text_config, "hidden_size") - ) - max_batch_size = max(self.max_num_reqs, self.compilation_config.max_cudagraph_capture_size) - self.talker_mtp_input_ids = self._make_buffer(max_batch_size, dtype=torch.int32) - self.talker_mtp_inputs_embeds = self._make_buffer( - max_batch_size, hidden_size, dtype=self.dtype, numpy=False - ) - self.last_talker_hidden = self._make_buffer(max_batch_size, hidden_size, dtype=self.dtype, numpy=False) - self.text_step = self._make_buffer(max_batch_size, hidden_size, dtype=self.dtype, numpy=False) -``` - -### _dummy_run - Talker MTP Dummy Forward - -Location: Inside `set_ascend_forward_context` block, before main model forward - -```python -# ---------------------------------------Omni-new---------------------------------------------- -if getattr(self.model, "talker", None) is not None and hasattr(self.model, "talker_mtp"): - num_tokens_padded_talker_mtp = num_tokens_padded - if num_tokens_padded_talker_mtp == self.max_num_tokens: - num_tokens_padded_talker_mtp = self.talker_mtp_input_ids.gpu.shape[0] - outputs = self.talker_mtp( - self.talker_mtp_input_ids.gpu[:num_tokens_padded_talker_mtp], - self.talker_mtp_inputs_embeds.gpu[:num_tokens_padded_talker_mtp], - self.last_talker_hidden.gpu[:num_tokens_padded_talker_mtp], - self.text_step.gpu[:num_tokens_padded_talker_mtp], - ) - self.compilation_config.cache_dir = None -# ---------------------------------------Omni-new---------------------------------------------- -``` - -### _dummy_run - Extract Multimodal Outputs - -Location: After model forward, before dummy_compute_logits - -```python -# ---------------------------------------Omni-new---------------------------------------------- -hidden_states, multimodal_outputs = self.extract_multimodal_outputs(hidden_states) -# ---------------------------------------Omni-new---------------------------------------------- -``` - -### _model_forward - Omni Output Wrapping - -```python -def _model_forward( - self, - num_tokens_padded: int, - input_ids: torch.Tensor | None = None, - positions: torch.Tensor | None = None, - intermediate_tensors: IntermediateTensors | None = None, - inputs_embeds: torch.Tensor | None = None, - **model_kwargs: dict[str, Any], -): - """Override to combine NPUModelRunner's signature with OmniGPUModelRunner's logic.""" - # Omni-specific: build and inject extra model kwargs - model_kwargs_extra = self._build_model_kwargs_extra() - - # Call the model forward (same as NPUModelRunner) - assert self.model is not None - model_output = self.model( - input_ids=input_ids, - positions=positions, - intermediate_tensors=intermediate_tensors, - inputs_embeds=inputs_embeds, - **model_kwargs, - **model_kwargs_extra, - ) - - # Omni-specific: wrap output if needed - if not isinstance(model_output, OmniOutput) and hasattr(self.model, "make_omni_output"): - model_output = self.model.make_omni_output(model_output, **model_kwargs_extra) - - # Omni-specific: cache model output for later sample_tokens - self._omni_last_model_output = model_output - - # NPU-specific: update full graph params (keep from vllm-ascend) - forward_context = get_forward_context() - # ... NPU graph update logic ... - - # NPU-specific: all-gather for sequence parallelism (keep from vllm-ascend) - if get_forward_context().sp_enabled and not isinstance(model_output, IntermediateTensors): - model_output = self._all_gather_hidden_states_and_aux(model_output) - - return model_output -``` - ---- - -## NPUARModelRunner (npu_ar_model_runner.py) - -### __init__ - KV Transfer Manager - -```python -def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.input_ids = self._make_buffer(self.max_num_tokens, dtype=torch.int32) - # each model stage has their own hidden size - self.hidden_size = self.model_config.hf_text_config.hidden_size - self.inputs_embeds = self._make_buffer(self.max_num_tokens, self.hidden_size, dtype=self.dtype, numpy=False) - # Initialize KV cache manager (preserve vllm_config fallback behavior) - self.kv_transfer_manager = OmniKVTransferManager.from_vllm_config(self.vllm_config, self.model_config) -``` - -### execute_model - KV Transfer Before Update States - -Location: At the very beginning of execute_model - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -# [Omni] Handle KV transfer BEFORE updating states (which removes finished requests) -self.kv_extracted_req_ids = self.kv_transfer_manager.handle_finished_requests_kv_transfer( - finished_reqs=getattr(scheduler_output, "finished_requests_needing_kv_transfer", {}), - kv_caches=self.kv_caches, - block_size=self.cache_config.block_size, - cache_dtype=str(self.cache_config.cache_dtype), - request_id_resolver=self._resolve_global_request_id, -) -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### execute_model - Custom _update_states Call - -Location: Inside synchronize_input_prep context - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -self._update_states(scheduler_output) -# ------------------------------------------------------------------------------------------------ -``` - -### execute_model - Extract Multimodal Outputs - -Location: In post process section, after hidden_states assignment - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -hidden_states, multimodal_outputs = self.extract_multimodal_outputs(hidden_states) - -if multimodal_outputs is not None: - keys_or_type = ( - list(multimodal_outputs.keys()) - if isinstance(multimodal_outputs, dict) - else type(multimodal_outputs) - ) - logger.debug(f"[AR] execute_model: multimodal_outputs keys = {keys_or_type}") -else: - logger.debug("[AR] execute_model: multimodal_outputs is None") -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### execute_model - Compute Logits with sampling_metadata - -Location: In both broadcast_pp_output True and False branches - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -# Try with sampling_metadata first; fall back to without for models that don't support it -try: - logits = self.model.compute_logits( - sample_hidden_states, sampling_metadata=self.input_batch.sampling_metadata - ) -except TypeError: - logits = self.model.compute_logits(sample_hidden_states) -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### sample_tokens - KV Extracted Req IDs - -Location: At the beginning of sample_tokens - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -kv_extracted_req_ids = getattr(self, "kv_extracted_req_ids", None) -self.kv_extracted_req_ids = None -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### sample_tokens - Process Additional Information and Build Output - -Location: After bookkeeping sync, replacing the original output construction - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -hidden_states_cpu = hidden_states.detach().to("cpu").contiguous() -num_scheduled_tokens_np = getattr(self, "_omni_num_scheduled_tokens_np", None) -if num_scheduled_tokens_np is None: - req_ids = self.input_batch.req_ids - num_scheduled_tokens_np = np.array( - [scheduler_output.num_scheduled_tokens[rid] for rid in req_ids], - dtype=np.int32, - ) - -self._process_additional_information_updates( - hidden_states, multimodal_outputs, num_scheduled_tokens_np, scheduler_output -) - -pooler_output: list[dict[str, object]] = [] -for rid in req_ids_output_copy: - idx = req_id_to_index_output_copy[rid] - start = int(self.query_start_loc.cpu[idx]) - sched = int(num_scheduled_tokens_np[idx]) - end = start + sched - hidden_slice = hidden_states_cpu[start:end] - payload: dict[str, object] = {"hidden": hidden_slice} - if isinstance(multimodal_outputs, dict) and multimodal_outputs: - # ... multimodal output slicing logic ... - pooler_output.append(payload) - -model_runner_output = OmniModelRunnerOutput( - req_ids=req_ids_output_copy, - req_id_to_index=req_id_to_index_output_copy, - sampled_token_ids=valid_sampled_token_ids, - logprobs=logprobs_lists, - prompt_logprobs_dict=prompt_logprobs_dict, - pooler_output=(pooler_output if self.vllm_config.model_config.engine_output_type != "text" else None), - kv_connector_output=kv_connector_output, -) -model_runner_output.kv_extracted_req_ids = kv_extracted_req_ids -# -------------------------------------- Omni-new ------------------------------------------------- -``` - ---- - -## NPUGenerationModelRunner (npu_generation_model_runner.py) - -### execute_model - Async Chunk Update - -Location: Inside prepare input section, before synchronize_input_prep - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -if self.model_config.async_chunk and num_scheduled_tokens: - self._update_request_states(scheduler_output) -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### execute_model - Seq Token Counts - -Location: After _preprocess call - -```python -# [Omni] Pass token counts per request for code2wav output slicing -model_kwargs["seq_token_counts"] = tokens -``` - -### execute_model - Run Generation Model - -Location: Inside forward context - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -outputs = self._run_generation_model( - num_tokens_padded=num_tokens_padded, - input_ids=input_ids, - positions=positions, - intermediate_tensors=intermediate_tensors, - inputs_embeds=inputs_embeds, - model_kwargs=model_kwargs, - logits_indices=logits_indices, -) -_, multimodal_outputs = self.extract_multimodal_outputs(outputs) -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### sample_tokens - Multimodal Output Processing - -The entire sample_tokens method body is omni-specific for generation models: - -```python -# -------------------------------------- Omni-new ------------------------------------------------- -pooler_output: list[object] = [] -if isinstance(multimodal_outputs, torch.Tensor): - # ... tensor handling ... -elif isinstance(multimodal_outputs, list): - # ... list handling ... -elif isinstance(multimodal_outputs, dict): - # ... dict handling per request ... -else: - raise RuntimeError("Unsupported diffusion output type") -# [Omni] Copy req_id mappings to avoid async scheduling mutation. -req_ids_output_copy = self.input_batch.req_ids.copy() -req_id_to_index_output_copy = self.input_batch.req_id_to_index.copy() -output = OmniModelRunnerOutput( - req_ids=req_ids_output_copy, - req_id_to_index=req_id_to_index_output_copy, - sampled_token_ids=[], - logprobs=None, - prompt_logprobs_dict={}, - pooler_output=pooler_output, - kv_connector_output=kv_connector_output, - num_nans_in_logits={}, - ec_connector_output=ec_connector_output if self.supports_mm_inputs else None, -) -# -------------------------------------- Omni-new ------------------------------------------------- -``` - -### _dummy_run - Model Kwargs Init and Multimodal Extract - -Location: Before model forward and after - -```python -model_kwargs = self._init_model_kwargs() # Before forward - -# ... forward ... - -# -------------------------------------- Omni-new ------------------------------------------------- -hidden_states, _ = self.extract_multimodal_outputs(hidden_states) -# ------------------------------------------------------------------------------------------------- -``` - ---- - -## ExecuteModelState Extension - -The `ExecuteModelState` NamedTuple is extended for omni: - -```python -class ExecuteModelState(NamedTuple): - """Ephemeral cached state transferred between execute_model() and - sample_tokens(), after execute_model() returns None.""" - - scheduler_output: SchedulerOutput - logits: torch.Tensor - spec_decode_metadata: SpecDecodeMetadata | None - spec_decode_common_attn_metadata: AscendCommonAttentionMetadata | None - hidden_states: torch.Tensor - sample_hidden_states: torch.Tensor - aux_hidden_states: list[torch.Tensor] | None - attn_metadata: PerLayerAttnMetadata - positions: torch.Tensor - ec_connector_output: ECConnectorOutput | None - cudagraph_stats: CUDAGraphStat | None - multimodal_outputs: Any # <-- Omni extension -``` - -This extended state must be imported from `npu_ar_model_runner` in `npu_generation_model_runner`. diff --git a/.claude/skills/vllm-omni-npu-upgrade/references/workflow-checklist.md b/.claude/skills/vllm-omni-npu-upgrade/references/workflow-checklist.md deleted file mode 100644 index 4f184df0ecb..00000000000 --- a/.claude/skills/vllm-omni-npu-upgrade/references/workflow-checklist.md +++ /dev/null @@ -1,222 +0,0 @@ -# NPU Model Runner Upgrade Workflow Checklist - -> **Note**: Reference documents (`omni-specific-blocks.md`) may not be complete. Always grep for `Omni-new` in GPU implementations to find all omni-specific code blocks. Update the reference docs when discovering new blocks. - -## Pre-Upgrade Preparation - -### 1. Version Information -- [ ] Identify current vllm-omni version: `_________` -- [ ] Identify target vllm-ascend version: `_________` -- [ ] Identify target vllm version: `_________` -- [ ] Last release date for GPU worker changes: `_________` - -### 2. Gather Git History -```bash -# GPU-side omni changes since last release -cd /root/vllm-workspace/vllm-omni -git log --oneline --since="YYYY-MM-DD" -- vllm_omni/worker/ - -# vllm-ascend NPUModelRunner changes -cd /root/vllm-workspace/vllm-ascend -git log --oneline .. -- vllm_ascend/worker/model_runner_v1.py -``` - -### 3. Backup Current Files -- [ ] Create backup of current NPU runners: - ```bash - cp -r vllm_omni/platforms/npu/worker vllm_omni/platforms/npu/worker.backup - ``` - ---- - -## OmniNPUModelRunner (npu_model_runner.py) - -### Read and Understand -- [ ] Read current `npu_model_runner.py` -- [ ] Read latest `vllm_ascend/worker/model_runner_v1.py` -- [ ] Read latest `vllm_omni/worker/gpu_model_runner.py` - -### Method: load_model -- [ ] Document existing omni-specific logic -- [ ] Copy latest NPUModelRunner.load_model structure -- [ ] Re-insert: `enable_sp(self.vllm_config)` call -- [ ] Re-insert: talker_mtp detection and setup -- [ ] Replace: `CUDAGraphWrapper` → `ACLGraphWrapper` -- [ ] Re-insert: Buffer allocations (talker_mtp_input_ids, etc.) - -### Method: _dummy_run -- [ ] Document existing omni-specific logic locations -- [ ] Copy latest NPUModelRunner._dummy_run -- [ ] Re-insert: talker_mtp dummy forward block (inside context) -- [ ] Re-insert: `extract_multimodal_outputs` call -- [ ] Verify: Comment markers are present - -### Method: _model_forward -- [ ] Copy latest NPUModelRunner._model_forward structure -- [ ] Re-insert: `_build_model_kwargs_extra()` call -- [ ] Re-insert: OmniOutput wrapping logic -- [ ] Re-insert: `_omni_last_model_output` caching -- [ ] Keep: NPU graph params update -- [ ] Keep: SP all-gather logic - -### Method: _talker_mtp_forward -- [ ] Verify: Uses `set_ascend_forward_context` -- [ ] Verify: Uses `ACLGraphWrapper` check -- [ ] Sync any changes from GPU `_talker_mtp_forward` - -### Imports -- [ ] Update vllm-ascend imports to latest paths -- [ ] Verify all omni imports are present -- [ ] Remove any deprecated imports - ---- - -## NPUARModelRunner (npu_ar_model_runner.py) - -### Read and Understand -- [ ] Read current `npu_ar_model_runner.py` -- [ ] Read latest `vllm_ascend/worker/model_runner_v1.py` execute_model -- [ ] Read latest `vllm_omni/worker/gpu_ar_model_runner.py` - -### Method: __init__ -- [ ] Sync any new initialization from GPU side -- [ ] Keep: `OmniKVTransferManager` setup -- [ ] Keep: Custom buffer allocations - -### Method: execute_model -- [ ] Document all omni blocks with line numbers -- [ ] Copy latest NPUModelRunner.execute_model structure -- [ ] Re-insert: KV transfer handling (beginning) -- [ ] Re-insert: Custom `_update_states` call -- [ ] Re-insert: `extract_multimodal_outputs` -- [ ] Re-insert: `compute_logits` with sampling_metadata try/except -- [ ] Update: ExecuteModelState to include multimodal_outputs - -### Method: sample_tokens -- [ ] Document all omni blocks -- [ ] Copy latest NPUModelRunner.sample_tokens structure -- [ ] Re-insert: `kv_extracted_req_ids` handling -- [ ] Re-insert: Hidden states CPU copy -- [ ] Re-insert: `_process_additional_information_updates` -- [ ] Re-insert: `OmniModelRunnerOutput` construction - -### ExecuteModelState -- [ ] Verify: `multimodal_outputs` field is present -- [ ] Verify: Imported/used correctly in execute_model - -### Imports -- [ ] Update all vllm-ascend imports -- [ ] Keep omni-specific imports - ---- - -## NPUGenerationModelRunner (npu_generation_model_runner.py) - -### Read and Understand -- [ ] Read current `npu_generation_model_runner.py` -- [ ] Read latest GPU `gpu_generation_model_runner.py` - -### Method: _update_request_states -- [ ] Verify: async_chunk handling is correct -- [ ] Sync any changes from GPU side - -### Method: execute_model -- [ ] Document all omni blocks -- [ ] Copy latest NPUModelRunner.execute_model base structure -- [ ] Re-insert: async_chunk update logic -- [ ] Re-insert: `seq_token_counts` injection -- [ ] Re-insert: `_run_generation_model` call -- [ ] Re-insert: `extract_multimodal_outputs` -- [ ] Use: ExecuteModelState from npu_ar_model_runner - -### Method: sample_tokens -- [ ] Keep: Entire omni multimodal output processing -- [ ] Update: Any new output fields needed -- [ ] Keep: `OmniModelRunnerOutput` construction - -### Method: _run_generation_model -- [ ] Sync any changes from GPU side -- [ ] Keep: `_model_forward` call with sampler - -### Method: _dummy_run -- [ ] Copy latest NPUModelRunner._dummy_run -- [ ] Re-insert: `model_kwargs = self._init_model_kwargs()` -- [ ] Re-insert: `extract_multimodal_outputs` at end - -### Imports -- [ ] Import ExecuteModelState from npu_ar_model_runner -- [ ] Update vllm-ascend imports - ---- - -## Post-Upgrade Validation - -### Syntax Validation -- [ ] `python -m py_compile vllm_omni/platforms/npu/worker/npu_model_runner.py` -- [ ] `python -m py_compile vllm_omni/platforms/npu/worker/npu_ar_model_runner.py` -- [ ] `python -m py_compile vllm_omni/platforms/npu/worker/npu_generation_model_runner.py` - -### Import Validation -- [ ] `python -c "from vllm_omni.platforms.npu.worker.npu_model_runner import OmniNPUModelRunner"` -- [ ] `python -c "from vllm_omni.platforms.npu.worker.npu_ar_model_runner import NPUARModelRunner"` -- [ ] `python -c "from vllm_omni.platforms.npu.worker.npu_generation_model_runner import NPUGenerationModelRunner"` - -### Comment Markers -- [ ] Grep for "Omni-new" in all three files -- [ ] Verify all omni blocks have closing markers - -### Code Review -- [ ] No `CUDAGraphWrapper` references -- [ ] All `set_forward_context` replaced with `set_ascend_forward_context` -- [ ] Parameter names correct (`aclgraph_runtime_mode` not `cudagraph_runtime_mode`) -- [ ] No duplicate code blocks -- [ ] No missing imports - ---- - -## Git Commit - -### Commit Message Template -``` -[NPU] Upgrade model runners to align with vllm-ascend vX.Y.Z - -- Update OmniNPUModelRunner with latest NPUModelRunner base -- Update NPUARModelRunner execute_model and sample_tokens -- Update NPUGenerationModelRunner for async_chunk changes -- Sync GPU-side omni changes from vX.Y.Z release -- Preserve all omni-specific logic (marked with Omni-new comments) - -Changes from vllm-ascend: -- - -Changes synced from GPU: -- -``` - -### Files to Stage -- [ ] `vllm_omni/platforms/npu/worker/npu_model_runner.py` -- [ ] `vllm_omni/platforms/npu/worker/npu_ar_model_runner.py` -- [ ] `vllm_omni/platforms/npu/worker/npu_generation_model_runner.py` -- [ ] Any other modified files - ---- - -## Troubleshooting - -### Import Errors -- Check if vllm-ascend module paths have changed -- Verify PYTHONPATH includes both vllm-ascend and vllm-omni - -### Type Errors -- Check method signatures match between GPU and NPU -- Verify NamedTuple fields match expected structure - -### Runtime Errors -- Enable debug logging: `export VLLM_LOGGING_LEVEL=DEBUG` -- Check graph capture issues: try `--enforce-eager` -- Check attention issues: verify AscendAttentionState usage - -### Performance Regression -- Compare with previous version on same model -- Check if graph capture is working: look for ACLGraph logs -- Verify SP/EP configurations are correct diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 9f1b343de6d..00000000000 --- a/.gitattributes +++ /dev/null @@ -1,45 +0,0 @@ -# Set default behavior to automatically normalize line endings -* text=auto - -# Explicitly declare text files you want to always be normalized and converted -# to native line endings on checkout -*.py text eol=lf -*.yaml text eol=lf -*.yml text eol=lf -*.md text eol=lf -*.txt text eol=lf -*.json text eol=lf -*.toml text eol=lf -*.sh text eol=lf -*.bat text eol=crlf -*.cmd text eol=crlf - -# Declare files that will always have CRLF line endings on checkout -*.bat text eol=crlf -*.cmd text eol=crlf - -# Denote all files that are truly binary and should not be modified -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.mov binary -*.mp4 binary -*.mp3 binary -*.wav binary -*.flv binary -*.fla binary -*.swf binary -*.gz binary -*.zip binary -*.7z binary -*.ttf binary -*.eot binary -*.woff binary -*.woff2 binary -*.pyc binary -*.pdf binary -*.ai binary -*.psd binary -*.xcf binary diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 23731948120..00000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,17 +0,0 @@ -# CODEOWNERS is used to automatically assign PR reviewers -# Format: path pattern @username or @team -# More info: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners - -# Default owners (fallback reviewers for all files) -# later, we can add more reviewers here -* @hsliuustc0106 - -# Assign reviewers by directory -/.github/ @owner1 -/tests/ @owner1 -/docs/ @owner1 - -# Example: reviewers for specific directories -# /examples/offline_inference/ @offline-inference-team -# /vllm_omni/core/ @core-team -# /vllm_omni/model_executor/ @model-team diff --git a/.github/ISSUE_TEMPLATE/100-documentation.yml b/.github/ISSUE_TEMPLATE/100-documentation.yml deleted file mode 100644 index 230c6259efb..00000000000 --- a/.github/ISSUE_TEMPLATE/100-documentation.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: 📚 Documentation -description: Report an issue related to documentation -title: "[Doc]: " -labels: ["documentation"] - -body: -- type: textarea - attributes: - label: 📚 The doc issue - description: > - A clear and concise description of what content in the documentation is an issue. - validations: - required: true -- type: textarea - attributes: - label: Suggest a potential alternative/fix - description: > - Tell us how we could improve the documentation in this regard. -- type: markdown - attributes: - value: > - Thanks for contributing 🎉! -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/200-installation.yml b/.github/ISSUE_TEMPLATE/200-installation.yml deleted file mode 100644 index 83112901815..00000000000 --- a/.github/ISSUE_TEMPLATE/200-installation.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: 🛠️ Installation -description: Report an issue here when you hit errors during installation. -title: "[Installation]: " -labels: ["installation"] - -body: -- type: markdown - attributes: - value: > - #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/vllm-project/vllm-omni/issues?q=is%3Aissue+sort%3Acreated-desc+). -- type: textarea - attributes: - label: Your current environment - description: | - Please run the following and paste the output below. - ```sh - wget https://raw.githubusercontent.com/vllm-project/vllm-omni/main/vllm_omni/collect_env.py - # For security purposes, please feel free to check the contents of collect_env.py before running it. - python collect_env.py - ``` - It is suggested to download and execute the latest script, as vllm-omni might frequently update the diagnosis information needed for accurately and quickly responding to issues. - value: | - ```text - The output of `python collect_env.py` - ``` - validations: - required: true -- type: textarea - attributes: - label: How you are installing vllm-omni - description: | - Paste the full command you are trying to execute. - value: | - ```sh - pip install -vvv vllm-omni - ``` -- type: markdown - attributes: - value: > - Thanks for contributing 🎉! -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/400-bug-report.yml b/.github/ISSUE_TEMPLATE/400-bug-report.yml deleted file mode 100644 index c3799b19400..00000000000 --- a/.github/ISSUE_TEMPLATE/400-bug-report.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: 🐛 Bug report -description: Raise an issue here if you find a bug. -title: "[Bug]: " -labels: ["bug"] - -body: -- type: markdown - attributes: - value: > - #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/vllm-project/vllm-omni/issues?q=is%3Aissue+sort%3Acreated-desc+). -- type: markdown - attributes: - value: | - ⚠️ **SECURITY WARNING:** Please review any text you paste to ensure it does not contain sensitive information such as: - - API tokens or keys (e.g., Hugging Face tokens, OpenAI API keys) - - Passwords or authentication credentials - - Private URLs or endpoints - - Personal or confidential data - - Consider redacting or replacing sensitive values with placeholders like `` when sharing configuration or code examples. -- type: textarea - attributes: - label: Your current environment - description: | - Please run the following and paste the output below. - ```sh - wget https://raw.githubusercontent.com/vllm-project/vllm-omni/main/collect_env.py - # For security purposes, please feel free to check the contents of collect_env.py before running it. - python collect_env.py - ``` - It is suggested to download and execute the latest script, as vllm-omni might frequently update the diagnosis information needed for accurately and quickly responding to issues. - value: | -
- The output of python collect_env.py - - ```text - Your output of `python collect_env.py` here - ``` - -
- validations: - required: true - -- type: textarea - attributes: - label: Your code version - description: | - Please provide a description of which commit id or version the code is. - - value: | -
- The commit id or version of vllm - - ```text - - ``` -
-
- The commit id or version of vllm-omni - - ```text - - ``` -
- validations: - required: true - -- type: textarea - attributes: - label: 🐛 Describe the bug - description: | - Please provide a clear and concise description of what the bug is. - - If relevant, add a minimal example so that we can reproduce the error by running the code. It is very important for the snippet to be as succinct (minimal) as possible, so please take time to trim down any irrelevant code to help us debug efficiently. We are going to copy-paste your code and we expect to get the same result as you did: avoid any external data, and include the relevant imports, etc. For example: - - ```python - from vllm_omni.entrypoints.omni import Omni - from vllm_omni.inputs.data import OmniDiffusionSamplingParams - from vllm import SamplingParams - - omni = Omni( - model="Qwen/Qwen-Image", - stage_configs_path="/path/to/stage_configs.yaml", - ) - - prompts = [{"prompt": "A scenic watercolor painting of a lighthouse at sunset"}] - sampling_params_list = [ - SamplingParams(max_tokens=1), - OmniDiffusionSamplingParams(num_outputs_per_prompt=1), - ] - outputs = omni.generate(prompts=prompts, sampling_params_list=sampling_params_list) - ``` - - If the code is too long (hopefully, it isn't), feel free to put it in a public gist and link it in the issue: https://gist.github.com. - - Please also paste or describe the results you observe instead of the expected results. If you observe an error, please paste the error message including the **full** traceback of the exception. It may be relevant to wrap error messages in ```` ```triple quotes blocks``` ````. - - Please set the environment variable `export VLLM_OMNI_LOGGING_LEVEL=DEBUG` to turn on more logging to help debugging potential issues. - - If you experienced crashes or hangs, it would be helpful to run vllm-omni with `export VLLM_OMNI_TRACE_FUNCTION=1` . All the function calls in vllm-omni will be recorded. Inspect these log files, and tell which function crashes or hangs. - placeholder: | - A clear and concise description of what the bug is. - - ```python - # Sample code to reproduce the problem - ``` - - ``` - The error message you got, with the full traceback and the error logs with [dump_input.py:##] if present. - ``` - validations: - required: true -- type: markdown - attributes: - value: | - ⚠️ Please separate bugs of `transformers` implementation or usage from bugs of `vllm-omni`. If you think anything is wrong with the model's output: - - - Try the counterpart of `transformers` first. If the error appears, please go to [their issues](https://github.com/huggingface/transformers/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc). - - - If the error only appears in vllm-omni, please provide the detailed script of how you run `transformers` and `vllm-omni`, also highlight the difference and what you expect. - - Thanks for reporting 🙏! -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/500-feature-request.yml b/.github/ISSUE_TEMPLATE/500-feature-request.yml deleted file mode 100644 index 98dec8276a6..00000000000 --- a/.github/ISSUE_TEMPLATE/500-feature-request.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: 🚀 Feature request -description: Submit a proposal/request for a new vllm-omni feature -title: "[Feature]: " -labels: ["feature request"] - -body: -- type: markdown - attributes: - value: > - #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/vllm-project/vllm-omni/issues?q=is%3Aissue+sort%3Acreated-desc+). -- type: textarea - attributes: - label: 🚀 The feature, motivation and pitch - description: > - A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. - validations: - required: true -- type: textarea - attributes: - label: Alternatives - description: > - A description of any alternative solutions or features you've considered, if any. -- type: textarea - attributes: - label: Additional context - description: > - Add any other context or screenshots about the feature request. -- type: markdown - attributes: - value: > - Thanks for contributing 🎉! -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/600-new-model.yml b/.github/ISSUE_TEMPLATE/600-new-model.yml deleted file mode 100644 index cf621ba1dc7..00000000000 --- a/.github/ISSUE_TEMPLATE/600-new-model.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: 🤗 Support request for a new model -description: Submit a proposal/request for a new model support -title: "[New Model]: " -labels: ["new model"] - -body: -- type: markdown - attributes: - value: > - #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/vllm-project/vllm-omni/issues?q=is%3Aissue+sort%3Acreated-desc+). - - #### We also highly recommend you read the contributing guidelines first to understand how to add a new model. -- type: textarea - attributes: - label: The model to consider. - description: > - A huggingface url, pointing to the model, e.g. https://huggingface.co/openai-community/gpt2 . - validations: - required: true -- type: textarea - attributes: - label: The closest model vllm-omni already supports. - description: > - Here is the list of models already supported by vllm-omni. Which model is the most similar to the model you want to add support for? -- type: textarea - attributes: - label: What's your difficulty of supporting the model you want? - description: > - For example, any new operators or new architecture? Is it a multimodal model? Does it require special preprocessing? -- type: textarea - attributes: - label: Use case and motivation - description: > - What is the primary use case for this model? Why is it important to support in vllm-omni? -- type: markdown - attributes: - value: > - Thanks for contributing 🎉! -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/700-performance-discussion.yml b/.github/ISSUE_TEMPLATE/700-performance-discussion.yml deleted file mode 100644 index 7a4f374b867..00000000000 --- a/.github/ISSUE_TEMPLATE/700-performance-discussion.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: ⚡ Discussion on the performance of vllm-omni -description: Submit a proposal/discussion about the performance of vllm-omni -title: "[Performance]: " -labels: ["performance"] - -body: -- type: markdown - attributes: - value: > - #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/vllm-project/vllm-omni/issues?q=is%3Aissue+sort%3Acreated-desc+). -- type: textarea - attributes: - label: Proposal to improve performance - description: > - How do you plan to improve vllm-omni's performance? - validations: - required: false -- type: textarea - attributes: - label: Report of performance regression - description: > - Please provide detailed description of performance comparison to confirm the regression. You may want to run the benchmark script at https://github.com/vllm-project/vllm-omni/tree/main/tests/benchmarks . - validations: - required: false -- type: textarea - attributes: - label: Misc discussion on performance - description: > - Anything about the performance. - validations: - required: false -- type: textarea - attributes: - label: Your current environment (if you think it is necessary) - description: | - Please run the following and paste the output below. - ```sh - wget https://raw.githubusercontent.com/vllm-project/vllm-omni/main/vllm_omni/collect_env.py - # For security purposes, please feel free to check the contents of collect_env.py before running it. - python collect_env.py - ``` - It is suggested to download and execute the latest script, as vllm-omni might frequently update the diagnosis information needed for accurately and quickly responding to issues. - value: | - ```text - The output of `python collect_env.py` - ``` - validations: - required: false -- type: markdown - attributes: - value: > - Thanks for contributing 🎉! -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/750-RFC.yml b/.github/ISSUE_TEMPLATE/750-RFC.yml deleted file mode 100644 index eb0ba401712..00000000000 --- a/.github/ISSUE_TEMPLATE/750-RFC.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: 💬 Request for comments (RFC). -description: Ask for feedback on major architectural changes or design choices. -title: "[RFC]: " -labels: ["RFC"] - -body: -- type: markdown - attributes: - value: > - #### Please take a look at previous [RFCs](https://github.com/vllm-project/vllm-omni/issues?q=in%3Atitle%20RFC%20sort%3Aupdated-desc) for reference. -- type: textarea - attributes: - label: Motivation. - description: > - The motivation of the RFC. - validations: - required: true -- type: textarea - attributes: - label: Proposed Change. - description: > - The proposed change of the RFC. - value: | - Please provide the detailed design document of the RFC using the [template](https://docs.google.com/document/d/1jcgR3cDaUQH3VczD4ZcKaJAoYWHjCmnYzHkCNyz-9fk/edit?usp=sharing). - validations: - required: true -- type: textarea - attributes: - label: Feedback Period. - description: > - The feedback period of the RFC. Usually at least one week. - validations: - required: false -- type: textarea - attributes: - label: CC List. - description: > - The list of people you want to CC. - validations: - required: false -- type: textarea - attributes: - label: Any Other Things. - description: > - Any other things you would like to mention. - validations: - required: false -- type: checkboxes - id: askllm - attributes: - label: Before submitting a new issue... - options: - - label: Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://vllm-omni.readthedocs.io), which can answer lots of frequently asked questions. - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 0890ac09b0a..00000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Questions - url: https://slack.vllm.ai - about: Ask questions and discuss with other vLLM-Omni community members in our #sig-omni slack channel. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 1b4762794d4..00000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,21 +0,0 @@ - -PLEASE FILL IN THE PR DESCRIPTION HERE ENSURING ALL CHECKLIST ITEMS (AT THE BOTTOM) HAVE BEEN CONSIDERED. - -## Purpose - -## Test Plan - -## Test Result - ---- -
- Essential Elements of an Effective PR Description Checklist - -- [ ] The purpose of the PR, such as "Fix some issue (link existing issues this PR will resolve)". -- [ ] The test plan. Please provide the test scripts & test commands. Please state the reasons if your codes don't require additional test scripts. For test file guidelines, please check the [test style doc](https://docs.vllm.ai/projects/vllm-omni/en/latest/contributing/ci/tests_style/) -- [ ] The test results. Please paste the results comparison before and after, or the e2e results. -- [ ] (Optional) The necessary documentation update, such as updating `supported_models.md` and `examples` for a new model. **Please run `mkdocs serve` to sync the documentation editions to `./docs`.** -- [ ] (Optional) Release notes update. If your change is user-facing, please update the release notes draft. -
- -**BEFORE SUBMITTING, PLEASE READ ** (anything written below this line will be removed by GitHub Actions) diff --git a/.github/mergify.yml b/.github/mergify.yml deleted file mode 100644 index 4e4c68425e1..00000000000 --- a/.github/mergify.yml +++ /dev/null @@ -1,223 +0,0 @@ -pull_request_rules: -- name: label-documentation - description: Automatically apply documentation label - conditions: - - label != stale - - or: - - files~=^[^/]+\.md$ - - files~=^docs/ - - files~=^examples/ - actions: - label: - add: - - documentation - comment: - message: "Documentation preview: https://vllm--{{number}}.org.readthedocs.build/en/{{number}}/" - -- name: comment-pre-commit-failure - description: Comment on PR when pre-commit check fails - conditions: - - status-failure=pre-commit - - -closed - - -draft - actions: - comment: - message: | - Hi @{{author}}, the pre-commit checks have failed. Please run: - - ```bash - uv pip install pre-commit - pre-commit install - pre-commit run --all-files - ``` - - Then, commit the changes and push to your branch. - - For future commits, `pre-commit` will run automatically on changed files before each commit. - - > [!TIP] - >
- > Is mypy or markdownlint failing? - >
- > mypy and markdownlint are run differently in CI. If the failure is related to either of these checks, please use the following commands to run them locally: - > - > ```bash - > # For mypy (substitute "3.10" with the failing version if needed) - > pre-commit run --hook-stage manual mypy-3.10 - > # For markdownlint - > pre-commit run --hook-stage manual markdownlint - > ``` - >
- -- name: comment-dco-failure - description: Comment on PR when DCO check fails - conditions: - - status-failure=dco - - -closed - - -draft - actions: - comment: - message: | - Hi @{{author}}, the DCO check has failed. Please click on DCO in the Checks section for instructions on how to resolve this. - -- name: label-ci-build - description: Automatically apply ci/build label - conditions: - - label != stale - - or: - - files~=^\.github/ - - files~=\.buildkite/ - - files~=^cmake/ - - files=CMakeLists.txt - - files~=^docker/Dockerfile - - files~=^requirements.*\.txt - - files=setup.py - actions: - label: - add: - - ci/build - -- name: label-frontend - description: Automatically apply frontend label - conditions: - - label != stale - - files~=^vllm_omni/entrypoints/ - actions: - label: - add: - - frontend - -- name: label-diffusion - description: Automatically apply diffusion label - conditions: - - label != stale - - files~=^vllm_omni/diffusion/ - actions: - label: - add: - - diffusion - -- name: label-new-model - description: Automatically apply new-model label - conditions: - - label != stale - - or: - - files=vllm_omni/model_executor/models/registry.py - - files=vllm_omni/diffusion/registry.py - actions: - label: - add: - - new-model - -- name: label-npu - description: Automatically apply npu label - conditions: - - label != stale - - or: - - files~=^vllm_omni/platforms/npu/ - - title~=(?i)NPU - - title~=(?i)Ascend - actions: - label: - add: - - npu - assign: - users: - - "gcanlin" - -- name: label-rocm - description: Automatically apply rocm label - conditions: - - label != stale - - or: - - files~=^vllm_omni/platforms/rocm/ - - title~=(?i)AMD - - title~=(?i)ROCm - actions: - label: - add: - - rocm - assign: - users: - - "tjtanaa" - -- name: label-xpu - description: Automatically apply xpu label - conditions: - - label != stale - - or: - - files~=^vllm_omni/platforms/xpu/ - - title~=(?i)Intel - - title~=(?i)XPU - actions: - label: - add: - - xpu - assign: - users: - - "yma11" - -- name: label-modelrunner - description: Automatically apply modelrunner label - conditions: - - label != stale - - or: - - files~=^vllm_omni/worker/ - - title~=(?i)ModelRunner - - title~=(?i)worker - actions: - label: - add: - - ModelRunner - assign: - users: - - "gcanlin" # To check whether need to sync to NPU - -- name: auto-rebase if approved, ready, and 30 commits behind main - conditions: - - base = main - - label=ready - - "#approved-reviews-by >= 1" - - "#commits-behind >= 30" - - -closed - - -draft - - -conflict - actions: - rebase: {} - -- name: ping author on conflicts and add 'needs-rebase' label - conditions: - - label != stale - - conflict - - -closed - actions: - label: - add: - - needs-rebase - comment: - message: | - This pull request has merge conflicts that must be resolved before it can be - merged. Please rebase the PR, @{{author}}. - - https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork - -- name: remove 'needs-rebase' label when conflict is resolved - conditions: - - -conflict - - -closed - actions: - label: - remove: - - needs-rebase - -- name: label-bug - description: Automatically apply bug label - conditions: - - label != stale - - or: - - title~=(?i)\bbug\b - - title~=(?i)\bbugfix\b - actions: - label: - add: - - bug diff --git a/.github/scripts/detect_changed_tests.sh b/.github/scripts/detect_changed_tests.sh deleted file mode 100755 index a3e7518e240..00000000000 --- a/.github/scripts/detect_changed_tests.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -# Script to detect changed files and find corresponding test files -# Usage: ./detect_changed_tests.sh [base_sha] [head_sha] [event_type] -# -# Outputs to GITHUB_OUTPUT: -# test_files: Space-separated list of test files to run -# has_tests: 'true' if test files found, 'false' otherwise - -set -e - -BASE_SHA="${1:-}" -HEAD_SHA="${2:-}" -EVENT_TYPE="${3:-push}" - -# Determine base and head SHA based on event type -if [ "$EVENT_TYPE" = "pull_request" ]; then - BASE_SHA="${BASE_SHA:-$GITHUB_BASE_REF}" - HEAD_SHA="${HEAD_SHA:-$GITHUB_SHA}" -elif [ -z "$BASE_SHA" ] || [ -z "$HEAD_SHA" ]; then - # For push events, use git to find the previous commit - BASE_SHA="${BASE_SHA:-$(git rev-parse HEAD~1 2>/dev/null || echo HEAD)}" - HEAD_SHA="${HEAD_SHA:-HEAD}" -fi - -echo "Event type: $EVENT_TYPE" -echo "Base SHA: $BASE_SHA" -echo "Head SHA: $HEAD_SHA" - -# Get changed Python files -CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT "$BASE_SHA" "$HEAD_SHA" | grep -E '\.(py)$' || true) - -if [ -z "$CHANGED_FILES" ]; then - echo "No Python files changed" - echo "test_files=" >> "$GITHUB_OUTPUT" - echo "has_tests=false" >> "$GITHUB_OUTPUT" - exit 0 -fi - -echo "Changed Python files:" -echo "$CHANGED_FILES" - -# Extract related test files -TEST_FILES="" -for file in $CHANGED_FILES; do - # If changed file is a test file, add it directly - if [[ "$file" == tests/* ]]; then - TEST_FILES="$TEST_FILES $file" - # If changed file is source code, find corresponding test file - elif [[ "$file" == vllm_omni/* ]]; then - # Convert vllm_omni/path/to/module.py to possible test file paths - REL_PATH=$(echo "$file" | sed 's|^vllm_omni/||' | sed 's|\.py$||') - MODULE_NAME=$(basename "$REL_PATH") - DIR_PATH=$(dirname "$REL_PATH") - - # Try multiple possible test file naming patterns - POSSIBLE_TESTS=( - "tests/test_${REL_PATH//\//_}.py" - "tests/${REL_PATH//\//_}_test.py" - ) - - # If multi-level directory, also try directory structure - if [ "$DIR_PATH" != "." ]; then - POSSIBLE_TESTS+=( - "tests/${DIR_PATH}/test_${MODULE_NAME}.py" - "tests/${DIR_PATH}/${MODULE_NAME}_test.py" - ) - fi - - for test_file in "${POSSIBLE_TESTS[@]}"; do - if [ -f "$test_file" ]; then - TEST_FILES="$TEST_FILES $test_file" - break - fi - done - fi -done - -# Deduplicate and format -TEST_FILES=$(echo "$TEST_FILES" | tr ' ' '\n' | grep -v '^$' | sort -u | tr '\n' ' ' | sed 's/^ *//;s/ *$//') - -if [ -z "$TEST_FILES" ]; then - echo "No related test files found, will run all tests" - echo "test_files=" >> "$GITHUB_OUTPUT" - echo "has_tests=false" >> "$GITHUB_OUTPUT" -else - echo "Found test files: $TEST_FILES" - echo "test_files=$TEST_FILES" >> "$GITHUB_OUTPUT" - echo "has_tests=true" >> "$GITHUB_OUTPUT" -fi diff --git a/.github/workflows/build_wheel.yml b/.github/workflows/build_wheel.yml deleted file mode 100644 index f8087c5e902..00000000000 --- a/.github/workflows/build_wheel.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Build Wheel - -on: - push: - branches: - - main - paths-ignore: - - 'docs/**' - - 'examples/**' - - 'apps/**' - - '.github/**' - - '.buildkite/**' - - '**.md' - - '*.yml' - - '.gitignore' - - '.gitattributes' - - 'LICENSE' - pull_request: - branches: - - main - paths-ignore: - - 'docs/**' - - 'examples/**' - - 'apps/**' - - '.github/**' - - '.buildkite/**' - - '*.yml' - - '**.md' - - '.gitignore' - - '.gitattributes' - - 'LICENSE' - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.11", "3.12"] - - steps: - - uses: actions/checkout@v6 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - - name: Install uv - run: | - pip install uv - - - name: Build Wheel - env: - UV_SYSTEM_PYTHON: 1 - run: | - bash scripts/build_wheel.sh --python python - - - name: Upload Wheel Artifact - uses: actions/upload-artifact@v7 - with: - name: vllm-omni-wheel-py${{ matrix.python-version }} - path: dist/*.whl diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml deleted file mode 100644 index 964fb5abcc9..00000000000 --- a/.github/workflows/pre-commit.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: pre-commit - -on: - pull_request: - branches: [main] - push: - branches: [main] - workflow_dispatch: # for manual trigger - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.event_name == 'pull_request' }} - -permissions: - contents: read - -jobs: - pre-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-python@v6 - with: - python-version: "3.12" - cache: 'pip' - - uses: pre-commit/action@v3.0.1 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index bf5e28510a0..00000000000 --- a/.gitignore +++ /dev/null @@ -1,271 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -vllm/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# 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/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# uv -uv.lock - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# Claude -CLAUDE.md -/.claude/* -!.claude/skills/ -!.claude/skills/readme.md -!.claude/skills/add-diffusion-model/ -!.claude/skills/add-diffusion-model/SKILL.md -!.claude/skills/add-diffusion-model/references/ -!.claude/skills/add-diffusion-model/references/*.md -!.claude/skills/add-tts-model/ -!.claude/skills/add-tts-model/SKILL.md -!.claude/skills/review-pr/ -!.claude/skills/review-pr/SKILL.md -!.claude/skills/review-pr/references/ -!.claude/skills/review-pr/references/*.md - -# Codex -AGENTS.md -.codex -.codex/ - -# cursor -.cursor/ - -# scripts -/scripts/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be added to the global gitignore or merged into this project gitignore. For a PyCharm -# project, it is recommended to include the following files: -# .idea/ -# *.iml -# *.ipr -# *.iws -# .idea/ - -# vLLM-Omni specific -# Model files and checkpoints -checkpoints/ -*.bin -*.safetensors -*.pt -*.pth - -# Cache directories -cache/ -!vllm_omni/diffusion/cache/ -!tests/diffusion/cache/ -.cache/ -diffusion_cache/ -kv_cache/ - -# Logs -logs/ -*.log - -# Temporary files -tmp/ -temp/ -.tmp/ - -# IDE files -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS files -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db - -# Data files -data/ -datasets/ -*.csv -*.json -!apps/ComfyUI-vLLM-Omni/example_workflows/*.json -*.jsonl -*.parquet - -# Output files -outputs/ -results/ -generated/ -output_*/ - -# Configuration overrides -configs/local.yaml -configs/production.yaml -configs/development.yaml - -# Docker -.dockerignore -Dockerfile.dev -discussion -tmp_test - -# Auto-generated version file (created by setuptools_scm during build) -vllm_omni/_version.py -# output files -*.wav -# Vendored test reference audio (small, intentionally checked in) -!tests/assets/**/*.wav -.worktrees/ -# CI overlay yamls materialized from tests/utils.py:_CI_OVERLAYS at test time -tests/.ci_generated/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 6db093e0ee2..00000000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,71 +0,0 @@ -default_install_hook_types: - - pre-commit - - commit-msg -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 - hooks: - # list of supported hooks: https://pre-commit.com/hooks.html - - id: check-yaml - args: ["--unsafe"] - exclude: "examples/online_serving/chart-helm/templates/" - - id: debug-statements - - id: end-of-file-fixer - - id: mixed-line-ending - args: ["--fix=lf"] - - id: trailing-whitespace - args: ["--markdown-linebreak-ext=md"] - - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.10 - hooks: - - id: ruff-check - args: [--output-format, github, --fix] - - id: ruff-format - - - repo: https://github.com/crate-ci/typos - rev: typos-dict-v0.13.13 - hooks: - - id: typos - # only for staged files - - - repo: https://github.com/rhysd/actionlint - # v1.7.8+ sets `go 1.24.0` in go.mod, which older Go toolchains (and most - # current CI images) cannot parse. Pin to v1.7.7 until actionlint fixes the - # go.mod directive. - rev: v1.7.7 - hooks: - - id: actionlint - files: ^\.github/workflows/.*\.ya?ml$ - - - - repo: local - hooks: - - id: signoff-commit - name: Sign-off Commit - entry: bash - args: - - -c - - | - if ! grep -q "^Signed-off-by: $(git config user.name) <$(git config user.email)>" "$(git rev-parse --git-path COMMIT_EDITMSG)"; then - printf "\nSigned-off-by: $(git config user.name) <$(git config user.email)>\n" >> "$(git rev-parse --git-path COMMIT_EDITMSG)" - fi - language: system - verbose: true - stages: [commit-msg] - - # Keep `suggestion` last - - id: suggestion - name: Suggestion - entry: bash -c 'echo "To bypass all the pre-commit hooks, add --no-verify to git commit. To skip a specific hook, prefix the commit command with SKIP=."' - language: system - verbose: true - pass_filenames: false - # Insert new entries above the `suggestion` entry - - - id: check-pickle-imports - name: Prevent new pickle/cloudpickle imports - entry: python tools/pre_commit/check_pickle_imports.py - language: python - types: [python] - additional_dependencies: [regex] diff --git a/.readthedocs.yml b/.readthedocs.yml deleted file mode 100644 index 5a06c663409..00000000000 --- a/.readthedocs.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -version: 2 - -build: - os: ubuntu-22.04 - tools: - python: "3.12" - jobs: - post_checkout: - - git fetch --unshallow || true - -mkdocs: - configuration: mkdocs.yml - fail_on_warning: true - -# Optionally declare the Python requirements required to build your docs -python: - install: - - method: pip - path: . - extra_requirements: - - docs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index aac7497757c..00000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contributing to vLLM-Omni - -You may find information about contributing to vLLM-Omni on [Contributing](https://vllm-omni.readthedocs.io/en/latest/contributing/) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e9f8..00000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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/README.md b/README.md deleted file mode 100644 index 6726c51f830..00000000000 --- a/README.md +++ /dev/null @@ -1,97 +0,0 @@ -

- - - vllm-omni - -

-

-Easy, fast, and cheap omni-modality model serving for everyone -

- -

-| Documentation | User Forum | Developer Slack | WeChat | Paper | Slides | -

- - ---- - -*Latest News* 🔥 -- [2026/03] We released [0.18.0](https://github.com/vllm-project/vllm-omni/releases/tag/v0.18.0) - strengthens the core runtime through a large entrypoint refactor and scheduler/runtime cleanups, expands unified quantization and diffusion execution, broadens multimodal model coverage, and improves production readiness across audio, omni, image, video, RL, and multi-platform deployments. -- [2026/03] Check out our first public [project deepdive](https://youtu.be/sgwNfsNnR9I) at the vLLM Hong Kong Meetup! -- [2026/03] **[vllm-omni-skills](https://github.com/hsliuustc0106/vllm-omni-skills)** is a community-driven collection of AI assistant skills that help developers work with vLLM-Omni more effectively. These skills can be used with popular agentic AI coding assistants like **Cursor IDE**, **Claude**, **Codex**, and more. -- [2026/02] We released [0.16.0](https://github.com/vllm-project/vllm-omni/releases/tag/v0.16.0) - A major alignment + capability release that rebases onto **upstream vLLM v0.16.0** and significantly expands performance, distributed execution, and production readiness across **Qwen3-Omni / Qwen3-TTS**, **Bagel**, **MiMo-Audio**, **GLM-Image** and the **Diffusion (DiT) image/video stack**—while also improving platform coverage (CUDA / ROCm / NPU / XPU), CI quality, and documentation. -- [2026/02] We released [0.14.0](https://github.com/vllm-project/vllm-omni/releases/tag/v0.14.0) - This is the first **stable release** of vLLM-Omni that expands Omni’s diffusion / image-video generation and audio / TTS stack, improves distributed execution and memory efficiency, and broadens platform/backend coverage (GPU/ROCm/NPU/XPU). It also brings meaningful upgrades to serving APIs, profiling & benchmarking, and overall stability. Please check our latest [paper](https://arxiv.org/abs/2602.02204) for architecture design and performance results. -- [2026/01] We released [0.12.0rc1](https://github.com/vllm-project/vllm-omni/releases/tag/v0.12.0rc1) - a major RC milestone focused on maturing the diffusion stack, strengthening OpenAI-compatible serving, expanding omni-model coverage, and improving stability across platforms (GPU/NPU/ROCm). -- [2025/11] vLLM community officially released [vllm-project/vllm-omni](https://github.com/vllm-project/vllm-omni) in order to support omni-modality models serving. - ---- - -## About - -[vLLM](https://github.com/vllm-project/vllm) was originally designed to support large language models for text-based autoregressive generation tasks. vLLM-Omni is a framework that extends its support for omni-modality model inference and serving: - -- **Omni-modality**: Text, image, video, and audio data processing -- **Non-autoregressive Architectures**: extend the AR support of vLLM to Diffusion Transformers (DiT) and other parallel generation models -- **Heterogeneous outputs**: from traditional text generation to multimodal outputs - -

- - vllm-omni - -

- -vLLM-Omni is fast with: - -- State-of-the-art AR support by leveraging efficient KV cache management from vLLM -- Pipelined stage execution overlapping for high throughput performance -- Fully disaggregation based on OmniConnector and dynamic resource allocation across stages - -vLLM-Omni is flexible and easy to use with: - -- Heterogeneous pipeline abstraction to manage complex model workflows -- Seamless integration with popular Hugging Face models -- Tensor, pipeline, data and expert parallelism support for distributed inference -- Streaming outputs -- OpenAI-compatible API server - -vLLM-Omni seamlessly supports most popular open-source models on HuggingFace, including: - -- Omni-modality models (e.g. Qwen-Omni) -- Multi-modality generation models (e.g. Qwen-Image) - -## Getting Started - -Visit our [documentation](https://vllm-omni.readthedocs.io/en/latest/) to learn more. - -- [Installation](https://vllm-omni.readthedocs.io/en/latest/getting_started/installation/) -- [Quickstart](https://vllm-omni.readthedocs.io/en/latest/getting_started/quickstart/) -- [List of Supported Models](https://vllm-omni.readthedocs.io/en/latest/models/supported_models/) - -## Contributing - -We welcome and value any contributions and collaborations. -Please check out [Contributing to vLLM-Omni](https://vllm-omni.readthedocs.io/en/latest/contributing/) for how to get involved. - -## Citation - -If you use vLLM-Omni for your research, please cite our [paper](https://arxiv.org/abs/2602.02204): - -```bibtex -@article{yin2026vllmomni, - title={vLLM-Omni: Fully Disaggregated Serving for Any-to-Any Multimodal Models}, - author={Peiqi Yin, Jiangyun Zhu, Han Gao, Chenguang Zheng, Yongxiang Huang, Taichang Zhou, Ruirui Yang, Weizhi Liu, Weiqing Chen, Canlin Guo, Didan Deng, Zifeng Mo, Cong Wang, James Cheng, Roger Wang, Hongsheng Liu}, - journal={arXiv preprint arXiv:2602.02204}, - year={2026} -} -``` - -## Join the Community -Feel free to ask questions, provide feedbacks and discuss with fellow users of vLLM-Omni in `#sig-omni` slack channel at [slack.vllm.ai](https://slack.vllm.ai) or vLLM user forum at [discuss.vllm.ai](https://discuss.vllm.ai). - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=vllm-project/vllm-omni&type=date&legend=top-left)](https://www.star-history.com/#vllm-project/vllm-omni&type=date&legend=top-left) - -## License - -Apache License 2.0, as found in the [LICENSE](./LICENSE) file. diff --git a/apps/ComfyUI-vLLM-Omni/.gitignore b/apps/ComfyUI-vLLM-Omni/.gitignore deleted file mode 100644 index 5704ad153cb..00000000000 --- a/apps/ComfyUI-vLLM-Omni/.gitignore +++ /dev/null @@ -1,115 +0,0 @@ -# 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 deleted file mode 100644 index b3c346397d7..00000000000 --- a/apps/ComfyUI-vLLM-Omni/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 54f2fdf2e40..00000000000 --- a/apps/ComfyUI-vLLM-Omni/README.md +++ /dev/null @@ -1,184 +0,0 @@ -# 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 -- **Generate Video** for text-to-video and image-to-video tasks -- **Multimodality Understanding** 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**) - -> [!NOTE] -> 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**, **utils->Preview as Text**. -- 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. - -## Screenshots and Examples - -### Multimodal understanding (e.g., Qwen Omni series, BAGEL) - -(Also available at **ComfyUI sidebar->Template->vLLM-Omni->vLLM-Omni Multimodal Understanding**) - -

- - - vLLM-Omni multimodal understanding - -

- -> [!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 multiple stages - -

- -### 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 image generation - -

- -> [!TIP] -> The node automatically choose text-to-image or image-to-image API endpoints depending on whether you connect an image input or not. - -### Text-to-video and image-to-video generation (e.g., Wan) - -(Also available at **ComfyUI sidebar->Template->vLLM-Omni->vLLM-Omni Video Generation**) - -

- - - vLLM-Omni video generation - -

- -> [!TIP] -> The node automatically choose text-to-video or image-to-video 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 TTS - -

- -> [!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. - -### Chaining multiple model services - -(Also available at **ComfyUI sidebar->Template->vLLM-Omni->vLLM-Omni Chaining Services**) - -

- - - vLLM-Omni TTS - -

- -## 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 deleted file mode 100644 index e89b2ca1eb5..00000000000 --- a/apps/ComfyUI-vLLM-Omni/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -"""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__ = """vLLM-Omni Team""" -__email__ = "vllm-omni@vllm.ai" -__version__ = "0.0.1" - -from .comfyui_vllm_omni.nodes import ( - VLLMOmniARSampling, - VLLMOmniDiffusionSampling, - VLLMOmniGenerateImage, - VLLMOmniGenerateVideo, - VLLMOmniQwenTTSParams, - VLLMOmniRemoteLoRA, - VLLMOmniSamplingParamsList, - VLLMOmniTTS, - VLLMOmniUnderstanding, - VLLMOmniVoiceClone, - VLLMOmniWanParams, -) - -# A dictionary that contains all nodes you want to export with their names -NODE_CLASS_MAPPINGS = { - # === Generation === - "VLLMOmniGenerateImage": VLLMOmniGenerateImage, - "VLLMOmniGenerateVideo": VLLMOmniGenerateVideo, - "VLLMOmniUnderstanding": VLLMOmniUnderstanding, - "VLLMOmniTTS": VLLMOmniTTS, - "VLLMOmniVoiceClone": VLLMOmniVoiceClone, - # === Params === - "VLLMOmniARSampling": VLLMOmniARSampling, - "VLLMOmniDiffusionSampling": VLLMOmniDiffusionSampling, - "VLLMOmniSamplingParamsList": VLLMOmniSamplingParamsList, - "VLLMOmniRemoteLoRA": VLLMOmniRemoteLoRA, - "VLLMOmniQwenTTSParams": VLLMOmniQwenTTSParams, - "VLLMOmniWanParams": VLLMOmniWanParams, -} - -# A dictionary that contains the friendly/humanly readable titles for the nodes -NODE_DISPLAY_NAME_MAPPINGS = { - # === Generation === - "VLLMOmniGenerateImage": "Generate Image", - "VLLMOmniGenerateVideo": "Generate Video", - "VLLMOmniUnderstanding": "Multimodality Understanding", - "VLLMOmniTTS": "TTS (Text to Speech)", - "VLLMOmniVoiceClone": "TTS Voice Cloning", - # === Params === - "VLLMOmniARSampling": "AR Sampling Params", - "VLLMOmniDiffusionSampling": "Diffusion Sampling Params", - "VLLMOmniSamplingParamsList": "Multi-Stage Sampling Params List", - "VLLMOmniRemoteLoRA": "LoRA", - "VLLMOmniQwenTTSParams": "Qwen TTS Params", - "VLLMOmniWanParams": "Wan Video 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 deleted file mode 100644 index ebc9c5a59ea..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# 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 deleted file mode 100644 index bfea939982c..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/nodes.py +++ /dev/null @@ -1,736 +0,0 @@ -from typing import Literal - -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, - AutoregressionSamplingParams, - DiffusionSamplingParams, - QwenTTSModelSpecificParams, - WanModelSpecificParams, -) -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",), - "lora": ("REMOTE_LORA",), - }, - } - - 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, - lora: dict | None = None, - **kwargs, - ): - if 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: - # The number of sampling parameter groups should have been validated. - # Now, simply convert single-item list to dict. - if isinstance(sampling_params, list): - sampling_params = sampling_params[0] - 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, - lora=lora, - ) - 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, - lora=lora, - ) - 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, - lora=lora, - ) - - return (output,) - - -class VLLMOmniGenerateVideo(_VLLMOmniGenerateBase): - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "url": ("STRING", {"default": "http://localhost:8000/v1"}), - "model": ("STRING", {"default": "Wan-AI/Wan2.2-T2V-A14B-Diffusers"}), - "prompt": ("STRING", {"multiline": True}), - "negative_prompt": ("STRING", {"multiline": True, "default": ""}), - "width": ("INT", {"default": 832, "min": 1}), - "height": ("INT", {"default": 480, "min": 1}), - "fps": ("INT", {"default": 16, "min": 1}), - "num_frames": ("INT", {"default": 41, "min": 1}), - }, - "optional": { - "image": ("IMAGE",), - "sampling_params": ("SAMPLING_PARAMS",), - "lora": ("REMOTE_LORA",), - "model_params": ("VIDEO_PARAMS",), - }, - } - - RETURN_TYPES = ("VIDEO",) - RETURN_NAMES = ("video",) - FUNCTION = "generate" - - async def generate( - self, - url: str, - model: str, - prompt: str, - width: int, - height: int, - fps: int, - num_frames: int, - negative_prompt: str | None = None, - image: torch.Tensor | None = None, - sampling_params: dict | list[dict] | None = None, - model_params: dict | None = None, - lora: dict | None = None, - **kwargs, - ): - if kwargs: - logger.info("Uncaught kwargs: %s", kwargs) - logger.debug("Got sampling params: %s", sampling_params) - logger.debug("Got model params: %s", model_params) - validate_model_and_sampling_params_types(model, sampling_params) - - # Currently, all video generation models are single-stage diffusion models - if isinstance(sampling_params, list): - if len(sampling_params) != 1: - raise ValueError( - "Video generation expects a single sampling params group. " - "Please provide one Diffusion sampling node." - ) - sampling_params = sampling_params[0] - - if sampling_params is not None: - sampling_params.pop("type", None) # internal fields - if model_params is not None: - model_params.pop("type", None) # internal fields - - client = VLLMOmniClient(url) - output = await client.generate_video( - model=model, - prompt=prompt, - image=image, # image present => i2v, absent => t2v - width=width, - height=height, - num_frames=num_frames, - fps=fps, - negative_prompt=negative_prompt, - sampling_params=sampling_params, - lora=lora, - model_params=model_params, - ) - return (output,) - - -class VLLMOmniUnderstanding(_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]: - if kwargs: - 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_understanding_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_understanding_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() - if not is_qwen_tts and isinstance(model_specific_params, QwenTTSModelSpecificParams): - 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 {})} - - 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() - if not is_qwen_tts and isinstance(model_specific_params, QwenTTSModelSpecificParams): - 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 {}), - } - - 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 = AutoregressionSamplingParams(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)", - }, - ), - "vae_use_tiling": ( - "BOOLEAN", - { - "default": False, - "tooltip": "Enable VAE tiling 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 = DiffusionSamplingParams(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 VLLMOmniRemoteLoRA: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "local_path": ("STRING", {"default": ""}), - "name": ("STRING", {"default": ""}), - "scale": ( - "FLOAT", - {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.1}, - ), - "int_id": ( - "INT", - { - "default": 0, - "min": 0, - "step": 1, - "tooltip": "0 means it is not set and the server can derive it.", - }, - ), - } - } - - RETURN_TYPES = ("REMOTE_LORA",) - RETURN_NAMES = ("lora",) - FUNCTION = "get_lora" - CATEGORY = "vLLM-Omni" - - @classmethod - def VALIDATE_INPUTS(cls, local_path, name) -> str | Literal[True]: - if not local_path.strip() or not name.strip(): - return "Both local_path and name must be provided." - return True - - def get_lora(self, local_path: str, name: str, scale: float, int_id: int): - local_path = local_path.strip() - name = name.strip() - lora = { - "local_path": local_path or None, - "name": name or None, - "scale": float(scale), - "int_id": int(int_id) if int_id > 0 else None, - } - return (lora,) - - -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 (QwenTTSModelSpecificParams(kwargs),) - - -class VLLMOmniWanParams: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "guidance_scale_2": ( - "FLOAT", - {"default": 4.0, "min": 0.0, "max": 20.0, "step": 0.1}, - ), - "boundary_ratio": ( - "FLOAT", - {"default": 0.875, "min": 0.0, "max": 1.0, "step": 0.001}, - ), - "flow_shift": ( - "FLOAT", - {"default": 5.0, "min": 0.0, "max": 100.0, "step": 0.1}, - ), - } - } - - RETURN_TYPES = ("VIDEO_PARAMS",) - RETURN_NAMES = ("Wan video params",) - FUNCTION = "get_params" - CATEGORY = "vLLM-Omni/Video Params" - - def get_params(self, **kwargs): - return (WanModelSpecificParams(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 deleted file mode 100644 index 8600fe39355..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/api_client.py +++ /dev/null @@ -1,585 +0,0 @@ -""" -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. -""" - -import asyncio -import json -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, - bytes_to_video, - 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__) - - -async def url_json(session: aiohttp.ClientSession, url: str, verb: str = "get", **kwargs) -> dict[str, Any]: - try: - async with getattr(session, verb)(url, **kwargs) 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: - return await response.json() - except aiohttp.ContentTypeError as e: - raise RuntimeError(f"Invalid JSON response from vLLM-Omni: {e}") - except aiohttp.ClientError as e: - raise RuntimeError(f"Network error connecting to vLLM-Omni at {url}: {e}") - - -async def url_bytes(session: aiohttp.ClientSession, url: str, verb: str = "get", **kwargs) -> bytes: - try: - async with getattr(session, verb)(url, **kwargs) 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}" - ) - return await response.read() - except aiohttp.ClientError as e: - raise RuntimeError(f"Network error connecting to vLLM-Omni at {url}: {e}") - - -class VLLMOmniClient: - def __init__( - self, base_url: str, timeout: float | None = None, poll_interval: float = 5.0, max_poll_duration: float = 60 * 5 - ): - self.base_url = base_url - self.timeout = aiohttp.ClientTimeout(total=timeout) - self.poll_interval = poll_interval - self.max_poll_duration = max_poll_duration - - async def generate_image( - self, - *, - model: str, - prompt: str, - width: int, - height: int, - negative_prompt: str | None = None, - sampling_params: dict | None = None, - lora: 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: dict[str, Any] = { - "model": model, - "prompt": prompt, - "size": size, - "response_format": "b64_json", - } - if negative_prompt: - payload["negative_prompt"] = negative_prompt - if sampling_params is not None: - payload.update(sampling_params) - if lora is not None: - payload["lora"] = lora - 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, - lora: 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: - for k, v in sampling_params.items(): - form.add_field(k, str(v)) - if lora is not None: - form.add_field("lora", json.dumps(lora, ensure_ascii=False)) - 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, - lora: 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"], - # === below are additional `extra_body` fields, handled by **kwargs === - lora=lora, - ) - 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_video( - self, - *, - model: str, - prompt: str, - width: int, - height: int, - num_frames: int, - fps: int, - negative_prompt: str | None = None, - image: torch.Tensor | None = None, - sampling_params: dict | None = None, - model_params: dict | None = None, - lora: dict | None = None, - **extra_body, - ) -> VideoInput: - form = aiohttp.FormData() - form.add_field("model", model) - form.add_field("prompt", prompt) - form.add_field("width", str(width)) - form.add_field("height", str(height)) - form.add_field("num_frames", str(num_frames)) - form.add_field("fps", str(fps)) - if negative_prompt: - form.add_field("negative_prompt", negative_prompt) - if sampling_params is not None: - for k, v in sampling_params.items(): - form.add_field(k, str(v)) - if model_params is not None: - for k, v in model_params.items(): - form.add_field(k, str(v)) - if lora is not None: - form.add_field("lora", json.dumps(lora, ensure_ascii=False)) - if extra_body: - form.add_field("extra_body", json.dumps(extra_body, ensure_ascii=False)) - - if image is not None: - image_filename = "image.png" # Required for multipart form - form.add_field( - "input_reference", - image_tensor_to_png_bytes(image, image_filename), - filename=image_filename, - content_type="image/png", - ) - - async with aiohttp.ClientSession(timeout=self.timeout) as session: - # Start the video generation job - url = f"{self.base_url}/videos" - data = await url_json(session, url, "post", data=form) - if (job_id := data.get("id", None)) is None: - raise RuntimeError("API response missing job 'id' field - expected OpenAI compliant format") - if (job_status := data.get("status", None)) is None: - raise RuntimeError("API response missing job 'status' field - expected OpenAI compliant format") - - # Poll for video generation job completion - deadline = asyncio.get_running_loop().time() + self.max_poll_duration - url = f"{self.base_url}/videos/{job_id}" - while job_status not in {"completed", "failed"}: - await asyncio.sleep(self.poll_interval) - - data = await url_json(session, url) - if (job_status := data.get("status", None)) is None: - raise RuntimeError("API response missing job 'status' field - expected OpenAI compliant format") - if asyncio.get_running_loop().time() >= deadline: - raise RuntimeError(f"Timed out waiting for video job {job_id} to complete") - - if job_status == "failed": - raise RuntimeError(f"Video job failed: {data}") - - # Retrieve completed content - video_bytes = await url_bytes(session, f"{url}/content") - - # Decode video and make a best effort at cleaning up server resources - try: - return bytes_to_video(video_bytes) - finally: - try: - await url_json(session, url, "delete") - except Exception as exc: - logger.warning("Failed to clean up video job %s: %s", job_id, exc) - - async def generate_understanding_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}] - - payload: dict[str, Any] = {"messages": messages, "model": model} - if modalities: - payload["modalities"] = modalities - - 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 - - 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 has already taken care of matching sampling params' types and length. Safe to take [0]. - # * 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.copy() - if "n" in combined_extra_body: - combined_extra_body["num_outputs_per_prompt"] = combined_extra_body.pop("n") - else: - # AR format: the payload has a sampling_params_list field, containing a list. - sampling_params_list = sampling_params if isinstance(sampling_params, list) else [sampling_params] - payload["sampling_params_list"] = sampling_params_list - - if negative_prompt: - combined_extra_body["negative_prompt"] = negative_prompt - - if extra_body: - combined_extra_body.update(extra_body) - - # Add extra_body only if it has any content. - if combined_extra_body: - payload["extra_body"] = combined_extra_body - - # Place to inject any model-specific payload adjustment - 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 deleted file mode 100644 index 42d396f0694..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/format.py +++ /dev/null @@ -1,304 +0,0 @@ -"""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 fractions import Fraction -from io import BytesIO - -import av -import numpy as np -import torch -from av.audio.frame import AudioFrame -from av.audio.resampler import AudioResampler -from av.video.frame import VideoFrame -from comfy_api.input import AudioInput, VideoInput -from comfy_api.latest import InputImpl, Types -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 bytes_to_video(video_bytes: bytes) -> VideoInput: - video_buffer = BytesIO(video_bytes) - - try: - with av.open(video_buffer, mode="r") as container: - video_stream = next((s for s in container.streams if s.type == "video"), None) - if video_stream is None: - raise ValueError("No video stream found in decoded payload.") - - frames = [] - for frame in container.decode(video_stream): - if not isinstance(frame, VideoFrame): - continue - image = frame.to_ndarray(format="rgb24") - frames.append(torch.from_numpy(image).float() / 255.0) - - if len(frames) == 0: - raise ValueError("No video frames found in decoded payload.") - - images = torch.stack(frames, dim=0) - frame_rate = Fraction(video_stream.average_rate) if video_stream.average_rate else Fraction(1) - - audio: AudioInput | None = None - if len(container.streams.audio): - audio_stream = container.streams.audio[-1] - audio_frames = [] - resampler = AudioResampler(format="fltp") - for frame in container.decode(audio_stream): - if not isinstance(frame, AudioFrame): - continue - resampled = resampler.resample(frame) - if not isinstance(resampled, list): - resampled = [resampled] - for audio_frame in resampled: - if audio_frame is not None: - audio_frames.append(audio_frame.to_ndarray()) - - if len(audio_frames) > 0: - audio_data = np.concatenate(audio_frames, axis=1) - sample_rate = int(audio_stream.sample_rate) if audio_stream.sample_rate else 1 - audio = { - "waveform": torch.from_numpy(audio_data).unsqueeze(0), - "sample_rate": sample_rate, - } - - components = Types.VideoComponents( - images=images, - frame_rate=frame_rate, - audio=audio, - metadata=container.metadata if container.metadata else None, - ) - except Exception as e: - raise RuntimeError(f"Failed to decode video: {e}") - - return InputImpl.VideoFromComponents(components) - - -def base64_to_video(base64_str: str) -> VideoInput: - if base64_str.startswith("data:video"): - _, base64_str = base64_str.split(",", 1) - - try: - video_bytes = base64.b64decode(base64_str) - except Exception as e: - raise ValueError(f"Invalid base64 string: {e}") - - return bytes_to_video(video_bytes) - - -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 deleted file mode 100644 index cad640f4d7e..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/logger.py +++ /dev/null @@ -1,125 +0,0 @@ -"""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 deleted file mode 100644 index bfeddd82b87..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/models.py +++ /dev/null @@ -1,118 +0,0 @@ -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") - return payload - - -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.UNDERSTANDING, - "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.UNDERSTANDING, - "input_modalities": [ - Modality.TEXT, - Modality.IMAGE, - Modality.VIDEO, - Modality.AUDIO, - ], - } - ], - }, - r"Qwen3-Omni*": { - "stages": ["autoregression", "autoregression", "autoregression"], - "modes": [ - { - "mode": ModelMode.UNDERSTANDING, - "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 deleted file mode 100644 index c7d254eb9ea..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/types.py +++ /dev/null @@ -1,55 +0,0 @@ -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 AutoregressionSamplingParams(dict): - pass - - -class DiffusionSamplingParams(dict): - pass - - -class QwenTTSModelSpecificParams(dict): - pass - - -class WanModelSpecificParams(dict): - pass - - -class ModelMode(Enum): - IMAGE_GENERATION = auto() - VIDEO_GENERATION = auto() - AUDIO_GENERATION = auto() - UNDERSTANDING = 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 deleted file mode 100644 index f607f2cb81a..00000000000 --- a/apps/ComfyUI-vLLM-Omni/comfyui_vllm_omni/utils/validators.py +++ /dev/null @@ -1,93 +0,0 @@ -from .logger import get_logger -from .models import lookup_model_spec -from .types import AutoregressionSamplingParams, DiffusionSamplingParams - -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(f"skipping sampling params check because spec for {model_name} 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 not _check_sampling_param_matches_stage(sp, stages[i]): - raise ValueError( - f"Sampling parameter type ({sp.__class__.__name__}) does not match " - f"stage type ({stages[i]}) at index {i} for model {model_name}." - ) - elif isinstance(sampling_param_list, dict): - # Check that the provided single sampling param matches all stages - for i, stage in enumerate(stages): - if not _check_sampling_param_matches_stage(sampling_param_list, stage): - raise ValueError( - f"Provided single sampling parameter type ({sampling_param_list.__class__.__name__}) must match " - f"the types of all stages of the model. " - f"However, stage {i} of model {model_name} is of type {stage}." - ) - - -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 = sampling_param_list.__class__(sampling_param_list) - 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: - stage_param = sampling_param_list[i] - stage_param = stage_param.__class__(stage_param) - stage_param.update(params_to_add) - sampling_param_list[i] = stage_param - - return sampling_param_list - - -def _check_sampling_param_matches_stage(sampling_param: dict, stage_type: str) -> bool: - if stage_type == "autoregression": - return isinstance(sampling_param, AutoregressionSamplingParams) - if stage_type == "diffusion": - return isinstance(sampling_param, DiffusionSamplingParams) - raise RuntimeError(f"Internal error: unknown stage type {stage_type}.") diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-chaining-services.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-chaining-services.jpg deleted file mode 100644 index 20d9d077938df094011562435b194a415e837d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265984 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

7Bs^t)V5L%nrmv4ZaC9P4G^hRbQwT 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 @FoGWvX<+-cb5e^y-85CiqjgGP29O3UHWt%xRt) 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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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 diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-understanding.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-understanding.jpg deleted file mode 100644 index f2f6c8de175e93cf8e24851ab504cc895011bccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423088 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

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

nsNrAfk8ne*gmsK)_*M9TI7UB^q8arsX(gx4y)3 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 z z0>VSfy;mGu(%q;pGzx=(PkNN%eTs1+dxSnf`|3UlF}p`@JX$~JG=O}-?Dss1`wC7g z00ES6?(IUb{V<{T7c9E7F5|cU12~(ev^?cSUTasMrQ%f@TVYonj7P<# zOR)t2FH%^E6-h0i#@h?Sk<+|Jz+iFuqfnRzuSeTSMVlniF~Sl3BC`_<*{38Xuhj`t zjEsx%v$PEKbw`8PXOtv<mVhg{Y4qCvlm~0*lx;r9w=|BrgVm_ZOn;}Mbg^ZyUo&* zWNswL72kaa!otEA7Elyc9|HMT`gf1g*x`{oy{<+#`_DBge>exA;HAsIoA3)=oAOPv zE$Z_c{mf9*J!I)RZJ; zF8XY&Ne1JG6UpmqA zmM7?n;EYfj=UzPaTk-aik%djhS7MTWZSaCE4}B<@Ee7Ya#=k?7NgJ_4Z@K&KC+P?G zoLbzzKVAQ02z4q(ImBonH)ln3{=!oE$&k}i+4t=xZtO9)%a8A7R9COYR!y0E9lldt zQY}zFSG%IVKGM0A?@%OzKR75K+THj(C$OYs*|-}vn_8KhktTzkYTobl5B2sH@UMK5 zV1(XS889aM99WeHdz|=v)H0~Mv}t8(SJU6=;Fi-};mWnqPm!_1AEQs1Jz7Oqm}@rA zRNf=gKi?jXVQGK0&sLw&i!RnFH@W$*=KH(mKg^FWzK`ye^$o0=45}S#{`JtOE~I5* z;NX{rc|$H+or6IpKD|e?k~BQY3VUF86_^>13(y{ zGLiimHy;R70~bPPQ$t@V{2k~w4w}AmOz-l*@>{pEzm|P6uH$+R{{b}qW|S{hgq&@g z4mlgLer_eQEbYU+IM=8CjUNm`@07;bUU;&XIQLCa{=T`nxz(yh(b2hwMPf4U|Eyj= z)^pV_sQbp;vPoVj6m=B-xaZUy(eEr7a-X2$;^v#ukiy(*wcksa)Gt$6sT_-lzL%)7 zY?|j``yCHX-+X+~GuU%y93aR=0X^m6ts-Lc{^rYk$l@8mvr8rLz4s%RPaRlDind@ldo zOEas-Bh~6*DQ8bbR=KTP+AX=%i<*x=d!tloeoF6A)q-FZ5YK}uXyp8|j(zv52W=v|gsL_P;;>0RoJtXk4{Z z2-_dOcm4@dqdRH|JT@`oCeNFCz%FMuI)BByjfroWxpbj_&rQ)~@0ZopvRCBgl~Z0H z^J7Q`L80RZ$2iSmr@XWW4{ipS(L{aAE6kQo);5ZBI$|O@SrX=-$5XA_VN8w+SucH# zlla))&+ykXplNZ47~S9)fj|EuF|!bjGr|gW?jAo@=Xld0Ej^s;GXHRllQx?U$(hG2 z9i#pO?7lpl{+00eV9)Xpc}GF-X3)2b&5fJiC)iI;eZ05N+cbg`XzFut1c>G>{h_c(8e`5sXU)i)#qJ{%zd3F`Il% z0|-+V=jHuzIQ};vo<`y5`b*Z{O}9;hbGORA4X$0e=p)l=e~UQ&@!{}oZS!f14D#CO zo-^yhQn2IWZL908E~byyRp))(z7MPU_&dFQ`#q*dR=uX+{ST8jj>@O>OhOi3pEy)C zmeZTx=q#x@T9xuS`qq!4sQEwFKNz-tI47B&Dz=>3c(Pe?!1uQK#gNlgqg$c(_;MbX zHZA(rxjuPIaz?+p5WusT-^SY$qqo!k6$&(a3Xh4|=iz8O!i|B-T3`U`yGh`oA#gg3 zM=<=~!#a-mz9uD)v>~+5%*H&KGWq#60(gP(9cSIvv-k3k{L*?ykLJ4m%~`&Ajwbuz z--V#Ytk47ZPiW)(jo(#u+yW(^{vGV8AC}+N;i;*3T=rG4ZmaMtp*%>5xb4m5s{z}ScbMi+rnk^$&bUf7K5e86w9## zHc&KFlExDNjcvO7T%zc~W5tH8(!R-uZbA5I9P~<7rjnKd;BZb!qc7s_&#aaVhxK!I z#!Qz0Q3-iDy9MjyK>|FYOJo}usH)}}zg0*$eEJNph^!E5t>v}^MK$*b)ysMoC)8A` z`b_-&bnQ;J5DG(3r(UtUmW@XXpz;!g>iB;=<#uVBn?rxb^8v( zQyj{9dE?JX4O&&&;mK|WeW)zMGeF%*Aqu4HFB~G>a&1t&qsim8;*!-oDS&RjO*p^J|mC?b~Ww{e0s8iImlVs;ES9Fcr3Shlne@VrprpF^0>RA?E@J~V1=|C*+!u2bY}rOrZ| zHy)kQxFS>+3+6)M;I@LN_;C#@as)v3Z6HYlD$#9&<$A@>-<5QJsW^9JR}zMwWD0yh z_ERKyd92g=z`vqBStEVwh06gl4?pOvsX#+KJL0bCAy6U(a3oGAMR`f(d;rq%RdMkE zg|P%J!a|W@1S)tRDBes zDA!fkN3s^8i!d!C`h;c!%(bL(FNnS{u~~>MVHm9Q(Rc~D2B+iN@<@h=ACoGN^bD#q5yH8u0*HfOJCloPUk<_QDs3S#MxgSEraLJfr!b*c3##l6H~ z`z}amhh*{hF%T7*`d&@ku@#`2S0P*sHv8Z91+y#R!YiItT>A#Ib`?!NZS!EaPY@gnJ zh8*%J2-WQJH|+EBwYr-NA$zt!`yGX0z4C~_0*Y=y(`XZDam_BR4=~EqLT76Okd7Qi0h(cqy~yha>hmjx$8PoPlge-VG{*^xlIkk zHM?#Yj$h7FA63b@CmyXU2W{t^ZR484dwjmGHcj|saX*`+(@*DSHlt8BN;sk4+LIhU z@>%@{_voe1UbQ}L&dt$UE)_hBkvZ7Zg7COEEQ=*5UJ9@25D|~;OtqVST)+=Bo&e+1 zkB!u9?QlN~l8(T!N2z2tSGbaOTpX_uLR8AA@&4WA2&ie!l8SvCvZ)De{f(n(C?MC8 z6{yH0;btq>EbgwvOLhvZ$!N1Oyg||`@N=Y!6?qOe25j?Uv9U>>ci-h3(`0X3zQFv% ztGHaYh1a3$bzzv`Bb{aMrvX~-ELJZacg@F8euYRb`Pjo|#fv^{vM&W{5CBxqyaI-l z5aL;*8~hjE3KN|Y+fk@wF`Czl-iVQ+l+!N}rqBuHqy4*HXNi;vMO{=yFT%h&z$z_w z)X9`cf6sjanE)>bBCPRQz0xe<=>YxY6&;Z>DrqW3Q4M1>Npo7{HaDKlD*z%>FpC({ z^x|YO(!M3Ya~2I!R_4+Cj{TY%tauh7!cy;Wuo7VX2XL6pTZ+^21fnPo3d%`G@1Y%9 z3J2r}wsuOGzg(*i+QcOTbonCK>bWAnqm34_MC0Hiv{jT)Q=H~>8t58T z?dnw&i^=trl6sA6qgu>RreNGGO&%XCXt!q??N8HLk>{({o1_~qV3BcpaD*$An7o4a z37HwNI^le>oWzDL{bdw*qfd*=rWT*E~msbfdAOoq$w4w>!c0eRT*TYsLr}w0y z!Aw{H%-V1HQ8H>!q(Xw5EP!RS3wP3%4cYAXuwhc|NEOG@K1 zZjAn$Ipq=HHQEjfdtENwg~;1bfsGrLAfB!;8dG zpqfvcb;BZ~8Dw({9+@W}9vE5>{SDl|us3Y~$30d^6Tp}jo}$dxpuPD5iyu^yx&P6oHyg(%%$|Ul;>n|Q~L z8=*P~aLL|XqxeHtoZF3rtjby`zc#uUlK|BPNECL04BMpeQr=W{OOg=|%B>U_ z6=AA;&UG~@WlXbHS}(IJ;cj+-!bE(YX4a0pX8>s) znKL@CLM#Zh5X(n2Li*Ez`PM+RyvD;epYK$XRj-5LzieIM-9o1kRPX-`oryowe;miZ zn_-hLNmAAHcTnWtpmxGawa)SM7c#M#qYPj zV2?fa`F{8Qyx;HF^GP77cOwhM+Qc=EY`2i%iIwhjjgxAa!-@d=J77P-hT(vxtmnMOL6{6 zfQE>#`m~x;Am92xNz+(`J$F^fz;vY^0wAh|7em*(X~$a$I`qXi3KUR%ako z$JB3d{!q~vl(6({)vwnI-s+k)wp9>7j$%HY22!-qLZ$KCHQ3};0F7qW%wiE@3*)m9 zcHH}uVaj(N8ghv_@s1LL=^Vj1UqG7K5EfdqX#@b82b(clpJZ|T;Xwc3q|&CG4n&pS z=?3F7pnuE>%y|3bvrG^;EaNZ%301VMzq+nNika`#FYbuTp&XciT6Ot@0b}8@mlp$AuFiRZY#SdSFe$|L9QgWv29K1xFSyRsZG7* zh{=E%-^{6Q)Sq>CDW)+vI6;)j+2UuDL0}1x4A`pk#Z~A8B zMMU{Ur(n0+l& zeGzx(q81M&!Px$@`M2#Pb9n)$v0M5Tr6sY-C+(TupLiu#b-TR}AE#A6>2t!tLTF1Xj;v)cKMb z)bx-kZGmt#n|7>Nawn82$YRV)F9IdM$<7h!cP1wggJ7^Q(i6Zl@({}W6TOy|(Ex@kP6wZ<{IJm^6T6OZ!O{e~(Sh)@hauM87Nr+EpQ zwm|4{4Loz>So+%Q3!xwiq{~gj4?n~1a^X^WU96q9+wO`P1Pb&& zgrEZ*6V^_Mh}W$u==B3j*AUqh5&B`@Sh(=4RJIt+hU?wCTlg1Ebew6UT)~k{(&+>+ z0gLBV<*&kp#9sNBaFZ6M2g@Ct2ZOL&H+8N{u07m^4 zj3|7tTZQ8Aj;6Cwz$uRCG7J@w6iG$K(o||T5EFz;Sc+VBL`TtKf)FJ(R_WC%e;(pr z@p_n@nJAjIn_z4;rBIWmb!)-&J!#!J)Rb@NqO~stDxe;Uv>8O^#dSy` zu4HLJTOmbZsXE0oP=-Nrc`nr1D8W6W8S6lg=QVhq{|QK-af=A;*UeRaHd{*G*<4I( za%Z${p5TALbqL9tj&tTh&l1zcd;9;?e>ET=`?%*v;0&A_fK-?}B2lD~*{7W4iZMOU zYb*>&OPz%47D#8onah|Lj}7uGod+9f!>1tX_207Bq3^APg=-H7WML^9`eSG9A^utJ zU|~E1k06IJ0VQKUw#832KRIa&?h4T?o}+-7RhOF8ptfZsrGc2 z^tffo&HE>Ya`2(NL^=24Plag2c3ehtba!`Z?5ZGrTC=!jL!Wzxa0v>-DEVX5(aBhJZ(N_J(a=y1);cllf`CGuLL|%%MYT;6 zLyt!&a`2dAP?^N$ib*qbkIWakUv&R$bA^pg0N2IZfMRv(Pm9>g@39#Cku&)kT8^6* zwMgYbUIGEa_uvF~sFL3rmZO9|3ibM+>aP0mz=F^Om(81pPmnbID`_HXsH|Ar&Z;7+ zdc%n3@N!qdj_vM0qGEY#J+&OYkL$(2i|ajhJiE=Wz`=Wsa^*>U(%w%zJ4dK4dsIco z?=%QP1z*r=!!NazMk%hmX~sjqAJhLmp8pK`Xw@o!-)BdA9{S8)^6yi5_uGfR%bE&f zo;3+LL?Up88z8y+FL6AtgphPZYUB3m?IX8OD8)QH_A+T$y42pM_Q%`3Hhtqay~DrS z9xeF1BNROhOF!Ym%^ej8Zk@VllYMi5J|=rl5JUJG@pBtqo@(=X# zIz4WwnGC+!BdrD?f2WFSn}}WlPw$(Ndn9{^{{h=3`&aioWbS=aBM)K}P1Sag`(F;y zn#xOY#)dJ|_ zwMUl>RK2@%h!VP+e{H|C@3yTUhctZAk(lUO`M$Z=5$G-N^JApFllD?vjelQmh$ifA zwdjP8E$A}bY&RJkWHOR@qtEN!|JZ9U%B3AC2GZC5HYz?p@iYRSUj+|NfASsz|GpEz z`{viTVt{_1SaN&wUSKq}z~{#d*)sM;hI&Zs6HK7kXFXh!$VpXEEsO9yw_mChza-rFtG)a3U&ahB zpL+pWxnjk?`sncC&93$Pg$)RAqn2_#%@6wW=YwQ&WnaIvA76S>S8oanYFaw*Mj~ZQ z=D7NYGc|2*AI4uj_#hxM_F`aYI+@I$d-Qoq3F?}_;{K(VQ~J-poz>N|IJMQF?n1hD zApb4t!HuEfQaAD)|UE00yy58Y!wJ*#F{@It^}Ppy)|`rwcSeXtde8y9dM4~D-2 zUtR0p{30vz=rRhp!(BuHxnb{zpRoGAF*9H?G}wy%M}1KlAf6w68q(9X4@v6ZX={s% zH1vMi#fW8ASiwN%}4um6;ss{%Wdf)cDYmP|EgJ z*rW1>@gt*@i(BmRg@A{F8f3ePm0D+s-RAM$tjtW#!a{E7_dK!;MSx75zBhH~kcYW` z4`4fW`S!br{{T+|SmVhAYxl_Z(s`xZfA=pq*U7#cN`G(i?(ESzp<~vMhwEob(yZDk0DM>(_FG^=p-VoEBZ;{+ke%cOm+)q9s~Z z^x~IuFW`tz@llo^4)=4>+@S9?|D(1X4fyT($L2Shv*{})5g#c&zSU~u4?be**g0pT zPYdl2Y3>#~4To~4FXbBHEdh@P{BkEOdRQ902Qp5QQ>tn?A!`QdOq0R|TT7x@t=!@n z<;!zZ$IF|5!jWSBMkUejZK$)iM@5ofUk!+cADZ}&+fuQ*J=?bXW=1O=p~LsV_V&%L zFJJDNa(_Ek;fC;rDT;P%#C8r|D?gfe zhJmzN#IOCEH37Xdl}c^~|En5;EH&d&osNfMN zP!Pt{F+6oAPBLyE(j^p_4hO7_WBV%FxiL|*tAH%P6)LC_`h`Nvh6KoOy~&>`po?03 z?TZMk_Skz@9RE6SuUt*>)i13Nc~wTivpF~nGmO2bHAW_^^8eoQf}5VBdZl<_iDwy% zTCOyju$lB7{ZbJo7Atpj=)vJV!3#?;Jht{<@I+WU1oect@g#`bYw(<|K6z3lVxFAq z+FQ(42dps(dDE;IxpmWZ!c2#p*MGp1+p|LGpJ|&rM|`LJMAUU|X}$gvyy*~+aFL1m z#cWy;MTfaEP_PZu&Wt`*un6NlRyJVy{x=K^@Jq&iQF;~J?w~4Q^Q~5ZNxs5e-=Fr- zBA`vFd&37b9IDcJb%vazv6DrRhu#_L!#m|F?rGdZxui@SQ`Y1~GO`Y1)YPdwj|Iha zO{Yaq{1!cJdHhgc(&(!n{s{6F74w4MJ=!xc(T;cZ$;EZbMFIu9(c~hB4*@756A9=i zXp72GXP7zl2^?EO4eQKv@DK=yLVB3SwRQvBF*yuk+A}L%`uNU(RI?l2wfM`B94p{{7?5TTo0RKaMZ2 zU^{tqr1+^0+eiY4K>&Sb2|%7Ow6LJ%&T)>$@#hs$5X|S-a?idrG5LYHkw#`5e4;w_ zKY;K^sv~tABDU;B&73&eC_}->$dGsRlR3uuOs)?z_Qbj|=uYMX&Erk!2bp*8vun{I z8WqY~D3}rehxPSCY@I%g9NS@*47bq#1BmA_7$!+<4BufMaKV0Z^jm&U1Z~D#QpiXc zE0qKU;KWihLq2K7)!!M)sQIdZClQ^-wv|>nmN)HS34Q!BK63iKc2&J{%xo^Sj^^4M zz=YtaSh?Sd8Lcj#>YXw)N*K1xMby8fNTh4(YJ{dx5%{9IrVbloPKXps=^D$6o%p60 zm>I_=TpK83<`BuIHcDeWyarCBSgC1^GIH7v4+tl<35KFxx*l{RR*6r<&C|l(?OtC4P!gEh)|0hn_%s9bp6u`G1P4IIwcK|uvzIJr^@-I_ zX#`R>$9BH<(K5%$P#2Y1nB1PdGC3TITajVKA9&-4aO9tF3_~;Sb207qHTJ~D|HK?uK zk+`ZEzLBo2w_sANXe~V0bltUc!Y_vR$RlN2z;OuAU)cx-Wyj2e-JuE7wG$q~`BjgY zs|$WMa^wJ_B_a=n@8F6j11!|Q%})#vVQU1QAP4Ge)9F07tLugSaNF?~q4;=(67hqA zQTfaGJgGjfr`ah2!25(A;kRe0LV2EDyJi``i@}4U$}u>~7O$ z*T+^PGT?W5u-+g62et)foDX|A0cHS$i%+-=jZvTngjM79)60$@lLWR6_#lL3?xm6H z2q>x9mI#noYIxm~3}SV8Ttr$fDRv~>mAhY_77xf;FRb)G`-m!Z_&JrBhY%@U3Yq3)v=mh z*4nveYN%}7%xNO|x(ouw+rfk8gF?jrA{32Ni8CJM^>;zm))P%w_oD8Ew#}4%eCq3Y zglrD^&Kq8{n160cu)H1}^p}LgzIioE#n1y#`-wU*l;p+@$kCuXZLN{z9+wKzG%B!| z@of9`=x{CtTDDCIVWG%mu;m_dtq`TPSQU3y8`lmi?}X$g2caV|4cCH-fb)1fsqnDs z&QDnr{V(=JhtowUz;YxN4a+lk&ja|mp!!5nl_gfro>NE+d!#n?%q5V0pW77*V1&SaZISJWle_R zX)62BO;2c-#pl_lJLrb;`pJNM8WsM3kr@a)M)L5FBmy-E$&)f8BIH8BoQAM9ijI04 zlflL1B>9eQ0+1$(0$V{W2JlWj0wOy4thfZ>BC(kuV>fiu^b6Q(38UowI+9tks2u|o zY|7iZM#Oif4hab9Od1RbK#7h|YVk<8E|Osh>fV`d{$S)Xeuv5C`0Y0P@ExdNXhC^( zwFF}!scqsZ86gKt%oW(ZP#T$Rp7J+_`%oxps}RzGgBkivvN>ENuUjX;5(=S`aGP(8 zSL&rhulX>lhiH7QB2(xv9i$k4qunaBFFx_+fOI(~RfTU_+Yl99*rFuWJx!mc5sz1Z z-3~H>OW}NKA zQb5dBQ{y;xa_16|0OG`QY%O*bK-twGDw}5*i}YQsG*MHf$?pvtR=3naXU_+*Y7xU& z6|?)F!y7j@Hm3!d-k*HHm5+YW7-=?KiV7ezj@osDFbN52=nuNGq|995Bbn!%<_C(6 z6^zrDcO8wpX}B~v_Zdqk=7n8Q!}?SWB%tD(U9bLrZ<5dtGUu08<+PBA}Sh;4ThUfH_cukYF56#G5Q-Wv2LlH#csTH{eWnYkc zNTtgAsh!EuRBEH@PJ5Xa1$;asq;~N3lWX3(%|_j*_s~KeB}ll5_UI=J!QOoB8Yn$M zxdSYy0_}sFiz+=eK}%yj)W!xtqeP-JSb2mM3j+jm+NMyRSd_yH1z}Z8HP5vJl2RDu z%R26Org7MsiVlOp1%3!-m@_SJK-YF|-JDJgcX3r{EqkC7f5ZTuF57@iz$=|__at=B z*rZX|78*5X>A-mUL!X|FY=bt_zw*#Ltb&@ zk-Jz!o;&pu9_qvg<+fGR9B+S+<|7qtJ_rTK7L_Z#Q#)Y+yK~nLGr)AgK|;^2im+fX z?HI8b8oG$L>Ko%u?}Z+)inRY#Z7`%K4R;}{pHUGsr3N9T(FwX5x@`KK{o0}ze{FenQnymAJlL7i;N+M&qF-W{ z&Y~+%bwU9(GaOYATPUkr^2MID?5AJbT*6F`QFS?`0?A$uWCj?oTR3s@mp(JEV2Fxt zX!QIIN!{t+$w5w|GmGRyG(3Kv^J&r*#spSvgKj<;EGKq-a_C%!qhcn-CPjEm`+oO} zax$BfDU=3*JOzu>uEJ@lEo}(2t_)6!D}?Hxji(G<8U5;V_pTjjURW0?l_&ZoF`8;S zkXhtF{rqj)USY(>ywK6jRnXj4%;+sxzjplN2Y)jcB0_A$jA)~15-9+QC(TQDJ`hi- z(BsA_VR#=5cWFTp3ppHc1Dk4~SXn{5XT$M<5}oY;ioJos_WdrNR>K(*VrKLZ80f(0 zxLZB7G1=C!jEJ9iIb|J6DvdB}fg~uPeZQgk0oN}7E?Eh^{?9P)H9KYH+G!r7I;3@l zr*TDzhUzwj*z6@*ySpMhl%BVxEznT5&)1!0KDpL2!FD;lWG^>kDHYf7lU)hplnmvJ zQx0`-qf6qD9L(R|y#6%f7Oc;mk+;{5)R)6-7R*SyINh1!;i!Ey4U-G$t>=X|Fdaq& zX!7U8PDIb@1iAKAfQY;`(PrU?N&i~=m`WQ`+&AWtM@O$|2t97%8aP~MsZfkos;DFY zD8c2+J}H>9i%QJ>{3yzD&l=Dtez!4^VAS}{>*6_Nc>#@{)`dE%Z4md;$i*vCO}#9K z7%m<@IGbsrbqC8!Y#!1ncynl^xVqf&JkX8JWbmz~dE!o}kgS@fl`|XCIrZY>E@mwN zSzrp%!GoeA(I~(*24aIcbdX)KwxCDOZ%kgZ3KZb~e0x)K(y)E;q8S}OIYFgD`syYb zo=TJdo_6?9UY35mowd#Q(t!6-&fd;i}XYx zin**n&Gt*)QCBP3KoJ!Eqo2X=ZHTnG&!2GZRV9vif!CU#fcE~I*c(t{Uf65(3Ssiv z)G2kyX3i+Af{hLkU*pci<%VN7{&=d@>N(@dO@Z;bBFzN-8aj zF{_%+F(%mO7jtbl0y#|AKPs?-RlSfl{8_9jyV{m>p3i)To47OlS5zQ7f#+>K)W~u5 z=wex)hHE`DG#v%C@&mxkkmWSnh>1XChyFmi=`_V#1@b)qi%{hi(#a3qFA{dHvp^CZO@9Rj*37G;Tk?n;ZhOTaiM=6c7D zhV&>8au<$fhfyM*XpT0Hb1AHbbJvzu8ji>7o;4q?N^C$4*X|*sTp~Y+4oSc&@D$&; zP#GvnBDU>d7fpMunedOx5C7ZvCU5M^o=UJN3UTs6ohYGaEu5oe+A2Q=IULx@O&0}% zPB&)3N&W-@{-;s|JA>HRv6Ri%TbB|Cjj|klHHi6M9MxMdS|ffw zbJHGk_EQHn#kX#ybUAomKHW41tz!p}g%`+J0Rj2P`!Jx}!1SkK&*U5;xtEtHj54c6 zcB%l~QgSbfcBDS;Y7W8#lrH&NTsKsk+iHeLb?-AEd4*S&wOjY^>DdA5mwnBsoS3(N zBkuR_Vo`$Ihq*ls#Ws`zhAem;26<>YA4cDVxQB0wwxJH!5}7cNIz$q+Bbvsi#8a&j z{WJfrdM%ld99^+pWuJ1{r48u6x`%`&b%>i^X93v%J8GbV{eAu7W-lfi=yp}y^BV7j40{>Bk9{j>xMHT%H`Vpzg$YfQg{CY zI30N8j{}jS3_e3Dzqi=LT!Gx)p&v9>#nO~j9bjg4v}#t%`1Ti`&q}RuksQV4evPL5 zUX8=os)Ih}>EEZKt+e)!H|g{n)Lu$_G}!zkeODKIITF=!Rx9*Yf&VMVi@!WmnkOnh zpMG*?lRtB-up-ykp(Uu^JNivd`C-=~b;}z91Kw#~FORSHzKVA~VeMQPo~>_svFPy^ ziN)WAw)(2xTf7BXi&JMD`iXlcqq#wgvwDSghP~hQc*0h2<{J+u{p)UA-@jLDmr;Is z(UDf-y0QO7YV+_Ah<_*IPrzKzD|3Im^bWaLX-^Jx9f)OE?X4qmIa*#c%}6h7hmaoXzx9TFMk4qM~^Js z2}yQ}XZ>byo_?WveyX@Dgr#uj*kWy?4hj+2c{! zZ}$Od|E`|Iedme75Bd|lnooYmG;PEZeV4+jjqb$e=9Yf7by|GDF0|9W${ENF<8~Qu z^>p#SDwz^HKnz_i#h@hj?^k_G+UDQI{qcHroi8H%*Tv$U>(ZMJh?|B32Y+UR-LI{K z?ysbBIbd@))Pl241wG6vWcj}JeK;3d^YLMmd8NG5xZyoqNvQHHIpohfwo8Lg3(syl zbu!e#;zZi5vR_-3Ur2RL4&GNCjjwxFzJGHXZBuuv4B0qedrSy=_N!w2Nv^0#=77m_&eKcF4bGMCPW3MBs629>a0rrLvW|*+Q<)X^ zGU$o*r`4$aDm?|K)8_++q9})4QXUkKr1*R@5DmRXFViyHi&m`=1mFN&c~S^k=E>_nWV>CtK%ivPSF1a~D|To!6UBe&k=S z(1?0_fztSrkJ+*?p}b4$3i9c^T-9(!KVAK1R@qCrNZh-s!`!lgc-Vf*lN&!d^Z9ZucJ|krg|yzMH(x%+S5z@isY;gcWpjoaUMM@> zi=Xm+^k@C7dWa$B%yto|Vq0v5PPqE#_-;g*KJp92a_cHD8ebXwV%QJ4DdZTr&9~RuT zP2X)eJ1`M>`)qe&f$M@0|GRg=+<1s#Sn0!$wm~z`3QSs`f2lKVJ?|5FH~jIV$V9z$ zEACtW1pC%2-vHus?*kEC+(FIzm}~_9TndbPBI9|U)G0F9u#yJ+g%w6Ri^$!veYhRNUylOtl8Vq)U8ZhL)5Q`Z zUiz=iDWr>k=7Ejl+^ zh(rWHe}WaQ1Ynwka~OLJ?EZMRX-9UCq@kg*Rnl@K_X!CX3a?1ycII|ZG>G0WPB@pOka>$)Ce(KiecydxKkYo;PlRiy!NCtQ!6Yr1(Jl zBMjt{vc*z#o_HW0?}L~pE;II{147CY2c5kf7N#siGfSTAU4AjXro!-c3B^3zZLZ55 zKK(28@fX3+U5l4b20t%kTwgG-9O{y#)N1%^z$jeVXo`j^5m;qo%pt5u6xAd<1zLUB zG}pSyN1VetBKS1NcoA2~=lZ)xiWb}{envteFis(zdchReWP#!vbtNY4eS!!k z-(bCl$q}{Rz#f7q1O8WjC+k|SYkVx_pVuGalw(#MN90vL+ z6m~X(3R>&Z;gwTGRE8WJsd3L(J!~j|Zrf3Tq7|dU*f@MMbIw?LH65Ffqm~{M@q^QpnT$s?KZ1JJPht%Rx=@0;3@z4|A3`0Tr^|B z=ARP>q+hw5+|Jrpu{_CAy%j?Q*XuKjs=A3zC19_K@CcRY_xwyj0?UU~%dQnaI4)iR zk#Fr$0!R1HD9N4)VH`p{YkE;V@i^(>i3=&8(q;s$1br%e;<)=43*g$V3osCYkgy1e zIU&Z=hkLihEV59Rf3re#r>C`NJLJl=Q?L;p@9DRjjQn0Gtia zNZRhDqnoslsp5mf5)zzrWzZF#D|SlD1Ee;7H8q2@2C1uQ@6APp_B51=!oj%@2I5aKekgv~Y_$mY zHB=!9$3Tl}w~4#ua+h$76ckPurKuw^+b!(d78D*pk_x8!9o+S$Z>N(&C zhMoXtOwO9l8&p_d;xcy!;BgZ0zwub-&Jy=rj^` zAx3REEe~%mD{5Bh>|aT?i&G#yY9*#97eRKY;*Vkx0cen79R;Zk za6wvWJx+&Mx|t%sN%=Jr+-TH`vwk9;6AHAdPmHOFG^X;wG;2pks_KsTh2~G>-$-hv z8drQDhonr?K+}nb7BEBc8MRb+hM8Td4xD&KrX@@&L5^A=+bnHIB#$HFAr)XJs~rYG z?6>*fK&5v`4 zp_!(_#d8j34qR%+}Q+*Lkm-=UG7Uv+GlR)M$x>2`95JT&OI+8_b- zlW0Q5aokb726!%UJ6oqz#l0`d6#$t5EmHECC;14|L^X9HJB^)Euk=6@dK%Ad#|;d@zDDvDFUA z)@(LLXdO=-BXt{UZ@N9eJE&a`grQV19|`{-1bd>fC00Z1yS%_Qk58H zM!kn0KQVv-9%Hwz>X?L~B=i#63$6#{V(^i3JenvmnHO;>y?LxYoVc((xqg@}#Hxal z?|yn1M8x$~WXIKkPN1v{DQLtF)cImoqKLA~P$nVR-gB@La z6X_;~WlWAvc$I&Y_-qFtdqL^|9m&HGz8xv<#(WU{R@JY>jGS|}BIJRVIekl&8HCkx z4FjiSReI(@q(dZ0UoC9>wIs%<*;7b2*I1ELI2)6If(J3^6*-vBxbg0Wr)%D}92K;8 zvW~p13ZJkFtOyd!a`+EW)xyGINKYLC%JD~OnK19cp&}V9RECAP2-iWiig6bUQne~` z;y#e|C!l!y3e9*iwed-o?PuWdFKiD@(X+amw$bZY0d-%Yd>4r0w3a~a43MG*2pgC# zuNk5_5zjwT8PnKYT`Yu3;sj~O)|uU)@k4CI9XaH5AIl+O;U8j~TFC8{u|FFh>>YS) zXhTFNwp`JXyxK*kpeh0+Q|*c4hevQ0%J@Ei0NU7+z*U76CKxxlXpLySan6hiNB&gA1G9@i3fm{bYyDY9q+d zL)(--6Wg>*aBDfH-JEzi1An`5JaI(31(ULF>zBqC-Jc>oC87JMCW^xGFn&K{Mpq1A zT>Zerb@{cn{ z6-Kc2hnD&?^9Pt^)B{IRD`;c60INtUL(vOiQn4<>D#Jvo`-wHR78KiSWgP_MD;Qub zlKZCWsHz_ye9m4cmt)6f=~nEIx(erZR8-t^bchsQ0xdj4V>0vtgc5jjyGqM7FE35S zor$j)#J5)#o=Rrbj{CGDIRu#pYK}OF1jBT%O*=7ea2V4SHeAbM3;D^MfmHePA_#n8 zY+VCUMUZi6Inm;bOVCWxFpV}d#Q&+H&FMeDerkt+vIO|J6@ya6^xvzs`e9}40FX;H z?0{OEysKaZF0D;mC555keMCWhp%zO_M;ynrdW`@K23PJTI{7+TLN!zPNID3#5WHWu_4 z^mPdTJWi-dFIIk|nqx0wl0ywtJNs1YmIET<011<-MpzWjz-+J~ck)mk*aSs_d}*o{ zo?8uIFmaqRF&H;KtES`=ia~-OztLTxcg`{^r44vB*dPm5di-O81Dya7OBGQ1zQV6- zkc8xyJ3FB#5Suu$GeEjo+zr{0+klj7L_%RiZiAy;x;3!9Lb!}zY6gonSSC7(3kFz- zr6*WxR_K8l8CV)AE=@`0D!&d?_r&UH2}BrU%q%V*e2~+hcYkVD-aJR%2jepb{y`oh zBFZlq@`RC{$mYN8TH98w5C;cP90B!0@~QWQ1juSiF^@JH-IM&9rgpv90d@BPhD`h( zpeE2}w_+gBqtu5}O7wMhI$Ul6_Mi5k zE59?I#!4BWzR{u&x{#T#$nBZjE>j*MuKB3~#<7QI4VzcNBr#PjlocG-#kf`WL4ZIJ zPz;K$DEthKjl=jfU_GE%sJ4KkYL+tDy$9fudcqam+>7flqazJj!YmZ~&Hc^Oe>90T zr5R#Wz!>|rO<=K!7jFh1h&Ng;ba>HiZ{G@6(OqB?P<8@pXAJBznT-pNm>EF+n^sPS z$ctJx*ACYmMP|MYDidC|-2{c9Xa{hpsHY%H*Mje&5EBK3cElxOGlgT`{8NDWD{aZ% zt|JMXAxkikPrK+jRN{ERRyDnO-A>`OBuc&Bwp|Bgc`&4W^;&y`>wE61CF&IM?t}cpS%B`f4dF6XRv%S zt;1hm1lyaL{wN+;8sb0QAG*pvBs|T}xT%Y>H@3pZDNyvpwv&s^GsG4Hfo>*}l@s#~ zo0_1u;3Lfr^fBWmX^D=>e`{)m7rT7qUL+{#o||9{G8QFjde;p`7oVgR zoe`~G4*baj>8p^W@&)iIy@EKtvmdUyGvqVeQkHdGLN#25z9yBu2IO@}Y77oTbRH*) zzED*=YfqfQKxVG?ydMH3#iXfguqj2#HmaCAJ-pxTA<9}1b??|QK&()kF@z{{aVC?~ zi<@}61etvN4*}aNaA9pg)I8DXT)cipQS&y=-oTj&QgB!hooIY-1EH6ejS;0tcaKwe z-B)6G1ehn~r{(2`eFU@`a1JRm7m2P$(+D2A4$xbwLQKk#hj~B@9P8E~prb}7)*@tD zbs&PI9r|>l_>e>BC3SaYo%H+9Ezf(eYzQJsPbRFSNGD3W&Az)cgr%@iu=uFFy#5;~ z*`1!epE}aS^x11J^zj)0^pSw7rMbroCbxnK0H6cVWEM@n+I$mNDBZi(lEfJZR}aaa z0HLsuzd4F`f22PQ^&llD>wRHm5S-J0m?qFMK;fTKFiDAEHTr1?%N17JFSawCVcA+r zLG-@pf`51^LZDB^U4=TSz)yx@!Oi-A#tD+B@D$lH+Gz5W1Bgp6=4K{y#WM1C6ST03 zu)j4>&LpeM>=WLn?qQ`J1KfiVd|sh-l~>^uiY6S9_&7JemS10?j^heq@PhAcbQBEEHs1j@JDHh^3Y*|Fg)gS#kyJ3E=&^|Zgb{I9C%(+UR`o2zH5CCxDx z6$t{t5WiN47*)r{4RB+46pwbFN<{riWK}&O@g*Q>$MGs;K0wF9Y_BZd7Qu>F_wD8* z$-Q&G-;7V2fq1DY-O+q^>P3+ZUekOPPka2}PEet?BHz%}rrBZDkmi^VGR@ZK0@yDm z%*HndCsuTF;K-!)JPI+e=pwmK6~6#v@J%5T{J^(8g%!+OJ47QNpZCU&mrW~Bj;!E~ z(=YgmLEzk7D{yogkF4^iio{dJFr0|KM3Q)x%&JKqH~jKmL_Up9hG&QRW3G9qO*-2N zXd;0tPgmW}$aB#Tr`~ate9psM9)0`Oeb_su(M(K+m>5SzL&RrkM>R|O%`ll!9!ghx zm6d8}!b32~{!FxF_g8JN;vYJ%UY^pZ;8iw<5ra)*)&-YQzW!bTKZVBhYkp(D|so!&0t8=+lxoleBY{D%43{1DqKtbzj6Obg8_iZ^SE}i&%j&-Fxpq=!dklu;h^(NL!2JXGrm?lTriP*bx0ZJXe z0r?)1Fwbc<@$|--v)j*jOJIu?YB;~SQ!02odI*4-h(>llv*VX{w#Q5{^0_NTDu2sB zbZ&}w)dtnF=&J>2keFp7Y>>SBJZw2w3jI8_t4M}cU4GH5+_#?3!*1B_%(lB%Jw(<9 zr~I`60yH>MU3rV?kQ~DW((U&Ka`*kA&r>~0G>w>_2tVrQ1@Px5e=)HJDo}iD&-S!h zzq!+ReG!EcO*W<-?B2{dY}%Ui@At3Q)~C&ee&D+49osi z9)YTTs-QtlYpTZmHHdBbKt~FekH8M)Jv;^teNv-tYcbs7*Pi$w10E2}l$hwiWvls( zU<8-V=*Rq&UD<#t;zg@aO&$pZx!Nz^c8VTw{39mLpoDWhaO+r%(4UUv;&Y<3aNIe@ z8De#Lp2|}ynLLSJ1D;sB*`UBgn{W|XQSu9S7L=qVww+WIm8Pr~h>TH0^=#c--ZuRD z_|p$2wTNbR$w%S9USS%{_zr+a^a`cg%u>;E~fR; zO1#2HM>h8&UdPZ`G(G1BxB4s(;^|non1A8ba3`}m=bRZA6++2>S!AkpQVK1G`cA)9 zRxFb#&8y%F=tr!&7iFs;Q8T2l0#p8>>Iu$KqXnUgm4zCFD@jdy64$Y!B+0N5IqmYo zMwJ(%RAz*w^GV$KX1=YY71DTd(3$jbo~4F0TkI^uwzKb$F9GH>2bxIK08 zZ+Q4-s3zrucg=+Nm&OZ^vt;fq581g;eu*cWo_D!;-f`1$q&B_JWbdMNl}_)$nIVaL z#~Q!h4x4}Rz7?G=^lX?Tb+W*TH`z>jDBQ*`B@AQ|(a@6d@LgQL;btl1X`^g z{y+qxgb^NkNR5flM&>}myI>DZpX*mp+Idov?u;-_J>)^D!U|@e|Cv>L)_co)R68drP_L&@-V~;bngDPq}UBme{}g`lYB`wQJ9$Ps}}b zX*hb?-Z$|f<)UeCL7RQ3@A8V!nPV;?uPkq}D?bj2?(ZDEAA7@Sf9Z8s&-vX;BA?5D zo;;J!@38gHCDucjVMnejA?s?R- zBue%@uIJyIIWOHmCpo@)Uiy*2kN;eJ^zP+{s9?gT81YMp6Wezq|Q?>oD zQsbjbbn=-A^<)LslhVNQg^QtVehEh8v-PTGJ6-<01m-#XJjoPiY$jX!vB z;lVur(U5uec+%Y#InLoDaNTbmfrhnq z*Zr0)SJP^k<3ZsKd}ijZ2|tlG==+YPEB3YJ(aCKgNLFTI`U{pna-KvXEa%W7n)OES zjXHnXiZ?=A`CdFXpE|UY>{WT&Y5BPIW^=H`!uD8CA&!p_HW7KlYuBx)ddDt(TY=YMa`U!G4^T| z1&8YuA;z0iij>`nQSLpI*RexVdwK6AW%hI4hzXVvtAh&o;dtjt^TDi2n833Rw(>uQyg57caI?*kWc)!y3xj!=b|9yO$VVlzoMGkGuVG|+AAu@(-PBWvNN;!m(Lk=l5 zbC#Id915WgBa)m;A?1)Hr{omU0ionj`RIG^{sZ>Ywd=ZG*ZcK+J{}JIwpk8MI#s3vs>x?>vlzh!TOc~#vx~$M$&WXZc_EN@q zwLLY#oQ~x)V2xku7g*df?N$5mHf>i?;}V9`=oq>ONEY56YMd<>g` zX!WGzfCm6_x-=nl;%+NYy^0r$sJMe>u#aw-02qmqn@}`Ul!i?ISMp?_xCd1ZbmUq_ zmJUtIsy_q%S${E@|G~Wj7jlw`5Cv-a2suU&)*-sOJ>>cpn=|Pl<$#b!NZz{-_CUC} z_aMV@RzVe+>NeFxZ=NyfP=-32(?DQ#V(S|k`jJN&EbDosZ^Y~q9)Bk*#r=`3Fk%RJjG>PnPYdk4R5yCgrqk{rLR%S`P-mMlJ)iFl z-V(1&Gz!5^&XCGVvLQv@0r7xS3PKKe|F)C*#YgsqU^VPeSVw!sokUgW>2O$=*&kW8 z$R7RvbMMZ$7he-=X;P_>5^U^3H&V@+K=hDsZdV{T#U1q$h10+$pMVevG(Rv6m#~6O zU=ruk*Q&P0xCo1h-#{!?)yri*ohA`GWCH0GEGQ?K96;q^LG98FN@Jm%uurvTiUp*8Q zW6Xc0Ga}IJs~aT>rIcUZYkStScBRoo4_U>8LOCSkWRWH8;L|ck8Oe8i$a&9GgL{tw zfG`v?UC#mJ6kIlJTPLG>R9elQ!K`>9UP!~u_&RbFpiE4sh$>X_k$O;;49fDUwaG5R zWEUMSpF%Li!T>yEm!dl8N#D;IAQGYbLD~=y8TUl)1=*q=>S*VixXvr;f!rogsIPj* z+j>Rma$6<2Nj4v36EG&}YGKec<)hy<%*Cdl&Hn*pFUe*z68H%h4sQLtmKqU4li)Q`$ZU^v{LtXO*OVbEb+^!+#WTLu? zvYt8eCuvav&uMLQzJ%t9DZr~_gEhw`k!eD>O|{8JI&~Z099sW zpsUjXPS*TA76^h~*PT(w%>)pPkc*=B05^Y_#YjpQf2Zml?X+Gdr&nfl_}B=QUa2S; zN}vxT6_&14f`2EjJE!~DYv?gs6o@Hf(u~0+C^YYj&;`3M7i_?eA=U@#+0s!;Bsv?c z)WENUfO9f;$(<+FE(YWvR;yqnruRXGq^zIdp^XmN5|t1b#wnyXP21R|O_cTUQca&~ z8@dq9C-?&;J8f;Jq!svjb13dx(ty{Q0?MgNZA$!xV5f4<^QV7LpfD0&udM5gIxRsu zg&>Ce%WBkTt0r{!Kmwkj7hCt+T%^T;a{4#W=&j@73_Xpim zLJK$BVLhE3UjlxTxD$@d+H8rwl3DixI+ngdL|w zOdkHhm5~vx(l^CNrx!^!zD+i+WY=cZm!u4jk{F=`9B@#25U1i68!So3PL3WA=`-Qr-1gDD;&5Q;H zLNr9okdNZI2mbvdvRjFr`2H#p0u{KVck0W%1}Vj*>q$9!()sW+Gkeb}r9l>QGiGmI zWIxV650(`IfI*O=r6bA!hC6nzEtLVFGa0@Tvc#;;Fi$EM3+$g8Fh!vON|*m#{yKRP zBpl#n(M=(Z(b&kiMDvGh@RJ5iJIS2%+^?6R6XVNbPv@Bf8GetLE8c`)#ZI`njxHKc zw^Hf$h(c;x5MWN~-Wa|By02@~BwB$`*1CphN@Si_7J`8A(5w$?gp`mvcZR3RwI`qP0!NRSm;AE^0`OmAwbm%{@Ov#` zKnyIax@TS{Mn&(Tn(hnvkj}YrOP@^^}_eF%{`a;1NLSy{vvI3sa~Gl+)5U(~o4TW0f`$+bgTcHPv)X$zt5 zNi@b9N}%Kdic1TXqu0222n}3|fx%pXovPO8d;FYae;X^3<8MCx?8ikGgelVYE zr)8}kHoeQjOSPmWhQ@tfY`|;8Gn7?MjU@<3<>bsr_Gt1|!#IzmR9_9DGQH8%a8xTg zn@|W=8sX<6PJo+FxN55b2Y+)z0 zAHyJUW8wMWP)P7#wJFJN9Z|)6$UnaLvq)Wshk3c_$tX+xLLe_#n|KQ-P@X2&iYpEw zI1g@j)l1V7mvts}%$bzZ__SU`5_6GN=`{mQ;%dRYCI1Id%}w7gF!~RY2_jJ~DCvk3 zlIR`)aou+wWPU1*+p?}tT_I7aC8e_h>#3dqek(?ypi5X?J%g5yU^Hxwv8&kVvXafn zeb;M_G|_N-{8X|DNrW8I-S{1c_j{QcYEzVhPC$cna55z8EjmksG$*j0kXmH=%qM)% z0a7$zP6Vn(oH)r($!)s=wwCDEeY0;;Qw->c=gqYI5-6!zQ_+QPK6!1vNFjIE8&F81 z`Uqr{qqh=4AdngrF)pxeqYEfnQv}g**x9@ zX1t)~*ph%&5kwtu?p>y^fti|Mh{sOa@LB3&H(_0if)7z z3sp@j@VUP-b0vF-B>F(&TSU?c6t1B#-@<#VnU>4YiNNpAK}jPkgsSjMkSkTvvi0eQ)^_oIv)>1wxLD?Y5w-iI6*bT`r)rdL2UKu7#j5U`yxeqqh(s*r7 zB*L*B@1mGK9k6e1PeKcrcNAm$K}dQe`+9+voGu8ME-Pd{pQeXsmMlmrqd22g0@h2> zMY&*R^rw&X_q7}(zsD#~7BVM8K#<*@dCBZ>H3KH~_4%XET$^*21?zK`g;eeP1&|;Y zW#9f1g(;clqJvaM9=ysF3Df`qwQ3%LOp2t?Kk#2No9{p6aKGYEwn+Nsd^-BKu5ed@ zkYztn8=z`J1cQj=Y$sO-s1c*!KfBS!L{OK~` z-WFjdf&jNt##4ixU`Zz=+bJiEoppR#`R|>Rz5aw1WlwjRM~h`b>etSKal5(mpISso z#PFBfEOycf_@P1Gut`wDN^*03DX zNQF^bF9I5V_I?Oq05{tCHDW@_gJ28RV&43!s!D|WI^s*bhP5|z@S@72`3(P&6&7bB zh`gmCjd1+HH+xm<2tn9HaH0@6v6}B)3vzNrc%W6$1i-f4^?4v5I!l(-THeGPdl023 z0KR!AG(t(9uViKNe<3Ws=gYMvO#_24h>;B1kVWF}V}{2jeRt9JV$ayEr4_rZmNrzm zb3Jb+WaVv`zjQp>8;8b-9~>zjOgK3$P}r!`Pk50^Lja|m5d@l?wFSF+c;@lO<;ms{&L@0{=l#athnWt5syx)po?O(-{*=%BY zm9PdST*irBZgEYjuorwLJun=JZlx!0&8HBKjS&l15I#?FIu_v{Q;x=lFe~Bb$IfdN zmQ+LDx*|0LkxO)Q6|ld+0Ka#SILb0%)Z_k&;o;IUi#2n)Qdx_!u+K7ml@&Fg0S-%5 z8Xou5DD}KIp0Qb@a9xvx1IVgXOm(7GIc5%hAWhR@^jOrVps_D_L&A5$;R zI&ll7a>P$UrZpvYIs(O zlP8z>cYTf)BYWU0E8bSq=r1Mye*lzX-)z?bl!X_mSfD&T%%TWaD0X}$>p`OAvLYKj z-x)403%lCTz=PRdA}c-uE-}pErf7zK)-8Sdia?d;eUYHrv;e>0zbZ6r83x<&ngkH3@7d2GpzM1bcCl-S7BkV zk9v{-mq>KNOn#YtAWLgbFTBDeW(_2O<0|EnHZ#6?x<7k<|27SzaaKyu@0g6`KxUzy z5a?RYzT^xSc5p=>19A5rHlxHy7bc#bVeOh$0(QY?Qhlnc0%Xbsw58Yiq27uFq9V~K zO-)%;0OjdCo;sE%%|)v(A4yWxzzA&MkgYrdfN82~0U!$*4yLkB01yxBzO~hx|K?w~(}+c8l3)_3 zV(j1bmax;9?k>^yqZ?0|mM#@(mQpKA`w7FA3Hem1!M zFp|l8qV61VtKjskAi%g9b$ z)1;lZhyJV%E@wX4gntoQ=vk6X$k~t;2P-{Oio5G_#Q1e(5`KQ?IEN4u7US@0(f%{=Y&`es;Sn<S5`iV3>eqn_N)*q3E0?zj zI74X5Gl-NLga;<(0y_6PS{pS#2rC=ncACG0e^@#wkgt%Kc{tkqhpW89s-sTEv-sz; zPcw=11^TB)y|2}kWY=1H4lc|8KJxzD;gffM_m4kq{?cpOG{^E;@NhkQ+&bfn)?M7@ zFNd>@YWGHD6naNpPG)~O_u{30)fXYo$Q@?BvnhAOU_CBkgZO^pM8!LYKP}VPy7$)~ z_gzkZn{YUFKl0~6x1oo( z)v6#R%ir+|ativJDPIr|f387SurB&CQi(`HwZPLs;J?y`!G=%rl&{`uQ3td}Jn@d{ zGdwvnYoOADJtwaHna2EjDn^n%Z~1t@#sJsbGI%|$|LyRN%HLD_a(BL(Pha`G$NnfB z9rv35y!`VheBz+j!5>E}x6C+=zb1Nro+_`oD&ar+eqXWQ*4`y=;)c?@>e1Nf&OKLC zM-rR-i?Vuc{4!;<12=Ru^YXjMH(C-uqu*}D{J39n+(qW*E7#k`-rk#JklF*}v66HS5N4@6I_oo$i$Qma?db zwcknS*PhHt-4EV)Z}$GL#{)d2oby1sY=lUWhM5yE z-(kZ%C#k0z>HH%OT-Zr=1HwXT%n7Z}1;jZ(RUYsF0=HkFH9LhC$KqVKE0nk{J(N?n z6n4W)Kdf|x?fsx+nX3F5`XBGbCN#q>8KqhQse+M96I)1;L2`3 z#XUrIt98oD+SnEojCs`$RP+OL?om3S*iGEAmohI&{u#Ub@p3_ z2)^PF`P%ZK8mH;te!gANQ|Mn_r8F1BQswutkU6mopt`pZaTDmv1faJ7xj*FVa&F}0 zvF~5i{A*yO!^*>Mo$7vZXXOt8#61z}Lk{?I>2;b2!PMm0-H!6&OAZ?zpOG@PCnLUx z-tI7mxG8&(6DNr)3?xtuEtl!2D7UW_H(PbB}0)0Dw$n6R?1ZAV`ppeSeeT6j=v zkM6xjk^cc$s{aFQTyNKu0m>|@U)U*>cy(It)SUfkFU%yj<;fK;4z^*0-d>8)ar~hi zdjat+q+yX!>dv>x){HK9q74}i{?WfX*98`a4cH@ese27)7v`6Ytv49CW`^kuTYEGd zLH>X)!&i;~3c}C{x~&N_^WNcCeboW$z;KOVUZ0|B$xt0`&#ADWJHvYTqIw!8F=?ze z2p_Mz)fs}9LDTHEouNfZOqX9s8yQiVzX?|x7^_cW3?4I9vex#^0Sxcxe!2DPAmuLu z9d)YM<8R}aFqC-2#aO;9TD^G@$3MCpR>DP{^92~p}OLmASA6avQ?Wrx%ycFxDA$mBIG%~@a zDt{o|m-)iVvcj9$5+O|eax=)KH9Ae5jz%oF`*}YolY=_F+Pwh0(xnt(c8wH~;dLBB zjN-1@4ofFzPy2@GJ!MAc2^qD;xSfebEQBUNT5GoJ z;k42U5UUx9bJzurCg!9i2t}tYXq?Q4PhyCe$e?bQMrK8VkOBfiN2X1)m|;bv&s^29 zb@A>z`7?WO+W0pD+Pf1hhh+MoabD&r31PBPU{%qo!>eQ=+YkJG2o%ZFEBVi8sGI_t z@FRsfH(YCFh8tC{OS7{|IJuLi5fd15@Q(E5!m=BhVtg>QV2#^XR}Z`!x3K&*BP zRtqFOoot@(RAg8MBztFe9oE6WkLy5`ulgn(0do^u0g#PxqwFWhrTLhXc9dmevc&T? zs}NQ;GT|sd^pn6diG-feD9Vd!+cz4jO>|=zajNuz;6Y+xAH&=TxubVw#>qtFY;iTX z`Ejcx5_b*o-`m#+f^stZXvIt`8`&^13@;ZhQxiSO@M-*{Ovp_&NJR`=cm}K5>vLp~ zO8^K$5s+Kdxuyf0*UA5v^=hOO>sK%TjcE}LlD(>~`b zRh=3`5c!X%Thr4!=hKkJG<2z&r+l0*A9Pdu(y|&%+(DZUl*ei{Z_-&JA>G9o;A2(X zc;Tr4u#_PZjzoBu2oS^Q91OsqlB3mxr7A{*DM_kFBt`2e;~7(Y2^B^Y=N2{FSw_Cs z6xrAg6w*Pn(h%PLl7uU4nFGwab_*^SR5lVswV|5-zzG|H1r(&YbJce>LtwxrRWDU| zS=(B<$n4%yRbNu4%GlUt)h@9z)i76g_YN<$K8&e(I1Ps_FcJXlSCU^psJTR#qD&_^ zX@_)1j+EL&A&yPq&}muE-8wBjn)OK|-D!Z@NwOjzN9i9Cju53Q*rtUUC(A~Lf0Go5 zv^t~Rr)G^4&{Zr0%|}^@tJ-?lug|c}<%`l&5xy239!U@#Ap)7=Io)x;qY@Tfh6hQH zak3s1F>vVfXm~lFgU9?jEq>qU5q+e=|5}v4I$$SJEiCqS_afT?Xud~gwYpR3@{xRK zJ)=x2U2f1v?=VNrmD(=?&3)%avk6#D%#l)qCY-dcU3Nz7kpvgbzw!Cv#>6ZhQh_Ek ziJcJzLE+a=HNd9at?bRVxCKuC13-M~=2!Z1a_HXl>)f}hFI6Ja2;%xIq`os&yBwnE z7>flE0knr(XMUUs!1##>akI%GMBVoRf;ZjmLWgDq_y?;e55gNJ_wZoViGC+Pb9$vb z6r@DfF~@f5PVos9k!5S87$Q=y+<6ppdiJ!>c)~8;uE$pj*@sv-LtUzlx7PsDZT@UX zCYYucBubTak9KL2`bk-vBMDHb`o=+`5KyY|20y<8?6T1MM`+*Zii0SmianI~k8_xbhB1kBrPQ=tjwUa*S zx1GeI(VHclfCMuf?WZ1;fD_AlX1J%N0gK~s{df4eHV((v7bOD+Xoj#n*BcWck z-}RsjFj}YEX3V2+_)+{X;QbH2NdBuhq!O9I!%Pk|XFn#Oh%2P~aEpX{A~c-L+4mOh ze!i^u)qKP`fg}sswuaEAxlM)%l53o{NhNAR&EL`Pjq3pWobkGSvzATY2 zrP@H{%zsf-@7V!6ocsyZuBtC-u((yz7h(=_zp^B3z5E?ahpKr42+WaxBhnRpb00LF zwFPaQ0C3yNW|@{YIywd#Z;|}EmLY>> zV{&X`Z#7_V_)I!j-Igm>+nualH5EojZ#%)V%6`rGL{GBP=F^Xu$)B;jU5gTzI--S) z6Qz}}q@f+tz&m<2;(JyaGML)lurtn=0EfYdpU78ccyCdqL*K%h7sAK7NCT9ls)DJy z9^=we?}&iHBJ)Lj>VT`|?IVXjIETsr#C0dqRVH_3^;GC;tfw@#@ExiKO@M?!=&9E( zS?fd)He>Bm;Yp#+fCD2=M~?jK10WPKfmoWJZ%h{-NfsQ=sYZD>w4rZkOCs40HqGAR zDglOW!K$+ZV$Eecm#A?!SDmK;)j%dh05hM~pg@ofZuPp7FnT7t@$Ai7s2mdj&!PLF znFERxrOArsd@m5WZsBt-{M#!(Ga(=r5v!HDPlA~*=c`mru^gw2)F|KNlKG2`F7%T1 zq+19Y15NdUkppA*{Q9vgG3pq(Dbb4vD-qNs9uF4|b&ms5M$%4QTn0orH_}v8@j0KQ z48>a)2UsH{_h57ii&ZoBUCs6pU0nSb&4B6S!`oUJW6o&Q``N*v%d#|2BG?W=8py;u zBGey9Kk6tXd8mr`E+M|lYA5nBYJ8S5REidhu`-FtyF=thCsiUlXt9iVb<-r8vZL|BIy0GVp!0 z0&wEk3fJ$|NJHuYVXHtm3@p)P(!yk(w*)$yc1hp$bQ7qabWb{RSe#cs9x}e$3t7dk^HrS2(CV^|uiVJ5pDO z8bb?e&^`FWYhX7~brP8l;(yl?fatWRR9MEC&}V&>3S3DwIB{GLtv;iPWQZm`tCqx4 zq(@kNO1Z7^I7;D0~wv2qmaSPA37%{lFsnlrvt3J1d(Ro?-6{)YEUZSPryylM}$u;>#<1);Z3 zqv0z!Wr>BXuNm*28r~SMXQY7*8ogl+*JDPxM!EPHv*c#qJwkM6)(8rY(u)ht!_%WdUacN z69}5Mteb-+qmzVhQK%D3&lcnDnRdo);O!Jx<>7Bjxor3c_Ys>9&CE|6_&^rr)7|t` za0O8Z%<;};hvDg7f<39^;sHE2z-{Q&d|DWo128GsxsEOEc;clkXre^9y+(y_FAO>p{^SOdTK? zA8m-ta2{7GZ(yL1d4okzR{r&#lKGN%=+vVo&5$>x;+^6=^zU9;?1jW?kDH6kF?oy1Fi4b+6(=HPS9xR~aUHLeN z+5uDjw16^YPlwU{;1J=D8-NR!Y~>!(JhW8`DFfW-YEl`#b}g3l`e0fk&%S|(f~ zoxn73TWJJ~(Z*EC#$GBNfYD6{!4lAEmzbM@iZgCNMZ=UdN?$k}s9n=WC)f>v<>;6q z7)d07FiDvwPvVs5CiyNx=>DAP9}9a*B=u|I&owPX*E(sIBe-MPVBfF<`P~Y{aL7!m zOrvfhR1ZI1(b_u*hSMFp&g4AHeDvF_>W;B==g!p?=cCsOZ+yJLj-CZZKv1pnizj#$>7KZnG zM^+3LcIO)hD7IvCn7{LWaPB1C?)({b44~CB3ipK%{=SwwtP}6hN&lI944X?wqXpCy zoIBS;I`a;I^*9MDLFS5Xxd@0^4ia<$a%a(#!ef%i{K%n~GJ{ZgbHg^pCbmz{H#1z& zElPTxEymqi+cT|z9TXzHHMrZL z0`hV?I#*&kNgfmwUSp6qn$`o%EmUk(E{3@|XFvlxY5-Z)8I_zdAMOeq&s6h;o0nig zCE_6R2N66v`GNSaX^!LIJ*ff(XYR`*C+nCAmb5isD`NVL-U673#%FImDQ-xWu1&01 zc7wUjeP|trU>W2T@p7yK_^Mm%yjN)6QzM^Dedy7R`6P1$*dTZh7yu8mQGgb^4O_L0Ae8 zg9&`s@qX^A2Yd>M1W_Zn(p-$7ErrZ1%Wb-hZu)nt;qKbpN7Cm<&+18B&oow04PM+i$v429sFjRt2yD>|jnUjcRCQq1O3X^dVB#D`MtrP| zk}|ydrm5|SGGk1oj@+<9PIo$xt<(uoUn)5D{LiW0%zIIv4Qd`oymg2?`*3AD@U~NQ zRpYzSCd%f9en#NyTAg`rB*Et8`aa0szf_!6HDd7S4gadIj_7T{7O&0bjM0eZW#`v5 zW{h|Ly{K+Ks~J$EeZArQbV*j5x|Nuo_5o+!hUQb}ahHQ^7l+%hNEuA54 z|5&YBlRhn@`{2*D>toR!2XTWU6{$_0P4e#5sicVy0ZoXS?#u43Z@pWeTyB_=Z9P5w z;o*DimjcUG|Kgtx%l5a*uU>R}pmngr%8j>Gl0Is1XxgRjvC}H7<^@&z>}5<%^oNUO zoY6dcn`;khZM-KfJT!<`si>WLXfb!TmRnm@(XwKovEF|E?s(m3h`n9`$2tGRk!=?j+phoE zWA<)qck*&hPK+3%R@r{{mfKGk-hn;#-28NUif6{!oU5zgj>K*2zu&X6ep|!(mtPU{ zZM?~UwyLVSqImO2NaW{d4W-XkOvF@+_Z|MRaaHXz`f&>52V83h{Ei)K;nryD=hKfZY_#J%yN>fG0k=cK!) zb#E{DKX=}oCIrCPs;h6Jegxr%hkq%rG*{_wKG>3Qe{UBmT|0H>@;zhMuCU>dcb9G@ zSHJZc`G}BaZ|(ezx3{+?UVVQ;EZn&~BM_rO$v^i{W=Ghqx-xLgeS9l2EG}U{-7L$h z(#G-Cgs!jZ%mUz z?T%YNxfO7vB8%SiInR1F;LYWL@i^?Nqvhb~#?LD+e()UcH<{Hvs2B%-(60OSEP3i$ z{7}Pe$b*jY>9dc$w8ms)nh)6yb6Q+^d1tPVJ|`4N7#oG#p7SrOohaWw?fu~QIqs8H z{SVv5IS&rLwzuci-D&=Bpr%&q>^V-oyLR3aQ>m6}k@%ILwwL?{E?pa#dhP3e=3mNq zmH+BF+scg=ljDU^)epuD_QZa^J`|`?6BM#O}ZiF+QpA64ldm5~>? z;(j&nTfvBXb@j;IZSBG_8P^jsuB^E;4W6@27^G9GXfZX&Mdp~qm<#Qv{&&4! z4}(LRszSBymP}oktunG0h^l>cmo(}1HG4H#O8;+;K~GcNaq-7hjj(ASs_H@N>{^To zIZD*oH6wb~R;If+_~f*ktsVAj#Ar;scQLW%!J+eqA*bU__YZqDHa~8551eTZXgRX{ zWb|y%+K~WQhwhCI=ex7aRot~3f5JQF1O@W)@~ZFDK^m`FY?j~mSbjsSIX7`f1;4z1 zG_wA~>gsl4I~RK6Gf%#~Be>%JCEH~$hrcZ+{A-VPP-j&{Uqmd-k*=?P#YS!CQs=H@ zTv-d*T=OmGw!0j)b$-qZ@O(6*!CQBo-aqbFR-IS$*i)k(bYq3(Dy}+wSo+<>& z9n32l7>P4soqRp|zT;HIcJeQB(7&@Y!Bgj4MuUC@^U53E1?{Zo39?3re0XP^{MK8l~J|hu@SGj2ic>Z+ZN1+a=%9 z{ZHGQ+S9yz&dk`3aBVc-9;8$BY*};MB$#}Rtl$E|1SRGTkex5=b2h(hgLsaizYW4ehUvXm2Q* zu9ZF^^PE~8WKiT1?{?t!Oru%j<55q|y1$mxX^l0RHy+weF^Z?6OF7M+=RztAT4sW< zJo%uErk!(vuXsVOqwD&sp{h-&0BmV%V24dWY4dDdwEUZf_tz|nAJ1H>jT+0_drSb@ zMohaoJItC!2Ed4vWquh5Mnr?u!&d$*RA{@hr|R6Nmc6XMc8hqnMrTyta~h`{Exdhh zsxD}zJ%+C*TRl{HKK0Hsjd&{kg@*mOwn0*5|JSVN?+!h|wXYigo2`ms$M2EGTWrdm z-`FZvY=kx~58Sn~dSBqK;;DS!dNRtithuVTnH{mR;T+|1 z?QmXzm#;DD(PgW z{j@i&*XGlsL3oQa z^x?11cQ2?XPa%8)^(5;5ZOqE;l)yXHVPNQx4L_V>`aghZP9~Iz764!WAK-=$;Mxzo z$t!DdbfM8JlkCek7rJuT(d1sH_^HVYr;c?h6O;=1PP7|mPqiP*g5M+BWrvCD{@(lV zpQq#*g|{S`vJG1ug#f-ztO4d}HIfBU#ik1qoCwThj2=4Y!CLKmC%Z~{c{&$Mnuv+d zEn&mQ(uVj81}Suj!KK0_G3ZTdwZN6wBL28W^?K$sb9K!ucEWlltck!uMW_$Ee!!;8 z(tu(7#e>75j;W3}0^{m+2D==Bb-qTp>KiJqc5K8>tW$gmx<)fx7XHTjyscFC`)R|a zS!#2j{;3yrX%n97)U_q=Qu8o8Cn zv6;1*ghwOockZTh!{`AIqeYUJzn-m((um70yyIFnk$#_Se+#@DKWTWS2mdkgS=%p# z2VabSAY&PiY7KY2rf)o5hqnw0f8V`I>w7VKPgHPl$S)G~_08D}zmDE{Z@*mkCA4kA zc%56RF!NdY`0>)o|Co)XicBx@XRL_shDnkLa{%E0g5;;NdbIeBNriw5HGoeWh|vR=;Q zMY&C}c>q9+1^})r9xw-%0_y<)(@t-+@km2bsfL8>u9{up_La25_aY1VQO%5r(Nq2m z+d!a4AI!uieDwA}A}!302#US&6~QchJs<)TDPiypiZ{k`zW877?@ODaBp!LK8ekc~ zOm5MkfEksPhzKBH5#nH@Q0EllB5Z;d><~sKA3Pv#90YbOd`m0rkq&ZCw&)MBI)0hS zK2o}|RRBh=OTnw8zOh1qcgEGu69zrEhv3YIdl6Ia zI@QHcYan4+KxzY-i7=q!-05S?E(&X!Om-`nTMz>?$Pldkf0pW` zC#qI~P9V(5vH&?2r7DC+WE2p+{NSm5q{A;po^2WP-evdX83cHb@cdCYVQqdUdAX z!(+K0j+u3)dg>&rvdhj-hdYz8!_M9yQT|lQJq4TX=p1fJsJmxA_RttQui3o~o zI3WP->hXml(~MijrtjV*hS)P}Gfw|CO82MYCFOI`@$-fe83SV?=Fvb**pN{8h~X<0 z$roqc6CFXRjPm4e;N>7+r9DqQWa4t)4`{E1xE6#cW+=^8TvjbJc|y=m@01jnNkf)E z$}3i{$db(Ka>%tA z@WZzNFjO=r-QdB zHYcJ?lIZl6Js-J?Amq-mv@}MMbHd71OFq+zDELy8SBVq;o-%WB2!FK%=6R*`g(Jp; zhO#P`LWH+X7Rr^p0tSaCLdX@Blcq#++w>>#@HHVxUOjDOaUq$Qdz&oS(n&CGlZC>R3t z4jA5UGOl1E(#=B}%MX-8ppI9zGL?Ea2(sw;gHehk(k(|2fq;ID_RUe9?Yx@vbvLDP z@s4GHZK$D0Kry%8R}FeNQ2E+YC;$fn&Zm_*$f;Ct1y353l;(~_hN)CsXR6Ecqw>ca z8a_a6p{UEDFiMwj^_O{Qpl_Fs%9!~*$5}yk)o}={^ClbLM7 zf?%z-mQ^bKMMxP^8gA;)#Wu#R^8+V7>skLvO6OC5tqTqF!Lr&KS0f;%Dn>#!nZEs? z!o|l+V26NJ&T+NErl%9NHb|_GzL*b%VN1EofX+me z`qQKB_uZ^Pp7c93IOBu*cWZ=k5_ri zAv4a^E`}cGZC5nb=1L)2?J9pcIe^fj^e!ZVvR(#L6{|g4II|GIut|EII6j3|n%(=6 zF*EbJSY4W{MFixTzi{Y#Q8}5jivv<(;7}pen^$qHA8@x__92P9R8 zS{JSV-K~g2V{ldAr*o#-aA;;M6TOR0GpvLsCyqkCwNh$dl7Ph1=idog+YyA2J&X23 zToaN9@%A!B@m!T$*B<=hbp0CI`pio4@`DtX%kY`Piz6sFNk^fX*f%=a|? zOXGK56KBspjKD^dZo9Z2$Xik?TDPsC8B>s3V|E;bA10FzOE_tFpy}yCxY+rMTvRVI zZVrRo%5to>pr!G5K}g>!m(y#3o%8yW7P(I@+hx+1;dsrF`?9mbLZ!7GZD!afOMuJ%WIpLmTfHPX!$IlY4IB!=T3tNHtFl+kRJZA6Fe!-3!e;@ zUgJY7#f>2VT7$egJp&1EG&K!sK(sYKMwl+rKbbPEM6Z5dEh;6}SM5ORxS6A#OhLQ# zNDXfGf6WpS?oMqO9xfYi7qjKBrZuirp|v9V3kDe=gd#>B>qjV!+ZR7R;g1PD-Yi3a z9uP^@`9*GV(^Zl26&BeSqb!(ClA+7tL`^*)9QT)jy9{J>@T2PpdQM)l@aE6e1(4aV z1Hd-4x)LkX#21l{fB?N2_=QV|Fuo-2YKjXnsN^exgxD;yHkY0n3oj3DnZn`286oXU znW^~*0z+GvSkgx5j?W$mq%knF@CWZt(-#Ji{k)7xrmEYML~obC`^vhMELg@LcOzdy z`e9)Jm`HRxu3NrGGD^JB^#gifK&6Lw{^zl@^QB}~!6wd#-7zMQD?*@K#{AiMdm37V z*-MU#@|;1~Th+&_XRu$ngL}`I6O&kcH69G$Gq6LiJYpu|Vx=M|=C^qGCpaR$nesPJ zLN)ia($bb+zr-Q&h5|cD_1aqGDA?(2*x9 z>^rI#lE)v+5gjWB_ziUtWyrc>wg`C~=_rGPqpEFDX+_!x2tY`R**l43;^SaJLzR6~ zP)7*5iC4VGSx~fi+30a}oFw1{`@ap_y_BAitYpIhsZW%0L6wmF8;;OcM7G? zZZpUPM3Y3tZ#`MFQL@!MrkQ|N4%$sH2mUO_p=>34G0@;a;(d!Gwx^(D?)hJLnNTSt zXC@~L4QuO}a#mM>Fk*;`0Z!I@N-{}4l_4w)yDEtPC5+*tH5j353x}cH;`a@5TT!=`(0X$=wd|r!%E9J(BJf31@Vm zLH?z7l4uoX68y*Yx4ng6tOFzwVyR=a(y4z$1m#P}=n>eUc8Of)yPJxWr=M&Iym*%+ z*5M+W-m9pUl|Z0fpjpk;SXvvhTlxxsIuf8fHmkkHclZ$Tq&uXp?pigIR87dV+K?(m z)F3>tr|+g5Uw$$PwP;<=z3cT1*(B;$ZpFpP2F=t z96VML%V-0P@OEq^d*)nGGzOXZ5e~evp~cmDK)XX`5i4b8V^(+%+|+I9fl0C-NdAcxA6sy;lqbAKq5}3< z=eaPTXs_V>w*vow~%V^Cw*NvUKkXH6HnK28*A9-t=FSq9R68c>$CVkb2{$`}k3l z8$IY*y>N&!JhksWTSA+h^Ql@g7o2wGw%9^4a5}X+P8$7QXx@N*-qMn*g+it0z`hKy zeA9|k4pD*dLS?X!#qwwluqRdZX<1%!_O2(T+7lWGUCrIE7xcVvB2wMUE4(l0GSS8fdE7GUB>vLmDSq zuc4#KAJ980%#xZ_f)76CLFc^YbC_}(+^T8LJ$?u<*^QB)kyHhIi|7+V)=a1@YJ2kvs1gqGg-JEtISR58qWm*vf`^1r4XY_$CKR8>aA> zJ!AV62M~=)RzZE)w3@){v#==Eu)9H};N;a~m1zck4fb{_+63*C1L}5Dy-vT40 ze)ddM+4R0nH2y1wlbLLwfgsa9|5n3}Z$qfNIxt2Yx%2frCbDxa`+p>&{=&`r- z6u_CM-Q`jr4!xl*xSE!cDe|A7HTp?%2<4!5xG>-YE|Y@b2DczLxQrLC&0Se9(m9Rk zKjpdK6E>&Flnvy2-~_wBFa94OHeJVlh&T)E6Bc{*>UX+eAYmF8n^n4fC2==t>EYm3 zlkxBQV~JLkUnk}z;Oc-jxg=6?dQnvL$ikm=om=kCJ-m_xdxUqwk#F|2?oIV?a1rjB|27sAvX-^ zO2NL^*MwvdD-ZJ!@hiHYM`FO$B5m@ypY;W7FSObW+@iG%>wDF>bC>UpZ=fM}pYEG! zLZ4FEMD)r0L<6z#Xc@Z*tnyrG;>ndO3;QddiV{Sbco_G`h?v){?_!s*mOstk{k8lR z!vOMK!TS1(WV5<{FV;D|?SX7Py>paa_p~0e8oj*^ewk zzA=?m=bRZQh-GO}ON3;C$mPj8uUcCJ7POgX49M7wcc+Xq%L2ytd!lchQ-7Ng#F(4g ziMrS39A2(3siGyey?u<7+FSXAY(uI`!L$fhp0@_v{ldA5z$tpTF5bVtenl7jqLg|G zD{-4H>^IndSLFVccdr08Dk@#ZFA$f$n1$$%a z7L$Ns%_e> zk-H_l)t=0oI|hL9#Qy-~qu((bD^uIT2So+q_tF<#KcDNcg!2ND|2DqX*$X(P$3a`iitHI#?0^_2I}69gGio>dXE65H z*L0+9!}LRKMkd?d2=L*n>l^NJO1!yjg6*|AG}Dj0@N|fOrH(N_rOfd(Ln9zp?zF6H zg&*82W1Koa<9W{LM1MXKV>{mdH@N?1IE=pFdzHOYXJ;np`9j04;Q8%5yxgPc-sB~w zhnH<^(^RZYzu_s3kA@{I%Bo2`{NgxXfWMG%|7sNDngLx$R|kwmTqw{jPQSN*tkip% zt8drlDE(1BU%`Rv+xx)&Cv(z@As|jp<6HMXcf+x48d)20=Tx>C7s5=>nXFH~(PQfd z!d@eP<9;81Is1T0wuOk?u3YCv|IK*!>&I5cEWCTq{MCNOy$o#$rA)0<%9V>>yMG`5 z|25<_lXIKxd(lrL-PPqgV&SoK?YKdeXCv7${o*Y;Xg7+~kG$7jup&{bj6G zQH`~LfKhSod`*p+n51S-PRgxf?iYocMqh?Hn&H-CWeG1=yhcPdhCLNR;v6*F`vAI# zB^HySsY~rUK4;Ywg19`z8Eul^IcXY2r}wK{R|!j%)xGX=SUELKIN7EwdzB0?%3=268+-pJmmhs)ySE0^z9=Z0=awa9to z*4Cz7tbCI0So@Gr?#CJ?^Vm6$Ad#2mEbYFqdB3id_ETBu{V{6>=OMED5@#OY5&%)_ zmaG0~Sn9PgCaW`p=qb`x3INLW{W|x{y7pK7`fPQW2&rcv-M&1{Z=@l>(Pp7#)N@R5 zr(s}&x|q9l>ENoL)nrFyfh~KD=Zr7s^=7_DSw4n3hRFVazBS|<it*eWyT!pb%cXF_icYV(^f_?dm}SWFFu;QQ400A&2O#p{k&%5HIuL+04SLWfEa)<2NP8v`;`3q zy)EA@pPc^o+W29~c1zTrvdVXQFaxxH%V#ZX3gP9#B~Ma0%AQ87yInugG@&&B7aG_w>EqMPD(6zDb zxeYpyl)&&&EWxbGwNl_93K)^Zi-`F0WtBy>qKcE65dE;Nk9ZRnd~e<0pD+hXev2*A z{%S)LP1^9)8w<_nY<(0k8v~zDh%N-*e1j~Tw)>DzSOONcfz7L4#7N#wW*%T^_75`n zVm00dI?_$ROHkECC;@3_Lo;`y)xU+r)5l)YA6D8?*|jcwY{`X=H`&kYC+9iM za+ufZjv5ppVDPWXS@2}&O{z__G`q3)S8Tk7VnZb-f{X>|bpnxHM77T6tP=B zz&{MU+49uff>~)s1qRe=)A~2lTN`02A##Ljg0P1Uo}vMRNj9koz+_y=6k|gD9;(Nz zz=QKD4@b@ z&qQIZ``kJZVq@Cfi0)(-t7ZI5s61u>I^W}Hko}ixO?(o{tu892rV#*N<|P%i6AD)P@asy7rUKO; zKju0SpIQ(r)(yZxMZ=`!)yux*K?UU10lc<~c`-RZ`RM(g(}G6Wyb z_Z0a00p<`3a zPk;!;p@hE-*qfMzzJ3RXqa7`tm{Ne(5PZ|wJw?g=OvMwZ+R&0`5?llF>K1wyG7rFMUCbO$12o!FD@x(p(GVO5Kx?7U+?Sk-kLj=BEeGC%bhe3^G}`B z1PCDT>@}`!*|ecM34%qL3iYe;qCG;wAfgKm&8xv->DY6jZ8n!$?dK@1?!}9&1|uK` zF!o9j=bu5U->P)i7 zu7lxwkxBZ~AbqpQhvsfMS~{6prX+r}5L^@rP6~@Qte0?mjk9XG#Lw40pEW_sT8iEf zCR)o@CsH_U*&QsF<|*?;6XSEf28{MX^fgupKtn;3%y0oT!*Un<3NbJ)$JK~#3%7c>~LWL(Q`k3oxE zHzBsX+MMU(F3XtSO+^4|-rB+p)@p8^2hxbSf`T{8DOsPl5v3i`doIjUi4xv(t(8Cd z6a1x}W%=Mhg(TJ}@t=VPKR76J;;2U6BBuuUv*Ck-jJIPbUfQcKi9@?XAuRO8cqe#4a<1 z@2GG34{XQhm&_#Qja9UnY%$>U!cm^;4DiHN5;!w%-9TLE9r4nK?r+oa(w?%xNYCw! zS&T9wLeWZH(nrpLlr?HK<{attpyyqk<%k7FypLC%lK(~Z%Ury6d_rfdtk%n!-p7Ak z24nEJUW1?g1sgLI+*Ne(k|tgs(9jDAU`=(IBPTc?M;j!s$0}<6_lVl4}CWVwx$k% z<;41gP%>y40g$1I^j8E5S^3cdZ5;jK!^$K{g?WMiMwxG;_aE9iD{(bI^t>gcsQk~y z-j27$6ICd1UOK}FM&4xJVLkb1A0UyF)h<1bK*3-hh;0@FqRXw~PqR`_|BpS+CnD{Gg9xHREmlf=RT=IL;CC^(uH1t(36Kp60 zF`1jaXG+*kr9_BgQuA$U!}38Ale{Eq(@%iZ2a)8g)N|kS=kLIJ=6_~8ea~jB2h}B2 zg>C9)Z{dhpJzXV2UTs@}^{UT6~z0WKnNa_;3e%it z*@OUO8G-0cqI=KN>YC^C6)<+w0`7r0(0eHGt!pxVDl*pW1ql$JcUC1?N?|?5xoX5; zXnCv>Z^aKWNwRe0=xxaY)wCU_#!kc3vuY_ecH;@COw`TQBB3J~KpYt`5NKf1C|f+- zku*!Kut(%8!M+uxFaGKg)f>wj_44vMyy&gW?2Z7%O4=z2#g($a!*dAb4E!GV1|Cxx znwbTF=4Yxa-&RMUUAf_`u=J-WFNynZ8$#I3V<{Po)Hs6wD+!)(@s{PsAiVVx_44*| z<*f(GOK~vHaCqMUg5G?v5P0cJUJ(jOb=}VUmsR|Bxd;prLSViqe`l#rXm9SfQl)>* zv$@Sx(oMdFRpv$z=h7r0+^H|{nuPPdZB0Ne^F`2!d9`dW5kWL0B-GnZ)~mLM@jqwx z<%doe93H{Jq7fAGkuNF%GOVI_?>f=zzf!_3 zrPW!cQ-~~D_^f3JBtH{=D^xv4e!sbwR{prP^4pcWV*)IEuo}=(AM>D8=%wrk`Q$}8CcZN9mzm@V3SZN zteSxkiUst~xfG(K`TM8>7MXG=x&!J43~qOromxDl)>EU$ z97B!oWng{_A)+9Ny|Lv;dUqIu@M6=#h?P4t=?E*M`%c13x=XaYH3~sS(585_uM&S*L`*_AL z0#39D!~^$uJuFK;WWk87gTChkSU~W^CLAi>BsNA{t~0Hnjo#2YY63Ud{0xWD-_KO z=IH)!_3$67<@C$pvNeWPU+nuLwc@_Jef^*=8DSfhjSakOilS8^>0u#a6~Ld0>J^W# zoyg%Gf-D%EY70IcLjwC4reNp+R%xlQd)e3xmP5_F@PeDwAe#bKN>0T}A*?Lw{G{Y5 zW&Am0*w_?*V?}BJ9*bCd-;MOlUrM2!chbuba;q8dqN!<_)Rp2wUSegKOvx0ZJKp?w zQIz`xP2u7>4|nIQiV>P%l-w*jbCsZO*2dS2sj@z5EH&}3&YZMN0{6@*bMh4oXbalq zu<^sb;KF9m`p@%h^im~}h;0NWdnp~96qtA2YC6i(f~fB@f_uiECuz#~jM=NgqM#bg zq%=6($*Ub7rw@4HMp*@5B(x%gS+P*8ezJ}Q@f&cWz{-iJ=@$!!10ooi4VPqgQFX1O zI($T1#hly4%JtQgA`rj|+vj00m>Smu%gJd#d46f3tO`=ftg4zSoJghl2nxRo_qXb^ z4=BR+Sg(oI7Th~;X@pkmc=C6Q9Vpz{fVSLB@9L82c~ERgt_m)1W$4K&-A=Np#q|nh zf<2pv__i`;g#^ZJg!dcYba6LX5yJ4KWuCVO@pt4bf{G=47hm$Mv0x#x{dt)b?482fDGOjKLtkNjhd9o z69V&J>*wM`g1M)z?X*iW%3s}DHjuvow8Mo?v{3DikhZ1|m=a7O{D<+4nX9?iS+o>s zYU6CRvBh=soLK-KvC|(~BdX8Z&R9I%vXt)>(ND^kc){2M6fn{q>JOGT&7`X3?oe`< z4yLjTf^>!`WCI}Oxr{+v5C2YkdmiBvxnk(Ygg;0cZ9Xet@YOd5qsRk0bdt?7eNJa? zcQ1M$o(CEkIK|0Gr#EQXOygs%xe;|0-v;&K2hrkM`8~=8OL+?(*7YV62dph0#ZX z>IWI_+azRJ13f`-!AbLg>_Fsr2#wI_z+5@-Kx?pDAJ@akb15jC1qhZZ?W14`f;H zR^#m$pwSf!E6JZN8%Gap0paEgAgG6jF>}!7lkcVMj-IgPIa5GYR0&n~JRPV015TN% zL06j=&#meQ+#kFI)=iZ)VvBhzCCw(Xc@mqTJactM^J*Jv5+@-NKOpIH&I+TbE-B&9 zmYt)xoa=zbQz}Un&Oe=)2jAy_m5WG~2`COwQ)Dd1Y>s?E+WUfkEexd~qqGI$W)j6a zEy7N^fbdY~z3a*V9E#P*g``(jTtyQ6Y|B8zTl$URXQSGK+Oo4rZp_H1eS;PtM#xET zBc*1@sxa*>hrJG47BMf~;DZZe!AxquUBTU}b_HcciA$@?JkE~FTviMws29AECMY}U zH+h5ExzyPXd3dn0p!Aspp{yiiQk@`aagsI$`v#HIPX_qeN#oEIc&v;Onh7UaEO$HV zi}b54kgRs;Z<)Rx-6fJX)Zj>4$NW-3K;ujf(__@WctpWopvvyb1L-Mr*qhugf21b| zo1W`kO3R_yavVCjj9q zX9USw<6qBP<27$e*Y#ejEpOSfb~ky%s?s8aWLi{k`ugZjzeFF~e2_wu^|N;1Dw*&# z0*8R`b?Q{LzBF9(Nqutd8C1}(RVu-M2lY22-*RBjWd-D@ZJx05K4av^KT*`%kDPqJ zGkF7W%#^~-<^-9-g5?BIrseIY2p%nB#@Dr9dtDQfpwvi$@yO4AU-~#EoI1Vm`h~sC z%Ly1~-GT;3?(oCrgTf96Qk*j7P=(ug(NCw%bK+j71pcpAhcWR|gK;T5+8y~eDq<<6 zBD`-$NS%CtW_N{z2v?K}NB_fZ_dzCJys!j$Kgv~O{)cA-2jBYZ&%3V21di8eglC?g zysBqPyl=Y+2HnXF*;R?#{;ADN0D~|VA3VSr-4S12zi@e9MAG`_oN?0M3XN$BKHe#| z4$JR3d%fa{%3=0>;lIC)t%CRbUf-xt;~O+U9LTWuFqGrG>&|GawVZc+Hu9&e`*va(Ek!_bOXllrs)&fYcu?8d>*Txj9v@ zSy7{UA}1ncdttV1_4AgRLM(ip$Biu5TpI~K4uSZOwSq? zFWse=>AOVl(oAnE!g-*}Hj^#Ir#l6bIgh!j9o#Tq5GzH|&Gk zeN5J(d)Mr3Z#W0mjfZ8}+SyHZtQj)OT|4s=t+jIJ95b}HQqBiW*7!&p44$#L_{krw z(NJ^nY4omq@Ob1`t3UdeYYz==2}O;abMmu z{`KF7mNlUZteF$qTkDs1akDRz3c0i*{Qm>oxLql@ZfhQ3Vz*hhmHm2?QJ5{9r_2bR zgrQP&AL1FO1q;J!G&-Lsd2RBw^^ArZhPwNrc)fYf{zhZYtX<-xu(MNh)y-Y!6ud*< z3FMtM^Sk!D(_+?-p5~R}@Xl~3vo1%b)^AoTT5U8q%rNWA@@owBT<5C+kwZes3*AR1 z2j;=cpS&j`@BK7)o-~^sar<=g#CB2s$=00zBS`zc>dxB+&BAKOZ`JjF6VH4^YZ^YC z=&sDzU4lU+)K!!R_H&wl`^i^mHd#|X=N6PhZ{-l`kh zsykP|b^d*L!*Y{Npz4Az{c>bG$!GZG;%vi7gvqyJ)VtY-EN@WtXHMrTYPNn98}1zj zPB7%HllC!U-wxIy`dDACtr_+fPL^+oRjsy-+Dslf4(n{yi&6cCtxk95G?Etd{A=oN zsye#=e&lFEFR@HBdDm6-r>@;-srYm4Zr{p(fLeQTw>w#{{{z@-+|%;zESbmry%zN| z?l7;&_2)Td`Nj2xx;#QKv*G-AWR4xjwtxa-3zGZBy1bdY;nkGwbls<#T|aL#wOZaM z8xuY(TC>khLmc%hA2DPn)Yfm?`Ul}f9-X(Y7~b!{k9Z03pWic9KM-$h>wKT$EM;HS zd=&T0F-&?R_kgBz*imw0;hXoaVC|+zn6vYn&dCQI4;#EAH*Q1(SZa6~N;fvv2kU2XVH$0O8yPCjefaB(L)Bxq@^+` zz^@`Q03MzibN_W38{gjIqc=G-c2J@7lW3ti8Nv+E8sQJjl!x^6ELd+CCLTjrq1BeH#ol|p0i ze)Cp+d`6y+-e}o|ccJ{J3dcG+W<2Yu^sCmRg%527mbBL{ z*ES2L_|)1Aw<%1#J zXsS%|UW{sY z&?s4UTA?iC&fg^@cwhFKh)wJ$w_^`0KA+mu!u~^5_BD;%zI$Ivf=Qj;w(_^(*ydSPz) zirlfPvvXa|0r)Xc7&Js_69~`x?1@N)v47U1%$lT0vs=js#=_Mpk3Wx#eE{r4xwzH$ zPM3(R*RSjAV*2N>aJ)@rcWNB@G2ph+Dz4}UN2A&( zqNC?jjmc;apUehAP+X3f2jj9twO@>-=Clx&$S^txs_kEZ__fWf0#%p18%E>Kx5lHG zC-N)+hetIJB8no7AP&%S#$pF}mlR=p9VA@Ea3_=V>EcYXL0Mc=KB;iF6`g z0kb4n9d@VcaTvtV)jJ4vb?md1K`QmTBz#RySuGsC#PDo4ycm1Mlb_Pnb3;3{T^;*8lcL8;uvsK4s_1(WkHc?#vLph zjE#j*PG~9Ha`!9$SbZ&S%U?T|%nf49jND*iP=Y2?_88W0Lt-MfGsFTwVFl`X}2iXsz6szr3=J#m)2 z@5$llNOZu8IAe6)gSQo#&`A2;CovDeW?Zu$e@l}9LSC0Coh_!9ZFi|-#huRbB36NJ zm7UG?bkiL#)D1KDy}by|YLu$nLIu(A0tKdPDs$nkeS`Uc_xdN*HX!vGJS4&2S9nLO znt7R^HAFED6bqARwK4Irdqbpl6ev?b2)-*6Bdz4D9+P?$JX!(@lot7@@)=a;>moXm zm8@vUaS?8`b=xf!4ItTAqjTU# zu%QThPG!eyc*;9{FOvXC|;IKbV>Wjt;}#-LGMU% zwasA>FNiexz3d!B_eFX1hb8SeCER{ z;%AHwyN(w?=rE691Ai#yeNxi<%Iw9D%->m9y2yJJ{;d?KHdsZfO=XURRNabN08VuW zBB*EhlH8w4A;_Fx0Vkc=C1=m!MXy;m)HJKk>cu5V?dnL#l`Kb{^MtBPtmEeuvVkuE zWlOU$!_OqS(GvO~G6n=wd=%DL+cI(aDUIGc5er8RLMR>>n2v@{{GI{x`|?lxbFnyi zRW*SsPrI*-{s@ARvTEM{!Y0BEr}a`C17#_sWI1o7`ha3EnvG3cq3-6Vh(?jw#RVEr z-LWkz1Et6lf<%b(ST_B{FG74{9uKRHJgT9DNRFAA55UW$-` zs1zAhS(td?0>*asAbj-lQMvaKC>$adl)RLryXCECH#aDEnSanGcaV5$6r@Pj`nNw9 zzyBU{>Qcp=wkC&$VrM3#EeH{*schPXq^w6fr;Msv)l(QUUf!Bjo^VURY58{1kuZeO(dPeyhT2m9@S5+?T#`!Q?$lTg5UCFM_vfre?hO?n;lHH_w2ngYPDwws+tt z0#iZ`4Ne^Q5@MCK!blqNBY1nP8xjSb!r14>Z#GMN&Pfn*jL?6nA7sG4#lhsTmyc^X zyx6&#kDX@2NgFm?b3v%gd4fTv;>#^uU73|A-pcBCh&QDS=<7#$49J4R?gN)55(}-@ z7VF@lk4#Y$sR>skV=(A{uJht3=b&fSXuVkrZX16KM{g!aH1zg(Coe*nS<-;lF3iyv zk!J<9F=cri5kUCN)AuPW4wAmRFW1Ei+~xK2T5M9ns1AK z{DKUtU|5cl2g%&Zz}-H>J{B6vI_hwN#$`n;G3xJ_3wSXR}ZT{PRNr0oIziY#~GhTRwrmTrj z**Z_e89O7lolI8MqYof)=JR+<*|6v5?^K5|NSZ0A9!c&o&h`7;8?7*Ey!_NS`(3vj znjuc%i5Eb0Kz*cI_yZ!Pm>Xd;>TIr7|q_{fvwB=%4;P(nt=MbtDIidQH%Vdqw**KpwM zR;e_rL6Hm>2@O701aDRk-$^}IddjA`9=nMkLI!#>C|UzYtenjRxH@?*?aPMc;^G9A z{vDh(P2pJrz+4l<=Fr#trcyBGPomskvmE{f>~Ct~~x$h61E-Ako6~)X4m1 z3#8OTld*BK?y7)QPIAc-#0+u-gc)HrgeXLXB;G1AJ8RK0M#~-48hZ>0V$WpHCIJy| zS)-~zn8_A;xF(xfGy!<8Qj$Y9%ZRlJl4a)o4VQ6!dMQRX#_9Zs~|*%aL-cmnOX51`J8e# zF9|Pp@y~SdwpdvoZugBCM}0*B9pzwo{Y$F7@Lwl3@Ldw*8t*2- zl!s46MN)=fTq5hYqnu(R?c=M_9yF;0?`T8tNd~+12O)k*7IU}E!YY0;y-q*jXO!@) zAENq5K+`)gu%y!Kk1KAOC_lsg^nYdFo$OhG85UB{cA|>jIfl_`#$n1YM<=0zkXdK@ zOeBN^js-w(sheqb>z8#96V$t?^)5AUs-XyMlFbJzzW)^hOw#aK?Lfm(_VZYFmX^0* z-E!R!-sBQdF*n_^rU8}~qD3eI?KpNj-1N3${rQxpzYct_ zFc60o`MxAO`{DR^wk;i0lP{bk&)>po4E~AV>v*3hCL0D85#azmhNC`Kz)L&8^T57A zlDnD0vk9Y5M`h(7Z5YOTeBqJB4zLH5|AUQD`6-Z{7xg-iVbU8X2O^bZLKa=smAZr0 z$6D<29$h~yP%h=Va0i}@0Kat+R(kz20t;pQmj7U|KIER1v1$rWXf}b8lqDK;j43sf&yB%-~WUyyI z{^qN$-@up?47J8wP?KaV*?`2EzJ%-N-m<0$<^i2{P~1rI-++N1`)t}uRRut2wK;>D z*BlP$cePS-NJTdn5;v!~^hG#IaT)%2!qH0Ebg*Px5winSVlc_%J4PMfoliL9E-i;K zWi7=1RKtMIv4S;9#3lo(yGE34sLI(pGg1>fJkLa8;REM1zBIHger0!_onbtF6Urqy z{7BYhFo;(&+Dg(07gka+mQZd`-fr)}S^R;IJ-;t)fmn200wxEE+4=`v@fddv7V|~3 z-&s1R#7Djb5r%aP%lAR|;c||ULx6LdN~(` zSY4HiyJNn5Ceo-48FaL{*+jK;AF`tmE^H%!g6C_HEAI91iHA{YtyTuF&I;)9XW&hE zAeN;vYy&F;`97lh?`hz$^AZblF+W?juYt1t6%pL8WwiX3-CumRC5>e@D->^>H~*7> z&e}w{5q0mR_M|`aw)WakaCgbhDL2rw<7C1?U?4JNpRp34g7U<3&HxVGjbGtvey85i z5WkZnM<$B`KtyUaxI0w{#?!LodJKk*F%?Va@;@yTkU+#AI3h;@+`r>MSj?l{Sz0lK*tQ3S8-4cTKU@ZXYkTw|3aJJrKBh zn$X)I@UEN5Ie zKVlW{7yN09{xIV^8E$u>)#0^QUCS$5%bQ)f&b7D5Q>nEN*@655iA;90l~6b7xv~#ZTn?zVHuJ3uHG1 zcWM7zjiI;hb7b9{GFE6#pxxg5Yg^HtaMBfYA&0&~Z_HgNudZ#jLs2DPj)Yb@bG?Z# zj7s2mFQDvqVFBuiSyy_i^XZyD0_$i_;WT48dy}{5n*gqw=z`+&;Vc9U~vo^@}I zKHDD9EasU@je-|xO+&M`%5{dyTQiO2{XLplzK^Hq;4_i$ia+F8pA{M7^L$!f$-ko#v+{xD z7vOktzIyDc$z?t7hQh==L0!w>SGHps2Xc>sd&4pm=x_5U6`orf+MQm`9$A>DHJCiw zoW0v8;o4_?@5Hubv}$sAbKhc-Ns)tYUo;=-Q@n+ zZHqUBRT%F_htfk64Z>Ak8=HQI$Fqe|X@OMX4fuqR&DpPzqg#xLd)d%sFNq3M=jIKlG?pKE76-b zE5BCe1TXFsu1{VsjvU1WRWxh4uG7pK-i3*6KI=?dPmdpUp1wqH^@%gPI$txraoO2v zJS+?wTuxQjp7i?QU)#`etdWw~DC_)peam^>AR{1~k21 z?&n;(oITRbV!U$3zp?#_u>tBEIYmY{{hc$r z>L_;VEi8B3qr_s<7J4RRbT7MGc2c#Jfz3Yp4S*Mc8BVo@A(0Oj+0|S%dLdVIyZdky zWvOmiuGezctfp)z#wU`PA4{>4DgdykyVQ`FIjC}*S|)qWu7>`nENe;ysx-$Z)`rY> z$gY-M2o0@j{cY(3U*Y=)y#-O?6WgEWz4f#L$Pm??U}aKuReN!5l*HzA!H0np(4lE%nGVcx?BTx<15>qVFMQH=krz>M2S_gfR%D1bYBO4)!bQXszXGCZ$@O@kAy zq2x!onSL-FYBIdSeBGICt>BNMI&O`X3P4?zm(;TfH>#z-=S%zSt0kIxjO6VRJb#T+ z5xapoL}cJBl;9Ayb5V58-%GLykoPo<1PBUG|Ai0ToYiWc4x`wQK)pw(^ZAh>&4|I{`Mb+g9IDMo*NhA<5@O!>f%vDAZQXXw2s z`ZI`}%m)!6zmG)@f_^4`*y2Lys(U zzJhdC&0}H41+hLwZw%xrCkuHX8Zh~H>*S^RBN7pFQ`=Tz6S&u8x#CMIUvQITkM)$3tcOr3w@ z%Q-tAjgcR76_;8v)}LIwc-GZu_P3wq@VUfAY)F({@aAj6A=g7=AAgr`vp$Wq7W)f_ z=33TO4YoNLwIO-kpOl9x5uqQ)E}NkzrMN7dG!lMC_49eCja-3-#cKF!^|P)hB=JLDJh3G$8FAYD$>U> zCX;gqm6<~nnmNmvIg`X3N+HQ9v}z(RrwQ6 z&q9~m8_wg*gFQ2roE@?xNd8jXuYbQJggR%7r)<{#;3l1{ps;@|EJB*q>9y!l=gR3d(NjT?MmBfm}+^-}3qKOqHiSiWd&w-Hr^6{hMucAMYrCM{t zq^EO+DD6X)W-j@r!_ybX|JF_3qWUL0mjs+Uxc|;;@=W?{Rh^ZCe*|S;XvAOK-$mSP zwxpTOO>MS){$EXLiDzSVb@8&w(@&?CRx|$xz;AEXyu1DAXZ7bdJ>eYX%lnQxrJvs# z9OSMtRVe!&4twV^8*D%LnQwh-PmXp`bX%v-PCPuiYU35|Fi}7IJ6Y+>{d@M-x%QXd za=aaIKxVG_t7ZOnO?Ffv5BJzRIG*bk_yZ461cKeCZu(q%`d%w|^6-)AyIfy8()-*- z!_BUZ(xEDqz=F>ql=97k4c9V|Q?-BY;DcKEfh(9Qr}e8Bo~dk9t2s6w7k|C4d{y~! z)g2G@V~=$&*%Bk=0d}fAD3+R@fR_~T;=4+{85M;_gCF@ljQali`IRf7v#US!{eQS; zl4)!KtPIBH+LH*+NQgQY4Q+j6hA$xT^U+@ns+>Z_rySOVd9An~Z0Sz+<_6^2y5Rfg z00E9H;YBb=-8!VQbF)im+ovg}1Ha*>Cwk}-HpfKEXvhDt46zbTj?&EOkPifNf_yQFyWnxB-=Lzcf2W*mLoUTceo zZZBpNwRb}{GPWwqW;!-j7wjyW&d?Gp3<-tieaCRy&DgJj?Z*LhHvPJi2~O+BH~2D_ z%hju0R>eN5N@YxX1{fJBL^ZQaS<}_jmC5V_fzUq*SZl5k%r^zamJvw-t7c`$mb|P( zrPJrmoWAdWKApISXv9@`*PcvgC0sa|K?#c;JnI&Ity%;ZngX^V}49@oT8P4yR zS$gUwXWD+^#dJ<_z>u~K2Rzcj9qDbEW6+Q z={fdA41UTeNZK8QHiy~}vgTB}?5)_`cMrps`*-br{xR{5!K@c$DAiHg^ZPlus#2rj zc>=QVT~ybyHY<4$Pp%}x*wtMcTqOd}!S36|K#>3~2=V~0Lc#dR)TPvn39uDxeQ&N2 z&;ZW%FfYht7Z%>M??E7c!_6Z5k@y6N<`q3q(vzFNQGEuExbNxb_=j=8PIo-}O+nno zv4dn3#U6{-GU!JTq-F8)y)J(M3GbE(T2XW>c&0z~hf_pX0+fnfOx#wgcwW`{i9m?$ zIsPaHqL-kccNnvJ&p?SSQMEq6+gVaA`gSZqy0Rvnn<=v4O##{F)6e_Tsc0bGP8JV~I=L<&ndiyc0v^MPKBsi2c zXsNm<413%yuS=S|QsoZo!#Z0rz2TZuXog8;rQ|PVFkxx4DXwWO&nHf)m_t(#osKSq zs#!|rF}%AZ1|Ofr#$_%q6flXB!??<>JPc+w%q)3r-X73)K$A3kTj-m)JF@9R3M zpF3SnOOt1rJl}OV=cfs&5zEO#mxDNg@2L`$24rJ;sme|HV}agWm+*o}K-7k=j_-ro zv$!pa(5-R03{W)7#g7^}lGtgpt*_mEIo!hN4y75+B`dPG!edFpYuY4b$FVN_!IqO8 z+(6Q?NnyDtu-TNdVuL~duC7e_zE0RI2h0R;g=W-Eqs-s{WaSf-55`Pz8Dk=wb-I8p zjg1>#&=^6(+n_BG^NWp4RGsQ`7{)=={=ZbMU9im!2vv+?Q_IPSlPRBIL{$0&ru0Z6 zQ0WYPvCgG9*m_w!-63;+p^OPq22lX~6b^+1CGo7_q4rzQY^RSnl&tNUH}k*#83uvA z>3YS2dsk{}Yd4*ieZS??coq{oV?+!7B4=;d@>C+sUduqFd$58Fgv10WjSEp1pE|}- z#&xU}P7EnXi?xKw1=01kfE`o0*BCrEme`);iTg zg{55%kp9_&mG%tf^s1y3iOZ`J^D4OK#$d=l?lFKngJd2|FNLN^{;-0^VR!{P%9yH5 zlur*>4-9qh8KMT$Ojc>P)PRN0VGboe|9uslmFkHw7=r&$pZ!YG0jJU(*zPQBVGosn z8WMxtzwS!GxICaV^PE&bWGERCq~V;QXh_1g;=TA>{C?Bu0y9uPeG7v0W+(Wl*lmU! z4Wm<;piJ_{U^8eLd@G*%VhWZkZ=PP1_w&F5m72-xsAzfMik!h8{%a6k9(BPsD<*+k z22xJvQ*e)=-RWrL!+Kd2HPUQjiLPi)lP>taFoo0lie)8D{|%I+X-g9FL{`ukCcf3% z0TeU?kJPhyu0V)>VxaEuOEGZS{Nk&*m6TES5WVE*Ch@t`EnXIc@V;17D-e!_r7ZH6 za&oGpz=KxGMnHD~P}P(w<>)S&o&-8HG2{2>5=ySbT&ptmL3ODE=%!IQ(Onp4C^Q=q zD}UqTmfer=qu(Iux8X z8snFEPd~kCe8u4~`31wBC$$g_>JnP$*s6>LJt@IiX z7~N%9kCE(E!5|{xp&S4b=;=^6w?Ui=$k6Gx9@RlI&v8G4&0*6xv7#Ev72##&)j7Nk zGlbt*JL@UAa_%6r;Mu7!AS$c_%tQljao8@by4MrgsHiA?v#-kbaL!9A=vo+oK%PVD zy94gSdNwfoMu(=o(IQ|jqU1W?EP?AwHrfoQE2&|{y5wQim|tw#3^VdEP~?fsR%d(A z^aS(;j>A-$oOav+d01tON?IfXCDz$zFa%tJ>WoS!4>vjB;t*11A(1A9a!&*_danA^ zCDF%71y9LzLBk4HsZInR4&bp#OJA3OtA)+{Yi4y@5VF-ua8$OpS4)$d5xJ7Mee2O} z)N%QYfh;877+O$TUB9p3m6rD{8!H?P&B)^r1Vr=t4xov2%V6sbN^x_sk`avT8{$Hc zcZJij^9fxDoOGvg%t_ugUS@ZZH>W*KzuIJ|Q0n1r_7*xpx?_!o%^~SL*v(~FHrVpt zB@Ko{<{3P9Io3{tZc8x43KpKwkW@=^b*PWQaUcxew#}owd$J8}8rXg4^0YCs1-UGR zhIA;CF=3=;C!!DI@M4N1Q0ss@IRIL5Gto)jbGYd2`Z=H#Ww zn7q_HGsT2la>5KNH$-HI1IBS7+!juS!8;SFaspix)~m?-ws_Y*m@DC%)CJ5)EEO;W z;5`(mUGx2!eY3s7l8T_q?~d%CD&!xD*@BB;F2T(|&I||{PGJy~(ZqaRJHcgHt{cc3 zWj?Q77o-FbG-#D3HL<{*$g&Suma= zbmQUk1>>z#wNR3D4&4QWPA# z$Y5MQnij?HuJ!o=s&&S$NwJbJ4^_EpJ&ae-k2Z+b)#^UUGT+BvDgm8TFuwu(Sz*-v zOkAoVH&y4$!<6h}g+!1%VfhDQsIIP@IG`R@aIl#OpqSQ8LM}+J>O`*AY~7`Ebb%&$ zAWIC{3@%kGLGitj`+0r4$GT|%Hv@_C8--K|s-Yy4y6@eTO2Tb+xmqc@pF}^K^i|h9 zRw;;*G-G=x#ddXNBO4^{Krv+AT6ZL=C=Go>Z2srpo}t7)^`d$aMh+!BCY_?Yp%8$o z*R_0HT;c?v1Ga5+LeOzDcp89_)dYdmqcmMS^hk)fhjRX;yp)lE-IRRM7v z$uCOG#?J!y&ggA)L?0)E`dSVquXeI(sG5zCtOObCnwc-dv|bzKxW^%1QL5DKo8ize zpg%|#X+IMUY%pn%11avvdsTqLYteGR`PIVTmX>`6~l9y2f(0|H||An*^Ds< z1pMMXG4}0JKxP6SOZUL)t3pG(kq2n^AJAz&@#Ssd8}9cYoX z0)PnNsGpp$dDJ0-EdzZ_De9iX8=a9sDWT=D`v_R}-r;u|?vP<>yB_Va-E;xt)0c*f zs7&bp3qz+RsLLhdh}@B7RSm@W5cd_aUjA!QQa__96(!$T{Y2Z<%Gg8{l5deanv>g- z=dN5Lgs=~7?2afmq9N{Rp#lwg1ku;~*&u;5Q`2(8Pi3scPP$Gx7maJEjAHONC>t>* zLam&lmmxSKVz#M@0Qh!>HDE~!y)#1@ZQZ)KX zaO%f5QLnV$HZHtQNegOjYkFLvp5+W_X#&&*qo-_;doD6?dyHPfK9Zq0=U&kg*s}sZ zi?%ZNB{9)_MWj2*imGSksDPlM@Pe6KtkALQ0lPInsYHytUVhrM=eJA0m$%Z+Tg@4kI1*woW+x20%!9gK)mjS7}m3P{JmAQ7wH3HU95L*0_fv$$ijk~$ey ztLg_2fV6uG?RlC9-8~FsCtHy84Whj-*_iH7f|Zz#7MQvY97=ymc%^#$l6|rc!ZlEb z3B9Hqh6Ga4is;4ELP^>2yHr~$*vZJkFNUM8oI4b#hNmLApf(Z5Y73vzei0bOsD@t% zGjuP$7ru!e{{WRwZNu1Y06JB65<-?IJW#$0HY}f;<@d8eCpmvtE5nRP4u&b;Y1t2- zL&1?kIJZB9`xq1;|@A-Ti7yP>wt+il*cs+7}M*HmXw~>KwmG=ctdD1+`aqZWa+h;_Q)(k+RI>|3^d1+N6_~U zbY#Nc^9W^(OggjkSt2=7JW?xNvI;Wj{(cBewcz`-)V)sy=x1)5xkiIFH`u*{@8QqR z{ke6Ejki35btxeUxL$v*ob%p)u9&>9kdhL2Z_W8Xhup??)^u@jd-kp;Nm$m~>#$&o z4JQye)cQIfaSykyuqIyJJX<&Ea=9bx*u2o(+T#!TCh;o5)*JlVlkewmVLhx2$G7jR z&^`8)GfWvOt7%Rr5+5gYkj)1dOhP(t4@`zfIz7^1e7>9U>`WjtDEo_9x*vaaEPrjgkQLTkd6gX{DOLXZZFNIrQ?)IqwqiVx zG^Tme~-;*T1TD1Wg3YpWZk1+G4cpS&8$FRM@WSMIo)2!P zuCGr_E*cY{a#n=?_)4TK*LZ-BWZs;;bZ zsVZ4L$+vj>K%xB0BbPHSvvqktST4;SDG#mcH>&rT5n1D3er})KIQ?0wH^$QSv|D5R z{?&IaI!ztYWz6x2*?fbl)8QgDE}utuIrn?x-&xdFYH!Ba{@BVq8nVbt8aquad+s;G z%Z_sh`*Ya)-w`SeW6g(~G7j(7j~}Wkv$oEdNOTNh&$h?U;hXP2%DMffzP#08)U`Hz z?;zKyW?MKcujSpO_WO3l8cf|c$4meDTB){+J73*U`ueD<+SN*}zCJfc<&=Z=Oyxt} z)5Rp#876@MwvHWLv^IIO{&PF^W2d^7-qXjwJ{Q-Y^K!aSE4ffEo@O87xnF+Gg|0XB z?Aa~G_iJA=T1Xf6jy{nlcUP@0pPJlvkssVlnf}kQj3Vwob^kSaf5PQtg2%4tmu$1qcac7DSL@C` zyz^pSMfKJZtmP|lQ}24mJ6nh8<5wm={PURJ$_=_u&^$i-!K9r0*hL)a6h8(eI#Yu;Tv!POy3SDXgD|bmYIspn~ZiGrloLr>>eR6&n-L|N6xt#_aJ59Y})od3cYc zn_(880|RjeX;O*(QSim9fvP9)szfMV^a5NN$Bi-kq$Sk@`-VE;qMdwnbZW!x<#h`S ze;Kd+W5(UFt8z9s5;SyCBhVjF7a6qJHBts-?Z|j^8NdC}#{J<oK-iwziDuA+TgrJdsQl53JrM}J++0D=|F8aHmlhL>{>>LR+7rhUwemgB zn}6@gEPL@A=uPD#M-b)BKak&TQT7iO*%Yx|DA210722L*-}-w*-;mV_Krep)A+?K; zUTE)0kWm)3SyGhRkuhdZr8G{y%=!EJ*(D`akz5JkvDL5|X3Nax!Gf#b`bP4=i?)Nc z%1R}_s-}$$VaM?BQ>SgLEUafAzW9^eG=9}Jk?>ZsXY`}+T-BE=c`L)uKeM@!|2f;P z-8#}6{Ji@q>(IbH?Apc073Eda&C}l|_j%{lu32dYj1<>&sJb{3*x)eRW5%Sq7V!=s0c5gC;J7% z3Sf_q*v~F$lza=Gn>)qVjHu6Bl zp3B}_ujjS3kG*U!RoCCTAM5XMT3oi&?n6ZhzBzZTk3adDxdt1hsl4&)tVyy*)wkmv zcE0{;mb(#4<^I|SSrH|Lj{hl#e+Db>3DNLOb ze6bqOpDTQS{l(=UXRM~fG8@O&J)UKxtPUPQFO!ASYd_3xVAjbe!-bAZPzFBQTLm@G zt4=y*4l-X<7rda=m!}?F{?8(;Q2)j8Jw?>~PxH`a>%r>vW?#$;#oEae0<2B0;r6?3 zeh=7u>it8deZ!P@`v=dqRmeAcHXo8^+bnGB-JQt8|6Q)4T)$&u_7*WQq!rX==jYs; zrP;)#e)isAO_b_sy}YjRyvh|W`Cn=;ywpY_pOCK3ZmaF3iOhasKAj0S;HYu5oBG)L zeE-Ejvc*-_7Un=zlA)!+L6L~j1x*10qx z{xDm7{E^7-O^$)h<7RIIOJ3T$g!!;Ct2aVh-@i2X9v8n;y*}gbGgrS~!fNq}THi1K zdsP0(!qT+6hD&R@zUsJ3X&m0LGPi&n) z@^RZZj11AZ$_|fCfi)cJunI1(qw9shl-S$LKdzw!3)KznKLW{@ECS-IXt`H!u@6-s zpmAy6$h!;J)XKJl9?lq25N9K!I6YPGr)O)PVz+Ixg8xQFd~$XTC~gnuz_>ZGb?-s+ zTh^(6TyX-@X^@tAI=*1Tl8M1nit09jWl!K#8QsIsJH~J~xI4W3m8YxGJ;&lUdBaOs z42_@WD+v9$G+-oQiChWv!zi=oo{!tY;cAi;T@(*+1*^~Tl()ztJGjv}Mc09%Hh6>KHDecQTGZmNswoX2NJipjH3{0Sxrfo9Z3s&!?mkBeP ztFS=KM1)?y+$2(8`eVXUB}GbT;C*xJED8CE3I;ZtJv0^pt|W7)DQnc$zFEHW$EeT@ z4#QUuQkJ5bP)ldWq0sL(CSxKhAV{Uk2??S-08Zj@w?-qNJ?6JEN9(G&Lh$y9>)~#A z>UzB6OZf|ZF|8RV911WP#K)g@3txkUuThQbjS}QEGkALrl%4Rh#HVOS7=;;rhD9)@ z^IIX(#{GIa4Tk7=O~TdpGUy?Mf~Ykq!+8Swq(OBEFdnkD~#H;x5FR&VNB+G~0_5 z3%rp#@-jNfyv7fjji&Lpz*W_i#bwImxheBSOoW5bC_`%to1+;_Gl%J%tH)N790qMI zhKC)t2;2%9Yfw5!LB=<>e6+%aBD0)c+;8A~9qcfXsM1TIyCd}heyFtt!J@A8Dp|e- zAHZVpU|P}9%Z_5Hg`CHZsR}nY^KxVnNEYre-qyNO=|!a8VnmFZ67FV$(2k31nDDh= z^Re=-?4W{`A$Nv?JHjEgEx$%ZeiH7Q!lB@Dac_{JI4|pIKlKJ`70x~&L5r1Lrmg3x zz_B_esYp}yPW%`{3zE3^L=YmW-|(Rrt&MXqvW-DT4*9+eO;rGm@CJ9(btt>KGrN(@)~2+kK2$Zg z8K>Epp?yy@Z;Udxj546A)~+>&M6O78rv5RUWc?r3$)$b< z4eF1KghtUyWiq8-Z%)85$^Cezh1C{!01^c3m`IQ_z{Ysx-^LA089n!N9aVh-0LdP#e(Gvt{v$g-M zf^h)5Bt1F#@5$QCMuF7jky$W4ao0UNqVKvuT%hwf8;b%ZL(>m@(K_Honx;YBg zByqpi)oJ_98QQr7>t$kI+6+3m=uJZbgu-%*uwW>ojUNW4FyQm+eVlp&)YK_Z7i_M1 zcohk8zf)R#(LRSm843Y#3j7{vXydZJAo@7B9iUSItkIdpvuc1J@su$SotMu3!V|wf)bKStj2s z$aju_ZeFc~G1!8$Y(?1{vUK$s!+pJDsd~nKb9smADGU112w0~^=Co0ci}>Dg{3RwJ zFctvurU zgoko|KmNC9OgevWltE}M)e1@b*0U$C(bPQn|r<*xiG=2j{V3ft6rDjt?SD&Ox8d%ZbLHZer zGUV`&ir`zRG;iO}sG*)&%AW7738u``ds3Et#3Z0q?0lFBz9>hF}{q=5(9MRRLbHg^44+Y z!G@{XePE;ep~N3BD>p4%6Qb#bw+u?EE)FQ3IRk^{iE0!mT9COf2@5Hm!JInBZGGq- zxDJ`(?}&~O(~_u@Ki!mlmun38<5&YK2Fd%+fuy>H&&DhUnVvUI$-(%*N$#h{pfNEC zH29VV*G`|SDu*_N@>K12{L1gNv9LVzAQCLkW>NRLmAb9N4ru~D_o;|rDAV6BwXBcr zU#c;(NG>-@`5*ASLTcaG0^JwXW9Gg>^dj3ralI}U9v-aTf%t#xq&xEOqk&#;FLjv0 z|4$H&#=e@nhCV%jhXHy&5zYiCwn7 zuS2^aalf&wSjJSbRaUVV3QaQ4;n(KAG;n}vUOCq&M2ZtoyqPWcqzep__1+uJDB{rX zD8{DL^u$2jkINbwH%N^@jf;8|NK*khaC`E+EKWN8z;KbO*mRhjNuHQ7d|T3pAUP#M zjjS!NpWQ|uY~hyHD6+&`DJZ}}XyXOrieBvs-wNzuU%bo-&+$j;4A!VlTrKaj+q`UY zItu{9q^Obt2C5bQ6RuvjE`?%@i1&>jh|$^oPAU%|_>GH~Qa%BuA=WG&BDqN@E=LKH z2^9)Lszc3mL&V|Sa1P|BqLVLH-PivL59I}_d$08G2T2%H;-LH7-E-E<8_|lJj&odq z=nuiOcI=LERW935?1XqXQ)&%^TaQ}Ytt%yO+5DZ>H0Z42ZM>IBld$(G12fX|%iXvD z_iPA&N0^sMV_f|dN}h0-k5&8dKGqe1`+a6_ir9#>weLy6wy`oQQEDfJw9)6jIw*CZ zD=V|nAShkfa2J2y#jCQ7Trx#we=2BY#yR4>3W*Z9Knq0jO!s(@K3Os?@v`Y9Ea5O?dG6_a@3^e_e*l|ZvRq@goi7a$2nj!n>RfmB^+ z7ndPV|5hY~U^HW;j9lmLU-0!5DuL7hj3P^S6Um6>in6&^55m&uWiQqM-xHByJD~5g zS~gflwM+Owqnp`QY2sW#bqPr%`x`z1eb}ENU^!?dGT{^}@;im8_lUzt@`5FT2O8ak zn+1|ff+Q&16y>iKx7hMuTZ#fHO9c344NwigahTJ&C9vi;ArlTi8tb2C8~Buo@X~T?*R85r>xFx>9*a>TZ z-Bh*Q*&Tyy<<~JeSa<_%B|)_ageP`eEP8jT%E)k9=F~NN8ZLZ|I_uAA6zxQyc`w6d zP(kgKxT@yx-T3sv=8Lw*7^N3-30sD*kvAg-gq?rdns`esc!$1E`3 zm96$otQ_j>eIy{pjYOM!X+iE)Wp)edb@vH0uQnP?oH;x+=>O)4<9Ql|GT)ccV}D1)sAK8o!GJF(K;0eZGOns!;~+UI}+I7vMpmm{H!uJ7TU)d!YH|- z|HVA*m5T?r`^n=x@)G#)cL{=P#{d{=5zxm%gKXm`X3Z|eSkvX-m|=TIGdlaEic$DC zfv^V@O(KgmKvjbWqo|N-K;a4i1^E3?*f&U#3p9(c#d2;V1VdPiR)`vk;CjC3lU#x$ z68i|Dqs(^0jr#yXNZu{!mxA}}ptP29k5EoQaIgX@txJHXsp8U1@1#6y zcr+GTmT?X)P4~gV0b+@s?>&)O`)EI+;K9|oI2j3VOy!nbKOD^lZKieFllg1o^cm$Y z>LN?F&~}(&HJ{GN-?>yIf!l|p*A_Axq03YWZS=7`(Cdew5j>)t!p-^ur+ZyoYvW{^ zs;qnDVKZe%QlGCF9=ca5BKSNZ%8#xEu*Uu3WE5N_8Z!Riq>2)E;LwBA_uY9F60B5P zQcmz;X!D=Pl|~VTWHL(U?ItN%1%yKzLaahJ11I8UjWU>x^!$^nDddmR-3X!{&q}K z*I6*1ucY^7XL@*?29ZIpp}Yyd zVaWII+vjI)?EFd%uWz1e>dkCv&GlYyS3E8JrL=mMvn_q0UPsTgvAX!RPP*&Y{HKm{ zBI7l`wVF@Yows#p7x(NEUjCB#`N?@Q`Saj0g8X~&FS!q_+Mrb!E=MP!%`~Ocr-V)r z91;XnEJAwH+S9U%5Ij-D2XYNNr+L`Y@rMO^zB}^&1DZB|oXThAYrOsMexT><*^7e` zNAkQ|A4+bLuQyx`^jNPkAc|Icd~V`vhpmfOpg-1 z?8n8?vPw@VND+%l^3+xU9P=a-~KePZS?ZV$)UP-mDkI0zr6?!uW$XMmtT|} zBr=PQ+@YglUU ztghW1D|WWH8L}w#^hwIx;Zjm@MBgQ*fnkXSe^Ieo9f>VJuIz&Tr1fH z?JXV|2wnXctKD+ayw)z{Cmpr*C3nd3*O7;Yq1MXkOYuekq^3ZE&o&#Du(d$UM6?MG z!u3K|?(g=;8MdMgFI|~)!1V;dc^)8$jNh#Zc`cwV`3yB2#gs!!??heDMEw&;nL9Cg z`J&(nqfuF;j9l(jPOhcO&`phB*`FLo@k+CNw;b0JrVWlR|41~{yR+0q$GK!2#FGT| zBEE19nOWn-V%X>d321vzC6|I6u@1Y2dUkn9ZZatz99_=o4XDm8q4)hF-?fm6M zQ!N*F&Lqxp@SnPm@01+B1lHsKD+8FJ`TqG*!&*)f?X@Le?1_$OXF*u}zl^23`R-mU zIPFhjb~`j*LuWgULVclE0K=*10)Xp%tf*A6`2;>^7NLdk?IB3RSVe1>FJuHd@}G(Z z5M0{tg?yz?!wilL_2G-`udCoGPwE~4w@p1 z)3@asd8B~v)M^qmxp1;fk;J5S)&;r9}80)uDVE_3TgS_bAQXT zeEwEhW#9%=`kJ-Fblsuibn)oNBtxgKd>2ExjGaSjO3P$$IPByIFY#|<}z@+mCT&Q1Kkn>rE``h`k;5`{md?D_M4-<&a$#|K&v*>{-t?XS!oC}CQ`5IYzO>_ zdiJ88g-o|=O>NUW!@p-^I#RgBdHYsbOz&u@zy08*5qr3-e0trIk-Go3Ju*i02edb` z>yxv%iT0@Ruu%F#Qp^Qs!qn^mc}w1~C?t}d=Cl1Kr1Tr6CSzoB>UWRiZCdOJPT}sL z--z@o;zD^Ex4Pg#pWuoa52#R(uAAJWN-4VLk}foH;tAqhmzapm%QO zoy#2D=n>=Ae`_T?oZZn-FlQ(YM#tyvrpI4~6AgGV%C@d%c$x+WW4%aa{l(#g0@VGsU*j%!_ze^*12o5LzPJ?7bTN}yXzmh(g`J6i)d|burs&)v`UH22NiDm$cN16yZGSR^j56pV^Q5y zE=7ZTaQxIyEGa`Nh)G<#74j~rg#|bCxB$5hC9UWuM|ZrgAZEP`yOo>9C8vHnW!zA- zqtadmcZ_4qN4f9MaZp-PBpmF!OTM}(!5!S)T-;rd?Qi5$Yi@I8x}Pl@;Z7dQoHjVk zCD}coldg$(CUnAN%JO?d@Mje{1)(HehOKP`^%5B$2llO|%4ymQ=694GE~)9HtHLEL zOwyyD@wMbI6tsRAe3wgDz^$<^xps@pn8>H5lmH5@P=R?_cRB$oy2LKmmK#4nSCyq> zcolpm$|TRwZeM`{I06PuI(II8nCkeI;)_C9zs5pwf1g|WB6bN_rwOPvN!=k5pCH!+ z(^~M+$Nq?Py`6Oe2D44@7cp{_``v)okmZBsK%-wVX2y)Jp9)DzUP^PxU z<2QHA%KF>&o>VC0XJ3F^9XD!=!cB@z$}l*AV$XOcMWaP{7dzB45POI+9ih9gEA2R* zd=dpid2*KeiS6&+lg3C%oYMm95m1pK=+F=Z%D^YcV)hKzJI;w>O8OLP!g+Q8s20YI5Hfx{YvOoBnFT+fGK^3CBc zHg?0slt~V`l0t&2JN^Awlv<}zqxbzH1}VojP^gT~xbw!lJkq!AKxAuB#AyX892*a_c0+JHoQbeEF^y%0{4-7RM54t~2c>w&0%Q4LRntP*W!j;%%;ZATd!v|Oj%39ts zNu%QPzRFjiME-SkbK~S~(|$<(C8Q-Pm?I;x7LSJS$S6Zi*s#;#+c*2rx!0jGuQB_T z@=R#4j4YObupuZXRD9KqgY@6 zirO8OOFiLE>fVq1t-4TF^VFe`%kCm($DzJk?$wvivCGrzsn7ZiWM-nqzFGSi z?`p5k3~*J3o3T@-m!m0nnnRF zLQH}sJH+{rHzsBo+J))`T!bU(bJi#?tAlEN0&zq%oV(aHIvd^l>7yo}!Am*oKUaCwE+b-9TC9D^UGdR^jLI0AnK?4O zvW{S}jWjab5z~NL8hawW18FF>BPR@zWn_Y=aYS}koG_;)4H%hPNi1M zH1|Tm788?%N*bF@bV{t0KwK@;N*TBx(KF`-6#P-l4=KxMcBVZUOi ze$!A#r!vFh6K3ZpnjnmKvgVf2qCjkg*vMUFuuzsz}dMf-q90LrKY{am}XPjO7o{s<^(fU0h-W)zoaM)drwT#>BqQY+0zddE}Wo z1O2H@3*LV|R+`Ps5gB4Ln-@sEIJSvIL-%ijy89cL_Ks0%$52k;lV8&F`UhM52SFbY z7IjelMUs=PJTG0Q1xgdw5F;o2t=2@-(FT-nf)sht`PG^*h(UM!8egfO&1??; z8M(4Kup73EmoO8Oin1h7xuB%B%>Se4%mbPJ|2V!e*W7bNOv8o|xzE(*$Tru^P>v$R zT)ByeAxDmxTgWlYoRynIk)u-0k-Jg|p#v4w_qX5wpU*#^>-~AZp2wpsST99(Fb?(i zJsKtiqk8t6kpWsypRr{SJ@l0>=9ZyZD&%_~E{L^J7CCio)X~HZZwBMwPtGs)Re}V! zJVODFACvH49WZ)XoppcDfm3ZCN9S$~M9bxif@+a-HE?R1yXSBY1v=`Hxtg6eBE^9X z#2&l#@vy}-mPN|H1KCCw>j+sjL0TddI-fhAi zP^?B*(5td|*PFAKJ0#{}QD^L?Df(lA!h__P@rq1L1leBKkmfWY$j3}>NW*H_k2W|% zv0AI}$i3{7b3C}|R9EoQ=L9JwuBOUr9{(j94^0mkH^#d2QQN7Dn+N%#lzEXEN50P3 z1oz0y1d&aUt#9BN1EYMm#cf$5TkL%WR_YeQ2T{-(ynZwyfh(BuRdCAPjzK6&7$?Yg zXKti1$puKi5I^NB4AUEhrLeVXAP}w2IfqHqtTqk(nBl^Tv{v$$Lx&3t*!lCR0FA{S zxW!e);d5JsF0P%gkzD8F-ekJx#D6;%_GI)@2Lj1$Z&OQXVRlAE!IId8SNX6B)9see zQ6bZmMgJw5dUd5GnOhYF_+&wCo(I4|N(|Ai$b9{_%0hB#a}!*A!acL%D_69E9G#p3 z%BR)hhF~HPt~J1MRB`T8z6i)d6u=b^O%r-vnP(t5s6|1kqt0sAeEGUvEegg_CVfB{ zKf$Y3$Drfjw^E1zrRGlssyG5wDmgo^&P)%28q-P<2HSyzjXls{9DzdkNO%B1AU;XJ zl2(lJI?v0G=mc|SjqJY{D5HE5+{P;^n90mbevgh#Lt-x4XP{lMQcurEcjpihRYo`Y z(k0L7-+sR^W%ZyI0x(JA4&oNjlSM0GHF6f%Y#c;}#GLRpL-q06UQ5-2t~! zJ%*_SFq((|g|t$`1^1gYk<6VJFRpUssrDSQ`U1Md@r8>J6B{vpc94WJ=+>5kpx_*> z&NRa)A4jNLgy#sw1iMQ|?Yig5lNI&)s-N86c_cnDAqpz5wi1*d|8rmDi7&04Y4br< zm$3R?DF!VGlPG!dX-pz%Shd>4-+xz;zQ9IJ?r3A90D#uJ2_aN0C~t+gl$T#mkWSMq zudJ%1!r1bu^U45#X044vC|V>JswY~D@Y~YQl{q)>Gwd^PRo$#C8!oGaboRhjOwHpl zP#TJ?fRWe8h6N~f)*@EP;_nHNMfLc35|ub#QlgPy1>n>#s%!qlHJhKGBHF+=sLsQI zXj1@DSp;Mjp0l~?EzzpMCJo083-Z2C4bi+Q%w?PniAt5hbym446!fALcVzZDv1N(u z(Ee;W6YMt95|0gr2UyCwBw3fh+uenez5|j!QDgiB=txVjYNzQPdt9;o3Jkp>gUo+s)wMqLPaU)xzcciAsRTH7o-WTRuZba+R|>I=hm{yXg}dV_!AXm5e+wgLis2} z=uoaqW+CuS6TPUQJcFE3<8E@d(3mX-A_KXww|^p$LeHL0ONV%k{j$^Ev~R>s;Z5RH zvuZx?c?qqYPm^yemOHus)IFjL-YW(YSW|vcHSpdOoLM3wWbRne`+%UDxF!ekP^cc8y0ev?6el&0wym8pbq4C~HAQbg&NwJ^)P zZph8wLh9JDrDj2>r&X7D+EM4nc2K^AY&uUttD=yNd;Ij6-25tBnu3A|KJWT@?;!Z4 zXG3mhq%jsa(=Xl3&tGucczxee0rFZ`Gf%VGB z&(pt76A1V&JFC8em-}ZkuGBIgyhM0gn@D2CV}Duvdi)o51@ty~I#llC3r3t8GRs+xTiPvY4gulnw*^7IxKs1GYDJh%#&hr~D$sd|_#rb)g zRIjx9Hq}068a-#+SyZzpUX~n~Vq{+4|2w>>rrX%8sv1~*9B?GIJL6=v?DpUT=05;^ ziW#OrUURbuX#c+CIJ=}gSKWn|JBV%VbtKN5m7vvn_bSJPxwsI%FM1S`d>7qJw@m{z zMJtmyEVO-*6%BQ)@Q#?#evVp2Rq9^UEJN}}z35by;Zz20F@n_?tiPD3Vv>kUz{`_Q zzj9x19Uc*2bop7nJ=38&wUc|UFn_qeG;MO>BF+Ptwf5WE$W zvCwRXjcDj;8?ol?;12re__6Sj`Ong#kgX?RE-LB zxF3?14aS?TpR1~vo9sk*2Qr(3=C=GB)glTaB6M2xkCQ(>e0kSQC5T*kaew^i=nz)2 zr)HbDdKROhcJ}SVT60AcmqFy-!NHe}!Gw*@TkOyr&?S4|WH)f?c7mG~R=Ny>7~ih@eb3Ucztz~)e&j61dEXkbqVp%T zuM|KNxV+s85y+ZG0tDIrIBT5J{+0dbisPgQ?}%O1!|y{U42Q6nTv-loV+%L?eWN&) znVAFc4EOEvy6Wos_y_mDCoHR~2on2gn#}zC3J*lw}hcQN0(mio@~(MMBuQl3tR zg)$BGU42*n18@X&Ru`7m)m7vMrLNT1-}t19XHH<6OeZFNRPFvk{qsSmuqRFN>|Ank zWI=b^tAgwLrUm^k37w5arN8oExwHs?#Tf7)ct}Ejd;4FEUNYQ=>(CbDn6vNl;xk6N>+R^X4Sgw z%oB$d5bD*Z4-*4E?3-%?Jv{#btYb{^Vr&|{{QbhYiNXfMt2@$fJH4Phf!N{{KdCp4 zv5}Yl^uDTn9HF?BNutuy@S zZgfdb<9PblFle6z?~&?y25Ry7qgW0+B|PrmRrRpz>SrU_Cl&Pj>|gp{eXodenNeiU zJzkk8P~d!hLQw$}rB4nSvG&nIsvhWQNBrr!dV3)2fH{MAbUWbCaZ|O#DTQQYMBTZr z{=*N8TZm|H=H*ZZngGR${)+$5Z!r2D(ZZ~xn%vHvhQ1>G2RH%Dq$==?dV&NT!wjHW zf2Fn`#MyUY{Mf=|%pb$q*Da!duI`+D+X0Vhhqj=P>;418uryuXl6wHNYn}-P_kDA_ z(2MC>irb4zisK1Re{4Y4fM1jwaz0OhshR5#cZ*ic{2hD6qv&Zb~aiZ5YBPF-FZ&aGG*|0e?Re9RqonORwL zl!#UW1RnkSS@G-N12gn!*dkfQ?rhU~j4RK-?2dU9DCfJ$e*kqKk%Ms7W<6|0{-Mak zY2 z@L5RdU?*Q?8J^72a5Fb$&|8kgM<hBb2eFM^ zqBkwHQi}pLqIz7KyJFoM?NprRgQ8R%Hroyg*U;$DYo&~qcTv8nfd%<5jjUbgd23n! zn9*`C9j=Hxh8`@`J#UomTG}kXPqGfI`rO{p`r%=rqmAP<>9W_`zkx4QjJNX&vmNl? zbL{Rnx6tc*{fczNGkS?vf{3~k+jnNfA{+guyU&y!oPtR2%odbASr00H>s;ixq_pF> zHly?WZTR1occivOQox}RBGsByZtOjE(r?tagK2N){3RyxRX{sleRjcFVWP0sZKmCI zqRZdqifYh3{-f397nY0KGva|jH?MW5LTBIoi&L#{`uv$4;V{zZ z^A=6V+q33HF>f=bqGD50?Y=iJ8{d35dp@Y|(wT_f(wXQ^S7gzH>f0X!n=N(n9Rf~^ z8e0>e+qSpoHv?V>d;SOb{IGU~oCw;Tr{7cAalKBA|H zR5lON#=!$CR7|Gr!i}A-Uxy!=j*nFrPEK1COkAjF=$@V@?J-)W#~+@Lsj01PX>8XD zLyFqCZudL?OQVzQ=T2wBlq5V zHPxEo%kUkDV%-AvMa5Yofd|YOM#o(p^PU|<1cPv?bM{Vd_vTS)7cpPMBJ{|` zYIXtgeT;NMd)kT6`LX%0S|PRMjHBLXqUK+%R{QDBItFqjwEWN&!%JE(tXmE=eL`u^ zSBl0PjDjvM-i2jf**Zn&5_Jj9?H+wA{vTk{3MD813G}VeSFn&|nGJ&@V$xIi zfwx(@@Fs*UeW<)y|X-nyAv%R{2w4Y@So8}r-0Ej?vGAVycs4Rn;8UZ9up67 z4rLpdl2aU58q(*0XIK!|Uz?^`^-kPk;PDss0rrQqKro1stJqE(`k-`L68D-wotLkx z>P{8nw5*4qH8s&}>gbE~ooRQKSXdmDi4ve?Q6D0?2KW*o>Mf8X22S=_eoR(M1vxcJ z1XR8;m6ndhkJ6|FvvNUBag!(1&N3_q9KB!$FT!vF$@Y>mAy3ns#emk0uT2tg$G?lC z203E|o`FJ6GWX1<%kRL9<~wT7hn;I_y?NE5>%;Jn4nQ>Z5|~FBX{oHNFAO)5>c_nD zETNbYpkS1MZvO3`xl=^RlDt`&A7A7FA-w1V`-jSbSXq#mtXC}z2$mgM^|k{mox~ing9C5C49_rj(h;VLBL}{T{$mECR^5kko+W zi5Mt}_zDQTz!MV6XQ((GqQwUPt=)cil$m4K-kmY}siC7WUgSSOjeUxhz!nd5Y>bY% z0Vym@TUpJBG51no^qil?K!AY5+`OeBToHu9EMgtaeUs{9XEbg1Wi@hq3=28S$^s$Z z%*Y;`5Tev4;Q30N=JkHs5>c6w%M`1ljA&T@DT2vs6Bplv&dyg2)Aa#8ntUY+m|->^ ze4ttofw&%pK;51;+ozy;1R%O;GFIf^VxZ;t4K&W%(likF+(rmO{DKi6V-$RhhxwUU zh>6<@u>gV3hfoVpK-<9N11@@$LKqD6^ZnCBrpraJ>>%2gqPeoWEB%6h1eIWn8j}rQ zUU|qb7T`4@w9ce<1&hp3g1yp(ssMqSOsGqe-~5G74Ms73W4!(v(-og2t+>Gyn`pUQ zY=mID2Zx)YS5<9tx;^S6!|Na1^KnQ=vc4$u&Nx_rp8NXpG`;=3Q9`7qp1`I7w33Vo z5ukO_f>MP!z>DOikInErAzY=8B!?_1DmJ#91b+m^m<+-?KPaCMz=9z1OwhO-Hyq2X zp69&*K6ae&s0VV<({{g@{j>pLzz{I*=^8RDHYjEhYm2GH8WV?Q8j20%5Lk8jaB|z{ z1!HbZNRJcN1Qnv8yp<~g`t&M=o$EGIO~^Z-F*c0{QA>N}pkB3&XR{4}pfRxY_vwbv z(}wlZx%Vx6N!WY1KBaD20(vOz)aOQNoN4{+hd>lfh`{`CUjFcD|8L{3io^a}h$5=v zf~eHxP10prawD4?48j*T<30xd`eO!YZmV63gem&_5B^a9oWsd20=jWl*xafpK07%@ zSBRxXT4pJ=^5-CLoO?}#MLxrP*x|~5sfllgA=#zGF+llOM3Id-k)03ie@$M>C8fz) z>5_T<6nEh!IYb+xBHLBe*!u@ioYXN9p;{{ov}(RcxS8KuqEV7)JjgCBEEY7CNq)B;m@3M&X0u?j>>}>^w%*(f;UZ#rRJp z5nqxSJX;K(9kvGz>Zn2X8LA~V%y(%OvQQRH10h{75n+mr0Elh62v}c{EH@v1G6fOX z7&dOfdSk-1Ge?OMNSIlkW~@mx#`KXntXt?29WUDvDChbNx(gtdzbPJ~;03$u$&O5X z5kRpnvY6DZ36)4=QMhlW0U8)LV5rIX*%HAAa z+76(GRds2qJGww}Nq3mdnT^?_Y*zU8KF-5#`GHvkCNIsX27>--u1wur61{|;gXJSF zxc>EGVP*+Lc`aB7q<1I~sfO^kPyO>GL5MjHKDO6St^EZKK|yx(p$cPTaRVDo z)nS|h7!Vsws6t>rZ#r18GYA-HcCXz`LM;YJ>JJhJuTgw<`xy5t zdNbZr1pF;+FtqoX$aK9?-j5+KjVAk=|9&zV}(h2<<(n!WqL_WC@_EzWhj zvk1bB%;jiDs)bM2`~=EWu9`)G@q1;l20X#gjQQ>)N=nw?`uSEi`GMG+cnPK-WYNVn zuzi0DIMg@zOqwkeo}9xnh{&lTmg|E?RATQQHPeT-nj|aMz5Fdx?lXtJAJ;LUqjA3V9-mucpS_(G+yhx1)fR)qxsMe9y81 z8YG!6e1k~_v2trDr+v2uA*Tm4P{7KmrlO-ew@g@u?DcexIE6~!3;+T<^#~NVDhfCs zL~N;EOhMdpvKqtM*P#SrIj;F=NQ{{fYgxeeMWtXdfzmOjd0mH7e%ymrG5J?9a1@8^ zDvSE+A#1I}V}F4gSH74{*MGsVBFn;na7@+9y~bGFz6MuaO+uGOs+X|3&8AZ{^o1Z7 zzqbaQ1KCTVxZoitZN8j9TucDSkDptz+}dh34=A|3kX&1kEZj3kapgo)!$1Jz^%K4K ztZS6x+CChiuzZbv-n21Un^U1iw9Eo83O9o)liVOng=peLv6*>L53U{vk3=T$skCLo z=LP{?wxu-HVq8*CZh-*>mIIO?=4QjWBV&~9Zy?a;xk<$)-0gQUNjy%qZ4VdBE0+D#l_abw^^TSph&`xP#%9=X!X5z&FU01(i^Bg@ zlobAhg)DRvGD^mQ$OU?tjp_Rf=p6PrpWB^KRZT3Z&BbOWxlG_5O(GnV09w6?(s(){ z21dEK*MSQ!Ueb`eDwF$8BCTvAiqF@Ork&i}MxKa?owNI!e25Q$7mpKx=N~STVGC{x z9Yv7l79+69t^KPT4=ZU{1%SH1H9e(v@kbL&vo9yvYGu*()5JW1%mU080K2bUQcrV1 zGOhL*mDc;+fsdYa*vLVEvZnW3(M~r+o>HJnnm@c%ZoGyR@-d)z14VFHNy~B5@qrU7}=nr2)f%xv-Y3q`3E}J#b6NNK#)| zSg1iRT8v`@6@r9nL$^tnq{@ZPy$%#nxXGPRtT})AaF7)?txvNfx!~5yMxB(^BgM=j z7lPT09aPP2b*m0hl!@DjIgM$MkV5=dP5Dk-Qq_8Ab3(=46nJ}E2}fm=Or7J+nB>4Q zRu(;7K*h_D+@Ta?j7Tf~5Afz`SK9BxL7q55JN-27@)w9n@DvrZHO_&Q$%0>?~l z#$6A&Q47eYOQ_M3WT(;($G=w1oiMD0h$f3oYZjP@!48C>%Y$Ie3p`^K?&S7?1Vlhh zSW|K~HNP^Zd02))i&O~4Bt8tr3nEsiKbzsH^RKY(BGV}BzxD*KP#7z83W25XMNBAr z1UAdovQbjl^CcHz>IAr9H-5_Lo1Z~w7CB=VSbcBJOg`I#2Yh9j76D&JE$@mGT>=pG zV(r?rhWNa!Wei{#%hiuAI|s!P+MC-tATaG3SY85ka|gf@Bqs#Kpp$wXBo0vfIv+5n zQ+O9WN?Ofcx$I`-XPH&2WZ70dk?%?Gr%Kz{U;x}>NhOVQ-!|#ZQeB|@LL!V^6A_j)1$LXA|ZFxb5luv%Zf5~J!`_l#}tufGYkWhD*;Iu`!OQaXx{pu>j zEzcDq2^*~^=bu)++@8wL9ZX3HL@G!5X47GrNg&KQIV>dA@tFGFAKP(`zRa+Upo zS&G$9P$Zd0`N}1udx5A2@3ZeDTv)GXLU)6sY&3O0iKfNbQ0pa4?x^OsULDSweB#-f zM8&=!gSa(`P+klcYF1B^B|*74uoQQ;1FjgVn>QN9-cvAqC@)Y}Mt6U9 z>&>dBv}tnzvZ`l9d|JwJm^$_7-*k`_0$?Q*959UH>if++eDN{dQcz2qe>{5b* zx|~`1sc8Gzl)um?R0^vyk9-#oIw1^zY(12}U!p&Fme@11U(i26DRNPlBG~LQbQ$a= zDMD5lIg}%IwXnO}_X=V-#xZ4w8&5oe2Pt*8OlVr28Y_99Q9H@F*pQ;DTZPK+Y{QT> zde#Cp)Wbv;rL6^7;7_($3g#FQSl|io<$=;(#6y#HfG@LSUJHH15vmGoAk|l)>NoR> z6|AylD!1}$4}>Zy=e8}ew!X)cRIae}Nh@2B-2<7;N}+im5QnJghSTC-N5FF7Iq{op zKn}{I=E5bki6ofE-d|($xblFjJC7|i-j!9zM&iZ2PUc(y+srhW1p=^J=^E)UHm~Ds z>32kJrld=-Gp@c4S6Tlc#{niJXT?4TFoGzwLsL}Ek+|v42vrrXCa?bhE(z5S{qRd~ya8Ki!v_)Q=Xo^1BFk83-?8t-$%k0+iXkHcI=906z z7gUUQxq&pXpHfC3g;2(qhZBE#D!8*c?1pPUML-DN+jAZ`zSc9Asb~>6TS7h;YR2Ze)gr?x`qOLYB%%xY+H*Q``s2*<^x4~#LsLx3 z0-7p8otsOAY4{W!1>T2RoEKgL6a>I#`ZCccq)eU$P=po^CDbVL4X~t773-*>BBUB} zhGi8&*N#@%{Vd%z?4gQCW`EP9QWd(PE3<2q@+~q=3H{kvlef(ahXR9+*Y&gM25+wK zaK3(Ed|FA_=Eu8OveB5#RojH0F)85_yd*zdX03HA$o`S?bDEOZgqII2Z#W{6$rSBk zV^LFOlaUDJg=z)YiwQ=nUWs#F8R2`zZe!Q|E)Q7_-y=v3LJ=62PtxNu3x|E#k|BV^ z26~*!f65p>gmbcDcVFCp0z$y9NEg~0x6p%y`Km0+xc%AFN7 zP{m!^1|{f)zNf%;YRuft~~pcQ1AX9;0i#gcu4tKoVo+mz}d%X zN}vRLG_cD0Fi^o4cOhG2Nr1HPd~vJXo$)sZITX0rhemI``=j6ayP^Hl zJ=5&fkBy9B15=ml@uSgQyd8xdhbwL;q1rRk9dul&-@q&9lXPt-z(Oxhxt>wW@H^R5 z(||k4pBrcT@Aj>}5e&0Fv|k&gZsh)0*5ZofKE@J5+zT7F#BMH_2+2 zS>5@LW{$wr_t-rSYV~XxdC9x!=(4rt%WwfN{8cq=(idI4gZ=SJPId9;$;-Zxki4q7 zU5ng(c)xcTu;S)cVU>+*Y~@W}GkG zK2xgj?pkB~;@9oQhQRRB-8>uD&+)bGgdfg@FFmIlW=y8n>JoMP;?{`HaSO&rPYeXF zQ{z)!e2*P`W9{?mdQ)2V983WC$-F=F%@1?MU^#6qwwo4zJaRuJonPX9aB#HwJWKvs zpWn&G^KvcHAN-4spia+?@0W8iw2jX-H>{_`iFqDHj(Bvtwu?D@m~^e1JFM^Ae5Tw~ z*wMe^GJB-b7hz-XdD-Lpxqk!xTXERR-`%3R|94-ZA zJNCssT-g?`rEkr5%{f`VLhg^aImGOb!tc#Q7^YHn%TY79-~J6>)R?Z9*C7!H>(4!z zdUw~8?rZ-oZ$@GpN~Q`rI+yh>e{|U2ntEHB5&qhv^q*Cne{f5mYr)IDtjP^0d$%iB z+-On_P0h{CHzIT*A{+!=3qKy{=m_W^Pj+|ce{6J~CDtmHp7|`doVag8A`9M{t_!|( z;3+c?h}_G}4RE`h`^mf2Buuw3``d)_vAuOzWS0ezxzrQC(p3FuPG@K09*Uqt-#xjz z{o=3bC5QUJ@arzVO@>!&zyI5;Z^=6E_^)Q*{Qju1fcthFPh*65Ze~+`Y7l z8>E*P0$Y7EmL0GG>!zJC{CZ7+4YeULoohigM-dT6ckpcMe!?=9N@{NesM*Y>@x54TK@5Gd^qs~)=9rQa3!^Uk?qht3Vu zc4m)Fm+v-xw`qFHu+A-_rADpuy~!+F@>lb$8^5nj_1a%)EIQ;=bvx&BX{T52KR|Rx zW&TziYg*T`Z8^1fucLvTFtgOGEzs&~UHUeF)Lx6sOX*_VWWi2QHX@m3?n1D{b7zNG zVGX0PE$8~n@l`GUXO9mAh-Z(FG`cF{Hi(Yf+1+d7mJy@k)m_q;2!$PDN_48_`AP=F znAkrBqXGzTANsL+sH$m+-Q8hhtZ(t@Aml3_KU``?V`86wj&BmV

r_t^y~4d*DMqEOG(tlH!HM%1>Ht{AA_oY$hvA7l)Qg z<4NpkS>mG}AN54!*+HY90Picz@dW_JIiHI8zZm!8iuvw;@?HHtWYy@YpNlQ|k1y$* zyVr2U@zZ)mwP;awM5&IUt>wWY_3}N;%Fc|Q%k7ee$32Z5 zVsA~hyXe<%j>fzTXr{mRQ0m=EcAm!shkpJplTaYa{DD{0qIC@?2tkDrq zwMK7VsS1U=T3>RFl5`7xbEgBTlN++oIpM^j0Cv)%fwP8^TYd z(<{+Sr9mViG^JT|IPVAR{(ef@QG7gr>Bt7>wbR9f`wK)iF=;aHCDf2~PBWQvwEqAm zKKcU!2G(CyzFm&jX}#I%Q&4)ROgBS&Q_a&w>A>Wm)`9EHrYpUgxgbk)vRt7*veO|x zZ!nCRa&q%?vlPpSNl`XOy+6M%f>u!|Ds`s|mqSK9-&>EavCmz-CI|{uNRfTGf0=~J z&4N5bf4%iga;MBH`$q+LOKVn~+gG1vgYmGQKfm%i{fm>qHs|?{kNu|1XY8kNQV2Lga}$F(-Gn{X{wV@+pn#&z z2ApDagH&l%CWrdBKt-^vi34BvJwb-<_;><= z2jUJvF57=NS4cVchBg+#ssZ}w1+z2(6+6X$N?+jOdHqmbx^_07Geb95%{X@IuK2N-gfyWxdY9kIEm!}r5b*ph1n0hYk2U%>CLBvRT%1K zi57cThyo{f(%t8NSW>RiC4>%GpDf2~Mm0l$$G=!G6rmw~f1s7RqDPk<_m1Uwe&?Ro zG&>pPcC2X9urzn+A}^5Q1tbj~YDzHTwHrFFfhz1-O^+(@XZ7q-x%Cos>9#f)y(W!LP&(O*FcIs^E!m zm#B#m$DvK9zj_r9#-ESQq3jF?8t{-f3z+%sb4#vX@nf0_l~MP40h7TB+-36-+;%(x zrw86U_a+zH-?4**TPeieAY$2f>nbvP#Mau#{4Nh4Jt?D>&#RU|59#?-0eg+%mxdn* zOv&&R!*3;Z&bOK`u}}X8NKBGJv7xxqNYLO?8Zy<@cIp%Y!;f>=+%Jhxr~O9q+PEW8 zV{#3=5z3)#tc{|_>zZ!e?AJ>aP}bAy43;}i*-fA~879_TM{8ypYkonivSB$;EHJiv z*>GU@hb`UGD2&?QkFSMHt%Vg^e^$y&Z6YN!*?Y5*GYDc%0fL{_pmNpygcbGjf|n$K z;U&qF3&(Io6pAhgRZjVwDLz;4zI$4_M2ih{6$^t-HU!YM=LwMez>zgryVp~KCdfVg zUh!#@j0(qv7;=I39J~+#Le4~O?Ys(r#QsW;zQO#=(e;F|Sbb|K`KT0>5-}#^*~7vp zuXCrrd&@(>m#_vh10h>}R{J>&+Y*EUTr}&Y?ArdQ`J-j~?QNxr-XN=rqQHlXk?zmD zRG-_w98nnrbz_6?KMJj@|Fe(EOn;HI_tf$G#A_O}A5xnS>@CCHQR4=jGy7CFnEs*| zZWBJ>40c8rIUlz|iY@88>~^5Eil=+%LHlLGbbfwq^+{DB!#mWPeF{8#WnNli z)R6)y^`lhQrAuv&Q9t^$MG(ROgAfsYsz_t3Z$=c*7@-`0r^kXpwFfdA6d>@x;-w3= zAe#tV)s80J1vJUyX@CAs5}ZT3d=8Y`*RB{m{^9$kiqR!Zz!ML%1h2$@?!_g4CO<6b zr)=OB5#g^Y#iyy)%H(v5HBT*xa9XilHStPcwR!N!*IrDx&kvtxg9QvqMjvyt<^h^E znBwv1DOjM#m8(paN+HBfN`gW(DIkukto@?vxbt0Iaoy@OEZOi9|6){5ryA)J9dopvjuoPT#!^PRELD`*+EjaksE?}bS z^7~>?`jFz1DoaOngkRF(HI!!A zDLmOd?SuBm6r&W)Lxe52fPGH?M=G`Yt5KpsF(lY3Z_s;GYpU*sGB}zpc7Lh2A5fnN z$COBU2?`O-zDl1tTfjM}vJ4!7voo(ho)@xtjkQbq*d`5d+v+Ay0nH01BAYLu?AuIw zy{MI9ODtyre9+TIsc8CA2#%1J!m9YgliENHU-=UF(g8vWQ2=~bZ$gGo9>3x=zhS1> z*-DI{nWU^7wq$TP*O+5wV702!af(DRWq<)E&aw1;D&MN^Z#acw*%;E6pOBEMCuVq+ ztyIzYG>Q$tVUX8}u(r&w&nSeNHkkTp?FU;SS9y-zVPoeoUN5s5Nsa9T{av)w&F18y&(+$wo5oF#sElr{W#8!%5b7wn8G6I{cxF2j}q- z`hJ`Z@Kaj&gk?QVw=%#@_q}7kOrHrrm9GR63*?$vOlYZ2H?i1 zqbYppX{X~xx~F32L%5n=HN*j7=a>ngv#~D}B54gK7(iocZ->hDUz(i-?ZA}@c&c!k z7>K1TY#L9&`N;6qmCyRbLQ%@XAjcEO-1bbxYQ-V4S>jUEhwpn<7C3^JBE1rQkE>ct z4y!0XxN}xx}K*hw_++{&BOw|J}ZCz{YqslRxs1d z>itixC1Im58mPIGSepypRteQJ^Q=lxK!MnE7jNrL^S6~}HMi5`qMDVdlu&jb<35N{ zW-;Qgk1f6s3N{0@e!U`fLFA*)(AyUpNLxrBGJBfxat1;cK@ z#*<(g0(6c7<^XPXlS9pZ_=F?s>Bn{e77VI0OG6+=K!Do}QQ}96VgA>=8M~yzRc<(U z0uYoU%<4P?N0?9N!}W`}=*Tdr!XQLa1(u{~68i~aY;xK8d*N3mI6eG>u?0$lxnv{X zY2`)rK)lsEXDQ}FZKp!kw0TICz*JPRRQ79>q+)o&w4vo>V0|>(6G-z!eePD&bo>f8 zJOQAk1>>eFrt}s$p0o@uELG+h0mKERQ(sVh|QIhzXRbGj(!R38>ukuNV08qN``2@TNnx*L8+)`oY~Duuq8h+agD z2iPpPG{|57v!>_^OV`VoPeW+l?4TQMO}}yYC=IlZiZ;0q9pwu=UIt8&ge8o420EP<7$`Pte-a( zDJO&Hx?kolO$EShE``Wnx32ps?qNQ&TmBh_^#v*q$;tOC(ctxl6h!9|B2ZFHS-~`Y z5GqSVa>BF}CoP2axBs5FR=&pS2&IeI-10hNjktt(%Gli9PYK%JAv@T7#|c*PxSdYS zF%HF^`}@p+s|#cUzF`jNB)1iC(E8h{Ml_K(BF2AS?Rd)Ritb?_K*-c&*>>dGIw2R% znU)|J@H4#_G4fVSMf8BjIdaUoA(`#0<)GK`puscLhphe%1etV?2M5vPnEC?e6QzC~ zN;giIV7q|H^B&f1H-)%{+S+;LbXCz70h=J@is0|lRtKrq3*pf2ab(0Qxn27kFbKj{JhasqEZ+o# z-Lr$S7v~Sb@tXDVd9JHClP--Oj;E3V$)lCK`!6QU%y`(M8*t^;Ca>8bl-uJROF*?@ z$Qugwm?rUrMva`(-XJhK(5W%W_7G~_g_q3~tT8@MzFq7p9R5n=gzM6#JvexO0a9SU zi(2_2A_xTK30*_yLdPm9=y9`$Ri<_G3vTiuMc@m&`LAxIvHKc;5)kh{22XjT1?YgI z{Nk0dW#Gfy0JaCv^ z;HEpS#su*g-PI7*lK5iZPA%b`gdhB-#!&p@e3BkqruS{AzC0%X!=r_ zotCavt-%BY73X#*Zb>D;o_$QNHT}GY;CO~3R*y?jw=lM~t8oNW1rz+}=~756`bZ^} zbd6Ya@l?d{&xJqZY@FxCSUD=g`a410rX(I56X=}D-!qDfGJAm@f^d-#J0mzt_!m3Y z^-Hi<0DS(Go~w0AQ^V#*1|NfT8EV!MG?#ISCM8q|0qRrlhuNMJ|r?dR7DHh>{BYz11I#tvi8AAqrwa#(U@G`Afld5VZczXj)Me?o_t zr3?Im!|&Y~Vyzmn-Y;kPYxz~)cE>RWzIr#oZ^u~#NCV5qHI2=K!i~Dy6D+N(uxF6S ztjUC14CUT=}gYi1$DMWs#kDVQ~&yc&n$7# zGqk{lklQl_OYMAy5%Lnvl?3F99Z#OD8`;m9iCpkuRIywM;z`1sC5ce51rCYM{&onk0kPd2e#PfpLAZ+{wbiZc z2Zoq=beSP>z9@i*@pNTwSC4>Ne^uY-R|s=={`Eps`j8qqG-T$ydUr z-ko3ioK4 zjSNW?P_|vDe72H-(r5i&$-#3qyT4O~*w4s<+N-hd)R=~6GEVgT#5sTu3=&=6a_LAa z&*qr4v_M^bX;^t6{F9oRk-*~T3SmKmEUnOcaADN?(Pv)lv9~uuh0E8T1W{y{O#1Xq zR!zZ#on(gxbF2wdVr7z_U}0s#oM9p&&!g%Nk1UFiM3o5r#QP>TqZ8HgfK%_5k7pZ9 zkgirLn!TY-H~#fgxI9Jj0MB;0lRO4jhGnHp`KiQJ8iit(oeOACZ2MxC%{29XS2IN^ ze4;B0N@-9=X0M-g3g$sl^={RENDDFNPiFRu60%yjB$OOMbja7ys{kOuJ>de=Ipm3u z`14dhsRZJ)5&jxv(J(g|2q+7J{*sF^%p$V~G(eqzgfcrkVrG}~q;cjjUmBbZ^MSda zyyK1NP|BKYfRWMAlI(vPWVx_m)#jJk$;@6_Q5m_wzWCUon7tLA&|Igk12$eYgI!9Ly!Y07dnu^}McHx~Jk5)p+mQMGd zMXA;eV);aXLF+LrhN(eGW?H&jE(dcpo+R}c;3c8yrC`>KlYLdw zjKpDK;(T=5Y!xF692Mai8Ea|my-u%5%RP*&6#Jez2RH~ z-&vq-u94B0@!!fDWCdBjt>(!RK<9#Ef|RPkKv~_Ve=Kb|_l9G`tmwz;Zt>&H z(>o#=H;(UI`2fm(zf+PK?iOJ9je~@n_wnWH`(X1TVTl$6tsLJapvL|*U%dR#8%_rX zv{DJ}xF@6yUVw0tI!v_AJs0j`EENAuGFM(?1HSR&-#L;_5WV@0qrZ{3cd06x(ZFc& zf27SDG21An6X#Y}a@QPXj8k4Lc=j&X%^~jmh5Mz>&W^~-fjSN@TknNQvaQEzTb7{PkDmUH&K<+345!)-9|hPFr`~Z;RUk8u9D&U*jthr+8Oi)*4h@j#s#0 zVey)#t9I2*S!x}cz4F$)rLcHC*spW<{k8Izavgy-+D!QA_WY^Wb#qD67H14dld)># zS?3MB)8_MkHSK;!sb!%r&2LQ=mOA&IX)TC0?;>98u*q1zkUKrQ&`FkPsO;H1N^PD& z-%VkxKK&v(oqK791+?qnENYk)i}BmD@Tfd8EtqI%rq%aPG40%5k~?>Ii(+~VOLR|K zZaH|nd3J$jJL^QY9ly($=R0(&gdORAWh~oXWbnr67*EVQAMlUdiF&Ie zzKmOjPEyk6QceZV0ptQQGzk&V_NpD>sZCOT=W3gMh+J7%( zcMvz9|Gj<30>7!KW9;@ld&a(Atn$i?4r?0RH4|sT2oD2ij5?1Ps|H%*vh6R)BD`b9=sJVe;y%^AWj`BsB7>1bm~kS|$OQ7KsPJ4(9z2=r7T0;? zgzMDXS!mEB4s`8)^Azr4xcHsx7hE=54a=J^MReV3vF!r+mO{`<)dZcZD` zhA$c`W=TJirfW~rAO!$!UW|O#&EhX+!gKfT{g0z_@n`b=|M+c&ZNxUz z#;TRE{1nFT0f{&|AxV1MA~?Pq2b~J9*g*0N6$~PIjC&$eQ4*io`IM9vot$Yl(kN!1SjfQ9!yoUCO>oC5Y<_=90c2K=F>bDX=<=-g9I_y-?O(&t!@79lVUdJ4B6R@;iI3JiT{t_}YiV_|3@+zMDRNtA9-YehzvN;johC5^{ZTwz5=br`he$;pDRN`so$d7TU=rQJp~t z#Q9I0aYppRaa<6{Vf-v%PtN^IZ|@+vW93uli?6L;{sVf>$wgJXc~0;O;X_s0w@Mw%LP-Rgbsxj(8Y^bBaR zHg`D7Ep(kz#jS0I+1fQWf3+Xsl$f!@9Ilj9_%Z0lJPNft2I0~5z-r(W7bBG1_V~#z zh#QzfiUt^Z5oFIyzW_useheRN99_~`IR+T4I%TM4)4yso+ zBx#2azeP$DmCUL$6=nd>O@=L>RS^4_#yVpJ-1-5A3zKb-!mup;p?&Bt^cIV5 z#bf>A`ba1=fr*!=dfvLlLK^s7_g2x_%$Kp8(aY-@_|%5@=$K@6CAJ`68ZN~00{!F$ z__ncqyf<|?hw~|JZYdCdR>{at2fDuiHswWPk@Vuwy-i9t0#5{H9TD^P< zy1or8#?xs{a=R7fjX;7p(p8ZRi@5TuR|^V&sEJ4(kf}J|N`Q^Hf$-cds?5C*2!v0G zpg{?;3?kC!&0d`s)&beE>h9HO3BGvT;MvNL&Sy}l2(hXz_nU`lYed?Sjg=5<&gA zc?#RsbLPllcIzmzKWTMP`NVni3NT1o0h&!tC+TAd=Hs~WP16*&0AH1r_RRe$(MEYv zCz=O(@K^;op_f^Yu2L2ekG>bF!fOSjKV~VR0jHmxMu;QMjb$gq2Hx+w_66bh=Q{PgKfzJo<4jY5+7vYZtj!9)7Tdyh10}P}FLOq8 zTsaE*r$q9q^5U0GF6GZSdDHl(d`f-~pP?$Zu|jjTeHe3I18%5j6AvOKfi0iXPurXM zQ>2`ii7Yo9gGpd~H6-iLe!|dWP89n7HrBJcjBZX9Yrh1~kOypifjjR-Fa1l`K2Wp^roQ;`sRuA9^m zIT~kH*RzYy3l34J!jzN)&~#sfVg)in&c`vkU6*r6~*od6^&4mU<}5}&l;nY^C9D>@<(hIzASRK{xI%S6nv8uoXn zZ)4@51k9BPOfHcR8H=u5K$BERSNT-O8^l(V>;gti1p|0b#t8(`=#Ke7G6JL4uvW#l zi_w`xCg$%NP_bSe8F>sZq0|hW*80_9Qd?7boc&5KpUvy7rYWyHxML7GzDUZ^V1*}l z==CHmtM)#+ibcxRP*M_aWx*^X19x_15}qa;zKcHWu2s@vDOMOA5IP2{5iC` zbOo1pNFQy+w80EQ@_I!zVpX)Fs}m2=8`=4r-s=Y*LLPZPJ|uo_YfNaBQm?G6$_4&b zeH=-~qUk&mN+ma2Q2RcaLJ|Je8%} zq&Z=FU-;KS1tZPRf?H}dHBLU2u9+{ueU9<>|dpS_Ec{H+=C~}UB zClth1fg{$rc6*-BMvctvM8=Xq$IKWV-Pd+-Qu2-$ zDN`?P#G9eeb{TWCmy&~3W01c6@xWxTu+Iq+^C!5CeACm;^9hQG2FO%KYiv2jE1KqT za5ge3SWZ)LcA~H{;DhvQV{mG!Cl`J|zr|p_9&b~o5crxH=W$H51PYyjPQMPhJ5~dM zPQ7^km1cTW!yrx6umI`s!A=3pC}p{xrWmVnf?7yecDAikKU_yn^Sb=IQK)waSMd*rWU*Slg*N5Rv9M} zm6a3gza<4cN(vN60*QH{dOw$r?-rdlyUkbLVJvXdw4lI0i!Kr>+DNY|f)ud6IA%LM zwInn$#YP;qotq#evL|7)hKmUP@Qk35(f^zN|fA8x~4P!YJ9w)Obx1u1mpAdBiT9PpInPA0KT zok8T^h8_K09#;>9pc(=}qRaBlzwdB-uNGCwnYVC}VssBS(i@~}a}7F|Ttn-kx!BY* z$}P4U=mxc2_48>9b4;xeJW9QC!|wfJslS+V)l*f5}{J57PsA}`> zD2{M(M984%BOTJM1WS*bu_}xRK_aK=Rn~#0&v$T(u+>m5XC7cWlAuUphCq&4;IR{S z(U)l1jfBow!!sDjCg9>Zv(MD4cYJtXj}_c@*^3LH;;|Clj5&bt>)m;WEYBgk!f1^m z+Y$I#m`P0F$6wk|2@Rf1xvOHEw+=_}aJ|Oi;ammlOxMk^pQwT&NY1Xf1T`6)IWnY~ z#+LP0MaGDB2dJHIHk~?WsfSIV-aTTmph} zGXEt_pl|*}fv;Kv%uh&8l5nvrb44~B0RwmLu!IfcJCOme} z3nB6zbW5HldN!Gm-453IJSDa|bfSfU9n8wlGi;Sl%ocSy-Gpg%un`lmfvglDT^jR5 zS7sHSzen4gIZf**xBGb00q17iHH-e-%kUDhPtr!+4L?Issm>gu^=I1hskLFQjvMK= z9(vJuA;hcGh?)&CVfw5wv(ZK+{x8JJ zU3p=ADjlMi40ANduW%ljPR8g>Whn+kzj&Y_3MT+84-z)v7E&(7Q&%}TLq&Wt7R409u#q@Wj?KtG4b)D~-GUCp@&0}p zCxGi6Bz}{;?V80Zp9vszm9Wa6-SCg{3@ZYKpmeW~iSTH@#3a(8c1W_Kg=D-; z5UC@XdBLsgsN|WMvDpEeUTIx?x{b{`9!x}aGvt5N&_MknyLZg|)RggIn)J_x$?G0M zOL)}hA>}1$T^`pD>qkjcy-dU;R-rXrgEV+Numy&*syS!hAchL{F?Li%X6B)yd6kN zp=mZUlk$x#N*VErl(8+?Cek=;>BdcNMcMU?&zJYYC4(J^;{5nmhhV*BJ_+J^SC3_v z1Rh*O@YrxpC9Nx=ZN&>MMhWC=a0>T0JtgSr^MOntSW(eTYtyp3mr^>fCe(rKnmpPY z#7;ERO7prG4^k1-M6q(a0cKO1;LJEW*QNDhA6Q6qE-?TTv|JFBEvCciDu9`I74}p& z;El=o872`ZCbFzs8LWIbM@(!rg&~awtq%XjP(6~F-T;HgstQM~y-bek5_f_&=aOTyz69OzhlC~-DFk zo-9A-dM_BmhXIxEC6Tv;Ssut({Y}fr&#OV%%KVi5bn0OOS)Si2&jiN`Wq3S#RU#KN z?J7X_R5M~%nPa@Nm>FNNh|EROIbL6yV|}QJWpsGjH#K%R%Ot8(3Sp5b*6`9@(Uy#P zutP5_Nm3jkb|Z=1o;^@OxpJhd>v)2k1_-d5%IgcpB=znr6D!(qO>%1Bt}pDV%sury zfDEkb$D#BkHZ+*u&B$_AE+2F<_iRP%pbQoQe4ZjnwPk2=Cl<^FO)R6Z)eR@s_0?NR zjCmrvHv^FAPMY~!wwG{oa(ThfX>3L$BxuiQFk>+pTy%8$PRFisTcCl{BUQB3ZB03W z#tv$4?-@~af|PtpQBoF?%;Zr}A}I+WkR`Ig7n@kzWGE6wU{#Rpjq%`okhmTu zA&Keu*^aLwWv|Z8@#99ryJ~}cphMnUSrgbc>oXgmF~97pDZXfMy(!qHK@U~XW0Iun zt(ZR@S?$s{NI}&#bZ& zK!FV7XJUjk%iKNM>no5*v-5K5n2PW(JlRM>r|pFcWICiEqyH7(>Ym)2RqN;T5Mf0; z<&*-Dsi)ABmuCldGeYOZeaB@Kac>KHyUK22<6Gx0|0A?=;9m7Q{$0g{U3OXRNYmKc z>AM`tnrdBoDVO!Acr=1jK2up4Qj}5QC;5FbZ@T?jU&fz5{{eE}=O>mY%r-`Rj*96u zP9IA792s_qy%F-mrRw3~{-v7ntlG(q<````73am~EOk>EYR0+EAGuVu;j`>zalbfY zO3%*6V%JZn`U_~QVP+HjA*MxPHp+0$1}((_{^dlLBJu3*9NqKZyQ2#ck#WC!ji1Ey z6ls5YnXB}R=NkLM-W^NZ!8_D`goA_EljFMq#|vk;)eG!o#oE1qu4e0i&Vj^+N{qhE zODoaWPeU%_-F6xJ6_GZK*3cNom4B+F$DYloQu2Dv2y31d=q1ZCJOp0Ct3tIOccWc z6I%UTV~-D9=1dJ(nw6;*U;FStEFyf%`PI2F$=~gX(ZOq4W7JveC64~-zLeM-m&-Xz zwQZh+AD2I`Sx=T7Tz_${GVIxr6FaqGu}gQ%eQRsY+tjA7I6iQEUsc<<^PshBrumcG z^Tw}s^6z+t+>cpo)rGC>^0cnh{=?gH<9m)rO!u{agVObNnkQ=3p2Z{*?r4`o^fyJ; zFcz_YDloy>8~;{}9M5*Ov~m7^z3$%GvpO!vqwYA}fBtlGC*lpEsxk1vyGbhn<&DEf zYFt7}&QCtbs&mg%elV#^bUhj8)8?w~Br@*w^V-aa>kYH-6{jCv8Qby|ESy}}-ml!1 zxz%du<`TTLT>AXIe#g=I- z7sT6lA6ksanba7##@fpsg#64fzP}jU^*3*)D^_Xup_VREXDC;rSo<&SXZ+Ol(+a6S zd>56{>c4-oxcubPKPxW5C3TAdyHD<}MI{G4TJy8<_~?V%+#8sfUm=w1#CA4U)n)zj z$ZzT8@ylZ(V}?HC?c5frgB>m8oTg4%-j}n_n~iTQ{UBKxt^CX$(^azytbLa&SYFZg z{qF~Bhk-hm$xlVCen-o1oc^0|*X?kAi-x*bPP@T97xk~T@};kH%qwn;DdlL1M!&nw zqpv{q4VHaD1KHO1?d2KC4OuG_W5XVD34?E)^T$Bfdj2Bu#S;8CqI#wJmL4A4QDVJ| zPX2hxJ>YlYT^kqIsnK`8-^5g?-BmfLt<=w18d|vA_;JCH`!D zX6;)N>d^k%Zzje`sm(R+7UJS)Qt6ZWgDr$-@ycy#$L-h8!8f*aIrsOatzTN|>s0k$ zaor^n>2vf$PQ{4hPV-*iktYGHOp;!h``v{K_se#Mp{{lOvrE1wDIqoPBP(yt`;64l zX8d+O={oo?g&p5I;|FsOh+Uejd7D#ndDWabd3idK*0}ee^<0zUeX_|Fr;x_^>RL75 zgXlF^kK2OWtz!rNbbOUDN1ykqKr`oC zs%?>0UCHA9v4CvnKgQlme>(isE)T6)s^g|64T@wvd*73H{e>GOsd(w9LSEB7Hoo7>ZOTn#Yd@8MWnxmf-Hhj1=7NIgF(AyMuW^uIg z&bz`W4Ec^O=Rbh!UHcF4ex%v;H(#fkmK_`MP|;Fg*PDuxxpW+x)*Z2zH^29jwb-1n zRG0VLrfAe<+ID0&w!McP#=18ta;mM6Q|<3GvFn;rzE-tTrL!^mbzx_6t+1|w8(R!M ze7j*q^}Umon2W&%hKwVeU80jIV1__sem5x<2u|f1%nE*FS^-YGAD__Z1-`ZFRJgY6 zgTj)36D~zw+3Df1d86KOC`i%Yk2&2!`~Lwryr|6Lf=1*-FDp@ooz-XeZ9|ffJOuV& zgldgA!lW=T8a|)9ZhKYP=}7 zR(*2eq3bqcO6PSRc82I@8bj{=*W=qr@!R1CK38+QDoo7pTeonDSti{*UAk(UcQ;>E z?=ELgq^%goR`2pDOomOa6k7XnDjTO%e56{-`<%%37hb$LRlaN8zVk}Dt=(wi!F54> z!I}-Df#s7eZ-3|X46e0wM`-N?^g4win|hA)-rY)3v6ig7uD2O|{rUW6$>Gg2G)r67n1I z2}=N3CDBHI1ToohJmb>a8URp?7V3tA9Srd2`{-|dJCKBru`1d>Gr1u(kg!nDV&$D` zJG7ie@iUmx1t=IQYXZ_hoBp`NpA%gx_eybS0G3bY2iHs#03O57!EwvZ9MEsaJ8g=- zfRw}*?;|wR`0-4JUI`oNM(*yVJ^Go9>B;LE{_sG;x9kHxCA^cL7)`*C24ykD1w*G~ zy)efN-qT2wTTUn0J&!P78lfNz4+;{+(}=C^29kNk6)8K5s^dn{PV$!w7rBBb3%n$& ztjUp&3ApUu=7M)10GF>MI+b%f;wRTj5FIw$havaJ*m{I+T4>8t?-;%H-*7t=d%xas z)ikx86KxyG(DH(pqUP^rFZcW9IQJjfd6$)cicE{e29X_AY&{D<@S@4$o^sNbWJ9NS zGD#XI-?Z8Qy?~nWCo3En5vb;;@!@zB!!TV`CNlLTgQTwLPQ>tqiQcIR$7|<-xp*>t zG=j%gD|f`;dxFl~%jAPs0q}gV@YqcJ3R+4SQp{&_g01MrkeXH5sZ7-J>SyQ2zb6(6 zCLEC@lTCAWQ0U)Q>KCqiD=9q9Ptpv$98HdDG(AIa5p7ZN!^kQLq2e2pw)o!NRq=DN zDRWn{YfBF3pfu+*NYdRb4O=j+on-T|6lPUx@e_(}Pu?#MqRykE4qfe{STV$!QoR_r#r{NigtV&;n zm1|spJ%#gofOted*;)C)EH-Lu{5s|FRE7}>ku2~1=@v?+u@X);KEBx3ouPCsUo)xC z$YP<7CgX3=^%(|*xstJdC6GRs_?cm0;YN;F;#llhRwaHfUQ>(6G>poSLReBQO$%yy zkS}8#nWgYJexAO(J>&EXdKnK_S6Ys#z=bwDBpoD-zl&V|!o|lX;R<~m#uVQnc(R1r z^Y|d5EBs!vHnzQyQu?{4k2S+qG9jd?3OSF2RMA$^KgDuz2*+QU(^1<=c;}q)6ff;< zXoIHq?j@5q@BOXqB>=6PONt$j|AY*;75zeDL@^Qb7=sTooUtT_5y4(j^#|nuw?J>n zfDREcM*Uvm&2%dka-K|coabucy$Ii0$=Q5R`E2auT-UuBz@F?VoN0yuOxYHYRGZM3 z5!eUyv=26~EBqWYB|rX3&6p<@{nfjC*f)) zxp7y{O%fypCpoa=_%$FHz=psS0n;*@zGObNw9cb2vUx+x4dDXK;z{eoZ81WyBBu70 z&Ybf|DS*pITY3VrQCy-X=E+_SIjY{k`ga#M*}AEOFGya0sJ;2puB*^LcaJ`htRhGP zZ~7$5QTldK#&eyWEL<<120y`I!Ll)47foZo#p~%IicpK$jdqzYxOc#-SvzN?$4S3p zJQ33gvRB@rtLM3`4Jm})oHWr^hqFYXd8$)D_c0di_bo+u_z zJ{C_pRMmlZ$XfiFopO`S)WQlNSlD6VNDyg?qp0HT=aqEpD2gR?9cdfHjqn-T*f-)z z%u;37;utbMOhAbedQ#((UUrY2>B)&UJAdAB+go;3TbMX-&)}W_Lw>PJuoq#|`W{x| zZx=tqz@Cf&yy9PulA(kI4zd4fWxUBM?{mx0=_L2y#<5oB+Ic@pr{oBQD-r-Ol|A3` zQ<;JTgUEziccDd|pN&hkcdD%lfxLd8dMBh}Q!zsvN5H&kz3GrjA#rZq>xdUP~Gd zL?yEM6tAG=RD;baG|WH>nq81z;5GL;NYKp=4oCZl+A*6(r}~_@jpN) zNPI8F>p=-)zPX&jH8S?e{ObO*g^16Rz7n18q)frnShO%Afe@(ZM@52aum*FDoSG=xWP=5FZefH_q6&5Q%U+tCl(h6=~NdwkDo?n|E3;i3JdGKo#{>}<>K_#L zlW>M*gc%!JQ1GS}b~x?mDA~6SQ!0chHPr|&mxr*>sYMH#3UNCrK~i?XGLHcy14LIM ztDqMLBV^uoTN{mBOu&sNDnbPP@EU-Ug*LBt{*VyMT)~ZEv9T#Vl-Vp4+c1Y3Ozu;< zgnbJBkdtF-SNPCCUJ)ObEqc%8ikdQg9kZR$2FwKp6L=LGE9q96#gU#Y6=+^yyuf!T@M5Kc={Pk6CYQ5u;aVJ{>K42GRv z9r5iyoYj?_&Be&_qI~!3$D~jFf~9K4V?+ z7VMZBn?>pgJ;@zr59)63FLG@C5YU{l3WLt_jaq&@7$wMCz9>Qj!@`=H8xwX4$i_st zqII-`O2$4JNzk|e%%zkBDA8yPq@!m@((52RmC%bMbo{cQ9?pt~uc*@g1AKN0JCgUc z4^B(W9r4`d-0yekffr8~=)GxqR6i4I}$H8chXuKxZRVM4JpR}bfwmB|GeR%mnpo6OIZjxYO zHHslr*)2qmeUhuV7ow}#&O^&t6)Vo)jLDqa*Wc(A>z8z7V*=HoeW(Zu4jNxQ-)dW-$`LF zkw7{k9~43`vY4*T+6uN_|M-LWqEzG7vTzQHkgbIy7pn0&Gn7(;T z`zUN_u5dF^BG@FN{5_VRyov22Ga+>3f=bk@Fm5Q)jpSND#Sv^sERTH_^F|OI!eQmw z>=3Nf5|{***rKeatbQL;&vJClqqY9y$u30-!j0Jvs`@Wtbl!vY z3SWz@&@D4sMM1LCBmzk-jsh2i8%+Mn&XR27;(Zyb=?anY!m?7{-M0H_8ai(atoV4AWDnP8DL|Q@0>~5i^AT4V#<;~y99wFNYwJ@{#6(l~GeKH0$=lz5*gvkamW*S5_xz&utY`Y8 zk`bJ^8g-}%GQ)1p_~U~)R6?Xe_zi`AO7VL+G&MWnEOsgb(Hqj;;hLF?ad59-r1ZsO zO=}l1;N(>f5uUY=w9(WO@*agsDHZzYytV37@IyWuDpg@-aV!54eOpsP9YqkfDGOeC zs4`6EPaP($xGg zFXcsQe5)-3BT=L%f|vFC^q^y=-m&PO+O45ZkNTTlYJ{uq)iLW zPfrK=lPCoW--8GBV8!zu9P#HBm-d_leg#Ynigb{tCMMzBdLQO5hhj!^kqm20rV7`lN-YGocY8^gQlwg0*4ViShdJSj+LCzhJRoaV_LbRo-N z?)#<}$gOXpydKRN%`jGal7Z=jdoJ^!zo|SUu!q*kbS171<~*Q{SbuXA zpNPhYG+Y6~d9^%pbZM(~lPx~=*?OPo7DF3|!nj1m&5dM8$;U@QVAPE8= z`4w*8C%dogESERW$XvN7N~*f_$cI={YIk!=J)s;npn{9I5OJ&&MnSZ5*=!$&!Yf9x zTA?P>3!Q&Ia&rjB+HVeC-77gRbljS@bdj}7no_BL&=iLAZGT-@8n!I?u<@PZO&2Fp z?n<>pRr#g5jO~XU2j|G0h|2+e2~PGdZ^y@~VeYhnm4|k{) zaqJC-Uq2Va70Kt#rOdFG?sPF4a+Z9TFL9Td_O!xh?UeJglGf1&(v@MV?6;fMIVDQo zrOtEI-!fdvDsC9(XLbA94?(k7Olyntw!t?QS`Imwct=R&Vekx?8|d(ujSctsQxg+G zy#+UU(X#(*?vGr?-`Iw1-l8(08*68c_WnvCTm`b6_|$m@)gW2_T*!Irg>HS&02C^jwyEAf z{)WWw{25(~+z+caxxV#M_60+g7!ub_fAMYuIu2t#{Jwq3ONIZIgg^&x<1i#7wyP~P z@93ddwdNPScehzKWXG>p?3KtEme=sm=0EkA+|!1SdB#aw+z#LRzpd`!vDmskDEfSN z-^S+kGYD78lC)Wzw9WaiHuqu}NRxBMl4%R|(!!>cY;YVhRFw6$|41qCZ~RDo{*2|? zd#0`LQOSClZ>f;Z`K`6F|A2wUylv;q;(rHzUTZZDFDa_gkCP_e@LKl%_5Z6PXs_a; zv12gq?9_JdVF)+5Von)ZcG9BMJKit8uH~F|+3l;U=j4Xw!(aNOh4eG$IL{`0bk(Qo zMmMGsPfW)*2e@BdQoB^qsJDxZrq+E5uh3B!cbZO=zVOcO1^i?eDc3ENOE!~CADHM6 z(U5n?qxXf;seiqH2ATU5**z_>|0CyPuH;xEW%HD$p|;cHL$N#4P zztc*zA>#5MNC}-b6~6YYlB`Gpq=igPQ&N&Zu&nzB#2jqq5S#Jb!$+P;o^Ej$#aR9| zBdirg0M@)V%kO|@%f5SnNER(kvu)j&ihR<(j#Av44}xVJ zuvLvf2mH|3!sl|`sZrg-VCR&mlZ{D#nOF5Nnb4zOz7MZzY==%=;NCTb?F^7r%ZKA< z95Fb96?|M;kD1iJb9=JsM{b-g28=oe<0q(e2e@{EyLS=AAFE`a zY!?KX2gtabNi-LyMcum({{usri<`PH3pn5Y+OJw+tx#MgcXg%WTorvZM6sXY#?<-S5BB zLVaIfJ#PMEx2T5H6tt{;G`hw9sDUf^ELSe*)BV=vOx4$~?UvY&n+3yfuypvdL>yeQKVpU&vWlDUBAurNU^n} zUb*m?>)2oMzcM`k`pX`C@pd5VjVK4ozG41zG2OBl#dYZzcDQ}S&9wC0%6or@BeXeR z8@;a-tMfA$2~)c+-T>r$e*(DoW`Ro$V9So`it9^*R75JACs9&Z%|tJ<2s#iDHHi+L z2fDYv=-wP*+BHadW#!EsdVr$xh;W;q>*AMe{XZx?)R4f3rYv%n1xKYdA9Pm!6E_ z0zKzLzP)8W&m)-_iYGU))suc*!8hl&S`}5XgO)8`$j;|R0;s9@U*6{;Q3a9A$c$!YR#mK+nxaht ziw9?GAEblL(=4&P zi>Zw1t&FV6!CYd^>Wm0H(60*ry10p?|HGBatieg~Fta;W$%MT?bm1(bR3d@1`WonG2 zhxF`T%SE-uMKvHJQNv<^AO8aZKJdP&SPq)KY5z5#jJJ}^8&aqw3g>17^oBgt?_GS| zamDj|ZdOSa22@hs0Nt92)3U(R$zU5s1?w}9$BFGkxDcOq(KL})DR`#4^YefTU&9pW zVi%(A|$yOo&2l0D-mMc<4_>y^C$D$uaTK1Z_f z{nqthfMVl0!3%F4BN)C^(;W-0l-9|X9x8#~kLUM5ty9D2^j`Y;D{I~9k7|{}@%n}V z@!wCD{#ducV`v5^UrmTSc6GhlDKLIQ1p+(S5&!AabTX)e7_h6X97tz+9V~z>dx;*w zylNTF@lF3@>$_ET!9ii+F>Q(>v-7b;`X;--Y*D7;T4xKkCcsIeCBqlgKo zYs;V52ewZKG>NN`0^GH}G829Vd+;crp}h4SNpL;+jAyTUqz*b%2jw9b9~ESPhX|e8 zbcLIW1oeL|knDY5*ef*er(psQfPM`qH&CRfkl^ZXL?5%Ryejnx z0l{f{?Wn|B!KPl05XkJJvLaDLe5L-1zgMYEG=g7r41E3 z$WzeyFP47P2crfdL(w=sT*t-+JV>D8%MAX`>pWGj5}oWLS@+cv<{IZ2q*NpYE}uR&grq+#DX zwS`LixTuTI`uYqR4vZMlc?jKma}IRVjY%6&ffTz~E306LHe(qkw^$(}2%Q1*^4Z`F z6^giAbFUWDD-jfOiM)kok^96_lVJ(j2~}_TJUZ1MLeZDB02u;$P*~7UQ9h__fjjzu zQTY7@&@{fa93gZ;F6knNuZjvf+_WJF#eiE&ctAuvT*Lz`;+1ok#w9nhITLrP0}QuU zyG4P|#!vC-qMf2|R~$-il2_@5ED`If8P9rwK7N5vIE50wd8bO%><~EXATXj{uV4sR z$9K-_=!`gg@|yM$W@D;KI5!+eOL#R3M<3t|Qiple6slKKB!R{e$!U^6a0rQ%p^@=k zdW7E-Y)idzl@ns6wgoFzi6(6*1u4bs4|!ZOzu0cy3LejF(#En4I}=z8da1T~-c2N!`87gn2ci2hg$5Lho74Cm&#PvUzH>1<%KuENRK3k-+p z?P(O($;piG2rlO|cOkP9nJ*rZ`6a_>;mHiVT?Rjf71}A5mNZ>|CGq&v%`VQkP@lqc zPwkE5&qgQi^uq$3dwEpI#Z3Vip6~FO3()*Dg|PD5K?x1W!$S*WP^B|??G^1OgI<5e zPP#5Qt`IrRmt4t)=iRdAd8S|<3{ARWJ~!{G%0jMJk);J-l->e%YI53lPXSO&&`%Yg z*Q2y5jT3Xcd2z-5P>>-*FK%+$N*&zX)qm8r;=)A@RuGkhViY6+bkAG0ccW~UCBbaj z$EFI{_vI%;L!dZGT#KM!6XykR_d2sOzq@aU` z(@6~b2t4rqJ<(ZwZBVSEPp=53p=bpisF$3Qp|2c3rN$N1;xxH`DBKule4Wo;XZgaxXQ21XM$CsTx$lq8D9AKpGfF5)+aAHUC#(%q%Qq`MO|lDQ`y!&DUbvyNhmi6 zNMag6aWFcF(n5%kgh&$$;EYr$5(O1d(Mbpa0Tn_B2uhXE#$iOI+9)D|qBKz{3Nknh z3{A!0P?GP={qfx&=kIx*z4q#B?e{&$iMlmA+{$UMo=tCY`B?9dkyzV!UAw-a%h!a! zX=9s*@iTEdD1ad_9*uMQ=|JVqH?QyZZ;0R?;}+zi<6GeQk}M()6%P5cm9NHel8VF< z%+?iQ#zP9+P{eYy#ef9_!NaSd{mJn!HrkVhyWO0F?2%X7ZkCH)8$r4NOpvc4=cX)D=?mx}@n?fuzc%#C_Vzd9?oD)`uTpb=lb#|_tFEs+9P?PCml z+JQ>47N1^tE8J(6bpH(pA3Lve7Gw84a8Ya~pL4Cg+Jf@fR?JMWdyv}ssxN=>tzU?l z=QLf%M}o%YD(?W}tR#}83NRMgMiqqDrr23^`Z0}8fGjUWAP%v62gx`{L_6}0KI2sM zXU@$+$y{w=AEMDZZ=QPTgxVIHYvu_y42^^lUED%u;yZ=q{TF++t1QT!;XY!#2tvH; zbpcA$rBd&$XyLqYEb`BCy^M!&DLl@kqRD#X1G~(J&F1g*+N@v8ipAyOVYu!LThBf$ z&DW7lLmq~3*$!`hI{{bNwV156%(Z_?i^-cNS@=D&@$i=$gKvzk=)3@;In0rW@_=WO zKFbMSF^x-$X`ezgG`0u<+<01bO>ARkQ`m>bB$#Prb7uOpnprv>$(CM2aivMt!Z43|v@I>7At6dyk*;D7B zL8wbj?l45ik|4Jg^L<@gS*5RwVZ2lYI7RzHz2xXO!{n7|{g}kY>iuOWba;&1fwsO{ z4{r5veHn**Hv93(HctF;j#$LaPC@J#Erf&=mexGiLnnW7g*EwA;UR`?r$4|=jWIl( zk>AQn8m->7iD69(58;rhhq~{KqXu7VNvidWj60fl#sH0vdPvEY0lTaQ*rQ-@DpIqPW&U)*c`+(RgARQsv3 z)f28gG&h;L7(lkwF&wj)0V~g=T%b$6ZLEXkUb+>-&>~>PI)^ECRLv}Om822S5%fC!7x9&FSRKMO- z-^ZT0Y*Cy0g6OvK@48@JYVji-W zR|FJH1G)2X9VjZ5qPaXlz0UNFpA}u}|M@MtAL}B|)No^&xi>$z$+mnRt53LDNjDId z8aC>tDPh?2Bd*_RPeJeE?Y)Hb+~gSSpSf_g{mPZe&juX^6U*cpCktSM|J9NAWTq}G3c%@p7g}@q zQjm$d)*L-)&@a;V1su`rTy<*WvXo}bZRjhO%f5LZ5aF+%FP!S=jSm!T*ZbBvDwM%1 zj+fpCqtTrm`AFQN+o`jeZ~V*yY6ij~pRnE@ZoN<1p;${B95F0)0g zY=74yu&GFHT0h>r1orQarBmGBpH^0zDndo(XLdd>^jO&gh4I@&0r(_4^IUc}3dA4l z5<)`m)|Tz7pYXb5;9ss&RSZ$1u#GYr;jOyrp38?+z`?icw?=<7y?FH7HWhIE0>;xJ zvh-FA`ONI63U8SZDyPZkt#v{AW*km>R{qoV(LG0l6bb!w5`+H)Zp@P778-So7dMNTCe`R<9((I;0P4k7WaN^3Mt`ArJV=A^s}J=$jw>_wPfJOP2@e@+g_aHqtRl? zSO4|=+-+qf%}g~q8`dOZeV)sh@l*ka$JXzktq{!LRsmc?6;L;R`S~w>Ov4yQFrK(c zA4^h^p1SZg;nj-WJ!+T9k0LGWtS;HNYV$4TG?q}*ugi!<(b;dmI*jY6fY%RHKv&d^ z`%IN!>1xs1pe^Q{z{`&*z59eOqK5IZa_0b`Pc&j~M?>4uHr346V`X#Jgak zt7hODkz!sRnN;N;TK`rrchQapAvoaShQ{alig@K66`fxtUNDTjal6LiSptk zc`~OLx(UUNogd!AFXE;%u%#($Y4>P%MncPT9L?$8fp{S&Aqh$DDpE%F{yCu@PJvhp~v}D`POx|d6{$UEK zZTKAnp$Ja6&&Y3YT|#`jr2=jpR{>V>X&GzBion|&RlfPY`SVNZsQ0KBc`rNejL4C; z-~KmK`svNuA2WAo9msjFL^`3Ij+MzOV-X9_8S|Vk7gBK^#LKD858tl)jVZ21PrVj^ zyodeC&HrpeR(`nWCrhxPYb%5_X2mu++Fj^~Pqf})h!B6eK8my>Er%1>9InhYg=b2V zu)+4!Wc2J0D>CI##oT9)h4-f4zya5Asc6f^SYLSUv>&JNvY3>J7fWqYIPHl$Bp}4y zKydM@WscGFgHpW=9*1fls=KMh^n{)7Z4l1qmc!aLeQi+FZ@&OfX^c4=_<}#2t?t83 zNYYA`qM$)d9Xw~0$R?^IGUr?UuxwbvBWKXg5<6P()a|ZmjF6GBtnI_N0O9%n7t~8+_`567iVMrMHI(* zlw`;Z>RsxlzKHZL4{b~V5)d^eV*lXtnipq^dX!y-#u<-`RyfMO*8e0&zE*G2Qolj) zzOhWBnQQ#*Y?soB(o*m1Wwd_Y1^j`!sLgSSDcGL zbv&T+H)y%s(p97J%RLbz&Lb&*(VuJde)eUnv;8~*wOO}X+EQlS^)>iqyWOr{C6U|m zP@MN#je`=Eqc58}md zuVrkeg>MXNIG|O3bIT@fDw|AGBNOmfs10GT5p_HD2c^pUx0OS$XnYm$=8X!N4slmT zrX%HAcbb+Add2f6PY#j(kPoL=Qx|mKEhFf>n=c~H?cHZp{=~v@SS;ei9#F?;0g73h z_KmmoO_ws(FJJJwy)veJ7WA+2itstt_xFh2O(&1oFqrq6TJ5W_Op+v?gxU;o4gb9~ zG)#-upxz?u1_$Bzl|U-RjeRBS$+Qais4aNipaO0*wMVSZ3Hk)9;UGfjFe94GBhXyk zBEiOYaXph`l8W{3fG5(eHw3_I&$F3npIi_2>Xfu$89bI)vb|RP4>aiiub=X(vJRY| zC|}MabN}8)4cDUIY%pY#)EL{WvfbrzbZTcNj41je5?^$WDLdHDc4C7BX%OByBNk?u zWZ2EVegD~dpkU6k{n9+>oVXYj5HSY#zD*xK991GtB5&~Y%41k_M5x>=v5GwOG5;qT z9w@%n?Gub}S`o#@v?vdpw1XaP@kc@5X%+C}>C}vG>Hj*(f4#q#C77&-#_y{p)F;G6 z#BsR6dGN|S-9)>|{6&SYqig*6<90hu55FfBbEuKJqdS-1aF5G>hgcAl@HY3HI9qshTcmD zs3-6M{yd8Tdoulis=QyJ0(Kq3?vIOCHZ81%p52_fwc*igv6VbqOvaL7H~Z}M0K}OD zB30dATtA$@{~|>yE-RK-!bsKADQu%uUhX`@L>yJ60)9WOyr%-%cRk5o2Gv}iF&8f~ zd%`Pw>+wf8N~_*OBJm=hm_(*p;xpCle2lTfUgZbsjAEPqLbBoHeGtn`5;HjzfuS6C z`Ck}F0Ru4d(E5J_Ut_;-KFN_)vk0{(+1|9`Q^7?!6v=9D6DQ{4 zB~d}*uUlmwb8aBd$+JO%`xx40=tWlgc;Wj+&Un+ht6;^)74(m9_4OTMZm*kxBCB(U zd(T^acx#X>y_s_mTRiLqZA0aWTe>GZshg}bEvRQV@ORYCL9|+1yE=wCNO7q`Yw2yJ zrV3d1ZN8UW^tfl;Km|02%o2Gyt$*!|HJe|OWA&$ixE93r+BjV;ez|Dll9jL=U25i< zz>@3Ik))~Jxy#$ztCZC}>rSAV+3vZva$T^JwO%=%R#5*=D@jkSvTE`QiI0k5Py!ij zp*jnalCEJG4nlf`jaKBF`*1b+G5!$zdT+eqN-z#PAn*dua#}f-((~cydQg!fZ9Iis z{(Q{DDxY(X#+B)!>?nhP_WPdqSH?A;p|;iy#+V0eFyr5pU^N)#Q4F+;zqX?}Y;Z)B z(YUOX=_q#{PZJB;A{=HwQ?8pwR!Ij!-0*ZUIyvnTo&*AoU7e)`Q00S#Qpgx1fxC@!Nu} zpi+BQ`Uf^lV|k&)kAG<+fyUkNNLKW?@J1S5tKw8JtmvP6g^2G17nFrfd zz!Aah&!Cvz45NIU!g#jrdj9-jauRv*Fe=AwSsy6VGHQ@w37fR6 zsF9GTNml&_lZQ~|0BTDtkHrBvuV&At6GN5%@dK@WX-wggYODgpV2*pRNAaLl*ENhg z8dl#YtGyX3f|#F*t`DAr=SztQV|_XZq*SIQ@$v0KF?pogqDL6a@Gq@ zCaa2Zi~4>L%BLhEy4ZcMLtLfM<^8O)rg67kW+B-DtVcjpvOki)SH{g}taO0Epj98+ z3!++sjW4#gb01ef*eAvER+8*x_ZAtg3i!aM9)Q|(blL58GT%F9Ln z+{*X184@gk5_>t=sz*qMzSW|aU7X}%;d%DGY&d4M)i7<#`HgzAnf+{Oh3HLr{{h0& z1T{u342(QGQ|5JUPJOEcgTLTwP&>#?_nqjl`c*l20mB;6sw&2goB+P|$C63FgpfUI zC=YvR>eT&iMPkb(}JC8SX_ce>0(c3X+c`FUrJPuOy@6sJXRIRf}N_bJ?rztb6XXK*>tM;WIAE~fudnfPuHTzEv z>!$^4QDf*gg8g8649b0^p;fmaT=M*KJofx?ONNo#z(@qkF+X?NnCEl+)a&}gWSYqh z4)&LMVo#7|Akpw+g;M8$3h-)P>$^Zw99;)5@kWJ+Vl{A)A}jat%@2nI35`%;urUAG z!}*07`wjbcZVYj(?~NsMxi=3@yPZOjTCoh$>hi>~|K)s4`x%Fs5fyOH9nL8qVSAmo zNTQu6crjcIM0e^o+-2b18%_}~xyp-=Tk0~*Js;l$mW(Q3HPkxq z_RPRP;IiH`kvU~J^14J^OxU1C3=CZ<@782<2tPY^OE|XZk-Y&SNVnHkq+&Ghkp%8G zS5w(F>n@L`3qEcEt=?gFe_Q+lsM$xs;s);VB;b?K$eZw}QnQ>?)%RtdfklxZV-1MF zJt>@bSpzX#PKf;m4>x>U@D=yU3|lY&eoPnifvKko&_1+AKDy$zthm#vx9x7{PkUhd z%&MQ7HG1i$Cr;|0=LnfRU3fd__+DG(pmX}A#eY$Q0xYe5btDj2?k6|>0n2b4d*BXM aj7Qf%8dJ=m3TOpIB+ppuJAx6YhW-x^x>c0` diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-video-generation.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-video-generation.jpg deleted file mode 100644 index a449a4eee70b9fdcb52bf4485e0e747a7f600b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132038 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 z 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/README.md`). - -## Scope and goals -- Establish repeatable latency/throughput measurements for multimodal LLM pipelines. -- Provide both HF Transformers (offline) and vLLM-Omni (multi-stage/pipeline) baselines. -- Make it easy to plug in new datasets and models with minimal changes to the runner scripts. - -## Dataset and inputs -- Default example: SeedTTS top-100 prompts (`benchmarks/build_dataset/top100.txt`) via `benchmarks/build_dataset/`. -- Extensible: drop in new prompt files or modality-aligned payloads; keep the expected format for the consuming scripts (e.g., one prompt per line). -- If you add a new dataset, document it under `benchmarks//README.md` and point scripts to your data path. - -## Directory layout -- `benchmarks/build_dataset/` — dataset prep utilities (e.g., SeedTTS top100). -- `benchmarks//vllm_omni/` — vLLM-Omni pipeline benchmarks, logs, outputs. -- `benchmarks/accuracy/` — accuracy benchmark integrations that adapt external - benchmark suites to vLLM-Omni serving and evaluation flows. -- Add new tasks under `benchmarks//...` with the same pattern: `transformers/`, `vllm_omni/`, task-specific README, and (optionally) dataset prep notes. - -## Reference workflows -- **HF Transformers (offline, single process)** - Script (example): `benchmarks//transformers/eval_qwen3_moe_omni_transformers.sh` - Outputs: `benchmark_results/perf_stats.json`, `benchmark_results/results.json`, `benchmark_results/audio/` (if audio is produced). - -- **vLLM-Omni end-to-end pipeline** - Script (example): `benchmarks//vllm_omni/eval_qwen3_moe_omni.sh` - Outputs: `vllm_omni/logs/*.stats.jsonl` (per-stage/overall latency & TPS), `vllm_omni/logs/stage*.log`, `vllm_omni/outputs/` (text/audio artifacts). - -- **Adding a new task/model** - 1) Create `benchmarks//transformers/` and/or `benchmarks//vllm_omni/` with scripts referencing your model and dataset. - 2) Add a task README describing dataset, configs, and expected outputs. - 3) Keep the output/log structure similar for easy comparison (perf_stats/results/audio or text outputs; stats.jsonl/logs for pipeline). - -## Metrics to watch -- **Throughput**: `overall_tps`, `*_tps_avg` per stage. -- **Latency distribution**: look for long tails in `*.stats.jsonl`. -- **Quality/completeness**: missing outputs or errors in stage logs indicate pipeline failures or misconfigurations. - -## Troubleshooting -- Verify GPU/driver/FlashAttention2 requirements for your chosen model/config. -- Ensure network access for dataset/model downloads (Google Drive, Hugging Face, etc.). -- If outputs are missing or slow, inspect per-stage logs and `*.stats.jsonl` for errors, stragglers, or contention. diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py deleted file mode 100644 index 79917e818cb..00000000000 --- a/benchmarks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Benchmark helpers and runnable benchmark entrypoints.""" diff --git a/benchmarks/accuracy/README.md b/benchmarks/accuracy/README.md deleted file mode 100644 index dbe20916a77..00000000000 --- a/benchmarks/accuracy/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Accuracy Benchmarks - -This directory hosts accuracy benchmark integrations that run entirely through a -local `vllm-omni serve` deployment. - -Current integrations: - -- `text_to_image/`: GEBench generation + local judge scoring flow. -- `image_to_image/`: GEdit-Bench generation + local VIEScore-style scoring flow. - -Design notes: - -- Generation is executed through the OpenAI-compatible endpoints exposed by - `vllm-omni serve`. -- Evaluation is also executed through a local OpenAI-compatible judge model - served by `vllm-omni`. -- Both generation and judge requests accept either `http://host:port` or - `http://host:port/v1`. -- Output directory layout intentionally stays close to the upstream repos. - -Test guidance: - -- Local static/self-checks live in `tests/benchmarks/test_accuracy_bench_utils.py`. -- End-to-end generation/evaluation should be validated in a remote GPU - environment. In the current repo marker system there is `L4` but no `L5` - marker, so benchmark smoke tests should be wired as `full_model + - benchmark + L4` for nightly when GPU capacity is available. diff --git a/benchmarks/accuracy/__init__.py b/benchmarks/accuracy/__init__.py deleted file mode 100644 index 029ec71da22..00000000000 --- a/benchmarks/accuracy/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Accuracy benchmark integrations for vLLM-Omni.""" diff --git a/benchmarks/accuracy/common.py b/benchmarks/accuracy/common.py deleted file mode 100644 index bce0b235914..00000000000 --- a/benchmarks/accuracy/common.py +++ /dev/null @@ -1,199 +0,0 @@ -from __future__ import annotations - -import base64 -import io -import json -from pathlib import Path -from typing import Any - -import requests -from PIL import Image - - -def ensure_dir(path: Path) -> Path: - path.mkdir(parents=True, exist_ok=True) - return path - - -def load_json(path: Path) -> dict[str, Any]: - with path.open("r", encoding="utf-8") as handle: - return json.load(handle) - - -def write_json(path: Path, payload: dict[str, Any]) -> None: - ensure_dir(path.parent) - with path.open("w", encoding="utf-8") as handle: - json.dump(payload, handle, indent=2, ensure_ascii=False) - - -def save_image(path: Path, image: Image.Image) -> None: - ensure_dir(path.parent) - image.save(path) - - -def find_first_image(folder: Path, stem: str | None = None) -> Path | None: - patterns = [f"{stem}.*"] if stem else ["*.png", "*.jpg", "*.jpeg", "*.webp"] - for pattern in patterns: - for candidate in sorted(folder.glob(pattern)): - if candidate.suffix.lower() in {".png", ".jpg", ".jpeg", ".webp"}: - return candidate - return None - - -def extract_json_object(raw_text: str) -> dict[str, Any]: - raw_text = raw_text.strip() - delimiter = "||V^=^V||" - if raw_text.count(delimiter) >= 2: - start = raw_text.find(delimiter) + len(delimiter) - end = raw_text.rfind(delimiter) - raw_text = raw_text[start:end].strip() - - start = raw_text.find("{") - end = raw_text.rfind("}") - if start == -1 or end == -1 or end < start: - raise ValueError(f"Could not find JSON object in: {raw_text[:200]}") - return json.loads(raw_text[start : end + 1]) - - -def build_openai_url(base_url: str, api_path: str) -> str: - base = base_url.rstrip("/") - normalized_path = api_path if api_path.startswith("/") else f"/{api_path}" - if base.endswith(normalized_path): - return base - if base.endswith("/v1"): - return f"{base}{normalized_path}" - return f"{base}/v1{normalized_path}" - - -def pil_to_base64(image: Image.Image, image_format: str = "PNG") -> str: - buffer = io.BytesIO() - image.save(buffer, format=image_format) - return base64.b64encode(buffer.getvalue()).decode("utf-8") - - -def pil_to_data_url(image: Image.Image, image_format: str = "PNG") -> str: - return f"data:image/{image_format.lower()};base64,{pil_to_base64(image, image_format=image_format)}" - - -def decode_base64_image(encoded: str) -> Image.Image: - image = Image.open(io.BytesIO(base64.b64decode(encoded))) - image.load() - return image.convert("RGB") - - -def pil_to_png_bytes(image: Image.Image) -> bytes: - buffer = io.BytesIO() - image.save(buffer, format="PNG") - return buffer.getvalue() - - -class VllmOmniImageClient: - """Thin OpenAI-compatible image client for vLLM-Omni serving.""" - - def __init__(self, base_url: str, api_key: str = "EMPTY", timeout: int = 600): - self.base_url = base_url.rstrip("/") - self.api_key = api_key - self.timeout = timeout - - @property - def _headers(self) -> dict[str, str]: - return { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json", - } - - def generate_text_to_image( - self, - *, - model: str, - prompt: str, - width: int, - height: int, - num_inference_steps: int = 20, - guidance_scale: float | None = None, - seed: int | None = None, - output_compression: int | None = None, - ) -> Image.Image: - payload: dict[str, Any] = { - "model": model, - "prompt": prompt, - "n": 1, - "size": f"{width}x{height}", - "response_format": "b64_json", - "num_inference_steps": num_inference_steps, - } - if guidance_scale is not None: - payload["guidance_scale"] = guidance_scale - if seed is not None: - payload["seed"] = seed - if output_compression is not None: - payload["output_compression"] = output_compression - - response = requests.post( - build_openai_url(self.base_url, "/images/generations"), - json=payload, - headers=self._headers, - timeout=self.timeout, - ) - response.raise_for_status() - return decode_base64_image(response.json()["data"][0]["b64_json"]) - - def generate_image_edit( - self, - *, - model: str, - prompt: str, - images: Image.Image | list[Image.Image], - width: int, - height: int, - num_inference_steps: int = 20, - guidance_scale: float | None = None, - seed: int | None = None, - negative_prompt: str | None = None, - output_compression: int | None = None, - ) -> Image.Image: - if not isinstance(images, list): - images = [images] - data: dict[str, Any] = { - "model": model, - "prompt": prompt, - "n": 1, - "size": f"{width}x{height}", - "response_format": "b64_json", - "num_inference_steps": str(num_inference_steps), - } - if guidance_scale is not None: - data["guidance_scale"] = str(guidance_scale) - if seed is not None: - data["seed"] = str(seed) - if negative_prompt: - data["negative_prompt"] = negative_prompt - if output_compression is not None: - data["output_compression"] = str(output_compression) - - files = [ - ( - "image[]" if len(images) > 1 else "image", - (f"image_{index}.png", pil_to_png_bytes(image), "image/png"), - ) - for index, image in enumerate(images) - ] - - edit_paths = ["/images/edits", "/images/edit"] - last_response: requests.Response | None = None - for api_path in edit_paths: - response = requests.post( - build_openai_url(self.base_url, api_path), - data=data, - files=files, - headers={"Authorization": f"Bearer {self.api_key}"}, - timeout=self.timeout, - ) - last_response = response - if response.status_code != 404: - response.raise_for_status() - return decode_base64_image(response.json()["data"][0]["b64_json"]) - - assert last_response is not None - last_response.raise_for_status() - raise ValueError("No image payload returned from image edit endpoint") diff --git a/benchmarks/accuracy/image_to_image/README.md b/benchmarks/accuracy/image_to_image/README.md deleted file mode 100644 index 86e7b0cf328..00000000000 --- a/benchmarks/accuracy/image_to_image/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# GEdit-Bench on vLLM-Omni - -This integration adapts the upstream `stepfun-ai/Step1X-Edit/GEdit-Bench` -evaluation flow into `vllm-omni/benchmarks/accuracy/image_to_image`. - -Upstream mapping: - -- `run_gedit_score.py` -> `run_gedit_bench.py evaluate` -- `calculate_statistics.py` -> `run_gedit_bench.py summarize` -- upstream output layout under `results//fullset/...` is preserved - -What changed: - -- The upstream repo mainly ships evaluation scripts. This integration adds a - generation runner that uses the local `vllm-omni` OpenAI-compatible - `/v1/images/edits` endpoint to produce benchmark outputs in the expected - directory structure. -- The evaluator keeps the same VIEScore-style decomposition: - - `semantics_score` - - `quality_score` - - `overall_score = sqrt(semantics_score * quality_score)` -- Judge calls are routed to a local OpenAI-compatible model served by - `vllm-omni`, not a remote provider. - -Dataset: - -- Default `--dataset-ref` is `stepfun-ai/GEdit-Bench` -- You can also pass a local dataset directory previously saved with - Hugging Face `datasets` - -Example usage: - -```bash -python benchmarks/accuracy/image_to_image/run_gedit_bench.py generate \ - --output-root benchmarks/accuracy/image_to_image/results \ - --base-url http://127.0.0.1:8000 \ - --model Qwen/Qwen-Image-Edit \ - --model-name qwen_image_edit \ - --dataset-ref stepfun-ai/GEdit-Bench \ - --task-type all \ - --instruction-language en -``` - -```bash -python benchmarks/accuracy/image_to_image/run_gedit_bench.py evaluate \ - --output-root benchmarks/accuracy/image_to_image/results \ - --model-name qwen_image_edit \ - --save-dir benchmarks/accuracy/image_to_image/scores \ - --dataset-ref stepfun-ai/GEdit-Bench \ - --judge-base-url http://127.0.0.1:8000 \ - --judge-model Qwen/Qwen2.5-VL-7B-Instruct \ - --judge-api-key EMPTY -``` - -```bash -python benchmarks/accuracy/image_to_image/run_gedit_bench.py summarize \ - --csv-path benchmarks/accuracy/image_to_image/scores/qwen_image_edit_all_all_vie_score.csv \ - --language en -``` - -Example summary output: - -```json -{ - "language": "all", - "languages": { - "en": { - "overall": {"count": 110, "Q_SC": 6.58, "Q_PQ": 5.89, "Q_O": 5.86}, - "intersection": {"count": 78, "Q_SC": 6.50, "Q_PQ": 5.66, "Q_O": 5.65} - }, - "cn": { - "overall": {"count": 110, "Q_SC": 6.90, "Q_PQ": 5.78, "Q_O": 6.11}, - "intersection": {"count": 63, "Q_SC": 7.22, "Q_PQ": 5.59, "Q_O": 6.28} - } - } -} -``` - -Example generated images to inspect: - -- `benchmarks/accuracy/image_to_image/results/qwen_image_edit/fullset/background_change/en/.png` -- `benchmarks/accuracy/image_to_image/results/qwen_image_edit/fullset/text_change/en/.png` -- `benchmarks/accuracy/image_to_image/results/qwen_image_edit/fullset/subject-replace/cn/.png` - -Example score artifacts to inspect together with the images: - -- `benchmarks/accuracy/image_to_image/scores/qwen_image_edit_all_all_vie_score.csv` -- `benchmarks/accuracy/image_to_image/scores/qwen_image_edit_all_all_summary.json` - -What to expect: - -- `Q_SC` measures instruction following and content preservation. -- `Q_PQ` measures image naturalness and artifact quality. -- `Q_O` is the combined overall score; higher is better. -- `overall.count` is the number of evaluated samples for that language, while `intersection.count` is the subset with `intersection_exist == True`. - -Notes: - -- This flow requires the optional Hugging Face `datasets` package. -- `generate` writes `generation_manifest.json` with local output coverage. -- The current repo marker set exposes `L4` but not `L5`, so if you promote an - end-to-end smoke test into CI, use the `full_model`, `benchmark`, - and `L4` markers for nightly (or `advanced_model` for merge) or introduce a new repo-wide marker explicitly first. diff --git a/benchmarks/accuracy/image_to_image/__init__.py b/benchmarks/accuracy/image_to_image/__init__.py deleted file mode 100644 index 1b9b2d44df6..00000000000 --- a/benchmarks/accuracy/image_to_image/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""GEdit-Bench integration for vLLM-Omni.""" diff --git a/benchmarks/accuracy/image_to_image/gedit_bench.py b/benchmarks/accuracy/image_to_image/gedit_bench.py deleted file mode 100644 index adb072c0a2e..00000000000 --- a/benchmarks/accuracy/image_to_image/gedit_bench.py +++ /dev/null @@ -1,718 +0,0 @@ -from __future__ import annotations - -import argparse -import csv -import json -import logging -import math -import statistics -from collections import defaultdict -from concurrent.futures import ThreadPoolExecutor, as_completed -from datetime import datetime, timezone -from io import BytesIO -from pathlib import Path -from typing import Any - -import requests -from PIL import Image -from tqdm.auto import tqdm - -from benchmarks.accuracy.common import ( - VllmOmniImageClient, - build_openai_url, - extract_json_object, - write_json, -) - -GROUPS = [ - "background_change", - "color_alter", - "material_alter", - "motion_change", - "ps_human", - "style_change", - "subject-add", - "subject-remove", - "subject-replace", - "text_change", - "tone_transfer", -] -DEFAULT_SAMPLES_PER_GROUP = 10 -logger = logging.getLogger(__name__) - - -def infer_model_name(model: str) -> str: - normalized = model.rstrip("/\\") - name = Path(normalized).name - return name or normalized - - -def resolve_model_name(*, model_name: str | None, model: str | None = None, output_root: Path | None = None) -> str: - if model_name: - return model_name - if model: - return infer_model_name(model) - if output_root is not None: - candidates = sorted(path.name for path in output_root.iterdir() if path.is_dir()) - if len(candidates) == 1: - return candidates[0] - if not candidates: - raise ValueError(f"Could not infer model-name from empty output root: {output_root}") - raise ValueError( - f"Could not infer model-name from output root {output_root}; multiple candidates found: {candidates}" - ) - raise ValueError("model-name is required when it cannot be inferred from model or output-root") - - -def parse_score_payload(raw_text: str) -> dict[str, Any]: - try: - parsed = extract_json_object(raw_text) - except Exception: - stripped = raw_text.strip() - if stripped.startswith("[") and stripped.endswith("]"): - parsed = {"score": json.loads(stripped), "reasoning": ""} - else: - raise - score = parsed.get("score", []) - if not isinstance(score, list): - score = [score] - parsed["score"] = [int(value) for value in score] - return parsed - - -def _utc_timestamp() -> str: - return datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") - - -def summarize_generated_records(records: list[dict[str, Any]]) -> dict[str, Any]: - by_task: dict[str, list[dict[str, Any]]] = defaultdict(list) - by_language: dict[str, list[dict[str, Any]]] = defaultdict(list) - for record in records: - by_task[record["task_type"]].append(record) - by_language[record["instruction_language"]].append(record) - - return { - "count": len(records), - "by_task": { - task_type: { - "count": len(rows), - "samples": sorted(row["key"] for row in rows), - } - for task_type, rows in sorted(by_task.items()) - }, - "by_language": { - language: { - "count": len(rows), - "samples": sorted(row["key"] for row in rows), - } - for language, rows in sorted(by_language.items()) - }, - } - - -def select_balanced_gedit_rows( - rows: list[dict[str, Any]], - *, - task_type: str = "all", - instruction_language: str = "all", - samples_per_group: int | None, -) -> list[dict[str, Any]]: - filtered_rows = [] - for row in rows: - if task_type != "all" and row["task_type"] != task_type: - continue - if instruction_language != "all" and row["instruction_language"] != instruction_language: - continue - filtered_rows.append(row) - - if samples_per_group is None: - return filtered_rows - - def _select_rows_for_group(group_rows: list[dict[str, Any]]) -> list[dict[str, Any]]: - if instruction_language != "all": - return group_rows[:samples_per_group] - - rows_by_language: dict[str, list[dict[str, Any]]] = defaultdict(list) - for row in group_rows: - rows_by_language[str(row.get("instruction_language", "")).strip()].append(row) - - ordered_languages = ["en", "cn"] - per_language_quota = samples_per_group // max(len(ordered_languages), 1) - remainder = samples_per_group % max(len(ordered_languages), 1) - - selected_rows: list[dict[str, Any]] = [] - leftovers: list[dict[str, Any]] = [] - for index, language in enumerate(ordered_languages): - language_rows = rows_by_language.get(language, []) - quota = per_language_quota + (1 if index < remainder else 0) - selected_rows.extend(language_rows[:quota]) - leftovers.extend(language_rows[quota:]) - - if len(selected_rows) < samples_per_group: - selected_rows.extend(leftovers[: samples_per_group - len(selected_rows)]) - - return selected_rows - - if task_type != "all": - return _select_rows_for_group(filtered_rows) - - grouped_rows: dict[str, list[dict[str, Any]]] = defaultdict(list) - for row in filtered_rows: - grouped_rows[row["task_type"]].append(row) - - selected: list[dict[str, Any]] = [] - for group in GROUPS: - selected.extend(_select_rows_for_group(grouped_rows.get(group, []))) - return selected - - -def summarize_gedit_rows(rows: list[dict[str, Any]], language: str = "all") -> dict[str, Any]: - return summarize_gedit_rows_with_backbone(rows, language=language) - - -def _mean_or_none(values: list[float]) -> float | None: - return statistics.fmean(values) if values else None - - -def _to_q_metrics(section: dict[str, float | None]) -> dict[str, float | None]: - return { - "count": section.get("count"), - "Q_SC": section.get("avg_semantics"), - "Q_PQ": section.get("avg_quality"), - "Q_O": section.get("avg_overall"), - } - - -def _summarize_gedit_rows_single_language( - rows: list[dict[str, Any]], - *, - language: str, -) -> dict[str, Any]: - filtered_rows = [row for row in rows if str(row.get("instruction_language", "")).strip() == language] - - def _to_bool(value: Any) -> bool: - if isinstance(value, bool): - return value - return str(value).strip().lower() in {"1", "true", "yes"} - - per_group: dict[str, dict[str, float | None]] = {} - intersection_group: dict[str, dict[str, float | None]] = {} - - for group in GROUPS: - group_rows = [row for row in filtered_rows if row.get("task_type") == group] - semantics = [float(row["semantics_score"]) for row in group_rows] - quality = [float(row["quality_score"]) for row in group_rows] - overall = [math.sqrt(float(row["semantics_score"]) * float(row["quality_score"])) for row in group_rows] - - per_group[group] = { - "count": len(group_rows), - "avg_semantics": _mean_or_none(semantics), - "avg_quality": _mean_or_none(quality), - "avg_overall": _mean_or_none(overall), - } - - intersection_rows = [row for row in group_rows if _to_bool(row.get("intersection_exist", False))] - intersection_semantics = [float(row["semantics_score"]) for row in intersection_rows] - intersection_quality = [float(row["quality_score"]) for row in intersection_rows] - intersection_overall = [ - math.sqrt(float(row["semantics_score"]) * float(row["quality_score"])) for row in intersection_rows - ] - intersection_group[group] = { - "count": len(intersection_rows), - "avg_semantics": _mean_or_none(intersection_semantics), - "avg_quality": _mean_or_none(intersection_quality), - "avg_overall": _mean_or_none(intersection_overall), - } - - overall_section = { - "count": len(filtered_rows), - "avg_semantics": _mean_or_none( - [score["avg_semantics"] for score in per_group.values() if score["avg_semantics"] is not None] - ), - "avg_quality": _mean_or_none( - [score["avg_quality"] for score in per_group.values() if score["avg_quality"] is not None] - ), - "avg_overall": _mean_or_none( - [score["avg_overall"] for score in per_group.values() if score["avg_overall"] is not None] - ), - } - intersection_section = { - "count": sum(score["count"] for score in intersection_group.values()), - "avg_semantics": _mean_or_none( - [score["avg_semantics"] for score in intersection_group.values() if score["avg_semantics"] is not None] - ), - "avg_quality": _mean_or_none( - [score["avg_quality"] for score in intersection_group.values() if score["avg_quality"] is not None] - ), - "avg_overall": _mean_or_none( - [score["avg_overall"] for score in intersection_group.values() if score["avg_overall"] is not None] - ), - } - - return { - "language": language, - "by_group": {group: _to_q_metrics(section) for group, section in per_group.items()}, - "overall": _to_q_metrics(overall_section), - "intersection": _to_q_metrics(intersection_section), - } - - -def summarize_gedit_rows_with_backbone( - rows: list[dict[str, Any]], - *, - language: str = "all", -) -> dict[str, Any]: - if language == "all": - return { - "language": "all", - "languages": { - single_language: _summarize_gedit_rows_single_language( - rows, - language=single_language, - ) - for single_language in ["en", "cn"] - }, - } - - return _summarize_gedit_rows_single_language(rows, language=language) - - -def _require_datasets(): - try: - from datasets import load_dataset, load_from_disk - except ImportError as exc: - raise ImportError("GEdit-Bench requires the optional `datasets` package.") from exc - return load_dataset, load_from_disk - - -def _load_gedit_dataset(dataset_ref: str): - load_dataset, load_from_disk = _require_datasets() - dataset_path = Path(dataset_ref) - if dataset_path.exists(): - if (dataset_path / "state.json").exists() and (dataset_path / "dataset_info.json").exists(): - return load_from_disk(str(dataset_path)) - return load_dataset(str(dataset_path)) - return load_dataset(dataset_ref) - - -def _resolve_gedit_split(dataset_obj: Any) -> Any: - if isinstance(dataset_obj, dict): - if "train" in dataset_obj: - return dataset_obj["train"] - return dataset_obj - try: - return dataset_obj["train"] - except Exception: - return dataset_obj - - -def _to_pil_image(value: Any) -> Image.Image: - if isinstance(value, Image.Image): - return value.convert("RGB") - if isinstance(value, dict) and "bytes" in value: - image = Image.open(BytesIO(value["bytes"])) - image.load() - return image.convert("RGB") - raise TypeError(f"Unsupported image payload type: {type(value)!r}") - - -class LocalVIEScorer: - def __init__(self, *, base_url: str, api_key: str, model: str, timeout: int = 600): - self.base_url = base_url.rstrip("/") - self.api_key = api_key - self.model = model - self.timeout = timeout - self.sc_prompt = ( - "You are evaluating image editing quality.\n" - "Two images are provided: the source image and the edited image.\n" - 'Return JSON only in the format {"score": [edit_success, content_preservation], ' - '"reasoning": "..."}.\n' - "Each score must be an integer from 0 to 10.\n" - "Editing instruction: " - ) - self.pq_prompt = ( - "You are evaluating image quality.\n" - 'Return JSON only in the format {"score": [naturalness, artifact_free], "reasoning": "..."}.\n' - "Each score must be an integer from 0 to 10." - ) - - def _request(self, prompt: str, images: list[Image.Image]) -> dict[str, Any]: - from benchmarks.accuracy.common import pil_to_data_url - - content: list[dict[str, Any]] = [{"type": "text", "text": prompt}] - for image in images: - content.append({"type": "image_url", "image_url": {"url": pil_to_data_url(image)}}) - - response = requests.post( - build_openai_url(self.base_url, "/chat/completions"), - json={ - "model": self.model, - "messages": [{"role": "user", "content": content}], - "temperature": 0, - }, - headers={ - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json", - }, - timeout=self.timeout, - ) - response.raise_for_status() - message_content = response.json()["choices"][0]["message"]["content"] - if isinstance(message_content, list): - text = "\n".join(part.get("text", "") for part in message_content if part.get("type") == "text") - else: - text = str(message_content) - return parse_score_payload(text) - - def evaluate(self, source_image: Image.Image, edited_image: Image.Image, instruction: str) -> dict[str, float]: - sc_payload = self._request(self.sc_prompt.replace("", instruction), [source_image, edited_image]) - pq_payload = self._request(self.pq_prompt, [edited_image]) - semantics = float(min(sc_payload["score"])) if sc_payload["score"] else 0.0 - quality = float(min(pq_payload["score"])) if pq_payload["score"] else 0.0 - overall = math.sqrt(semantics * quality) - return { - "semantics_score": semantics, - "quality_score": quality, - "overall_score": overall, - } - - -class GEditBenchRunner: - def __init__( - self, - *, - dataset_ref: str, - output_root: Path, - base_url: str, - model: str, - api_key: str = "EMPTY", - width: int = 512, - height: int = 512, - num_inference_steps: int = 20, - guidance_scale: float | None = None, - seed: int | None = 42, - ): - self.dataset_ref = dataset_ref - self.output_root = output_root - self.model = model - self.width = width - self.height = height - self.num_inference_steps = num_inference_steps - self.guidance_scale = guidance_scale - self.seed = seed - self.client = VllmOmniImageClient(base_url=base_url, api_key=api_key) - - def generate( - self, - *, - model_name: str, - task_type: str = "all", - instruction_language: str = "all", - workers: int = 1, - max_samples: int | None = None, - samples_per_group: int | None = None, - ) -> list[dict[str, Any]]: - dataset = _resolve_gedit_split(_load_gedit_dataset(self.dataset_ref)) - rows = select_balanced_gedit_rows( - list(dataset), - task_type=task_type, - instruction_language=instruction_language, - samples_per_group=samples_per_group, - ) - if max_samples is not None: - rows = rows[:max_samples] - - outputs: list[dict[str, Any]] = [] - total = len(rows) - if workers <= 1: - with tqdm(total=total, desc="GEdit generate", unit="sample") as progress: - for item in rows: - result = self._safe_generate_one(model_name, item) - if result: - outputs.append(result) - progress.update(1) - return outputs - - with tqdm(total=total, desc="GEdit generate", unit="sample") as progress: - with ThreadPoolExecutor(max_workers=workers) as executor: - futures = [executor.submit(self._safe_generate_one, model_name, item) for item in rows] - for future in as_completed(futures): - result = future.result() - if result: - outputs.append(result) - progress.update(1) - return outputs - - def _safe_generate_one(self, model_name: str, item: dict[str, Any]) -> dict[str, Any] | None: - try: - return self._generate_one(model_name, item) - except Exception: - logger.exception("Failed to generate GEdit-Bench sample %s", item.get("key", "")) - return None - - def _generate_one(self, model_name: str, item: dict[str, Any]) -> dict[str, Any] | None: - output_path = ( - self.output_root - / model_name - / "fullset" - / item["task_type"] - / item["instruction_language"] - / f"{item['key']}.png" - ) - output_path.parent.mkdir(parents=True, exist_ok=True) - if output_path.exists(): - return { - "task_type": item["task_type"], - "instruction_language": item["instruction_language"], - "key": item["key"], - "output_path": str(output_path), - } - - source_image = _to_pil_image(item["input_image_raw"]) - edited_image = self.client.generate_image_edit( - model=self.model, - prompt=item["instruction"], - images=source_image, - width=self.width, - height=self.height, - num_inference_steps=self.num_inference_steps, - guidance_scale=self.guidance_scale, - seed=self.seed, - ) - edited_image.save(output_path) - return { - "task_type": item["task_type"], - "instruction_language": item["instruction_language"], - "key": item["key"], - "output_path": str(output_path), - } - - -class GEditBenchEvaluator: - def __init__(self, *, dataset_ref: str, output_root: Path, scorer: LocalVIEScorer): - self.dataset_ref = dataset_ref - self.output_root = output_root - self.scorer = scorer - - def evaluate( - self, - *, - model_name: str, - save_dir: Path, - task_type: str = "all", - instruction_language: str = "all", - workers: int = 1, - max_samples: int | None = None, - samples_per_group: int | None = None, - ) -> dict[str, Any]: - dataset = _resolve_gedit_split(_load_gedit_dataset(self.dataset_ref)) - rows = select_balanced_gedit_rows( - list(dataset), - task_type=task_type, - instruction_language=instruction_language, - samples_per_group=samples_per_group, - ) - if max_samples is not None: - rows = rows[:max_samples] - - results: list[dict[str, Any]] = [] - total = len(rows) - if workers <= 1: - with tqdm(total=total, desc="GEdit evaluate", unit="sample") as progress: - for item in rows: - result = self._safe_evaluate_one(model_name, item) - if result: - results.append(result) - progress.update(1) - else: - with tqdm(total=total, desc="GEdit evaluate", unit="sample") as progress: - with ThreadPoolExecutor(max_workers=workers) as executor: - futures = [executor.submit(self._safe_evaluate_one, model_name, item) for item in rows] - for future in as_completed(futures): - result = future.result() - if result: - results.append(result) - progress.update(1) - - save_dir.mkdir(parents=True, exist_ok=True) - base_name = f"{model_name}_{task_type}_{instruction_language}" - timestamp = _utc_timestamp() - csv_path = save_dir / f"{base_name}_vie_score.csv" - timestamped_csv_path = save_dir / f"{base_name}_vie_score_{timestamp}.csv" - - def _write_csv(path: Path) -> None: - with path.open("w", encoding="utf-8", newline="") as handle: - writer = csv.DictWriter( - handle, - fieldnames=[ - "key", - "task_type", - "edited_image", - "instruction", - "semantics_score", - "quality_score", - "overall_score", - "intersection_exist", - "instruction_language", - ], - ) - writer.writeheader() - for row in results: - writer.writerow(row) - - _write_csv(csv_path) - _write_csv(timestamped_csv_path) - - summary = summarize_gedit_rows_with_backbone( - results, - language=instruction_language, - ) - summary_path = save_dir / f"{base_name}_summary.json" - timestamped_summary_path = save_dir / f"{base_name}_summary_{timestamp}.json" - write_json(summary_path, summary) - write_json(timestamped_summary_path, summary) - return { - "results": results, - "summary": summary, - "csv_path": str(csv_path), - "summary_path": str(summary_path), - "timestamped_csv_path": str(timestamped_csv_path), - "timestamped_summary_path": str(timestamped_summary_path), - } - - def _safe_evaluate_one(self, model_name: str, item: dict[str, Any]) -> dict[str, Any] | None: - try: - return self._evaluate_one(model_name, item) - except Exception: - logger.exception("Failed to evaluate GEdit-Bench sample %s", item.get("key", "")) - return None - - def _evaluate_one(self, model_name: str, item: dict[str, Any]) -> dict[str, Any] | None: - edited_image_path = ( - self.output_root - / model_name - / "fullset" - / item["task_type"] - / item["instruction_language"] - / f"{item['key']}.png" - ) - if not edited_image_path.exists(): - return None - - source_image = _to_pil_image(item["input_image_raw"]) - edited_image = Image.open(edited_image_path).convert("RGB") - scores = self.scorer.evaluate(source_image, edited_image, item["instruction"]) - return { - "key": item["key"], - "task_type": item["task_type"], - "edited_image": str(edited_image_path), - "instruction": item["instruction"], - "semantics_score": scores["semantics_score"], - "quality_score": scores["quality_score"], - "overall_score": scores["overall_score"], - "intersection_exist": item.get("Intersection_exist", False), - "instruction_language": item["instruction_language"], - } - - -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(description="Run the GEdit-Bench integration against a local vLLM-Omni server.") - subparsers = parser.add_subparsers(dest="command", required=True) - - generate = subparsers.add_parser("generate") - generate.add_argument("--dataset-ref", type=str, default="stepfun-ai/GEdit-Bench") - generate.add_argument("--output-root", type=Path, required=True) - generate.add_argument("--base-url", type=str, required=True) - generate.add_argument("--model", type=str, required=True) - generate.add_argument("--model-name", type=str, default=None) - generate.add_argument("--api-key", type=str, default="EMPTY") - generate.add_argument("--task-type", choices=["all", *GROUPS], default="all") - generate.add_argument("--instruction-language", choices=["all", "en", "cn"], default="all") - generate.add_argument("--width", type=int, default=512) - generate.add_argument("--height", type=int, default=512) - generate.add_argument("--num-inference-steps", type=int, default=20) - generate.add_argument("--guidance-scale", type=float, default=None) - generate.add_argument("--seed", type=int, default=42) - generate.add_argument("--workers", type=int, default=1) - generate.add_argument("--max-samples", type=int, default=None) - generate.add_argument("--samples-per-group", type=int, default=None) - - evaluate = subparsers.add_parser("evaluate") - evaluate.add_argument("--dataset-ref", type=str, default="stepfun-ai/GEdit-Bench") - evaluate.add_argument("--output-root", type=Path, required=True) - evaluate.add_argument("--model-name", type=str, default=None) - evaluate.add_argument("--save-dir", type=Path, required=True) - evaluate.add_argument("--task-type", choices=["all", *GROUPS], default="all") - evaluate.add_argument("--instruction-language", choices=["all", "en", "cn"], default="all") - evaluate.add_argument("--judge-base-url", type=str, required=True) - evaluate.add_argument("--judge-model", type=str, required=True) - evaluate.add_argument("--judge-api-key", type=str, default="EMPTY") - evaluate.add_argument("--workers", type=int, default=1) - evaluate.add_argument("--max-samples", type=int, default=None) - evaluate.add_argument("--samples-per-group", type=int, default=None) - - summarize = subparsers.add_parser("summarize") - summarize.add_argument("--csv-path", type=Path, required=True) - summarize.add_argument("--language", choices=["all", "en", "cn"], default="all") - - return parser - - -def main(argv: list[str] | None = None) -> int: - parser = build_parser() - args = parser.parse_args(argv) - - if args.command == "generate": - model_name = resolve_model_name(model_name=args.model_name, model=args.model) - runner = GEditBenchRunner( - dataset_ref=args.dataset_ref, - output_root=args.output_root, - base_url=args.base_url, - model=args.model, - api_key=args.api_key, - width=args.width, - height=args.height, - num_inference_steps=args.num_inference_steps, - guidance_scale=args.guidance_scale, - seed=args.seed, - ) - records = runner.generate( - model_name=model_name, - task_type=args.task_type, - instruction_language=args.instruction_language, - workers=args.workers, - max_samples=args.max_samples, - samples_per_group=args.samples_per_group, - ) - payload = {"records": records, "summary": summarize_generated_records(records)} - write_json(args.output_root / model_name / "generation_manifest.json", payload) - return 0 - - if args.command == "evaluate": - model_name = resolve_model_name(model_name=args.model_name, output_root=args.output_root) - scorer = LocalVIEScorer( - base_url=args.judge_base_url, - api_key=args.judge_api_key, - model=args.judge_model, - ) - evaluator = GEditBenchEvaluator(dataset_ref=args.dataset_ref, output_root=args.output_root, scorer=scorer) - evaluator.evaluate( - model_name=model_name, - save_dir=args.save_dir, - task_type=args.task_type, - instruction_language=args.instruction_language, - workers=args.workers, - max_samples=args.max_samples, - samples_per_group=args.samples_per_group, - ) - return 0 - - if args.command == "summarize": - with args.csv_path.open("r", encoding="utf-8", newline="") as handle: - rows = list(csv.DictReader(handle)) - summary = summarize_gedit_rows_with_backbone(rows, language=args.language) - print(json.dumps(summary, indent=2, ensure_ascii=False)) - return 0 - - parser.error(f"Unknown command: {args.command}") - return 1 diff --git a/benchmarks/accuracy/image_to_image/run_gedit_bench.py b/benchmarks/accuracy/image_to_image/run_gedit_bench.py deleted file mode 100644 index 4ce10c18465..00000000000 --- a/benchmarks/accuracy/image_to_image/run_gedit_bench.py +++ /dev/null @@ -1,13 +0,0 @@ -# ruff: noqa: E402, I001 -import sys -from pathlib import Path - -REPO_ROOT = Path(__file__).resolve().parents[3] -if str(REPO_ROOT) not in sys.path: - sys.path.insert(0, str(REPO_ROOT)) - -from benchmarks.accuracy.image_to_image.gedit_bench import main - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/benchmarks/accuracy/text_to_image/README.md b/benchmarks/accuracy/text_to_image/README.md deleted file mode 100644 index 79641e8fc43..00000000000 --- a/benchmarks/accuracy/text_to_image/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# GEBench on vLLM-Omni - -This integration adapts the upstream `stepfun-ai/GEBench` scripts into -`vllm-omni/benchmarks/accuracy/text_to_image`. - -Upstream mapping: - -- `scripts/generate.py` -> `run_gebench.py generate` -- `scripts/evaluate.py` -> `run_gebench.py evaluate` -- upstream prompt / judge logic -> `gbench.py` - -What changed: - -- Generation calls the local OpenAI-compatible `vllm-omni` endpoints: - - `/v1/images/generations` for text-only frame generation - - `/v1/images/edits` for image-conditioned GUI transition generation -- Evaluation still keeps the GEBench scoring dimensions: - - `goal` - - `logic` - - `cons` - - `ui` - - `qual` -- Judge calls are also routed to a local OpenAI-compatible model served by - `vllm-omni` instead of a remote service. - -Expected dataset layout: - -- Clone the benchmark dataset from Hugging Face into a local directory: - -```bash -git clone https://huggingface.co/datasets/stepfun-ai/GEBench /path/to/GEBench -``` - -Example usage: - -```bash -python benchmarks/accuracy/text_to_image/run_gebench.py generate \ - --dataset-root /path/to/GEBench \ - --output-root benchmarks/accuracy/text_to_image/outputs \ - --base-url http://127.0.0.1:8000 \ - --model Tongyi-MAI/Z-Image-Turbo \ - --data-type type3 -``` - -```bash -python benchmarks/accuracy/text_to_image/run_gebench.py evaluate \ - --dataset-root /path/to/GEBench \ - --output-root benchmarks/accuracy/text_to_image/outputs \ - --data-type type3 \ - --judge-base-url http://127.0.0.1:8000 \ - --judge-model Qwen/Qwen2.5-VL-7B-Instruct \ - --judge-api-key EMPTY -``` - -```bash -python benchmarks/accuracy/text_to_image/run_gebench.py summarize \ - --output-root benchmarks/accuracy/text_to_image/outputs -``` - -Example summary output: - -```json -{ - "generation": { - "count": 20, - "by_type": { - "type3": {"count": 10}, - "type4": {"count": 10} - } - }, - "evaluation": { - "count": 20, - "overall_mean": 0.52, - "by_type": { - "type3": {"count": 10, "overall_mean": 0.50, "overall_mean_100": 50.0}, - "type4": {"count": 10, "overall_mean": 0.54, "overall_mean_100": 54.0} - } - } -} -``` - -Example generated images to inspect: - -- `benchmarks/accuracy/text_to_image/outputs/03_trajectory_text_fictionalapp///frame0.png` -- `benchmarks/accuracy/text_to_image/outputs/03_trajectory_text_fictionalapp///frame5.png` -- `benchmarks/accuracy/text_to_image/outputs/04_trajectory_text_realapp///frame0.png` -- `benchmarks/accuracy/text_to_image/outputs/04_trajectory_text_realapp///frame5.png` - -What to expect: - -- `overall_mean` is normalized to `0.0 ~ 1.0`; higher is better. -- `frame0.png` is the initial GUI frame; `frame5.png` is the final trajectory frame most often used for quick inspection. -- For full debugging, inspect the whole `frame0.png` ... `frame5.png` sequence for one sample directory. - -Notes: - -- GEBench upstream leaves type3/type4 generation unfinished. This integration - fills that gap with a trajectory runner that generates `frame0.png` followed - by `frame1.png` ... `frame5.png`. -- Type1/2/5 require an image-edit capable model exposed through - `vllm-omni serve`. -- `summarize` will report both generated coverage and any existing evaluation - summary files. diff --git a/benchmarks/accuracy/text_to_image/__init__.py b/benchmarks/accuracy/text_to_image/__init__.py deleted file mode 100644 index e1f7b2bb673..00000000000 --- a/benchmarks/accuracy/text_to_image/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""GEBench integration for vLLM-Omni.""" diff --git a/benchmarks/accuracy/text_to_image/gbench.py b/benchmarks/accuracy/text_to_image/gbench.py deleted file mode 100644 index 2ea02130d6b..00000000000 --- a/benchmarks/accuracy/text_to_image/gbench.py +++ /dev/null @@ -1,927 +0,0 @@ -from __future__ import annotations - -import argparse -import json -import statistics -from collections import defaultdict -from concurrent.futures import ThreadPoolExecutor, as_completed -from dataclasses import dataclass -from datetime import datetime, timezone -from pathlib import Path -from typing import Any - -import requests -from PIL import Image - -from benchmarks.accuracy.common import ( - VllmOmniImageClient, - build_openai_url, - ensure_dir, - extract_json_object, - find_first_image, - load_json, - pil_to_data_url, - save_image, - write_json, -) - -TYPE_TO_FOLDER = { - "type1": "01_single_step", - "type2": "02_multi_step", - "type3": "03_trajectory_text_fictionalapp", - "type4": "04_trajectory_text_realapp", - "type5": "05_grounding_data", -} -SCORE_KEYS = ("goal", "logic", "cons", "ui", "qual") -DEFAULT_SAMPLES_PER_TYPE = 10 - - -def _utc_timestamp() -> str: - return datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") - - -def _write_json_with_timestamp(path: Path, payload: dict[str, Any]) -> Path: - write_json(path, payload) - timestamped_path = path.with_name(f"{path.stem}_{_utc_timestamp()}{path.suffix}") - write_json(timestamped_path, payload) - return timestamped_path - - -@dataclass(frozen=True) -class GEBenchSampleSpec: - sample_path: Path - metadata: dict[str, Any] - sample_name: str - lang_device: str - - -def summarize_generated_records(records: list[dict[str, Any]]) -> dict[str, Any]: - by_type: dict[str, list[dict[str, Any]]] = defaultdict(list) - for record in records: - by_type[record["data_type"]].append(record) - - return { - "count": len(records), - "by_type": { - data_type: { - "count": len(rows), - } - for data_type, rows in sorted(by_type.items()) - }, - } - - -def summarize_gebench_results(results: list[dict[str, Any]]) -> dict[str, Any]: - by_type: dict[str, list[dict[str, Any]]] = defaultdict(list) - for result in results: - by_type[result["data_type"]].append(result) - - summary: dict[str, Any] = { - "count": len(results), - "overall_mean": statistics.fmean(r["overall"] for r in results) if results else 0.0, - "by_type": {}, - } - for data_type, rows in by_type.items(): - score_means: dict[str, float] = {} - all_score_keys = {key for row in rows for key in row.get("scores", {}).keys()} - for score_key in all_score_keys: - values = [row["scores"][score_key] for row in rows if score_key in row.get("scores", {})] - score_means[score_key] = statistics.fmean(values) if values else 0.0 - overall_mean = statistics.fmean(row["overall"] for row in rows) - summary["by_type"][data_type] = { - "count": len(rows), - "overall_mean": overall_mean, - "overall_mean_100": overall_mean * 100.0, - "score_means": score_means, - } - return summary - - -def select_balanced_gebench_samples( - sample_paths_by_type: dict[str, list[Any]], - *, - samples_per_type: int | None, -) -> dict[str, list[Any]]: - if samples_per_type is None: - return {data_type: list(paths) for data_type, paths in sample_paths_by_type.items()} - return {data_type: list(paths)[:samples_per_type] for data_type, paths in sample_paths_by_type.items()} - - -def collect_gebench_generation_summary(output_root: Path) -> dict[str, Any]: - records: list[dict[str, Any]] = [] - for data_type, folder_name in TYPE_TO_FOLDER.items(): - type_root = output_root / folder_name - if not type_root.exists(): - continue - for lang_dir in sorted(path for path in type_root.iterdir() if path.is_dir()): - for sample_dir in sorted(path for path in lang_dir.iterdir() if path.is_dir()): - expected = sample_dir / "frame5.png" if data_type in {"type2", "type3", "type4"} else None - if expected is None: - expected = find_first_image(sample_dir) - elif not expected.exists(): - expected = None - if expected is None: - continue - records.append( - { - "data_type": data_type, - "sample_name": f"{lang_dir.name}/{sample_dir.name}", - "output_path": str(expected), - } - ) - return summarize_generated_records(records) - - -def _normalize_score_key(key: str) -> str: - mapping = { - "goal": "goal", - "logic": "logic", - "cons": "cons", - "consistency": "cons", - "ui": "ui", - "qual": "qual", - "quality": "qual", - } - return mapping.get(key.lower(), key.lower()) - - -def _normalize_scores(raw_scores: dict[str, Any]) -> dict[str, int]: - scores: dict[str, int] = {} - for key, value in raw_scores.items(): - normalized = _normalize_score_key(key) - if normalized not in SCORE_KEYS: - continue - scalar = value.get("s", 0) if isinstance(value, dict) else value - try: - scores[normalized] = int(scalar) - except (TypeError, ValueError): - scores[normalized] = 0 - for key in SCORE_KEYS: - scores.setdefault(key, 0) - return scores - - -def _compute_overall(scores: dict[str, int]) -> float: - return sum(scores.values()) / (len(SCORE_KEYS) * 5.0) - - -def _iter_sample_paths(dataset_root: Path, data_type: str) -> list[Path]: - data_dir = dataset_root / TYPE_TO_FOLDER[data_type] - if not data_dir.exists(): - raise FileNotFoundError(f"Dataset path not found: {data_dir}") - - samples: list[Path] = [] - for lang_dir in sorted(path for path in data_dir.iterdir() if path.is_dir()): - for child in sorted(lang_dir.iterdir()): - if child.is_dir(): - samples.append(child) - elif child.suffix.lower() == ".json": - samples.append(child) - return samples - - -def _sample_name_from_metadata(metadata: dict[str, Any], sample_path: Path, item_index: int | None = None) -> str: - sample_id = metadata.get("id") or metadata.get("sample_id") or metadata.get("name") - if sample_id: - return str(sample_id) - if item_index is not None: - return f"{sample_path.stem}_{item_index:04d}" - return sample_path.stem if sample_path.is_file() else sample_path.name - - -def _expand_sample_path(sample_path: Path) -> list[GEBenchSampleSpec]: - if sample_path.is_dir(): - metadata = _load_metadata(sample_path) - return [ - GEBenchSampleSpec( - sample_path=sample_path, - metadata=metadata, - sample_name=_sample_name(sample_path), - lang_device=_lang_device(sample_path, metadata), - ) - ] - - payload = load_json(sample_path) - if isinstance(payload, dict): - return [ - GEBenchSampleSpec( - sample_path=sample_path, - metadata=payload, - sample_name=_sample_name_from_metadata(payload, sample_path), - lang_device=_lang_device(sample_path, payload), - ) - ] - - if isinstance(payload, list): - specs: list[GEBenchSampleSpec] = [] - for item_index, item in enumerate(payload): - if not isinstance(item, dict): - continue - specs.append( - GEBenchSampleSpec( - sample_path=sample_path, - metadata=item, - sample_name=_sample_name_from_metadata(item, sample_path, item_index), - lang_device=_lang_device(sample_path, item), - ) - ) - return specs - - raise TypeError(f"Unsupported metadata payload type for sample {sample_path}: {type(payload)!r}") - - -def _iter_sample_specs(dataset_root: Path, data_type: str) -> list[GEBenchSampleSpec]: - sample_specs: list[GEBenchSampleSpec] = [] - for sample_path in _iter_sample_paths(dataset_root, data_type): - sample_specs.extend(_expand_sample_path(sample_path)) - return sample_specs - - -def _load_metadata(sample_path: Path) -> dict[str, Any]: - if sample_path.is_file(): - return load_json(sample_path) - for candidate in ("meta_data.json", "metadata.json"): - meta_path = sample_path / candidate - if meta_path.exists(): - return load_json(meta_path) - raise FileNotFoundError(f"Metadata not found for sample: {sample_path}") - - -def _sample_name(sample_path: Path) -> str: - return sample_path.stem if sample_path.is_file() else sample_path.name - - -def _lang_device(sample_path: Path, metadata: dict[str, Any]) -> str: - return str(metadata.get("lang_device") or sample_path.parent.name) - - -def _resolve_referenced_image( - *, - metadata: dict[str, Any], - sample_path: Path, - dataset_root: Path, - data_type: str, -) -> Image.Image | None: - for key in ("image", "input_image", "initial_image", "reference_image"): - image_ref = metadata.get(key) - if not image_ref: - continue - candidate = dataset_root / TYPE_TO_FOLDER[data_type] / str(image_ref) - if candidate.exists(): - image = Image.open(candidate) - image.load() - return image.convert("RGB") - if sample_path.is_dir(): - local_image = find_first_image(sample_path) - if local_image: - image = Image.open(local_image) - image.load() - return image.convert("RGB") - return None - - -def _trajectory_steps(metadata: dict[str, Any]) -> list[dict[str, Any]]: - for key in ("trajectory", "steps", "frames"): - value = metadata.get(key) - if isinstance(value, list): - return [step for step in value if isinstance(step, dict)] - extracted: list[dict[str, Any]] = [] - for index in range(1, 6): - value = metadata.get(f"step{index}") or metadata.get(str(index)) - if isinstance(value, dict): - extracted.append(value) - return extracted - - -def _text_or_default(value: Any, default: str = "") -> str: - return str(value).strip() if value is not None else default - - -def _type1_prompt(metadata: dict[str, Any]) -> str: - caption = _text_or_default(metadata.get("caption") or metadata.get("instruction"), "Transform the reference GUI.") - return ( - "Using the reference GUI screenshot, generate the next GUI state after the requested interaction.\n\n" - f"Requested change:\n{caption}\n\n" - "Requirements:\n" - "- Preserve layout, visual identity, and unrelated regions.\n" - "- Only apply the requested state change.\n" - "- Keep all text and controls readable.\n" - ) - - -def _type2_prompt(goal: str, step_num: int) -> str: - return ( - "Generate the next GUI state for a multi-step task.\n\n" - f"Overall goal: {goal}\n" - f"Current progress step: {step_num}/5\n\n" - "Requirements:\n" - "- The change should be incremental and plausible.\n" - "- Preserve layout and visual identity.\n" - "- Make text/buttons readable.\n" - ) - - -def _type34_initial_prompt(metadata: dict[str, Any], first_step: dict[str, Any]) -> str: - app_name = _text_or_default(metadata.get("app_name"), "App") - final_goal = _text_or_default(metadata.get("final_goal") or metadata.get("instruction"), "Complete the task.") - visual_description = _text_or_default( - metadata.get("visual_description") or first_step.get("visual_description") or first_step.get("description"), - "A clean product-quality app home screen.", - ) - return ( - "Generate the first GUI frame for a task trajectory.\n\n" - f"App name: {app_name}\n" - f"Final goal: {final_goal}\n" - f"Visual description:\n{visual_description}\n\n" - "Requirements:\n" - "- Generate a production-looking UI screenshot only.\n" - "- Keep the layout coherent and readable.\n" - ) - - -def _type34_next_prompt(step_num: int, step_info: dict[str, Any]) -> str: - action = _text_or_default(step_info.get("action") or step_info.get("instruction"), "Continue the task.") - visual_description = _text_or_default( - step_info.get("visual_description") or step_info.get("description"), - "Reflect the expected next GUI state.", - ) - return ( - "Using the previous frame as reference, generate the next GUI frame.\n\n" - f"Step {step_num} action: {action}\n" - f"Expected visual state:\n{visual_description}\n\n" - "Requirements:\n" - "- Only change UI regions affected by this action.\n" - "- Preserve persistent bars, layout, and style.\n" - "- Keep text and icons readable.\n" - ) - - -def _type5_prompt(metadata: dict[str, Any]) -> str: - grounding = metadata.get("grounding") or {} - explanation = _text_or_default( - metadata.get("grounding_explanation") or grounding.get("effect") or grounding.get("description"), - "Predict the immediate GUI reaction to the indicated target.", - ) - return ( - "Using the reference GUI screenshot, predict the immediate GUI state after the grounded interaction.\n\n" - f"Expected effect: {explanation}\n" - f"Grounding metadata: {json.dumps(grounding, ensure_ascii=False)}\n\n" - "Requirements:\n" - "- Apply only the interaction-triggered change.\n" - "- Preserve unrelated regions.\n" - "- Keep the UI realistic and readable.\n" - ) - - -def _make_storyboard_image( - frames: list[Image.Image], - *, - columns: int = 3, - background_color: tuple[int, int, int] = (255, 255, 255), -) -> Image.Image: - if not frames: - raise ValueError("Expected at least one frame to build a storyboard image.") - - normalized = [frame.convert("RGB") for frame in frames] - frame_width = max(frame.width for frame in normalized) - frame_height = max(frame.height for frame in normalized) - rows = (len(normalized) + columns - 1) // columns - storyboard = Image.new("RGB", (frame_width * columns, frame_height * rows), color=background_color) - - for index, frame in enumerate(normalized): - x_offset = (index % columns) * frame_width - y_offset = (index // columns) * frame_height - if frame.size != (frame_width, frame_height): - frame = frame.resize((frame_width, frame_height)) - storyboard.paste(frame, (x_offset, y_offset)) - return storyboard - - -def _trajectory_judge_payload(frames: list[Image.Image]) -> tuple[str, list[Image.Image]]: - storyboard = _make_storyboard_image(frames, columns=3) - prompt_suffix = ( - "The attached image is a storyboard containing six frames arranged left-to-right, " - "top-to-bottom as frame0, frame1, frame2, frame3, frame4, frame5." - ) - return prompt_suffix, [storyboard] - - -class LocalJudgeClient: - def __init__(self, base_url: str, api_key: str, model: str, timeout: int = 600): - self.base_url = base_url.rstrip("/") - self.api_key = api_key - self.model = model - self.timeout = timeout - - def _build_scoring_prompt(self, task_prompt: str) -> str: - return ( - "You are an expert evaluator for GUI image editing and GUI trajectory generation.\n" - "Evaluate whether the generated image(s) satisfy the task.\n\n" - "Score these five dimensions from 0 to 5:\n" - "- goal: whether the user goal is completed correctly\n" - "- logic: whether the transition/state change is logically correct\n" - "- cons: whether unrelated regions remain consistent\n" - "- ui: whether the UI layout/components remain realistic and coherent\n" - "- qual: whether the images are visually clear and artifact-free\n\n" - "Return JSON only. Do not add any prose outside JSON.\n" - "Use exactly this schema:\n" - "{\n" - ' "goal": 0,\n' - ' "logic": 0,\n' - ' "cons": 0,\n' - ' "ui": 0,\n' - ' "qual": 0,\n' - ' "reasoning": "short explanation"\n' - "}\n\n" - "Scoring task:\n" - f"{task_prompt}" - ) - - def _request_text(self, prompt: str, images: list[Image.Image]) -> str: - content: list[dict[str, Any]] = [{"type": "text", "text": prompt}] - for image in images: - content.append({"type": "image_url", "image_url": {"url": pil_to_data_url(image)}}) - - response = requests.post( - build_openai_url(self.base_url, "/chat/completions"), - json={ - "model": self.model, - "messages": [{"role": "user", "content": content}], - "temperature": 0, - }, - headers={ - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json", - }, - timeout=self.timeout, - ) - response.raise_for_status() - message_content = response.json()["choices"][0]["message"]["content"] - if isinstance(message_content, list): - return "\n".join(part.get("text", "") for part in message_content if part.get("type") == "text") - return str(message_content) - - def evaluate(self, *, prompt: str, images: list[Image.Image]) -> dict[str, Any]: - primary_prompt = self._build_scoring_prompt(prompt) - text = self._request_text(primary_prompt, images) - try: - return extract_json_object(text) - except ValueError: - retry_prompt = ( - self._build_scoring_prompt(prompt) + "\n\nYour previous response was not valid JSON. " - "Return only the JSON object with integer scores." - ) - retry_text = self._request_text(retry_prompt, images) - try: - return extract_json_object(retry_text) - except ValueError: - return { - "goal": 0, - "logic": 0, - "cons": 0, - "ui": 0, - "qual": 0, - "reasoning": retry_text.strip() or text.strip() or "Judge response was not valid JSON.", - } - - -class GEBenchRunner: - def __init__( - self, - *, - dataset_root: Path, - output_root: Path, - base_url: str, - model: str, - api_key: str = "EMPTY", - width: int = 768, - height: int = 576, - num_inference_steps: int = 8, - output_compression: int | None = 98, - guidance_scale: float | None = None, - seed: int | None = 42, - ): - self.dataset_root = dataset_root - self.output_root = output_root - self.model = model - self.width = width - self.height = height - self.num_inference_steps = num_inference_steps - self.output_compression = output_compression - self.guidance_scale = guidance_scale - self.seed = seed - self.client = VllmOmniImageClient(base_url=base_url, api_key=api_key) - - def generate( - self, - *, - data_type: str, - workers: int = 1, - max_samples: int | None = None, - samples_per_type: int | None = None, - ) -> list[dict[str, Any]]: - sample_specs = select_balanced_gebench_samples( - {data_type: _iter_sample_specs(self.dataset_root, data_type)}, - samples_per_type=samples_per_type, - )[data_type] - if max_samples is not None: - sample_specs = sample_specs[:max_samples] - - results: list[dict[str, Any]] = [] - if workers <= 1: - for sample_spec in sample_specs: - result = self._generate_one(data_type, sample_spec) - if result: - results.append(result) - return results - - with ThreadPoolExecutor(max_workers=workers) as executor: - futures = [executor.submit(self._generate_one, data_type, sample_spec) for sample_spec in sample_specs] - for future in as_completed(futures): - result = future.result() - if result: - results.append(result) - return results - - def _generate_one(self, data_type: str, sample_spec: GEBenchSampleSpec) -> dict[str, Any] | None: - sample_path = sample_spec.sample_path - metadata = sample_spec.metadata - lang_device = sample_spec.lang_device - sample_name = sample_spec.sample_name - output_dir = ensure_dir(self.output_root / TYPE_TO_FOLDER[data_type] / lang_device / sample_name) - - if data_type == "type1": - output_path = output_dir / "generated.png" - if output_path.exists(): - return { - "data_type": data_type, - "sample_name": f"{lang_device}/{sample_name}", - "output_path": str(output_path), - } - source = _resolve_referenced_image( - metadata=metadata, sample_path=sample_path, dataset_root=self.dataset_root, data_type=data_type - ) - if source is None: - return None - generated = self.client.generate_image_edit( - model=self.model, - prompt=_type1_prompt(metadata), - images=source, - width=self.width, - height=self.height, - num_inference_steps=self.num_inference_steps, - output_compression=self.output_compression, - guidance_scale=self.guidance_scale, - seed=self.seed, - ) - save_image(output_path, generated) - return { - "data_type": data_type, - "sample_name": f"{lang_device}/{sample_name}", - "output_path": str(output_path), - } - - if data_type == "type2": - goal = _text_or_default(metadata.get("question") or metadata.get("caption"), "Complete the task.") - source = _resolve_referenced_image( - metadata=metadata, sample_path=sample_path, dataset_root=self.dataset_root, data_type=data_type - ) - if source is None: - return None - frame0_path = output_dir / "frame0.png" - if not frame0_path.exists(): - save_image(frame0_path, source) - previous = source - for step_num in range(1, 6): - frame_path = output_dir / f"frame{step_num}.png" - if frame_path.exists(): - previous = Image.open(frame_path).convert("RGB") - continue - generated = self.client.generate_image_edit( - model=self.model, - prompt=_type2_prompt(goal, step_num), - images=previous, - width=self.width, - height=self.height, - num_inference_steps=self.num_inference_steps, - output_compression=self.output_compression, - guidance_scale=self.guidance_scale, - seed=self.seed, - ) - save_image(frame_path, generated) - previous = generated - output_path = output_dir / "frame5.png" - return { - "data_type": data_type, - "sample_name": f"{lang_device}/{sample_name}", - "output_path": str(output_path), - } - - if data_type in {"type3", "type4"}: - steps = _trajectory_steps(metadata) - frame0_path = output_dir / "frame0.png" - if frame0_path.exists(): - previous = Image.open(frame0_path).convert("RGB") - else: - previous = self.client.generate_text_to_image( - model=self.model, - prompt=_type34_initial_prompt(metadata, steps[0] if steps else {}), - width=self.width, - height=self.height, - num_inference_steps=self.num_inference_steps, - output_compression=self.output_compression, - guidance_scale=self.guidance_scale, - seed=self.seed, - ) - save_image(frame0_path, previous) - - for step_num in range(1, 6): - frame_path = output_dir / f"frame{step_num}.png" - if frame_path.exists(): - previous = Image.open(frame_path).convert("RGB") - continue - step_info = steps[step_num - 1] if step_num - 1 < len(steps) else {} - generated = self.client.generate_image_edit( - model=self.model, - prompt=_type34_next_prompt(step_num, step_info), - images=previous, - width=self.width, - height=self.height, - num_inference_steps=self.num_inference_steps, - output_compression=self.output_compression, - guidance_scale=self.guidance_scale, - seed=self.seed, - ) - save_image(frame_path, generated) - previous = generated - output_path = output_dir / "frame5.png" - return { - "data_type": data_type, - "sample_name": f"{lang_device}/{sample_name}", - "output_path": str(output_path), - } - - if data_type == "type5": - output_path = output_dir / "generated.png" - if output_path.exists(): - return { - "data_type": data_type, - "sample_name": f"{lang_device}/{sample_name}", - "output_path": str(output_path), - } - source = _resolve_referenced_image( - metadata=metadata, sample_path=sample_path, dataset_root=self.dataset_root, data_type=data_type - ) - if source is None: - return None - generated = self.client.generate_image_edit( - model=self.model, - prompt=_type5_prompt(metadata), - images=source, - width=self.width, - height=self.height, - num_inference_steps=self.num_inference_steps, - output_compression=self.output_compression, - guidance_scale=self.guidance_scale, - seed=self.seed, - ) - save_image(output_path, generated) - return { - "data_type": data_type, - "sample_name": f"{lang_device}/{sample_name}", - "output_path": str(output_path), - } - - raise ValueError(f"Unsupported data type: {data_type}") - - -class GEBenchEvaluator: - def __init__(self, *, dataset_root: Path, output_root: Path, judge: LocalJudgeClient): - self.dataset_root = dataset_root - self.output_root = output_root - self.judge = judge - - def evaluate( - self, - *, - data_type: str, - workers: int = 1, - max_samples: int | None = None, - samples_per_type: int | None = None, - ) -> dict[str, Any]: - output_type_dir = self.output_root / TYPE_TO_FOLDER[data_type] - sample_specs_by_name = { - (spec.lang_device, spec.sample_name): spec for spec in _iter_sample_specs(self.dataset_root, data_type) - } - if not output_type_dir.exists(): - payload = {"data_type": data_type, "results": [], "summary": summarize_gebench_results([])} - write_json(self.output_root / "evaluations" / f"{data_type}.json", payload) - return payload - sample_dirs = [ - sample_dir - for lang_dir in sorted(path for path in output_type_dir.iterdir() if path.is_dir()) - for sample_dir in sorted(path for path in lang_dir.iterdir() if path.is_dir()) - if (lang_dir.name, sample_dir.name) in sample_specs_by_name - ] - sample_dirs = select_balanced_gebench_samples( - {data_type: sample_dirs}, - samples_per_type=samples_per_type, - )[data_type] - if max_samples is not None: - sample_dirs = sample_dirs[:max_samples] - results: list[dict[str, Any]] = [] - if workers <= 1: - for sample_dir in sample_dirs: - result = self._evaluate_one( - data_type, - sample_dir, - sample_specs_by_name[(sample_dir.parent.name, sample_dir.name)], - ) - if result: - results.append(result) - else: - with ThreadPoolExecutor(max_workers=workers) as executor: - futures = [ - executor.submit( - self._evaluate_one, - data_type, - sample_dir, - sample_specs_by_name[(sample_dir.parent.name, sample_dir.name)], - ) - for sample_dir in sample_dirs - ] - for future in as_completed(futures): - result = future.result() - if result: - results.append(result) - - payload = {"data_type": data_type, "results": results, "summary": summarize_gebench_results(results)} - write_json(self.output_root / "evaluations" / f"{data_type}.json", payload) - return payload - - def _evaluate_one(self, data_type: str, sample_dir: Path, sample_spec: GEBenchSampleSpec) -> dict[str, Any] | None: - lang_device = sample_dir.parent.name - sample_name = sample_dir.name - dataset_sample = sample_spec.sample_path - metadata = sample_spec.metadata - - if data_type == "type1": - source = _resolve_referenced_image( - metadata=metadata, sample_path=dataset_sample, dataset_root=self.dataset_root, data_type=data_type - ) - generated_path = find_first_image(sample_dir) - if source is None or generated_path is None: - return None - generated = Image.open(generated_path).convert("RGB") - raw_scores = self.judge.evaluate(prompt=_type1_prompt(metadata), images=[source, generated]) - elif data_type == "type2": - frames = [Image.open(sample_dir / f"frame{i}.png").convert("RGB") for i in range(6)] - goal = _text_or_default(metadata.get("question") or metadata.get("caption"), "Complete the task.") - prompt_suffix, judge_images = _trajectory_judge_payload(frames) - raw_scores = self.judge.evaluate( - prompt=f"Evaluate a six-frame GUI trajectory.\nTask: {goal}\n{prompt_suffix}", - images=judge_images, - ) - elif data_type in {"type3", "type4"}: - frames = [Image.open(sample_dir / f"frame{i}.png").convert("RGB") for i in range(6)] - instruction = _text_or_default(metadata.get("instruction") or metadata.get("caption"), "Complete the task.") - prompt_suffix, judge_images = _trajectory_judge_payload(frames) - raw_scores = self.judge.evaluate( - prompt=f"Evaluate a six-frame GUI trajectory.\nInstruction: {instruction}\n{prompt_suffix}", - images=judge_images, - ) - elif data_type == "type5": - source = _resolve_referenced_image( - metadata=metadata, sample_path=dataset_sample, dataset_root=self.dataset_root, data_type=data_type - ) - generated_path = find_first_image(sample_dir) - if source is None or generated_path is None: - return None - generated = Image.open(generated_path).convert("RGB") - raw_scores = self.judge.evaluate(prompt=_type5_prompt(metadata), images=[source, generated]) - else: - raise ValueError(f"Unsupported data type: {data_type}") - - scores = _normalize_scores(raw_scores) - return { - "sample_name": f"{lang_device}/{sample_name}", - "data_type": data_type, - "scores": scores, - "overall": _compute_overall(scores), - "raw_scores": raw_scores, - } - - -def _data_types_arg(value: str) -> list[str]: - return list(TYPE_TO_FOLDER.keys()) if value == "all" else [value] - - -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(description="Run local GEBench generation and scoring against vLLM-Omni.") - subparsers = parser.add_subparsers(dest="command", required=True) - - generate = subparsers.add_parser("generate") - generate.add_argument("--dataset-root", type=Path, required=True) - generate.add_argument("--output-root", type=Path, required=True) - generate.add_argument("--base-url", type=str, required=True) - generate.add_argument("--model", type=str, required=True) - generate.add_argument("--data-type", choices=["all", *TYPE_TO_FOLDER.keys()], default="all") - generate.add_argument("--api-key", type=str, default="EMPTY") - generate.add_argument("--width", type=int, default=768) - generate.add_argument("--height", type=int, default=576) - generate.add_argument("--num-inference-steps", type=int, default=8) - generate.add_argument("--output-compression", type=int, default=98) - generate.add_argument("--guidance-scale", type=float, default=None) - generate.add_argument("--seed", type=int, default=42) - generate.add_argument("--workers", type=int, default=1) - generate.add_argument("--max-samples", type=int, default=None) - generate.add_argument("--samples-per-type", type=int, default=None) - - evaluate = subparsers.add_parser("evaluate") - evaluate.add_argument("--dataset-root", type=Path, required=True) - evaluate.add_argument("--output-root", type=Path, required=True) - evaluate.add_argument("--data-type", choices=["all", *TYPE_TO_FOLDER.keys()], default="all") - evaluate.add_argument("--judge-base-url", type=str, required=True) - evaluate.add_argument("--judge-model", type=str, required=True) - evaluate.add_argument("--judge-api-key", type=str, default="EMPTY") - evaluate.add_argument("--workers", type=int, default=1) - evaluate.add_argument("--max-samples", type=int, default=None) - evaluate.add_argument("--samples-per-type", type=int, default=None) - - summarize = subparsers.add_parser("summarize") - summarize.add_argument("--output-root", type=Path, required=True) - - return parser - - -def main(argv: list[str] | None = None) -> int: - parser = build_parser() - args = parser.parse_args(argv) - - if args.command == "generate": - runner = GEBenchRunner( - dataset_root=args.dataset_root, - output_root=args.output_root, - base_url=args.base_url, - model=args.model, - api_key=args.api_key, - width=args.width, - height=args.height, - num_inference_steps=args.num_inference_steps, - output_compression=args.output_compression, - guidance_scale=args.guidance_scale, - seed=args.seed, - ) - records: list[dict[str, Any]] = [] - for data_type in _data_types_arg(args.data_type): - records.extend( - runner.generate( - data_type=data_type, - workers=args.workers, - max_samples=args.max_samples, - samples_per_type=args.samples_per_type, - ) - ) - payload = {"records": records, "summary": summarize_generated_records(records)} - write_json(args.output_root / "generation_manifest.json", payload) - return 0 - - if args.command == "evaluate": - judge = LocalJudgeClient( - base_url=args.judge_base_url, - api_key=args.judge_api_key, - model=args.judge_model, - ) - evaluator = GEBenchEvaluator(dataset_root=args.dataset_root, output_root=args.output_root, judge=judge) - combined_results: list[dict[str, Any]] = [] - for data_type in _data_types_arg(args.data_type): - payload = evaluator.evaluate( - data_type=data_type, - workers=args.workers, - max_samples=args.max_samples, - samples_per_type=args.samples_per_type, - ) - combined_results.extend(payload["results"]) - _write_json_with_timestamp( - args.output_root / "evaluations" / "summary.json", - {"summary": summarize_gebench_results(combined_results)}, - ) - return 0 - - if args.command == "summarize": - generation_summary = collect_gebench_generation_summary(args.output_root) - evaluation_dir = args.output_root / "evaluations" - result_records: list[dict[str, Any]] = [] - if evaluation_dir.exists(): - for file_path in sorted(evaluation_dir.glob("type*.json")): - payload = load_json(file_path) - result_records.extend(payload.get("results", [])) - payload: dict[str, Any] = {"generation": generation_summary} - if result_records: - payload["evaluation"] = summarize_gebench_results(result_records) - _write_json_with_timestamp(args.output_root / "summary.json", payload) - print(json.dumps(payload, indent=2, ensure_ascii=False)) - return 0 - - parser.error(f"Unknown command: {args.command}") - return 1 diff --git a/benchmarks/accuracy/text_to_image/run_gebench.py b/benchmarks/accuracy/text_to_image/run_gebench.py deleted file mode 100644 index 554c968aaa4..00000000000 --- a/benchmarks/accuracy/text_to_image/run_gebench.py +++ /dev/null @@ -1,13 +0,0 @@ -# ruff: noqa: E402, I001 -import sys -from pathlib import Path - -REPO_ROOT = Path(__file__).resolve().parents[3] -if str(REPO_ROOT) not in sys.path: - sys.path.insert(0, str(REPO_ROOT)) - -from benchmarks.accuracy.text_to_image.gbench import main - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/benchmarks/build_dataset/download_process_data_seedtts.md b/benchmarks/build_dataset/download_process_data_seedtts.md deleted file mode 100644 index faf072303b8..00000000000 --- a/benchmarks/build_dataset/download_process_data_seedtts.md +++ /dev/null @@ -1,82 +0,0 @@ -# Benchmark Dataset Preparation Guide - -This guide describes how to download and prepare the SeedTTS test dataset for benchmarking Qwen-Omni models. - -## Prerequisites - -- Python 3.8+ -- `gdown` for downloading from Google Drive -- Access to the benchmark scripts - -## Steps - -### 1. Navigate to the Dataset Directory - -```bash -cd benchmarks/build_dataset -``` - -### 2. Install Dependencies - -```bash -pip install gdown -``` - -### 3. Download the SeedTTS Test Dataset - -Download the dataset from Google Drive: - -```bash -gdown 1GlSjVfSHkW3-leKKBlfrjuuTGqQ_xaLP -``` - -### 4. Extract the Dataset - -```bash -tar -xf seedtts_testset.tar -``` - -### 5. Prepare the Metadata File - -Copy the English metadata file to the working directory: - -```bash -cp seedtts_testset/en/meta.lst meta.lst -``` - -### 6. Extract Prompts - -Extract the first N prompts from the metadata file: - -```bash -# Extract top 100 prompts (adjust -n for different amounts) -python extract_tts_prompts.py -i meta.lst -o top100.txt -n 100 -``` - -**Options:** -- `-i, --input`: Input metadata file (default: `meta.lst`) -- `-o, --output`: Output prompts file (default: `prompts.txt`) -- `-n, --num-lines`: Number of prompts to extract (required) - -### 7. Clean Up (Optional) - -Remove temporary files to save disk space: - -```bash -rm -rf seedtts_testset -rm seedtts_testset.tar -rm meta.lst -``` - -## Quick Start (All-in-One) - -```bash -# Full setup and benchmark -cd benchmarks/build_dataset -pip install gdown -gdown 1GlSjVfSHkW3-leKKBlfrjuuTGqQ_xaLP -tar -xf seedtts_testset.tar -cp seedtts_testset/en/meta.lst meta.lst -python extract_tts_prompts.py -i meta.lst -o top100.txt -n 100 -rm -rf seedtts_testset seedtts_testset.tar meta.lst -``` diff --git a/benchmarks/build_dataset/extract_tts_prompts.py b/benchmarks/build_dataset/extract_tts_prompts.py deleted file mode 100644 index bd6ae9bdb1e..00000000000 --- a/benchmarks/build_dataset/extract_tts_prompts.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -""" -Extract prompts from meta.lst and save them to a txt file. - -Each line in meta.lst has the format: -ID|prompt_text|audio_path|target_text - -This script extracts the prompt_text (second field) from the first N lines. -""" - -import argparse -from pathlib import Path - - -def extract_prompts(input_file: str, output_file: str, num_lines: int) -> None: - """ - Extract prompts from meta.lst and save to output file. - - Args: - input_file: Path to the meta.lst file - output_file: Path to the output txt file - num_lines: Number of lines to process - """ - prompts = [] - - with open(input_file, encoding="utf-8") as f: - for i, line in enumerate(f): - if i >= num_lines: - break - - line = line.strip() - if not line: # Skip empty lines - continue - - parts = line.split("|") - if len(parts) >= 2: - prompt = parts[1] # The prompt is the second field - prompts.append(prompt) - - # Write prompts to output file - with open(output_file, "w", encoding="utf-8") as f: - for prompt in prompts: - f.write(prompt + "\n") - - # Print result stats - print(f"Extracted {len(prompts)} prompts from first {num_lines} lines") - print(f"Saved to: {output_file}") - - -def main(): - parser = argparse.ArgumentParser(description="Extract prompts from meta.lst file") - parser.add_argument( - "-i", "--input", type=str, default="meta.lst", help="Input meta.lst file path (default: meta.lst)" - ) - parser.add_argument( - "-o", "--output", type=str, default="prompts.txt", help="Output txt file path (default: prompts.txt)" - ) - parser.add_argument( - "-n", "--num-lines", type=int, required=True, help="Number of lines to extract from the beginning" - ) - - args = parser.parse_args() - - # Check if input file exists - if not Path(args.input).exists(): - print(f"Error: Input file '{args.input}' not found") - return - - extract_prompts(args.input, args.output, args.num_lines) - - -if __name__ == "__main__": - main() diff --git a/benchmarks/build_dataset/seed_tts_design/en/meta.lst b/benchmarks/build_dataset/seed_tts_design/en/meta.lst deleted file mode 100644 index 7e364c2e517..00000000000 --- a/benchmarks/build_dataset/seed_tts_design/en/meta.lst +++ /dev/null @@ -1,20 +0,0 @@ -vd001|||The quick brown fox jumps over the lazy dog.|A warm, friendly female voice with a slight American Midwest accent, speaking at a moderate pace with natural inflection. -vd002|||Welcome to the future of text-to-speech synthesis.|A deep, authoritative male news anchor voice, clear and professional with a measured cadence. -vd003|||The sunset painted the sky in brilliant shades of orange and pink.|A gentle elderly female voice, soft and wise, with a slight Southern American accent. -vd004|||Scientists have discovered a new species of deep-sea creature.|A young male voice with an Australian accent, curious and enthusiastic. -vd005|||Breaking news: a major climate summit opens today in Geneva.|A crisp female newsreader voice, neutral accent, confident and precise. -vd006|||In the beginning, there was darkness and silence across the universe.|A rich, dramatic bass male narrator voice, slow and deeply resonant. -vd007|||Come closer, I have something important to tell you.|A soft, intimate female voice, slightly whispery, warm and gentle. -vd008|||And they're off! The horses race toward the first turn at incredible speed.|An energetic male sports commentator, fast-paced and excited. -vd009|||Once upon a time, in a land far away, lived a very clever fox.|A light, playful voice with childlike enthusiasm, bright and clear. -vd010|||The ancient manuscript reveals secrets hidden for a thousand years.|A wise, measured elderly male voice, slow and deliberate, British English accent. -vd011|||Good evening, ladies and gentlemen, and welcome to our show.|A sophisticated female voice with a slight French accent speaking English, elegant and refined. -vd012|||System initialized. Running diagnostics. All systems nominal.|A clear, precise robotic-sounding voice, neutral and monotone with slight synthetic quality. -vd013|||I hear what you are saying, and it is completely understandable to feel that way.|A warm, empathetic female therapist voice, calm and reassuring, unhurried pace. -vd014|||Attention all units: proceed to grid reference seven-seven-alpha.|A firm, authoritative military male voice, clipped and commanding. -vd015|||Oh my goodness, you have to try this amazing new recipe I just found!|An enthusiastic, bubbly female voice, high energy and friendly. -vd016|||Dude, the waves were totally amazing out there today. Super happy about it!|A relaxed male voice with a California accent, casual and laid-back. -vd017|||The quarterly results exceed expectations across all major metrics.|A sharp, businesslike female voice, confident and efficient, fast-paced delivery. -vd018|||Chapter one. The morning sun filtered gently through the forest canopy.|A smooth, rich male audiobook narrator voice, expressive and engaging. -vd019|||To be or not to be, that is the question.|A theatrical female voice, dramatic and expressive, stage projection quality. -vd020|||And that is all for tonight. Stay well out there, everyone.|A warm, velvety male late-night radio DJ voice, smooth and intimate. diff --git a/benchmarks/build_dataset/seed_tts_smoke/en/meta.lst b/benchmarks/build_dataset/seed_tts_smoke/en/meta.lst deleted file mode 100644 index afe4bc8abcd..00000000000 --- a/benchmarks/build_dataset/seed_tts_smoke/en/meta.lst +++ /dev/null @@ -1,20 +0,0 @@ -smoke001|||The quick brown fox jumps over the lazy dog near the riverbank at sunset. -smoke002|||Welcome to the future of text-to-speech synthesis in production systems. -smoke003|||Yesterday the team finished rolling out the new authentication flow. -smoke004|||She walked carefully across the wet cobblestones, careful not to slip. -smoke005|||The conference call is scheduled for nine in the morning, Pacific time. -smoke006|||Please remember to save your work before closing the editor. -smoke007|||Two plus two equals four, but five hundred and forty three digits is long. -smoke008|||I would like a coffee with oat milk and a chocolate croissant please. -smoke009|||The library closes at eight on weekdays and six on Saturdays. -smoke010|||During the Renaissance, art and science flourished in European cities. -smoke011|||He whispered the secret word so quietly that no one else could hear. -smoke012|||Our flight departs from gate twenty three at eleven fifteen. -smoke013|||The storm knocked out power for six hours, but the backup generator kicked in. -smoke014|||Reading a good book on a rainy afternoon is one of life's great pleasures. -smoke015|||When the kettle whistled, she poured the hot water over the fresh tea leaves. -smoke016|||The algorithm runs in linear time, which is a big improvement over the previous approach. -smoke017|||In the distance, the mountains were shrouded in thick morning fog. -smoke018|||Our company reported record revenue for the fourth quarter of the fiscal year. -smoke019|||She explained the new policy in detail during the staff meeting this morning. -smoke020|||The children laughed and played in the garden until the sun began to set. diff --git a/benchmarks/diffusion/README.md b/benchmarks/diffusion/README.md deleted file mode 100644 index 06bf01726e6..00000000000 --- a/benchmarks/diffusion/README.md +++ /dev/null @@ -1,138 +0,0 @@ - -# Diffusion Serving Benchmark (Image/Video) - -This folder contains an online-serving benchmark script for diffusion models. -It sends requests to a vLLM OpenAI-compatible endpoint and reports throughput, -latency percentiles, and optional SLO attainment. - -The main entrypoint is: - -- `benchmarks/diffusion/diffusion_benchmark_serving.py` - -## 1. Quick Start - -1. Start the server: - -```bash -vllm serve Qwen/Qwen-Image --omni --port 8099 -``` - -2. Run a minimal benchmark: - -```bash -python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --base-url http://localhost:8099 \ - --model Qwen/Qwen-Image \ - --task t2i \ - --dataset vbench \ - --num-prompts 5 -``` - -**Notes** - -- The benchmark talks to `http://:/v1/chat/completions`. -- If you run the server on another host or port, pass `--base-url` accordingly. - -## 2. Supported Datasets - -The benchmark supports three dataset modes via `--dataset`: - -- `vbench`: Built-in prompt/data loader. -- `trace`: Heterogeneous request traces (each request can have different resolution/frames/steps). -- `random`: Synthetic prompts for quick smoke tests. - -### VBench dataset - -`vbench` only provides prompt data (and image paths for i2v/i2i); it does not carry -per-request generation fields. In this mode, all requests share CLI values: -`--width --height --num-frames --fps --num-inference-steps` -(pass `--width` and `--height` together). - -Example (`t2v`): - -```bash -python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --base-url http://localhost:8099 \ - --model Wan-AI/Wan2.2-T2V-A14B-Diffusers \ - --task t2v \ - --dataset vbench \ - --num-prompts 50 \ - --width 640 --height 480 \ - --num-frames 81 --fps 16 \ - --num-inference-steps 40 -``` - -Note: `vbench` can also be used for other tasks such as `t2i` / `i2v` (and `i2i`). For `t2i`, the loader reuses VBench t2v text prompts; for `i2v` / `i2i`, it loads the VBench i2v dataset (with image paths). - -If you use i2v/i2i bench datasets and need auto-download support, you may need: - -```bash -uv pip install gdown -``` - -### Trace dataset - -Use `--dataset trace` to replay a trace file. The trace can specify per-request fields such as: - -- `width`, `height` -- `num_frames` (video) -- `num_inference_steps` -- `seed`, `fps` -- optional `slo_ms` (per-request SLO target) - -By default (when `--dataset-path` is not provided), the script downloads a default trace from -the HuggingFace dataset repo `asukaqaqzz/Dit_Trace`. The default filename can depend on `--task` -(e.g., `t2v` uses a video trace). - -Current defaults: - -- `--task t2i` -> `sd3_trace.txt` -- `--task t2v` -> `cogvideox_trace.txt` - -You can point to your own trace using `--dataset-path`. - -## 3. Benchmark Parameters - -### Basic flags - -- `--base-url`: Server address (the script calls `.../v1/chat/completions`). -- `--model`: The OpenAI-compatible `model` field. -- `--task`: Task type (e.g., `t2i`, `t2v`, `i2i`, `i2v`). -- `--dataset`: Dataset mode (`vbench` / `trace` / `random`). -- `--num-prompts`: Number of requests to send. - -Common optional flags: - -- `--output-file`: Write metrics to a JSON file. -- `--disable-tqdm`: Disable the progress bar. - -### Resolution / frames / steps: CLI defaults vs dataset fields - -Related flags: `--width`, `--height`, `--num-frames`, `--fps`, `--num-inference-steps`. - -- For `vbench` / `random`: these CLI flags act as global defaults for all generated requests. -- For `trace`: requests can carry their own fields (e.g., `width/height/num_frames/num_inference_steps`), with overrides/fallbacks as below. - -Precedence rules for `trace` (i.e., what actually gets sent): - -- `width/height`: if either `--width` or `--height` is explicitly set, it overrides per-request values from the trace; otherwise per-request values are used when present. -- `num_frames`: per-request `num_frames` takes precedence; otherwise fall back to `--num-frames`. -- `num_inference_steps`: per-request `num_inference_steps` takes precedence; otherwise fall back to `--num-inference-steps`. - -### SLO, warmup, and max concurrency - -Enable SLO evaluation with `--slo`. - -- If a request in the trace already has `slo_ms`, that value is used. -- Otherwise, the script runs warmup requests to infer a base unit time, estimates `expected_ms` by linearly scaling with area/frames/steps, and then sets `slo_ms = expected_ms * --slo-scale`. - -Warmup flags: - -- `--warmup-requests`: Number of warmup requests. -- `--warmup-num-inference-steps`: Steps used during warmup. -- For `--task t2v`: warmup requests are forced to use `num_frames=1` to make warmup faster and less noisy. - -Traffic / concurrency flags: - -- `--request-rate`: Target request rate (requests/second). If set to `inf`, the script sends all requests immediately. -- `--max-concurrency`: Max number of in-flight requests (default: `1`). This can hard-cap the achieved QPS: if it is too small, requests will queue behind the semaphore, and both achieved throughput and observed SLO attainment can be skewed. diff --git a/benchmarks/diffusion/backends.py b/benchmarks/diffusion/backends.py deleted file mode 100644 index d33160f1377..00000000000 --- a/benchmarks/diffusion/backends.py +++ /dev/null @@ -1,359 +0,0 @@ -import asyncio -import base64 -import mimetypes -import os -import time -import uuid -from dataclasses import dataclass, field -from typing import Any - -import aiohttp -from tqdm import tqdm - - -@dataclass -class RequestFuncInput: - prompt: str - api_url: str - model: str - width: int | None = None - height: int | None = None - num_frames: int | None = None - num_inference_steps: int | None = None - seed: int | None = None - fps: int | None = None - timestamp: float | None = None - slo_ms: float | None = None - extra_body: dict[str, Any] = field(default_factory=dict) - image_paths: list[str] | None = None - request_id: str = field(default_factory=lambda: str(uuid.uuid4())) - - -@dataclass -class RequestFuncOutput: - success: bool = False - latency: float = 0.0 - error: str = "" - start_time: float = 0.0 - response_body: dict[str, Any] = field(default_factory=dict) - stage_durations: dict[str, float] = field(default_factory=dict) - peak_memory_mb: float = 0.0 - slo_achieved: bool | None = None - - -def _guess_mime_type(path: str) -> str: - mime, _ = mimetypes.guess_type(path) - return mime or "application/octet-stream" - - -def _encode_image_as_data_url(path: str) -> str: - with open(path, "rb") as f: - encoded = base64.b64encode(f.read()).decode("utf-8") - mime = _guess_mime_type(path) - return f"data:{mime};base64,{encoded}" - - -async def async_request_chat_completions( - input: RequestFuncInput, - session: aiohttp.ClientSession, - pbar: tqdm | None = None, - enable_diffusion_pipeline_profiler: bool = False, -) -> RequestFuncOutput: - output = RequestFuncOutput() - output.start_time = time.perf_counter() - - extra_body = dict(input.extra_body) - if input.width and input.height: - extra_body.setdefault("height", input.height) - extra_body.setdefault("width", input.width) - if input.num_frames: - extra_body.setdefault("num_frames", input.num_frames) - if input.num_inference_steps: - extra_body.setdefault("num_inference_steps", input.num_inference_steps) - if input.seed is not None: - extra_body.setdefault("seed", input.seed) - if input.fps: - extra_body.setdefault("fps", input.fps) - - if input.image_paths and len(input.image_paths) > 0: - content = [] - if input.prompt: - content.append({"type": "text", "text": input.prompt}) - for img_path in input.image_paths: - if not os.path.exists(img_path): - output.error = f"Image file not found: {img_path}" - output.success = False - if pbar: - pbar.update(1) - return output - content.append( - { - "type": "image_url", - "image_url": {"url": _encode_image_as_data_url(img_path)}, - } - ) - messages = [{"role": "user", "content": content}] - else: - messages = [{"role": "user", "content": input.prompt}] - - payload = { - "model": input.model, - "messages": messages, - } - if extra_body: - payload["extra_body"] = extra_body - - try: - async with session.post(input.api_url, json=payload) as response: - if response.status == 200: - resp_json = await response.json() - output.response_body = resp_json - output.success = True - try: - choices = resp_json.get("choices", []) - if choices and isinstance(choices, list): - msg = choices[0].get("message", {}) - if isinstance(msg, dict): - content = msg.get("content", []) - if content and isinstance(content, list) and len(content) > 0: - first_item = content[0] - if isinstance(first_item, dict): - output.stage_durations = first_item.get("stage_durations") or {} - output.peak_memory_mb = first_item.get("peak_memory_mb", 0.0) - except (IndexError, TypeError, AttributeError): - pass - - if (not output.stage_durations or output.peak_memory_mb == 0.0) and isinstance( - resp_json.get("metrics"), dict - ): - m = resp_json["metrics"] - if not output.stage_durations and isinstance(m.get("stage_durations"), dict): - output.stage_durations = m.get("stage_durations") or {} - if output.peak_memory_mb == 0.0 and m.get("peak_memory_mb") is not None: - try: - output.peak_memory_mb = float(m.get("peak_memory_mb") or 0.0) - except (TypeError, ValueError): - pass - else: - output.error = f"HTTP {response.status}: {await response.text()}" - output.success = False - except Exception as e: - output.error = str(e) - output.success = False - - output.latency = time.perf_counter() - output.start_time - - if output.success and input.slo_ms is not None: - output.slo_achieved = (output.latency * 1000.0) <= float(input.slo_ms) - - if pbar: - pbar.update(1) - return output - - -async def async_request_openai_images( - input: RequestFuncInput, - session: aiohttp.ClientSession, - pbar: tqdm | None = None, -) -> RequestFuncOutput: - """ - Send request to OpenAI's /v1/images/generations endpoint. - """ - output = RequestFuncOutput() - output.start_time = time.perf_counter() - - # Build size string from width/height - width = input.width or 1024 - height = input.height or 1024 - size = f"{width}x{height}" - - payload: dict[str, Any] = { - "model": input.model, - "prompt": input.prompt, - "n": 1, - "size": size, - "response_format": "b64_json", - } - - # Add optional parameters - if input.seed is not None: - payload["seed"] = input.seed - if input.num_inference_steps is not None: - payload["num_inference_steps"] = input.num_inference_steps - - # Add any extra body parameters - if input.extra_body: - for key, value in input.extra_body.items(): - if key not in payload: - payload[key] = value - - headers = { - "Content-Type": "application/json", - "Authorization": "Bearer EMPTY", - } - - try: - async with session.post(input.api_url, json=payload, headers=headers) as response: - if response.status == 200: - resp_json = await response.json() - output.response_body = resp_json - output.success = True - # Check for usage/memory info if available - if "usage" in resp_json and "peak_memory_mb" in resp_json.get("usage", {}): - output.peak_memory_mb = resp_json["usage"]["peak_memory_mb"] - else: - output.error = f"HTTP {response.status}: {await response.text()}" - output.success = False - except Exception as e: - output.error = str(e) - output.success = False - - output.latency = time.perf_counter() - output.start_time - - if output.success and input.slo_ms is not None: - output.slo_achieved = (output.latency * 1000.0) <= float(input.slo_ms) - - if pbar: - pbar.update(1) - return output - - -async def async_request_v1_videos( - input: RequestFuncInput, - session: aiohttp.ClientSession, - pbar: tqdm | None = None, -) -> RequestFuncOutput: - output = RequestFuncOutput() - output.start_time = time.perf_counter() - - files = dict(input.extra_body) - if input.prompt: - files.setdefault("prompt", input.prompt) - if input.width and input.height: - files.setdefault("height", input.height) - files.setdefault("width", input.width) - if input.num_frames: - files.setdefault("num_frames", input.num_frames) - if input.num_inference_steps: - files.setdefault("num_inference_steps", input.num_inference_steps) - if input.seed is not None: - files.setdefault("seed", input.seed) - if input.fps: - files.setdefault("fps", input.fps) - - form = aiohttp.FormData() - for k, v in files.items(): - form.add_field(k, str(v)) - - image_file = None - if input.image_paths and len(input.image_paths) > 0: - image_path = input.image_paths[0] - image_file = open(image_path, "rb") - form.add_field( - "input_reference", - image_file, - filename=os.path.basename(image_path), - content_type="application/octet-stream", - ) - - job_id = None - job_status = None - poll_json = {} - resp_json = {} - - try: - # invoke a post request (POST /v1/videos) - async with session.post(input.api_url, data=form) as response: - if response.status == 200: - resp_json = await response.json() - job_id = resp_json.get("id") - job_status = resp_json.get("status") - if not job_id or not job_status: - output.error = "API response missing job 'id' or 'status' field." - output.success = False - return output - else: - output.error = f"HTTP {response.status}: {await response.text()}" - output.success = False - return output - - # invoke a poll request (GET /v1/videos/{video_id}) - poll_interval = 2.0 # Unit(s) - timeout_seconds = 600.0 - deadline = time.perf_counter() + timeout_seconds - job_url = f"{input.api_url}/{job_id}" - - while job_status not in {"completed", "failed"}: - await asyncio.sleep(poll_interval) - - async with session.get(job_url) as poll_response: - if poll_response.status != 200: - output.error = f"Polling failed HTTP {poll_response.status}: {await poll_response.text()}" - output.success = False - return output - - poll_json = await poll_response.json() - job_status = poll_json.get("status") - - if time.perf_counter() >= deadline: - output.error = f"Timed out waiting for video job {job_id} to complete." - output.success = False - return output - - if job_status == "failed": - output.error = f"Video job failed: {poll_json}" - output.success = False - return output - - # invoke a get request (GET /v1/videos/{video_id}/content) - content_url = f"{job_url}/content" - async with session.get(content_url) as content_response: - if content_response.status != 200: - output.error = ( - f"Content retrieval failed HTTP {content_response.status}: {await content_response.text()}" - ) - output.success = False - return output - - video_bytes = await content_response.read() - output.response_body = video_bytes - output.success = True - if "stage_durations" in poll_json: - output.stage_durations = poll_json["stage_durations"] or {} - if "peak_memory_mb" in poll_json: - output.peak_memory_mb = poll_json["peak_memory_mb"] - elif "peak_memory_mb" in resp_json: - output.peak_memory_mb = resp_json["peak_memory_mb"] - except Exception as e: - output.error = str(e) - output.success = False - finally: - if image_file is not None: - image_file.close() - - if job_id is not None: - try: - async with session.delete(f"{input.api_url}/{job_id}") as _: - pass - except Exception as e: - print(f"Failed to clean up video job {job_id}: {e}") - - output.latency = time.perf_counter() - output.start_time - - if output.success and input.slo_ms is not None: - output.slo_achieved = (output.latency * 1000.0) <= float(input.slo_ms) - - if pbar: - pbar.update(1) - return output - - -backends_function_mapping = { - "2i": { - "vllm-omni": (async_request_chat_completions, "/v1/chat/completions"), - "openai": (async_request_openai_images, "/v1/images/generations"), - }, - "2v": { - "v1/videos": (async_request_v1_videos, "/v1/videos"), - }, -} diff --git a/benchmarks/diffusion/diffusion_benchmark_serving.py b/benchmarks/diffusion/diffusion_benchmark_serving.py deleted file mode 100644 index 77b36b3d9c0..00000000000 --- a/benchmarks/diffusion/diffusion_benchmark_serving.py +++ /dev/null @@ -1,1139 +0,0 @@ -# adapted from fastvideo -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -""" -Benchmark online serving for diffusion models (Image/Video Generation). -If you want to use i2v, i2i dataset, you should `uv pip install gdown` first - -Supports multiple backends: - - vllm-omni: Uses /v1/chat/completions endpoint (default) - - openai: Uses /v1/images/generations endpoint - - v1/videos: Use /v1/videos endpoint - -Usage: - # Video (v1/videos backend) - t2v: - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend v1/videos --dataset vbench --task t2v --num-prompts 10 \ - --height 480 --width 640 --fps 16 --num-frames 80 - - i2v: - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend v1/videos --dataset vbench --task i2v --num-prompts 10 - - - # Image (vllm-omni backend) - t2i: - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend vllm-omni --dataset vbench --task t2i --num-prompts 10 \ - --height 1024 --width 1024 - - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend vllm-omni --dataset random --task t2i --num-prompts 1 \ - --max-concurrency 1 --enable-negative-prompt \ - --random-request-config '[ - {"width":512,"height":512,"num_inference_steps":20,"weight":0.15}, - {"width":768,"height":768,"num_inference_steps":20,"weight":0.25}, - {"width":1024,"height":1024,"num_inference_steps":25,"weight":0.45}, - {"width":1536,"height":1536,"num_inference_steps":35,"weight":0.15} - ]' - - i2i: - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend vllm-omni --dataset vbench --task i2i --num-prompts 10 - - # Image (openai backend) - t2i: - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend openai --dataset vbench --task t2i --num-prompts 10 \ - --height 1024 --width 1024 --port 3000 - - # Video (v1/videos) - t2v: - python3 benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend v1/videos --dataset random --task t2v --num-prompts 1 \ - --max-concurrency 1 --enable-negative-prompt \ - --random-request-config '[ - {"width":854,"height":480,"num_inference_steps":18,"num_frames":120,"fps":24,"weight":1} - ]' - - -""" - -import argparse -import ast -import asyncio -import glob -import json -import logging -import os -import random -import tempfile -import time -import uuid -from abc import ABC, abstractmethod -from collections.abc import AsyncGenerator -from dataclasses import replace -from typing import Any - -import aiohttp -import numpy as np -import requests -from backends import RequestFuncInput, RequestFuncOutput, backends_function_mapping -from PIL import Image -from tqdm.asyncio import tqdm - -logger = logging.getLogger(__name__) - - -class BaseDataset(ABC): - def __init__(self, args, api_url: str, model: str): - self.args = args - self.api_url = api_url - self.model = model - - @abstractmethod - def __len__(self) -> int: - pass - - @abstractmethod - def __getitem__(self, idx: int) -> RequestFuncInput: - pass - - @abstractmethod - def get_requests(self) -> list[RequestFuncInput]: - pass - - -class VBenchDataset(BaseDataset): - """ - Dataset loader for VBench prompts. - Supports t2v, i2v. - """ - - T2V_PROMPT_URL = ( - "https://raw.githubusercontent.com/Vchitect/VBench/master/prompts/prompts_per_dimension/subject_consistency.txt" - ) - I2V_DOWNLOAD_SCRIPT_URL = ( - "https://raw.githubusercontent.com/Vchitect/VBench/master/vbench2_beta_i2v/download_data.sh" - ) - - def __init__(self, args, api_url: str, model: str): - super().__init__(args, api_url, model) - self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "vllm-omni") - self.items = self._load_data() - - def _load_data(self) -> list[dict[str, Any]]: - if self.args.task == "t2v": - return self._load_t2v_prompts() - elif self.args.task in ["i2v", "ti2v", "ti2i", "i2i"]: - return self._load_i2v_data() - else: - return self._load_t2v_prompts() - - def _download_file(self, url: str, dest_path: str) -> None: - """Download a file from URL to destination path.""" - os.makedirs(os.path.dirname(dest_path), exist_ok=True) - resp = requests.get(url) - resp.raise_for_status() - with open(dest_path, "w") as f: - f.write(resp.text) - - def _load_t2v_prompts(self) -> list[dict[str, Any]]: - path = self.args.dataset_path - - if not path: - path = os.path.join(self.cache_dir, "vbench_subject_consistency.txt") - if not os.path.exists(path): - print(f"Downloading VBench T2V prompts to {path}...") - try: - self._download_file(self.T2V_PROMPT_URL, path) - except Exception as e: - print(f"Failed to download VBench prompts: {e}") - return [{"prompt": "A cat sitting on a bench"}] * 50 - - prompts = [] - with open(path) as f: - for line in f: - line = line.strip() - if line: - prompts.append({"prompt": line}) - - return self._resize_data(prompts) - - def _auto_download_i2v_dataset(self) -> str: - """Auto-download VBench I2V dataset and return the dataset directory.""" - vbench_i2v_dir = os.path.join(self.cache_dir, "vbench_i2v", "vbench2_beta_i2v") - info_json_path = os.path.join(vbench_i2v_dir, "data", "i2v-bench-info.json") - - if os.path.exists(info_json_path): - return vbench_i2v_dir - - print(f"Downloading VBench I2V dataset to {vbench_i2v_dir}...") - try: - cache_root = os.path.join(self.cache_dir, "vbench_i2v") - script_path = os.path.join(cache_root, "download_data.sh") - - self._download_file(self.I2V_DOWNLOAD_SCRIPT_URL, script_path) - os.chmod(script_path, 0o755) - - print("Executing download_data.sh (this may take a while)...") - import subprocess - - result = subprocess.run( - ["bash", script_path], - cwd=cache_root, - capture_output=True, - text=True, - ) - - if result.returncode != 0: - raise RuntimeError(f"Download script failed: {result.stderr}") - - print(f"Successfully downloaded VBench I2V dataset to {vbench_i2v_dir}") - except Exception as e: - print(f"Failed to download VBench I2V dataset: {e}") - print("Please manually download following instructions at:") - print("https://github.com/Vchitect/VBench/tree/master/vbench2_beta_i2v#22-download") - return None - - return vbench_i2v_dir if os.path.exists(info_json_path) else None - - def _load_from_i2v_json(self, json_path: str) -> list[dict[str, Any]]: - """Load I2V data from i2v-bench-info.json format.""" - with open(json_path) as f: - items = json.load(f) - - base_dir = os.path.dirname(os.path.dirname(json_path)) # Go up to vbench2_beta_i2v - origin_dir = os.path.join(base_dir, "data", "origin") - - data = [] - for item in items: - img_path = os.path.join(origin_dir, item.get("file_name", "")) - if os.path.exists(img_path): - data.append({"prompt": item.get("caption", ""), "image_path": img_path}) - else: - print(f"Warning: Image not found: {img_path}") - - print(f"Loaded {len(data)} I2V samples from VBench I2V dataset") - return data - - def _scan_directory_for_images(self, path: str) -> list[dict[str, Any]]: - """Scan directory for image files.""" - exts = ["*.jpg", "*.jpeg", "*.png", "*.webp"] - files = [] - - for ext in exts: - files.extend(glob.glob(os.path.join(path, ext))) - files.extend(glob.glob(os.path.join(path, ext.upper()))) - - # Also check in data/origin subdirectory - origin_dir = os.path.join(path, "data", "origin") - if os.path.exists(origin_dir): - files.extend(glob.glob(os.path.join(origin_dir, ext))) - files.extend(glob.glob(os.path.join(origin_dir, ext.upper()))) - - return [{"prompt": os.path.splitext(os.path.basename(f))[0], "image_path": f} for f in files] - - def _create_dummy_data(self) -> list[dict[str, Any]]: - """Create dummy data with a placeholder image in cache directory.""" - print("No I2V data found. Using dummy placeholders.") - - dummy_image = os.path.join(self.cache_dir, "dummy_image.jpg") - if not os.path.exists(dummy_image): - try: - from PIL import Image - - os.makedirs(self.cache_dir, exist_ok=True) - img = Image.new("RGB", (100, 100), color="red") - img.save(dummy_image) - print(f"Created dummy image at {dummy_image}") - except ImportError: - print("PIL not installed, cannot create dummy image.") - return [] - - return [{"prompt": "A moving cat", "image_path": dummy_image}] * 10 - - def _load_i2v_data(self) -> list[dict[str, Any]]: - """Load I2V data from VBench I2V dataset or user-provided path.""" - path = self.args.dataset_path - - # Auto-download if no path provided - if not path: - path = self._auto_download_i2v_dataset() - if not path: - return self._resize_data(self._create_dummy_data()) - - # Try to load from i2v-bench-info.json - info_json_candidates = [ - os.path.join(path, "data", "i2v-bench-info.json"), - path if path.endswith(".json") else None, - ] - - for json_path in info_json_candidates: - if json_path and os.path.exists(json_path): - try: - return self._resize_data(self._load_from_i2v_json(json_path)) - except Exception as e: - print(f"Failed to load {json_path}: {e}") - - # Fallback: scan directory for images - if os.path.isdir(path): - data = self._scan_directory_for_images(path) - if data: - return self._resize_data(data) - - # Last resort: dummy data - return self._resize_data(self._create_dummy_data()) - - def _resize_data(self, data: list[dict[str, Any]]) -> list[dict[str, Any]]: - """Resize data to match num_prompts.""" - if not data: - raise ValueError("No benchmark data available. Install Pillow or provide --dataset-path.") - - if not self.args.num_prompts: - return data - - if len(data) < self.args.num_prompts: - factor = (self.args.num_prompts // len(data)) + 1 - data = data * factor - - return data[: self.args.num_prompts] - - def __len__(self) -> int: - return len(self.items) - - def __getitem__(self, idx: int) -> RequestFuncInput: - item = self.items[idx] - image_paths = [item["image_path"]] if "image_path" in item else None - - return RequestFuncInput( - prompt=item.get("prompt", ""), - api_url=self.api_url, - model=self.model, - width=self.args.width, - height=self.args.height, - num_frames=self.args.num_frames, - num_inference_steps=self.args.num_inference_steps, - seed=self.args.seed, - fps=self.args.fps, - image_paths=image_paths, - ) - - def get_requests(self) -> list[RequestFuncInput]: - return [self[i] for i in range(len(self))] - - -class TraceDataset(BaseDataset): - """Trace-based dataset loader for heterogeneous diffusion requests.""" - - DEFAULT_REPO_ID = "asukaqaqzz/Dit_Trace" - DEFAULT_FILENAME = "sd3_trace.txt" - DEFAULT_FILENAME_BY_TASK: dict[str, str] = { - # Text-to-image traces (e.g., SD3) - "t2i": "sd3_trace.txt", - # Text-to-video traces (e.g., CogVideoX) - "t2v": "cogvideox_trace.txt", - } - - def __init__(self, args, api_url: str, model: str): - super().__init__(args, api_url, model) - self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "vllm-omni", "trace") - self.default_filename = self.DEFAULT_FILENAME_BY_TASK.get(getattr(args, "task", ""), self.DEFAULT_FILENAME) - dataset_root = args.dataset_path - if not dataset_root: - dataset_root = self._download_default_trace() - self.items = self._load_items(dataset_root) - - @staticmethod - def _coerce_int(x: Any) -> int | None: - if x is None: - return None - if isinstance(x, bool): - return None - if isinstance(x, int): - return x - try: - s = str(x).strip() - if not s: - return None - return int(float(s)) - except Exception: - return None - - @staticmethod - def _coerce_float(x: Any) -> float | None: - if x is None: - return None - if isinstance(x, float): - return x - if isinstance(x, int): - return float(x) - try: - s = str(x).strip() - if not s: - return None - return float(s) - except Exception: - return None - - def _download_default_trace(self) -> str: - """Download default trace file from HuggingFace Hub if not provided.""" - - try: - from huggingface_hub import hf_hub_download - except ImportError as exc: - raise ImportError( - "huggingface_hub is required to download the default trace dataset. " - "Install via `pip install huggingface_hub`." - ) from exc - - os.makedirs(self.cache_dir, exist_ok=True) - return hf_hub_download( - repo_id=self.DEFAULT_REPO_ID, - filename=self.default_filename, - repo_type="dataset", - local_dir=self.cache_dir, - local_dir_use_symlinks=False, - ) - - def _expand_paths(self, dataset_path: str | None) -> list[str]: - if not dataset_path: - return [] - - parts = [p.strip() for p in str(dataset_path).split(",") if p.strip()] - paths: list[str] = [] - for p in parts: - if any(ch in p for ch in ["*", "?", "["]): - paths.extend(sorted(glob.glob(p))) - elif os.path.isdir(p): - paths.extend(sorted(glob.glob(os.path.join(p, "**", "*.txt"), recursive=True))) - else: - paths.append(p) - - seen = set() - unique_paths = [] - for p in paths: - if p not in seen: - seen.add(p) - unique_paths.append(p) - return unique_paths - - def _parse_trace_file(self, path: str) -> list[dict[str, Any]]: - rows: list[dict[str, Any]] = [] - - def parse_request_repr_line(line: str) -> dict[str, Any] | None: - text = line.strip() - if not text: - return None - if not (text.startswith("Request(") and text.endswith(")")): - return None - inner = text[len("Request(") : -1] - try: - expr = ast.parse(f"f({inner})", mode="eval") - if not isinstance(expr.body, ast.Call): - return None - call = expr.body - out: dict[str, Any] = {} - for kw in call.keywords: - if kw.arg is None: - continue - out[kw.arg] = ast.literal_eval(kw.value) - return out - except Exception: - return None - - # detect first non-empty line to pick parser - first_non_empty = None - with open(path, encoding="utf-8") as f: - for _ in range(50): - pos = f.tell() - line = f.readline() - if not line: - break - if line.strip(): - first_non_empty = line.strip() - f.seek(pos) - break - - if first_non_empty is None: - return rows - - if first_non_empty.startswith("Request("): - with open(path, encoding="utf-8") as f: - for line in f: - parsed = parse_request_repr_line(line) - if isinstance(parsed, dict): - rows.append(parsed) - return rows - - # txt fallback: parse Request(...) lines only - with open(path, encoding="utf-8") as f: - for line in f: - parsed = parse_request_repr_line(line) - if isinstance(parsed, dict): - rows.append(parsed) - return rows - - def _load_items(self, dataset_root: str) -> list[dict[str, Any]]: - paths = self._expand_paths(dataset_root) - if not paths: - raise ValueError("No trace files found. Provide --dataset-path or rely on default HuggingFace download.") - - items: list[dict[str, Any]] = [] - for p in paths: - if not os.path.exists(p): - continue - for row in self._parse_trace_file(p): - if isinstance(row, dict): - row = dict(row) - row.setdefault("_source", p) - items.append(row) - - if not items: - raise ValueError("Trace dataset is empty after parsing provided paths.") - - if self.args.num_prompts is not None: - items = items[: self.args.num_prompts] - - return items - - def __len__(self) -> int: - return len(self.items) - - def __getitem__(self, idx: int) -> RequestFuncInput: - row = self.items[idx] - prompt = row.get("prompt") or row.get("text") or "" - - row_height = self._coerce_int(row.get("height")) - row_width = self._coerce_int(row.get("width")) - num_frames = self._coerce_int(row.get("num_frames")) - num_steps = self._coerce_int(row.get("num_inference_steps")) - seed = self._coerce_int(row.get("seed")) - fps = self._coerce_int(row.get("fps")) - timestamp = self._coerce_float(row.get("timestamp")) - slo_ms = self._coerce_float(row.get("slo_ms")) - image_paths = row.get("image_paths") - if not image_paths: - single = row.get("image_path") - image_paths = [single] if single else None - - if not image_paths and self.args.task in ["i2v", "i2i", "ti2v", "ti2i"]: - raise ValueError( - f"Task {self.args.task} requires image input, but no image_path or image_paths found in trace row." - ) - - override_w = self.args.width - override_h = self.args.height - if override_w is not None or override_h is not None: - width = override_w - height = override_h - else: - width = row_width - height = row_height - - return RequestFuncInput( - prompt=str(prompt), - api_url=self.api_url, - model=self.model, - width=width, - height=height, - num_frames=num_frames if num_frames is not None else self.args.num_frames, - num_inference_steps=num_steps if num_steps is not None else self.args.num_inference_steps, - seed=seed if seed is not None else self.args.seed, - fps=fps if fps is not None else self.args.fps, - timestamp=timestamp, - slo_ms=slo_ms, - image_paths=image_paths, - request_id=str(row.get("request_id")) if row.get("request_id") is not None else str(uuid.uuid4()), - ) - - def get_requests(self) -> list[RequestFuncInput]: - return [self[i] for i in range(len(self))] - - -class RandomDataset(BaseDataset): - def __init__(self, args, api_url: str, model: str, enable_negative_prompt: bool = False): - super().__init__(args, api_url, model) - self.num_prompts = args.num_prompts - self.enable_negative_prompt = enable_negative_prompt - self.num_input_images = max(1, args.num_input_images) - self.random_request_config = getattr(args, "random_request_config", None) - if self.random_request_config: - self.random_request_config = json.loads(self.random_request_config) - self._weights = [p["weight"] for p in self.random_request_config] - - self.random_request_config = [ - {k: v for k, v in p.items() if k != "weight"} for p in self.random_request_config - ] - - seed = getattr(args, "random_request_seed", 42) - self._rng = random.Random(seed) - - self._sampled_requests = self._rng.choices( - self.random_request_config, - weights=self._weights, - k=self.num_prompts, - ) - else: - self._sampled_requests = None - - # Random image generate - if self.args.task in ["i2v", "ti2v", "ti2i", "i2i"]: - self._random_image_path = self._generate_random_image_paths() - else: - self._random_image_path = None - - def __len__(self) -> int: - return self.num_prompts - - def __getitem__(self, idx: int) -> RequestFuncInput: - extra_body = {} - if self.enable_negative_prompt: - extra_body["negative_prompt"] = f"Negative prompt {idx} for benchmarking diffusion models" - - params = { - "width": self.args.width, - "height": self.args.height, - "num_frames": self.args.num_frames, - "num_inference_steps": self.args.num_inference_steps, - "fps": self.args.fps, - } - if self._sampled_requests: - profile = self._sampled_requests[idx] - params.update(profile) - return RequestFuncInput( - prompt=f"Random prompt {idx} for benchmarking diffusion models", - api_url=self.api_url, - model=self.model, - seed=self.args.seed, - extra_body=extra_body, - image_paths=self._random_image_path, - **params, - ) - - def get_requests(self) -> list[RequestFuncInput]: - return [self[i] for i in range(len(self))] - - def _generate_random_image_paths(self) -> list[str]: - image_paths: list[str] = [] - for image_idx in range(self.num_input_images): - img = Image.new("RGB", (512, 512), (255, 255, 255)) - image_path = os.path.join( - tempfile.gettempdir(), - f"diffusion_benchmark_random_image_{image_idx}.png", - ) - img.save(image_path) - image_paths.append(image_path) - return image_paths - - -def _compute_expected_latency_ms_from_base(req: RequestFuncInput, args, base_time_ms: float | None) -> float | None: - """Compute expected execution time (ms) based on a base per-step-per-frame unit time. - - Assumes linear scaling with pixel area, frame count, and num_inference_steps. - The base unit represents latency for a 16x16 resolution, single frame, single step. - """ - - if base_time_ms is None: - return None - - width = req.width if req.width is not None else args.width - height = req.height if req.height is not None else args.height - if width is None or height is None: - return None - - frames = req.num_frames if req.num_frames is not None else args.num_frames - steps = req.num_inference_steps if req.num_inference_steps is not None else args.num_inference_steps - - frame_scale = frames if isinstance(frames, int) and frames > 0 else 1 - step_scale = steps if isinstance(steps, int) and steps > 0 else 1 - - area_units = max((float(width) * float(height)) / float(16 * 16), 1.0) - return float(base_time_ms) * area_units * frame_scale * step_scale - - -def _infer_slo_base_time_ms_from_warmups( - warmup_pairs: list[tuple[RequestFuncInput, RequestFuncOutput]], - args, -) -> float | None: - """Infer base SLO unit time from warmup requests. - - Returns the median base latency (ms) for a 16x16 resolution, single-frame, - single-step request. Only uses warmups that succeeded and have resolvable - width/height. - """ - - candidates_ms: list[float] = [] - for req, out in warmup_pairs: - if not out.success or out.latency <= 0: - continue - - width = req.width if req.width is not None else args.width - height = req.height if req.height is not None else args.height - if width is None or height is None: - continue - - frames = req.num_frames if req.num_frames is not None else args.num_frames - steps = req.num_inference_steps if req.num_inference_steps is not None else args.num_inference_steps - - frame_scale = int(frames) if isinstance(frames, int) and frames > 0 else 1 - step_scale = int(steps) if isinstance(steps, int) and steps > 0 else 1 - - area_units = max((float(width) * float(height)) / float(16 * 16), 1.0) - denom = area_units * float(frame_scale) * float(step_scale) - if denom <= 0: - continue - - candidates_ms.append((out.latency * 1000.0) / denom) - - if not candidates_ms: - return None - return float(np.median(candidates_ms)) - - -def _populate_slo_ms_from_warmups( - requests_list: list[RequestFuncInput], - warmup_pairs: list[tuple[RequestFuncInput, RequestFuncOutput]], - args, -) -> list[RequestFuncInput]: - """Populate missing RequestFuncInput.slo_ms using warmup outputs. - - - If a request already has slo_ms (e.g., trace-provided), it is kept as-is. - - If any request has slo_ms is None and we can infer base time from warmups, - we estimate each missing request's expected execution time and set: - req.slo_ms = expected_latency_ms * args.slo_scale - - Returns updated requests_list. - """ - - if not any(req.slo_ms is None for req in requests_list): - return requests_list - - base_time_ms = _infer_slo_base_time_ms_from_warmups(warmup_pairs, args) - if base_time_ms is None: - return requests_list - - slo_scale = float(getattr(args, "slo_scale", 3.0)) - if slo_scale <= 0: - raise ValueError(f"slo_scale must be positive, got {slo_scale}.") - - updated: list[RequestFuncInput] = [] - for req in requests_list: - if req.slo_ms is not None: - updated.append(req) - continue - expected_ms = _compute_expected_latency_ms_from_base(req, args, base_time_ms) - updated.append(replace(req, slo_ms=(expected_ms * slo_scale) if expected_ms is not None else None)) - - return updated - - -async def iter_requests( - requests_list: list[RequestFuncInput], - request_rate: float, -) -> AsyncGenerator[RequestFuncInput, None]: - """Yield requests using a Poisson process if request_rate is set. - - - If request_rate is inf, all requests are yielded immediately (no sleep). - - Otherwise, inter-arrival times follow an exponential distribution. - """ - - if request_rate != float("inf"): - if request_rate <= 0: - raise ValueError(f"request_rate must be positive or inf, got {request_rate}.") - - for i, req in enumerate(requests_list): - if request_rate != float("inf") and i > 0: - interval_s = random.expovariate(request_rate) - await asyncio.sleep(interval_s) - yield req - - -def calculate_metrics( - outputs: list[RequestFuncOutput], - total_duration: float, - requests_list: list[RequestFuncInput], - args, - slo_enabled: bool, -): - success_outputs = [o for o in outputs if o.success] - error_outputs = [o for o in outputs if not o.success] - - num_success = len(success_outputs) - latencies = [o.latency for o in success_outputs] - peak_memories = [o.peak_memory_mb for o in success_outputs if o.peak_memory_mb > 0] - - # Aggregate per-stage durations across all successful requests that reported them. - stage_duration_lists: dict[str, list[float]] = {} - for o in success_outputs: - for stage, duration in (o.stage_durations or {}).items(): - stage_duration_lists.setdefault(stage, []).append(duration) - stage_durations_mean = {s: float(np.mean(v)) for s, v in stage_duration_lists.items()} - stage_durations_p50 = {s: float(np.percentile(v, 50)) for s, v in stage_duration_lists.items()} - stage_durations_p99 = {s: float(np.percentile(v, 99)) for s, v in stage_duration_lists.items()} - - metrics = { - "duration": total_duration, - "completed_requests": num_success, - "failed_requests": len(error_outputs), - "throughput_qps": num_success / total_duration if total_duration > 0 else 0, - "latency_mean": np.mean(latencies) if latencies else 0, - "latency_median": np.median(latencies) if latencies else 0, - "latency_p99": np.percentile(latencies, 99) if latencies else 0, - "latency_p95": np.percentile(latencies, 95) if latencies else 0, - "latency_p50": np.percentile(latencies, 50) if latencies else 0, - "peak_memory_mb_max": max(peak_memories) if peak_memories else 0, - "peak_memory_mb_mean": np.mean(peak_memories) if peak_memories else 0, - "peak_memory_mb_median": np.median(peak_memories) if peak_memories else 0, - "stage_durations_mean": stage_durations_mean, - "stage_durations_p50": stage_durations_p50, - "stage_durations_p99": stage_durations_p99, - } - - if slo_enabled: - slo_defined_total = 0 - slo_met_success = 0 - - for req, out in zip(requests_list, outputs): - if req.slo_ms is None: - continue - slo_defined_total += 1 - if out.slo_achieved is None: - continue - if out.slo_achieved: - slo_met_success += 1 - - slo_attain_all = (slo_met_success / slo_defined_total) if slo_defined_total > 0 else 0.0 - - metrics.update( - { - "slo_attainment_rate": slo_attain_all, - "slo_met_success": slo_met_success, - "slo_scale": getattr(args, "slo_scale", 3.0), - } - ) - - return metrics - - -def wait_for_service(base_url: str, timeout: int = 120) -> None: - print(f"Waiting for service at {base_url}...") - start_time = time.time() - while True: - try: - # Try /health endpoint first - resp = requests.get(f"{base_url}/health", timeout=1) - if resp.status_code == 200: - print("Service is ready.") - break - except requests.exceptions.RequestException: - pass - - if time.time() - start_time > timeout: - raise TimeoutError(f"Service at {base_url} did not start within {timeout} seconds.") - - time.sleep(1) - - -async def benchmark(args): - # Construct base_url if not provided - if args.base_url is None: - args.base_url = f"http://{args.host}:{args.port}" - - VIDEO_TASKS = {"t2v", "i2v", "ti2v"} - IMAGE_TASKS = {"t2i", "i2i", "ti2i"} - - if args.task in VIDEO_TASKS: - task_type = "2v" - elif args.task in IMAGE_TASKS: - task_type = "2i" - else: - raise ValueError( - f"Unsupported task: '{args.task}'. " - f"Valid video tasks: {sorted(VIDEO_TASKS)}, " - f"Valid image tasks: {sorted(IMAGE_TASKS)}" - ) - - valid_backends = sorted(backends_function_mapping[task_type].keys()) - - if args.backend not in valid_backends: - logger.error( - f"Invalid backend '{args.backend}' for task '{args.task}' (task type: '{task_type}').\n" - f"Valid backends for this task type: {valid_backends}\n" - f"Example usage: --task {args.task} --backend {valid_backends[0]}" - ) - raise ValueError("Backend validation failed. See log above for valid options.") - - # Setup API URL and request function based on backend - request_func, api_url = backends_function_mapping[task_type][args.backend] - api_url = f"{args.base_url}{api_url}" - - if args.dataset == "vbench": - dataset = VBenchDataset(args, api_url, args.model) - elif args.dataset == "trace": - dataset = TraceDataset(args, api_url, args.model) - elif args.dataset == "random": - dataset = RandomDataset(args, api_url, args.model, args.enable_negative_prompt) - else: - raise ValueError(f"Unknown dataset: {args.dataset}") - - print("Loading requests...") - requests_list = dataset.get_requests() - print(f"Prepared {len(requests_list)} requests from {args.dataset} dataset.") - - # Limit concurrency - if args.max_concurrency is not None: - semaphore = asyncio.Semaphore(args.max_concurrency) - else: - semaphore = None - - async def limited_request_func(req, session, pbar): - if semaphore: - async with semaphore: - return await request_func(req, session, pbar) - else: - return await request_func(req, session, pbar) - - # Run benchmark - pbar = tqdm(total=len(requests_list), disable=args.disable_tqdm) - - async with aiohttp.ClientSession() as session: - warmup_pairs: list[tuple[RequestFuncInput, RequestFuncOutput]] = [] - if args.warmup_requests and requests_list: - print( - f"Running {args.warmup_requests} warmup request(s) \ - with num_inference_steps={args.warmup_num_inference_steps}..." - ) - for i in range(args.warmup_requests): - warm_req = requests_list[i % len(requests_list)] - if args.warmup_num_inference_steps is not None: - warm_req = replace( - warm_req, - num_inference_steps=args.warmup_num_inference_steps, - ) - if args.task == "t2v": - warm_req = replace(warm_req, num_frames=1) - warm_out = await limited_request_func(warm_req, session, None) - warmup_pairs.append((warm_req, warm_out)) - - if args.slo: - # Prefer trace-provided per-request slo_ms. Only populate when missing. - requests_list = _populate_slo_ms_from_warmups( - requests_list=requests_list, - warmup_pairs=warmup_pairs, - args=args, - ) - - start_time = time.perf_counter() - tasks = [] - async for req in iter_requests(requests_list=requests_list, request_rate=args.request_rate): - task = asyncio.create_task(limited_request_func(req, session, pbar)) - tasks.append(task) - - outputs = await asyncio.gather(*tasks) - total_duration = time.perf_counter() - start_time - - pbar.close() - - # Calculate metrics - metrics = calculate_metrics(outputs, total_duration, requests_list, args, args.slo) - - # Add configuration info to metrics for JSON output - metrics["backend"] = args.backend - metrics["model"] = args.model - metrics["dataset"] = args.dataset - metrics["task"] = args.task - - print("\n{s:{c}^{n}}".format(s=" Serving Benchmark Result ", n=60, c="=")) - - # Section 1: Configuration - print("{:<40} {:<15}".format("Backend:", args.backend)) - print("{:<40} {:<15}".format("Model:", args.model)) - print("{:<40} {:<15}".format("Dataset:", args.dataset)) - print("{:<40} {:<15}".format("Task:", args.task)) - - # Section 2: Execution & Traffic - print(f"{'-' * 50}") - print("{:<40} {:<15.2f}".format("Benchmark duration (s):", metrics["duration"])) - print("{:<40} {:<15}".format("Request rate:", str(args.request_rate))) - print( - "{:<40} {:<15}".format( - "Max request concurrency:", - str(args.max_concurrency) if args.max_concurrency else "not set", - ) - ) - print("{:<40} {}/{:<15}".format("Successful requests:", metrics["completed_requests"], len(requests_list))) - - # Section 3: Performance Metrics - print(f"{'-' * 50}") - - print("{:<40} {:<15.2f}".format("Request throughput (req/s):", metrics["throughput_qps"])) - print("{:<40} {:<15.4f}".format("Latency Mean (s):", metrics["latency_mean"])) - print("{:<40} {:<15.4f}".format("Latency Median (s):", metrics["latency_median"])) - print("{:<40} {:<15.4f}".format("Latency P99 (s):", metrics["latency_p99"])) - print("{:<40} {:<15.4f}".format("Latency P95 (s):", metrics["latency_p95"])) - - if args.slo: - print(f"{'-' * 50}") - print("{:<40} {:<15.2%}".format("SLO Attainment Rate (all):", metrics.get("slo_attainment_rate", 0.0))) - print("{:<40} {:<15}".format("SLO Met (success count):", str(metrics.get("slo_met_success", 0)))) - print("{:<40} {:<15}".format("SLO Scale:", str(metrics.get("slo_scale", 3.0)))) - - if metrics["peak_memory_mb_max"] > 0: - print(f"{'-' * 50}") - print("{:<40} {:<15.2f}".format("Peak Memory Max (MB):", metrics["peak_memory_mb_max"])) - print("{:<40} {:<15.2f}".format("Peak Memory Mean (MB):", metrics["peak_memory_mb_mean"])) - print("{:<40} {:<15.2f}".format("Peak Memory Median (MB):", metrics["peak_memory_mb_median"])) - - if metrics["stage_durations_mean"]: - print(f"{'-' * 50}") - print("Stage Durations Mean (s):") - for stage, val in metrics["stage_durations_mean"].items(): - print("{:<40} {:<15.4f}".format(f" {stage}:", val)) - - print("\n" + "=" * 60) - - if args.output_file: - with open(args.output_file, "w") as f: - json.dump(metrics, f, indent=2) - print(f"Metrics saved to {args.output_file}") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Benchmark serving for diffusion models.") - parser.add_argument( - "--base-url", - type=str, - default=None, - help="Base URL of the server (e.g., http://localhost:8091). Overrides host/port.", - ) - parser.add_argument("--host", type=str, default="localhost", help="Server host.") - parser.add_argument("--port", type=int, default=8091, help="Server port.") - parser.add_argument("--model", type=str, default="default", help="Model name.") - parser.add_argument( - "--backend", - type=str, - default="vllm-omni", - choices=["vllm-omni", "openai", "v1/videos"], - help="Backend to target the benchmark to.", - ) - parser.add_argument( - "--dataset", - type=str, - default="vbench", - choices=["vbench", "trace", "random"], - help="Dataset to use.", - ) - parser.add_argument( - "--task", - type=str, - default="t2v", - choices=["t2v", "i2v", "ti2v", "ti2i", "i2i", "t2i"], - help="Task type.", - ) - parser.add_argument( - "--dataset-path", - type=str, - default=None, - help="Path to local dataset file (optional).", - ) - parser.add_argument("--num-prompts", type=int, default=10, help="Number of prompts to benchmark.") - parser.add_argument( - "--max-concurrency", - type=int, - default=1, - help="Maximum number of concurrent requests, default to `1`. This can be used " - "to help simulate an environment where a higher level component " - "is enforcing a maximum number of concurrent requests. While the " - "--request-rate argument controls the rate at which requests are " - "initiated, this argument will control how many are actually allowed " - "to execute at a time. This means that when used in combination, the " - "actual request rate may be lower than specified with --request-rate, " - "if the server is not processing requests fast enough to keep up.", - ) - parser.add_argument( - "--request-rate", - type=float, - default=float("inf"), - help="Number of requests per second. If this is inf, then all the requests are sent at time 0. " - "Otherwise, we use Poisson process to synthesize the request arrival times. Default is inf.", - ) - parser.add_argument( - "--warmup-requests", - type=int, - default=1, - help="Number of warmup requests to run before measurement.", - ) - parser.add_argument( - "--warmup-num-inference-steps", - type=int, - default=1, - help="num_inference_steps used for warmup requests.", - ) - parser.add_argument("--width", type=int, default=None, help="Image/Video width.") - parser.add_argument("--height", type=int, default=None, help="Image/Video height.") - parser.add_argument("--num-frames", type=int, default=None, help="Number of frames (for video).") - parser.add_argument( - "--num-inference-steps", - type=int, - default=50, - help="Number of inference steps (for diffusion models).", - ) - parser.add_argument( - "--seed", - type=int, - default=None, - help="Random seed (for diffusion models).", - ) - parser.add_argument("--fps", type=int, default=None, help="FPS (for video).") - parser.add_argument("--output-file", type=str, default=None, help="Output JSON file for metrics.") - parser.add_argument( - "--slo", - action="store_true", - help=( - "Enable SLO calculation and reporting. If trace provides per-request slo_ms, it is used. " - "Otherwise, warmup request(s) are used to infer expected execution time assuming linear " - "scaling by resolution, frames, and steps, then slo_ms = expected_time * --slo-scale." - ), - ) - parser.add_argument( - "--slo-scale", - type=float, - default=3.0, - help="SLO target multiplier: slo_ms = estimated_exec_time_ms * slo_scale (default: 3).", - ) - parser.add_argument("--disable-tqdm", action="store_true", help="Disable progress bar.") - parser.add_argument( - "--enable-negative-prompt", - action="store_true", - default=False, - help="Generate negative prompts when using the random dataset.", - ) - parser.add_argument( - "--random-request-config", - type=str, - default=None, - help=( - "JSON string defining random request profiles. " - "Each profile may contain: width, height, num_inference_steps, etc. " - "The 'weight' field controls sampling probability (relative weight). " - "Example: " - '[{"width":512,"height":512,"num_inference_steps":20,"weight":0.15},' - '{"width":768,"height":768,"num_inference_steps":20,"weight":0.85}]' - ), - ) - parser.add_argument( - "--num-input-images", - type=int, - default=1, - help=( - "Number of synthetic input images to attach for image-conditioned tasks " - "(i2v, ti2v, ti2i, i2i) when using random dataset." - ), - ) - - args = parser.parse_args() - - asyncio.run(benchmark(args)) diff --git a/benchmarks/diffusion/performance_dashboard/qwen_image_serving_performance.md b/benchmarks/diffusion/performance_dashboard/qwen_image_serving_performance.md deleted file mode 100644 index ce022f1a8d9..00000000000 --- a/benchmarks/diffusion/performance_dashboard/qwen_image_serving_performance.md +++ /dev/null @@ -1,169 +0,0 @@ -# Qwen-Image Serving Performance Dashboard - -This document describes how to deploy and benchmark **Qwen-Image** using vLLM-Omni. It includes service startup configuration, acceleration-related options, benchmark methodology, dataset settings, and performance results. - ---- - -# 1. Overview - -Qwen-Image is a multimodal text-to-image generation model served through the vLLM-Omni infrastructure. - -This document covers: - -* Service launch configuration (including acceleration options) -* Benchmark scripts and usage -* Dataset and workload settings -* Performance measurement results -* Reproducibility guidelines - ---- - -# 2. Test Environment -| Component | Specification | -|------------|----------------| -| GPU | NVIDIA A100-SXM4-80GB | -| Diffusion Attention Backend | FlashAttention | - -# 3. Service Launch Configuration - -## 3.1 Basic Serving Command - -```bash -vllm serve Qwen/Qwen-Image --omni \ - --port 8091 -``` - -## 3.2 Key Parameters - -| Parameter | Description | -| --------------------- | ------------------------ | -| `--cfg-parallel-size` | CFG parallelism degree | -| `--ulysses-degree` | Ulysses parallel degree | -| `--vae-patch-parallel-size` | VAE parallel degree | -| `--tensor-parallel-size` | Tensor parallelism degree | - -Record these parameters when reporting performance results. - ---- - -# 4. Benchmark Script - -## 4.1 Benchmark Entry - -```bash -python benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend vllm-omni \ - --dataset \ - --task t2i \ - --num-prompts \ - --max-concurrency \ - --enable-negative-prompt \ - --random-request-config -``` - -## 4.2 Key Benchmark Arguments - -| Parameter | Description | -| ---------------------- | --------------------------------- | -| `--backend` | Serving backend (use `vllm-omni`) | -| `--dataset` | Dataset name (`random` or custom) | -| `--task` | Task type (e.g., `t2i`) | -| `--num-prompts` | Total number of requests | -| `--max-concurrency` | Client-side concurrency | -| `--random-request-config`| JSON string defining random request | - ---- - -# 5. Dataset & Workload Settings - -## 5.1 Recommended Evaluation Configurations - -### Dataset A ( 512 Resolution) - -* Dataset: `random` -* Task: t2i -* Concurrency: 1 -* Mix Resolution -``` -[ - {"width":512,"height":512,"num_inference_steps":20,"weight":1} -] -``` - -### Dataset B (1536 Resolution) - -* Dataset: `random` -* Task: t2i -* Concurrency: 1 -* Mix Resolution -``` -[ - {"width":1536,"height":1536,"num_inference_steps":35,"weight":1} -] -``` - -### Dataset C (Mix Resolution) - -* Dataset: `random` -* Task: t2i -* Concurrency: 1 -* Mix Resolution -``` -[ - {"width":512,"height":512,"num_inference_steps":20,"weight":0.15}, - {"width":768,"height":768,"num_inference_steps":20,"weight":0.25}, - {"width":1024,"height":1024,"num_inference_steps":25,"weight":0.45}, - {"width":1536,"height":1536,"num_inference_steps":35,"weight":0.15} -] -``` ---- - -## 5.2 Example Benchmark Command - -```bash -python benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend vllm-omni \ - --dataset random \ - --task t2i \ - --num-prompts 1 \ - --max-concurrency 1 \ - --enable-negative-prompt \ - --random-request-config '[ - {"width":512,"height":512,"num_inference_steps":20,"weight":1} - ]' -``` - ---- - -# 6. Performance Metrics - -The following metrics are collected during benchmarking: - -| Metric | Description | Unit | -| ------------------ | ----------------------------- | ------- | -| Mean Latency | Mean of latency | seconds | -| P99 Latency | P99 of latency | seconds | - ---- - -# 7. Performance Results - -| Dataset Configuration | Max Concur. | CFG | Usp | Tp | VAE Parallel | Mean Latency (s) | P99 Latency (s) | -|-----------------------|-----|-----|-----|----|--------------|------------------|------------------| -| Dataset A | 1 | 2 | 2 | Off | Off | 2.2087 | 2.2087 | -| Dataset B | 1 | 2 | 2 | Off | Off | 19.6739 | 19.6739 | -| Dataset C | 1 | 2 | 2 | Off | Off | 5.67259 | 18.6234 | ---- - -# 8. Reproducibility Checklist - -To ensure consistent and comparable benchmark results: - -* Record GPU type -* Record parallel configuration -* Record benchmark parameters (resolution, concurrency, number of prompts) -* Ensure no background workload on GPUs during testing - ---- - -This document serves as the official Qwen-Image serving performance reference under vLLM-Omni. diff --git a/benchmarks/diffusion/performance_dashboard/wan_2_2_serving_performance.md b/benchmarks/diffusion/performance_dashboard/wan_2_2_serving_performance.md deleted file mode 100644 index 9d6c40ece36..00000000000 --- a/benchmarks/diffusion/performance_dashboard/wan_2_2_serving_performance.md +++ /dev/null @@ -1,170 +0,0 @@ -# Wan2.2 Serving Performance Dashboard - -This document describes how to deploy and benchmark **Wan-AI/Wan2.2-T2V-A14B-Diffusers** using vLLM-Omni. It includes service startup configuration, acceleration-related options, benchmark methodology, dataset settings, and performance results. - ---- - -# 1. Overview - -Wan-AI/Wan2.2-T2V-A14B-Diffusers is a multimodal text-to-video generation model served through the vLLM-Omni infrastructure. - -This document covers: - -* Service launch configuration (including acceleration options) -* Benchmark scripts and usage -* Dataset and workload settings -* Performance measurement results -* Reproducibility guidelines - ---- - -# 2. Test Environment -| Component | Specification | -|------------|----------------| -| GPU | NVIDIA A100-SXM4-80GB | -| Diffusion Attention Backend | FlashAttention | - -# 3. Service Launch Configuration - -## 3.1 Basic Serving Command - -```bash -vllm serve Wan-AI/Wan2.2-T2V-A14B-Diffusers --omni \ - --port 8091 -``` - -## 3.2 Key Parameters - -| Parameter | Description | -| --------------------- | ------------------------ | -| `--cfg-parallel-size` | CFG parallelism degree | -| `--ulysses-degree` | Ulysses parallel degree | -| `--vae-patch-parallel-size` | VAE parallel degree | -| `--tensor-parallel-size` | Tensor parallelism degree | -| `--use-hsdp` | Enable Hybrid Sharded Data Parallel to shard model weights across GPUs | - -Record these parameters when reporting performance results. - ---- - -# 4. Benchmark Script - -## 4.1 Benchmark Entry - -```bash -python benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend v1/videos \ - --dataset \ - --task t2v \ - --num-prompts \ - --max-concurrency \ - --enable-negative-prompt \ - --random-request-config -``` - -## 4.2 Key Benchmark Arguments - -| Parameter | Description | -| ---------------------- | --------------------------------- | -| `--backend` | Serving backend (use `v1/videos`) | -| `--dataset` | Dataset name (`random` or custom) | -| `--task` | Task type (e.g., `t2v`) | -| `--num-prompts` | Total number of requests | -| `--max-concurrency` | Client-side concurrency | -| `--random-request-config`| JSON string defining random request | - ---- - -# 5. Dataset & Workload Settings - -## 5.1 Recommended Evaluation Configurations - -### Dataset A (480p) - -* Dataset: `random` -* Task: t2v -* Concurrency: 1 -* Mix Resolution -``` -[ - {"width":854,"height":480,"num_inference_steps":3,"num_frames":80,"fps":16,"weight":1} -] -``` -### Dataset B (720p) - -* Dataset: `random` -* Task: t2v -* Concurrency: 1 -* Mix Resolution -``` -[ - {"width":1280,"height":720,"num_inference_steps":6,"num_frames":80,"fps":16,"weight":1} -] -``` -### Dataset C (Mix Resolution) - -* Dataset: `random` -* Task: t2v -* Concurrency: 1 -* Mix Resolution -``` -[ - {"width":854,"height":480,"num_inference_steps":3,"num_frames":80,"fps":16,"weight":0.15}, - {"width":854,"height":480,"num_inference_steps":4,"num_frames":120,"fps":24,"weight":0.25}, - {"width":1280,"height":720,"num_inference_steps":6,"num_frames":80,"fps":16,"weight":0.6} -] -``` ---- - -## 5.2 Example Benchmark Command - -```bash -python benchmarks/diffusion/diffusion_benchmark_serving.py \ - --backend v1/videos \ - --dataset random \ - --task t2v \ - --num-prompts 1 \ - --max-concurrency 1 \ - --enable-negative-prompt \ - --random-request-config '[ - {"width":854,"height":480,"num_inference_steps":18,"num_frames": 33,"fps":16",weight":1} - ]' -``` - ---- - -# 6. Performance Metrics - -The following metrics are collected during benchmarking: - -| Metric | Description | Unit | -| ------------------ | ----------------------------- | ------- | -| Mean Latency | Mean of latency | seconds | -| P99 Latency | P99 of latency | seconds | - ---- - -# 7. Performance Results - -| Dataset Configuration | Max Concur. | CFG | Usp | Tp | Hsdp | VAE Parallel | Mean Latency (s) | P99 Latency (s) | -|-----------------------|-----|-----|-----|-----|----|--------------|------------------|------------------| -| Dataset A | 1 | 2 | 2 | 1 | On | 1 | 24.6766 | 24.6766 | -| Dataset A | 1 | 2 | 2 | 1 | On | 4 | 21.6810 | 21.6810 | -| Dataset B | 1 | 2 | 2 | 1 | On | 1 | 124.6639 | 124.6639 | -| Dataset B | 1 | 2 | 2 | 1 | On | 4 | 117.44 | 117.44 | -| Dataset C | 1 | 2 | 2 | 1 | On | 1 | 79.2175 | 124.2565 | -| Dataset C | 1 | 2 | 2 | 1 | On | 4 | 74.4977 | 117.710 | ---- - -# 8. Reproducibility Checklist - -To ensure consistent and comparable benchmark results: - -* Record GPU type -* Record parallel configuration -* Record benchmark parameters (resolution, concurrency, number of prompts) -* Ensure no background workload on GPUs during testing - ---- - -This document serves as the official Wan2.2 serving performance reference under vLLM-Omni. diff --git a/benchmarks/diffusion/quantization_quality.py b/benchmarks/diffusion/quantization_quality.py deleted file mode 100644 index 4a916e7ea62..00000000000 --- a/benchmarks/diffusion/quantization_quality.py +++ /dev/null @@ -1,460 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -""" -Benchmark quantization quality loss for diffusion models (image & video). - -Generates outputs with BF16 (baseline) and a quantized config using the same -seed, then computes LPIPS perceptual distance between them. Results are printed -as a Markdown table ready to paste into a PR description. - -Requirements: - pip install lpips Pillow numpy - -Image example (text-to-image): - python benchmarks/diffusion/quantization_quality.py \ - --model Tongyi-MAI/Z-Image-Turbo \ - --task t2i \ - --quantization fp8 \ - --prompts \ - "an aerial view of a coral reef with crystal clear turquoise water" \ - "a campfire in a dark forest with sparks rising into a starry sky" \ - "a gourmet dessert plate with chocolate mousse and gold leaf" \ - --height 1024 --width 1024 \ - --num-inference-steps 50 --seed 42 - -Video example (text-to-video): - python benchmarks/diffusion/quantization_quality.py \ - --model Wan-AI/Wan2.2-T2V-A14B-Diffusers \ - --task t2v \ - --quantization fp8 \ - --prompts \ - "A serene lakeside sunrise with mist over the water" \ - "A cat walking across a wooden bridge in autumn" \ - --height 720 --width 1280 \ - --num-frames 81 --num-inference-steps 40 --seed 42 - -Multiple quantization methods: - python benchmarks/diffusion/quantization_quality.py \ - --model Tongyi-MAI/Z-Image-Turbo \ - --task t2i \ - --quantization fp8 int8 bitsandbytes \ - --prompts "a cup of coffee on the table" \ - --height 1024 --width 1024 \ - --num-inference-steps 50 --seed 42 - -Output directory structure (--output-dir, default: ./quant_bench_output): - quant_bench_output/ - baseline/ # BF16 outputs - / # Quantized outputs per method - results.md # Markdown table -""" - -import argparse -import gc -import time -from pathlib import Path - -import numpy as np -import torch - - -def compute_lpips_images( - baseline_images: list, - quantized_images: list, - net: str = "alex", -) -> list[float]: - """Compute LPIPS between paired lists of PIL images.""" - import lpips - from torchvision import transforms - - loss_fn = lpips.LPIPS(net=net).eval() - if torch.cuda.is_available(): - loss_fn = loss_fn.cuda() - - transform = transforms.Compose( - [ - transforms.Resize((256, 256)), - transforms.ToTensor(), - transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]), - ] - ) - - scores = [] - for img_bl, img_qt in zip(baseline_images, quantized_images): - t_bl = transform(img_bl.convert("RGB")).unsqueeze(0) - t_qt = transform(img_qt.convert("RGB")).unsqueeze(0) - if torch.cuda.is_available(): - t_bl, t_qt = t_bl.cuda(), t_qt.cuda() - with torch.no_grad(): - score = loss_fn(t_bl, t_qt).item() - scores.append(score) - return scores - - -def compute_lpips_video( - baseline_frames: np.ndarray, - quantized_frames: np.ndarray, - net: str = "alex", -) -> float: - """Compute mean per-frame LPIPS for a video pair. - - Args: - baseline_frames: (F, H, W, C) float array in [0, 1]. - quantized_frames: same shape. - - Returns: - Mean LPIPS across all frames. - """ - import lpips - - loss_fn = lpips.LPIPS(net=net).eval() - if torch.cuda.is_available(): - loss_fn = loss_fn.cuda() - - num_frames = min(len(baseline_frames), len(quantized_frames)) - scores = [] - for i in range(num_frames): - # Convert (H, W, C) float [0,1] -> (1, C, H, W) float [-1, 1] - f_bl = torch.from_numpy(baseline_frames[i]).permute(2, 0, 1).unsqueeze(0).float() * 2 - 1 - f_qt = torch.from_numpy(quantized_frames[i]).permute(2, 0, 1).unsqueeze(0).float() * 2 - 1 - if torch.cuda.is_available(): - f_bl, f_qt = f_bl.cuda(), f_qt.cuda() - with torch.no_grad(): - score = loss_fn(f_bl, f_qt).item() - scores.append(score) - return float(np.mean(scores)) - - -def _build_omni_kwargs(args, quantization=None): - """Build kwargs dict for Omni() constructor.""" - from vllm_omni.diffusion.data import DiffusionParallelConfig - - parallel_config = DiffusionParallelConfig( - ulysses_degree=args.ulysses_degree, - ring_degree=args.ring_degree, - tensor_parallel_size=args.tensor_parallel_size, - ) - kwargs = { - "model": args.model, - "parallel_config": parallel_config, - "enforce_eager": args.enforce_eager, - } - if quantization: - kwargs["quantization_config"] = quantization - return kwargs - - -def _generate_image(omni, args, prompt, seed): - """Generate a single image and return (PIL.Image, time_seconds, memory_gib).""" - from vllm_omni.inputs.data import OmniDiffusionSamplingParams - from vllm_omni.platforms import current_omni_platform - - generator = torch.Generator(device=current_omni_platform.device_type).manual_seed(seed) - torch.cuda.reset_peak_memory_stats() - start = time.perf_counter() - outputs = omni.generate( - {"prompt": prompt}, - OmniDiffusionSamplingParams( - height=args.height, - width=args.width, - generator=generator, - num_inference_steps=args.num_inference_steps, - ), - ) - elapsed = time.perf_counter() - start - peak_mem = torch.cuda.max_memory_allocated() / (1024**3) - - first = outputs[0] - req_out = first.request_output[0] if hasattr(first, "request_output") else first - img = req_out.images[0] - return img, elapsed, peak_mem - - -def _generate_video(omni, args, prompt, seed): - """Generate a video and return (np.ndarray [F,H,W,C], time_seconds, memory_gib).""" - from vllm_omni.inputs.data import OmniDiffusionSamplingParams - from vllm_omni.outputs import OmniRequestOutput - from vllm_omni.platforms import current_omni_platform - - generator = torch.Generator(device=current_omni_platform.device_type).manual_seed(seed) - torch.cuda.reset_peak_memory_stats() - start = time.perf_counter() - outputs = omni.generate( - {"prompt": prompt, "negative_prompt": ""}, - OmniDiffusionSamplingParams( - height=args.height, - width=args.width, - generator=generator, - guidance_scale=args.guidance_scale, - num_inference_steps=args.num_inference_steps, - num_frames=args.num_frames, - ), - ) - elapsed = time.perf_counter() - start - peak_mem = torch.cuda.max_memory_allocated() / (1024**3) - - first = outputs[0] - if hasattr(first, "request_output") and isinstance(first.request_output, list): - inner = first.request_output[0] - if isinstance(inner, OmniRequestOutput) and hasattr(inner, "images"): - frames = inner.images[0] if inner.images else None - else: - frames = inner - elif hasattr(first, "images") and first.images: - frames = first.images - else: - raise ValueError("Could not extract video frames from output.") - - if isinstance(frames, torch.Tensor): - video = frames.detach().cpu() - if video.dim() == 5: - video = video[0].permute(1, 2, 3, 0) if video.shape[1] in (3, 4) else video[0] - elif video.dim() == 4 and video.shape[0] in (3, 4): - video = video.permute(1, 2, 3, 0) - if video.is_floating_point(): - video = video.clamp(-1, 1) * 0.5 + 0.5 - frames_array = video.float().numpy() - else: - frames_array = np.asarray(frames) - if frames_array.ndim == 5: - frames_array = frames_array[0] - - return frames_array, elapsed, peak_mem - - -def _unload_omni(omni): - """Delete Omni instance and free GPU memory.""" - del omni - gc.collect() - if torch.cuda.is_available(): - torch.cuda.empty_cache() - torch.cuda.synchronize() - - -def run_benchmark(args): - from vllm_omni.entrypoints.omni import Omni - - output_dir = Path(args.output_dir) - output_dir.mkdir(parents=True, exist_ok=True) - - is_video = args.task == "t2v" - prompts = args.prompts - seed = args.seed - - # Determine configs to benchmark - configs = [] # list of (label, quantization_method) - for method in args.quantization: - configs.append((method, method)) - - # --- Baseline run --- - print("\n" + "=" * 60) - print("Running BF16 baseline...") - print("=" * 60) - bl_kwargs = _build_omni_kwargs(args, quantization=None) - omni_bl = Omni(**bl_kwargs) - - baseline_outputs = {} # prompt -> (output, time, mem) - for prompt in prompts: - print(f" Generating: {prompt[:60]}...") - if is_video: - out, t, mem = _generate_video(omni_bl, args, prompt, seed) - else: - out, t, mem = _generate_image(omni_bl, args, prompt, seed) - baseline_outputs[prompt] = (out, t, mem) - - bl_avg_time = np.mean([v[1] for v in baseline_outputs.values()]) - bl_mem = baseline_outputs[prompts[0]][2] # use first prompt's memory - _unload_omni(omni_bl) - - # Save baseline outputs - bl_dir = output_dir / "baseline" - bl_dir.mkdir(parents=True, exist_ok=True) - for i, prompt in enumerate(prompts): - out = baseline_outputs[prompt][0] - if is_video: - try: - from diffusers.utils import export_to_video - - frames_list = list(out) if isinstance(out, np.ndarray) and out.ndim == 4 else out - export_to_video(frames_list, str(bl_dir / f"prompt_{i}.mp4"), fps=args.fps) - except ImportError: - np.save(bl_dir / f"prompt_{i}.npy", out) - else: - out.save(bl_dir / f"prompt_{i}.png") - - # --- Quantized runs --- - all_results = [] # list of dicts - - for config_label, quant_method in configs: - print(f"\n{'=' * 60}") - print(f"Running: {config_label}...") - print("=" * 60) - - qt_kwargs = _build_omni_kwargs(args, quantization=quant_method) - omni_qt = Omni(**qt_kwargs) - - qt_outputs = {} - for prompt in prompts: - print(f" Generating: {prompt[:60]}...") - if is_video: - out, t, mem = _generate_video(omni_qt, args, prompt, seed) - else: - out, t, mem = _generate_image(omni_qt, args, prompt, seed) - qt_outputs[prompt] = (out, t, mem) - - qt_avg_time = np.mean([v[1] for v in qt_outputs.values()]) - qt_mem = qt_outputs[prompts[0]][2] - _unload_omni(omni_qt) - - # Save quantized outputs - qt_dir = output_dir / config_label.replace(" ", "_") - qt_dir.mkdir(parents=True, exist_ok=True) - - # Compute LPIPS per prompt - per_prompt = [] - for i, prompt in enumerate(prompts): - bl_out = baseline_outputs[prompt][0] - qt_out = qt_outputs[prompt][0] - if is_video: - lpips_score = compute_lpips_video(bl_out, qt_out, net=args.lpips_net) - try: - from diffusers.utils import export_to_video - - frames_list = list(qt_out) if isinstance(qt_out, np.ndarray) and qt_out.ndim == 4 else qt_out - export_to_video(frames_list, str(qt_dir / f"prompt_{i}.mp4"), fps=args.fps) - except ImportError: - np.save(qt_dir / f"prompt_{i}.npy", qt_out) - else: - lpips_score = compute_lpips_images([bl_out], [qt_out], net=args.lpips_net)[0] - qt_out.save(qt_dir / f"prompt_{i}.png") - per_prompt.append({"prompt": prompt, "lpips": lpips_score}) - - mean_lpips = np.mean([p["lpips"] for p in per_prompt]) - speedup = bl_avg_time / qt_avg_time if qt_avg_time > 0 else float("inf") - mem_reduction = (bl_mem - qt_mem) / bl_mem * 100 - - all_results.append( - { - "config": config_label, - "avg_time": qt_avg_time, - "speedup": speedup, - "memory_gib": qt_mem, - "mem_reduction_pct": mem_reduction, - "mean_lpips": mean_lpips, - "per_prompt": per_prompt, - } - ) - - # --- Print results --- - print("\n\n") - print("=" * 80) - print("RESULTS") - print("=" * 80) - - # Summary table - lines = [] - lines.append(f"## Quantization Quality Benchmark — {args.model.split('/')[-1]}") - lines.append( - f"Setup: {args.height}x{args.width}, {args.num_inference_steps} steps, " - f"seed={args.seed}, LPIPS ({args.lpips_net})" - ) - if is_video: - lines.append(f"Video: {args.num_frames} frames") - lines.append("") - lines.append("### Summary") - lines.append("") - lines.append("| Config | Avg Time | Speedup | Memory (GiB) | Mem Reduction | Mean LPIPS |") - lines.append("|--------|----------|---------|--------------|---------------|------------|") - lines.append(f"| BF16 baseline | {bl_avg_time:.2f}s | 1.00x | {bl_mem:.2f} | — | (ref) |") - for r in all_results: - lines.append( - f"| {r['config']} | {r['avg_time']:.2f}s | {r['speedup']:.2f}x " - f"| {r['memory_gib']:.2f} | {r['mem_reduction_pct']:.0f}% " - f"| {r['mean_lpips']:.4f} |" - ) - lines.append("") - lines.append("> LPIPS < 0.01 = imperceptible, > 0.1 = clearly noticeable.") - lines.append("") - - # Per-prompt table - if len(prompts) > 1: - lines.append("### Per-Prompt LPIPS") - lines.append("") - header = "| Prompt |" - sep = "|--------|" - for r in all_results: - header += f" {r['config']} |" - sep += "--------|" - lines.append(header) - lines.append(sep) - for i, prompt in enumerate(prompts): - short = prompt[:50] + "..." if len(prompt) > 50 else prompt - row = f"| {short} |" - for r in all_results: - row += f" {r['per_prompt'][i]['lpips']:.4f} |" - lines.append(row) - lines.append("") - - md = "\n".join(lines) - print(md) - - # Save markdown - results_path = output_dir / "results.md" - results_path.write_text(md, encoding="utf-8") - print(f"\nResults saved to {results_path}") - print(f"Baseline outputs in {bl_dir}") - for r in all_results: - qt_dir = output_dir / r["config"].replace(" ", "_") - print(f"Quantized outputs in {qt_dir}") - - -def parse_args(): - parser = argparse.ArgumentParser( - description="Benchmark quantization quality loss for diffusion models.", - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - parser.add_argument("--model", required=True, help="Model name or local path.") - parser.add_argument( - "--task", - default="t2i", - choices=["t2i", "t2v"], - help="Task type: t2i (text-to-image) or t2v (text-to-video).", - ) - parser.add_argument( - "--quantization", - nargs="+", - required=True, - help="One or more quantization methods to benchmark (e.g. fp8 int8 bitsandbytes).", - ) - parser.add_argument( - "--prompts", - nargs="+", - default=["a cup of coffee on the table"], - help="One or more prompts to generate.", - ) - parser.add_argument("--seed", type=int, default=42) - parser.add_argument("--height", type=int, default=1024) - parser.add_argument("--width", type=int, default=1024) - parser.add_argument("--num-inference-steps", type=int, default=50) - parser.add_argument("--num-frames", type=int, default=81, help="Number of video frames (t2v only).") - parser.add_argument("--fps", type=int, default=24, help="Video FPS for saving (t2v only).") - parser.add_argument("--guidance-scale", type=float, default=4.0, help="CFG scale (used for video).") - parser.add_argument("--output-dir", type=str, default="./quant_bench_output", help="Directory to save outputs.") - parser.add_argument( - "--lpips-net", - type=str, - default="alex", - choices=["alex", "vgg", "squeeze"], - help="LPIPS backbone network.", - ) - parser.add_argument("--ulysses-degree", type=int, default=1) - parser.add_argument("--ring-degree", type=int, default=1) - parser.add_argument("--tensor-parallel-size", type=int, default=1) - parser.add_argument("--enforce-eager", action="store_true") - return parser.parse_args() - - -if __name__ == "__main__": - args = parse_args() - run_benchmark(args) diff --git a/benchmarks/distributed/omni_connectors/README.md b/benchmarks/distributed/omni_connectors/README.md deleted file mode 100644 index ab7346441bb..00000000000 --- a/benchmarks/distributed/omni_connectors/README.md +++ /dev/null @@ -1,397 +0,0 @@ -# RDMA Test Configuration Guide - -This document explains how to configure the RDMA environment and run tests for `MooncakeTransferEngineConnector`. - -## Table of Contents - -- [Docker Container Permissions](#docker-container-permissions) -- [Single-Node Testing](#single-node-testing) -- [Multi-Node Testing](#multi-node-testing) -- [Running Tests](#running-tests) -- [Cross-Node Testing](#cross-node-testing) -- [Troubleshooting](#troubleshooting) - ---- - -## Docker Container Permissions - -RDMA tests require access to InfiniBand/RoCE devices and system topology. Add the following permissions when running `docker run`. - -### Option 1: Minimal Permissions (Recommended) - -```bash -docker run -it \ - --cap-add=SYS_PTRACE \ - --cap-add=IPC_LOCK \ - --security-opt seccomp=unconfined \ - --network=host \ - --device=/dev/infiniband \ - -v /sys/class/infiniband:/sys/class/infiniband:ro \ - your-image:tag -``` - -Parameter explanation: -- `--cap-add=SYS_PTRACE`: Allow reading system topology information -- `--cap-add=IPC_LOCK`: Allow memory locking (required for RDMA memory registration) -- `--security-opt seccomp=unconfined`: Disable seccomp restrictions -- `--network=host`: Use host network (required for RDMA) -- `--device=/dev/infiniband`: Mount InfiniBand devices -- `-v /sys/class/infiniband`: Mount IB device info (read-only) - -### Option 2: Full Permissions (Quick but not recommended for production) - -```bash -docker run -it \ - --privileged \ - --network=host \ - your-image:tag -``` - -`--privileged` grants full host permissions. Suitable for quick testing but not recommended for production. - ---- - -## Single-Node Testing - -When running single-node tests (producer and consumer on the same machine), ensure they use the **same RDMA device**. - -### Problem Background - -InfiniBand devices use LID (Local Identifier) for routing. Different devices have different LIDs and cannot communicate directly. If no device is specified, Mooncake may assign different devices to connectors, causing handshake failures. - -Common error: -``` -[Handshake] Failed to modify QP to RTR, check mtu, gid, peer lid, peer qp num: Invalid argument [22] -``` - -### Solution - -**Method 1: Set Environment Variable (Recommended)** - -```bash -# List available RDMA devices -ibstat - -# Select a device (e.g., mlx5_0) -export RDMA_DEVICE_NAME='mlx5_0' - -# Run tests -pytest test_mooncake_transfer_engine_rdma.py -v -s -``` - -**Method 2: Use RoCE Devices** - -If the system has RoCE devices (using IPv4 routing), the test code will automatically detect and prefer them. RoCE device GIDs start with `00:00:00:00:00:00:00:00:00:00:ff:ff` (IPv4-mapped). - -**Method 3: Ensure MTU Consistency** - -Make sure both endpoints use the same MTU: - -```bash -# Check device MTU -ibstatus mlx5_0 -``` - ---- - -## Multi-Node Testing - -For multi-node tests, producer and consumer run on different machines connected via InfiniBand switch. - -### Prerequisites - -1. Both machines have Mooncake and RDMA drivers installed -2. Both machines are in the same InfiniBand subnet -3. Switch is properly configured - -### Configuration - -**Machine A (Producer):** - -```bash -# Set RDMA host IP (InfiniBand interface IP) -export RDMA_TEST_HOST='10.0.0.1' - -# Optional: Specify device -export RDMA_DEVICE_NAME='mlx5_0' -``` - -**Machine B (Consumer):** - -```bash -# Set RDMA host IP -export RDMA_TEST_HOST='10.0.0.2' - -# Optional: Specify device -export RDMA_DEVICE_NAME='mlx5_0' -``` - -### Verify Connectivity - -```bash -# Ping IB interface -ping 10.0.0.2 - -# Test RDMA connectivity with ibping -# On Machine B (server) -ibping -S - -# On Machine A (client) -ibping -G -``` - ---- - -## Running Tests - -### Run All RDMA Tests (Single-Node, fast suite) - -Slow tests (large payloads, stress, concurrency integrity) are marked `@pytest.mark.slow`. Use `-m "not slow"` to skip them in quick CI or local fast iteration. - -```bash -cd tests/distributed/omni_connectors - -# Fast suite only (excludes slow/stress tests) -pytest test_mooncake_transfer_engine_rdma.py test_mooncake_transfer_engine_buffer.py -v -s -m "not slow" -``` - -### Run Including Slow Tests - -```bash -# Run ALL tests including slow/stress tests -pytest test_mooncake_transfer_engine_rdma.py test_mooncake_transfer_engine_buffer.py -v -s - -# Run ONLY the slow/stress tests -pytest test_mooncake_transfer_engine_rdma.py test_mooncake_transfer_engine_buffer.py -v -s -m slow -``` - -### Run Buffer Management Tests - -```bash -# Fast only -pytest test_mooncake_transfer_engine_buffer.py -v -s -m "not slow" - -# Including allocator invariant tests (double-free, overlap, merge) -pytest test_mooncake_transfer_engine_buffer.py -v -s -``` - -### Run Specific Test Classes - -```bash -# Basic connector tests -pytest test_mooncake_transfer_engine_rdma.py::TestBasicConnector -v -s - -# End-to-end RDMA transfer tests -pytest test_mooncake_transfer_engine_rdma.py::TestEndToEnd -v -s - -# Lifecycle & resource management tests -pytest test_mooncake_transfer_engine_rdma.py::TestLifecycle -v -s - -# GPU memory pool tests (requires CUDA) -pytest test_mooncake_transfer_engine_rdma.py::TestGPUPool -v -s - -# Stress / correctness tests (slow) -pytest test_mooncake_transfer_engine_rdma.py::TestStressCorrectness -v -s -``` - -### RDMA Environment Diagnostics - -For quick diagnostics (device status, Mooncake availability, env vars, etc.), -see the [Troubleshooting section](../../../docs/design/feature/omni_connectors/mooncake_transfer_engine_connector.md#troubleshooting) -in the connector documentation. - ---- - -## Cross-Node Testing - -The `cross_node_mooncake_transfer_engine.py` script enables testing RDMA transfers between two separate physical machines. This script is **not** auto-discovered by `pytest` (it does not start with `test_`) — it must be run manually on each node. - -### Prerequisites - -1. Both machines have Mooncake installed -2. Both machines are connected via InfiniBand/RoCE switch -3. Firewall allows ZMQ ports (default: 15500, 15501) -4. Same RDMA device name on both nodes (if multiple devices exist) - -### Running Cross-Node Tests - -**On Machine A (Producer) — start first:** - -```bash -cd benchmarks/distributed/omni_connectors/ - -# Optional: specify device if multiple exist -export RDMA_DEVICE_NAME='mlx5_0' - -python cross_node_mooncake_transfer_engine.py \ - --role producer \ - --local-host \ - --remote-host \ - --tensor-size-mb 100 \ - --num-transfers 3 -``` - -**On Machine B (Consumer) — start after producer:** - -```bash -cd benchmarks/distributed/omni_connectors/ - -export RDMA_DEVICE_NAME='mlx5_0' - -python cross_node_mooncake_transfer_engine.py \ - --role consumer \ - --local-host \ - --remote-host \ - --tensor-size-mb 100 \ - --num-transfers 3 -``` - -### Transfer Modes - -| Mode | Description | Example | -|------|-------------|---------| -| `copy` | Normal path — tensor copied to RDMA pool (default) | `--mode copy` | -| `zerocopy` | Zero-copy path — data created directly in RDMA pool | `--mode zerocopy` | -| `gpu` | GPU transfer — RDMA pool on GPU, uses GPUDirect | `--mode gpu --gpu-id 0` | - -### Benchmark Mode - -Skip MD5 verification and measure pure RDMA throughput: - -```bash -# Producer -python cross_node_mooncake_transfer_engine.py \ - --role producer \ - --local-host \ - --remote-host \ - --tensor-size-mb 1024 \ - --num-transfers 20 \ - --benchmark - -# Consumer -python cross_node_mooncake_transfer_engine.py \ - --role consumer \ - --local-host \ - --remote-host \ - --tensor-size-mb 1024 \ - --num-transfers 20 \ - --benchmark -``` - -### Cross-Node Test Options - -| Option | Description | Default | -|--------|-------------|---------| -| `--role` | `producer` or `consumer` | Required | -| `--local-host` | Local RDMA IP address | Required | -| `--remote-host` | Remote RDMA IP address | Required | -| `--local-port` | Local ZMQ port for RDMA data | 15500 | -| `--remote-port` | Remote ZMQ port for RDMA data | 15500 | -| `--ctrl-port` | Control channel port | 15501 | -| `--tensor-size-mb` | Tensor size in MB | 100 | -| `--num-transfers` | Number of transfers | 3 | -| `--mode` | `copy`, `zerocopy`, or `gpu` | `copy` | -| `--gpu-id` | GPU ID for GPU mode | 0 | -| `--benchmark` | Skip MD5, pure performance test | off | - ---- - -## Troubleshooting - -### 1. "Failed to modify QP to RTR" Error - -**Cause**: QP handshake failed, usually due to device configuration mismatch. - -**Solution**: -```bash -# Force using the same device -export RDMA_DEVICE_NAME='mlx5_0' -``` - -### 2. "Mooncake TransferEngine is not available" - -**Cause**: Mooncake not installed or import failed. - -**Solution**: -```bash -# Check Mooncake installation -python -c "from mooncake.engine import TransferEngine; print('OK')" - -# Reinstall if needed -pip install mooncake-transfer-engine -# Or using uv -uv pip install mooncake-transfer-engine - -``` - -### 3. "Permission denied" accessing /dev/infiniband - -**Cause**: Container lacks IB device access permissions. - -**Solution**: -```bash -docker run --device=/dev/infiniband --cap-add=IPC_LOCK ... -``` - -### 4. Test Timeout - -**Cause**: RDMA connection establishment failed or network latency. - -**Solution**: -```bash -# Check network status -ibstat -ibstatus -``` - -### 5. GPU Test Failed "CUDA is not available" - -**Cause**: CUDA environment not configured or GPU unavailable. - -**Solution**: -```bash -# Check CUDA -python -c "import torch; print(torch.cuda.is_available())" - -# Docker needs NVIDIA runtime -docker run --gpus all ... -``` - ---- - -## Environment Variables Reference - -| Variable | Description | Example | -|----------|-------------|---------| -| `RDMA_DEVICE_NAME` | Specify RDMA device name | `mlx5_0` | -| `RDMA_TEST_HOST` | Specify test host IP | `10.0.0.1` | -| `MC_TE_METRIC` | Enable Mooncake metrics | `1` | -| `MC_IB_PCI_RELAXED_ORDERING` | Enable PCIe relaxed ordering | `1` | - ---- - -## Test Files Overview - -| File | Description | Auto-discovered by pytest | -|------|-------------|--------------------------| -| `test_mooncake_transfer_engine_rdma.py` | Integration tests for MooncakeTransferEngineConnector (basic, E2E, lifecycle, GPU) | Yes | -| `test_mooncake_transfer_engine_buffer.py` | Memory pool and buffer management unit tests | Yes | -| `cross_node_mooncake_transfer_engine.py` | Cross-node (multi-machine) testing script — run manually | No (filename does not start with `test_`) | - -### test_mooncake_transfer_engine_rdma.py — Test Classes - -| Test Class | Memory Pool | Marker | Description | -|------------|-------------|--------|-------------| -| `TestBasicConnector` | CPU | — | Initialization, put tensor/bytes/object, cleanup, pool exhaustion | -| `TestEndToEnd` | CPU | — | E2E RDMA transfer: tensor, bytes, object, zero-copy, large payload (100MB), mixed types, concurrency | -| `TestLifecycle` | CPU | — | Close, context manager, double-close safety | -| `TestGPUPool` | GPU | — | GPU pool init, put CPU/GPU tensor, GPU E2E transfer | -| `TestStressCorrectness` | CPU | `slow` | Concurrent put+get with MD5 integrity, bidirectional concurrency, edge cases (1-element tensor, empty bytes), 500MB payload, rapid alloc/free cycles | - -### test_mooncake_transfer_engine_buffer.py — Test Classes - -| Test Class | Marker | Description | -|------------|--------|-------------| -| `TestBufferAllocator` | — | Basic alloc/free, alignment, exhaustion/recovery, thread safety | -| `TestAllocatorInvariants` | `slow` | Double-free safety, overlap corruption detection, adjacent-block merging, fragmentation/defrag | -| `TestManagedBuffer` | — | Tensor views, context manager | diff --git a/benchmarks/distributed/omni_connectors/cross_node_mooncake_transfer_engine.py b/benchmarks/distributed/omni_connectors/cross_node_mooncake_transfer_engine.py deleted file mode 100644 index fd01739ccc6..00000000000 --- a/benchmarks/distributed/omni_connectors/cross_node_mooncake_transfer_engine.py +++ /dev/null @@ -1,644 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -""" -Cross-Node RDMA Test Script (Automated Version) - -This script enables testing RDMA transfers between two separate machines. -Supports three transfer modes: - - copy: Normal path - tensor copied to RDMA pool (default) - - zerocopy: Zero-copy path - data created directly in RDMA pool - - gpu: GPU transfer - RDMA pool on GPU, uses GPUDirect - -Usage: - # On Machine A (Producer) - start first: - python cross_node_mooncake_transfer_engine.py --role producer --local-host hostname_A --remote-host hostname_B - - # On Machine B (Consumer) - start after producer: - python cross_node_mooncake_transfer_engine.py --role consumer --local-host hostname_B --remote-host hostname_A - - # Zero-copy mode: - python cross_node_mooncake_transfer_engine.py --role producer ... --mode zerocopy - - # GPU mode (requires GPUDirect RDMA support): - python cross_node_mooncake_transfer_engine.py --role producer ... --mode gpu --gpu-id 0 - - # Benchmark mode (skip random data generation and MD5 verification, - # measures pure RDMA throughput): - python cross_node_mooncake_transfer_engine.py --role producer ... --benchmark - -Environment Variables: - RDMA_DEVICE_NAME: Specify RDMA device (e.g., mlx5_0) - MC_IB_PCI_RELAXED_ORDERING: Set to 1 to enable PCIe relaxed ordering - for higher RDMA throughput -""" - -import argparse -import hashlib -import os -import sys -import time -from abc import ABC, abstractmethod -from dataclasses import dataclass -from typing import Any - -import msgspec -import torch -import zmq - -# Add parent path for imports -sys.path.insert( - 0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) -) - -from vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector import ( - ManagedBuffer, - MooncakeTransferEngineConnector, - TransferEngine, -) - - -def compute_md5(tensor: torch.Tensor) -> str: - """Compute MD5 checksum of a tensor.""" - if tensor.is_cuda: - tensor = tensor.cpu() - data = tensor.contiguous().view(torch.uint8).numpy().tobytes() - return hashlib.md5(data).hexdigest() - - -# Control channel message types -class CtrlMsg(msgspec.Struct): - """Control channel message.""" - - msg_type: str # "READY", "TRANSFER", "ACK", "DONE", "ERROR" - request_id: str = "" - md5: str = "" - data_size: int = 0 - error: str = "" - - -@dataclass -class TransferConfig: - """Configuration for cross-node transfer test.""" - - local_host: str - remote_host: str - local_port: int - remote_port: int - ctrl_port: int - num_transfers: int - tensor_size_mb: int - mode: str # "copy", "zerocopy", "gpu" - gpu_id: int = 0 - benchmark: bool = False # Skip MD5 verification for pure performance test - - -@dataclass -class TransferStats: - """Statistics for transfer operations.""" - - success_count: int = 0 - fail_count: int = 0 - total_bytes: int = 0 - elapsed_time: float = 0.0 - - @property - def throughput_mbps(self) -> float: - if self.elapsed_time > 0: - return (self.total_bytes / (1024 * 1024)) / self.elapsed_time - return 0.0 - - def print_summary(self, role: str): - print(f"\n{'=' * 60}") - print(f" {role.upper()} SUMMARY") - print(f" Successful: {self.success_count}/{self.success_count + self.fail_count}") - print(f" Failed: {self.fail_count}/{self.success_count + self.fail_count}") - print(f" Total: {self.total_bytes / (1024 * 1024):.2f} MB") - print(f" Time: {self.elapsed_time:.2f} s") - print(f" Throughput: {self.throughput_mbps:.2f} MB/s") - print(f"{'=' * 60}") - - -class CrossNodeTester(ABC): - """Abstract base class for cross-node RDMA testing.""" - - def __init__(self, config: TransferConfig): - self.config = config - self.connector: MooncakeTransferEngineConnector | None = None - self.zmq_ctx: zmq.Context | None = None - self.ctrl_socket: zmq.Socket | None = None - self.stats = TransferStats() - - def get_connector_config(self) -> dict: - """Get connector configuration based on mode.""" - pool_size = int(self.config.tensor_size_mb * 1.5) * 1024 * 1024 - pool_size = max(pool_size, 128 * 1024 * 1024) - - conn_config = { - "host": self.config.local_host, - "zmq_port": self.config.local_port, - "protocol": "rdma", - "memory_pool_size": pool_size, - } - - # Set device based on mode - if self.config.mode == "gpu": - conn_config["memory_pool_device"] = f"cuda:{self.config.gpu_id}" - else: - conn_config["memory_pool_device"] = "cpu" - - # RDMA device name from environment - device_name = os.environ.get("RDMA_DEVICE_NAME") - if device_name: - conn_config["device_name"] = device_name - print(f"[CONFIG] Using RDMA device: {device_name}") - - return conn_config - - def initialize(self): - """Initialize connector and ZMQ context.""" - print(f"[{self.role}] Initializing connector...") - conn_config = self.get_connector_config() - self.connector = MooncakeTransferEngineConnector(conn_config) - self.zmq_ctx = zmq.Context() - print(f"[{self.role}] Ready at {self.config.local_host}:{self.config.local_port}") - - def cleanup(self): - """Cleanup resources.""" - if self.ctrl_socket: - self.ctrl_socket.close() - if self.zmq_ctx: - self.zmq_ctx.term() - if self.connector: - self.connector.close() - print(f"[{self.role}] Closed.") - - @property - @abstractmethod - def role(self) -> str: - pass - - @abstractmethod - def run(self): - pass - - -class Producer(CrossNodeTester): - """Producer node - sends data to consumer.""" - - @property - def role(self) -> str: - return "PRODUCER" - - def print_header(self): - print(f"\n{'=' * 60}") - print(f" PRODUCER MODE ({self.config.mode.upper()})") - print(f" Local: {self.config.local_host}:{self.config.local_port}") - print(f" Remote: {self.config.remote_host}:{self.config.remote_port}") - print(f" Control Port: {self.config.ctrl_port}") - print(f" Transfer Mode: {self.config.mode}") - if self.config.mode == "gpu": - print(f" GPU ID: {self.config.gpu_id}") - print(f"{'=' * 60}\n") - - def setup_control_channel(self): - """Setup ZMQ control channel as server (REP socket).""" - self.ctrl_socket = self.zmq_ctx.socket(zmq.REP) - self.ctrl_socket.bind(f"tcp://*:{self.config.ctrl_port}") - print(f"[PRODUCER] Control channel listening on port {self.config.ctrl_port}") - print("[PRODUCER] Waiting for consumer to connect...") - - def wait_for_consumer(self) -> bool: - """Wait for consumer READY signal.""" - msg_data = self.ctrl_socket.recv() - msg = msgspec.msgpack.decode(msg_data, type=CtrlMsg) - if msg.msg_type != "READY": - print(f"[PRODUCER] Unexpected message: {msg.msg_type}") - return False - print("[PRODUCER] Consumer connected!") - self.ctrl_socket.send(msgspec.msgpack.encode(CtrlMsg(msg_type="ACK"))) - return True - - def create_test_data(self, transfer_idx: int) -> tuple[Any, str, int]: - """ - Create test data based on transfer mode. - - Returns: - (data, md5, size) tuple - """ - num_elements = (self.config.tensor_size_mb * 1024 * 1024) // 4 - data_size = num_elements * 4 - - if self.config.mode == "zerocopy": - # Zero-Copy Path: Allocate directly from connector's pool - offset = self.connector.allocator.alloc(data_size) - managed_buf = ManagedBuffer(self.connector.allocator, offset, data_size, self.connector.pool) - - if self.config.benchmark: - # In benchmark mode, skip random data generation (use uninitialized memory) - return managed_buf, "", data_size - else: - # Fill buffer with random data using tensor view - tensor_view = managed_buf.as_tensor(dtype=torch.float32, shape=(num_elements,)) - random_data = torch.randn(num_elements, dtype=torch.float32) - if tensor_view.is_cuda: - tensor_view.copy_(random_data.to(tensor_view.device)) - else: - tensor_view.copy_(random_data) - md5 = compute_md5(tensor_view) - return managed_buf, md5, data_size - - elif self.config.mode == "gpu": - # GPU Path: Create tensor on GPU - device = f"cuda:{self.config.gpu_id}" - if self.config.benchmark: - # In benchmark mode, use empty tensor (no random generation) - gpu_tensor = torch.empty(num_elements, dtype=torch.float32, device=device) - return gpu_tensor, "", data_size - else: - cpu_tensor = torch.randn(num_elements, dtype=torch.float32) - md5 = compute_md5(cpu_tensor) - gpu_tensor = cpu_tensor.to(device) - return gpu_tensor, md5, data_size - - else: - # Copy Path (default): Create regular CPU tensor - if self.config.benchmark: - # In benchmark mode, use empty tensor (no random generation) - tensor = torch.empty(num_elements, dtype=torch.float32) - return tensor, "", data_size - else: - tensor = torch.randn(num_elements, dtype=torch.float32) - md5 = compute_md5(tensor) - return tensor, md5, data_size - - def do_transfer(self, transfer_idx: int) -> bool: - """Perform a single transfer.""" - req_id = f"cross_node_transfer_{transfer_idx}" - - if not self.config.benchmark: - print(f"\n[PRODUCER] Transfer {transfer_idx + 1}/{self.config.num_transfers}") - - # Create test data - t0 = time.time() - data, md5, data_size = self.create_test_data(transfer_idx) - t_create = time.time() - t0 - - if not self.config.benchmark: - print(f" Mode: {self.config.mode}") - print(f" Size: {self.config.tensor_size_mb} MB") - if md5: - print(f" MD5: {md5[:16]}...") - print(f" Create time: {t_create * 1000:.1f} ms") - - # Put data - t1 = time.time() - success, size, metadata = self.connector.put("producer", "consumer", req_id, data) - t_put = time.time() - t1 - - if not success: - print(" [FAIL] Put failed") - return False - - if not self.config.benchmark: - print(f" [OK] Put successful, {size} bytes ({t_put * 1000:.1f} ms)") - - # Wait for consumer to request transfer info - msg_data = self.ctrl_socket.recv() - msg = msgspec.msgpack.decode(msg_data, type=CtrlMsg) - - if msg.msg_type != "READY": - print(f" [ERROR] Unexpected message: {msg.msg_type}") - return False - - # Send transfer metadata to consumer - transfer_msg = CtrlMsg( - msg_type="TRANSFER", - request_id=req_id, - md5=md5, - data_size=data_size, - ) - self.ctrl_socket.send(msgspec.msgpack.encode(transfer_msg)) - - # Wait for consumer ACK (this includes RDMA transfer time) - t2 = time.time() - msg_data = self.ctrl_socket.recv() - t_rdma = time.time() - t2 - msg = msgspec.msgpack.decode(msg_data, type=CtrlMsg) - - success = msg.msg_type == "ACK" - if success: - if not self.config.benchmark: - print(f" [OK] RDMA transfer complete ({t_rdma * 1000:.1f} ms)") - self.stats.success_count += 1 - self.stats.total_bytes += size - else: - print(f" [WARN] Consumer reported error: {msg.error}") - self.stats.fail_count += 1 - - # Send ACK to allow consumer to continue - self.ctrl_socket.send(msgspec.msgpack.encode(CtrlMsg(msg_type="ACK"))) - - # Cleanup buffer - self.connector.cleanup(req_id) - - return success - - def run(self): - """Run the producer.""" - self.print_header() - self.initialize() - self.setup_control_channel() - - try: - if not self.wait_for_consumer(): - return - - if self.config.benchmark: - print( - f"[BENCHMARK] Running {self.config.num_transfers} " - f"transfers of {self.config.tensor_size_mb} MB each..." - ) - - start_time = time.time() - - for i in range(self.config.num_transfers): - self.do_transfer(i) - if self.config.benchmark and (i + 1) % 10 == 0: - elapsed = time.time() - start_time - current_throughput = (self.stats.total_bytes / (1024 * 1024)) / elapsed - print(f" Progress: {i + 1}/{self.config.num_transfers}, Throughput: {current_throughput:.2f} MB/s") - - self.stats.elapsed_time = time.time() - start_time - self.stats.print_summary("PRODUCER") - - # Wait for final consumer message and send DONE - self.ctrl_socket.recv() - self.ctrl_socket.send(msgspec.msgpack.encode(CtrlMsg(msg_type="DONE"))) - - finally: - self.cleanup() - - -class Consumer(CrossNodeTester): - """Consumer node - receives data from producer.""" - - @property - def role(self) -> str: - return "CONSUMER" - - def print_header(self): - print(f"\n{'=' * 60}") - print(f" CONSUMER MODE ({self.config.mode.upper()})") - print(f" Local: {self.config.local_host}:{self.config.local_port}") - print(f" Remote: {self.config.remote_host}:{self.config.remote_port}") - print(f" Control Port: {self.config.ctrl_port}") - print(f" Transfer Mode: {self.config.mode}") - if self.config.mode == "gpu": - print(f" GPU ID: {self.config.gpu_id}") - print(f"{'=' * 60}\n") - - def setup_control_channel(self): - """Setup ZMQ control channel as client (REQ socket).""" - self.ctrl_socket = self.zmq_ctx.socket(zmq.REQ) - ctrl_addr = f"tcp://{self.config.remote_host}:{self.config.ctrl_port}" - print(f"[CONSUMER] Connecting to producer control channel at {ctrl_addr}...") - self.ctrl_socket.connect(ctrl_addr) - - def connect_to_producer(self) -> bool: - """Connect to producer and send READY signal.""" - self.ctrl_socket.send(msgspec.msgpack.encode(CtrlMsg(msg_type="READY"))) - msg_data = self.ctrl_socket.recv() - msg = msgspec.msgpack.decode(msg_data, type=CtrlMsg) - if msg.msg_type != "ACK": - print(f"[CONSUMER] Unexpected response: {msg.msg_type}") - return False - print("[CONSUMER] Connected to producer! Starting transfers...") - return True - - def do_transfer(self, transfer_idx: int) -> bool: - """Perform a single transfer.""" - if not self.config.benchmark: - print(f"\n[CONSUMER] Transfer {transfer_idx + 1}/{self.config.num_transfers}") - - # Request next transfer info - self.ctrl_socket.send(msgspec.msgpack.encode(CtrlMsg(msg_type="READY"))) - msg_data = self.ctrl_socket.recv() - msg = msgspec.msgpack.decode(msg_data, type=CtrlMsg) - - if msg.msg_type == "DONE": - print("[CONSUMER] Producer signaled completion") - return False - - if msg.msg_type != "TRANSFER": - print(f"[CONSUMER] Unexpected message: {msg.msg_type}") - return False - - req_id = msg.request_id - expected_md5 = msg.md5 - data_size = msg.data_size - num_elements = data_size // 4 - - if not self.config.benchmark: - print(f" Request ID: {req_id}") - if expected_md5: - print(f" Expected MD5: {expected_md5[:16]}...") - print(f" Data Size: {data_size / (1024 * 1024):.2f} MB") - - # Build metadata for get - metadata = { - "request_id": req_id, - "source_host": self.config.remote_host, - "source_port": self.config.remote_port, - "data_size": data_size, - "dtype": "float32", - "shape": [num_elements], - "is_fast_path": True, - } - - if not self.config.benchmark: - print(f" [INFO] Requesting from {self.config.remote_host}:{self.config.remote_port}") - - # Get data with timing - t0 = time.time() - result = self.connector.get("producer", "consumer", req_id, metadata) - t_get = time.time() - t0 - - response_msg = CtrlMsg(msg_type="ERROR", error="Get failed") - - if result is not None: - recv_buffer, recv_size = result - if not self.config.benchmark: - print(f" [OK] Get successful, {recv_size} bytes ({t_get * 1000:.1f} ms)") - - if isinstance(recv_buffer, ManagedBuffer): - # In benchmark mode, skip MD5 verification - if self.config.benchmark or not expected_md5: - response_msg = CtrlMsg(msg_type="ACK") - self.stats.success_count += 1 - self.stats.total_bytes += recv_size - else: - # Verify data - t1 = time.time() - reconstructed = recv_buffer.as_tensor(dtype=torch.float32, shape=(num_elements,)) - recv_md5 = compute_md5(reconstructed) - t_md5 = time.time() - t1 - print(f" MD5: {recv_md5[:16]}... ({t_md5 * 1000:.1f} ms)") - - if recv_md5 == expected_md5: - print(" [PASS] MD5 checksum verified!") - response_msg = CtrlMsg(msg_type="ACK") - self.stats.success_count += 1 - self.stats.total_bytes += recv_size - else: - print(" [FAIL] MD5 mismatch!") - response_msg = CtrlMsg(msg_type="ERROR", error="MD5 mismatch") - self.stats.fail_count += 1 - - recv_buffer.release() - else: - response_msg = CtrlMsg(msg_type="ACK") - self.stats.success_count += 1 - self.stats.total_bytes += recv_size - else: - print(" [FAIL] Get failed") - self.stats.fail_count += 1 - - # Send response to producer - self.ctrl_socket.send(msgspec.msgpack.encode(response_msg)) - # Wait for ACK - self.ctrl_socket.recv() - - return response_msg.msg_type == "ACK" - - def run(self): - """Run the consumer.""" - self.print_header() - self.initialize() - self.setup_control_channel() - - try: - if not self.connect_to_producer(): - return - - if self.config.benchmark: - print( - f"[BENCHMARK] Running {self.config.num_transfers} " - f"transfers of {self.config.tensor_size_mb} MB each..." - ) - - start_time = time.time() - - for i in range(self.config.num_transfers): - if not self.do_transfer(i): - break - if self.config.benchmark and (i + 1) % 10 == 0: - elapsed = time.time() - start_time - current_throughput = (self.stats.total_bytes / (1024 * 1024)) / elapsed - print(f" Progress: {i + 1}/{self.config.num_transfers}, Throughput: {current_throughput:.2f} MB/s") - - self.stats.elapsed_time = time.time() - start_time - self.stats.print_summary("CONSUMER") - - # Send final READY and wait for DONE - self.ctrl_socket.send(msgspec.msgpack.encode(CtrlMsg(msg_type="READY"))) - self.ctrl_socket.recv() - - finally: - self.cleanup() - - -def main(): - parser = argparse.ArgumentParser( - description="Cross-Node RDMA Test (Automated)", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=""" -Transfer Modes: - copy - Normal path: tensor copied to RDMA pool (default) - zerocopy - Zero-copy path: data created directly in RDMA pool - gpu - GPU transfer: RDMA pool on GPU, uses GPUDirect - -Examples: - # Copy mode (default): - python cross_node_mooncake_transfer_engine.py --role producer \ - --local-host hostA --remote-host hostB - - # Zero-copy mode: - python cross_node_mooncake_transfer_engine.py --role producer \ - --local-host hostA --remote-host hostB --mode zerocopy - - # GPU mode: - python cross_node_mooncake_transfer_engine.py --role producer \ - --local-host hostA --remote-host hostB --mode gpu --gpu-id 0 - - # Benchmark mode (skip MD5, measure pure RDMA performance): - python cross_node_mooncake_transfer_engine.py --role producer \ - --local-host hostA --remote-host hostB --benchmark - - # With specific RDMA device: - RDMA_DEVICE_NAME=mlx5_0 python cross_node_mooncake_transfer_engine.py --role producer ... - """, - ) - - parser.add_argument( - "--role", required=True, choices=["producer", "consumer"], help="Role: producer (sends) or consumer (receives)" - ) - parser.add_argument("--local-host", required=True, help="Local hostname or IP address") - parser.add_argument("--remote-host", required=True, help="Remote hostname or IP address") - parser.add_argument("--local-port", type=int, default=15500, help="Local ZMQ port for RDMA data (default: 15500)") - parser.add_argument("--remote-port", type=int, default=15500, help="Remote ZMQ port for RDMA data (default: 15500)") - parser.add_argument("--ctrl-port", type=int, default=15501, help="Control channel port (default: 15501)") - parser.add_argument("--num-transfers", type=int, default=20, help="Number of transfers to perform (default: 3)") - parser.add_argument("--tensor-size-mb", type=int, default=100, help="Tensor size in MB (default: 100)") - parser.add_argument( - "--mode", - choices=["copy", "zerocopy", "gpu"], - default="copy", - help="Transfer mode: copy, zerocopy, or gpu (default: copy)", - ) - parser.add_argument("--gpu-id", type=int, default=0, help="GPU ID for GPU mode (default: 0)") - parser.add_argument( - "--benchmark", action="store_true", help="Benchmark mode: skip MD5 verification for pure performance test" - ) - - args = parser.parse_args() - - # Check Mooncake - if TransferEngine is None: - print("[ERROR] Mooncake TransferEngine is not available.") - print("Install with: pip install mooncake") - sys.exit(1) - - # Check CUDA for GPU mode - if args.mode == "gpu": - if not torch.cuda.is_available(): - print("[ERROR] CUDA is not available but GPU mode was requested.") - sys.exit(1) - if args.gpu_id >= torch.cuda.device_count(): - print(f"[ERROR] GPU {args.gpu_id} not available. Found {torch.cuda.device_count()} GPUs.") - sys.exit(1) - print(f"[INFO] Using GPU {args.gpu_id}: {torch.cuda.get_device_name(args.gpu_id)}") - - config = TransferConfig( - local_host=args.local_host, - remote_host=args.remote_host, - local_port=args.local_port, - remote_port=args.remote_port, - ctrl_port=args.ctrl_port, - num_transfers=args.num_transfers, - tensor_size_mb=args.tensor_size_mb, - mode=args.mode, - gpu_id=args.gpu_id, - benchmark=args.benchmark, - ) - - if args.role == "producer": - tester = Producer(config) - else: - tester = Consumer(config) - - tester.run() - - -if __name__ == "__main__": - main() diff --git a/benchmarks/fish-speech/bench_voice_cache.py b/benchmarks/fish-speech/bench_voice_cache.py deleted file mode 100644 index 8d465d6489f..00000000000 --- a/benchmarks/fish-speech/bench_voice_cache.py +++ /dev/null @@ -1,290 +0,0 @@ -"""Benchmark Fish Speech voice cache: inline ref_audio vs uploaded voice. - -Measures TTFP improvement from DAC-code caching when using uploaded voices. - -Setup: - 1. Start vllm-omni with Fish Speech S2 Pro (use our feat branch) - 2. Provide a reference audio file for voice cloning - -Usage: - python bench_voice_cache.py \ - --ref-audio /path/to/reference.wav \ - --ref-text "Transcript of the reference audio." \ - --num-prompts 20 \ - --port 8091 - -The script runs two rounds: - A) Inline ref_audio: every request sends base64 audio (no cache) - B) Uploaded voice: upload once, then use voice name (cache hits after 1st) -""" - -import argparse -import asyncio -import base64 -import json -import os -import sys -import time -from pathlib import Path - -import aiohttp - -# Allow imports from benchmarks/fish-speech/ -sys.path.insert(0, str(Path(__file__).resolve().parent)) - -from fish_bench_utils import ( # noqa: E402 - BenchmarkResult, - RequestResult, - compute_stats, - print_benchmark_results, - send_streaming_request, -) - -SAMPLE_RATE = 44100 -SAMPLE_WIDTH = 2 - -PROMPTS = [ - "Hello, welcome to the voice synthesis benchmark test.", - "She said she would be here by noon, but nobody showed up.", - "The quick brown fox jumps over the lazy dog near the riverbank.", - "I can't believe how beautiful the sunset looks from up here.", - "Please remember to bring your identification documents tomorrow morning.", - "Have you ever wondered what it would be like to travel through time?", - "The restaurant on the corner serves the best pasta I have ever tasted.", - "After the meeting, we should discuss the quarterly results.", - "Learning a new language takes patience and genuine curiosity.", - "The train leaves at half past seven, so we need to arrive early.", - "Could you please turn down the music, I'm trying to concentrate.", - "It was a dark and stormy night when the keeper heard a knock.", -] - - -def encode_audio_to_base64(audio_path: str) -> str: - """Encode a local audio file to base64 data URL.""" - ext = audio_path.lower().rsplit(".", 1)[-1] - mime_map = {"wav": "audio/wav", "mp3": "audio/mpeg", "flac": "audio/flac"} - mime_type = mime_map.get(ext, "audio/wav") - with open(audio_path, "rb") as f: - audio_b64 = base64.b64encode(f.read()).decode("utf-8") - return f"data:{mime_type};base64,{audio_b64}" - - -async def upload_voice( - host: str, - port: int, - audio_path: str, - ref_text: str, - voice_name: str = "bench_voice", -) -> dict: - """Upload a voice via POST /v1/audio/voices.""" - url = f"http://{host}:{port}/v1/audio/voices" - data = aiohttp.FormData() - data.add_field("name", voice_name) - data.add_field("consent", "true") - if ref_text: - data.add_field("ref_text", ref_text) - data.add_field( - "audio_sample", - open(audio_path, "rb"), - filename=os.path.basename(audio_path), - content_type="audio/wav", - ) - - async with aiohttp.ClientSession() as session: - async with session.post(url, data=data) as resp: - result = await resp.json() - print(f" Upload response ({resp.status}): {json.dumps(result, indent=2)}") - return result - - -async def delete_voice(host: str, port: int, voice_name: str) -> None: - """Delete an uploaded voice.""" - url = f"http://{host}:{port}/v1/audio/voices/{voice_name}" - async with aiohttp.ClientSession() as session: - async with session.delete(url) as resp: - if resp.status == 200: - print(f" Deleted voice '{voice_name}'") - - -async def run_round( - host: str, - port: int, - num_prompts: int, - create_payload_fn, - label: str, - num_warmups: int = 2, - timeout_s: float = 120.0, -) -> BenchmarkResult: - """Run one benchmark round and return results.""" - api_url = f"http://{host}:{port}/v1/audio/speech" - connector = aiohttp.TCPConnector(limit=1, limit_per_host=1) - session = aiohttp.ClientSession( - connector=connector, - timeout=aiohttp.ClientTimeout(total=timeout_s), - ) - - try: - # Warmup. - if num_warmups > 0: - print(f" [{label}] Warming up ({num_warmups} requests)...") - for i in range(num_warmups): - payload = create_payload_fn(PROMPTS[i % len(PROMPTS)]) - r = await send_streaming_request( - session, - api_url, - payload, - SAMPLE_RATE, - SAMPLE_WIDTH, - ) - status = "OK" if r.success else f"FAIL: {r.error[:80]}" - print(f" warmup {i + 1}: ttfp={r.ttfp * 1000:.0f}ms {status}") - - # Benchmark. - print(f" [{label}] Running {num_prompts} requests (concurrency=1)...") - results: list[RequestResult] = [] - start = time.perf_counter() - for i in range(num_prompts): - prompt = PROMPTS[i % len(PROMPTS)] - payload = create_payload_fn(prompt) - r = await send_streaming_request( - session, - api_url, - payload, - SAMPLE_RATE, - SAMPLE_WIDTH, - ) - results.append(r) - tag = "HIT" if i > 0 and label == "uploaded_voice" else "" - print( - f" req {i + 1:3d}: ttfp={r.ttfp * 1000:7.1f}ms " - f"e2e={r.e2e * 1000:7.1f}ms " - f"{'OK' if r.success else 'FAIL'} {tag}" - ) - wall_time = time.perf_counter() - start - finally: - await session.close() - - bench = compute_stats(results, wall_time) - bench.concurrency = 1 - bench.num_prompts = num_prompts - bench.config_name = label - return bench - - -async def main(): - parser = argparse.ArgumentParser( - description="Benchmark Fish Speech voice cache (inline vs uploaded)", - ) - parser.add_argument("--host", default="127.0.0.1") - parser.add_argument("--port", type=int, default=8091) - parser.add_argument("--ref-audio", required=True, help="Path to reference audio file") - parser.add_argument("--ref-text", required=True, help="Transcript of reference audio") - parser.add_argument("--num-prompts", type=int, default=20) - parser.add_argument("--num-warmups", type=int, default=2) - parser.add_argument("--voice-name", default="bench_voice") - args = parser.parse_args() - - if not os.path.exists(args.ref_audio): - print(f"Error: ref_audio not found: {args.ref_audio}") - sys.exit(1) - - ref_audio_b64 = encode_audio_to_base64(args.ref_audio) - print(f"Reference audio: {args.ref_audio} ({len(ref_audio_b64) // 1024}KB base64)") - - # ---- Round A: Inline ref_audio (no cache) ---- - print(f"\n{'=' * 60}") - print("Round A: INLINE ref_audio (every request sends full audio)") - print(f"{'=' * 60}") - - def make_inline_payload(prompt: str) -> dict: - return { - "input": prompt, - "voice": "default", - "stream": True, - "response_format": "pcm", - "ref_audio": ref_audio_b64, - "ref_text": args.ref_text, - "max_new_tokens": 2048, - } - - bench_inline = await run_round( - args.host, - args.port, - args.num_prompts, - make_inline_payload, - "inline_ref_audio", - num_warmups=args.num_warmups, - ) - print_benchmark_results(bench_inline) - - # ---- Upload voice ---- - print(f"\n{'=' * 60}") - print("Uploading voice for cache test...") - print(f"{'=' * 60}") - await delete_voice(args.host, args.port, args.voice_name) - await upload_voice( - args.host, - args.port, - args.ref_audio, - args.ref_text, - args.voice_name, - ) - - # ---- Round B: Uploaded voice (cache hits after 1st request) ---- - print(f"\n{'=' * 60}") - print("Round B: UPLOADED VOICE (cache hits after 1st request)") - print(f"{'=' * 60}") - - def make_uploaded_payload(prompt: str) -> dict: - return { - "input": prompt, - "voice": args.voice_name, - "stream": True, - "response_format": "pcm", - "ref_text": args.ref_text, - "max_new_tokens": 2048, - } - - bench_cached = await run_round( - args.host, - args.port, - args.num_prompts, - make_uploaded_payload, - "uploaded_voice", - num_warmups=args.num_warmups, - ) - print_benchmark_results(bench_cached) - - # ---- Comparison ---- - print(f"\n{'=' * 60}") - print("COMPARISON: Inline ref_audio vs Uploaded voice (cached)") - print(f"{'=' * 60}") - print(f"{'Metric':<30} {'Inline':>12} {'Cached':>12} {'Speedup':>10}") - print(f"{'-' * 64}") - - def fmt_speedup(inline_val: float, cached_val: float) -> str: - if cached_val > 0 and inline_val > 0: - ratio = inline_val / cached_val - return f"{ratio:.2f}x" - return "N/A" - - rows = [ - ("Mean TTFP (ms)", bench_inline.mean_ttfp_ms, bench_cached.mean_ttfp_ms), - ("Median TTFP (ms)", bench_inline.median_ttfp_ms, bench_cached.median_ttfp_ms), - ("P99 TTFP (ms)", bench_inline.p99_ttfp_ms, bench_cached.p99_ttfp_ms), - ("Mean E2E (ms)", bench_inline.mean_e2e_ms, bench_cached.mean_e2e_ms), - ("Median E2E (ms)", bench_inline.median_e2e_ms, bench_cached.median_e2e_ms), - ("Mean RTF", bench_inline.mean_rtf, bench_cached.mean_rtf), - ] - for label, a, b in rows: - print(f"{label:<30} {a:>12.1f} {b:>12.1f} {fmt_speedup(a, b):>10}") - - print("\nNote: Round B request #1 is a cache MISS (cold start).") - print(" Requests #2+ are cache HITs (skip DAC encoding).") - - # Cleanup. - await delete_voice(args.host, args.port, args.voice_name) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/benchmarks/fish-speech/fish_bench_utils.py b/benchmarks/fish-speech/fish_bench_utils.py deleted file mode 100644 index cc84c4037fe..00000000000 --- a/benchmarks/fish-speech/fish_bench_utils.py +++ /dev/null @@ -1,501 +0,0 @@ -"""Shared benchmark infrastructure for Fish Speech serving benchmarks. - -Provides common dataclasses, metrics computation, streaming HTTP client, -and result formatting used by model-specific benchmark scripts. - -Model-specific scripts supply a ``create_payload_fn(prompt) -> dict`` -callback and audio parameters; everything else is handled here. -""" - -import asyncio -import base64 -import json -import time -from collections.abc import Callable -from dataclasses import asdict, dataclass, field -from datetime import datetime -from pathlib import Path - -import aiohttp -import numpy as np -from tqdm.asyncio import tqdm - -# --------------------------------------------------------------------------- -# Shared test prompts (varying length for realistic workload) -# --------------------------------------------------------------------------- -PROMPTS = [ - "Hello, welcome to the voice synthesis benchmark test.", - "She said she would be here by noon, but nobody showed up.", - "The quick brown fox jumps over the lazy dog near the riverbank.", - "I can't believe how beautiful the sunset looks from up here on the mountain.", - "Please remember to bring your identification documents to the appointment tomorrow morning.", - "Have you ever wondered what it would be like to travel through time and visit ancient civilizations?", - "The restaurant on the corner serves the best pasta I have ever tasted in my entire life.", - "After the meeting, we should discuss the quarterly results and plan for the next phase.", - "Learning a new language takes patience, practice, and a genuine curiosity about other cultures.", - "The train leaves at half past seven, so we need to arrive at the station before then.", - "Could you please turn down the music a little bit, I'm trying to concentrate on my work.", - "It was a dark and stormy night when the old lighthouse keeper heard a knock at the door.", -] - - -# --------------------------------------------------------------------------- -# Dataclasses -# --------------------------------------------------------------------------- -@dataclass -class RequestResult: - success: bool = False - ttfp: float = 0.0 # Time to first audio packet (seconds) - e2e: float = 0.0 # End-to-end latency (seconds) - audio_bytes: int = 0 # Total audio bytes received - audio_duration: float = 0.0 # Audio duration in seconds - rtf: float = 0.0 # Real-time factor = e2e / audio_duration - prompt: str = "" - error: str = "" - - -@dataclass -class BenchmarkResult: - config_name: str = "" - concurrency: int = 0 - num_prompts: int = 0 - completed: int = 0 - failed: int = 0 - duration_s: float = 0.0 - # TTFP stats (ms) - mean_ttfp_ms: float = 0.0 - median_ttfp_ms: float = 0.0 - std_ttfp_ms: float = 0.0 - p90_ttfp_ms: float = 0.0 - p95_ttfp_ms: float = 0.0 - p99_ttfp_ms: float = 0.0 - # E2E stats (ms) - mean_e2e_ms: float = 0.0 - median_e2e_ms: float = 0.0 - std_e2e_ms: float = 0.0 - p90_e2e_ms: float = 0.0 - p95_e2e_ms: float = 0.0 - p99_e2e_ms: float = 0.0 - # RTF stats - mean_rtf: float = 0.0 - median_rtf: float = 0.0 - std_rtf: float = 0.0 - p99_rtf: float = 0.0 - # Audio stats - mean_audio_duration_s: float = 0.0 - total_audio_duration_s: float = 0.0 - audio_throughput: float = 0.0 # audio_duration / wall_time - request_throughput: float = 0.0 # requests / second - # Per-request details - per_request: list = field(default_factory=list) - - -# --------------------------------------------------------------------------- -# Audio helpers -# --------------------------------------------------------------------------- -def pcm_bytes_to_duration( - num_bytes: int, - sample_rate: int = 24000, - sample_width: int = 2, -) -> float: - """Convert raw PCM byte count to duration in seconds.""" - return num_bytes / sample_width / sample_rate - - -def _is_sse_response(response: aiohttp.ClientResponse) -> bool: - content_type = (response.headers.get("Content-Type") or "").lower() - return "text/event-stream" in content_type - - -async def _read_raw_audio_stream( - response: aiohttp.ClientResponse, - *, - start_time: float, -) -> tuple[int, float]: - first_audio_at = 0.0 - total_bytes = 0 - - async for chunk in response.content.iter_any(): - if chunk and first_audio_at <= 0: - first_audio_at = time.perf_counter() - start_time - total_bytes += len(chunk) - - return total_bytes, first_audio_at - - -def _extract_sse_payload(raw_event: bytes) -> bytes | None: - data_lines: list[bytes] = [] - for raw_line in raw_event.splitlines(): - line = raw_line.rstrip(b"\r") - if line.startswith(b"data: "): - data_lines.append(line[6:]) - elif line.startswith(b"data:"): - data_lines.append(line[5:].lstrip()) - - if not data_lines: - return None - return b"\n".join(data_lines).strip() - - -async def _read_sse_audio_stream( - response: aiohttp.ClientResponse, - *, - start_time: float, -) -> tuple[int, float]: - """Decode SSE events and count raw audio bytes from base64 payloads.""" - first_audio_at = 0.0 - total_bytes = 0 - pending = b"" - - async for chunk in response.content.iter_any(): - if not chunk: - continue - pending += chunk - pending = pending.replace(b"\r\n", b"\n") - - while b"\n\n" in pending: - raw_event, pending = pending.split(b"\n\n", 1) - payload_bytes = _extract_sse_payload(raw_event) - if payload_bytes is None: - continue - if payload_bytes == b"[DONE]": - return total_bytes, first_audio_at - - try: - payload = json.loads(payload_bytes) - except json.JSONDecodeError as exc: - raise ValueError(f"Invalid SSE JSON payload: {exc}") from exc - - audio = payload.get("audio") - if not isinstance(audio, dict): - continue - - audio_b64 = audio.get("data") - if not audio_b64: - continue - - try: - audio_bytes = base64.b64decode(audio_b64) - except Exception as exc: - raise ValueError(f"Invalid base64 audio chunk: {exc}") from exc - - if audio_bytes and first_audio_at <= 0: - first_audio_at = time.perf_counter() - start_time - total_bytes += len(audio_bytes) - - return total_bytes, first_audio_at - - -# --------------------------------------------------------------------------- -# Metrics -# --------------------------------------------------------------------------- -def compute_stats( - results: list[RequestResult], - wall_time: float, -) -> BenchmarkResult: - """Compute aggregate statistics from per-request results.""" - successful = [r for r in results if r.success] - failed = [r for r in results if not r.success] - - bench = BenchmarkResult( - completed=len(successful), - failed=len(failed), - duration_s=wall_time, - ) - - if not successful: - return bench - - ttfps = [r.ttfp * 1000 for r in successful] - e2es = [r.e2e * 1000 for r in successful] - rtfs = [r.rtf for r in successful] - audio_durs = [r.audio_duration for r in successful] - - bench.mean_ttfp_ms = float(np.mean(ttfps)) - bench.median_ttfp_ms = float(np.median(ttfps)) - bench.std_ttfp_ms = float(np.std(ttfps)) - bench.p90_ttfp_ms = float(np.percentile(ttfps, 90)) - bench.p95_ttfp_ms = float(np.percentile(ttfps, 95)) - bench.p99_ttfp_ms = float(np.percentile(ttfps, 99)) - - bench.mean_e2e_ms = float(np.mean(e2es)) - bench.median_e2e_ms = float(np.median(e2es)) - bench.std_e2e_ms = float(np.std(e2es)) - bench.p90_e2e_ms = float(np.percentile(e2es, 90)) - bench.p95_e2e_ms = float(np.percentile(e2es, 95)) - bench.p99_e2e_ms = float(np.percentile(e2es, 99)) - - bench.mean_rtf = float(np.mean(rtfs)) - bench.median_rtf = float(np.median(rtfs)) - bench.std_rtf = float(np.std(rtfs)) - bench.p99_rtf = float(np.percentile(rtfs, 99)) - - bench.mean_audio_duration_s = float(np.mean(audio_durs)) - bench.total_audio_duration_s = float(np.sum(audio_durs)) - bench.audio_throughput = bench.total_audio_duration_s / wall_time - bench.request_throughput = len(successful) / wall_time - - bench.per_request = [ - { - "ttfp_ms": r.ttfp * 1000, - "e2e_ms": r.e2e * 1000, - "rtf": r.rtf, - "audio_duration_s": r.audio_duration, - "prompt": r.prompt, - } - for r in successful - ] - - return bench - - -# --------------------------------------------------------------------------- -# Output formatting -# --------------------------------------------------------------------------- -def print_benchmark_results(bench: BenchmarkResult) -> None: - """Print benchmark results in standardized format.""" - W = 50 - print("") - print(f"{'=' * W}") - print(f"{'Serving Benchmark Result':^{W}}") - print(f"{'=' * W}") - print(f"{'Successful requests:':<40}{bench.completed:<10}") - print(f"{'Failed requests:':<40}{bench.failed:<10}") - print(f"{'Maximum request concurrency:':<40}{bench.concurrency:<10}") - print(f"{'Benchmark duration (s):':<40}{bench.duration_s:<10.2f}") - print(f"{'Request throughput (req/s):':<40}{bench.request_throughput:<10.2f}") - print(f"{'-' * W}") - print(f"{'End-to-end Latency':^{W}}") - print(f"{'-' * W}") - print(f"{'Mean E2EL (ms):':<40}{bench.mean_e2e_ms:<10.2f}") - print(f"{'Median E2EL (ms):':<40}{bench.median_e2e_ms:<10.2f}") - print(f"{'P99 E2EL (ms):':<40}{bench.p99_e2e_ms:<10.2f}") - print(f"{'=' * W}") - print(f"{'Audio Result':^{W}}") - print(f"{'=' * W}") - print(f"{'Total audio duration generated (s):':<40}{bench.total_audio_duration_s:<10.2f}") - print(f"{'Audio throughput (audio duration/s):':<40}{bench.audio_throughput:<10.2f}") - print(f"{'-' * W}") - print(f"{'Time to First Packet':^{W}}") - print(f"{'-' * W}") - print(f"{'Mean AUDIO_TTFP (ms):':<40}{bench.mean_ttfp_ms:<10.2f}") - print(f"{'Median AUDIO_TTFP (ms):':<40}{bench.median_ttfp_ms:<10.2f}") - print(f"{'P99 AUDIO_TTFP (ms):':<40}{bench.p99_ttfp_ms:<10.2f}") - print(f"{'-' * W}") - print(f"{'Real Time Factor':^{W}}") - print(f"{'-' * W}") - print(f"{'Mean AUDIO_RTF:':<40}{bench.mean_rtf:<10.3f}") - print(f"{'Median AUDIO_RTF:':<40}{bench.median_rtf:<10.3f}") - print(f"{'P99 AUDIO_RTF:':<40}{bench.p99_rtf:<10.3f}") - print(f"{'=' * W}") - print("") - - -def save_results( - all_results: list[dict], - result_dir: str, - config_name: str, -) -> Path: - """Save benchmark results as JSON and return the file path.""" - out = Path(result_dir) - out.mkdir(parents=True, exist_ok=True) - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - result_file = out / f"bench_{config_name}_{timestamp}.json" - - with open(result_file, "w") as f: - json.dump(all_results, f, indent=2) - print(f"Results saved to {result_file}") - return result_file - - -# --------------------------------------------------------------------------- -# Streaming HTTP client -# --------------------------------------------------------------------------- -async def send_streaming_request( - session: aiohttp.ClientSession, - api_url: str, - payload: dict, - sample_rate: int, - sample_width: int, - pbar: tqdm | None = None, -) -> RequestResult: - """Send a streaming TTS request and measure latency metrics.""" - result = RequestResult(prompt=payload.get("input", "")) - st = time.perf_counter() - - try: - async with session.post(api_url, json=payload) as response: - if response.status != 200: - result.error = f"HTTP {response.status}: {await response.text()}" - else: - if _is_sse_response(response): - total_bytes, result.ttfp = await _read_sse_audio_stream( - response, - start_time=st, - ) - else: - total_bytes, result.ttfp = await _read_raw_audio_stream( - response, - start_time=st, - ) - - result.e2e = time.perf_counter() - st - result.audio_bytes = total_bytes - result.audio_duration = pcm_bytes_to_duration(total_bytes, sample_rate, sample_width) - - if total_bytes <= 0 or result.ttfp <= 0: - result.error = "HTTP 200 but no audio bytes were received" - else: - if result.audio_duration > 0: - result.rtf = result.e2e / result.audio_duration - result.success = True - - except Exception as e: - result.error = str(e) - result.e2e = time.perf_counter() - st - - finally: - if pbar: - pbar.update(1) - return result - - -# --------------------------------------------------------------------------- -# Benchmark runner -# --------------------------------------------------------------------------- -async def run_benchmark( - host: str, - port: int, - num_prompts: int, - max_concurrency: int, - create_payload_fn: Callable[[str], dict], - sample_rate: int, - sample_width: int = 2, - num_warmups: int = 3, - request_timeout_s: float = 120.0, -) -> BenchmarkResult: - """Run a TTS streaming benchmark at a given concurrency level. - - Args: - create_payload_fn: Model-specific function that takes a prompt string - and returns the request JSON payload dict. - sample_rate: PCM sample rate for audio duration calculation. - sample_width: PCM sample width in bytes (default 2 for 16-bit). - """ - api_url = f"http://{host}:{port}/v1/audio/speech" - - connector = aiohttp.TCPConnector( - limit=max_concurrency, - limit_per_host=max_concurrency, - keepalive_timeout=60, - ) - session = aiohttp.ClientSession( - connector=connector, - timeout=aiohttp.ClientTimeout( - total=request_timeout_s, - connect=min(10.0, request_timeout_s), - sock_connect=min(10.0, request_timeout_s), - sock_read=request_timeout_s, - ), - ) - - try: - # Warmup - if num_warmups > 0: - print(f" Warming up with {num_warmups} requests...") - warmup_tasks = [ - send_streaming_request( - session, - api_url, - create_payload_fn(PROMPTS[i % len(PROMPTS)]), - sample_rate, - sample_width, - ) - for i in range(num_warmups) - ] - warmup_results = await asyncio.gather(*warmup_tasks) - warmup_ok = sum(1 for r in warmup_results if r.success) - if warmup_ok == 0: - print(" WARNING: All warmup requests failed!") - for r in warmup_results: - if r.error: - print(f" {r.error[:200]}") - print(f" Warmup done ({warmup_ok}/{num_warmups} succeeded).") - - # Build request list - request_prompts = [PROMPTS[i % len(PROMPTS)] for i in range(num_prompts)] - - # Run - print(f" Running {num_prompts} requests with concurrency={max_concurrency}...") - semaphore = asyncio.Semaphore(max_concurrency) - pbar = tqdm(total=num_prompts, desc=f" concurrency={max_concurrency}") - - async def limited_request(prompt: str) -> RequestResult: - async with semaphore: - return await send_streaming_request( - session, - api_url, - create_payload_fn(prompt), - sample_rate, - sample_width, - pbar, - ) - - start_time = time.perf_counter() - tasks = [asyncio.create_task(limited_request(p)) for p in request_prompts] - results: list[RequestResult] = await asyncio.gather(*tasks) - wall_time = time.perf_counter() - start_time - pbar.close() - - finally: - await session.close() - - # Compute stats - bench = compute_stats(results, wall_time) - bench.concurrency = max_concurrency - bench.num_prompts = num_prompts - - print_benchmark_results(bench) - - # Print sample errors - failed = [r for r in results if not r.success] - if failed: - for r in failed[:3]: - print(f" [ERROR] {r.error[:200]}") - - return bench - - -async def run_benchmark_sweep( - host: str, - port: int, - num_prompts: int, - concurrency_levels: list[int], - create_payload_fn: Callable[[str], dict], - sample_rate: int, - sample_width: int = 2, - num_warmups: int = 3, - request_timeout_s: float = 120.0, - config_name: str = "benchmark", - result_dir: str = "results", -) -> list[dict]: - """Run benchmarks across multiple concurrency levels and save results.""" - all_results = [] - - for concurrency in concurrency_levels: - result = await run_benchmark( - host=host, - port=port, - num_prompts=num_prompts, - max_concurrency=concurrency, - create_payload_fn=create_payload_fn, - sample_rate=sample_rate, - sample_width=sample_width, - num_warmups=num_warmups, - request_timeout_s=request_timeout_s, - ) - result.config_name = config_name - all_results.append(asdict(result)) - - save_results(all_results, result_dir, config_name) - return all_results diff --git a/benchmarks/glm_image/README.md b/benchmarks/glm_image/README.md deleted file mode 100644 index 485e081426f..00000000000 --- a/benchmarks/glm_image/README.md +++ /dev/null @@ -1,157 +0,0 @@ -# GLM-Image Benchmarks - -Benchmark GLM-Image T2I (text-to-image) and I2I (image-to-image) performance across three backends: HuggingFace baseline, vLLM-Omni offline, and vLLM-Omni online serving. - -## Benchmarks - -| Benchmark | Script | Description | -|-----------|--------|-------------| -| HuggingFace Baseline | `huggingface/inference.py` | Single-GPU transformers + diffusers pipeline | -| vLLM-Omni Offline | `vllm-omni/inference.py` | Offline inference with continuous batching | -| vLLM-Omni Online | `benchmark_glm_image.py` | Online serving via `/v1/chat/completions` | - -## HuggingFace Baseline - -Single-request sequential inference using the reference HuggingFace pipeline. - -```bash -# T2I -CUDA_VISIBLE_DEVICES=0 python benchmarks/glm_image/huggingface/inference.py \ - --model-path /path/to/GLM-Image --mode t2i --num-prompts 10 - -# I2I -CUDA_VISIBLE_DEVICES=0 python benchmarks/glm_image/huggingface/inference.py \ - --model-path /path/to/GLM-Image --mode i2i --num-prompts 10 -``` - -### Options - -| Flag | Default | Description | -|------|---------|-------------| -| `--model-path` | `zai-org/GLM-Image` | Model path | -| `--mode` | `t2i` | `t2i` or `i2i` | -| `--dataset-path` | `prompt/prompt.json` | Path to prompt.json | -| `--num-prompts` | `10` | Number of images to generate | -| `--width` / `--height` | `1024` | Output image size | -| `--num-inference-steps` | `50` | Diffusion denoising steps | -| `--output-dir` | `benchmarks/glm_image/huggingface/outputs` | Output directory | -| `--output-file` | - | JSON file for metrics | - -## vLLM-Omni Offline - -Multi-GPU offline inference with pipeline parallelism and continuous batching. - -```bash -# T2I -CUDA_VISIBLE_DEVICES=0,1 python benchmarks/glm_image/vllm-omni/inference.py \ - --model-path /path/to/GLM-Image --mode t2i --num-prompts 10 - -# I2I -CUDA_VISIBLE_DEVICES=0,1 python benchmarks/glm_image/vllm-omni/inference.py \ - --model-path /path/to/GLM-Image --mode i2i --num-prompts 10 -``` - -### Options - -| Flag | Default | Description | -|------|---------|-------------| -| `--model-path` | `zai-org/GLM-Image` | Model path | -| `--deploy-config` | - | Deploy config YAML | -| `--mode` | `t2i` | `t2i` or `i2i` | -| `--dataset-path` | `prompt/prompt.json` | Path to prompt.json | -| `--num-prompts` | `10` | Number of images to generate | -| `--width` / `--height` | `1024` | Output image size | -| `--num-inference-steps` | `50` | Diffusion denoising steps | -| `--output-dir` | `benchmarks/glm_image/vllm-omni/outputs` | Output directory | -| `--output-file` | - | JSON file for metrics | -| `--stage-init-timeout` | `600` | Stage initialization timeout (s) | - -### Latency Computation - -In offline mode all requests are submitted simultaneously and processed with continuous batching. The per-request latency is computed by summing the actual per-stage times (with `stage_0_gen_ms` diffed against the previous request to remove accumulated queue/scheduling wait). - -## vLLM-Omni Online Serving - -### Start the server - -```bash -CUDA_VISIBLE_DEVICES=0,1 vllm serve /path/to/GLM-Image \ - --omni --port 8091 --host 0.0.0.0 \ - --served-model-name glm-image -``` - -### Run the benchmark - -```bash -# T2I -python benchmarks/glm_image/benchmark_glm_image.py \ - --mode t2i --num-prompts 10 --model glm-image - -# I2I -python benchmarks/glm_image/benchmark_glm_image.py \ - --mode i2i --num-prompts 10 --model glm-image - -# Custom dataset -python benchmarks/glm_image/benchmark_glm_image.py \ - --mode i2i --dataset custom \ - --dataset-path prompts.json --num-prompts 5 -``` - -### Options - -| Flag | Default | Description | -|------|---------|-------------| -| `--mode` | `t2i` | `t2i` or `i2i` | -| `--dataset` | `prompt` | `prompt`, `random`, or `custom` | -| `--dataset-path` | - | JSON file path (required for `custom`) | -| `--num-prompts` | `10` | Number of benchmark requests | -| `--max-concurrency` | `1` | Max concurrent requests | -| `--request-rate` | `inf` | Requests per second (Poisson arrival) | -| `--warmup-requests` | `1` | Warmup requests before measurement | -| `--width` / `--height` | `1024` | Output image size | -| `--num-inference-steps` | `50` | Diffusion denoising steps | -| `--seed` | - | Random seed | -| `--model` | `default` | Model name (must match `--served-model-name`) | -| `--host` | `localhost` | Server host | -| `--port` | `8091` | Server port | -| `--output-file` | - | JSON output file for metrics | -| `--num-input-images` | `1` | Number of input images for random I2I | - -## Dataset - -The default dataset is hosted on [HuggingFace](https://huggingface.co/datasets/JaredforReal/glm-image-bench) (`prompt.json`). It is automatically downloaded and cached to `prompt/prompt.json` on first run. No manual setup needed. - -Each entry contains: - -- `t2i_prompt`: Text prompt for text-to-image generation -- `i2i_prompt`: Text prompt for image-to-image editing -- `image_url`: Source image URL for I2I (downloaded and cached on first use) - -Custom datasets use the same JSON format and can be provided via `--dataset-path`. - -## Pipeline Timings - -All three benchmarks report per-stage pipeline timings (in milliseconds): - -| Key | Description | -|-----|-------------| -| `preprocess_ms` | Input preprocessing (tokenization, multimodal encoding) | -| `stage_0_gen_ms` | AR (autoregressive) model generation time | -| `ar2diffusion_ms` | AR output to diffusion input conversion | -| `stage_1_gen_ms` | Diffusion model denoising time | -| `queue_wait_ms` | Queue wait time before processing | - -The stages are ordered by execution: `preprocess → stage_0 (AR) → ar2diffusion → stage_1 (Diffusion)`. - -## Sample Results - -Tested on 2x GPU with 10 prompts, 1024x1024, 50 denoising steps: - -| Backend | Mode | Latency Mean (s) | Throughput (img/s) | -|---------|------|-------------------|--------------------| -| HuggingFace | T2I | 72.6 | 0.014 | -| HuggingFace | I2I | 70.9 | 0.014 | -| vLLM-Omni Offline | T2I | 35.0 | 0.044 | -| vLLM-Omni Offline | I2I | 31.0 | 0.053 | -| vLLM-Omni Online | T2I | 38.8 | 0.026 | -| vLLM-Omni Online | I2I | 34.7 | 0.029 | diff --git a/benchmarks/glm_image/__init__.py b/benchmarks/glm_image/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/benchmarks/glm_image/benchmark_glm_image.py b/benchmarks/glm_image/benchmark_glm_image.py deleted file mode 100644 index 9f8df3f1986..00000000000 --- a/benchmarks/glm_image/benchmark_glm_image.py +++ /dev/null @@ -1,464 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project -""" -Online serving benchmark for GLM-Image (T2I and I2I modes). - -Sends requests to the /v1/chat/completions endpoint and reports end-to-end -latency, throughput, and per-stage durations (when the server is started with ---enable-diffusion-pipeline-profiler and/or --enable-ar-profiler). - -Supports three dataset types: - - prompt: Use prompt.json (default). T2I uses t2i_prompt, I2I uses i2i_prompt - and sends source images from image_url. - - random: Generate synthetic prompts (and random images for I2I). - - custom: Load from a user-specified JSON file. - -Usage: - # T2I with prompt.json (default) - python benchmarks/glm_image/benchmark_glm_image.py \ - --mode t2i --num-prompts 10 - - # I2I with prompt.json (downloads source images automatically) - python benchmarks/glm_image/benchmark_glm_image.py \ - --mode i2i --num-prompts 10 - - # Random dataset - python benchmarks/glm_image/benchmark_glm_image.py \ - --mode t2i --dataset random --num-prompts 20 - - # Custom dataset - python benchmarks/glm_image/benchmark_glm_image.py \ - --mode i2i --dataset custom \ - --dataset-path my_prompts.json --num-prompts 5 -""" - -import argparse -import asyncio -import base64 -import json -import os -import sys -import tempfile -import time -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -import aiohttp -import numpy as np -import requests as sync_requests -from PIL import Image -from tqdm.asyncio import tqdm - -# Import backends from the diffusion benchmark (add parent dirs to path) -sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "diffusion")) -from backends import RequestFuncOutput - -BENCHMARK_DIR = Path(__file__).resolve().parent -DEFAULT_PROMPT_JSON = BENCHMARK_DIR / "prompt" / "prompt.json" -IMAGE_CACHE_DIR = BENCHMARK_DIR / "prompt" / "images" - -DATASET_REPO = "JaredforReal/glm-image-bench" -DATASET_FILE = "prompt.json" - - -def _ensure_prompt_json(dataset_path: str | None) -> str: - """Return path to prompt.json, downloading from HuggingFace if needed.""" - if dataset_path: - return dataset_path - local = DEFAULT_PROMPT_JSON - if local.exists(): - return str(local) - print(f"Downloading {DATASET_FILE} from {DATASET_REPO} ...") - try: - from huggingface_hub import hf_hub_download - - downloaded = hf_hub_download( - repo_id=DATASET_REPO, - filename=DATASET_FILE, - repo_type="dataset", - ) - local.parent.mkdir(parents=True, exist_ok=True) - import shutil - - shutil.copy2(downloaded, local) - print(f"Saved to {local}") - except ImportError: - url = f"https://huggingface.co/datasets/{DATASET_REPO}/resolve/main/{DATASET_FILE}" - import urllib.request - - local.parent.mkdir(parents=True, exist_ok=True) - urllib.request.urlretrieve(url, local) - print(f"Saved to {local}") - return str(local) - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -@dataclass -class GLMImageRequest: - prompt: str - image_path: str | None = None # Only for I2I mode - - -def download_image(url: str) -> str: - """Download an image to cache and return the local path.""" - IMAGE_CACHE_DIR.mkdir(parents=True, exist_ok=True) - fname = url.rsplit("/", 1)[-1] - local_path = IMAGE_CACHE_DIR / fname - if local_path.exists(): - return str(local_path) - resp = sync_requests.get(url, timeout=30) - resp.raise_for_status() - local_path.write_bytes(resp.content) - return str(local_path) - - -def encode_image_as_data_url(path: str) -> str: - """Encode a local image file as a base64 data URL.""" - with open(path, "rb") as f: - encoded = base64.b64encode(f.read()).decode("utf-8") - ext = Path(path).suffix.lower() - mime = {"png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg"}.get(ext, "image/png") - return f"data:{mime};base64,{encoded}" - - -# --------------------------------------------------------------------------- -# Datasets -# --------------------------------------------------------------------------- - - -class PromptDataset: - """Load from prompt.json. T2I uses t2i_prompt, I2I uses i2i_prompt + image_url.""" - - def __init__(self, args: argparse.Namespace): - path = _ensure_prompt_json(args.dataset_path) - with open(path, encoding="utf-8") as f: - raw = json.load(f) - - prompt_key = "t2i_prompt" if args.mode == "t2i" else "i2i_prompt" - self.items: list[GLMImageRequest] = [] - - for entry in raw: - prompt = entry.get(prompt_key, "").strip() - if not prompt: - continue - image_path = None - if args.mode == "i2i": - url = entry.get("image_url", "") - if url: - image_path = download_image(url) - self.items.append(GLMImageRequest(prompt=prompt, image_path=image_path)) - - if args.num_prompts and len(self.items) > args.num_prompts: - self.items = self.items[: args.num_prompts] - - def __len__(self) -> int: - return len(self.items) - - def __getitem__(self, idx: int) -> GLMImageRequest: - return self.items[idx] - - def get_requests(self) -> list[GLMImageRequest]: - return list(self.items) - - -class RandomDataset: - """Generate synthetic prompts (and optional random images for I2I).""" - - def __init__(self, args: argparse.Namespace): - self.args = args - self.num_prompts = args.num_prompts - self._random_image_paths: list[str] | None = None - if args.mode == "i2i": - self._random_image_paths = self._generate_random_images() - - def _generate_random_images(self) -> list[str]: - paths: list[str] = [] - for i in range(self.args.num_input_images): - img = Image.new("RGB", (512, 512), (128 + i * 30 % 128, 64, 192)) - path = os.path.join(tempfile.gettempdir(), f"glm_image_bench_input_{i}.png") - img.save(path) - paths.append(path) - return paths - - def __len__(self) -> int: - return self.num_prompts - - def __getitem__(self, idx: int) -> GLMImageRequest: - image_path = None - if self._random_image_paths is not None: - image_path = self._random_image_paths[idx % len(self._random_image_paths)] - return GLMImageRequest( - prompt=f"A beautiful scene with vivid colors and intricate details, prompt {idx}", - image_path=image_path, - ) - - def get_requests(self) -> list[GLMImageRequest]: - return [self[i] for i in range(len(self))] - - -class CustomDataset: - """Load from a user-specified JSON file. - - Expected format: - [ - {"prompt": "A cat sitting on a windowsill"}, - {"prompt": "Make it look like winter", "image_path": "/path/to/img.png"} - ] - """ - - def __init__(self, args: argparse.Namespace): - if not args.dataset_path: - raise ValueError("--dataset-path is required for custom dataset") - with open(args.dataset_path, encoding="utf-8") as f: - raw = json.load(f) - self.items: list[GLMImageRequest] = [] - for item in raw: - self.items.append( - GLMImageRequest( - prompt=item.get("prompt", ""), - image_path=item.get("image_path"), - ) - ) - if args.num_prompts and len(self.items) > args.num_prompts: - self.items = self.items[: args.num_prompts] - - def __len__(self) -> int: - return len(self.items) - - def __getitem__(self, idx: int) -> GLMImageRequest: - return self.items[idx] - - def get_requests(self) -> list[GLMImageRequest]: - return list(self.items) - - -# --------------------------------------------------------------------------- -# Async request for GLM-Image (chat completions with image support) -# --------------------------------------------------------------------------- - - -async def async_glm_image_request( - req: GLMImageRequest, - api_url: str, - model: str, - session: aiohttp.ClientSession, - pbar: Any, - args: argparse.Namespace, -) -> RequestFuncOutput: - """Send a single T2I or I2I request via chat completions endpoint.""" - output = RequestFuncOutput() - output.start_time = time.perf_counter() - - # Build messages - if req.image_path and args.mode == "i2i": - data_url = encode_image_as_data_url(req.image_path) - content = [ - {"type": "text", "text": req.prompt}, - {"type": "image_url", "image_url": {"url": data_url}}, - ] - else: - content = req.prompt - - messages = [{"role": "user", "content": content}] - - extra_body: dict[str, Any] = {} - if args.height: - extra_body["height"] = args.height - if args.width: - extra_body["width"] = args.width - if args.num_inference_steps: - extra_body["num_inference_steps"] = args.num_inference_steps - if args.seed is not None: - extra_body["seed"] = args.seed - - payload: dict[str, Any] = { - "model": model, - "messages": messages, - } - if extra_body: - payload["extra_body"] = extra_body - - try: - async with session.post(api_url, json=payload) as response: - if response.status == 200: - resp_json = await response.json() - output.response_body = resp_json - output.success = True - try: - choices = resp_json.get("choices", []) - if choices and isinstance(choices, list): - msg = choices[0].get("message", {}) - if isinstance(msg, dict): - resp_content = msg.get("content", []) - if resp_content and isinstance(resp_content, list) and len(resp_content) > 0: - first_item = resp_content[0] - if isinstance(first_item, dict): - output.stage_durations = first_item.get("stage_durations") or {} - output.peak_memory_mb = first_item.get("peak_memory_mb", 0.0) - except (IndexError, TypeError, AttributeError): - pass - else: - output.error = f"HTTP {response.status}: {await response.text()}" - output.success = False - except Exception as e: - output.error = str(e) - output.success = False - - output.latency = time.perf_counter() - output.start_time - if pbar: - pbar.update(1) - return output - - -# --------------------------------------------------------------------------- -# Benchmark -# --------------------------------------------------------------------------- - - -async def iter_requests(n: int, request_rate: float) -> Any: - import random as _random - - for i in range(n): - if request_rate != float("inf") and i > 0: - await asyncio.sleep(_random.expovariate(request_rate)) - yield i - - -def calculate_metrics(outputs: list[RequestFuncOutput], total_duration: float) -> dict[str, Any]: - success = [o for o in outputs if o.success] - errors = [o for o in outputs if not o.success] - latencies = [o.latency for o in success] - peak_mems = [o.peak_memory_mb for o in success if o.peak_memory_mb > 0] - - stage_duration_lists: dict[str, list[float]] = {} - for o in success: - for stage, dur in (o.stage_durations or {}).items(): - stage_duration_lists.setdefault(stage, []).append(dur) - - return { - "duration": total_duration, - "completed_requests": len(success), - "failed_requests": len(errors), - "throughput_qps": len(success) / total_duration if total_duration > 0 else 0, - "latency_mean": float(np.mean(latencies)) if latencies else 0, - "latency_median": float(np.median(latencies)) if latencies else 0, - "latency_p99": float(np.percentile(latencies, 99)) if latencies else 0, - "latency_p95": float(np.percentile(latencies, 95)) if latencies else 0, - "peak_memory_mb_max": max(peak_mems) if peak_mems else 0, - "stage_durations_mean": {s: float(np.mean(v)) for s, v in stage_duration_lists.items()}, - "stage_durations_p50": {s: float(np.percentile(v, 50)) for s, v in stage_duration_lists.items()}, - } - - -async def benchmark(args: argparse.Namespace) -> None: - api_url = f"http://{args.host}:{args.port}/v1/chat/completions" - - # Load dataset - if args.dataset == "prompt": - dataset = PromptDataset(args) - elif args.dataset == "random": - dataset = RandomDataset(args) - elif args.dataset == "custom": - dataset = CustomDataset(args) - else: - raise ValueError(f"Unknown dataset: {args.dataset}") - - glm_requests = dataset.get_requests() - print(f"Prepared {len(glm_requests)} requests (mode={args.mode}, dataset={args.dataset})") - - semaphore = asyncio.Semaphore(args.max_concurrency) if args.max_concurrency else None - - async def limited_request(idx: int, req: GLMImageRequest, session: aiohttp.ClientSession, pbar: Any): - if semaphore: - async with semaphore: - return await async_glm_image_request(req, api_url, args.model, session, pbar, args) - return await async_glm_image_request(req, api_url, args.model, session, pbar, args) - - async with aiohttp.ClientSession() as session: - # Warmup - if args.warmup_requests and glm_requests: - print(f"Running {args.warmup_requests} warmup request(s)...") - for i in range(args.warmup_requests): - await limited_request(i, glm_requests[i % len(glm_requests)], session, None) - - # Main benchmark - pbar = tqdm(total=len(glm_requests), disable=args.disable_tqdm) - start_time = time.perf_counter() - tasks = [] - async for idx in iter_requests(len(glm_requests), args.request_rate): - tasks.append(asyncio.create_task(limited_request(idx, glm_requests[idx], session, pbar))) - outputs = await asyncio.gather(*tasks) - total_duration = time.perf_counter() - start_time - pbar.close() - - # Metrics - metrics = calculate_metrics(outputs, total_duration) - metrics["mode"] = args.mode - metrics["model"] = args.model - metrics["dataset"] = args.dataset - - print(f"\n{' GLM-Image Online Benchmark Result ':=^60}") - print(f"{'Mode:':<40} {args.mode}") - print(f"{'Model:':<40} {args.model}") - print(f"{'Dataset:':<40} {args.dataset}") - print("-" * 50) - print(f"{'Benchmark duration (s):':<40} {metrics['duration']:.2f}") - print(f"{'Request rate:':<40} {args.request_rate}") - print(f"{'Max concurrency:':<40} {args.max_concurrency}") - print(f"{'Successful requests:':<40} {metrics['completed_requests']}/{len(glm_requests)}") - print("-" * 50) - print(f"{'Throughput (req/s):':<40} {metrics['throughput_qps']:.2f}") - print(f"{'Latency Mean (s):':<40} {metrics['latency_mean']:.4f}") - print(f"{'Latency Median (s):':<40} {metrics['latency_median']:.4f}") - print(f"{'Latency P95 (s):':<40} {metrics['latency_p95']:.4f}") - print(f"{'Latency P99 (s):':<40} {metrics['latency_p99']:.4f}") - - if metrics["peak_memory_mb_max"] > 0: - print("-" * 50) - print(f"{'Peak Memory Max (MB):':<40} {metrics['peak_memory_mb_max']:.2f}") - - if metrics["stage_durations_mean"]: - print("-" * 50) - print("Stage Durations Mean:") - for stage, val in sorted(metrics["stage_durations_mean"].items()): - unit = "ms" if stage.endswith("_ms") else "s" - print(f" {stage + ':':<38} {val:.4f} ({unit})") - - print("=" * 60) - - if args.output_file: - with open(args.output_file, "w") as f: - json.dump(metrics, f, indent=2) - print(f"Metrics saved to {args.output_file}") - - -def main() -> None: - parser = argparse.ArgumentParser(description="Benchmark GLM-Image T2I/I2I online serving.") - parser.add_argument("--mode", type=str, default="t2i", choices=["t2i", "i2i"]) - parser.add_argument("--dataset", type=str, default="prompt", choices=["prompt", "random", "custom"]) - parser.add_argument("--dataset-path", type=str, default=None) - parser.add_argument("--num-prompts", type=int, default=10) - parser.add_argument("--max-concurrency", type=int, default=1) - parser.add_argument("--request-rate", type=float, default=float("inf")) - parser.add_argument("--warmup-requests", type=int, default=1) - parser.add_argument("--width", type=int, default=1024) - parser.add_argument("--height", type=int, default=1024) - parser.add_argument("--num-inference-steps", type=int, default=50) - parser.add_argument("--seed", type=int, default=None) - parser.add_argument("--model", type=str, default="default") - parser.add_argument("--host", type=str, default="localhost") - parser.add_argument("--port", type=int, default=8091) - parser.add_argument("--output-file", type=str, default=None) - parser.add_argument("--disable-tqdm", action="store_true") - parser.add_argument("--num-input-images", type=int, default=1, help="For random I2I dataset.") - args = parser.parse_args() - asyncio.run(benchmark(args)) - - -if __name__ == "__main__": - main() diff --git a/benchmarks/glm_image/huggingface/inference.py b/benchmarks/glm_image/huggingface/inference.py deleted file mode 100644 index ff826080e8c..00000000000 --- a/benchmarks/glm_image/huggingface/inference.py +++ /dev/null @@ -1,291 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project -""" -HuggingFace (transformers + diffusers) baseline benchmark for GLM-Image. - -Supports T2I and I2I modes with the prompt.json dataset. -Downloads source images for I2I from image_url on first run and caches locally. - -Usage: - # T2I mode (text-to-image, no source images needed) - python benchmarks/glm_image/huggingface/inference.py \ - --model-path zai-org/GLM-Image \ - --mode t2i --num-prompts 10 - - # I2I mode (image-to-image, downloads source images) - python benchmarks/glm_image/huggingface/inference.py \ - --model-path zai-org/GLM-Image \ - --mode i2i --num-prompts 10 - - # With custom prompt.json - python benchmarks/glm_image/huggingface/inference.py \ - --model-path zai-org/GLM-Image \ - --mode i2i --dataset-path prompts.json --num-prompts 5 -""" - -import argparse -import json -import os -import time -from pathlib import Path - -import numpy as np -import requests -import torch -from PIL import Image - -BENCHMARK_DIR = Path(__file__).resolve().parent.parent -DEFAULT_PROMPT_JSON = BENCHMARK_DIR / "prompt" / "prompt.json" -IMAGE_CACHE_DIR = BENCHMARK_DIR / "prompt" / "images" - -DATASET_REPO = "JaredforReal/glm-image-bench" -DATASET_FILE = "prompt.json" - - -def _ensure_prompt_json(dataset_path: str | None) -> str: - """Return path to prompt.json, downloading from HuggingFace if needed.""" - if dataset_path: - return dataset_path - local = DEFAULT_PROMPT_JSON - if local.exists(): - return str(local) - print(f"Downloading {DATASET_FILE} from {DATASET_REPO} ...") - try: - from huggingface_hub import hf_hub_download - - downloaded = hf_hub_download( - repo_id=DATASET_REPO, - filename=DATASET_FILE, - repo_type="dataset", - ) - local.parent.mkdir(parents=True, exist_ok=True) - import shutil - - shutil.copy2(downloaded, local) - print(f"Saved to {local}") - except ImportError: - url = f"https://huggingface.co/datasets/{DATASET_REPO}/resolve/main/{DATASET_FILE}" - import urllib.request - - local.parent.mkdir(parents=True, exist_ok=True) - urllib.request.urlretrieve(url, local) - print(f"Saved to {local}") - return str(local) - - -HEIGHT = 1024 -WIDTH = 1024 -SEED = 42 -NUM_INFERENCE_STEPS = 50 -GUIDANCE_SCALE = 1.5 - - -# --------------------------------------------------------------------------- -# Dataset -# --------------------------------------------------------------------------- - - -def load_dataset( - dataset_path: str | None, - mode: str, - num_prompts: int, -) -> list[dict]: - """Load prompts from prompt.json and prepare per-request data.""" - path = _ensure_prompt_json(dataset_path) - with open(path, encoding="utf-8") as f: - raw = json.load(f) - - items = [] - for entry in raw: - if mode == "t2i": - prompt_key = "t2i_prompt" - else: - prompt_key = "i2i_prompt" - - prompt_text = entry.get(prompt_key, "").strip() - if not prompt_text: - continue - - item = {"prompt": prompt_text} - if mode == "i2i": - item["image_url"] = entry.get("image_url", "") - items.append(item) - - if num_prompts and len(items) > num_prompts: - items = items[:num_prompts] - return items - - -def download_image(url: str, cache_dir: Path) -> str: - """Download an image to cache_dir and return the local path.""" - cache_dir.mkdir(parents=True, exist_ok=True) - fname = url.rsplit("/", 1)[-1] - local_path = cache_dir / fname - if local_path.exists(): - return str(local_path) - print(f" Downloading {url} ...") - resp = requests.get(url, timeout=30) - resp.raise_for_status() - local_path.write_bytes(resp.content) - return str(local_path) - - -# --------------------------------------------------------------------------- -# Benchmark -# --------------------------------------------------------------------------- - - -def benchmark(args: argparse.Namespace) -> None: - from diffusers.pipelines.glm_image import GlmImagePipeline - - print("=" * 60) - print("GLM-Image HuggingFace Baseline Benchmark") - print(f"Mode: {args.mode} | Model: {args.model_path}") - print(f"Size: {args.height}x{args.width} | Steps: {args.num_inference_steps}") - print("=" * 60) - - # Load dataset - items = load_dataset(args.dataset_path, args.mode, args.num_prompts) - if not items: - print("No prompts loaded. Exiting.") - return - print(f"Loaded {len(items)} prompts for {args.mode} mode") - - # Download I2I source images - if args.mode == "i2i": - print("Preparing source images...") - for item in items: - url = item.get("image_url", "") - if url: - item["image_path"] = download_image(url, IMAGE_CACHE_DIR) - else: - item["image_path"] = None - - # Load pipeline - print(f"\nLoading pipeline from {args.model_path} ...") - t0 = time.perf_counter() - pipe = GlmImagePipeline.from_pretrained( - args.model_path, - torch_dtype=torch.bfloat16, - device_map="cuda", - ) - init_time = time.perf_counter() - t0 - print(f"Pipeline loaded in {init_time:.2f}s") - - # Create output dir - os.makedirs(args.output_dir, exist_ok=True) - - # Run benchmark - generator = torch.Generator(device="cuda").manual_seed(args.seed) - latencies = [] - success = 0 - failed = 0 - - print(f"\nRunning {len(items)} requests sequentially...") - print("-" * 60) - - for i, item in enumerate(items): - prompt = item["prompt"] - gen_kwargs: dict = { - "prompt": prompt, - "height": args.height, - "width": args.width, - "num_inference_steps": args.num_inference_steps, - "guidance_scale": args.guidance_scale, - "generator": generator, - } - - if args.mode == "i2i": - img_path = item.get("image_path") - if img_path and os.path.exists(img_path): - gen_kwargs["image"] = [Image.open(img_path).convert("RGB")] - else: - print(f" [{i + 1}] SKIP: no source image") - failed += 1 - continue - - t_start = time.perf_counter() - try: - result = pipe(**gen_kwargs) - image = result.images[0] - elapsed = time.perf_counter() - t_start - latencies.append(elapsed) - success += 1 - - out_path = os.path.join(args.output_dir, f"{i:04d}.png") - image.save(out_path) - print(f" [{i + 1}/{len(items)}] {elapsed:.3f}s -> {out_path}") - except Exception as e: - elapsed = time.perf_counter() - t_start - failed += 1 - print(f" [{i + 1}/{len(items)}] FAILED ({elapsed:.3f}s): {e}") - - # Report - total_gen_time = sum(latencies) if latencies else 0 - print("\n" + "=" * 60) - print("HuggingFace Baseline Results") - print("=" * 60) - print(f"{'Mode:':<40} {args.mode}") - print(f"{'Model:':<40} {args.model_path}") - print(f"{'Image size:':<40} {args.height}x{args.width}") - print(f"{'Num inference steps:':<40} {args.num_inference_steps}") - print("-" * 50) - print(f"{'Pipeline init time (s):':<40} {init_time:.2f}") - print(f"{'Successful:':<40} {success}/{len(items)}") - print(f"{'Failed:':<40} {failed}") - print("-" * 50) - if latencies: - arr = np.array(latencies) - print(f"{'Total generation time (s):':<40} {total_gen_time:.2f}") - print(f"{'Throughput (img/s):':<40} {success / total_gen_time:.4f}") - print(f"{'Latency Mean (s):':<40} {arr.mean():.4f}") - print(f"{'Latency Median (s):':<40} {np.median(arr):.4f}") - print(f"{'Latency P95 (s):':<40} {np.percentile(arr, 95):.4f}") - print(f"{'Latency P99 (s):':<40} {np.percentile(arr, 99):.4f}") - - print(f"\n{'Output dir:':<40} {args.output_dir}") - print("=" * 60) - - # Save metrics JSON - metrics = { - "backend": "huggingface", - "mode": args.mode, - "model": args.model_path, - "height": args.height, - "width": args.width, - "num_inference_steps": args.num_inference_steps, - "init_time_s": init_time, - "completed_requests": success, - "failed_requests": failed, - "total_gen_time_s": total_gen_time, - "throughput_qps": success / total_gen_time if total_gen_time > 0 else 0, - "latency_mean": float(np.mean(latencies)) if latencies else 0, - "latency_median": float(np.median(latencies)) if latencies else 0, - "latency_p95": float(np.percentile(latencies, 95)) if latencies else 0, - "latency_p99": float(np.percentile(latencies, 99)) if latencies else 0, - } - if args.output_file: - with open(args.output_file, "w") as f: - json.dump(metrics, f, indent=2) - print(f"Metrics saved to {args.output_file}") - - -def main() -> None: - parser = argparse.ArgumentParser(description="GLM-Image HuggingFace baseline benchmark") - parser.add_argument("--model-path", type=str, default="zai-org/GLM-Image") - parser.add_argument("--mode", type=str, default="t2i", choices=["t2i", "i2i"]) - parser.add_argument("--dataset-path", type=str, default=None, help="Path to prompt.json") - parser.add_argument("--num-prompts", type=int, default=10) - parser.add_argument("--height", type=int, default=HEIGHT) - parser.add_argument("--width", type=int, default=WIDTH) - parser.add_argument("--num-inference-steps", type=int, default=NUM_INFERENCE_STEPS) - parser.add_argument("--guidance-scale", type=float, default=GUIDANCE_SCALE) - parser.add_argument("--seed", type=int, default=SEED) - parser.add_argument("--output-dir", type=str, default="benchmarks/glm_image/huggingface/outputs") - parser.add_argument("--output-file", type=str, default=None, help="JSON file for metrics") - args = parser.parse_args() - benchmark(args) - - -if __name__ == "__main__": - main() diff --git a/benchmarks/glm_image/vllm-omni/inference.py b/benchmarks/glm_image/vllm-omni/inference.py deleted file mode 100644 index 5729da07174..00000000000 --- a/benchmarks/glm_image/vllm-omni/inference.py +++ /dev/null @@ -1,505 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project -""" -vLLM-Omni offline benchmark for GLM-Image. - -Supports T2I and I2I modes with the prompt.json dataset. -Downloads source images for I2I from image_url on first run and caches locally. - -Usage: - # T2I mode - python benchmarks/glm_image/vllm-omni/inference.py \ - --model-path zai-org/GLM-Image \ - --mode t2i --num-prompts 10 - - # I2I mode (downloads source images) - python benchmarks/glm_image/vllm-omni/inference.py \ - --model-path zai-org/GLM-Image \ - --mode i2i --num-prompts 10 -""" - -import argparse -import json -import math -import os -import time -from pathlib import Path - -import numpy as np -import requests -from PIL import Image -from vllm import SamplingParams - -from vllm_omni.entrypoints.omni import Omni -from vllm_omni.inputs.data import OmniDiffusionSamplingParams - -BENCHMARK_DIR = Path(__file__).resolve().parent.parent -DEFAULT_PROMPT_JSON = BENCHMARK_DIR / "prompt" / "prompt.json" -IMAGE_CACHE_DIR = BENCHMARK_DIR / "prompt" / "images" -DEFAULT_DEPLOY_CONFIG = "vllm_omni/deploy/glm_image.yaml" - -DATASET_REPO = "JaredforReal/glm-image-bench" -DATASET_FILE = "prompt.json" - - -def _ensure_prompt_json(dataset_path: str | None) -> str: - """Return path to prompt.json, downloading from HuggingFace if needed.""" - if dataset_path: - return dataset_path - local = DEFAULT_PROMPT_JSON - if local.exists(): - return str(local) - print(f"Downloading {DATASET_FILE} from {DATASET_REPO} ...") - try: - from huggingface_hub import hf_hub_download - - downloaded = hf_hub_download( - repo_id=DATASET_REPO, - filename=DATASET_FILE, - repo_type="dataset", - ) - local.parent.mkdir(parents=True, exist_ok=True) - import shutil - - shutil.copy2(downloaded, local) - print(f"Saved to {local}") - except ImportError: - url = f"https://huggingface.co/datasets/{DATASET_REPO}/resolve/main/{DATASET_FILE}" - import urllib.request - - local.parent.mkdir(parents=True, exist_ok=True) - urllib.request.urlretrieve(url, local) - print(f"Saved to {local}") - return str(local) - - -SEED = 42 -HEIGHT = 1024 -WIDTH = 1024 -NUM_INFERENCE_STEPS = 50 -GUIDANCE_SCALE = 1.5 - -GLM_IMAGE_EOS_TOKEN_ID = 16385 -GLM_IMAGE_VISION_VOCAB_SIZE = 16512 - - -# --------------------------------------------------------------------------- -# Dataset -# --------------------------------------------------------------------------- - - -def load_dataset( - dataset_path: str | None, - mode: str, - num_prompts: int, -) -> list[dict]: - path = _ensure_prompt_json(dataset_path) - with open(path, encoding="utf-8") as f: - raw = json.load(f) - - items = [] - for entry in raw: - prompt_key = "t2i_prompt" if mode == "t2i" else "i2i_prompt" - prompt_text = entry.get(prompt_key, "").strip() - if not prompt_text: - continue - - item = {"prompt": prompt_text} - if mode == "i2i": - item["image_url"] = entry.get("image_url", "") - items.append(item) - - if num_prompts and len(items) > num_prompts: - items = items[:num_prompts] - return items - - -def download_image(url: str, cache_dir: Path) -> str: - cache_dir.mkdir(parents=True, exist_ok=True) - fname = url.rsplit("/", 1)[-1] - local_path = cache_dir / fname - if local_path.exists(): - return str(local_path) - print(f" Downloading {url} ...") - resp = requests.get(url, timeout=30) - resp.raise_for_status() - local_path.write_bytes(resp.content) - return str(local_path) - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def compute_max_tokens(height: int, width: int, is_i2i: bool = False) -> int: - factor = 32 - token_h = height // factor - token_w = width // factor - large_tokens = token_h * token_w - - # Small preview tokens (half resolution in each dimension) - - ratio = token_h / token_w if token_w > 0 else 1.0 - small_token_h = max(1, int(math.sqrt(ratio) * (factor // 2))) - small_token_w = max(1, int(math.sqrt(1 / ratio) * (factor // 2))) - small_tokens = small_token_h * small_token_w - - # Mode-dependent totals: - # - t2i: small + large + EOS - # - i2i: large + EOS - if is_i2i: - return large_tokens + 1 - return small_tokens + large_tokens + 1 - - -def build_prompt_t2i(prompt: str, height: int, width: int, **gen_kw) -> dict: - return { - "prompt": prompt, - "height": height, - "width": width, - "mm_processor_kwargs": {"target_h": height, "target_w": width}, - **gen_kw, - } - - -def build_prompt_i2i(prompt: str, image_path: str, height: int, width: int, **gen_kw) -> dict: - return { - "prompt": prompt, - "height": height, - "width": width, - "mm_processor_kwargs": {"target_h": height, "target_w": width}, - "multi_modal_data": {"image": Image.open(image_path).convert("RGB")}, - **gen_kw, - } - - -def resolve_deploy_config(args: argparse.Namespace) -> str: - if args.deploy_config: - return args.deploy_config - if os.path.exists(DEFAULT_DEPLOY_CONFIG): - return DEFAULT_DEPLOY_CONFIG - fallback = Path(__file__).resolve().parents[3] / DEFAULT_DEPLOY_CONFIG - if fallback.exists(): - return str(fallback) - raise FileNotFoundError("Deploy config not found. Specify --deploy-config.") - - -# --------------------------------------------------------------------------- -# Benchmark -# --------------------------------------------------------------------------- - - -def benchmark(args: argparse.Namespace) -> None: - is_i2i = args.mode == "i2i" - - print("=" * 60) - print("GLM-Image vLLM-Omni Benchmark") - print(f"Mode: {args.mode} | Model: {args.model_path}") - print(f"Size: {args.height}x{args.width} | Steps: {args.num_inference_steps}") - print("=" * 60) - - # Load dataset - items = load_dataset(args.dataset_path, args.mode, args.num_prompts) - if not items: - print("No prompts loaded. Exiting.") - return - print(f"Loaded {len(items)} prompts for {args.mode} mode") - - # Download I2I source images - if is_i2i: - print("Preparing source images...") - for item in items: - url = item.get("image_url", "") - if url: - item["image_path"] = download_image(url, IMAGE_CACHE_DIR) - else: - item["image_path"] = None - - # Init Omni - deploy_config = resolve_deploy_config(args) - print(f"\nInitializing vLLM-Omni (deploy config: {deploy_config}) ...") - t0 = time.perf_counter() - - omni = Omni( - model=args.model_path, - deploy_config=deploy_config, - log_stats=args.log_stats, - stage_init_timeout=args.stage_init_timeout, - enable_diffusion_pipeline_profiler=args.enable_diffusion_pipeline_profiler, - enable_ar_profiler=args.enable_ar_profiler, - ) - - init_time = time.perf_counter() - t0 - print(f"Initialized in {init_time:.2f}s") - - # Sampling params - max_tokens = compute_max_tokens(args.height, args.width, is_i2i=is_i2i) - ar_params = SamplingParams( - temperature=0.9, - top_p=0.75, - top_k=GLM_IMAGE_VISION_VOCAB_SIZE, - max_tokens=max_tokens, - stop_token_ids=[GLM_IMAGE_EOS_TOKEN_ID], - seed=args.seed, - detokenize=False, - extra_args={"target_h": args.height, "target_w": args.width}, - ) - diff_params = OmniDiffusionSamplingParams( - num_inference_steps=args.num_inference_steps, - guidance_scale=args.guidance_scale, - height=args.height, - width=args.width, - seed=args.seed, - ) - sampling_params_list = [ar_params, diff_params] - - # Build all prompts - gen_kw = { - "seed": args.seed, - "num_inference_steps": args.num_inference_steps, - "guidance_scale": args.guidance_scale, - } - all_prompts = [] - for item in items: - if is_i2i: - img_path = item.get("image_path") - if not img_path or not os.path.exists(img_path): - continue - all_prompts.append(build_prompt_i2i(item["prompt"], img_path, args.height, args.width, **gen_kw)) - else: - all_prompts.append(build_prompt_t2i(item["prompt"], args.height, args.width, **gen_kw)) - - valid = len(all_prompts) - print(f"Valid prompts: {valid}") - - # Create output dir - os.makedirs(args.output_dir, exist_ok=True) - - # Warmup: run 1 request to prime caches, CUDA graphs, etc. - if all_prompts: - print("Running warmup request...") - try: - warmup_prompt = [all_prompts[0]] - omni.generate(warmup_prompt, sampling_params_list, py_generator=False) - print("Warmup done.\n") - except Exception as e: - print(f"Warmup failed (continuing): {e}") - - # Run - print(f"\nRunning {valid} requests...") - print("-" * 60) - - latencies = [] - all_stage_durations: list[dict[str, float]] = [] - success = 0 - failed = 0 - wall_start = time.perf_counter() - - try: - output_idx = 0 - for stage_outputs in omni.generate(all_prompts, sampling_params_list, py_generator=True): - if stage_outputs.final_output_type == "image": - request_output = stage_outputs.request_output - request_id = getattr(request_output, "request_id", "") - - images = getattr(request_output, "images", []) - if not images and hasattr(request_output, "multimodal_output"): - mm = request_output.multimodal_output - if isinstance(mm, dict): - images = mm.get("images", []) - - elapsed = time.perf_counter() - wall_start - if images: - for img in images: - if isinstance(img, Image.Image): - out_path = os.path.join(args.output_dir, f"{output_idx:04d}.png") - img.save(out_path) - success += 1 - latencies.append(elapsed) - stage_durations = getattr(stage_outputs, "stage_durations", {}) - if stage_durations: - all_stage_durations.append(stage_durations) - # Show wall-clock elapsed and pipeline breakdown if available - preprocess_str = "" - if "preprocess_ms" in stage_durations: - preprocess_str = f" preprocess={stage_durations['preprocess_ms'] / 1000.0:.2f}s" - print(f" [{success}/{valid}] id={request_id[:8]} {elapsed:.2f}s{preprocess_str}") - output_idx += 1 - else: - failed += 1 - except Exception as e: - print(f"Error: {e}") - failed = valid - success - - total_gen_time = time.perf_counter() - wall_start - - # Diff stage_0_gen_ms with previous request to remove accumulated wait time. - # stage_0_gen_ms is measured from submit_ts (same for all requests submitted - # at once), so it accumulates queue/scheduling overhead across requests. - # Other stages and pipeline timings are per-request already. - _TIMING_ORDER = [ - "preprocess_ms", - "stage_0_gen_ms", - "ar2diffusion_ms", - "stage_1_gen_ms", - "queue_wait_ms", - ] - - per_request_actual: list[dict[str, float]] = [] - prev_stage_0_ms = 0.0 - for sd in all_stage_durations: - actual = dict(sd) - s0 = sd.get("stage_0_gen_ms", 0.0) - actual["stage_0_gen_ms"] = s0 - prev_stage_0_ms - prev_stage_0_ms = s0 - per_request_actual.append(actual) - - per_request_e2e_ms: list[float] = [] - for actual in per_request_actual: - e2e_ms = sum(v for k, v in actual.items() if k in _TIMING_ORDER) - if e2e_ms > 0: - per_request_e2e_ms.append(e2e_ms) - - # Report - print("\n" + "=" * 60) - print("vLLM-Omni Benchmark Results") - print("=" * 60) - print(f"{'Mode:':<40} {args.mode}") - print(f"{'Model:':<40} {args.model_path}") - print(f"{'Image size:':<40} {args.height}x{args.width}") - print(f"{'Num inference steps:':<40} {args.num_inference_steps}") - print("-" * 50) - print(f"{'Init time (s):':<40} {init_time:.2f}") - print(f"{'Successful:':<40} {success}/{valid}") - print(f"{'Failed:':<40} {failed}") - print("-" * 50) - - if per_request_e2e_ms: - per_request_s = np.array(per_request_e2e_ms) / 1000.0 - print(f"{'Total generation time (s):':<40} {total_gen_time:.2f}") - print(f"{'Throughput (img/s):':<40} {success / total_gen_time:.4f}") - print(f"{'Latency Mean (s):':<40} {per_request_s.mean():.4f}") - print(f"{'Latency Median (s):':<40} {np.median(per_request_s):.4f}") - print(f"{'Latency P95 (s):':<40} {np.percentile(per_request_s, 95):.4f}") - print(f"{'Latency P99 (s):':<40} {np.percentile(per_request_s, 99):.4f}") - print(f"{'Latency Min (s):':<40} {per_request_s.min():.4f}") - print(f"{'Latency Max (s):':<40} {per_request_s.max():.4f}") - elif latencies: - per_request = np.diff([0.0] + list(latencies)) - print(f"{'Total generation time (s):':<40} {total_gen_time:.2f}") - print(f"{'Throughput (img/s):':<40} {success / total_gen_time:.4f}") - print(f"{'Latency Mean (s) [wall-clock]:':<40} {per_request.mean():.4f}") - print(f"{'Latency Median (s) [wall-clock]:':<40} {np.median(per_request):.4f}") - print(f"{'Latency P95 (s) [wall-clock]:':<40} {np.percentile(per_request, 95):.4f}") - print(f"{'Latency P99 (s) [wall-clock]:':<40} {np.percentile(per_request, 99):.4f}") - print(f"{'Latency Min (s) [wall-clock]:':<40} {per_request.min():.4f}") - print(f"{'Latency Max (s) [wall-clock]:':<40} {per_request.max():.4f}") - - if per_request_actual: - print("-" * 50) - print("Pipeline Timings Mean:") - for key in _TIMING_ORDER: - vals = [d.get(key, 0.0) for d in per_request_actual] - if any(v != 0 for v in vals): - unit = "ms" if key.endswith("_ms") else "s" - print(f" {key + ':':<38} {np.mean(vals):.4f} ({unit})") - # Show any extra keys not in the ordered list - ordered_set = set(_TIMING_ORDER) - extra_keys = sorted(k for k in per_request_actual[0].keys() if k not in ordered_set) - for key in extra_keys: - vals = [d.get(key, 0.0) for d in per_request_actual] - if any(v != 0 for v in vals): - unit = "ms" if key.endswith("_ms") else "s" - print(f" {key + ':':<38} {np.mean(vals):.4f} ({unit})") - - print(f"\n{'Output dir:':<40} {args.output_dir}") - print("=" * 60) - - # Metrics JSON - metrics = { - "backend": "vllm-omni", - "mode": args.mode, - "model": args.model_path, - "height": args.height, - "width": args.width, - "num_inference_steps": args.num_inference_steps, - "init_time_s": init_time, - "completed_requests": success, - "failed_requests": failed, - "total_gen_time_s": total_gen_time, - "throughput_qps": success / total_gen_time if total_gen_time > 0 else 0, - } - if per_request_e2e_ms: - per_request_s = np.array(per_request_e2e_ms) / 1000.0 - metrics["latency_mean"] = float(per_request_s.mean()) - metrics["latency_median"] = float(np.median(per_request_s)) - metrics["latency_p95"] = float(np.percentile(per_request_s, 95)) - metrics["latency_p99"] = float(np.percentile(per_request_s, 99)) - elif latencies: - per_request = np.diff([0.0] + list(latencies)) - metrics["latency_mean"] = float(per_request.mean()) - metrics["latency_median"] = float(np.median(per_request)) - metrics["latency_p95"] = float(np.percentile(per_request, 95)) - metrics["latency_p99"] = float(np.percentile(per_request, 99)) - else: - metrics["latency_mean"] = 0 - metrics["latency_median"] = 0 - metrics["latency_p95"] = 0 - metrics["latency_p99"] = 0 - if per_request_actual: - all_keys = list(_TIMING_ORDER) + sorted(k for k in per_request_actual[0].keys() if k not in set(_TIMING_ORDER)) - stage_metrics = {} - for key in all_keys: - vals = [d.get(key, 0.0) for d in per_request_actual] - stage_metrics[key] = { - "mean": float(np.mean(vals)), - "median": float(np.median(vals)), - "p95": float(np.percentile(vals, 95)), - } - metrics["stage_durations"] = stage_metrics - if args.output_file: - with open(args.output_file, "w") as f: - json.dump(metrics, f, indent=2) - print(f"Metrics saved to {args.output_file}") - - omni.close() - print("Done!") - - -def main() -> None: - parser = argparse.ArgumentParser(description="GLM-Image vLLM-Omni offline benchmark") - parser.add_argument("--model-path", type=str, default="zai-org/GLM-Image") - parser.add_argument("--deploy-config", type=str, default=None, help="Deploy config YAML") - parser.add_argument("--mode", type=str, default="t2i", choices=["t2i", "i2i"]) - parser.add_argument("--dataset-path", type=str, default=None, help="Path to prompt.json") - parser.add_argument("--num-prompts", type=int, default=10) - parser.add_argument("--height", type=int, default=HEIGHT) - parser.add_argument("--width", type=int, default=WIDTH) - parser.add_argument("--num-inference-steps", type=int, default=NUM_INFERENCE_STEPS) - parser.add_argument("--guidance-scale", type=float, default=GUIDANCE_SCALE) - parser.add_argument("--seed", type=int, default=SEED) - parser.add_argument("--output-dir", type=str, default="benchmarks/glm_image/vllm-omni/outputs") - parser.add_argument("--output-file", type=str, default=None, help="JSON file for metrics") - parser.add_argument("--stage-init-timeout", type=int, default=600) - parser.add_argument( - "--enable-diffusion-pipeline-profiler", - action="store_true", - help="Enable diffusion pipeline profiler for stage-level timing", - ) - parser.add_argument( - "--enable-ar-profiler", - action="store_true", - help="Enable AR stage profiler to include AR timing in stage_durations", - ) - parser.add_argument( - "--log-stats", - action="store_true", - help="Enable detailed per-request pipeline stats logging", - ) - args = parser.parse_args() - benchmark(args) - - -if __name__ == "__main__": - main() diff --git a/benchmarks/tts/README.md b/benchmarks/tts/README.md deleted file mode 100644 index 9e2fd35b1a5..00000000000 --- a/benchmarks/tts/README.md +++ /dev/null @@ -1,227 +0,0 @@ -# TTS Universal Benchmark - -A model-agnostic serving benchmark for TTS models in vllm-omni. One CLI -(`bench_tts.py`) + one YAML registry (`model_configs.yaml`) drive perf and -quality runs for every registered checkpoint: **Qwen3-TTS** (Base / CustomVoice) -and **VoxCPM2** today, more to come. - -The same three task types — `voice_clone`, `default_voice`, `voice_design` — -are wired into both the manual CLI and the DFX nightly CI matrix -(`tests/dfx/perf/tests/test_tts.json`). - -## Quick start - -### 1. Start the server - -```bash -vllm serve Qwen/Qwen3-TTS-12Hz-1.7B-Base --omni --port 8000 -``` - -The server auto-loads its Deploy YAML from `vllm_omni/deploy/qwen3_tts.yaml` -(Pipeline + Deploy schema introduced in #2383). No `--stage-configs-path` or -`--deploy-config` flag is needed for any registered model. - -### 2. Run the benchmark (`vllm bench serve --omni`) - -The primary, directly-controllable path. Copy-paste one of these and tweak -any bench flag (sampling params, endpoint, extra body, warmups, etc.): - -#### voice_clone (Qwen3-TTS-Base, seed-tts dataset) - -```bash -vllm bench serve --omni \ - --host 127.0.0.1 --port 8000 \ - --model Qwen/Qwen3-TTS-12Hz-1.7B-Base \ - --backend openai-audio-speech \ - --endpoint /v1/audio/speech \ - --dataset-name seed-tts \ - --dataset-path /path/to/seed-tts-eval \ - --seed-tts-locale en \ - --num-prompts 20 --num-warmups 2 \ - --extra-body '{"task_type":"Base"}' \ - --max-concurrency 1 --request-rate inf \ - --percentile-metrics ttft,e2el,audio_rtf,audio_ttfp,audio_duration \ - --save-result --result-dir ./results -``` - -#### default_voice (Qwen3-TTS-CustomVoice, bundled seed_tts_smoke) - -```bash -vllm bench serve --omni \ - --host 127.0.0.1 --port 8000 \ - --model Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \ - --backend openai-audio-speech \ - --endpoint /v1/audio/speech \ - --dataset-name seed-tts-text \ - --dataset-path benchmarks/build_dataset/seed_tts_smoke \ - --seed-tts-locale en \ - --num-prompts 20 --num-warmups 2 \ - --extra-body '{"voice":"Vivian","language":"English","task_type":"CustomVoice"}' \ - --max-concurrency 1 --request-rate inf \ - --percentile-metrics ttft,e2el,audio_rtf,audio_ttfp,audio_duration \ - --save-result --result-dir ./results -``` - -#### voice_design (Qwen3-TTS-CustomVoice, bundled seed_tts_design) - -```bash -vllm bench serve --omni \ - --host 127.0.0.1 --port 8000 \ - --model Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \ - --backend openai-audio-speech \ - --endpoint /v1/audio/speech \ - --dataset-name seed-tts-design \ - --dataset-path benchmarks/build_dataset/seed_tts_design \ - --seed-tts-locale en \ - --num-prompts 20 --num-warmups 2 \ - --extra-body '{"task_type":"VoiceDesign","language":"English"}' \ - --max-concurrency 1 --request-rate inf \ - --percentile-metrics ttft,e2el,audio_rtf,audio_ttfp,audio_duration \ - --save-result --result-dir ./results -``` - -#### Add WER / SIM / UTMOS to any of the above - -Append `--seed-tts-wer-eval` (and optionally `SEED_TTS_EVAL_DEVICE=cuda:0` -in the env, per PR #2558). This triggers the seed-tts-eval protocol: -Whisper-large-v3 ASR → WER, WavLM embeddings → SIM, balacoon/utmos → UTMOS. - -### 3. Convenience wrapper (`bench_tts.py`) - -If you're running the **canonical** configuration for a registered model, -`bench_tts.py` loads the right defaults from `model_configs.yaml` and -emits the exact `vllm bench serve --omni` command above — useful for -concurrency sweeps and multi-task runs: - -```bash -# Smallest smoke — 5 prompts, concurrency=1 -python benchmarks/tts/bench_tts.py \ - --model Qwen/Qwen3-TTS-12Hz-1.7B-Base \ - --task voice_clone \ - --dataset-path /path/to/seed-tts-eval \ - --concurrency 1 --num-prompts 5 \ - --output-dir ./results - -# Full concurrency sweep -python benchmarks/tts/bench_tts.py \ - --model Qwen/Qwen3-TTS-12Hz-1.7B-Base \ - --task voice_clone \ - --dataset-path /path/to/seed-tts-eval \ - --concurrency 1 2 4 8 16 32 \ - --num-prompts 20 \ - --output-dir ./results - -# With WER / SIM / UTMOS quality eval (adds ASR + embedding compute) -python benchmarks/tts/bench_tts.py \ - --model Qwen/Qwen3-TTS-12Hz-1.7B-Base \ - --task voice_clone \ - --dataset-path /path/to/seed-tts-eval \ - --wer-eval \ - --concurrency 4 --num-prompts 200 \ - --output-dir ./results -``` - -### 4. Plot a sweep - -```bash -python benchmarks/tts/plot_results.py \ - --results ./results/*.json \ - --output ./results/curve.png -``` - -Outputs TTFP / RTF / throughput curves (and a markdown table) for every -`(task, concurrency)` combination in the result set. - -## Task types - -| Task | Dataset | Request body | Checkpoints that support it | -|-----------------|-------------------|-----------------------------------------------------|------------------------------------------| -| `voice_clone` | `seed-tts` | `ref_audio` + `ref_text` + `task_type=Base` | `Qwen3-TTS-*-Base`, `VoxCPM2` | -| `default_voice` | `seed-tts-text` | `voice=Vivian` + `task_type=CustomVoice` | `Qwen3-TTS-*-CustomVoice` | -| `voice_design` | `seed-tts-design` | `instructions=` + `task_type=VoiceDesign` | `Qwen3-TTS-*-CustomVoice` | - -**`-CustomVoice` checkpoints do NOT ship `speaker_encoder` weights**, so -voice_clone requests raise `ValueError` at model runtime. Use `-Base` for -voice_clone. - -## Adding a new TTS model - -Drop an entry into `model_configs.yaml` — no Python changes required: - -```yaml -models: - /: - supported_tasks: [voice_clone] # or default_voice / voice_design - backend: openai-audio-speech # vllm bench serve backend - endpoint: /v1/audio/speech # OpenAI-compatible endpoint - task_extra_body: # merged into every request's body - voice_clone: - task_type: Base -``` - -Then add the model's Deploy YAML under `vllm_omni/deploy/.yaml` -(Pipeline + Deploy schema) and it's immediately benchable. - -## Datasets - -| Dataset | Bundled? | Format | Source | -|--------------------|----------|-------------------|----------------------------------------------------------------| -| `seed-tts-design` | ✅ | 5-field meta.lst | `benchmarks/build_dataset/seed_tts_design/en/meta.lst` (20 prompts) | -| `seed_tts_smoke` | ✅ | 4-field meta.lst | `benchmarks/build_dataset/seed_tts_smoke/en/meta.lst` (20 text-only) | -| `seed-tts` | ❌ | 4-field meta.lst + WAVs | Google-Drive: [BytedanceSpeech/seed-tts-eval][seedtts] (~1.2 GB) | -| `seed-tts-text` | ❌ | 4-field meta.lst | Same archive as `seed-tts` (wav column unused) | - -[seedtts]: https://github.com/BytedanceSpeech/seed-tts-eval - -For manual voice_clone / default_voice runs against the full corpus, follow -`benchmarks/build_dataset/download_process_data_seedtts.md` and point -`--dataset-path` at the extracted `seedtts_testset` directory. - -## DFX nightly CI - -`tests/dfx/perf/tests/test_tts.json` wires three perf regimes plus quality: - -| eval_phase | concurrency | purpose | Baseline metrics | -|---------------|-------------|---------------------------------------------------------|-----------------------------------------| -| `latency` | 1 | Single-request TTFP / RTF SLO | `median_audio_ttfp_ms`, `median_audio_rtf` | -| `throughput` | 8 | Codec-batching cliff sentinel (PDF #272 concurrency≥8) | `median_audio_ttfp_ms`, `median_audio_rtf` | -| `quality` | 4 | WER / SIM / UTMOS regression (disabled in CI by default)| `mean_audio_rtf` | - -Why `median_*` for latency/throughput and `mean_*` for quality: latency -distributions have cold-start tails that drag the mean; quality aggregates -over 200 prompts so single-request outliers don't matter. - -Quality entries are `enabled: false` in CI because seed-tts-eval is not -staged in the Buildkite container (matches the precedent in -PR #2558 — quality runs are manual / release-validation, not nightly). - -## Concurrency cliff regression sentinel - -Observed on H20-3e, Qwen3-TTS-1.7B (measured pre-merge on this branch): - -| Task | Model | c=1 | c=4 | **c=8** | c=16 | c=32 | -|---------------|---------------|--------|--------|------------|--------|--------| -| voice_clone | 1.7B-Base | RTF 0.15 / TTFP 165ms | 0.28 / 412ms | **0.49 / 1701ms** | 0.72 / 3355ms | 0.77 / 3772ms | -| voice_design | 1.7B-CustomVoice | RTF 0.08 / TTFP 53ms | 0.11 / 154ms | **0.21 / 872ms** | 0.33 / 1801ms | 0.38 / 1989ms | - -Both models show a **4–6× TTFP jump from c=4 to c=8** while audio throughput -saturates around c=4–8 — the codec-bs=1 bottleneck documented in -vllm-project/vllm-omni#272. The `throughput` CI regime at c=8 is the -sentinel for regressions in this area. - -## File layout - -``` -benchmarks/tts/ -├── README.md (this file) -├── bench_tts.py CLI — serve-mode benchmark driver -├── bench_voxcpm_offline.py CLI — offline VoxCPM benchmark (sync + streaming) -├── plot_results.py Generate per-task / per-concurrency curves -└── model_configs.yaml Model registry (supported tasks + extra body) -``` - -## Related - -- Upstream seed-tts-eval integration: vllm-project/vllm-omni#2558 -- Pipeline + Deploy schema: vllm-project/vllm-omni#2383 -- Concurrency cliff RFC: vllm-project/vllm-omni#272 diff --git a/benchmarks/tts/bench_tts.py b/benchmarks/tts/bench_tts.py deleted file mode 100644 index ba82b1c9b7b..00000000000 --- a/benchmarks/tts/bench_tts.py +++ /dev/null @@ -1,308 +0,0 @@ -#!/usr/bin/env python3 -"""Universal TTS benchmark CLI for vllm-omni. - -Runs ``vllm bench serve --omni`` with model-aware defaults loaded from -``model_configs.yaml``. Supports Qwen3-TTS, VoxCPM2, and any future TTS -model registered in the config file -- no code changes needed to add models. - -Usage:: - - python benchmarks/tts/bench_tts.py \\ - --model Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \\ - --task voice_clone \\ - --locale en \\ - --concurrency 1 4 \\ - --num-prompts 20 \\ - --dataset-path /path/to/seed-tts-eval \\ - --host localhost --port 8000 - -See ``--help`` for full option list. -""" - -from __future__ import annotations - -import argparse -import json -import math -import os -import subprocess -import sys -from datetime import datetime -from pathlib import Path -from typing import Any - -import yaml - - -def _vllm_omni_bin() -> str: - """Return the vllm-omni (or vllm) binary co-located with the current Python.""" - bin_dir = Path(sys.executable).parent - for candidate in ("vllm-omni", "vllm"): - p = bin_dir / candidate - if p.is_file(): - return str(p) - return "vllm-omni" # fall back and let the shell resolve it - - -_REPO_ROOT = Path(__file__).resolve().parent.parent.parent -_SCRIPT_DIR = Path(__file__).resolve().parent -_DEFAULT_MODEL_CONFIGS = _SCRIPT_DIR / "model_configs.yaml" - -# Maps task name to the dataset_name used with vllm bench serve -_TASK_TO_DATASET: dict[str, str] = { - "voice_clone": "seed-tts", - "default_voice": "seed-tts-text", - "voice_design": "seed-tts-design", -} - -# Default design dataset path (bundled with the repo) -_DEFAULT_DESIGN_DATASET_PATH = str(_REPO_ROOT / "benchmarks" / "build_dataset" / "seed_tts_design") - - -def load_model_configs(path: Path) -> dict[str, Any]: - """Load model registry from YAML file.""" - with open(path, encoding="utf-8") as f: - data = yaml.safe_load(f) - return data.get("models", {}) - - -def build_bench_args( - *, - host: str, - port: int, - model: str, - task: str, - model_cfg: dict[str, Any], - locale: str, - num_prompts: int, - concurrency: int | None, - dataset_path: str | None, - wer_eval: bool, - output_dir: str | None, - result_filename: str | None, - extra_cli_args: list[str], -) -> list[str]: - """Build the ``vllm bench serve --omni`` command for one (task, concurrency) run.""" - dataset_name = _TASK_TO_DATASET[task] - backend: str = model_cfg["backend"] - endpoint: str = model_cfg["endpoint"] - task_extra_body: dict[str, Any] = (model_cfg.get("task_extra_body") or {}).get(task) or {} - - # Resolve dataset path - if dataset_path: - resolved_dataset_path = dataset_path - elif task == "voice_design": - resolved_dataset_path = _DEFAULT_DESIGN_DATASET_PATH - else: - resolved_dataset_path = None - - cmd = [ - _vllm_omni_bin(), - "bench", - "serve", - "--omni", - "--host", - host, - "--port", - str(port), - "--model", - model, - "--backend", - backend, - "--endpoint", - endpoint, - "--dataset-name", - dataset_name, - "--num-prompts", - str(num_prompts), - "--num-warmups", - "2", - "--percentile-metrics", - "ttft,e2el,audio_rtf,audio_ttfp,audio_duration", - ] - - if resolved_dataset_path: - cmd += ["--dataset-path", resolved_dataset_path] - - if locale: - cmd += ["--seed-tts-locale", locale] - - if task_extra_body: - cmd += ["--extra-body", json.dumps(task_extra_body, separators=(",", ":"))] - - if concurrency is not None: - cmd += ["--max-concurrency", str(concurrency), "--request-rate", "inf"] - - if wer_eval: - cmd.append("--seed-tts-wer-eval") - - if output_dir or result_filename: - out_dir = output_dir or "." - os.makedirs(out_dir, exist_ok=True) - cmd += ["--save-result", "--result-dir", out_dir] - if result_filename: - cmd += ["--result-filename", result_filename] - - cmd += extra_cli_args - return cmd - - -def run_one_benchmark(cmd: list[str]) -> dict[str, Any] | None: - """Run a single benchmark subprocess and return parsed JSON result if available.""" - print(f"\n{'=' * 60}") - print("Running:", " ".join(cmd)) - print("=" * 60) - result = subprocess.run(cmd, check=False) - if result.returncode != 0: - print(f"[bench_tts] WARNING: benchmark exited with code {result.returncode}") - return None - # If --save-result was used, find the result file - try: - result_dir_idx = cmd.index("--result-dir") - result_dir = Path(cmd[result_dir_idx + 1]) - if "--result-filename" in cmd: - fname_idx = cmd.index("--result-filename") - result_file = result_dir / cmd[fname_idx + 1] - else: - # find most recently modified json - jsons = sorted(result_dir.glob("result_*.json"), key=lambda p: p.stat().st_mtime) - result_file = jsons[-1] if jsons else None - if result_file and result_file.is_file(): - return json.loads(result_file.read_text(encoding="utf-8")) - except (ValueError, IndexError, OSError): - pass - return None - - -def print_summary_table(results: list[dict[str, Any]]) -> None: - """Print a unified metrics table across all (task, concurrency) runs.""" - if not results: - return - header = ( - f"{'Task':<16} {'Concurrency':>11} {'RTF mean':>10} " - f"{'TTFP (ms)':>10} {'Throughput':>12} {'WER':>7} {'SIM':>7} {'UTMOS':>7}" - ) - print(f"\n{'=' * len(header)}") - print("BENCHMARK SUMMARY") - print("=" * len(header)) - print(header) - print("-" * len(header)) - for r in results: - task = r.get("_task", "?") - conc = r.get("_concurrency", "?") - rtf = r.get("mean_audio_rtf", float("nan")) - ttfp = r.get("mean_audio_ttfp_ms", float("nan")) - throughput = r.get("audio_throughput", float("nan")) - wer = r.get("seed_tts_mean_wer", float("nan")) - sim = r.get("seed_tts_mean_sim", float("nan")) - utmos = r.get("seed_tts_mean_utmos", float("nan")) - - def fmt(v: float, digits: int = 3) -> str: - return f"{v:.{digits}f}" if not math.isnan(v) else " n/a" - - print( - f"{task:<16} {str(conc):>11} {fmt(rtf):>10} {fmt(ttfp, 0):>10} " - f"{fmt(throughput):>12} {fmt(wer):>7} {fmt(sim):>7} {fmt(utmos):>7}" - ) - print("=" * len(header)) - - -def main() -> None: - """Entry point for the universal TTS benchmark CLI.""" - parser = argparse.ArgumentParser( - description=__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - parser.add_argument( - "--model", required=True, help="HuggingFace model ID (e.g. Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice)" - ) - parser.add_argument("--task", default="all", help="Task type: voice_clone | default_voice | voice_design | all") - parser.add_argument("--locale", default="en", choices=["en", "zh"]) - parser.add_argument("--concurrency", type=int, nargs="+", default=[1, 4], metavar="N") - parser.add_argument( - "--num-prompts", - type=int, - nargs="+", - default=[20], - metavar="N", - help="Number of prompts per run. If one value, applied to all concurrency levels.", - ) - parser.add_argument( - "--dataset-path", default=None, help="Root of seed-tts-eval dataset (required for voice_clone/default_voice)" - ) - parser.add_argument("--wer-eval", action="store_true", help="Enable WER/SIM/UTMOS quality eval") - parser.add_argument("--output-dir", default=None, help="Directory to save result JSON files") - parser.add_argument("--host", default="localhost") - parser.add_argument("--port", type=int, default=8000) - parser.add_argument("--model-configs", default=str(_DEFAULT_MODEL_CONFIGS), help="Path to model_configs.yaml") - parser.add_argument("extra", nargs=argparse.REMAINDER, help="Extra args passed directly to vllm bench serve") - args = parser.parse_args() - - model_configs = load_model_configs(Path(args.model_configs)) - if args.model not in model_configs: - known = "\n ".join(model_configs.keys()) - print(f"[bench_tts] ERROR: model '{args.model}' not in model_configs.yaml.\nKnown models:\n {known}") - sys.exit(1) - - model_cfg = model_configs[args.model] - supported_tasks: list[str] = model_cfg.get("supported_tasks", []) - - tasks_to_run: list[str] - if args.task == "all": - tasks_to_run = supported_tasks - elif args.task in supported_tasks: - tasks_to_run = [args.task] - else: - print( - f"[bench_tts] ERROR: task '{args.task}' not supported by {args.model}.\nSupported tasks: {supported_tasks}" - ) - sys.exit(1) - - # Align num_prompts list with concurrency list - num_prompts_list: list[int] = args.num_prompts - if len(num_prompts_list) == 1: - num_prompts_list = num_prompts_list * len(args.concurrency) - elif len(num_prompts_list) != len(args.concurrency): - print( - f"[bench_tts] ERROR: --num-prompts ({len(num_prompts_list)} values) must be " - f"length 1 or match --concurrency ({len(args.concurrency)} values)." - ) - sys.exit(1) - - all_results: list[dict[str, Any]] = [] - - for task in tasks_to_run: - for concurrency, num_prompts in zip(args.concurrency, num_prompts_list): - ts = datetime.now().strftime("%Y%m%d-%H%M%S") - result_filename = f"bench_tts_{args.model.replace('/', '_')}_{task}_c{concurrency}_{ts}.json" - cmd = build_bench_args( - host=args.host, - port=args.port, - model=args.model, - task=task, - model_cfg=model_cfg, - locale=args.locale, - num_prompts=num_prompts, - concurrency=concurrency, - dataset_path=args.dataset_path, - wer_eval=args.wer_eval, - output_dir=args.output_dir, - result_filename=result_filename, - extra_cli_args=args.extra or [], - ) - result = run_one_benchmark(cmd) - if result is not None: - result["_task"] = task - result["_concurrency"] = concurrency - all_results.append(result) - # Persist the metadata so plot_results.py can pick it up. - if args.output_dir and result_filename: - result_path = Path(args.output_dir) / result_filename - if result_path.is_file(): - result_path.write_text(json.dumps(result, indent=2), encoding="utf-8") - - print_summary_table(all_results) - - -if __name__ == "__main__": - main() diff --git a/benchmarks/tts/bench_voxcpm_offline.py b/benchmarks/tts/bench_voxcpm_offline.py deleted file mode 100644 index 672b77f1495..00000000000 --- a/benchmarks/tts/bench_voxcpm_offline.py +++ /dev/null @@ -1,922 +0,0 @@ -"""Offline VoxCPM benchmark for vLLM Omni. - -Supports both: -- sync one-shot (Omni.generate) -- streaming (AsyncOmni.generate with async_chunk config) -- text-only synthesis -- voice cloning -- text/clone batch inputs from txt or jsonl - -Usage:: - - # Sync (default voice) - python benchmarks/tts/bench_voxcpm_offline.py \\ - --model /path/to/VoxCPM \\ - --text "Hello world" \\ - --output-dir results/audio/ - - # Streaming (async_chunk) - python benchmarks/tts/bench_voxcpm_offline.py \\ - --model /path/to/VoxCPM \\ - --stage-configs-path vllm_omni/model_executor/stage_configs/voxcpm_async_chunk.yaml \\ - --txt-prompts prompts.txt \\ - --output-dir results/audio/ - - # Voice cloning batch via JSONL - python benchmarks/tts/bench_voxcpm_offline.py \\ - --model /path/to/VoxCPM \\ - --jsonl-prompts prompts.jsonl \\ - --output-dir results/audio/ -""" - -from __future__ import annotations - -import asyncio -import json -import logging -import os -import tempfile -import time -import uuid -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -import torch -from vllm.utils.argparse_utils import FlexibleArgumentParser - -from vllm_omni import AsyncOmni, Omni - - -def _find_repo_root(start: Path) -> Path: - """Walk up from ``start`` until a repo marker is found. - - Falls back to ``parents[2]`` for backwards compatibility if no marker hits - (which can only happen in unusual checkouts — the tree should always have - pyproject.toml + vllm_omni/ at the top level). - """ - for candidate in [start, *start.parents]: - if (candidate / "pyproject.toml").is_file() and (candidate / "vllm_omni").is_dir(): - return candidate - return start.parents[2] - - -REPO_ROOT = _find_repo_root(Path(__file__).resolve()) -DEFAULT_STAGE_ASYNC = REPO_ROOT / "vllm_omni" / "model_executor" / "stage_configs" / "voxcpm_async_chunk.yaml" -DEFAULT_STAGE_SYNC = REPO_ROOT / "vllm_omni" / "model_executor" / "stage_configs" / "voxcpm.yaml" - -logger = logging.getLogger(__name__) - - -@dataclass(frozen=True, slots=True) -class PromptSpec: - text: str - label: str - ref_audio: str | None = None - ref_text: str | None = None - - -def _require_soundfile(): - try: - import soundfile as sf # type: ignore - except ModuleNotFoundError as exc: - raise RuntimeError( - "soundfile is required to write VoxCPM benchmark WAV outputs. Install it with: pip install soundfile" - ) from exc - return sf - - -def _build_prompt( - args, - *, - text: str, - ref_audio: str | None = None, - ref_text: str | None = None, - global_request_id: str | None = None, -) -> dict[str, Any]: - additional_information: dict[str, list[Any]] = { - "text": [text], - "cfg_value": [args.cfg_value], - "inference_timesteps": [args.inference_timesteps], - "min_len": [args.min_len], - "max_new_tokens": [args.max_new_tokens], - } - if args.streaming_prefix_len is not None: - additional_information["streaming_prefix_len"] = [args.streaming_prefix_len] - - if ref_audio: - additional_information["ref_audio"] = [ref_audio] - if ref_text: - additional_information["ref_text"] = [ref_text] - if global_request_id is not None: - additional_information["global_request_id"] = [global_request_id] - - return { - "prompt_token_ids": [1], - "additional_information": additional_information, - } - - -def _extract_audio_tensor(mm: dict[str, Any]) -> torch.Tensor: - audio = mm.get("audio", mm.get("model_outputs")) - if audio is None: - raise ValueError("No audio output found in multimodal output.") - if isinstance(audio, list): - parts = [torch.as_tensor(a).float().cpu().reshape(-1) for a in audio] - audio = torch.cat(parts, dim=-1) if parts else torch.zeros(0) - if not isinstance(audio, torch.Tensor): - audio = torch.as_tensor(audio) - return audio.float().cpu().reshape(-1) - - -def _extract_sample_rate(mm: dict[str, Any]) -> int: - sr_raw = mm.get("sr", 24000) - if isinstance(sr_raw, list) and sr_raw: - sr_raw = sr_raw[-1] - if hasattr(sr_raw, "item"): - return int(sr_raw.item()) - return int(sr_raw) - - -def _emit_offline_metrics( - *, - request_id: str, - elapsed_s: float, - first_audio_elapsed: float | None, - audio_duration_s: float, -) -> None: - metrics = { - "request_id": request_id, - "ttfp_ms": round(first_audio_elapsed * 1000.0, 3) if first_audio_elapsed is not None else None, - "audio_duration_s": round(audio_duration_s, 6), - "rtf": round(elapsed_s / audio_duration_s, 6) if audio_duration_s > 0 else None, - } - print(f"[OfflineMetrics] {metrics}") - - -def _write_audio_tensor(output_path: Path, audio_tensor: Any, sample_rate: int) -> None: - sf = _require_soundfile() - if isinstance(audio_tensor, torch.Tensor): - audio_np = audio_tensor.float().cpu().clamp(-1.0, 1.0).numpy() - else: - audio_np = torch.as_tensor(audio_tensor).float().cpu().clamp(-1.0, 1.0).numpy() - sf.write( - output_path, - audio_np, - sample_rate, - format="WAV", - subtype="PCM_16", - ) - - -def _save_wav(mm: dict[str, Any], output_dir: Path, request_id: str) -> Path: - output_dir.mkdir(parents=True, exist_ok=True) - output_path = output_dir / f"output_{request_id}.wav" - _write_audio_tensor(output_path, _extract_audio_tensor(mm), _extract_sample_rate(mm)) - return output_path - - -def _iter_request_multimodal_outputs(request_output: Any): - outputs = getattr(request_output, "outputs", None) - if outputs: - for output in outputs: - mm = getattr(output, "multimodal_output", None) - if isinstance(mm, dict): - yield mm - - mm = getattr(request_output, "multimodal_output", None) - if isinstance(mm, dict): - yield mm - - -def _read_non_empty_lines(path: str) -> list[str]: - with open(path, encoding="utf-8") as f: - return [line.strip() for line in f if line.strip()] - - -def _load_prompt_specs(args) -> list[PromptSpec]: - specs: list[PromptSpec] = [] - - if args.txt_prompts is not None: - texts = _read_non_empty_lines(args.txt_prompts) - if not texts: - raise ValueError(f"No prompts found in {args.txt_prompts}") - for idx, text in enumerate(texts, start=1): - specs.append( - PromptSpec( - text=text, - label=f"item{idx:03d}", - ref_audio=args.ref_audio, - ref_text=args.ref_text, - ) - ) - return specs - - if args.jsonl_prompts is not None: - with open(args.jsonl_prompts, encoding="utf-8") as f: - for line_no, raw_line in enumerate(f, start=1): - line = raw_line.strip() - if not line: - continue - try: - item = json.loads(line) - except json.JSONDecodeError as exc: - raise ValueError(f"{args.jsonl_prompts}:{line_no} is not valid JSON: {exc}") from exc - if not isinstance(item, dict): - raise ValueError(f"{args.jsonl_prompts}:{line_no} must be a JSON object") - - text = item.get("text") - if not isinstance(text, str) or not text.strip(): - raise ValueError(f"{args.jsonl_prompts}:{line_no} requires non-empty string field 'text'") - - ref_audio = item.get("ref_audio", args.ref_audio) - ref_text = item.get("ref_text", args.ref_text) - if (ref_audio is None) != (ref_text is None): - raise ValueError( - f"{args.jsonl_prompts}:{line_no} must provide both 'ref_audio' and 'ref_text' together" - ) - - specs.append( - PromptSpec( - text=text.strip(), - label=f"item{len(specs) + 1:03d}", - ref_audio=ref_audio, - ref_text=ref_text, - ) - ) - - if not specs: - raise ValueError(f"No prompts found in {args.jsonl_prompts}") - return specs - - specs.append( - PromptSpec( - text=args.text, - label="item001", - ref_audio=args.ref_audio, - ref_text=args.ref_text, - ) - ) - return specs - - -def _build_prompt_for_spec(args, spec: PromptSpec, *, global_request_id: str | None = None) -> dict[str, Any]: - return _build_prompt( - args, - text=spec.text, - ref_audio=spec.ref_audio, - ref_text=spec.ref_text, - global_request_id=global_request_id, - ) - - -def _count_voice_clone_prompts(prompt_specs: list[PromptSpec]) -> int: - return sum(1 for spec in prompt_specs if spec.ref_audio is not None) - - -def _get_warmup_specs(prompt_specs: list[PromptSpec]) -> list[PromptSpec]: - return prompt_specs[:1] - - -def _extract_stream_finished(stage_output: Any) -> bool: - request_output = getattr(stage_output, "request_output", None) - request_finished = getattr(request_output, "finished", None) - if request_finished is not None: - return bool(request_finished) - return bool(getattr(stage_output, "finished", False)) - - -def _build_profiled_stage_config( - stage_configs_path: str, - profiler_dir: str, -) -> str: - stage_config_path = Path(stage_configs_path) - yaml_text = stage_config_path.read_text(encoding="utf-8") - injected_lines: list[str] = [] - injected_count = 0 - - for line in yaml_text.splitlines(): - injected_lines.append(line) - if line.strip() != "engine_args:": - continue - indent = line[: len(line) - len(line.lstrip())] - child_indent = indent + " " - grandchild_indent = child_indent + " " - injected_lines.extend( - [ - f"{child_indent}profiler_config:", - f'{grandchild_indent}profiler: "torch"', - f'{grandchild_indent}torch_profiler_dir: "{profiler_dir}"', - f"{grandchild_indent}torch_profiler_with_stack: true", - ] - ) - injected_count += 1 - - if injected_count == 0: - raise ValueError(f"No engine_args block found in stage config: {stage_configs_path}") - - tmp = tempfile.NamedTemporaryFile( - mode="w", - encoding="utf-8", - delete=False, - suffix=".yaml", - prefix=f"{stage_config_path.stem}_profile_", - ) - tmp.write("\n".join(injected_lines) + "\n") - tmp.close() - return tmp.name - - -def parse_args(): - parser = FlexibleArgumentParser( - description="Offline split-stage VoxCPM inference with vLLM Omni (auto sync/streaming by stage config)" - ) - parser.add_argument( - "--model", - type=str, - default=os.environ.get("VOXCPM_MODEL"), - help="Local VoxCPM model directory. Defaults to $VOXCPM_MODEL.", - ) - parser.add_argument( - "--text", - type=str, - default="This is a split-stage VoxCPM synthesis example running on vLLM Omni.", - help="Text to synthesize. Ignored when --txt-prompts or --jsonl-prompts is used.", - ) - parser.add_argument( - "--txt-prompts", - type=str, - default=None, - help="Path to a .txt file with one synthesis text per line.", - ) - parser.add_argument( - "--jsonl-prompts", - type=str, - default=None, - help=( - "Path to a .jsonl file. Each line must contain at least {'text': ...}; " - "clone rows can also set ref_audio/ref_text, and ref_text must be the " - "real transcript of ref_audio." - ), - ) - parser.add_argument( - "--ref-audio", - type=str, - default=None, - help=( - "Optional reference audio path for voice cloning. With --txt-prompts, " - "the same reference is applied to every line." - ), - ) - parser.add_argument( - "--ref-text", - type=str, - default=None, - help=( - "Real transcript of the reference audio. Placeholder text or mismatched " - "text will usually produce noisy/electronic clone audio." - ), - ) - parser.add_argument( - "--stage-configs-path", - type=str, - default=str(DEFAULT_STAGE_SYNC), - help="Stage config YAML path. Routing is selected only from this path.", - ) - parser.add_argument( - "--cfg-value", - type=float, - default=2.0, - help="Classifier-free guidance value for VoxCPM.", - ) - parser.add_argument( - "--inference-timesteps", - type=int, - default=10, - help="Number of inference timesteps.", - ) - parser.add_argument( - "--min-len", - type=int, - default=2, - help="Minimum generated token length.", - ) - parser.add_argument( - "--max-new-tokens", - type=int, - default=4096, - help="Maximum generated token length.", - ) - parser.add_argument( - "--streaming-prefix-len", - type=int, - default=None, - help="VoxCPM streaming window (optional, streaming mode only).", - ) - parser.add_argument( - "--output-dir", - type=str, - default=None, - help="Directory for output WAV files.", - ) - parser.add_argument( - "--stage-init-timeout", - type=int, - default=600, - help="Stage initialization timeout in seconds.", - ) - parser.add_argument( - "--log-stats", - dest="log_stats", - action="store_true", - help="Enable vLLM Omni stats logging.", - ) - parser.add_argument( - "--no-log-stats", - dest="log_stats", - action="store_false", - help="Disable vLLM Omni stats logging.", - ) - parser.set_defaults(log_stats=True) - parser.add_argument( - "--num-runs", - type=int, - default=1, - help="Number of full inference runs (same prompt each time). Default 1.", - ) - parser.add_argument( - "--warmup-runs", - type=int, - default=0, - help=( - "Optional number of warmup passes before measured runs. Warmup uses only " - "the first prompt and does not save outputs." - ), - ) - parser.add_argument( - "--enable-profiler", - action="store_true", - help=( - "Enable torch profiler for the configured stages. A temporary profiled " - "stage config is generated automatically." - ), - ) - parser.add_argument( - "--profiler-dir", - type=str, - default=None, - help="Directory for profiler traces. Defaults to /profiler when profiling is enabled.", - ) - parser.add_argument( - "--profiler-stages", - type=int, - nargs="*", - default=None, - help="Optional stage ids to profile. Defaults to all stages that have profiler_config.", - ) - parser.add_argument( - "--profiler-wait-seconds", - type=float, - default=30.0, - help="Seconds to wait after stop_profile for trace files to flush.", - ) - args = parser.parse_args() - - if not args.model: - parser.error("--model is required unless $VOXCPM_MODEL is set") - if args.txt_prompts is not None and args.jsonl_prompts is not None: - parser.error("--txt-prompts and --jsonl-prompts are mutually exclusive") - if (args.ref_audio is None) != (args.ref_text is None): - parser.error("--ref-audio and --ref-text must be provided together") - if args.num_runs < 1: - parser.error("--num-runs must be >= 1") - if args.warmup_runs < 0: - parser.error("--warmup-runs must be >= 0") - if args.output_dir is None: - args.output_dir = ( - "output_audio_streaming" if _is_streaming_stage_config(args.stage_configs_path) else "output_audio" - ) - if args.enable_profiler and args.profiler_dir is None: - args.profiler_dir = str(Path(args.output_dir) / "profiler") - try: - args.prompt_specs = _load_prompt_specs(args) - except ValueError as exc: - parser.error(str(exc)) - - return args - - -def _is_streaming_stage_config(stage_configs_path: str) -> bool: - cfg_name = Path(stage_configs_path).name.lower() - return "async_chunk" in cfg_name - - -async def _collect_streaming_audio( - omni: AsyncOmni, - args: Any, - spec: PromptSpec, - request_id: str, - *, - phase_label: str, - prompt_index: int, - prompt_count: int, - print_prompt: bool = False, -) -> tuple[torch.Tensor, int, float, float | None]: - prompt = _build_prompt_for_spec(args, spec, global_request_id=request_id) - delta_chunks: list[torch.Tensor] = [] - sample_rate = 24000 - chunk_i = 0 - prev_total_samples = 0 - t_start = time.perf_counter() - first_audio_elapsed: float | None = None - - if print_prompt: - print(f"---prompt---:{prompt}") - - async for stage_output in omni.generate(prompt, request_id=request_id): - mm = getattr(stage_output, "multimodal_output", None) - if not isinstance(mm, dict): - ro = getattr(stage_output, "request_output", None) - if ro is None: - continue - mm = getattr(ro, "multimodal_output", None) - if not isinstance(mm, dict) and getattr(ro, "outputs", None): - seq = ro.outputs[0] - mm = getattr(seq, "multimodal_output", None) - if not isinstance(mm, dict): - continue - sample_rate = _extract_sample_rate(mm) - try: - w = _extract_audio_tensor(mm) - n = int(w.numel()) - if n == 0: - continue - finished = _extract_stream_finished(stage_output) - if n > prev_total_samples: - delta = w.reshape(-1)[prev_total_samples:] - prev_total_samples = n - elif finished and n == prev_total_samples: - delta = w.reshape(-1)[:0] - else: - delta = w.reshape(-1) - prev_total_samples += int(delta.numel()) - if int(delta.numel()) > 0: - delta_chunks.append(delta) - if first_audio_elapsed is None and int(delta.numel()) > 0: - first_audio_elapsed = time.perf_counter() - t_start - logger.info( - "%s prompt=%d/%d chunk=%d delta_samples=%d buf_len=%d finished=%s", - phase_label, - prompt_index + 1, - prompt_count, - chunk_i, - int(delta.numel()), - n, - finished, - ) - chunk_i += 1 - except ValueError: - if not _extract_stream_finished(stage_output): - logger.debug("skip non-audio partial output chunk=%d", chunk_i) - - if not delta_chunks: - raise RuntimeError("No audio chunks received; check stage config and logs.") - - audio_cat = torch.cat([c.reshape(-1) for c in delta_chunks], dim=0) - elapsed = time.perf_counter() - t_start - return audio_cat, sample_rate, elapsed, first_audio_elapsed - - -async def _abort_streaming_residual_work( - omni: AsyncOmni, - request_id: str, - *, - settle_seconds: float = 0.1, -) -> None: - """Stop any late stage-0 work once the final audio has been collected.""" - await omni.engine.abort_async([request_id]) - if settle_seconds > 0: - await asyncio.sleep(settle_seconds) - - -async def _run_streaming_single( - omni: AsyncOmni, - args: Any, - spec: PromptSpec, - output_dir: Path, - request_id: str, - *, - run_index: int, - num_runs: int, - prompt_index: int, - prompt_count: int, -) -> Path: - audio_cat, sample_rate, elapsed, first_audio_elapsed = await _collect_streaming_audio( - omni, - args, - spec, - request_id, - phase_label=f"run={run_index + 1}/{num_runs}", - prompt_index=prompt_index, - prompt_count=prompt_count, - print_prompt=(run_index == 0 and prompt_index == 0), - ) - await _abort_streaming_residual_work(omni, request_id) - output_path = output_dir / f"output_run{run_index + 1}_{spec.label}.wav" - _write_audio_tensor(output_path, audio_cat, sample_rate) - audio_duration_s = float(audio_cat.numel()) / float(sample_rate) if sample_rate > 0 else 0.0 - ttfp_text = f", ttfp={first_audio_elapsed:.2f}s" if first_audio_elapsed is not None else "" - rtf_text = f", rtf={elapsed / audio_duration_s:.3f}" if audio_duration_s > 0 else "" - print( - f"Saved (streaming) run {run_index + 1}/{num_runs}, " - f"prompt {prompt_index + 1}/{prompt_count}: {output_path} ({elapsed:.2f}s{ttfp_text}{rtf_text})" - ) - _emit_offline_metrics( - request_id=request_id, - elapsed_s=elapsed, - first_audio_elapsed=first_audio_elapsed, - audio_duration_s=audio_duration_s, - ) - return output_path - - -async def _run_streaming_warmup(args, omni: AsyncOmni) -> None: - if args.warmup_runs == 0: - return - - warmup_specs = _get_warmup_specs(args.prompt_specs) - print( - f"Warmup: {args.warmup_runs} run(s) using the first prompt " - f"({len(warmup_specs)} prompt(s)); outputs will be discarded." - ) - for warmup_index in range(args.warmup_runs): - t_warmup = time.perf_counter() - tasks = [] - request_ids: list[str] = [] - for prompt_index, spec in enumerate(warmup_specs): - request_id = f"warmup_stream_{warmup_index + 1}_{spec.label}_{uuid.uuid4().hex[:8]}" - request_ids.append(request_id) - tasks.append( - _collect_streaming_audio( - omni, - args, - spec, - request_id, - phase_label=f"warmup={warmup_index + 1}/{args.warmup_runs}", - prompt_index=prompt_index, - prompt_count=len(warmup_specs), - ) - ) - results = await asyncio.gather(*tasks) - for request_id in request_ids: - await _abort_streaming_residual_work(omni, request_id) - total_samples = sum(int(audio.numel()) for audio, _, _, _ in results) - warmup_ttfps = [ttfp for _, _, _, ttfp in results if ttfp is not None] - ttfp_text = f", ttfp={min(warmup_ttfps):.2f}s" if warmup_ttfps else "" - print( - f"Warmup (streaming) {warmup_index + 1}/{args.warmup_runs} finished: " - f"{len(results)} prompt(s), {total_samples} sample(s) " - f"({time.perf_counter() - t_warmup:.2f}s{ttfp_text})" - ) - - -async def _run_streaming(args) -> list[Path]: - output_dir = Path(args.output_dir) - output_dir.mkdir(parents=True, exist_ok=True) - - omni = AsyncOmni( - model=args.model, - stage_configs_path=args.stage_configs_path, - log_stats=args.log_stats, - stage_init_timeout=args.stage_init_timeout, - ) - - await _run_streaming_warmup(args, omni) - profiler_started = False - if args.enable_profiler: - profile_prefix = f"voxcpm_streaming_{int(time.time())}" - stages_text = args.profiler_stages if args.profiler_stages is not None else "all-configured" - print(f"Starting profiler (streaming): stages={stages_text}, dir={args.profiler_dir}") - await omni.start_profile(profile_prefix=profile_prefix, stages=args.profiler_stages) - profiler_started = True - t_total = time.perf_counter() - total_elapsed = 0.0 - paths: list[Path] = [] - prompt_specs: list[PromptSpec] = args.prompt_specs - try: - for run in range(args.num_runs): - for prompt_index, spec in enumerate(prompt_specs): - request_id = f"stream_{run + 1}_{spec.label}_{uuid.uuid4().hex[:8]}" - paths.append( - await _run_streaming_single( - omni, - args, - spec, - output_dir, - request_id, - run_index=run, - num_runs=args.num_runs, - prompt_index=prompt_index, - prompt_count=len(prompt_specs), - ) - ) - total_elapsed = time.perf_counter() - t_total - finally: - if profiler_started: - print("Stopping profiler (streaming)...") - await omni.stop_profile(stages=args.profiler_stages) - if args.profiler_wait_seconds > 0: - print(f"Waiting {args.profiler_wait_seconds:.1f}s for profiler traces to flush...") - await asyncio.sleep(args.profiler_wait_seconds) - - print( - f"All streaming runs finished: {args.num_runs} run(s), " - f"{len(prompt_specs)} prompt(s), {len(paths)} file(s) in {total_elapsed:.2f}s total" - ) - return paths - - -def _run_sync(args) -> list[Path]: - output_dir = Path(args.output_dir) - - omni = Omni( - model=args.model, - stage_configs_path=args.stage_configs_path, - log_stats=args.log_stats, - stage_init_timeout=args.stage_init_timeout, - ) - - def _run_sync_single( - spec: PromptSpec, - *, - request_prefix: str, - save_outputs: bool, - run_index: int | None = None, - ) -> tuple[list[Path], int, float | None, float, float, str]: - global_request_id = f"{request_prefix}_{spec.label}" - prompt = _build_prompt_for_spec(args, spec, global_request_id=global_request_id) - if save_outputs and run_index == 0 and spec.label == "item001": - print(f"---prompt---:{prompt}") - - saved_paths: list[Path] = [] - output_count = 0 - first_audio_elapsed: float | None = None - total_audio_duration_s = 0.0 - metrics_request_id = global_request_id - t_start = time.perf_counter() - for stage_outputs in omni.generate(prompt): - request_output = stage_outputs.request_output - if request_output is None: - continue - request_output_id = getattr(request_output, "request_id", None) - if isinstance(request_output_id, str) and request_output_id: - metrics_request_id = request_output_id - for j, mm in enumerate(_iter_request_multimodal_outputs(request_output)): - output_count += 1 - if first_audio_elapsed is None: - try: - audio_tensor = _extract_audio_tensor(mm) - if int(audio_tensor.numel()) > 0: - first_audio_elapsed = time.perf_counter() - t_start - total_audio_duration_s += float(audio_tensor.numel()) / float(_extract_sample_rate(mm)) - except ValueError: - pass - else: - try: - audio_tensor = _extract_audio_tensor(mm) - total_audio_duration_s += float(audio_tensor.numel()) / float(_extract_sample_rate(mm)) - except ValueError: - pass - if not save_outputs: - continue - save_stem = f"run{run_index + 1}_{spec.label}" if j == 0 else f"run{run_index + 1}_{spec.label}_{j}" - saved_paths.append(_save_wav(mm, output_dir, save_stem)) - - if output_count == 0: - raise RuntimeError("No output from Omni.generate") - elapsed_s = time.perf_counter() - t_start - return saved_paths, output_count, first_audio_elapsed, elapsed_s, total_audio_duration_s, metrics_request_id - - if args.warmup_runs: - warmup_specs = _get_warmup_specs(args.prompt_specs) - print( - f"Warmup: {args.warmup_runs} run(s) using the first prompt " - f"({len(warmup_specs)} prompt(s)); outputs will be discarded." - ) - for warmup_index in range(args.warmup_runs): - t_warmup = time.perf_counter() - _, output_count, first_audio_elapsed, elapsed_s, audio_duration_s, _ = _run_sync_single( - warmup_specs[0], - request_prefix=f"warmup_sync{warmup_index + 1}", - save_outputs=False, - ) - ttfp_text = f", ttfp={first_audio_elapsed:.2f}s" if first_audio_elapsed is not None else "" - rtf_text = f", rtf={elapsed_s / audio_duration_s:.3f}" if audio_duration_s > 0 else "" - print( - f"Warmup (sync) {warmup_index + 1}/{args.warmup_runs} finished: " - f"{output_count} output(s) ({time.perf_counter() - t_warmup:.2f}s{ttfp_text}{rtf_text})" - ) - - profiler_started = False - if args.enable_profiler: - profile_prefix = f"voxcpm_sync_{int(time.time())}" - stages_text = args.profiler_stages if args.profiler_stages is not None else "all-configured" - print(f"Starting profiler (sync): stages={stages_text}, dir={args.profiler_dir}") - omni.start_profile(profile_prefix=profile_prefix, stages=args.profiler_stages) - profiler_started = True - - t_total = time.perf_counter() - total_elapsed = 0.0 - saved_paths: list[Path] = [] - prompt_specs: list[PromptSpec] = args.prompt_specs - try: - for run in range(args.num_runs): - t_run = time.perf_counter() - run_paths: list[Path] = [] - for prompt_index, spec in enumerate(prompt_specs): - prompt_paths, _, first_audio_elapsed, elapsed_s, audio_duration_s, metrics_request_id = ( - _run_sync_single( - spec, - request_prefix=f"sync_run{run + 1}_{prompt_index + 1:03d}", - save_outputs=True, - run_index=run, - ) - ) - run_paths.extend(prompt_paths) - ttfp_text = f", ttfp={first_audio_elapsed:.2f}s" if first_audio_elapsed is not None else "" - rtf_text = f", rtf={elapsed_s / audio_duration_s:.3f}" if audio_duration_s > 0 else "" - print( - f"Saved (sync) run {run + 1}/{args.num_runs}, " - f"prompt {prompt_index + 1}/{len(prompt_specs)}: {len(prompt_paths)} file(s){ttfp_text}{rtf_text}" - ) - _emit_offline_metrics( - request_id=metrics_request_id, - elapsed_s=elapsed_s, - first_audio_elapsed=first_audio_elapsed, - audio_duration_s=audio_duration_s, - ) - - saved_paths.extend(run_paths) - print( - f"Run {run + 1}/{args.num_runs} finished: {len(run_paths)} file(s) ({time.perf_counter() - t_run:.2f}s)" - ) - for path in run_paths: - print(f" {path}") - - total_elapsed = time.perf_counter() - t_total - finally: - if profiler_started: - print("Stopping profiler (sync)...") - omni.stop_profile(stages=args.profiler_stages) - if args.profiler_wait_seconds > 0: - print(f"Waiting {args.profiler_wait_seconds:.1f}s for profiler traces to flush...") - time.sleep(args.profiler_wait_seconds) - - print( - f"All sync runs finished: {args.num_runs} run(s), " - f"{len(prompt_specs)} prompt(s), {len(saved_paths)} file(s) in {total_elapsed:.2f}s total" - ) - return saved_paths - - -def main(args) -> int: - logging.basicConfig(level=logging.INFO) - profiled_stage_config_path: str | None = None - original_stage_config_path = args.stage_configs_path - if args.enable_profiler: - Path(args.profiler_dir).mkdir(parents=True, exist_ok=True) - profiled_stage_config_path = _build_profiled_stage_config( - args.stage_configs_path, - str(Path(args.profiler_dir).resolve()), - ) - args.stage_configs_path = profiled_stage_config_path - - is_streaming = _is_streaming_stage_config(args.stage_configs_path) - voice_clone_count = _count_voice_clone_prompts(args.prompt_specs) - print(f"Model: {args.model}") - print(f"Stage config: {original_stage_config_path}") - print(f"Route: {'streaming' if is_streaming else 'sync'} (from stage-configs-path)") - print(f"Prompt count: {len(args.prompt_specs)}") - print("Batch mode: sequential (aligned with native VoxCPM)") - print(f"Warmup runs: {args.warmup_runs}") - print(f"Voice cloning prompts: {voice_clone_count}/{len(args.prompt_specs)}") - if args.enable_profiler: - print(f"Profiler: enabled (dir={args.profiler_dir}, stages={args.profiler_stages or 'all-configured'})") - print(f"Profiled stage config: {args.stage_configs_path}") - if voice_clone_count: - print("Voice cloning note: --ref-text/ref_text must match the spoken content of the reference audio.") - print(f"Num runs: {args.num_runs}") - try: - if is_streaming: - asyncio.run(_run_streaming(args)) - else: - _run_sync(args) - finally: - if profiled_stage_config_path is not None and os.path.exists(profiled_stage_config_path): - os.unlink(profiled_stage_config_path) - return 0 - - -if __name__ == "__main__": - os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" - raise SystemExit(main(parse_args())) diff --git a/benchmarks/tts/model_configs.yaml b/benchmarks/tts/model_configs.yaml deleted file mode 100644 index 83b25370538..00000000000 --- a/benchmarks/tts/model_configs.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Universal TTS benchmark model registry. -# Maps HuggingFace model ID → supported tasks + per-task extra body fields. -# To add a new TTS model: add an entry here. No code changes required. -# -# The server auto-loads its Deploy YAML from vllm_omni/deploy/.yaml via -# the Pipeline + Deploy schema introduced in #2383, so no stage_config path -# is tracked here. - -models: - # -CustomVoice checkpoints lack speaker_encoder weights, so voice_clone is - # NOT supported (an attempt raises ValueError from _extract_speaker_embedding - # at model runtime). Use -Base for voice_clone. - Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice: - supported_tasks: [default_voice, voice_design] - backend: openai-audio-speech - endpoint: /v1/audio/speech - task_extra_body: - default_voice: - voice: Vivian - language: English - task_type: CustomVoice - voice_design: - task_type: VoiceDesign - language: English - - Qwen/Qwen3-TTS-12Hz-1.7B-Base: - supported_tasks: [voice_clone] - backend: openai-audio-speech - endpoint: /v1/audio/speech - task_extra_body: - voice_clone: - task_type: Base - - openbmb/VoxCPM2: - supported_tasks: [voice_clone] - backend: openai-audio-speech - endpoint: /v1/audio/speech - task_extra_body: - voice_clone: {} diff --git a/benchmarks/tts/plot_results.py b/benchmarks/tts/plot_results.py deleted file mode 100644 index f19c613209a..00000000000 --- a/benchmarks/tts/plot_results.py +++ /dev/null @@ -1,324 +0,0 @@ -"""Plot universal TTS benchmark results. - -Reads JSON files saved by ``bench_tts.py`` (via ``vllm bench serve --omni``) -and generates comparison bar charts grouped by task type. - -Metrics plotted: -- AUDIO_TTFP (mean audio time-to-first-packet, ms) -- E2EL (mean end-to-end latency, ms) -- Audio RTF (mean real-time factor) -- Audio throughput (audio-seconds / wall-second) - -Quality metrics (WER / SIM / UTMOS) are printed in a table when present. - -Usage:: - - # Single run — one JSON per task, all in results/ - python benchmarks/tts/plot_results.py \\ - --results results/bench_tts_*.json \\ - --output results/tts_benchmark.png - - # Compare two runs (e.g. async_chunk on vs off) - python benchmarks/tts/plot_results.py \\ - --results run_a/bench_tts_*.json \\ - --results run_b/bench_tts_*.json \\ - --labels "async_chunk_on" "async_chunk_off" \\ - --output results/comparison.png -""" - -from __future__ import annotations - -import argparse -import json -import math -from pathlib import Path - -import matplotlib.pyplot as plt -import numpy as np - -# --------------------------------------------------------------------------- -# JSON loading -# --------------------------------------------------------------------------- - - -def load_run(paths: list[str]) -> list[dict]: - """Load and merge all JSON files for one run into a flat list of records. - - Each record is expected to have at least ``_concurrency`` (int) and - ``_task`` (str) keys injected by ``bench_tts.py``. Records that come - from a file that contains a list are flattened. - """ - records: list[dict] = [] - for p in paths: - raw = json.loads(Path(p).read_text(encoding="utf-8")) - if isinstance(raw, list): - records.extend(raw) - elif isinstance(raw, dict): - records.append(raw) - return records - - -def _get(record: dict, key: str) -> float: - v = record.get(key, float("nan")) - if v is None or (isinstance(v, float) and math.isnan(v)): - return float("nan") - try: - return float(v) - except (TypeError, ValueError): - return float("nan") - - -# --------------------------------------------------------------------------- -# Plotting helpers -# --------------------------------------------------------------------------- - - -def _bar_group( - ax: plt.Axes, - x: np.ndarray, - data_per_label: dict[str, list[float]], - width: float, - colors: list[str], - ylabel: str, - title: str, - concurrency_labels: list[str], - fmt: str = ".1f", -) -> None: - n = len(data_per_label) - offsets = np.linspace(-(n - 1) * width / 2, (n - 1) * width / 2, n) if n > 1 else [0.0] - - for i, (label, values) in enumerate(data_per_label.items()): - plot_vals = [0.0 if math.isnan(v) else v for v in values] - bar = ax.bar(x + offsets[i], plot_vals, width, label=label, color=colors[i % len(colors)], alpha=0.85) - max_val = max((v for v in values if not math.isnan(v)), default=1.0) - for rect, val in zip(bar, values): - if not math.isnan(val) and val > 0: - ax.text( - rect.get_x() + rect.get_width() / 2, - rect.get_height() + max_val * 0.02, - f"{val:{fmt}}", - ha="center", - va="bottom", - fontsize=8, - fontweight="bold", - ) - - ax.set_xlabel("Concurrency", fontsize=11) - ax.set_ylabel(ylabel, fontsize=11) - ax.set_title(title, fontsize=12, fontweight="bold") - ax.set_xticks(x) - ax.set_xticklabels(concurrency_labels) - ax.legend(fontsize=9) - ax.grid(axis="y", alpha=0.3) - ax.set_axisbelow(True) - - -COLORS = ["#2196F3", "#FF5722", "#4CAF50", "#FFC107", "#9C27B0"] - - -# --------------------------------------------------------------------------- -# Comparison plot (multiple labels / runs) -# --------------------------------------------------------------------------- - - -def plot_comparison( - all_runs: list[list[dict]], - labels: list[str], - output_path: str, - task_filter: str | None = None, - title_prefix: str = "TTS", -) -> None: - """One 2×2 subplot per task found in the data.""" - # Determine tasks to plot - tasks: list[str] = [] - for run in all_runs: - for r in run: - t = r.get("_task", "unknown") - if t not in tasks: - tasks.append(t) - if task_filter: - tasks = [t for t in tasks if t == task_filter] - - n_tasks = len(tasks) - if n_tasks == 0: - print("[plot_results] No tasks found in data.") - return - - fig, axes_grid = plt.subplots(n_tasks, 4, figsize=(18, 4.5 * n_tasks)) - fig.suptitle(f"{title_prefix} Benchmark", fontsize=15, fontweight="bold") - - # Ensure axes_grid is always 2D - if n_tasks == 1: - axes_grid = [axes_grid] - - for row_idx, task in enumerate(tasks): - # Collect concurrencies across all runs for this task - all_concs: set[int] = set() - for run in all_runs: - for r in run: - if r.get("_task") == task: - c = r.get("_concurrency") - if c is not None: - all_concs.add(int(c)) - concurrencies = sorted(all_concs) - x = np.arange(len(concurrencies)) - conc_labels = [str(c) for c in concurrencies] - - def _series(run: list[dict], metric_key: str) -> list[float]: - conc_map = {int(r["_concurrency"]): r for r in run if r.get("_task") == task and "_concurrency" in r} - return [_get(conc_map.get(c, {}), metric_key) for c in concurrencies] - - metrics = [ - ("mean_audio_ttfp_ms", "TTFP (ms)", "Time-to-First-Packet", ".0f"), - ("mean_e2el_ms", "E2E Latency (ms)", "End-to-End Latency", ".0f"), - ("mean_audio_rtf", "RTF", "Real-Time Factor (RTF)", ".3f"), - ("audio_throughput", "audio-s / wall-s", "Audio Throughput", ".2f"), - ] - - axes_row = axes_grid[row_idx] - for col_idx, (key, ylabel, subtitle, fmt) in enumerate(metrics): - data_per_label = {lbl: _series(run, key) for lbl, run in zip(labels, all_runs)} - _bar_group( - axes_row[col_idx], - x, - data_per_label, - width=0.3 if len(labels) > 1 else 0.5, - colors=COLORS, - ylabel=ylabel, - title=f"{task} — {subtitle}", - concurrency_labels=conc_labels, - fmt=fmt, - ) - - plt.tight_layout() - Path(output_path).parent.mkdir(parents=True, exist_ok=True) - plt.savefig(output_path, dpi=150, bbox_inches="tight") - print(f"Plot saved to {output_path}") - plt.close() - - -# --------------------------------------------------------------------------- -# Markdown comparison table -# --------------------------------------------------------------------------- - - -def print_comparison_table(all_runs: list[list[dict]], labels: list[str]) -> None: - tasks: list[str] = [] - for run in all_runs: - for r in run: - t = r.get("_task", "unknown") - if t not in tasks: - tasks.append(t) - - perf_metrics = [ - ("TTFP (ms)", "mean_audio_ttfp_ms", ".1f"), - ("E2E (ms)", "mean_e2el_ms", ".1f"), - ("RTF", "mean_audio_rtf", ".3f"), - ("Throughput (a-s/s)", "audio_throughput", ".2f"), - ] - quality_metrics = [ - ("WER (%)", "seed_tts_mean_wer", ".1f"), - ("SIM", "seed_tts_mean_sim", ".3f"), - ("UTMOS", "seed_tts_mean_utmos", ".2f"), - ] - - for task in tasks: - all_concs: set[int] = set() - for run in all_runs: - for r in run: - if r.get("_task") == task: - c = r.get("_concurrency") - if c is not None: - all_concs.add(int(c)) - concurrencies = sorted(all_concs) - - print(f"\n## {task}\n") - col_header = "| Metric | Concurrency |" + "".join(f" {lbl} |" for lbl in labels) - sep = "| --- | --- |" + " --- |" * len(labels) - print(col_header) - print(sep) - - for metric, key, fmt in perf_metrics + quality_metrics: - for c in concurrencies: - row = f"| {metric} | {c} |" - for run in all_runs: - conc_map = { - int(r["_concurrency"]): r for r in run if r.get("_task") == task and "_concurrency" in r - } - val = _get(conc_map.get(c, {}), key) - row += f" {val:{fmt}} |" if not math.isnan(val) else " n/a |" - print(row) - - # Improvement column (2-run comparison only) - if len(all_runs) == 2: - print(f"\n### Improvement ({labels[0]} vs {labels[1]})\n") - print("| Metric | Concurrency | Change |") - print("| --- | --- | --- |") - for metric, key, _ in perf_metrics: - for c in concurrencies: - conc_map0 = { - int(r["_concurrency"]): r for r in all_runs[0] if r.get("_task") == task and "_concurrency" in r - } - conc_map1 = { - int(r["_concurrency"]): r for r in all_runs[1] if r.get("_task") == task and "_concurrency" in r - } - v0 = _get(conc_map0.get(c, {}), key) - v1 = _get(conc_map1.get(c, {}), key) - if not math.isnan(v0) and not math.isnan(v1) and v1 > 0: - pct = (v1 - v0) / v1 * 100 - print(f"| {metric} | {c} | {pct:+.1f}% |") - - -# --------------------------------------------------------------------------- -# CLI -# --------------------------------------------------------------------------- - - -def parse_args() -> argparse.Namespace: - parser = argparse.ArgumentParser( - description=__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - parser.add_argument( - "--results", - type=str, - nargs="+", - action="append", - required=True, - metavar="FILE", - help="JSON result file(s) for one run. Repeat --results for multiple runs to compare.", - ) - parser.add_argument( - "--labels", - type=str, - nargs="+", - default=None, - help="Label for each --results group (must match the number of --results groups).", - ) - parser.add_argument("--output", type=str, default="results/tts_benchmark.png", help="Output image path.") - parser.add_argument("--title", type=str, default="TTS", help="Title prefix for the plot.") - parser.add_argument("--task", type=str, default=None, help="Filter to a single task (e.g. voice_clone).") - return parser.parse_args() - - -def main() -> None: - args = parse_args() - - # args.results is a list-of-lists due to action="append" - all_runs: list[list[dict]] = [load_run(group) for group in args.results] - n_runs = len(all_runs) - - labels: list[str] - if args.labels: - if len(args.labels) != n_runs: - raise SystemExit(f"--labels count ({len(args.labels)}) must match --results groups ({n_runs})") - labels = args.labels - else: - labels = [f"run{i + 1}" for i in range(n_runs)] - - print_comparison_table(all_runs, labels) - plot_comparison(all_runs, labels, args.output, task_filter=args.task, title_prefix=args.title) - - -if __name__ == "__main__": - main() diff --git a/collect_env.py b/collect_env.py deleted file mode 100644 index 8b09379e1a3..00000000000 --- a/collect_env.py +++ /dev/null @@ -1,760 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -# ruff: noqa -# code borrowed from https://github.com/pytorch/pytorch/blob/main/torch/utils/collect_env.py - -import datetime -import locale -import os -import subprocess -import sys - -# Unlike the rest of the PyTorch this file must be python2 compliant. -# This script outputs relevant system environment info -# Run it with `python collect_env.py` or `python -m torch.utils.collect_env` -from collections import namedtuple - -import regex as re - -from vllm.envs import environment_variables - -try: - import torch - - TORCH_AVAILABLE = True -except (ImportError, NameError, AttributeError, OSError): - TORCH_AVAILABLE = False - -# System Environment Information -SystemEnv = namedtuple( - "SystemEnv", - [ - "torch_version", - "is_debug_build", - "cuda_compiled_version", - "gcc_version", - "clang_version", - "cmake_version", - "os", - "libc_version", - "python_version", - "python_platform", - "is_cuda_available", - "cuda_runtime_version", - "cuda_module_loading", - "nvidia_driver_version", - "nvidia_gpu_models", - "cudnn_version", - "pip_version", # 'pip' or 'pip3' - "pip_packages", - "conda_packages", - "hip_compiled_version", - "hip_runtime_version", - "miopen_runtime_version", - "caching_allocator_config", - "is_xnnpack_available", - "cpu_info", - "rocm_version", # vllm specific field - "vllm_version", # vllm specific field - "vllm_omni_version", # vllm-omni specific field - "vllm_build_flags", # vllm specific field - "gpu_topo", # vllm specific field - "env_vars", - ], -) - -DEFAULT_CONDA_PATTERNS = { - "torch", - "numpy", - "cudatoolkit", - "soumith", - "mkl", - "magma", - "triton", - "optree", - "nccl", - "transformers", - "zmq", - "nvidia", - "pynvml", - "flashinfer-python", -} - -DEFAULT_PIP_PATTERNS = { - "torch", - "numpy", - "mypy", - "flake8", - "triton", - "optree", - "onnx", - "nccl", - "transformers", - "zmq", - "nvidia", - "pynvml", - "flashinfer-python", -} - - -def run(command): - """Return (return-code, stdout, stderr).""" - shell = True if type(command) is str else False - try: - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell) - raw_output, raw_err = p.communicate() - rc = p.returncode - if get_platform() == "win32": - enc = "oem" - else: - enc = locale.getpreferredencoding() - output = raw_output.decode(enc) - if command == "nvidia-smi topo -m": - # don't remove the leading whitespace of `nvidia-smi topo -m` - # because they are meaningful - output = output.rstrip() - else: - output = output.strip() - err = raw_err.decode(enc) - return rc, output, err.strip() - - except FileNotFoundError: - cmd_str = command if isinstance(command, str) else command[0] - return 127, "", f"Command not found: {cmd_str}" - - -def run_and_read_all(run_lambda, command): - """Run command using run_lambda; reads and returns entire output if rc is 0.""" - rc, out, _ = run_lambda(command) - if rc != 0: - return None - return out - - -def run_and_parse_first_match(run_lambda, command, regex): - """Run command using run_lambda, returns the first regex match if it exists.""" - rc, out, _ = run_lambda(command) - if rc != 0: - return None - match = re.search(regex, out) - if match is None: - return None - return match.group(1) - - -def run_and_return_first_line(run_lambda, command): - """Run command using run_lambda and returns first line if output is not empty.""" - rc, out, _ = run_lambda(command) - if rc != 0: - return None - return out.split("\n")[0] - - -def get_conda_packages(run_lambda, patterns=None): - if patterns is None: - patterns = DEFAULT_CONDA_PATTERNS - conda = os.environ.get("CONDA_EXE", "conda") - out = run_and_read_all(run_lambda, [conda, "list"]) - if out is None: - return out - - return "\n".join( - line for line in out.splitlines() if not line.startswith("#") and any(name in line for name in patterns) - ) - - -def get_gcc_version(run_lambda): - return run_and_parse_first_match(run_lambda, "gcc --version", r"gcc (.*)") - - -def get_clang_version(run_lambda): - return run_and_parse_first_match(run_lambda, "clang --version", r"clang version (.*)") - - -def get_cmake_version(run_lambda): - return run_and_parse_first_match(run_lambda, "cmake --version", r"cmake (.*)") - - -def get_nvidia_driver_version(run_lambda): - if get_platform() == "darwin": - cmd = "kextstat | grep -i cuda" - return run_and_parse_first_match(run_lambda, cmd, r"com[.]nvidia[.]CUDA [(](.*?)[)]") - smi = get_nvidia_smi() - return run_and_parse_first_match(run_lambda, smi, r"Driver Version: (.*?) ") - - -def get_gpu_info(run_lambda): - if get_platform() == "darwin" or ( - TORCH_AVAILABLE and hasattr(torch.version, "hip") and torch.version.hip is not None - ): - if TORCH_AVAILABLE and torch.cuda.is_available(): - if torch.version.hip is not None: - prop = torch.cuda.get_device_properties(0) - if hasattr(prop, "gcnArchName"): - gcnArch = " ({})".format(prop.gcnArchName) - else: - gcnArch = "NoGCNArchNameOnOldPyTorch" - else: - gcnArch = "" - return torch.cuda.get_device_name(None) + gcnArch - return None - smi = get_nvidia_smi() - uuid_regex = re.compile(r" \(UUID: .+?\)") - rc, out, _ = run_lambda(smi + " -L") - if rc != 0: - return None - # Anonymize GPUs by removing their UUID - return re.sub(uuid_regex, "", out) - - -def get_running_cuda_version(run_lambda): - return run_and_parse_first_match(run_lambda, "nvcc --version", r"release .+ V(.*)") - - -def get_cudnn_version(run_lambda): - """Return a list of libcudnn.so; it's hard to tell which one is being used.""" - if get_platform() == "win32": - system_root = os.environ.get("SYSTEMROOT", "C:\\Windows") - cuda_path = os.environ.get("CUDA_PATH", "%CUDA_PATH%") - where_cmd = os.path.join(system_root, "System32", "where") - cudnn_cmd = '{} /R "{}\\bin" cudnn*.dll'.format(where_cmd, cuda_path) - elif get_platform() == "darwin": - # CUDA libraries and drivers can be found in /usr/local/cuda/. See - # https://docs.nvidia.com/cuda/cuda-installation-guide-mac-os-x/index.html#install - # https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installmac - # Use CUDNN_LIBRARY when cudnn library is installed elsewhere. - cudnn_cmd = "ls /usr/local/cuda/lib/libcudnn*" - else: - cudnn_cmd = 'ldconfig -p | grep libcudnn | rev | cut -d" " -f1 | rev' - rc, out, _ = run_lambda(cudnn_cmd) - # find will return 1 if there are permission errors or if not found - if len(out) == 0 or (rc != 1 and rc != 0): - l = os.environ.get("CUDNN_LIBRARY") - if l is not None and os.path.isfile(l): - return os.path.realpath(l) - return None - files_set = set() - for fn in out.split("\n"): - fn = os.path.realpath(fn) # eliminate symbolic links - if os.path.isfile(fn): - files_set.add(fn) - if not files_set: - return None - # Alphabetize the result because the order is non-deterministic otherwise - files = sorted(files_set) - if len(files) == 1: - return files[0] - result = "\n".join(files) - return "Probably one of the following:\n{}".format(result) - - -def get_nvidia_smi(): - # Note: nvidia-smi is currently available only on Windows and Linux - smi = "nvidia-smi" - if get_platform() == "win32": - system_root = os.environ.get("SYSTEMROOT", "C:\\Windows") - program_files_root = os.environ.get("PROGRAMFILES", "C:\\Program Files") - legacy_path = os.path.join(program_files_root, "NVIDIA Corporation", "NVSMI", smi) - new_path = os.path.join(system_root, "System32", smi) - smis = [new_path, legacy_path] - for candidate_smi in smis: - if os.path.exists(candidate_smi): - smi = '"{}"'.format(candidate_smi) - break - return smi - - -def get_rocm_version(run_lambda): - """Returns the ROCm version if available, otherwise 'N/A'.""" - return run_and_parse_first_match(run_lambda, "hipcc --version", r"HIP version: (\S+)") - - -def get_vllm_version(): - from vllm import __version__, __version_tuple__ - - if __version__ == "dev": - return "N/A (dev)" - version_str = __version_tuple__[-1] - if isinstance(version_str, str) and version_str.startswith("g"): - # it's a dev build - if "." in version_str: - # it's a dev build containing local changes - git_sha = version_str.split(".")[0][1:] - date = version_str.split(".")[-1][1:] - return f"{__version__} (git sha: {git_sha}, date: {date})" - else: - # it's a dev build without local changes - git_sha = version_str[1:] # type: ignore - return f"{__version__} (git sha: {git_sha})" - return __version__ - - -def get_vllm_omni_version(run_lambda): - try: - import vllm_omni - from vllm_omni import __version__, __version_tuple__ - - version_str = __version_tuple__[-1] - if isinstance(version_str, str) and version_str.startswith("g"): - if "." in version_str: - git_sha = version_str.split(".")[0][1:] - date = version_str.split(".")[-1][1:] - return f"{__version__} (git sha: {git_sha}, date: {date})" - else: - git_sha = version_str[1:] - return f"{__version__} (git sha: {git_sha})" - - package_dir = os.path.dirname(os.path.abspath(vllm_omni.__file__)) - git_sha = run_and_read_all(run_lambda, f"git -C {package_dir} rev-parse --short HEAD") - if git_sha: - return f"{__version__} (git sha: {git_sha})" - - return __version__ - except ImportError: - return "N/A (vllm_omni not installed)" - - -def summarize_vllm_build_flags(): - # This could be a static method if the flags are constant, or dynamic if you need to check environment variables, etc. - return "CUDA Archs: {}; ROCm: {}".format( - os.environ.get("TORCH_CUDA_ARCH_LIST", "Not Set"), - "Enabled" if os.environ.get("ROCM_HOME") else "Disabled", - ) - - -def get_gpu_topo(run_lambda): - output = None - - if get_platform() == "linux": - output = run_and_read_all(run_lambda, "nvidia-smi topo -m") - if output is None: - output = run_and_read_all(run_lambda, "rocm-smi --showtopo") - - return output - - -def get_cpu_info(run_lambda): - rc, out, err = 0, "", "" - if get_platform() == "linux": - rc, out, err = run_lambda("lscpu") - elif get_platform() == "win32": - rc, out, err = run_lambda( - "wmic cpu get Name,Manufacturer,Family,Architecture,ProcessorType,DeviceID, \ - CurrentClockSpeed,MaxClockSpeed,L2CacheSize,L2CacheSpeed,Revision /VALUE" - ) - elif get_platform() == "darwin": - rc, out, err = run_lambda("sysctl -n machdep.cpu.brand_string") - cpu_info = "None" - if rc == 0: - cpu_info = out - else: - cpu_info = err - return cpu_info - - -def get_platform(): - if sys.platform.startswith("linux"): - return "linux" - elif sys.platform.startswith("win32"): - return "win32" - elif sys.platform.startswith("cygwin"): - return "cygwin" - elif sys.platform.startswith("darwin"): - return "darwin" - else: - return sys.platform - - -def get_mac_version(run_lambda): - return run_and_parse_first_match(run_lambda, "sw_vers -productVersion", r"(.*)") - - -def get_windows_version(run_lambda): - system_root = os.environ.get("SYSTEMROOT", "C:\\Windows") - wmic_cmd = os.path.join(system_root, "System32", "Wbem", "wmic") - findstr_cmd = os.path.join(system_root, "System32", "findstr") - return run_and_read_all(run_lambda, "{} os get Caption | {} /v Caption".format(wmic_cmd, findstr_cmd)) - - -def get_lsb_version(run_lambda): - return run_and_parse_first_match(run_lambda, "lsb_release -a", r"Description:\t(.*)") - - -def check_release_file(run_lambda): - return run_and_parse_first_match(run_lambda, "cat /etc/*-release", r'PRETTY_NAME="(.*)"') - - -def get_os(run_lambda): - from platform import machine - - platform = get_platform() - - if platform == "win32" or platform == "cygwin": - return get_windows_version(run_lambda) - - if platform == "darwin": - version = get_mac_version(run_lambda) - if version is None: - return None - return "macOS {} ({})".format(version, machine()) - - if platform == "linux": - # Ubuntu/Debian based - desc = get_lsb_version(run_lambda) - if desc is not None: - return "{} ({})".format(desc, machine()) - - # Try reading /etc/*-release - desc = check_release_file(run_lambda) - if desc is not None: - return "{} ({})".format(desc, machine()) - - return "{} ({})".format(platform, machine()) - - # Unknown platform - return platform - - -def get_python_platform(): - import platform - - return platform.platform() - - -def get_libc_version(): - import platform - - if get_platform() != "linux": - return "N/A" - return "-".join(platform.libc_ver()) - - -def is_uv_venv(): - if os.environ.get("UV"): - return True - pyvenv_cfg_path = os.path.join(sys.prefix, "pyvenv.cfg") - if os.path.exists(pyvenv_cfg_path): - with open(pyvenv_cfg_path, "r") as f: - return any(line.startswith("uv = ") for line in f) - return False - - -def get_pip_packages(run_lambda, patterns=None): - """Return `pip list` output. Note: will also find conda-installed pytorch and numpy packages.""" - if patterns is None: - patterns = DEFAULT_PIP_PATTERNS - - def run_with_pip(): - try: - import importlib.util - - pip_spec = importlib.util.find_spec("pip") - pip_available = pip_spec is not None - except ImportError: - pip_available = False - - if pip_available: - cmd = [sys.executable, "-mpip", "list", "--format=freeze"] - elif is_uv_venv(): - print("uv is set") - cmd = ["uv", "pip", "list", "--format=freeze"] - else: - raise RuntimeError("Could not collect pip list output (pip or uv module not available)") - - out = run_and_read_all(run_lambda, cmd) - return "\n".join(line for line in out.splitlines() if any(name in line for name in patterns)) - - pip_version = "pip3" if sys.version[0] == "3" else "pip" - out = run_with_pip() - return pip_version, out - - -def get_cachingallocator_config(): - ca_config = os.environ.get("PYTORCH_CUDA_ALLOC_CONF", "") - return ca_config - - -def get_cuda_module_loading_config(): - if TORCH_AVAILABLE and torch.cuda.is_available(): - torch.cuda.init() - config = os.environ.get("CUDA_MODULE_LOADING", "") - return config - else: - return "N/A" - - -def is_xnnpack_available(): - if TORCH_AVAILABLE: - import torch.backends.xnnpack - - return str(torch.backends.xnnpack.enabled) # type: ignore[attr-defined] - else: - return "N/A" - - -def get_env_vars(): - env_vars = "" - secret_terms = ("secret", "token", "api", "access", "password") - report_prefix = ( - "TORCH", - "NCCL", - "PYTORCH", - "CUDA", - "CUBLAS", - "CUDNN", - "OMP_", - "MKL_", - "NVIDIA", - ) - for k, v in os.environ.items(): - if any(term in k.lower() for term in secret_terms): - continue - if k in environment_variables: - env_vars = env_vars + "{}={}".format(k, v) + "\n" - if k.startswith(report_prefix): - env_vars = env_vars + "{}={}".format(k, v) + "\n" - - return env_vars - - -def get_env_info(): - run_lambda = run - pip_version, pip_list_output = get_pip_packages(run_lambda) - - if TORCH_AVAILABLE: - version_str = torch.__version__ - debug_mode_str = str(torch.version.debug) - cuda_available_str = str(torch.cuda.is_available()) - cuda_version_str = torch.version.cuda - if not hasattr(torch.version, "hip") or torch.version.hip is None: # cuda version - hip_compiled_version = hip_runtime_version = miopen_runtime_version = "N/A" - else: # HIP version - - def get_version_or_na(cfg, prefix): - _lst = [s.rsplit(None, 1)[-1] for s in cfg if prefix in s] - return _lst[0] if _lst else "N/A" - - cfg = torch._C._show_config().split("\n") - hip_runtime_version = get_version_or_na(cfg, "HIP Runtime") - miopen_runtime_version = get_version_or_na(cfg, "MIOpen") - cuda_version_str = "N/A" - hip_compiled_version = torch.version.hip - else: - version_str = debug_mode_str = cuda_available_str = cuda_version_str = "N/A" - hip_compiled_version = hip_runtime_version = miopen_runtime_version = "N/A" - - sys_version = sys.version.replace("\n", " ") - - conda_packages = get_conda_packages(run_lambda) - - rocm_version = get_rocm_version(run_lambda) - vllm_version = get_vllm_version() - vllm_omni_version = get_vllm_omni_version(run_lambda) - vllm_build_flags = summarize_vllm_build_flags() - gpu_topo = get_gpu_topo(run_lambda) - - return SystemEnv( - torch_version=version_str, - is_debug_build=debug_mode_str, - python_version="{} ({}-bit runtime)".format(sys_version, sys.maxsize.bit_length() + 1), - python_platform=get_python_platform(), - is_cuda_available=cuda_available_str, - cuda_compiled_version=cuda_version_str, - cuda_runtime_version=get_running_cuda_version(run_lambda), - cuda_module_loading=get_cuda_module_loading_config(), - nvidia_gpu_models=get_gpu_info(run_lambda), - nvidia_driver_version=get_nvidia_driver_version(run_lambda), - cudnn_version=get_cudnn_version(run_lambda), - hip_compiled_version=hip_compiled_version, - hip_runtime_version=hip_runtime_version, - miopen_runtime_version=miopen_runtime_version, - pip_version=pip_version, - pip_packages=pip_list_output, - conda_packages=conda_packages, - os=get_os(run_lambda), - libc_version=get_libc_version(), - gcc_version=get_gcc_version(run_lambda), - clang_version=get_clang_version(run_lambda), - cmake_version=get_cmake_version(run_lambda), - caching_allocator_config=get_cachingallocator_config(), - is_xnnpack_available=is_xnnpack_available(), - cpu_info=get_cpu_info(run_lambda), - rocm_version=rocm_version, - vllm_version=vllm_version, - vllm_omni_version=vllm_omni_version, - vllm_build_flags=vllm_build_flags, - gpu_topo=gpu_topo, - env_vars=get_env_vars(), - ) - - -env_info_fmt = """ -============================== - System Info -============================== -OS : {os} -GCC version : {gcc_version} -Clang version : {clang_version} -CMake version : {cmake_version} -Libc version : {libc_version} - -============================== - PyTorch Info -============================== -PyTorch version : {torch_version} -Is debug build : {is_debug_build} -CUDA used to build PyTorch : {cuda_compiled_version} -ROCM used to build PyTorch : {hip_compiled_version} - -============================== - Python Environment -============================== -Python version : {python_version} -Python platform : {python_platform} - -============================== - CUDA / GPU Info -============================== -Is CUDA available : {is_cuda_available} -CUDA runtime version : {cuda_runtime_version} -CUDA_MODULE_LOADING set to : {cuda_module_loading} -GPU models and configuration : {nvidia_gpu_models} -Nvidia driver version : {nvidia_driver_version} -cuDNN version : {cudnn_version} -HIP runtime version : {hip_runtime_version} -MIOpen runtime version : {miopen_runtime_version} -Is XNNPACK available : {is_xnnpack_available} - -============================== - CPU Info -============================== -{cpu_info} - -============================== -Versions of relevant libraries -============================== -{pip_packages} -{conda_packages} -""".strip() - -# both the above code and the following code use `strip()` to -# remove leading/trailing whitespaces, so we need to add a newline -# in between to separate the two sections -env_info_fmt += "\n\n" - -env_info_fmt += """ -============================== - vLLM Info -============================== -ROCM Version : {rocm_version} -vLLM Version : {vllm_version} -vLLM-Omni Version : {vllm_omni_version} -vLLM Build Flags: - {vllm_build_flags} -GPU Topology: - {gpu_topo} - -============================== - Environment Variables -============================== -{env_vars} -""".strip() - - -def pretty_str(envinfo): - def replace_nones(dct, replacement="Could not collect"): - for key in dct.keys(): - if dct[key] is not None: - continue - dct[key] = replacement - return dct - - def replace_bools(dct, true="Yes", false="No"): - for key in dct.keys(): - if dct[key] is True: - dct[key] = true - elif dct[key] is False: - dct[key] = false - return dct - - def prepend(text, tag="[prepend]"): - lines = text.split("\n") - updated_lines = [tag + line for line in lines] - return "\n".join(updated_lines) - - def replace_if_empty(text, replacement="No relevant packages"): - if text is not None and len(text) == 0: - return replacement - return text - - def maybe_start_on_next_line(string): - # If `string` is multiline, prepend a \n to it. - if string is not None and len(string.split("\n")) > 1: - return "\n{}\n".format(string) - return string - - mutable_dict = envinfo._asdict() - - # If nvidia_gpu_models is multiline, start on the next line - mutable_dict["nvidia_gpu_models"] = maybe_start_on_next_line(envinfo.nvidia_gpu_models) - - # If the machine doesn't have CUDA, report some fields as 'No CUDA' - dynamic_cuda_fields = [ - "cuda_runtime_version", - "nvidia_gpu_models", - "nvidia_driver_version", - ] - all_cuda_fields = dynamic_cuda_fields + ["cudnn_version"] - all_dynamic_cuda_fields_missing = all(mutable_dict[field] is None for field in dynamic_cuda_fields) - if TORCH_AVAILABLE and not torch.cuda.is_available() and all_dynamic_cuda_fields_missing: - for field in all_cuda_fields: - mutable_dict[field] = "No CUDA" - if envinfo.cuda_compiled_version is None: - mutable_dict["cuda_compiled_version"] = "None" - - # Replace True with Yes, False with No - mutable_dict = replace_bools(mutable_dict) - - # Replace all None objects with 'Could not collect' - mutable_dict = replace_nones(mutable_dict) - - # If either of these are '', replace with 'No relevant packages' - mutable_dict["pip_packages"] = replace_if_empty(mutable_dict["pip_packages"]) - mutable_dict["conda_packages"] = replace_if_empty(mutable_dict["conda_packages"]) - - # Tag conda and pip packages with a prefix - # If they were previously None, they'll show up as ie '[conda] Could not collect' - if mutable_dict["pip_packages"]: - mutable_dict["pip_packages"] = prepend(mutable_dict["pip_packages"], "[{}] ".format(envinfo.pip_version)) - if mutable_dict["conda_packages"]: - mutable_dict["conda_packages"] = prepend(mutable_dict["conda_packages"], "[conda] ") - mutable_dict["cpu_info"] = envinfo.cpu_info - return env_info_fmt.format(**mutable_dict) - - -def get_pretty_env_info(): - return pretty_str(get_env_info()) - - -def main(): - print("Collecting environment information...") - output = get_pretty_env_info() - print(output) - - if TORCH_AVAILABLE and hasattr(torch, "utils") and hasattr(torch.utils, "_crash_handler"): - minidump_dir = torch.utils._crash_handler.DEFAULT_MINIDUMP_DIR - if sys.platform == "linux" and os.path.exists(minidump_dir): - dumps = [os.path.join(minidump_dir, dump) for dump in os.listdir(minidump_dir)] - latest = max(dumps, key=os.path.getctime) - ctime = os.path.getctime(latest) - creation_time = datetime.datetime.fromtimestamp(ctime).strftime("%Y-%m-%d %H:%M:%S") - msg = ( - "\n*** Detected a minidump at {} created on {}, ".format(latest, creation_time) - + "if this is related to your bug please include it when you file a report ***" - ) - print(msg, file=sys.stderr) - - -if __name__ == "__main__": - main() diff --git a/docker/Dockerfile.ci b/docker/Dockerfile.ci deleted file mode 100644 index a263c12e2d2..00000000000 --- a/docker/Dockerfile.ci +++ /dev/null @@ -1,18 +0,0 @@ -ARG VLLM_BASE_IMAGE=vllm/vllm-openai -ARG VLLM_BASE_TAG=v0.20.0 -FROM ${VLLM_BASE_IMAGE}:${VLLM_BASE_TAG} -ARG APP_DIR=/workspace/vllm-omni -WORKDIR ${APP_DIR} -COPY . . - -# Install system dependencies -RUN apt-get update && \ - apt-get install -y espeak-ng git jq && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -RUN uv pip install --system ".[dev]" - -RUN ln -sf /usr/bin/python3 /usr/bin/python - -ENTRYPOINT [] diff --git a/docker/Dockerfile.cuda b/docker/Dockerfile.cuda deleted file mode 100644 index 78f64f6a5e0..00000000000 --- a/docker/Dockerfile.cuda +++ /dev/null @@ -1,22 +0,0 @@ -ARG BASE_IMAGE=vllm/vllm-openai:v0.20.0 -FROM ${BASE_IMAGE} - -ARG COMMON_WORKDIR=/app - -WORKDIR ${COMMON_WORKDIR} - -# Step 1: Setup - Install system dependencies -RUN apt-get update && \ - apt-get install -y git jq && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -RUN mkdir -p ${COMMON_WORKDIR}/vllm-omni - -# Step 2: Copy vllm-omni code and install -COPY . ${COMMON_WORKDIR}/vllm-omni -RUN cd ${COMMON_WORKDIR}/vllm-omni && uv pip install --python "$(python3 -c 'import sys; print(sys.executable)')" --no-cache-dir "." - -RUN ln -sf /usr/bin/python3 /usr/bin/python - -ENTRYPOINT [] diff --git a/docker/Dockerfile.npu b/docker/Dockerfile.npu deleted file mode 100644 index 2e961b89e65..00000000000 --- a/docker/Dockerfile.npu +++ /dev/null @@ -1,31 +0,0 @@ -ARG VLLM_ASCEND_IMAGE=quay.io/ascend/vllm-ascend -ARG VLLM_ASCEND_TAG=v0.18.0rc1 -FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_TAG} - -# WORKDIR /vllm-workspace/vllm -# RUN git fetch origin --tags && git checkout v0.18.0 - -# WORKDIR /vllm-workspace/vllm-ascend -# RUN git fetch origin releases/v0.18.0 && git checkout d781902ce9dbda8ab1e11bb0f2f0c1bc508fee7a -# # Install vllm-ascend -# # Append `libascend_hal.so` path (devlib) to LD_LIBRARY_PATH -# RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ -# source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ -# source /usr/local/Ascend/nnal/atb/set_env.sh && \ -# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ -# python3 -m pip install -v -e /vllm-workspace/vllm-ascend/ --extra-index https://download.pytorch.org/whl/cpu/ && \ -# python3 -m pip cache purge - -ARG APP_DIR=/vllm-workspace/vllm-omni -WORKDIR ${APP_DIR} -COPY . . - -RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ - source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ - source /usr/local/Ascend/nnal/atb/set_env.sh && \ - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ - python3 -m pip install -v -e /vllm-workspace/vllm-omni/ --no-build-isolation - -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -ENTRYPOINT [] diff --git a/docker/Dockerfile.npu.a3 b/docker/Dockerfile.npu.a3 deleted file mode 100644 index e3781fc18f8..00000000000 --- a/docker/Dockerfile.npu.a3 +++ /dev/null @@ -1,31 +0,0 @@ -ARG VLLM_ASCEND_IMAGE=quay.io/ascend/vllm-ascend -ARG VLLM_ASCEND_TAG=v0.18.0rc1-a3 -FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_TAG} - -# WORKDIR /vllm-workspace/vllm -# RUN git fetch origin --tags && git checkout v0.18.0 - -# WORKDIR /vllm-workspace/vllm-ascend -# RUN git fetch origin releases/v0.18.0 && git checkout d781902ce9dbda8ab1e11bb0f2f0c1bc508fee7a -# # Install vllm-ascend -# # Append `libascend_hal.so` path (devlib) to LD_LIBRARY_PATH -# RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ -# source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ -# source /usr/local/Ascend/nnal/atb/set_env.sh && \ -# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ -# python3 -m pip install -v -e /vllm-workspace/vllm-ascend/ --extra-index https://download.pytorch.org/whl/cpu/ && \ -# python3 -m pip cache purge - -ARG APP_DIR=/vllm-workspace/vllm-omni -WORKDIR ${APP_DIR} -COPY . . - -RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ - source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ - source /usr/local/Ascend/nnal/atb/set_env.sh && \ - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ - python3 -m pip install -v -e /vllm-workspace/vllm-omni/ --no-build-isolation - -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -ENTRYPOINT [] diff --git a/docker/Dockerfile.rocm b/docker/Dockerfile.rocm deleted file mode 100644 index ab95077fc7b..00000000000 --- a/docker/Dockerfile.rocm +++ /dev/null @@ -1,73 +0,0 @@ -ARG BASE_IMAGE=vllm/vllm-openai-rocm:v0.20.0 -FROM ${BASE_IMAGE} AS base - -# Declare a variable to know if we want to use the nightly build or the stable build. -# NOTE: REMINDER to vLLM-Omni rebase maintainer -# Remember to set `USE_NIGHTLY_BUILD` to 0, when switching back to stable vLLM docker image -# 1. If vLLM-omni maintainer is forced to use custom commits -# during rebasing, they can change the two variables -# 2. Whenever vLLM upstream has released a stable version, -# we should swap over to use stable release ASAP. -# We should avoid relying on custom commits. -ARG USE_NIGHTLY_BUILD=0 -ARG VLLM_VERSION_OR_COMMIT_HASH=89138b21cc246ae944c741d5c399c148e2b770ab -ARG ARG_PYTORCH_ROCM_ARCH -ENV PYTORCH_ROCM_ARCH=${ARG_PYTORCH_ROCM_ARCH:-${PYTORCH_ROCM_ARCH}} - -ARG COMMON_WORKDIR=/app -WORKDIR ${COMMON_WORKDIR} - -# Step 1: Setup - Install system dependencies -# Need to include ffmpeg because vllm rocm upstream docker image -# does not include it. -RUN apt-get update && \ - apt-get install -y espeak-ng ffmpeg git jq && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -# Step 2: Conditionally reinstall vllm from source for nightly builds -RUN if [ "${USE_NIGHTLY_BUILD}" = "1" ]; then \ - python3 -m pip uninstall -y vllm && rm -rf vllm && \ - git clone https://github.com/vllm-project/vllm.git && \ - cd vllm && \ - git checkout ${VLLM_VERSION_OR_COMMIT_HASH} && \ - python3 -m pip install -r requirements/rocm.txt && \ - python3 setup.py clean --all && \ - PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH} python3 setup.py develop && \ - cd ../ && \ - rm -rf vllm/.git; \ - fi - -# Step 3: Copy vllm-omni code and install without uv -RUN mkdir -p ${COMMON_WORKDIR}/vllm-omni -COPY . ${COMMON_WORKDIR}/vllm-omni - -# This is a workaround to ensure pytest exits with the correct status code in CI tests. -RUN printf '%s\n' \ - 'import os' \ - '' \ - '_exit_code = 1' \ - '' \ - 'def pytest_sessionfinish(session, exitstatus):' \ - ' global _exit_code' \ - ' _exit_code = int(exitstatus)' \ - '' \ - 'def pytest_unconfigure(config):' \ - ' import sys' \ - ' sys.stdout.flush()' \ - ' sys.stderr.flush()' \ - ' os._exit(_exit_code)' \ - > ${COMMON_WORKDIR}/vllm-omni/conftest.py - -RUN cd ${COMMON_WORKDIR}/vllm-omni && uv pip install --python "$(python3 -c 'import sys; print(sys.executable)')" --no-cache-dir ".[dev]" --no-build-isolation - -RUN ln -sf /usr/bin/python3 /usr/bin/python - -FROM base AS test - -CMD ["/bin/bash"] -ENTRYPOINT [] - -# Set entrypoint for vllm-openai official images -FROM base AS vllm-openai -ENTRYPOINT ["vllm", "serve", "--omni"] diff --git a/docker/Dockerfile.xpu b/docker/Dockerfile.xpu deleted file mode 100644 index f015059ed88..00000000000 --- a/docker/Dockerfile.xpu +++ /dev/null @@ -1,150 +0,0 @@ -# Argument to configure vllm base image if pre-built -ARG VLLM_BASE=vllm-base - -FROM intel/deep-learning-essentials:2025.3.2-0-devel-ubuntu24.04 AS vllm-base - -WORKDIR /workspace/ - -ARG PYTHON_VERSION=3.12 -ARG PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/xpu" - -RUN wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null && \ - echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | tee /etc/apt/sources.list.d/oneAPI.list - -RUN apt clean && apt-get update -y && \ - apt-get install -y --no-install-recommends --fix-missing \ - curl \ - espeak-ng \ - git \ - libsm6 \ - libxext6 \ - libgl1 \ - lsb-release \ - libaio-dev \ - numactl \ - wget \ - vim \ - python3.12 \ - python3.12-dev \ - python3-pip - -RUN apt update && apt upgrade -y && \ - apt install -y intel-oneapi-compiler-dpcpp-cpp-2025.3 - -# Install UMD with fixed version -RUN mkdir neo && \ - cd neo && \ - wget https://github.com/intel/intel-graphics-compiler/releases/download/v2.24.8/intel-igc-core-2_2.24.8+20344_amd64.deb && \ - wget https://github.com/intel/intel-graphics-compiler/releases/download/v2.24.8/intel-igc-opencl-2_2.24.8+20344_amd64.deb && \ - wget https://github.com/intel/compute-runtime/releases/download/25.48.36300.8/intel-ocloc_25.48.36300.8-0_amd64.deb && \ - wget https://github.com/intel/compute-runtime/releases/download/25.48.36300.8/intel-opencl-icd_25.48.36300.8-0_amd64.deb && \ - wget https://github.com/intel/compute-runtime/releases/download/25.48.36300.8/libigdgmm12_22.8.2_amd64.deb && \ - wget https://github.com/intel/compute-runtime/releases/download/25.48.36300.8/libze-intel-gpu1_25.48.36300.8-0_amd64.deb && \ - wget https://github.com/oneapi-src/level-zero/releases/download/v1.26.0/level-zero_1.26.0+u24.04_amd64.deb && \ - dpkg -i *.deb && \ - cd .. && \ - rm -rf neo - -ENV PATH="/root/.local/bin:$PATH" -ENV VIRTUAL_ENV="/opt/venv" -ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python -RUN curl -LsSf https://astral.sh/uv/install.sh | sh -RUN uv venv --python ${PYTHON_VERSION} --seed ${VIRTUAL_ENV} -ENV PATH="$VIRTUAL_ENV/bin:$PATH" - -# This oneccl contains the BMG support which is not the case for default version of oneapi 2025.2. -ARG ONECCL_INSTALLER="intel-oneccl-2021.15.7.8_offline.sh" -RUN wget "https://github.com/uxlfoundation/oneCCL/releases/download/2021.15.7/${ONECCL_INSTALLER}" && \ - bash "${ONECCL_INSTALLER}" -a --silent --eula accept && \ - rm "${ONECCL_INSTALLER}" && \ - echo "source /opt/intel/oneapi/setvars.sh --force" >> /root/.bashrc && \ - echo "source /opt/intel/oneapi/ccl/2021.15/env/vars.sh --force" >> /root/.bashrc -RUN rm -f /opt/intel/oneapi/ccl/latest && \ - ln -s /opt/intel/oneapi/ccl/2021.15 /opt/intel/oneapi/ccl/latest - -SHELL ["bash", "-c"] -CMD ["bash", "-c", "source /root/.bashrc && exec bash"] - -WORKDIR /workspace/ -ENV UV_HTTP_TIMEOUT=500 - -# Configure package index for XPU -ENV PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} -ENV UV_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} -ENV UV_INDEX_STRATEGY="unsafe-best-match" -ENV UV_LINK_MODE="copy" - -ARG VLLM_VERSION=v0.20.0 -RUN git clone -b ${VLLM_VERSION} https://github.com/vllm-project/vllm -WORKDIR /workspace/vllm - -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install --upgrade pip && \ - uv pip install -r requirements/xpu.txt - - # used for suffix method speculative decoding - # build deps for proto + nanobind-based extensions to set up the build environment -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install grpcio-tools protobuf nanobind - # arctic-inference is built from source which needs torch-xpu properly installed first -RUN --mount=type=cache,target=/root/.cache/uv \ - source /opt/intel/oneapi/setvars.sh --force && \ - source /opt/intel/oneapi/ccl/2021.15/env/vars.sh --force && \ - export CMAKE_PREFIX_PATH="$(python -c 'import site; print(site.getsitepackages()[0])'):${CMAKE_PREFIX_PATH}" && \ - uv pip install --no-build-isolation arctic-inference==0.1.1 - -ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib/" - -ENV VLLM_TARGET_DEVICE=xpu -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install --no-build-isolation . - -CMD ["/bin/bash"] - -FROM vllm-base AS vllm-openai - -# install additional dependencies for openai api server -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install accelerate hf_transfer pytest pytest_asyncio lm_eval[api] modelscope - -# install development dependencies (for testing) -RUN uv pip install -e tests/vllm_test_utils - -# install nixl from source code -ENV NIXL_VERSION=0.7.0 -RUN python /workspace/vllm/tools/install_nixl_from_source_ubuntu.py - -# ensure vllm is properly installed -RUN python -c "import vllm, inspect; print(vllm.__file__)" -RUN uv pip show vllm - -CMD ["/bin/bash"] - -ENTRYPOINT [] - -FROM ${VLLM_BASE} AS vllm-omni - -WORKDIR /workspace/vllm-omni -COPY . . - -ENV VLLM_OMNI_TARGET_DEVICE=xpu -RUN uv pip install --no-cache-dir ".[dev]" --no-build-isolation - -# FIX triton -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip uninstall triton triton-xpu && \ - uv pip install triton-xpu==3.6.0 - -# remove torch bundled oneccl to avoid conflicts -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip uninstall oneccl oneccl-devel - -FROM vllm-omni AS vllm-omni-openai - -RUN ln -sf /usr/bin/python3 /usr/bin/python - -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -ENTRYPOINT ["vllm", "serve", "--omni"] diff --git a/docs/.nav.yml b/docs/.nav.yml deleted file mode 100644 index 2604f1e985d..00000000000 --- a/docs/.nav.yml +++ /dev/null @@ -1,134 +0,0 @@ -nav: -- Home: README.md -- User Guide: - - Getting Started: - - getting_started/quickstart.md - - getting_started/installation/* - - Serving: - - OpenAI-Compatible API: - - Diffusion Chat API: serving/diffusion_chat_api.md - - Image Generation: serving/image_generation_api.md - - Image Edit: serving/image_edit_api.md - - Text to Speech: serving/speech_api.md - - Audio Generation: serving/audio_generate_api.md - - Streaming Video Input: serving/video_stream_api.md - - Examples: - - examples/README.md - - Offline Inference: - - BAGEL-7B-MoT: user_guide/examples/offline_inference/bagel.md - - CosyVoice3: user_guide/examples/offline_inference/cosyvoice3.md - - Fish Speech S2 Pro: user_guide/examples/offline_inference/fish_speech.md - - GLM-Image Multistage End-to-End Inference: user_guide/examples/offline_inference/glm_image.md - - Helios Video Generation: user_guide/examples/offline_inference/helios.md - - HunyuanImage-3.0 Image-to-Text Inference: user_guide/examples/offline_inference/hunyuan_image3.md - - Image-To-Image: user_guide/examples/offline_inference/image_to_image.md - - Image-To-Video: user_guide/examples/offline_inference/image_to_video.md - - InternVLA-A1: user_guide/examples/offline_inference/internvla_a1.md - - MammothModa2-Preview: user_guide/examples/offline_inference/mammothmodal2_preview.md - - MiMo-Audio Offline Inference: user_guide/examples/offline_inference/mimo_audio.md - - Qwen2.5-Omni: user_guide/examples/offline_inference/qwen2_5_omni.md - - Qwen3-Omni: user_guide/examples/offline_inference/qwen3_omni.md - - Qwen3-TTS: user_guide/examples/offline_inference/qwen3_tts.md - - Text-To-Audio: user_guide/examples/offline_inference/text_to_audio.md - - Text-To-Image: user_guide/examples/offline_inference/text_to_image.md - - Text-To-Video: user_guide/examples/offline_inference/text_to_video.md - - Voxtral TTS Offline Inference: user_guide/examples/offline_inference/voxtral_tts.md - - X-To-Video-Audio: user_guide/examples/offline_inference/x_to_video_audio.md - - Online Serving: - - BAGEL-7B-MoT: user_guide/examples/online_serving/bagel.md - - vLLM-Omni Helm Chart: user_guide/examples/online_serving/chart-helm.md - - Diffusers Backend Adapter Example: user_guide/examples/online_serving/diffusers_pipeline_adapter.md - - Fish Speech S2 Pro: user_guide/examples/online_serving/fish_speech.md - - GLM-Image Online Serving: user_guide/examples/online_serving/glm_image.md - - Image-To-Image: user_guide/examples/online_serving/image_to_image.md - - Image-To-Video: user_guide/examples/online_serving/image_to_video.md - - Online serving Example of vLLM-Omni for MiMo-Audio: user_guide/examples/online_serving/mimo_audio.md - - Qwen2.5-Omni: user_guide/examples/online_serving/qwen2_5_omni.md - - Qwen3-Omni: user_guide/examples/online_serving/qwen3_omni.md - - Qwen3-TTS: user_guide/examples/online_serving/qwen3_tts.md - - Text-To-Image: user_guide/examples/online_serving/text_to_image.md - - Text-To-Video: user_guide/examples/online_serving/text_to_video.md - - General: - - usage/* - - Configuration: - - configuration/README.md - - configuration/* - - Models: - - models/supported_models.md - - Features: - - Sleep Mode: features/sleep_mode.md - - Diffusion Features: - - Overview: user_guide/diffusion_features.md - - Feature Compatibility: user_guide/feature_compatibility.md - - Cache Acceleration: - - TeaCache: user_guide/diffusion/cache_acceleration/teacache.md - - Cache-DiT: user_guide/diffusion/cache_acceleration/cache_dit.md - - Attention Backends: user_guide/diffusion/attention_backends.md - - Frame Interpolation: user_guide/diffusion/frame_interpolation.md - - Parallelism: - - Overview: user_guide/diffusion/parallelism/overview.md - - CFG Parallel: user_guide/diffusion/parallelism/cfg_parallel.md - - Expert Parallel: user_guide/diffusion/parallelism/expert_parallel.md - - Hybrid Sharded Data Parallel: user_guide/diffusion/parallelism/hsdp.md - - Sequence Parallel: user_guide/diffusion/parallelism/sequence_parallel.md - - Tensor Parallel: user_guide/diffusion/parallelism/tensor_parallel.md - - VAE Patch Parallel: user_guide/diffusion/parallelism/vae_patch_parallel.md - - CPU Offloading: user_guide/diffusion/cpu_offload_diffusion.md - - LoRA: user_guide/diffusion/lora.md - - Custom Pipeline: features/custom_pipeline.md - - Step Execution: user_guide/diffusion/step_execution.md - - Quantization: - - Overview: user_guide/quantization/overview.md - - Online Quantization: user_guide/quantization/online.md - - FP8 W8A8: user_guide/quantization/fp8.md - - Int8 W8A8: user_guide/quantization/int8.md - - GGUF: user_guide/quantization/gguf.md - - AutoRound: user_guide/quantization/autoround.md - - msModelSlim: user_guide/quantization/msmodelslim.md - - ComfyUI: features/comfyui.md -- Developer Guide: - - General: - - contributing/README.md - - glob: contributing/* - flatten_single_child_sections: true - - Model Implementation: - - contributing/model/README.md - - contributing/model/adding_omni_model.md - - contributing/model/adding_tts_model.md - - contributing/model/adding_diffusion_model.md - - CI: contributing/ci - - Design Documents: - - design/index.md - - design/architecture_overview.md - - Feature Design: - - design/feature/disaggregated_inference.md - - design/feature/ray_based_execution.md - - design/feature/omni_connectors/ - - design/feature/prefix_caching.md - - design/feature/cfg_parallel.md - - design/feature/expert_parallel.md - - design/feature/sequence_parallel.md - - design/feature/tensor_parallel.md - - design/feature/vae_parallel.md - - design/feature/hsdp.md - - design/feature/cache_dit.md - - design/feature/teacache.md - - design/feature/async_chunk.md - - design/feature/vae_parallel.md - - design/feature/diffusion_step_execution.md - - Module Design: - - design/module/ar_module.md - - design/module/dit_module.md - - design/module/entrypoint_module.md - - design/module/async_omni_architecture.md - - Docs Guide: contributing/DOCS_GUIDE.md -- API Reference: - - api/README.md - - api/vllm_omni -- CLI Reference: cli -- Community: - - Governance: community/governance.md - - community/* - - Slack: https://slack.vllm.ai - - Blog: https://blog.vllm.ai - - Forum: https://discuss.vllm.ai diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 66fc8ef4668..00000000000 --- a/docs/README.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -hide: - - navigation - - toc ---- - -# Welcome to vLLM-Omni - -

- - - vllm-omni - -

-

-Easy, fast, and cheap omni-modality model serving for everyone -

- -

- -Star -Watch -Fork -

- - -## About - -[vLLM](https://github.com/vllm-project/vllm) was originally designed to support large language models for text-based autoregressive generation tasks. vLLM-Omni is a framework that extends its support for omni-modality model inference and serving: - -- **Omni-modality**: Text, image, video, and audio data processing -- **Non-autoregressive Architectures**: extend the AR support of vLLM to Diffusion Transformers (DiT) and other parallel generation models -- **Heterogeneous outputs**: from traditional text generation to multimodal outputs - -

- - - vllm-omni-arch - -

- -vLLM-Omni is fast with: - -- State-of-the-art AR support by leveraging efficient KV cache management from vLLM -- Pipelined stage execution overlapping for high throughput performance -- Fully disaggregation based on OmniConnector and dynamic resource allocation across stages - -vLLM-Omni is flexible and easy to use with: - -- Heterogeneous pipeline abstraction to manage complex model workflows -- Seamless integration with popular Hugging Face models -- Tensor, pipeline, data and expert parallelism support for distributed inference -- Streaming outputs -- OpenAI-compatible API server - -vLLM-Omni seamlessly supports most popular open-source models on HuggingFace, including: - -- Omni-modality models (e.g. Qwen2.5-Omni, Qwen3-Omni) -- Multi-modality generation models (e.g. Qwen-Image) - -For more information, checkout the following: - -- [vllm-omni architecture design and recent roadmaps](https://docs.google.com/presentation/d/1XJWgv79lORl8rbaVvp2d5Sqs6ZEBgAgj/edit?slide=id.p1#slide=id.p1) -- [vllm-omni announcement blogpost](https://blog.vllm.ai/2025/11/30/vllm-omni.html) diff --git a/docs/api/README.md b/docs/api/README.md deleted file mode 100644 index 0147f19e126..00000000000 --- a/docs/api/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# Summary - -## Entry Points - -Main entry points for vLLM-Omni inference and serving. - -- [vllm_omni.entrypoints.async_omni.AsyncOmni][] -- [vllm_omni.engine.cfg_companion_tracker.CfgCompanionTracker][] -- [vllm_omni.entrypoints.cli.benchmark.base.OmniBenchmarkSubcommandBase][] -- [vllm_omni.entrypoints.cli.benchmark.main.OmniBenchmarkSubcommand][] -- [vllm_omni.entrypoints.cli.benchmark.serve.OmniBenchmarkServingSubcommand][] -- [vllm_omni.entrypoints.cli.serve.OmniServeCommand][] -- [vllm_omni.entrypoints.client_request_state.ClientRequestState][] -- [vllm_omni.entrypoints.omni.Omni][] -- [vllm_omni.entrypoints.omni_base.OmniBase][] -- [vllm_omni.entrypoints.pd_utils.PDDisaggregationMixin][] - -## Inputs - -Input data structures for multi-modal inputs. - -- [vllm_omni.inputs.data.OmniCustomPrompt][] -- [vllm_omni.inputs.data.OmniDiffusionSamplingParams][] -- [vllm_omni.inputs.data.OmniEmbedsPrompt][] -- [vllm_omni.inputs.data.OmniTextPrompt][] -- [vllm_omni.inputs.data.OmniTokenInputs][] -- [vllm_omni.inputs.data.OmniTokensPrompt][] -- [vllm_omni.inputs.preprocess.OmniInputPreprocessor][] - -## Engine - -Engine classes for offline and online inference. - -- [vllm_omni.diffusion.diffusion_engine.DiffusionEngine][] -- [vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector.BufferAllocator][] -- [vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector.ManagedBuffer][] -- [vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector.MooncakeAgentMetadata][] -- [vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector.MooncakeTransferEngineConnector][] -- [vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector.QueryRequest][] -- [vllm_omni.distributed.omni_connectors.connectors.mooncake_transfer_engine_connector.QueryResponse][] -- [vllm_omni.engine.AdditionalInformationEntry][] -- [vllm_omni.engine.AdditionalInformationPayload][] -- [vllm_omni.engine.OmniEngineCoreOutput][] -- [vllm_omni.engine.OmniEngineCoreOutputs][] -- [vllm_omni.engine.OmniEngineCoreRequest][] -- [vllm_omni.engine.PromptEmbedsPayload][] -- [vllm_omni.engine.arg_utils.OmniEngineArgs][] -- [vllm_omni.engine.async_omni_engine.AsyncOmniEngine][] -- [vllm_omni.engine.mm_outputs.MultimodalCompletionOutput][] -- [vllm_omni.engine.mm_outputs.MultimodalPayload][] -- [vllm_omni.engine.orchestrator.Orchestrator][] -- [vllm_omni.engine.orchestrator.OrchestratorRequestState][] -- [vllm_omni.engine.output_modality.OutputModality][] -- [vllm_omni.engine.output_modality.TensorAccumulationStrategy][] -- [vllm_omni.engine.output_processor.MultimodalOutputProcessor][] -- [vllm_omni.engine.output_processor.OmniRequestState][] -- [vllm_omni.engine.stage_engine_core_client.StageEngineCoreClient][] -- [vllm_omni.engine.stage_init_utils.StageMetadata][] -- [vllm_omni.engine.stage_init_utils.StartedLlmStage][] - -## Core - -Core scheduling and caching components. - -- [vllm_omni.core.sched.omni_ar_scheduler.KVCacheTransferData][] -- [vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler][] -- [vllm_omni.core.sched.omni_generation_scheduler.OmniGenerationScheduler][] -- [vllm_omni.core.sched.output.OmniCachedRequestData][] -- [vllm_omni.core.sched.output.OmniNewRequestData][] -- [vllm_omni.core.sched.output.OmniSchedulerOutput][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.cfm.BASECFM][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.cfm.CausalConditionalCFM][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.cfm.CausalMaskedDiffWithDiT][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.cfm.ConditionalCFM][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.CausalConv1d][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.CausalConv1dUpsample][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.CausalConvRNNF0Predictor][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.CausalHiFTGenerator][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.HiFTGenerator][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.SineGen][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.SineGen2][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.Snake][] -- [vllm_omni.model_executor.models.cosyvoice3.code2wav_core.hifigan.SourceModuleHnNSF][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.vq.core_vq.DistributedGroupResidualVectorQuantization][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.vq.core_vq.DistributedResidualVectorQuantization][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.vq.core_vq.EuclideanCodebook][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.vq.core_vq.VectorQuantization][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.vq.core_vq.preprocess][] - -## Configuration - -Configuration classes. - -- [vllm_omni.config.model.OmniModelConfig][] -- [vllm_omni.config.stage_config.ModelPipeline][] -- [vllm_omni.config.stage_config.StageConfig][] -- [vllm_omni.config.stage_config.StageConfigFactory][] -- [vllm_omni.config.stage_config.StageType][] -- [vllm_omni.diffusion.cache.teacache.config.TeaCacheConfig][] -- [vllm_omni.distributed.omni_connectors.utils.config.ConnectorSpec][] -- [vllm_omni.distributed.omni_connectors.utils.config.OmniTransferConfig][] -- [vllm_omni.model_executor.models.cosyvoice3.config.CosyVoice3Config][] -- [vllm_omni.model_executor.models.fish_speech.configuration_fish_speech.FishSpeechConfig][] -- [vllm_omni.model_executor.models.fish_speech.configuration_fish_speech.FishSpeechFastARConfig][] -- [vllm_omni.model_executor.models.fish_speech.configuration_fish_speech.FishSpeechSlowARConfig][] -- [vllm_omni.model_executor.models.mimo_audio.config_mimo_audio.MiMoAudioConfig][] -- [vllm_omni.model_executor.models.mimo_audio.config_mimo_audio.MiMoAudioTokenizerConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.configuration_qwen3_tts.Qwen3TTSConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.configuration_qwen3_tts.Qwen3TTSSpeakerEncoderConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.configuration_qwen3_tts.Qwen3TTSTalkerCodePredictorConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.configuration_qwen3_tts.Qwen3TTSTalkerConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_12hz.configuration_qwen3_tts_tokenizer_v2.Qwen3TTSTokenizerV2Config][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_12hz.configuration_qwen3_tts_tokenizer_v2.Qwen3TTSTokenizerV2DecoderConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.configuration_qwen3_tts_tokenizer_v1.Qwen3TTSTokenizerV1Config][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.configuration_qwen3_tts_tokenizer_v1.Qwen3TTSTokenizerV1DecoderBigVGANConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.configuration_qwen3_tts_tokenizer_v1.Qwen3TTSTokenizerV1DecoderConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.configuration_qwen3_tts_tokenizer_v1.Qwen3TTSTokenizerV1DecoderDiTConfig][] -- [vllm_omni.model_executor.models.qwen3_tts.tokenizer_25hz.configuration_qwen3_tts_tokenizer_v1.Qwen3TTSTokenizerV1EncoderConfig][] -- [vllm_omni.transformers_utils.configs.mammoth_moda2.Mammothmoda2Config][] -- [vllm_omni.transformers_utils.configs.mammoth_moda2.Mammothmoda2Qwen2_5_VLConfig][] -- [vllm_omni.transformers_utils.configs.mammoth_moda2.Mammothmoda2Qwen2_5_VLTextConfig][] -- [vllm_omni.transformers_utils.configs.mammoth_moda2.Mammothmoda2Qwen2_5_VLVisionConfig][] - -## Workers - -Worker classes and model runners for distributed inference. - -- [vllm_omni.diffusion.worker.diffusion_model_runner.DiffusionModelRunner][] -- [vllm_omni.diffusion.worker.diffusion_worker.CustomPipelineWorkerExtension][] -- [vllm_omni.diffusion.worker.diffusion_worker.DiffusionWorker][] -- [vllm_omni.diffusion.worker.diffusion_worker.WorkerProc][] -- [vllm_omni.diffusion.worker.diffusion_worker.WorkerWrapperBase][] -- [vllm_omni.diffusion.worker.utils.DiffusionRequestState][] -- [vllm_omni.diffusion.worker.utils.RunnerOutput][] -- [vllm_omni.platforms.npu.worker.npu_ar_model_runner.ExecuteModelState][] -- [vllm_omni.platforms.npu.worker.npu_ar_model_runner.NPUARModelRunner][] -- [vllm_omni.platforms.npu.worker.npu_ar_worker.NPUARWorker][] -- [vllm_omni.platforms.npu.worker.npu_generation_model_runner.NPUGenerationModelRunner][] -- [vllm_omni.platforms.npu.worker.npu_generation_worker.NPUGenerationWorker][] -- [vllm_omni.platforms.npu.worker.npu_model_runner.OmniNPUModelRunner][] -- [vllm_omni.platforms.xpu.worker.xpu_ar_model_runner.XPUARModelRunner][] -- [vllm_omni.platforms.xpu.worker.xpu_ar_worker.XPUARWorker][] -- [vllm_omni.platforms.xpu.worker.xpu_generation_model_runner.XPUGenerationModelRunner][] -- [vllm_omni.platforms.xpu.worker.xpu_generation_worker.XPUGenerationWorker][] -- [vllm_omni.worker.base.OmniGPUWorkerBase][] -- [vllm_omni.worker.gpu_ar_model_runner.ExecuteModelState][] -- [vllm_omni.worker.gpu_ar_model_runner.GPUARModelRunner][] -- [vllm_omni.worker.gpu_ar_worker.GPUARWorker][] -- [vllm_omni.worker.gpu_generation_model_runner.GPUGenerationModelRunner][] -- [vllm_omni.worker.gpu_generation_worker.GPUGenerationWorker][] -- [vllm_omni.worker.gpu_memory_utils.parse_cuda_visible_devices][] -- [vllm_omni.worker.gpu_model_runner.CUDAGraphWrapper][] -- [vllm_omni.worker.gpu_model_runner.OmniGPUModelRunner][] -- [vllm_omni.worker.mixins.OmniWorkerMixin][] diff --git a/docs/assets/WeChat.jpg b/docs/assets/WeChat.jpg deleted file mode 100644 index 209d0922c6ae2104970a045a31b5437dcdbfab32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183932 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 |sC%gDLx>x6XcYlFFQx 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 diff --git a/docs/cli/README.md b/docs/cli/README.md deleted file mode 100644 index 1fcfdb14eac..00000000000 --- a/docs/cli/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# vLLM-Omni CLI Guide - -The CLI for vLLM-Omni inherits from vllm with some additional arguments. - -## serve - -Starts the vLLM-Omni OpenAI Compatible API server. - -Start with a model: - -```bash -vllm serve Qwen/Qwen2.5-Omni-7B --omni -``` - -Specify the port: - -```bash -vllm serve Qwen/Qwen2.5-Omni-7B --omni --port 8091 -``` - -If you have custom stage configs file, launch the server with command below -```bash -vllm serve Qwen/Qwen2.5-Omni-7B --omni --stage-configs-path /path/to/stage_configs_file -``` - - -## bench - -Run benchmark tests for online serving throughput. -Available Commands: - -```bash -vllm bench serve --omni \ - --model Qwen/Qwen2.5-Omni-7B \ - --host server-host \ - --port server-port \ - --random-input-len 32 \ - --random-output-len 4 \ - --num-prompts 5 -``` - -See [vllm bench serve](./bench/serve.md) for the full reference of all available arguments. diff --git a/docs/cli/bench/serve.md b/docs/cli/bench/serve.md deleted file mode 100644 index f6e43be0945..00000000000 --- a/docs/cli/bench/serve.md +++ /dev/null @@ -1,359 +0,0 @@ -# vLLM-Omni Benchmark CLI Guide -The vllm bench command launches the vLLM-Omni benchmark to evaluate the performance of multimodal models. - -## Notes -We currently only support using the "openai-chat-omni" backend. - -## Basic Parameter Description -You can use `vllm bench serve --omni --help=all` to get descriptions of all parameters. The commonly used parameters are described below: -- `--omni` - Enable Omni (multimodal) mode, supporting multimodal inputs and outputs such as images, videos, and audio. - -- `--backend` - Specify the backend adapter as openai-chat-omni, using OpenAI Chat compatible API behavior as the protocol. Currently only openai-chat-omni is supported. - -- `--model` - The model identifier to load, filled according to the models supported by vLLM-Omni. - -- `--endpoint` - The API endpoint exposed externally, to which clients send their requests. - -- `--dataset-name` - The name of the dataset used; random-mm indicates generating random multimodal inputs (images, videos, audio). - -- `--num-prompts` - The total number of requests to send, an integer. - -- `--max-concurrency` - "Maximum number of concurrent requests. This can be used " - "to help simulate an environment where a higher level component " - "is enforcing a maximum number of concurrent requests. While the " - "--request-rate argument controls the rate at which requests are " - "initiated, this argument will control how many are actually allowed " - "to execute at a time. This means that when used in combination, the " - "actual request rate may be lower than specified with --request-rate, " - "if the server is not processing requests fast enough to keep up." - -- `--request-rate` - "Number of requests per second. If this is inf, " - "then all the requests are sent at time 0. " - "Otherwise, we use Poisson process or gamma distribution " - "to synthesize the request arrival times." - -- `--ignore-eos` - "Set ignore_eos flag when sending the benchmark request." - -- `--metric-percentiles` - Comma-separated list of percentiles for selected metrics. " - "To report 25-th, 50-th, and 75-th percentiles, use \"25,50,75\". " - "Default value is \"99\"." - "Use \"--percentile-metrics\" to select metrics. - -- `--percentile-metrics` - "Comma-separated list of selected metrics to report percentiles." - "This argument specifies the metrics to report percentiles." - 'Allowed metric names are "ttft", "tpot", "itl", "e2el", "audio_ttfp", "audio_rtf", "audio_duration". ' - -- `--save-result` -Specify to save benchmark results to a json file - -- `--save-detailed` -"When saving the results, whether to include per request " - "information such as response, error, ttfs, tpots, etc." - -- `--result-dir` - "Specify directory to save benchmark json results." - "If not specified, results are saved in the current directory." - -- `--result-filename` -"Specify the filename to save benchmark json results." - "If not specified, results will be saved in " - "{label}-{args.request_rate}qps-{base_model_id}-{current_dt}.json" - -- `--random-prefix-len` - Number of fixed prefix tokens before the random context in a request. - The total input length is the sum of random-prefix-len and a random - context length sampled from [input_len * (1 - range_ratio), - input_len * (1 + range_ratio)].Only the random and random-mm modes - support this parameter. - -- `--random-input-len` - Number of input tokens per request.Only the random and random-mm modes support this parameter. - -- `--random-output-len` - Number of output tokens per request.Only the random and random-mm modes support this parameter. - -- `--random-range-ratio` - Range ratio for sampling input/output length, - used only for random sampling. Must be in the range [0, 1) to define - a symmetric sampling range - [length * (1 - range_ratio), length * (1 + range_ratio)]. - Only the random and random-mm modes support this parameter. - -- `--random-mm-base-items-per-request` - Base number of multimodal items per request for random-mm. - Actual per-request count is sampled around this base using - --random-mm-num-mm-items-range-ratio. - Only the random-mm mode supports this parameter. - -- `--random-mm-limit-mm-per-prompt` - Per-modality hard caps for items attached per request, e.g. - '{"image": 3, "video": 1, "audio": 1}'. The sampled per-request item - count is clamped to the sum of these limits. When a modality - reaches its cap, its buckets are excluded and probabilities are - renormalized. - Only the random-mm mode supports this parameter. - -- `--random-mm-num-mm-items-range-ratio` - Range ratio r in [0, 1] for sampling items per request. - We sample uniformly from the closed integer range - [floor(n*(1-r)), ceil(n*(1+r))] - where n is the base items per request. - r=0 keeps it fixed; r=1 allows 0 items. The maximum is clamped - to the sum of per-modality limits from - --random-mm-limit-mm-per-prompt. - An error is raised if the computed min exceeds the max. - Only the random-mm mode supports this parameter. - -- `--random-mm-bucket-config` - The bucket config is a dictionary mapping a multimodal item - sampling configuration to a probability. - Currently allows for 3 modalities: audio, images and videos. - A bucket key is a tuple of (height, width, num_frames) - The value is the probability of sampling that specific item. - Example: - --random-mm-bucket-config - "{(256, 256, 1): 0.5, (720, 1280, 16): 0.4, (0, 1, 5): 0.10}" - First item: images with resolution 256x256 w.p. 0.5 - Second item: videos with resolution 720x1280 and 16 frames - Third item: audios with 1s duration and 5 channels w.p. 0.1 - OBS.: If the probabilities do not sum to 1, they are normalized. - Only the random-mm mode supports this parameter - -## Usage Examples - -### Online Benchmark -
-Show more - -First start serving your model: - -```bash -vllm serve Qwen/Qwen2.5-Omni-7B --omni -``` - -Then run the benchmarking for sharegpt: - -```bash -# download dataset -# wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json -vllm bench serve \ - --omni \ - --port 43845 \ - --model /home/models/Qwen/Qwen3-Omni-30B-A3B-Instruct \ - --endpoint /v1/chat/completions \ - --backend openai-chat-omni \ - --num-prompts 2 \ - --dataset-name sharegpt \ - --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json \ - --percentile-metrics ttft,tpot,itl,e2el -``` -If successful, you will see the following output: -```text -============ Serving Benchmark Result ============ -Successful requests: 2 -Failed requests: 0 -Benchmark duration (s): 81.63 -Request throughput (req/s): 0.02 -Peak concurrent requests: 2.00 -----------------End-to-end Latency---------------- -Mean E2EL (ms): 56966.13 -Median E2EL (ms): 56966.13 -P99 E2EL (ms): 81016.80 -================== Text Result =================== -Total input tokens: 36 -Total generated tokens: 5926 -Output token throughput (tok/s): 72.60 -Peak output token throughput (tok/s): 103.00 -Peak concurrent requests: 2.00 -Total Token throughput (tok/s): 73.04 ----------------Time to First Token---------------- -Mean TTFT (ms): 124.76 -Median TTFT (ms): 124.76 -P99 TTFT (ms): 156.10 ------Time per Output Token (excl. 1st token)------ -Mean TPOT (ms): 481.30 -Median TPOT (ms): 481.30 -P99 TPOT (ms): 947.55 ----------------Inter-token Latency---------------- -Mean ITL (ms): 25.11 -Median ITL (ms): 0.33 -P99 ITL (ms): 25.17 -================== Audio Result ================== -Total audio duration generated(s): 3.95 -Total audio frames generated: 94890 -Audio throughput(audio duration/s): 0.05 -================================================== -``` - -Or run the benchmarking for random: - -```bash -vllm bench serve \ - --omni \ - --port 43845 \ - --endpoint /v1/chat/completions \ - --backend openai-chat-omni \ - --model /home/models/Qwen/Qwen3-Omni-30B-A3B-Instruct \ - --dataset-name random \ - --num-prompts 2 \ - --random-prefix-len 5 \ - --random-input-len 10 \ - --random-output-len 100 \ - --percentile-metrics ttft,tpot,itl,e2el,audio_ttfp,audio_rtf \ - --ignore-eos -``` - -If successful, you will see the following output: - -```text -============ Serving Benchmark Result ============ -Successful requests: 2 -Failed requests: 0 -Benchmark duration (s): 3.89 -Request throughput (req/s): 0.51 -Peak concurrent requests: 2.00 -----------------End-to-end Latency---------------- -Mean E2EL (ms): 3824.76 -Median E2EL (ms): 3824.76 -P99 E2EL (ms): 3888.54 -================== Text Result =================== -Total input tokens: 30 -Total generated tokens: 10101 -Output token throughput (tok/s): 2595.57 -Peak output token throughput (tok/s): 111.00 -Peak concurrent requests: 2.00 -Total Token throughput (tok/s): 2603.28 ----------------Time to First Token---------------- -Mean TTFT (ms): 117.15 -Median TTFT (ms): 117.15 -P99 TTFT (ms): 142.69 ------Time per Output Token (excl. 1st token)------ -Mean TPOT (ms): 0.73 -Median TPOT (ms): 0.73 -P99 TPOT (ms): 0.74 ----------------Inter-token Latency---------------- -Mean ITL (ms): 16.47 -Median ITL (ms): 16.19 -P99 ITL (ms): 52.55 -================== Audio Result ================== -Total audio duration generated(s): 15.79 -Total audio frames generated: 379050 -Audio throughput(audio duration/s): 4.06 ----------------Time to First Packet--------------- -Mean AUDIO_TTFP (ms): 3701.37 -Median AUDIO_TTFP (ms): 3701.37 -P99 AUDIO_TTFP (ms): 3762.25 ------------------Real Time Factor----------------- -Mean AUDIO_RTF: 0.47 -Median AUDIO_RTF: 0.47 -P99 AUDIO_RTF: 0.48 -================================================== -``` -Notes: -We use audio generation time / audio duration to calculate RTF. - -
- -### Multi-Modal Benchmark - -
-Show more - -Benchmark the performance of multi-modal requests in vLLM-Omni. - -Generate synthetic image、video、audio inputs alongside random text prompts to stress-test vision models without external datasets. - -Notes: - -- Works only with online benchmark via the OpenAI backend (`--backend openai-chat-omni`) and endpoint `/v1/chat/completions`. - -Start the server (example): - -```bash -vllm serve Qwen/Qwen2.5-Omni-7B --omni -``` - -It is recommended to use the flag `--ignore-eos` to simulate real responses. You can set the size of the output via the arg `random-output-len`. - -Then run the benchmarking script: -```bash -vllm bench serve \ - --omni \ - --dataset-name random-mm \ - --port 40849 \ - --model /home/models/Qwen/Qwen3-Omni-30B-A3B-Instruct \ - --endpoint /v1/chat/completions \ - --backend openai-chat-omni \ - --request-rate 1 \ - --num-prompts 1 \ - --random-input-len 10 \ - --random-range-ratio 0.0 \ - --random-mm-base-items-per-request 2 \ - --random-mm-num-mm-items-range-ratio 0 \ - --random-mm-limit-mm-per-prompt '{"image":1,"video":1, "audio": 1}' \ - --random-mm-bucket-config '{"(32, 32, 1)": 0.5, "(0, 1, 1)": 0.1, "(32, 32, 2)":0.4}' \ - --ignore-eos \ - --percentile-metrics ttft,tpot,itl \ - --random-output-len 2 \ - --extra_body '{"modalities": ["text"]}' -``` - -If successful, you will see the following output: - -```text -============ Serving Benchmark Result ============ -Successful requests: 1 -Failed requests: 0 -Request rate configured (RPS): 1.00 -Benchmark duration (s): 1.21 -Request throughput (req/s): 0.83 -Peak concurrent requests: 1.00 -================== Text Result =================== -Total input tokens: 10 -Total generated tokens: 3 -Output token throughput (tok/s): 2.49 -Peak output token throughput (tok/s): 3.00 -Peak concurrent requests: 1.00 -Total Token throughput (tok/s): 10.77 ----------------Time to First Token---------------- -Mean TTFT (ms): 179.74 -Median TTFT (ms): 179.74 -P99 TTFT (ms): 179.74 ------Time per Output Token (excl. 1st token)------ -Mean TPOT (ms): 12.76 -Median TPOT (ms): 12.76 -P99 TPOT (ms): 12.76 ----------------Inter-token Latency---------------- -Mean ITL (ms): 12.76 -Median ITL (ms): 12.76 -P99 ITL (ms): 25.24 -================== Audio Result ================== -Total audio duration generated(s): 0.00 -Total audio frames generated: 0 -Audio throughput(audio duration/s): 0.00 -================================================== -``` - -Behavioral notes: - -- If the requested base item count cannot be satisfied under the provided per-prompt limits, the tool raises an error rather than silently clamping. - -How sampling works: - -- Determine per-request item count k by sampling uniformly from the integer range defined by `--random-mm-base-items-per-request` and `--random-mm-num-mm-items-range-ratio`, then clamp k to at most the sum of per-modality limits. -- For each of the k items, sample a bucket (H, W, T) according to the normalized probabilities in `--random-mm-bucket-config`, while tracking how many items of each modality have been added. -- If a modality (e.g., image) reaches its limit from `--random-mm-limit-mm-per-prompt`, all buckets of that modality are excluded and the remaining bucket probabilities are renormalized before continuing. -This should be seen as an edge case, and if this behavior can be avoided by setting `--random-mm-limit-mm-per-prompt` to a large number. Note that this might result in errors due to engine config `--limit-mm-per-prompt`. -- The resulting request contains synthetic image data in `multi_modal_data` (OpenAI Chat format). When `random-mm` is used with the OpenAI Chat backend, prompts remain text and MM content is attached via `multi_modal_data`. -
diff --git a/docs/cli/serve.md b/docs/cli/serve.md deleted file mode 100644 index 9d1747e0be2..00000000000 --- a/docs/cli/serve.md +++ /dev/null @@ -1,65 +0,0 @@ -# vllm-omni serve - -## Stage-based CLI quickstart - -The stage-based CLI is designed for deployments that require launching each pipeline stage in an isolated process -(e.g., across separate operating system processes, distinct GPUs, or distributed hosts). - -- For **migrated models** that utilize the bundled deployment YAML configurations located in - `vllm_omni/deploy/`, the `--deploy-config` flag is only required to override the default configuration. By default, executing `vllm serve MODEL --omni ...` - automatically loads the bundled deployment configuration. -- For **legacy models** utilizing configuration files located in - `vllm_omni/model_executor/stage_configs/`, the `--stage-configs-path` parameter remains mandatory. - -Example: Initializing Stage 0 (Orchestrator and API Server): -The commands below show a common device mapping where Stage 0 uses GPU 0 and -worker stages use GPU 1 via `CUDA_VISIBLE_DEVICES`. - -```bash -CUDA_VISIBLE_DEVICES=0 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --port 8091 \ - --stage-id 0 \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 -``` - -Example: Initializing a Headless Worker Stage (Stage 1): - -```bash -CUDA_VISIBLE_DEVICES=1 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --stage-id 1 \ - --headless \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 -``` - -When utilizing a custom deployment YAML based on the new schema, append `--deploy-config /path/to/override.yaml` to each command execution. Conversely, for legacy models, substitute this parameter with `--stage-configs-path /path/to/stage_configs.yaml`. - -In the standard execution paradigm, the `--stage-overrides` argument is utilized to apply stage-specific configurations from a single CLI command. -However, under the **stage-based CLI** paradigm, where each process strictly encapsulates a single stage, it is recommended to specify tuning parameters directly via discrete command-line flags for the respective stage, rather than constructing a composite `--stage-overrides` JSON string. - -For example, as an alternative to the following composite configuration: - -```bash -vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091 \ - --stage-overrides '{"1": {"gpu_memory_utilization": 0.5}}' -``` - -the stage-based CLI permits the direct initialization of Stage 1 with explicit parameters: - -```bash -CUDA_VISIBLE_DEVICES=1 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --stage-id 1 \ - --headless \ - --gpu-memory-utilization 0.5 \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 -``` - -## JSON CLI Arguments - ---8<-- "docs/cli/json_tip.inc.md" - -## Arguments - ---8<-- "docs/generated/argparse_omni/omni_serve.inc.md" diff --git a/docs/community/contact_us.md b/docs/community/contact_us.md deleted file mode 100644 index 09c7815a038..00000000000 --- a/docs/community/contact_us.md +++ /dev/null @@ -1,5 +0,0 @@ -# Contact Us - -- For technical questions and feature requests, please use GitHub [Issues](https://github.com/vllm-project/vllm-omni/issues) -- For coordinating contributions and development and discussing with other users and developers, please join `sig-omni` channel in our [Slack](https://slack.vllm.ai/) or use the [vLLM Forum](https://discuss.vllm.ai/) -- For security disclosures, please use GitHub's [Security Advisories](https://github.com/vllm-project/vllm-omni/security/advisories) feature diff --git a/docs/community/governance.md b/docs/community/governance.md deleted file mode 100644 index 6af578e2d8f..00000000000 --- a/docs/community/governance.md +++ /dev/null @@ -1,54 +0,0 @@ -# Governance - -vLLM-Omni's governance is inspired by the [vLLM governance process](https://docs.vllm.ai/en/latest/governance/process/). We share the same commitment to open source community and meritocratic norms. - -## Values - -vLLM-Omni aims to be the fastest and easiest-to-use omni-modality inference and serving engine. Our values are aligned with [vLLM's values](https://docs.vllm.ai/en/latest/governance/process/#values): - -### Design Values - -1. **Top performance**: System performance is our top priority. We monitor overheads, optimize kernels, and publish benchmarks. We never leave performance on the table. -2. **Ease of use**: vLLM-Omni must be simple to install, configure, and operate. We provide clear documentation, fast startup, clean logs, helpful error messages, and monitoring guides. Many users fork our code or study it deeply, so we keep it readable and modular. -3. **Wide coverage**: vLLM-Omni supports frontier models and high-performance accelerators. We make it easy to add new models and hardware. vLLM-Omni + PyTorch form a simple interface that avoids complexity. -4. **Production ready**: vLLM-Omni runs 24/7 in production. It must be easy to operate and monitor for health issues. -5. **Extensibility**: vLLM-Omni serves as fundamental omni-modality infrastructure. Our codebase cannot cover every use case, so we design for easy forking and customization. - -### Collaboration Values - -1. **Tightly Knit and Fast-Moving**: Our maintainer team is aligned on vision, philosophy, and roadmap. We work closely to unblock each other and move quickly. -2. **Individual Merit**: No one buys their way into governance. Committer status belongs to individuals, not companies. We reward contribution, maintenance, and project stewardship. - -## Project Maintainers - -### Lead Maintainers - -Lead maintainers are responsible for the overall direction and strategy of the project: - -- [@Gaohan123](https://github.com/Gaohan123) -- [@hsliuustc0106](https://github.com/hsliuustc0106) -- [@ywang96](https://github.com/ywang96) - -### Active Committers - -Committers have write access and merge rights. They typically have deep expertise in specific areas of this project and shepherd the community contributions: - -- [@david6666666](https://github.com/david6666666): Quantization and Community Relationship -- [@gcanlin](https://github.com/gcanlin): Hardware plugin and NPU integration -- [@Isotr0py](https://github.com/Isotr0py): Diffusion and Quantization -- [@linyueqian](https://github.com/linyueqian): TTS and Omni Support -- [@lishunyang12](https://github.com/lishunyang12): Quantization and Configuration -- [@princepride](https://github.com/princepride): Diffusion and Omni Support -- [@SamitHuang](https://github.com/SamitHuang): RL and Diffusion -- [@tzhouam](https://github.com/tzhouam): Engine and New Model Support -- [@wtomin](https://github.com/wtomin): Diffusion and Parallelism -- [@ZeldaHuang](https://github.com/ZeldaHuang): Omni Support -- [@ZJY0516](https://github.com/ZJY0516): Diffusion and CustomOp - -## Meetings - -Committers hold **bi-weekly meetings** to discuss future directions and collaborations of the project. - -## Committer Nomination Process - -Every month, any active committer can nominate new committer(s) to the project. Up to **two new committers** will be admitted per month based on the quality and impact of their contributions. diff --git a/docs/community/meetups.md b/docs/community/meetups.md deleted file mode 100644 index 3374fe711cf..00000000000 --- a/docs/community/meetups.md +++ /dev/null @@ -1 +0,0 @@ -# Meetups diff --git a/docs/community/volunteers.md b/docs/community/volunteers.md deleted file mode 100644 index 2c25485ea90..00000000000 --- a/docs/community/volunteers.md +++ /dev/null @@ -1,12 +0,0 @@ -# Volunteers for Bugfix and CI - -We encourage you to check current docs and [issues](https://github.com/vllm-project/vllm-omni/issues) to find possible solutions for your questions. If non of these can solve it, please propose an issue to describe your questions about bug or CI problems for developing. - -If you have urgent need for locating and solving bugfix or CI problems, please find community volunteers below. - -| Dec 4-Dec 12 | Dec 15-Dec 19 | Dec 22-Dec 26 | Dec 29- Jan 2, 2026| Jan 5-Jan 9 | Jan 12-Jan 16 | -|----------|----------|----------|----------|----------|----------| -| Conw729 | yinpeiqi | tzhouam | SamitHuang | gcanlin | natureofnature | -| david6666666 | R2-Y | hsliuustc0106 | Gaohan123 | ZJY0516 | qibaoyuan | - -We kindly welcome more contributors to fix bugs and contribute new features! diff --git a/docs/configuration/README.md b/docs/configuration/README.md deleted file mode 100644 index 390176e9cea..00000000000 --- a/docs/configuration/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Configuration Options - -This section lists the most common options for running vLLM-Omni. - -For options within a vLLM Engine. Please refer to [vLLM Configuration](https://docs.vllm.ai/en/v0.16.0/configuration/index.html) - -Currently, the main options are maintained by stage configs for each model. - -For a specific example, see the [Qwen2.5-Omni deploy config](gh-file:vllm_omni/deploy/qwen2_5_omni.yaml). The matching frozen pipeline topology lives at [vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py](gh-file:vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py). - -For introduction, please check [Introduction for stage config](./stage_configs.md) - -## Memory Configuration - -- **[GPU Memory Calculation and Configuration](./gpu_memory_utilization.md)** - Guide on how to calculate memory requirements and set up `gpu_memory_utilization` for optimal performance - -## Multi-Stage Recipes - -- **[Prefill-Decode Disaggregation](./pd_disaggregation.md)** - How to derive a PD-aware Qwen3-Omni stage config from the default config without introducing another bundled YAML - -## Optimization Features - -- **[Diffusion Features Overview](../user_guide/diffusion_features.md)** - Complete overview of all diffusion model features and supported models diff --git a/docs/configuration/gpu_memory_utilization.md b/docs/configuration/gpu_memory_utilization.md deleted file mode 100644 index 74106603532..00000000000 --- a/docs/configuration/gpu_memory_utilization.md +++ /dev/null @@ -1,207 +0,0 @@ -# GPU Memory Calculation and Configuration - -This guide explains how to calculate GPU memory requirements and properly configure `gpu_memory_utilization` for vLLM-Omni stages. - -## Overview - -`gpu_memory_utilization` is a critical parameter that controls how much GPU memory each stage can use. It's specified as a fraction between 0.0 and 1.0, where: -- `0.8` means 80% of the GPU's total memory -- `1.0` means 100% of the GPU's total memory (not recommended, leaves no buffer) - -## How Memory is Calculated - -### Memory Allocation Formula - -For each stage, vLLM-Omni calculates the requested memory as: - -``` -requested_memory = total_gpu_memory × gpu_memory_utilization -``` - -The system checks that: -``` -free_memory ≥ requested_memory -``` - -If this condition is not met, the stage will fail to initialize with an error message showing the memory requirements. - -### Memory Components - -The total memory used by a stage includes: - -1. **Model Weights**: The size of the model parameters loaded on the GPU -2. **KV Cache**: Memory for storing key-value cache during generation -3. **Activation Memory**: Temporary memory for intermediate computations -4. **System Overhead**: Memory used by CUDA, PyTorch, and other system components -5. **Non-Torch Memory**: Memory allocated outside of PyTorch (e.g., CUDA graphs) - -### Example Calculation - -For a GPU with 80GB total memory: -- `gpu_memory_utilization: 0.8` → 64GB available for the stage -- `gpu_memory_utilization: 0.6` → 48GB available for the stage -- `gpu_memory_utilization: 0.15` → 12GB available for the stage - -## Setting Up `gpu_memory_utilization` - -### Step 1: Determine GPU Memory - -First, check your GPU's total memory: - -```bash -# Using nvidia-smi -nvidia-smi --query-gpu=memory.total --format=csv - -# Or using Python -python -c "import torch; print(f'{torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB')" -``` - -### Step 2: Estimate Model Memory Requirements - -#### For Autoregressive (AR) Stages - -AR stages typically need more memory due to: -- Large model weights -- KV cache for attention -- Activation buffers - -#### For Diffusion/Generation Stages - -Diffusion stages (like code2wav) typically need less memory: -- Smaller model components -- Different memory access patterns - -**Typical values:** -- `0.1 - 0.3` for most diffusion stages - -### Step 3: Consider Multi-Stage Scenarios - -When multiple stages share the same GPU, you must ensure the sum of their `gpu_memory_utilization` values doesn't exceed 1.0. - -**Example: Two stages on GPU 0** -```yaml -stage_args: - - stage_id: 0 - runtime: - devices: "0" - engine_args: - gpu_memory_utilization: 0.6 # Uses 60% of GPU 0 - - - stage_id: 1 - runtime: - devices: "0" - engine_args: - gpu_memory_utilization: 0.3 # Uses 30% of GPU 0 - # Total: 90% of GPU 0 (safe, leaves 10% buffer) -``` - -**Important:** If stages run on different GPUs, each can use up to 1.0 independently. - -### Step 4: Account for Tensor Parallelism - -When using `tensor_parallel_size > 1`, the model is split across multiple GPUs, so each GPU needs less memory. - -**Example: 2-way tensor parallelism** -```yaml -stage_args: - - stage_id: 0 - runtime: - devices: "0,1" # Uses both GPUs - engine_args: - tensor_parallel_size: 2 - gpu_memory_utilization: 0.6 # 60% per GPU - # Model is split, so each GPU uses ~30% of model memory -``` - -## Examples - -### Qwen3-Omni-MoE on 2x H100-80GB - -```yaml -stage_args: - - stage_id: 0 # Thinker stage with TP=2 - runtime: - devices: "0,1" - engine_args: - tensor_parallel_size: 2 - gpu_memory_utilization: 0.6 # 48GB per GPU - - - stage_id: 1 # Talker stage - runtime: - devices: "1" - engine_args: - gpu_memory_utilization: 0.3 # 24GB on GPU 1 - - - stage_id: 2 # Code2Wav stage - runtime: - devices: "0" - engine_args: - gpu_memory_utilization: 0.1 # 8GB on GPU 0 -``` -**Note:** In this configuration, stages 0 and 2 share GPU 0, but they run at different times in the pipeline, so their memory usage doesn't overlap. - -## Troubleshooting - -### Error: "Free memory is less than desired GPU memory utilization" - -This means the GPU doesn't have enough free memory when the stage starts. - -**Solutions:** -1. Free up memory by closing other processes -2. Reduce `gpu_memory_utilization` for this stage -3. Use a GPU with more memory -4. Move the stage to a different GPU - -### Error: OOM during inference - -The stage initialized but ran out of memory during processing. - -**Solutions:** -1. Reduce `max_num_batched_tokens` -2. Reduce `max_num_seqs` in engine_args -3. Lower `gpu_memory_utilization` slightly -4. Enable quantization if supported - -### Memory Not Fully Utilized - -If you see low memory usage, you can: -1. Increase `gpu_memory_utilization` to allow larger KV cache -2. Increase `max_num_batched_tokens` for better batching -3. Check if other stages are limiting throughput - -## Useful formula for Memory Calculation - -### KV Cache Memory - -The KV cache size depends on: -- Number of sequences in batch -- Sequence length (prompt + generation) -- Model hidden size -- Number of attention heads -- Number of layers - -approximate Formula: -``` -kv_cache_memory ≈ batch_size × seq_len × hidden_size × num_layers × 2 × dtype_size -``` -2 for k & v - -### Model Weight Memory - -``` -model_memory ≈ num_parameters × dtype_size -``` - -For example: -- 7B parameters in FP16: ~14GB -- 7B parameters in FP32: ~28GB -- 7B parameters in INT8: ~7GB - -### Activation Memory - -Activation memory is typically smaller but varies with: -- Batch size -- Sequence length -- Model architecture - -It's usually 10-30% of model weight memory during inference. diff --git a/docs/configuration/pd_disaggregation.md b/docs/configuration/pd_disaggregation.md deleted file mode 100644 index 9196bdb0240..00000000000 --- a/docs/configuration/pd_disaggregation.md +++ /dev/null @@ -1,171 +0,0 @@ -# Prefill-Decode (PD) Disaggregation - -PD disaggregation splits the Qwen3-Omni thinker into separate prefill and decode -stages so prompt processing and token generation can run on different workers. - -This is documented as a stage-config recipe instead of a bundled YAML because the -deployment-specific values usually change per environment: - -- GPU placement -- `tensor_parallel_size` -- connector backend and connector ports -- connector IPs or bootstrap addresses - -Start from the [default Qwen3-Omni stage config](gh-file:vllm_omni/deploy/qwen3_omni_moe.yaml) -and copy it to your own file, for example `qwen3_omni_pd.yaml`. Then apply the -changes below. - -## Requirements - -- 3+ GPUs for a basic layout: prefill, decode, and talker+code2wav -- A KV connector supported by vLLM, such as `MooncakeConnector` -- Matching `tensor_parallel_size` on the prefill and decode thinker stages - -## 1. Split the thinker into prefill and decode stages - -Replace the original thinker stage with two stages: - -```yaml -stage_args: - - stage_id: 0 - stage_type: llm - is_prefill_only: true - runtime: - devices: "0" - engine_args: - max_num_seqs: 16 - model_stage: thinker - model_arch: Qwen3OmniMoeForConditionalGeneration - worker_type: ar - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - gpu_memory_utilization: 0.9 - enforce_eager: true - trust_remote_code: true - engine_output_type: latent - distributed_executor_backend: "mp" - enable_prefix_caching: false - max_num_batched_tokens: 32768 - hf_config_name: thinker_config - tensor_parallel_size: 1 - kv_transfer_config: - kv_connector: "MooncakeConnector" - kv_role: "kv_producer" - kv_rank: 0 - kv_parallel_size: 2 - kv_connector_extra_config: - mooncake_bootstrap_port: 25201 - final_output: false - is_comprehension: true - default_sampling_params: - temperature: 0.4 - top_p: 0.9 - top_k: 1 - max_tokens: 2048 - seed: 42 - detokenize: True - repetition_penalty: 1.05 - - - stage_id: 1 - stage_type: llm - is_decode_only: true - runtime: - devices: "1" - engine_args: - max_num_seqs: 64 - model_stage: thinker - model_arch: Qwen3OmniMoeForConditionalGeneration - worker_type: ar - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - gpu_memory_utilization: 0.9 - enforce_eager: true - trust_remote_code: true - engine_output_type: latent - distributed_executor_backend: "mp" - enable_prefix_caching: false - max_num_batched_tokens: 32768 - hf_config_name: thinker_config - tensor_parallel_size: 1 - kv_transfer_config: - kv_connector: "MooncakeConnector" - kv_role: "kv_consumer" - kv_rank: 1 - kv_parallel_size: 2 - kv_connector_extra_config: - mooncake_bootstrap_port: 25202 - engine_input_source: [0] - final_output: true - final_output_type: text - is_comprehension: true - default_sampling_params: - temperature: 0.4 - top_p: 0.9 - top_k: 1 - max_tokens: 2048 - seed: 42 - detokenize: True - repetition_penalty: 1.05 -``` - -Notes: - -- `is_prefill_only: true` marks the thinker stage that only saves KV. -- `is_decode_only: true` marks the thinker stage that resumes from remote KV. -- `kv_transfer_config` is required on both stages. -- The orchestrator forces the prefill stage to run with `max_tokens=1`, so the - prefill side only processes the prompt and exports KV. - -## 2. Shift the downstream stages by one index - -After inserting the extra thinker stage, renumber the remaining stages: - -```yaml - - stage_id: 2 - runtime: - devices: "2" - engine_input_source: [1] - custom_process_input_func: vllm_omni.model_executor.stage_input_processors.qwen3_omni.thinker2talker - - - stage_id: 3 - runtime: - devices: "2" - engine_args: - max_num_seqs: 1 - engine_input_source: [2] - custom_process_input_func: vllm_omni.model_executor.stage_input_processors.qwen3_omni.talker2code2wav -``` - -Compared with the default Qwen3-Omni config: - -- the talker becomes stage `2` instead of stage `1` -- the code2wav stage becomes stage `3` instead of stage `2` -- the talker now reads from decode stage `1` - -## 3. Add runtime edges for the four-stage pipeline - -```yaml -runtime: - enabled: true - edges: - - from: 0 - to: 1 - - from: 1 - to: 2 - - from: 2 - to: 3 -``` - -## 4. Launch with your custom config - -```bash -vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091 \ - --stage-configs-path /path/to/qwen3_omni_pd.yaml -``` - -## Operational Notes - -- `MooncakeConnector` does not support heterogeneous TP sizes across the PD - pair. Keep prefill and decode at the same `tensor_parallel_size`. -- If the thinker requires TP=2, both thinker stages must use TP=2 and be given - separate GPU sets, for example `"0,1"` for prefill and `"2,3"` for decode. -- Choose connector ports and addresses that match your deployment. The values - shown above are examples only. diff --git a/docs/configuration/stage_configs.md b/docs/configuration/stage_configs.md deleted file mode 100644 index 3a17f1c4013..00000000000 --- a/docs/configuration/stage_configs.md +++ /dev/null @@ -1,509 +0,0 @@ -# Stage configs for vLLM-Omni - -In vLLM-Omni, the target model is separated into multiple stages, which are processed by different LLMEngines, DiffusionEngines or other types of engines. Depending on different types of stages, such as Autoregressive (AR) stage or Diffusion transformer (DiT) stage, each can choose corresponding schedulers, model workers to load with the Engines in a plug-in fashion. - -!!! note - Default deploy config YAMLs (for example, `vllm_omni/deploy/qwen2_5_omni.yaml`, `vllm_omni/deploy/qwen3_omni_moe.yaml`, and `vllm_omni/deploy/qwen3_tts.yaml`) are bundled and loaded automatically when neither `--stage-configs-path` nor `--deploy-config` is provided — the model registry resolves the right pipeline + deploy YAML by `model_type`. The bundled defaults have been verified on 1xH100 for Qwen2.5-Omni and 2xH100 for Qwen3-Omni. Models that have not yet migrated to the new schema continue to use the legacy `vllm_omni/model_executor/stage_configs/.yaml` files via `--stage-configs-path`. - -## New deploy schema reference - -The new deploy schema lives under `vllm_omni/deploy/` and is paired with a frozen `PipelineConfig` registered by the model's `pipeline.py`. Each deploy YAML has these top-level fields: - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `base_config` | str (path) | optional | — | Overlay parent (relative or absolute). `stages:` / `platforms:` deep-merged by stage_id; other scalars overlay-wins. Intended for user-authored overlays; prod yamls stay flat. | -| `async_chunk` | bool | optional | `true` | Enable chunked streaming between stages. Pin to `false` if the pipeline runs end-to-end. | -| `connectors` | dict | optional | `null` | Named connector specs (`{name, extra}`). Referenced by each stage's `input_connectors` / `output_connectors`. See [Connector schema](#connector-schema). | -| `edges` | list | optional | `null` | Explicit edge list for the KV transfer graph. Auto-derived from stage inputs if omitted. | -| `stages` | list | required | — | Per-stage engine args + wiring (see [Stage fields](#stage-fields)). | -| `platforms` | dict | optional | `null` | Keyed by `npu` / `rocm` / `xpu`, each contains a `stages:` list with per-platform overrides applied on top of the CUDA defaults. | -| `pipeline` | str | optional | `null` | Override the auto-detected pipeline registry key (used for structural variants like `qwen2_5_omni_thinker_only`). | -| `trust_remote_code` | bool | optional | `true` | **Pipeline-wide.** Trust HF remote code on model load; applies to every stage. | -| `distributed_executor_backend` | str \| null | optional | `null` | **Pipeline-wide.** Distributed executor backend forwarded to vLLM (`"mp"`, `"ray"`, `"external_launcher"`). If omitted, vLLM auto-selects backend from runtime topology. | -| `dtype` | str \| null | optional | `null` | **Pipeline-wide.** Model dtype for every stage. | -| `quantization` | str \| null | optional | `null` | **Pipeline-wide.** Quantization method for every stage. | -| `enable_prefix_caching` | bool | optional | `false` | **Pipeline-wide.** Prefix cache toggle applied to every stage. | -| `enable_chunked_prefill` | bool \| null | optional | `null` | **Pipeline-wide.** Chunked prefill toggle applied to every stage. | -| `data_parallel_size` | int | optional | `1` | **Pipeline-wide.** DP degree for every stage. | -| `pipeline_parallel_size` | int | optional | `1` | **Pipeline-wide.** PP degree for every stage. | - -Note: for diffusion path, `distributed_executor_backend` currently defaults to -`mp`, and `ray` / `external_launcher` are not fully supported yet. - -### Stage fields - -Each entry under `stages:` accepts any `StageDeployConfig` field directly (no nested `engine_args:`). Only fields whose value legitimately varies across stages live here; pipeline-wide settings (trust_remote_code, distributed_executor_backend, dtype, quantization, prefix/chunked prefill, DP/PP sizes) are declared at the top level and applied to every stage. Unknown keys fall through to `engine_extras:` and are forwarded to the engine. - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `stage_id` | int | required | — | Stage identity; matched against `PipelineConfig.stages[*].stage_id`. | -| `max_num_seqs` | int | optional | `64` | Max concurrent sequences per stage. | -| `gpu_memory_utilization` | float | optional | `0.9` | Per-stage memory budget. | -| `tensor_parallel_size` | int | optional | `1` | TP degree for this stage. | -| `enforce_eager` | bool | optional | `false` | Disable CUDA graphs. | -| `max_num_batched_tokens` | int | optional | `32768` | Prefill budget. | -| `max_model_len` | int \| null | optional | `null` | Per-stage context length (auto-sets `VLLM_ALLOW_LONG_MAX_MODEL_LEN=1` when larger than HF default). | -| `async_scheduling` | bool \| null | optional | `null` | Per-stage async scheduling toggle. | -| `devices` | str | optional | `"0"` | `CUDA_VISIBLE_DEVICES`-style device list. | -| `output_connectors` | dict \| null | optional | `null` | Keyed by `to_stage_`; values are names registered under top-level `connectors:`. | -| `input_connectors` | dict \| null | optional | `null` | Keyed by `from_stage_`; values are names registered under top-level `connectors:`. | -| `default_sampling_params` | dict \| null | optional | `null` | Baseline sampling params. Deep-merged with pipeline `sampling_constraints` (pipeline wins). | -| `engine_extras` | dict | optional | `{}` | Catch-all for keys not listed above; deep-merged across overlays. Also carries per-stage overrides of pipeline-wide settings (e.g. stage-specific `dtype`). | - -### Connector schema - -Each entry under top-level `connectors:` follows this shape: - -```yaml -connectors: - : - name: # required — class registered in vllm_omni.distributed - extra: # optional — forwarded to the connector's __init__ - : - ... -``` - -| Connector class | Use case | `extra` keys | -|-----------------|----------|--------------| -| `SharedMemoryConnector` | Same-host KV transfer between stages (default for bundled YAMLs). | `shm_threshold_bytes` (int, default `65536`). | -| `MooncakeStoreConnector` | Cross-host KV transfer over TCP. Required for multi-node deployments. | `host`, `metadata_server`, `master`, `segment` (int bytes), `localbuf` (int bytes), `proto` (`"tcp"` / `"rdma"`). | - -A stage references a connector by name in its `input_connectors` / `output_connectors`: - -```yaml -connectors: - shm: - name: SharedMemoryConnector - -stages: - - stage_id: 0 - output_connectors: {to_stage_1: shm} - - stage_id: 1 - input_connectors: {from_stage_0: shm} -``` - -### CLI flags introduced in this refactor - -| Flag | Description | -|------|-------------| -| `--deploy-config PATH` | Load a new-schema deploy YAML. Takes precedence over `--stage-configs-path`. **Optional** — when omitted, the bundled `vllm_omni/deploy/.yaml` is auto-loaded by the model registry. | -| `--stage-overrides JSON` | Per-stage JSON overrides, e.g. `'{"0":{"gpu_memory_utilization":0.5}}'`. Per-stage values always win over global flags. | -| `--async-chunk` / `--no-async-chunk` | Flip the deploy YAML's `async_chunk:` bool. Unset (default) leaves the YAML value in force. | -| `--stage-configs-path` | **Deprecated.** Accepts legacy `stage_args` yamls and (auto-detected) new deploy yamls; emits a deprecation warning. Migrate to `--deploy-config`. To be removed in a follow-up PR. | - -### Stage-Based CLI Paradigm - -The stage-based CLI paradigm facilitates the execution of discrete pipeline stages within isolated processes: - -- **Stage 0** typically encapsulates the orchestrator and the primary API server. Invocation requires `--stage-id 0`, - `--omni-master-address`, `--omni-master-port`, and standard port declarations (e.g., `--port`). -- **Worker Stages** operate without a distinct API server (i.e., using `--headless`), are assigned sequential `--stage-id` identifiers, and must reference the corresponding - `--omni-master-address` and `--omni-master-port` parameters to successfully register with Stage 0. - -For migrated architectures, the system automatically resolves and loads the bundled deployment YAML. Consequently, the primary execution path -does **not** necessitate the explicit definition of `--deploy-config`: -the example below uses `CUDA_VISIBLE_DEVICES=0` for Stage 0 and -`CUDA_VISIBLE_DEVICES=1` for Stage 1. - -```bash -CUDA_VISIBLE_DEVICES=0 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --port 8091 \ - --stage-id 0 \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 - -CUDA_VISIBLE_DEVICES=1 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --stage-id 1 \ - --headless \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 -``` - -When instantiating a custom deployment YAML conforming to the updated schema, append the `--deploy-config /path/to/override.yaml` directive -to all node invocations. For legacy architectures (e.g., BAGEL) configured via deprecated `stage_args:` schemas, continue to specify the relevant configuration via `--stage-configs-path /path/to/config.yaml`. - -In the context of standard initialization architectures, utilizing the `--stage-overrides` parameter operates as the optimal methodology -for delineating stage-specific tuning from the CLI interface: - -```bash -vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091 \ - --stage-overrides '{"1": {"gpu_memory_utilization": 0.5}}' -``` - -Conversely, in the context of the **stage-based CLI** paradigm, given that each execution process exclusively instantiates a single pipeline stage, configuration override attributes -can be defined uniformly via explicit CLI flags on the corresponding instantiation command, rendering composite `--stage-overrides` JSON strings unnecessary: - -```bash -CUDA_VISIBLE_DEVICES=1 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --stage-id 1 \ - --headless \ - --gpu-memory-utilization 0.5 \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 -``` - -### Precedence - -From highest to lowest: - -1. Per-stage flags (`--stage-overrides` JSON, `--stage--` if registered) -2. Explicit global CLI flags (`--gpu-memory-utilization 0.85`, etc.) -3. Platform section (`platforms.npu.stages`, etc.) on top of the base `stages:` -4. Overlay YAML (via `base_config:`) on top of the base YAML -5. Parser defaults - -### Worked override example - -Starting from the bundled `vllm_omni/deploy/qwen3_omni_moe.yaml`: - -```yaml -# vllm_omni/deploy/qwen3_omni_moe.yaml (excerpt) -async_chunk: true -stages: - - stage_id: 0 - gpu_memory_utilization: 0.9 - max_num_seqs: 32 - - stage_id: 1 - gpu_memory_utilization: 0.7 - max_num_seqs: 16 -``` - -A user-authored overlay that inherits the base and overrides only stage 1: - -```yaml -# my_overrides.yaml -base_config: /path/to/vllm_omni/deploy/qwen3_omni_moe.yaml -stages: - - stage_id: 1 - gpu_memory_utilization: 0.5 # smaller GPU -``` - -Launched with both an explicit global flag and a per-stage override: - -```bash -vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091 \ - --deploy-config my_overrides.yaml \ - --max-model-len 16384 \ - --stage-overrides '{"0": {"max_num_seqs": 8}}' -``` - -Within the stage-based CLI paradigm, equivalent configuration parameters can inherently be passed directly -as command-line arguments to the designated single-stage process instantiation: - -```bash -CUDA_VISIBLE_DEVICES=0 vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni \ - --stage-id 0 \ - --max-num-seqs 8 \ - --omni-master-address 127.0.0.1 \ - --omni-master-port 26000 -``` - -Effective config per stage after the merge: - -| Stage | Field | Final value | Source | -|-------|-------|-------------|--------| -| 0 | `gpu_memory_utilization` | `0.9` | base YAML (overlay didn't touch stage 0) | -| 0 | `max_num_seqs` | `8` | per-stage CLI (`--stage-overrides`) — wins over base `32` | -| 0 | `max_model_len` | `16384` | global CLI | -| 1 | `gpu_memory_utilization` | `0.5` | overlay YAML — wins over base `0.7` | -| 1 | `max_num_seqs` | `16` | base YAML (overlay didn't touch this field) | -| 1 | `max_model_len` | `16384` | global CLI | -| 2 | (all defaults) | — | base YAML (no overrides apply) | - -Therefore, as a core part of vLLM-Omni, the stage configs for a model have several main functions: - -- Claim partition of stages and their corresponding class implementation in `model_executor/models`. -- The disaggregated configuration for each stage and the communication topology among them. -- Engine arguments for each engine within the stage. -- Input and output dependencies for each stage. -- Default input parameters. - -To override specific parameters, explicitly inject the customized configuration schema -in both online and offline instantiation flows. Prioritize the `--deploy-config` flag -when loading the new-schema deploy YAML schemas, reserving the `--stage-configs-path` parameter -exclusively to maintain compatibility with legacy `stage_args` YAML constructs. - -Examples: - -For offline (Assume necessary dependencies have been imported): -```python -model_name = "Qwen/Qwen2.5-Omni-7B" -omni = Omni(model=model_name, stage_configs_path="/path/to/custom_stage_configs.yaml") -``` - -For online serving: -```bash -vllm serve Qwen/Qwen2.5-Omni-7B --omni --port 8091 --deploy-config /path/to/deploy_config.yaml -``` - -Legacy online serving: - -```bash -vllm serve ByteDance-Seed/BAGEL-7B-MoT --omni --port 8091 --stage-configs-path /path/to/stage_configs_file -``` -!!! important - We are actively iterating on the definition of stage configs, and we welcome all feedbacks from both community users and developers to help us shape the development! - -Below is a specific example of stage_configs.yaml in Qwen2.5-omni. -```python -# stage config for running qwen2.5-omni with AsyncOmniEngine + Orchestrator runtime. -stage_args: - - stage_id: 0 # mark the unique id for each stage - runtime: # The disaggregated configuration - process: true # Run this stage in a separate process - devices: "0" # Logical device index for this stage (mapped through CUDA_VISIBLE_DEVICES / ASCEND_RT_VISIBLE_DEVICES if set) - engine_args: # Engine arguments for a certain engine - model_stage: thinker - max_num_seqs: 1 - model_arch: Qwen2_5OmniForConditionalGeneration # The model implementation registered in model_executor/models/registry.py - worker_type: ar # The specific worker used - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler # The specific scehduler used - gpu_memory_utilization: 0.8 # The gpu memory allocation for the stage within a single chip - enforce_eager: true # Now we only support eager mode - trust_remote_code: true # Needed by huggingface config parsing - engine_output_type: latent # It claims that the stage will input latent hiddenstates besides token ids - enable_prefix_caching: false # For request with hiddenstates output, the prefix caching is not supported now - is_comprehension: true # If the stage is a text or multimodal comprehension module. If it is, the AsyncOmni will use its tokenizer as default - final_output: true # If the stage has output as part of final outputs. If it is false, which means that the stage only works as a intermediate role. - final_output_type: text # What is the final output type. It can be text and audio now. - default_sampling_params: # sampling parameters for the stage. Their meaning aligns with vLLM. - temperature: 0.0 - top_p: 1.0 - top_k: -1 - max_tokens: 2048 - seed: 42 - detokenize: True - repetition_penalty: 1.1 - - stage_id: 1 - runtime: - process: true - devices: "1" - engine_args: - model_stage: talker - max_num_seqs: 3 - model_arch: Qwen2_5OmniForConditionalGeneration - worker_type: ar - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - gpu_memory_utilization: 0.8 - 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: 2048 - 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 - engine_args: - model_stage: code2wav - max_num_seqs: 1 - model_arch: Qwen2_5OmniForConditionalGeneration - worker_type: generation - 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 - 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: 2048 - seed: 42 - detokenize: True - repetition_penalty: 1.1 - -# Top-level runtime config (concise): default windows and stage edges -runtime: - enabled: true - - edges: - - from: 0 # thinker → talker: trigger only after receiving full input (-1) - to: 1 - - from: 1 # talker → code2wav: trigger only after receiving full input (-1) - to: 2 - -``` - -## Stage Configuration Arguments - -Each stage in the `stage_args` list contains the following configuration options: - -### `stage_id` - -A unique identifier for each stage in the multi-stage pipeline. Stages are numbered sequentially starting from 0, and this ID is used to reference stages in inter-stage dependencies (e.g., `engine_input_source`). - -### `prompt_expand_func` (Optional) - -A custom Python function hook for the LLM stage (Stage 0) that expands a single incoming prompt object into multiple prompts. This is primarily used for multi-modal Classifier-Free Guidance (CFG), where it generates the necessary companion requests (like a negative text prompt) and tags them with internal roles (e.g., `cfg_text`). This ensures the upstream LLM generates the needed contextual hidden states for both the conditional and unconditional generations simultaneously. - -### `cfg_kv_collect_func` (Optional) - -A custom Python function hook for downstream diffusion stages (Stage 1+) to collect, map, and process the KV caches transferred from the companion requests fired by `prompt_expand_func`. It aggregates the hidden condition states cleanly (e.g., binding them as `cfg_text_past_key_values` and `cfg_text_kv_metadata`), allowing the diffusion runtime to perform CFG smoothly without redundantly evaluating text paths on the DiT workers. - -### `runtime` - -Configuration for disaggregated execution of the stage, controlling how the stage is deployed and executed. - -#### `runtime.process` - -Whether to run this stage in a separate process. When set to `true`, the stage will be executed in an isolated process, enabling better resource isolation and parallel execution across different stages. This is essential for multi-GPU deployments where different stages run on different devices. - -Default: `true` - -#### `runtime.devices` - -Logical device indices for this stage, specified as a string. Values are **logical indices** (`0`, `1`, `2`, ...) — not physical GPU IDs — and are mapped through the platform's visibility env var (`CUDA_VISIBLE_DEVICES` on CUDA, `ASCEND_RT_VISIBLE_DEVICES` on NPU) before being applied via `torch.cuda.set_device()` (or the equivalent). - -Example: if `CUDA_VISIBLE_DEVICES=0,2,4` is set in the environment, then `devices: "0"` selects physical GPU 0 (the first visible), `devices: "1"` selects physical GPU 2, and `devices: "0,1"` makes physical GPUs 0 and 2 available to the stage. If no visibility env var is set, logical and physical IDs coincide. - -Default: `"0"` - -#### `engine_args.max_num_seqs` - -The maximum number of sequences for concurrent processing in this stage. For LLM stages, this controls the vLLM scheduler's maximum concurrent sequences. For all stage types, this also controls how many tasks can be batched together in the task processing loop. - -Default: `1` - -### `engine_args` - -Engine arguments for configuring the LLM engine, diffusion engine, or other engine types used by this stage. - -#### `engine_args.model_stage` - -The name identifier for this model stage within the multi-stage architecture. This is used internally to distinguish different stages of the same model (e.g., "thinker", "talker", "code2wav" in Qwen2.5-Omni). - -#### `engine_args.model_arch` - -The model architecture class name that is registered in `model_executor/models/registry.py`. This specifies which model implementation to use for this stage. The class must be registered in the model registry for vLLM-Omni to locate and instantiate it. - -#### `engine_args.worker_cls` - -The specific worker class to use for this stage. This determines how the model computations are executed. Examples include `vllm_omni.worker.gpu_ar_worker.GPUARWorker` for autoregressive stages and `vllm_omni.worker.gpu_generation_worker.GPUGenerationWorker` for diffusion-based stages. - -#### `engine_args.scheduler_cls` - -The scheduler class to use for this stage. The scheduler manages request queuing, batching, and execution order. Examples include `vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler` for standard stages and `vllm_omni.core.sched.omni_generation_scheduler.OmniGenerationScheduler` for diffusion stages. - -#### `engine_args.gpu_memory_utilization` - -The fraction of GPU memory to allocate for this stage within a single GPU chip. This is a value between 0.0 and 1.0, where 0.8 means 80% of the GPU memory will be used by this stage. This allows fine-grained control over memory allocation when multiple stages share the same GPU or when reserving memory for other operations. - -Default: `0.8` - -!!! tip "Memory Configuration Guide" - For detailed information on how to calculate memory requirements and properly configure `gpu_memory_utilization`, see the [GPU Memory Calculation and Configuration Guide](./gpu_memory_utilization.md). - -#### `engine_args.enforce_eager` - -Whether to enforce eager execution mode. When set to `true`, the engine will run in eager mode without using CUDA graphs or other compilation optimizations. Currently, vLLM-Omni only supports eager mode. - -Default: `true` - -#### `engine_args.trust_remote_code` - -Whether to trust remote code when loading models from Hugging Face. This is required for models that use custom code in their configuration files. Set to `true` when loading models that require custom model implementations. - -Default: `true` - -#### `engine_args.engine_output_type` - -Specifies the type of output produced by this stage's engine. This determines what kind of data flows to downstream stages. Possible values include `latent` (hidden states), `text` (tokenized text), and `audio` (audio waveforms). When set to `latent`, the stage outputs latent hidden states in addition to token IDs, which are consumed by downstream stages. - -Default: `latent` - -#### `engine_args.enable_prefix_caching` - -Whether to enable prefix caching for this stage. Prefix caching can improve performance by caching KV cache for common prompt prefixes. However, for requests that output hidden states (when `engine_output_type` is `latent`), prefix caching is not currently supported and should be set to `false`. - -Default: `false` - -### `is_comprehension` - -Whether this stage is a text or multimodal comprehension module. When set to `true`, the stage acts as a comprehension module that processes input text or multimodal content. If this is the first comprehension stage, `AsyncOmni` will use its tokenizer as the default tokenizer for the entire pipeline. - -Default: `true` - -### `final_output` - -Whether this stage produces output that is part of the final outputs returned to the user. When set to `false`, the stage only works as an intermediate stage, processing data that flows to downstream stages but not contributing directly to the final response. - -Default: `true` - -### `final_output_type` - -The type of final output produced by this stage. This specifies what format the output will be in when returned to the user. Currently supported values are `text` (for text generation) and `audio` (for audio generation). - -Default: `text` - -### `default_sampling_params` - -Default sampling parameters for this stage. These parameters control the generation behavior and align with vLLM's sampling parameter semantics. These defaults are used when no explicit sampling parameters are provided in the request. - -#### `default_sampling_params.temperature` - -Sampling temperature for controlling randomness. Lower values (e.g., 0.0) make the output more deterministic and focused, while higher values increase randomness. - -Default: `0.0` - -#### `default_sampling_params.top_p` - -Nucleus sampling parameter. Only tokens with cumulative probability mass up to `top_p` are considered. This helps filter out low-probability tokens while maintaining diversity. - -Default: `1.0` - -#### `default_sampling_params.top_k` - -Top-k sampling parameter. Only the top `k` most likely tokens are considered. Set to `-1` to disable top-k filtering and consider all tokens. - -Default: `-1` - -#### `default_sampling_params.max_tokens` - -Maximum number of tokens to generate in this stage. This limits the length of the output sequence. - -Default: `2048` - -#### `default_sampling_params.seed` - -Random seed for reproducible generation. When set, the random number generator will be initialized with this seed to ensure consistent outputs across runs. - -Default: `42` - -#### `default_sampling_params.detokenize` - -Whether to detokenize the output tokens into text. When set to `true`, token IDs are converted back to readable text strings. - -Default: `True` - -#### `default_sampling_params.repetition_penalty` - -Penalty applied to tokens that have already appeared in the generated sequence. Values greater than 1.0 discourage repetition, while values less than 1.0 encourage it. A value of 1.0 applies no penalty. - -Default: `1.1` - -### `tts_args` (TTS stages only) - -Configuration for Text-to-Speech specific parameters. This section is only applicable to TTS model stages (e.g., `qwen3_tts`). - -#### `tts_args.max_instructions_length` - -Maximum character length for voice style/emotion instructions. Instructions exceeding this limit will be rejected with a validation error. - -Default: `500` - -This value can be overridden at runtime using the `--tts-max-instructions-length` CLI parameter when starting the server. diff --git a/docs/contributing/DOCS_GUIDE.md b/docs/contributing/DOCS_GUIDE.md deleted file mode 100644 index 100bac67423..00000000000 --- a/docs/contributing/DOCS_GUIDE.md +++ /dev/null @@ -1,139 +0,0 @@ -# Documentation Build Guide - -This directory contains the source files for the vLLM-Omni documentation. - -## Building Documentation Locally - -### Prerequisites - -Install documentation dependencies: - -```bash -uv pip install -e ".[docs]" -``` - -### Build and Serve Documentation - -From the project root: - -```bash -# Serve documentation locally (auto-reload on changes) -# This starts a local web server at http://127.0.0.1:8000 -mkdocs serve - -# Build static site (generates HTML files in site/ directory) -mkdocs build -``` - -When using `mkdocs serve`, the documentation will be automatically available at `http://127.0.0.1:8000`. The server will automatically reload when you make changes to the documentation files. - -## Auto-generating API Documentation - -The documentation automatically extracts docstrings from the code using mkdocstrings. To ensure your code is documented: - -1. Add docstrings to all public classes, functions, and methods -2. Use Google or NumPy style docstrings (both are supported) -3. Rebuild the documentation to see changes - -Example docstring: - -```python -class Omni: - """Main entry point for vLLM-Omni inference. - - This class provides a high-level interface for running multi-modal - inference with non-autoregressive models. - - Args: - model: Model name or path - stage_configs: Optional stage configurations - **kwargs: Additional arguments passed to the engine - - Example: - >>> llm = Omni(model="Qwen/Qwen2.5-Omni") - >>> outputs = llm.generate(prompts="Hello") - """ -``` - -## Documentation Structure - -``` -docs/ -├── index.md # Main documentation page -├── getting_started/ # Getting started guides -├── architecture/ # Architecture documentation -├── api/ # API reference (auto-generated from code) -├── examples/ # Code examples -└── stylesheets/ # Custom CSS -``` - -## Publishing Documentation - -### GitHub Pages (Recommended) - -The documentation is automatically deployed to GitHub Pages using GitHub Actions. - -1. **Enable GitHub Pages**: - - Go to repository `Settings` → `Pages` - - Set `Source` to `GitHub Actions` - - Save settings - -2. **Push changes**: - ```bash - git push origin main - ``` - -3. **Documentation will be available at**: - - `https://vllm-omni.readthedocs.io` - -The GitHub Actions workflow (`.github/workflows/docs.yml`) will automatically: -- Build the documentation when you push to `main` branch -- Deploy it to GitHub Pages -- Update the documentation whenever you make changes - - -### Read the Docs (Alternative) - -You can also use Read the Docs for hosting: - -1. Sign up at https://readthedocs.org/ -2. Import the `vllm-project/vllm-omni` repository -3. Read the Docs will automatically build using `.readthedocs.yml` -4. Documentation will be available at: `https://vllm-omni.readthedocs.io/` - -## Configuration - -The documentation configuration is in `mkdocs.yml` at the project root. - -## Tips - -- **API Documentation**: API docs are automatically generated using `mkdocs-api-autonav` and `mkdocstrings` - - No need to manually create API pages - they're generated automatically - - Use `[module.name.ClassName][]` syntax for cross-references in Summary pages -- **Code Snippets**: Use `--8<-- "path/to/file.py"` for including code snippets -- **Markdown**: Use Markdown for all documentation (no need for RST) -- **Material Theme**: Use Material theme features like: - - Admonitions: `!!! note`, `!!! warning`, etc. - - Code blocks with syntax highlighting - - Tabs for organizing content - - Math formulas using `pymdownx.arithmatex` - -## Troubleshooting - -### Documentation not updating - -- Make sure you've saved all files -- If using `mkdocs serve`, it should auto-reload -- Check for syntax errors in `mkdocs.yml` - -### API links not working - -- Ensure class names match exactly (case-sensitive) -- Check that the module is imported correctly -- Run `mkdocs build --strict` to check for errors - -### Build errors - -- Check Python version (requires 3.9+) -- Ensure all dependencies are installed: `pip install -e ".[docs]"` -- Check `mkdocs.yml` syntax with `mkdocs build --strict` diff --git a/docs/contributing/README.md b/docs/contributing/README.md deleted file mode 100644 index 8a5bcfff0ad..00000000000 --- a/docs/contributing/README.md +++ /dev/null @@ -1,151 +0,0 @@ -# Contributing to vLLM-Omni - -Thank you for your interest in contributing to vLLM-Omni! This document provides guidelines and instructions for contributing. - -!!! note - We host weekly developer-facing online meetings to discuss milestones and updates **every Tuesday at 19:30 PDT**. Meeting link as well as the past meeting notes can be found [here](https://tinyurl.com/vllm-omni-meeting). - -## Getting Started - -vLLM-Omni uses `uv` as the environment manager, to create and manage Python environments. Please follow the documentation to install `uv`. After installing `uv`, you can create a new Python environment using the following commands: - -```bash -uv venv --python 3.12 --seed -source .venv/bin/activate -``` - -### Development Environment for vLLM and vLLM-Omni - -vLLM-Omni is quickly evolving, please see the [installation guide](../getting_started/installation/README.md) for details. It's recommended to build from source to provide the latest development environment. - -!!! tip - vLLM-Omni is compatible with Python versions 3.10 to 3.12. However, we recommend developing with Python 3.12 to minimize the chance of your local environment clashing with our CI environment. - -### Adding a new model to vLLM-Omni - -Please check [model implementation](model/README.md) for how to add diffusion and omni-modality models to vLLM-Omni. - -### Linting - -vLLM-Omni uses `pre-commit` to lint and format the codebase. See [pre-commit documentation](https://pre-commit.com/#usage) if `pre-commit` is new to you. Setting up `pre-commit` is as easy as: - -```bash -uv pip install pre-commit -pre-commit install -``` - -vLLM-Omni's `pre-commit` hooks will now run automatically every time you commit. - -!!! tip - You can manually run the `pre-commit` hooks using: - - ```bash - pre-commit run # runs on staged files - pre-commit run --show-diff-on-failure --color=always --all-files # runs on all files (short for --all-files) - ``` - -### Documentation - -MkDocs is a fast, simple and downright gorgeous static site generator that's geared towards building project documentation. Documentation source files are written in Markdown, and configured with a single YAML configuration file, `mkdocs.yml`. - -Get started with: - -```bash -uv pip install -e ".[docs]" -``` - -MkDocs comes with a built-in dev-server that lets you preview your documentation as you work on it. From the root of the repository, run: - -```bash -mkdocs serve # with API ref (~10 minutes) -API_AUTONAV_EXCLUDE=vllm_omni mkdocs serve # API ref off (~15 seconds) -``` - -Once you see `Serving on http://127.0.0.1:8000/` in the logs, the live preview is ready! Open in your browser to see it. - -For additional features and advanced configurations, refer to the: - -- [MkDocs documentation](https://www.mkdocs.org/) -- [Material for MkDocs documentation](https://squidfunk.github.io/mkdocs-material/) (the MkDocs theme we use) - -### Testing - -vLLM-Omni uses `pytest` to test the codebase. -Please refer to the [test instructions](./ci/test_guide.md) for detailed testing information. - -!!! warning - Currently, not all unit tests pass when run on CPU platforms. If you don't have access to a GPU platform to run unit tests locally, rely on the continuous integration system to run the tests for now. - -## Issues - -If you encounter a bug or have a feature request, please search existing issues first to see if it has already been reported. If not, please file a new issue, providing as much relevant information as possible. - -!!! important - If you discover a security vulnerability, please report it by creating a GitHub issue with the `security` label. - -## Pull Requests & Code Reviews - -Thank you for your contribution to vLLM-Omni! Before submitting the pull request, please ensure the PR meets the following criteria. This helps vLLM-Omni maintain the code quality and improve the efficiency of the review process. - -### DCO and Signed-off-by - -When contributing changes to this project, you must agree to the [DCO](https://developercertificate.org/). Commits must include a `Signed-off-by:` header which certifies agreement with the terms of the DCO. - -Using `-s` with `git commit` will automatically add this header. - -!!! tip - You can enable automatic sign-off via your IDE: - - - **PyCharm**: Click on the `Show Commit Options` icon to the right of the `Commit and Push...` button in the `Commit` window. It will bring up a `git` window where you can modify the `Author` and enable `Sign-off commit`. - - **VSCode**: Open the Settings editor and enable the `Git: Always Sign Off` (`git.alwaysSignOff`) field. - -### PR Title and Classification - -Only specific types of PRs will be reviewed. The PR title is prefixed appropriately to indicate the type of change. Please use one of the following: - -- `[Bugfix]` for bug fixes. -- `[CI/Build]` for build or continuous integration improvements. -- `[Doc]` for documentation fixes and improvements. -- `[Model]` for adding a new model or improving an existing model. Model name should appear in the title. -- `[Frontend]` For changes on the vLLM-Omni frontend (e.g., OpenAI API server, `Omni`/`AsyncOmni`, etc.) -- `[Kernel]` for changes affecting CUDA kernels or other compute kernels. -- `[Core]` for changes in the core vLLM-Omni logic (e.g., `OmniProcessor`, `OmniARScheduler`, etc.) -- `[Hardware][Vendor]` for hardware-specific changes. Vendor name should appear in the prefix, such as [Ascend] for Ascend NPUs. -- `[Misc]` for PRs that do not fit the above categories. Please use this sparingly. - -!!! note - If the PR spans more than one category, please include all relevant prefixes. - -### Local Test -Please run the L1 and L2 test cases locally first and attach the results before contacting us to add the "ready" label. Please refer to the [test instructions](./ci/test_guide.md) for running the test cases. - -### Code Quality - -The PR needs to meet the following code quality standards: - -- We adhere to Google Python style guide and Google C++ style guide. -- Pass all linter checks. -- The code needs to be well-documented to ensure future contributors can easily understand the code. -- Include sufficient tests to ensure the project stays correct and robust. This includes both unit tests and integration tests. -- Please add documentation to `docs/` if the PR modifies the user-facing behaviors of vLLM-Omni. It helps vLLM-Omni users understand and utilize the new features or changes. - -### Notes for Large Changes - -Please keep the changes as concise as possible. For major architectural changes (>500 LOC excluding kernel/data/config/test), we would expect a GitHub issue (RFC) discussing the technical design and justification. Otherwise, we will tag it with `rfc-required` and might not go through the PR. - -### What to Expect for the Reviews - -The goal of the vLLM-Omni team is to be a _transparent reviewing machine_. We would like to make the review process transparent and efficient and make sure no contributor feels confused or frustrated. However, the vLLM-Omni team is small, so we need to prioritize some PRs over others. Here is what you can expect from the review process: - -- After the PR is submitted, the PR will be assigned to a reviewer. Every reviewer will pick up the PRs based on their expertise and availability. -- After the PR is assigned, the reviewer will provide status updates every 2-3 days. If the PR is not reviewed within 7 days, please feel free to ping the reviewer or the vLLM-Omni team. -- After the review, the reviewer will put an `action-required` label on the PR if there are changes required. The contributor should address the comments and ping the reviewer to re-review the PR. -- Please respond to all comments within a reasonable time frame. If a comment isn't clear or you disagree with a suggestion, feel free to ask for clarification or discuss the suggestion. - -## Additional Resources - -- [Design Documents](../design/index.md) - Architecture and design documentation - -## Thank You - -Finally, thank you for taking the time to read these guidelines and for your interest in contributing to vLLM-Omni. All of your contributions help make vLLM-Omni a great tool and community for everyone! diff --git a/docs/contributing/ci/.nav.yaml b/docs/contributing/ci/.nav.yaml deleted file mode 100644 index 0f187f3a15d..00000000000 --- a/docs/contributing/ci/.nav.yaml +++ /dev/null @@ -1,6 +0,0 @@ -nav: - - CI_5levels.md - - failures.md - - test_guide.md - - test_markers.md - - test_style.md diff --git a/docs/contributing/ci/CI_5levels.md b/docs/contributing/ci/CI_5levels.md deleted file mode 100644 index 6c451936233..00000000000 --- a/docs/contributing/ci/CI_5levels.md +++ /dev/null @@ -1,725 +0,0 @@ -# Multi-Level Automated Testing System Documentation - -## Document Overview - -This testing system aims to build a complete, efficient, and well-structured quality assurance framework for the development, integration, and release of model services. It draws on the concept of the test pyramid from modern software engineering, progressively expanding testing activities from basic code logic verification to complex end-to-end (E2E) functionality, performance, accuracy, and even long-term stability validation. - -Through five levels (L1-L5) and common (Common) specifications, the system clarifies the testing objectives, scope, execution frequency, and required resources for different development stages (e.g., each commit, PR merge, daily build, pre-release). This ensures that models meet high standards for functionality, performance, and reliability across various deployment scenarios (online serving and offline inference). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LevelScope & FocusTime CostTest DirDocFrequencyHardware
CommonContribution Guideline & PR checklist//.github/PULL_REQUEST_TEMPLATE.md Test Style (PR Checklist)//
CI Failure Description// CI Failures//
L1
(Unit & Logic)
Unit tests for components like entrypoints, models<15min/tests/{component_name}/test_xxx - Chapter 1
- Section 1 L1&L2: Purpose, Test Content, Directory Location, Example -
PR with ready label (also can run locally)CPU
L2
(E2E across models & GPU-required UT)
Online & Offline (basic deployment scenarios):
dummy, normal inference function (output format, stream), some instance startup UT
- /tests/e2e/online_serving/test_{model_name}.py
- /tests/e2e/offline_inference/test_{model_name}.py -
- Chapter 1
- L1&L2: Purpose, Test Content, Directory Location, Example -
PR with ready labelGPU
L3
(Important Perf & Integration & Accuracy)
Online & Offline (multiple deployment scenarios):
real model, normal inference function, normal accuracy
<30min - /tests/e2e/online_serving/test_{model_name}.py
- /tests/e2e/offline_inference/test_{model_name}.py -
- Chapter 2
- L3: Purpose, Test Content, Directory Location, Example -
PR Merged (Also run L1&L2 Tests)GPU
L4
(Perf & Integration & Accuracy)
Online & Offline: full functional scenarios + performance test + doc test<3 hour - Full Function:
- /tests/e2e/online_serving/test_{model_name}_expansion.py
- /tests/e2e/offline_inference/test_{model_name}_expansion.py
- Performance:
- /tests/dfx/perf/tests/test_qwen_omni.json (Omni), test_tts.json (TTS),
- and /tests/dfx/perf/tests/test_{diffusion_model}_vllm_omni.json (Diffusion)
- Doc Test:
- tests/example/online_serving/test_{model_name}.py
- tests/example/offline_inference/test_{model_name}.py -
- Chapter 3
- L4: Purpose, Test Content, Directory Location, Example -
NightlyGPU
L5
(Stability & Reliability)
Online & Offline: long-term stability test + reliability test Depends on reality - Stability:
- /tests/dfx/stability/tests/test_qwen3_omni.json
- /tests/dfx/stability/tests/test_wan22.json
- Reliability:
- tests/dfx/reliability/test_reliability_{model_key}.py
- (e.g. test_reliability_qwen3_omni.py, test_reliability_wan22.py) -
- Chapter 4
- L5: Purpose, Test Content, Directory Location, Example -
Weekly / Days before ReleaseGPU
- - ---- -
- The folder structure for tests file based on the 5 levels design -Legend: `✅` = test exists, `⬜` = suggested to add. -``` -vllm_omni/ tests/ -├── config/ → ├── config/ -│ ├── model.py │ └── test_model.py ⬜ -│ └── lora.py │ └── test_lora.py ⬜ -│ -├── core/ → ├── core/ -│ └── sched/ │ └── sched/ -│ ├── omni_ar_scheduler.py │ ├── test_omni_ar_scheduler.py ⬜ -│ ├── omni_generation_scheduler.py │ ├── test_omni_generation_scheduler.py ⬜ -│ └── output.py │ └── test_output.py ✅ currently in entrypoints/test_omni_new_request_data.py (tests output.OmniNewRequestData) -│ -├── diffusion/ → ├── diffusion/ -│ ├── diffusion_engine.py │ ├── test_diffusion_engine.py ⬜ -│ ├── attention/ │ ├── attention/ -│ │ ├── layer.py │ │ ├── test_attention_sp.py ✅ -│ │ └── backends/ │ │ └── test_flash_attn.py ✅ -│ ├── distributed/ │ ├── distributed/ -│ │ └── ... │ │ ├── test_comm.py ✅ -│ │ │ │ ├── test_cfg_parallel.py ✅ -│ │ │ │ └── test_sp_plan_hooks.py ✅ -│ ├── lora/ │ ├── lora/ -│ │ └── ... │ │ ├── test_base_linear.py ✅ -│ │ │ │ └── test_lora_manager.py ✅ -│ ├── models/ │ ├── models/ -│ │ ├── qwen_image/ │ │ ├── qwen_image/ (e2e coverage) -│ │ ├── z_image/ │ │ └── z_image/ -│ │ └── ... │ │ └── test_zimage_tp_constraints.py ✅ -│ └── worker/ │ └── worker/ -│ ├── diffusion_worker.py │ └── test_diffusion_worker.py ✅ file at diffusion/test_diffusion_worker.py -│ └── diffusion_model_runner.py │ -│ -├── distributed/ → ├── distributed/ -│ └── omni_connectors/ │ └── omni_connectors/ -│ ├── adapter.py │ ├── test_adapter_and_flow.py ✅ -│ ├── kv_transfer_manager.py │ ├── test_basic_connectors.py ✅ -│ ├── connectors/ │ ├── test_kv_flow.py ✅ -│ └── utils/ │ └── test_omni_connector_configs.py ✅ -│ -├── engine/ → ├── engine/ -│ ├── input_processor.py │ ├── test_input_processor.py ⬜ (no processor.py in source) -│ ├── output_processor.py │ └── test_output_processor.py ⬜ -│ └── arg_utils.py │ └── test_arg_utils.py ⬜ -│ -├── entrypoints/ → ├── entrypoints/ -│ ├── stage_utils.py │ ├── test_stage_utils.py ✅ -│ ├── cli/ │ ├── cli/ (benchmarks/test_serve_cli.py covers CLI serve) -│ │ └── ... │ │ └── test_*.py ⬜ -│ └── openai/ │ └── openai_api/ # maps to entrypoints/openai/ -│ ├── api_server.py │ ├── test_api_server.py ⬜ (e2e indirect coverage) -│ ├── serving_chat.py │ ├── test_serving_chat_sampling_params.py ✅ -│ ├── serving_speech.py │ ├── test_serving_speech.py ✅ -│ └── image_api_utils.py │ └── test_image_server.py ✅ -│ -├── inputs/ → ├── inputs/ -│ ├── data.py │ ├── test_data.py ⬜ -│ ├── parse.py │ ├── test_parse.py ⬜ -│ └── preprocess.py │ └── test_preprocess.py ✅ currently in entrypoints/test_omni_input_preprocessor.py -│ -├── model_executor/ → ├── model_executor/ -│ ├── layers/ │ ├── layers/ -│ │ └── mrope.py │ │ └── test_mrope.py ⬜ -│ ├── model_loader/ │ ├── model_loader/ -│ │ └── weight_utils.py │ │ └── test_weight_utils.py ⬜ -│ ├── models/ │ ├── models/ -│ │ ├── qwen2_5_omni/ │ │ ├── qwen2_5_omni/ -│ │ │ ├── qwen2_5_omni_thinker.py │ │ │ ├── test_audio_length.py ✅ -│ │ │ ├── qwen2_5_omni_talker.py │ │ │ ├── test_qwen2_5_omni_thinker.py ⬜ -│ │ │ └── qwen2_5_omni_token2wav.py │ │ │ ├── test_qwen2_5_omni_talker.py ⬜ -│ │ └── qwen3_omni/ │ │ │ └── test_qwen2_5_omni_token2wav.py ⬜ -│ │ └── ... │ │ └── qwen3_omni/ -│ ├── stage_configs/ │ │ └── test_*.py ⬜ -│ │ └── *.yaml │ └── stage_configs/ (used by e2e, test_*.py can be added) ⬜ -│ └── stage_input_processors/ │ └── stage_input_processors/ -│ └── ... │ └── test_*.py ⬜ -│ -├── sample/ → ├── sample/ -│ └── __init__.py │ └── test_*.py ⬜ -│ -├── utils/ → ├── utils/ -│ └── __init__.py │ └── test_*.py ⬜ (no platform_utils.py currently) -│ -├── worker/ → ├── worker/ -│ ├── gpu_ar_model_runner.py │ ├── test_gpu_ar_model_runner.py ⬜ -│ ├── gpu_ar_worker.py │ ├── test_gpu_ar_worker.py ⬜ -│ ├── gpu_generation_model_runner.py │ ├── test_gpu_generation_model_runner.py ✅ -│ ├── gpu_generation_worker.py │ ├── test_gpu_generation_worker.py ⬜ -│ ├── gpu_model_runner.py │ ├── test_omni_gpu_model_runner.py ✅ -│ └── mixins.py │ └── (npu under platforms/npu/worker/) # not worker/npu/ -│ -├── platforms/ → (no tests/platforms/, e2e and stage_configs provide indirect coverage) -│ ├── cuda/ -│ ├── npu/worker/ # NPU worker here, not vllm_omni/worker/npu/ -│ ├── rocm/ -│ └── xpu/worker/ -│ -├── outputs.py → test_outputs.py ✅ (at tests root) -├── (logger, patch, request, version) → (no corresponding unit test) -│ -└── e2e (tests side only) → ├── e2e/ - ├── online_serving/ ✅ non-empty - │ ├── test_qwen2_5_omni.py - │ ├── test_async_omni.py - │ ├── test_qwen3_omni.py - │ ├── test_qwen3_omni_expansion.py - │ ├── test_mimo_audio.py - │ ├── test_image_gen_edit.py - │ └── test_images_generations_lora.py - └── offline_inference/ ✅ - ├── test_qwen2_5_omni.py - ├── test_qwen3_omni.py - ├── test_bagel_text2img.py - ├── test_t2i_model.py - ├── test_t2v_model.py - ├── test_ovis_image.py - ├── test_zimage_tensor_parallel.py - ├── test_cache_dit.py - ├── test_teacache.py - ├── test_stable_audio_expansion.py - ├── test_diffusion_cpu_offload.py - ├── test_diffusion_layerwise_offload.py - ├── test_diffusion_lora.py - ├── test_sequence_parallel.py - └── stage_configs/ (legacy schema, still - ├── bagel_*.yaml present for unmigrated - └── npu/, rocm/, etc. models) - -# Migrated models (qwen3_omni_moe, qwen2_5_omni, qwen3_tts) live under -# vllm_omni/deploy/ instead — see docs/configuration/stage_configs.md. -``` - - -
- - -## Common Specifications - -Before entering specific testing levels, the project establishes two common specifications aimed at standardizing the development process and quickly locating issues. - -1. ***PR Checklist ([Tests Style](../ci/tests_style.md))***: This template defines the self-check items that must be completed before submitting a code review (Pull Request). It ensures that each code change meets basic requirements such as code style, dependency updates, and documentation synchronization before entering the automated testing pipeline, serving as the first manual line of defense for quality assurance. -2. ***CI Failure Explanation ([CI Failures](../ci/failures.md))***: This document archives and explains common failure patterns in the Continuous Integration (CI) pipeline, error log interpretation, and preliminary troubleshooting steps. It helps developers and testers quickly diagnose the causes of automated test failures, improving problem-solving efficiency. - -## Chapter 1: L1 & L2 Level Testing - Unit Testing and Basic End-to-End Verification - -### 1.1 Testing Purpose - -L1 and L2 level testing form the foundation of the quality assurance system. L1 level testing focuses on verifying the internal logic correctness of code units (e.g., functions, classes), ensuring each independent component behaves as designed. - -L2 level testing builds upon L1 by introducing GPU resources and verifying that the end-to-end (E2E) process of the model in basic deployment scenarios is smooth. For example, it uses dummy models to confirm that core interfaces like the inference pipeline, output format, and streaming response work properly. The common goal of these two levels is to provide developers with rapid feedback, discovering and fixing issues early in the development cycle. - - - -### 1.2 Testing Content and Scope - -- ***L1 (Unit & Logic Testing)***: -- - ***Scope***: Tests internal functions and methods of core components such as `entrypoints`, `models`. - - ***Focus***: Branch coverage, exception handling, algorithm logic correctness. Does not involve external dependencies or the complete service stack. - - ***Time Cost***: Execution time is controlled within ***15 minutes*** to ensure fast feedback. -- ***L2 (Basic End-to-End Testing)***: -- - ***Scope***: Covers two basic deployment scenarios: `online` (serving) and `offline` (inference). - - ***Focus***: Uses `dummy` models or lightweight real models to verify that the entire chain from request input to result output works normally, including output data structure, streaming (stream) support, etc. Also includes some unit tests that require launching independent service instances. - - ***Characteristic***: Requires ***GPU*** resources to perform model computations. - -### 1.3 Test Directory and Execution Files - -A clear directory structure is key to managing test cases efficiently. - -- ***L1 Test Directory***: `/tests/{component_name}/test_xxx.py` -- - Here, `{component_name}` corresponds to modules in the source code, such as `distributed`, `entrypoints`, etc., and `test_xxx.py` is the specific test file. -- ***L2 Test Directory***: -- - Online Serving: `/tests/e2e/online_serving/test_{model_name}.py` - - Offline Inference: `/tests/e2e/offline_inference/test_{model_name}.py` - -### 1.4 Execution Method and Example - -- ***Trigger Timing***: **`PR with ready label`**. That is, when a developer adds a "ready for review" or similar label to a PR on platforms like GitHub, L1 and L2 tests are automatically triggered. -- ***Execution Environment***: L1 uses ***CPU*** environment; L2 requires ***GPU*** environment. -- ***Script Example***: - -
- L1 Test Examples - -Examples from `tests/model_executor/models/qwen2_5_omni/test_audio_length.py` -```python -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -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 - - assert resolve_max_mel_frames(None, default=30000) == 30000 - assert resolve_max_mel_frames(None, default=6000) == 6000 - - -def test_resolve_max_mel_frames_explicit(): - from vllm_omni.model_executor.models.qwen2_5_omni.audio_length import resolve_max_mel_frames - - # Explicit argument always wins over default - assert resolve_max_mel_frames(123, default=30000) == 123 - assert resolve_max_mel_frames(6000, default=30000) == 6000 - assert resolve_max_mel_frames(0, default=30000) == 0 - - -@pytest.mark.parametrize("repeats", [2, 4]) -@pytest.mark.parametrize("code_len", [0, 1, 32768]) -@pytest.mark.parametrize("max_mel_frames", [None, -1, 0, 1, 6000, 30000]) -def test_cap_and_align_mel_length_no_mismatch(repeats, code_len, max_mel_frames): - """Guard that any max_mel_frames yields a mel length aligned to repeats, and - consistent with the truncated code length (prevents concat mismatch). - """ - from vllm_omni.model_executor.models.qwen2_5_omni.audio_length import cap_and_align_mel_length - - target_code_len, target_mel_len = cap_and_align_mel_length( - code_len=code_len, - repeats=repeats, - max_mel_frames=max_mel_frames, - ) - - assert isinstance(target_code_len, int) - assert isinstance(target_mel_len, int) - - if code_len == 0: - assert target_code_len == 0 - assert target_mel_len == 0 - return - - assert target_code_len >= 1 - assert target_mel_len >= repeats - assert target_mel_len % repeats == 0 - assert target_mel_len == target_code_len * repeats - assert target_code_len <= code_len - - if max_mel_frames is not None and int(max_mel_frames) > 0 and int(max_mel_frames) >= repeats: - assert target_mel_len <= int(max_mel_frames) -``` -
- -
- L2 Test Examples -You can refer to Test Examples in Chapter 2 to see example test cases that incorporate both L2 and L3 testing logic. -
- -- - ***Run Command***: - - `pytest -s -v /tests/e2e/online_serving/test_{model_name}.py` - `pytest -s -v -m 'core_model and cpu' --run-level=core_model` - -## Chapter 2: L3 Level Testing - Core Integration, Performance, and Accuracy Verification - -### 2.1 Testing Purpose - -L3 level testing executes after code is merged into the main branch. Its core purpose is to verify the integration effect, key performance indicators, and output accuracy of ***real models*** in ***multiple deployment scenarios*** - -. It acts as the "quality gatekeeper" for the main branch, ensuring that no merge breaks the core capabilities of the model service. Testing needs to provide clear conclusions within a relatively short time (<30min), balancing test depth with feedback speed. - - - -### 2.2 Testing Content and Scope - -- ***Deployment Scenarios***: Covers richer `online` and `offline` deployment configurations, which may include different hardware configurations, batch sizes, concurrency levels, etc. -- ***Core Verification***: -- 1. ***Inference Functionality***: Ensures real models can perform forward computation normally and return results. - 2. ***Accuracy Compliance***: Verifies that the model's evaluation metrics (e.g., accuracy) meet the expected baseline, preventing code changes from introducing accuracy issues. - 3. ***Important Performance***: Verifies whether performance (e.g., P99 latency, throughput) in core scenarios meets preset thresholds. - -### 2.3 Test Directory and Execution Files - -- ***Functional Testing***: -- - Online Serving: `/tests/e2e/online_serving/test_{model_name}_expansion.py` - - Offline Inference: `/tests/e2e/offline_inference/test_{model_name}_expansion.py` - - (Note: `_expansion.py` likely means it contains more comprehensive scenario cases compared to L2 tests). - -### 2.4 Execution Method and Example - -- ***Trigger Timing***: **`PR Merged`**. Automatically triggered after code review is approved and merged into the main branch. -- ***Execution Environment***: ***GPU*** servers. -- ***Script Example***: - -???+ example "Test Examples" - - **2.4.1 Mark Declaration Section** - - ```python - @pytest.mark.advanced_model - @pytest.mark.core_model - @pytest.mark.parametrize("omni_server", test_params, indirect=True) - ``` - - **Explanation**: - - @pytest.mark.advanced_model: Marks the test as L3 merge level, indicating deep validation with real models. @pytest.mark.full_model: Marks L4 nightly-only suites (e.g. `test_*_expansion.py`, doc examples). - - @pytest.mark.core_model: Marks the test as L1 or L2 level, indicating that this test case validates the basic functionality of the core model. It uses mock weights and only checks if the relevant interface functions correctly. - - @pytest.mark.parametrize: A parameterization decorator that allows abstracting test data into parameters, enabling reuse of the same test logic across different data configurations. indirect=True indicates that parameters will be passed to the fixture for processing. - - **Notes**: If you believe the test case only needs to execute basic run logic at the PR-level CI, you can mark it only with @pytest.mark.core_model. If you believe it only needs to execute deep validation at merge (L3), use @pytest.mark.advanced_model. For L4 nightly-only expansion and doc-example tests, use @pytest.mark.full_model with `--run-level full_model`. If the test case needs both basic run and deep validation, mark with @pytest.mark.core_model and the appropriate L3/L4 marker (`advanced_model` and/or `full_model`). - - **2.4.2 Test Function Definition and Documentation** - - ```python - def test_mix_to_text_audio_001(omni_server, openai_client) -> None: - """ - Test multi-modal input processing and text/audio output generation via OpenAI API. - Deploy Setting: default yaml - Input Modal: text + audio + video + image - Output Modal: text + audio - Input Setting: stream=True - Datasets: single request - """ - ``` - - **Explanation**: - - **Function Naming Convention**: Uses the test_ prefix, describes the test scenario mix_to_text_audio, and the number 001 indicates the first test case for this scenario. - - **Parameter Explanation**: - - omni_server: Omni server instance obtained via fixture, containing model information and configuration. - - openai_client: Unified OpenAI client processing instance, encapsulating request sending and response validation logic. - - Docstring: Describes the test purpose, deployment settings, input/output modalities, streaming settings, and dataset type in detail, providing clear context for test maintenance. - - **2.4.3 Multimodal Data Preparation** - - ```python - video_data_url = f"data:video/mp4;base64,{generate_synthetic_video(224, 224, 300)['base64']}" - image_data_url = f"data:image/jpeg;base64,{generate_synthetic_image(224, 224)['base64']}" - audio_data_url = f"data:audio/wav;base64,{generate_synthetic_audio(5, 1)['base64']}" - ``` - - **Explanation**: - - **Data Generation Functions**: Use the generate_synthetic_* series of functions to generate synthetic test data, avoiding reliance on external resources and ensuring test reproducibility and stability. - - **Parameter Explanation**: - - Video: width, height, duration_frames - - Image: width, height - - Audio: duration_seconds, channels - - **2.4.4 Request Configuration and Keyword Validation** - - ```python - request_config = { - "model": omni_server.model, - "messages": messages, - "stream": True, - "key_words": { - "audio": ["water", "cricket"], - "video": ["sphere", "globe", "circle", "round"], - "image": ["square", "quadrate"], - "text": ["beijing"] - }, - } - ``` - - **Explanation**: - - **Model Specification**: Uses omni_server.model to ensure the test aligns with the model configured on the server. - - **Keyword Validation Mechanism**: This is an innovative design of the template to address the specific needs of multimodal testing: - - Audio Keywords: Validate whether the generated text's description of audio content contains expected elements (e.g., "water" for water sounds, "cricket" for cricket sounds). If you provide multiple keywords, the validation is considered successful if at least one keyword is present. - - **Video Keywords**: Validate whether the generated text's description of video content contains expected elements. If you provide multiple keywords, the validation is considered successful if at least one keyword is present. - - Image Keywords: Validate whether the generated text's description of image content contains expected elements. If you provide multiple keywords, the validation is considered successful if at least one keyword is present. - - Text Keywords: Validate whether the generated text contains expected elements. If you provide multiple keywords, the validation is considered successful if at least one keyword is present. - - **2.4.5 Request Execution** - - ```python - openai_client.send_omni_request(request_config, request_num=1) # for omni-understanding models - # or - openai_client.send_diffusion_request(request_config, request_num=1) # for diffusion models - ``` - - **Explanation**: - - **Unified Client**: Uses the OpenAIClientHandler instance to send requests. This client encapsulates error handling, retry mechanisms, and response validation logic. - - **Single Request**: The comment clearly states this is a single-request completion test. For concurrent testing, it can be extended to multiple requests using request_num = n. - - **Implicit Validation**: The `send_omni_request` and `send_diffusion_request` methods internally includes validation logic dynamically selected based on the --run-level parameter: core_model performs basic validation, while advanced_model and full_model perform deep validation. - -- ***Run Command (L3 merge)***: `pytest -s -v /tests/e2e/online_serving/test_{model_name}.py -m advanced_model --run-level=advanced_model` - -- ***Run Command (L4 nightly expansion)***: `pytest -s -v /tests/e2e/online_serving/test_{model_name}_expansion.py -m full_model --run-level=full_model` - -## Chapter 3: L4 Level Testing - Full Functionality, Performance, and Documentation Testing - -### 3.1 Testing Purpose - -L4 level testing is a comprehensive quality audit before a version release. It expands upon L3, executing ***full*** functional scenarios, conducting systematic ***performance stress tests***, and simultaneously verifying the correctness of accompanying ***example documentation***. Its purpose is to perform deep validation of the system during off-peak nighttime hours, providing quality trend reports for daytime development and data support for release decisions. - - - -### 3.2 Testing Content and Scope - -- ***Full Functionality Testing***: Executes all test cases defined in `test_{model_name}_expansion.py`, covering all implemented features, positive flows, boundary conditions, and exception handling. -- ***Performance Testing***: Uses `tests/dfx/perf/tests/test_qwen_omni.json`, `tests/dfx/perf/tests/test_tts.json`, and diffusion configs in the form `tests/dfx/perf/tests/test_*_vllm_omni.json` (passed to `run_benchmark.py` via `--test-config-file`) to drive performance testing tools for stress, load, and endurance tests, collecting metrics like throughput, response time, and resource utilization. -- ***Documentation Testing***: Verifies whether the example code provided to users is runnable and its results match the description. - -### 3.3 Test Directory and Execution Files - -- ***Functional Testing***: Same directories as L3. -- ***Performance Test Configuration***: `tests/dfx/perf/tests/test_qwen_omni.json`, `tests/dfx/perf/tests/test_tts.json`, and diffusion configs `tests/dfx/perf/tests/test_*_vllm_omni.json` (e.g. `test_qwen_image_vllm_omni.json`) -- ***Documentation Example Tests***: -- - `tests/example/online_serving/test_{model_name}.py` - - `tests/example/offline_inference/test_{model_name}.py` - -### 3.4 Execution Method and Example - -- ***Trigger Timing***: **`Nightly`**, automatically executed every night. -- ***Execution Environment***: ***GPU*** server clusters to meet the resource demands of performance testing. -- ***Script Example***: - -??? example "Test Examples: Documentation Example Tests" - - --8<-- "docs/contributing/ci/test_examples/l4_doc_example_tests.inc.md" - -??? example "Test Examples: Performance Tests" - - --8<-- "docs/contributing/ci/test_examples/l4_performance_tests.inc.md" - -??? example "Test Examples: Functionality Tests" - - --8<-- "docs/contributing/ci/test_examples/l4_functionality_tests.inc.md" - -- ***Run Command***: (Specific commands would depend on the performance testing tool and configuration defined in `nightly.json`). - -## Chapter 4: L5 Level Testing - Stability and Reliability Testing - -### 4.1 Testing Purpose - -L5 level testing focuses on the performance of model services under ***long-running*** and ***abnormal fault*** scenarios. It aims to uncover deep-seated issues that only manifest under sustained pressure or extreme conditions, such as memory leaks, resource contention, gradual performance degradation, and lack of fault tolerance mechanisms. This is the final, yet crucial, line of defense for ensuring service high availability and production environment robustness. - - - -### 4.2 Testing Content and Scope - -- ***Long-term Stability (Stability) Testing***: Uses JSON under `tests/dfx/stability/tests/` (for example `test_qwen3_omni.json` and `test_wan22.json`) to run the service under moderate load for an extended period (e.g., over 12 hours), monitoring whether metrics like memory/VRAM usage, response time, and throughput degrade over time, and whether the service process remains stable. -- ***Reliability Testing***: Uses pytest suites under `tests/dfx/reliability/` to inject controlled faults against a **live** `vllm_omni serve` instance (same **`omni_server` / `omni_server_function`** fixture style as E2E). Current suites emphasize **GPU memory pressure** (CUDA sidecar “memory hog”), **worker / runtime process kill** (`SIGKILL` on `VLLM::Worker` for Qwen3-Omni or `multiprocessing.spawn` for Wan2.2 video workers), **large multimodal chat** or **`/v1/videos`** jobs under OOM, **`/health` → 503** and **fast-fail / non-hanging concurrent** requests after kill, and **OpenAI-style 5xx error contracts** (e.g. text vs text+audio under OOM). **Post-fault recovery** checks exist where enabled (some cases may be `skip` while issues are tracked). See the Reliability `
` block in Section 4.4 for file-level responsibilities and CI markers (`slow`, `hardware_test`, POSIX-only kill). - -### 4.3 Test Directory and Execution Files - -- ***Stability Test Configuration***: `tests/dfx/stability/tests/test_qwen3_omni.json`, `tests/dfx/stability/tests/test_wan22.json` (one JSON per model / runner family) -- ***Reliability Test Suite*** (`tests/dfx/reliability/`): - - `test_reliability_qwen3_omni.py` — Qwen3-Omni chat / multimodal reliability (GPU OOM, process kill, recovery, error contract under `--async-chunk` vs default). - - `test_reliability_wan22.py` — Wan2.2 T2V video API reliability (`/v1/videos` under OOM and process kill, recovery). - - `helpers.py` — Shared primitives used by current suites: raw HTTP probes for `/v1/chat/completions` and `/health`, OpenAI-style error parsing, GPU OOM sidecar (`inject_gpu_oom` / `stop_gpu_oom_hogs`), and `pgrep`-based process-kill injector construction (`make_process_kill_fault_injector`). - - `conftest.py` — `fault_injector` and `omni_server_after_fault` / `omni_server_after_fault_function` fixtures to run a callable **after** the server is ready. - - `README.md` — Short local run commands for this directory. - -### 4.4 Execution Method and Example - -- ***Trigger Timing***: **`Weekly`** (weekly) or **`Days before Release`** (several days before a major release). Due to long execution times, the frequency is lower. -- ***Execution Environment***: ***GPU*** servers, requiring a stable and exclusive testing environment. -- ***Script Example***: -
- Test Examples - -When you want to add L5-level stability test cases, add or extend the appropriate JSON file under `tests/dfx/stability/tests/` (for example `test_qwen3_omni.json` for Omni bench traffic, or `test_wan22.json` for diffusion `/v1/videos` workloads). The following illustrates the Qwen3-Omni shape: - -```json -{ - "test_name": "test_qwen3_omni_stability", - "server_params": { - "model": "Qwen/Qwen3-Omni-30B-A3B-Instruct", - "stage_config_name": "qwen3_omni.yaml" - }, - "benchmark_params": [ - { - "dataset_name": "random", - "backend": "openai-chat-omni", - "endpoint": "/v1/chat/completions", - "duration_sec": 43200, - "request_rate": 0.5, - "num_prompts_per_batch": 20, - "random_input_len": 2500, - "random_output_len": 900, - "ignore_eos": true, - "percentile-metrics": "ttft,tpot,itl,e2el,audio_rtf,audio_ttfp,audio_duration" - } - ] -} -``` - -#### Parameter Explanation - -***Overview*** - -| Field | Required | Description | -| ---------------- | -------- | --------------------------------------------------------------------------- | -| test_name | Yes | Unique identifier for the stability test case | -| server_params | Yes | Server-side configuration parameters (model, stage configuration, etc.) | -| benchmark_params | Yes | Stability benchmark running parameters (supports multiple configurations) | - -#### server_params Configuration - -##### Basic Parameters - -| Parameter | Required | Example | Description | -| ----------------- | -------- | ---------------------------------- | ----------------------------------- | -| model | Yes | "Qwen/Qwen3-Omni-30B-A3B-Instruct" | Model name or path | -| stage_config_name | Yes | "qwen3_omni.yaml" | Stage configuration file name | - -##### Dynamic Configuration (update/delete) - -Supports incremental modifications based on the basic configuration: - -| Operation | Description | -| --------- | ------------------------------------ | -| update | Update or add configuration items | -| delete | Delete specified configuration items | - -***Example***: -You can refer to Test Examples in Chapter 3.4 - -#### benchmark_params Configuration - -For stability testing, the key parameters are: - -- **duration_sec**: Total duration (in seconds) during which benchmark traffic is sent. The stability benchmark will keep sending batches until this duration is reached. -- **request_rate** / **max_concurrency**: Exactly one of them must be specified. They control how the traffic is generated for each batch: - - `request_rate`: Number of requests per second. The benchmark will send `num_prompts_per_batch` requests at the given rate. - - `max_concurrency`: Maximum number of concurrent requests. When this is used, `request_rate` is set to `inf` internally. -- **num_prompts_per_batch**: Number of prompts sent in each batch. Multiple batches will be executed sequentially within `duration_sec`. - -All other optional parameters follow the same rules as the in Chapter 3.4. - -
- -
- Reliability test suite (tests/dfx/reliability) - -#### Purpose and relationship to stability - -Reliability tests are **short fault-injection** integration runs (L5 **(b)** in `tests/dfx/reliability/README.md`). They complement **stability** JSON-driven long runs: instead of hours of steady traffic, they **perturb** the server (GPU OOM sidecar, fatal signals on selected processes) and check **failure mode** and **latency bounds** (e.g. chat or `/v1/videos` must not hang under concurrent fault-time load). - -#### Directory layout - -| Path | Responsibility | -| ---- | -------------- | -| `helpers.py` | Shared helpers used by current reliability suites: raw `POST`/`GET` probes (`/v1/chat/completions`, `/health`), OpenAI error parsing (`extract_openai_error_contract_from_bytes`), GPU OOM sidecar lifecycle (`inject_gpu_oom`, `stop_gpu_oom_hogs`), and process-kill injector builder (`make_process_kill_fault_injector`). | -| `conftest.py` | Pytest fixtures: indirect `fault_injector`, `omni_server_after_fault` / `omni_server_after_fault_function` (run injector after server is ready, then yield server). | -| `test_reliability_qwen3_omni.py` | Qwen3-Omni: OOM vs **text vs text+audio** error contract, large multimodal chat under OOM, concurrent pressure, **SIGKILL** on `VLLM::Worker`, `/health` → 503 + fast-fail + concurrent chat; optional OOM recovery scenario (may be skipped while tracked in issues). | -| `test_reliability_wan22.py` | Wan2.2 T2V: large `/v1/videos` under OOM, **SIGKILL** on `multiprocessing.spawn` chain, health / fast-fail / concurrent video requests; optional recovery test (may be skipped). | -| `README.md` | Minimal run / collect examples. | - -#### Parametrization and markers - -- Each test module defines a **`RELIABILITY_SCENARIOS`** list (`test_name`, `server_params`: model, `stage_config_name` or diffusion `server_args`, etc.). **`create_reliability_omni_server_params()`** in `tests/dfx/conftest.py` resolves stage paths (including XPU substitutions where applicable) and builds **`OmniServerParams`** lists consumed by **`@pytest.mark.parametrize(..., indirect=True)`** on `omni_server` or `omni_server_function`. -- Cases are tagged **`@pytest.mark.slow`** for weekly / selective CI. GPU-heavy suites use **`@hardware_test(res={"cuda": "H100"}, num_cards=...)`** (Qwen3-Omni paths often require **2** cards; Wan2.2 video paths **1** card). -- **Process-kill** tests use **`@pytest.mark.skipif(os.name == "nt", ...)`** because injection uses POSIX **`pgrep` / `kill`**. - -#### CI trigger - -Weekly Buildkite (`.buildkite/test-weekly.yml`) runs, for example: - -```bash -pytest -s -v tests/dfx/reliability/test_reliability_qwen3_omni.py -m "slow" -pytest -s -v tests/dfx/reliability/test_reliability_wan22.py -m "slow" -``` - -#### Local commands - -```bash -pytest --collect-only tests/dfx/reliability -pytest -s -v tests/dfx/reliability/test_reliability_qwen3_omni.py -m slow -pytest -s -v tests/dfx/reliability/test_reliability_wan22.py -m slow -``` - -#### Adding a new model suite - -1. Add `test_reliability_.py` under `tests/dfx/reliability/`. -2. Define **`RELIABILITY_SCENARIOS`** and pass them through **`create_reliability_omni_server_params()`** with the correct deploy or e2e stage-config directory (same pattern as existing files). -3. Reuse **`helpers`** for OOM / kill / raw HTTP; prefer **`assert_fault_exception()`** and **`resolve_oom_device_spec()`** from `tests/dfx/conftest.py` for consistent device selection vs stage YAML. -4. Register **`slow`** (and **`hardware_test`** if needed); extend **`.buildkite/test-weekly.yml`** when the suite should run in weekly L5. - -
- -- - ***Stability***: `pytest -s -v tests/dfx/stability/scripts/test_stability_qwen3_omni.py` or `pytest -s -v tests/dfx/stability/scripts/test_stability_wan22.py` (or add `test_stability_.py` alongside a matching JSON config) - - ***Reliability***: `pytest -s -v tests/dfx/reliability/test_reliability_qwen3_omni.py -m slow` and/or `pytest -s -v tests/dfx/reliability/test_reliability_wan22.py -m slow` (add `test_reliability_.py` for new models) - -## Summary - -This multi-level testing system achieves continuous, progressive validation of model service quality by tightly integrating testing activities with the development workflow (commit, review, merge, release). From rapid unit testing to comprehensive end-to-end testing, and further to in-depth performance, stability, and reliability verification, each level has clear objectives, collectively building a robust quality protection net. By following this system, teams can deliver high-quality, highly reliable model services more efficiently. diff --git a/docs/contributing/ci/failures.md b/docs/contributing/ci/failures.md deleted file mode 100644 index 68e468be1df..00000000000 --- a/docs/contributing/ci/failures.md +++ /dev/null @@ -1,106 +0,0 @@ -# CI Failures - -## Overview of CI Checks - -When you open a PR against vLLM-Omni, several CI checks run automatically: - -| Check | Platform | What it does | -| ----- | -------- | ------------ | -| **pre-commit** | GitHub Actions | Runs linting (Ruff), formatting, spell-checking (typos), and YAML validation. | -| **Build Wheel** | GitHub Actions | Builds Python wheels for Python 3.11 and 3.12 on Ubuntu. Skipped for docs-only or Markdown-only changes (controlled by `paths-ignore` in the workflow). | -| **DCO** | GitHub | Verifies every commit has a `Signed-off-by` line. | -| **docs/readthedocs.org:vllm-omni** | Read the Docs | Builds the MkDocs documentation site. | -| **buildkite/vllm-omni** | Buildkite | Runs GPU-based tests on NVIDIA CUDA hardware (L4, H100). | -| **buildkite/vllm-omni-amd** | Buildkite | Runs GPU-based tests on AMD ROCm hardware (MI325). | -| **buildkite/vllm-omni-intel** | Buildkite | Runs GPU-based tests on Intel XPU hardware (Intel Arc BMG). | - -## Step 1: Identify the Failing Check - -Click the **Details** link next to the failing check on your PR to open the build log. The most common failures fall into these categories: - -### pre-commit failures - -These are typically formatting or linting issues introduced by your PR. Fix them locally: - -```bash -uv pip install pre-commit -pre-commit run --all-files -``` - -Then commit the fixes and push. - -### DCO failures - -Every commit must include a `Signed-off-by` line. If you forgot, amend your commits: - -```bash -git commit --amend -s -git push --force-with-lease -``` - -For multiple commits, use an interactive rebase to add the sign-off to each one. - -### Read the Docs failures - -The documentation build uses MkDocs with `fail_on_warning: true`, so even a minor warning (not just errors) will cause the build to fail. To reproduce locally: - -```bash -uv pip install -e ".[docs]" -mkdocs build --strict -``` - -Common causes include broken cross-references, invalid admonition syntax, or missing files referenced by `--8<--` includes. - -### Buildkite failures - -Buildkite runs GPU tests in Docker containers. These are the most complex checks and can fail for reasons unrelated to your PR (infrastructure issues, flaky tests, etc.). See the sections below for how to investigate. - -## Step 2: Check if the Failure Is a Known Issue - -Before spending time debugging, check whether the failure already exists on the `main` branch: - -1. **Look at the Buildkite build log** — the test name and error message are usually enough to identify the issue. -2. **Check recent CI runs on `main`** — if the same test is failing there, the failure is not caused by your PR. -3. **Search existing issues** — look for open issues in the [vllm-omni issue tracker](https://github.com/vllm-project/vllm-omni/issues) with the test name or error message. - -If the failure is already tracked, leave a comment on your PR noting that the failure is pre-existing and link the issue. - -## Step 3: Investigate the Failure - -If the failure appears to be new, investigate whether your changes caused it. - -### Reading Buildkite Logs - -1. Click **Details** next to the Buildkite check on your PR. -2. Find the failing step in the pipeline (e.g., "Diffusion Model Test", "Simple Unit Test"). -3. Expand the step to see the full test output with the traceback. - -### Running Tests Locally - -For instructions on running tests locally (including specific test files, functions, and markers), see the [Running Tests](https://docs.vllm.ai/projects/vllm-omni/en/latest/contributing/ci/test_guide/#running-tests) section in the Test Guide. - -## Step 4: Raise an Issue or Fix It - -### If the failure is pre-existing (not caused by your PR) - -1. **Raise a new issue** if one doesn't already exist, using the title format: - `[CI Failure]: [job-name] - [test-path]` -2. Include the error message, relevant log excerpts, and the commit hash where the failure occurs (e.g., "Still failing on main as of commit `abc1234`"). -3. Leave a comment on your PR linking to the issue and noting that the failure is unrelated to your changes. - -### If the failure is caused by your PR - -1. Fix the issue in your branch and push the update. -2. If the fix is non-trivial, consider adding a test to prevent regression. - -## Common Failure Patterns - -| Symptom | Likely Cause | Fix | -| ------- | ------------ | --- | -| `ruff` or formatting errors | Code style violation | Run `pre-commit run --all-files` | -| `Signed-off-by` missing | DCO check | Amend commits with `git commit --amend -s` | -| MkDocs build warning | Broken docs reference | Run `mkdocs build --strict` locally | -| `OOM` or `CUDA out of memory` | Test exceeds GPU memory | Check if your changes increased memory usage; use `--vae_use_slicing` / `--vae_use_tiling` for diffusion tests | -| Import errors | Missing or changed dependency | Check `pyproject.toml` and make sure dependencies are correct | -| Timeout (step exceeded N minutes) | Test is too slow or hangs | Profile the test; check for infinite loops or deadlocks | -| `Agent lost` in Buildkite | Infrastructure issue (not your fault) | Re-trigger the build; comment on your PR | diff --git a/docs/contributing/ci/test_examples/l4_doc_example_tests.inc.md b/docs/contributing/ci/test_examples/l4_doc_example_tests.inc.md deleted file mode 100644 index 13dd032e275..00000000000 --- a/docs/contributing/ci/test_examples/l4_doc_example_tests.inc.md +++ /dev/null @@ -1,49 +0,0 @@ -**Preferred Test Strategy** - -Use one of the following patterns depending on page type: - -- **Dynamic code-block extraction (preferred for offline docs)** - - Extract Python/Bash code blocks from markdown AST analyzer, then execute them directly in tests. - - Benefit: test logic stays automatically aligned with docs. - - Basic idea: Use `ReadmeSnippet.extract_readme_snippets` to extract a list of code blocks as a global variable in file, - use this list as `pytest.mark.parametrize` parameters, and pass each snippet item to `example_runner.run` inside the parametrized test. - Additionally pass an `output_subfolder` argument for the 2nd-level output folder explained in **Output Directory Structure** below. - If any extra environment variable is need for a test (e.g., the example script reads it), `example_runner.run` also accepts a 3rd `env` parameter. - - See [tests/examples/offline_inference/test_text_to_image.py](https://github.com/vllm-project/vllm-omni/blob/main/tests/examples/offline_inference/test_text_to_image.py) for reference implementation. - -- **Explicit copied scripts (used by online docs for now until further update)** - - For online serving pages, it is acceptable to copy code from docs into dedicated test functions, because only client-side, request-sending scripts are tested. - - Benefit: dynamic extraction is overly complex: need to tell server-launch and client-request scripts. - - Requirement: copied test code must be kept in sync with doc updates. - -**Test Case Naming Convention** - -- Dynamic code extraction (auto-generated internally): - - `test_{single_function_name_matching_file_name}[h2_heading_00X]` - - Example: `test_text_to_image[basic_usage_001]` -- Explicit copied scripts: - - `test_{h2_heading_00X}[{dummy_param_id_for_omni_server}]` - - Example: `test_api_calls_001[omni_server0]` - -**Runtime Configuration** - -In the example code tests, do **not** reduce `num_inference_steps` just to speed up the tests unless there is a strong CI reliability reason to do otherwise. - -**Skipping Rules** - -You may skip examples falling in the following categories using `pytest.mark.skip` or `pytest.skip`: - -- Gradio UI scripts -- Scenarios that significantly overlap with existing tests and add little new coverage. - -**Output Directory Structure** - -Use a three-layer output structure to store output artifacts: - -1. Root output directory - - Auto-detected from `OUTPUT_DIR` env var or auto-generated under `/tmp`. -2. Doc-page directory - - Define and use a clear page-level folder name in each `test_*.py` yourself (abbreviations are acceptable, e.g., `example_offline_t2i`). -3. Test-case directory - - Must match the case identifier (e.g., `basic_usage_001`). - - Auto-generated for dynamic extracted tests. diff --git a/docs/contributing/ci/test_examples/l4_functionality_tests.inc.md b/docs/contributing/ci/test_examples/l4_functionality_tests.inc.md deleted file mode 100644 index 688933f135d..00000000000 --- a/docs/contributing/ci/test_examples/l4_functionality_tests.inc.md +++ /dev/null @@ -1,46 +0,0 @@ -**Scope** - -For diffusion models, the L4 functionality test covers all or common *diffusion features* that are supported by this model, including several [parallelism acceleration methods](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/diffusion/parallelism_acceleration/), [CPU offloading](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/diffusion/cpu_offload_diffusion/), [TeaCache](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/diffusion/teacache/) and [Cache-DiT](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/diffusion/cache_dit_acceleration/) cache backends, [quantization methods](https://docs.vllm.ai/projects/vllm-omni/en/latest/user_guide/quantization/overview/). - -**Test Case Design** - -For a *high priority* model (currently listed in [issue #1832](https://github.com/vllm-project/vllm-omni/issues/1832)), we use several test cases, each with multiple features turned on, so that each supported feature is tested in at least one test case. This is to relieve the GPU workload on the CI machine. The suggested test case combination is as follows: - -- If the model can fit into 4 L4 GPU (with quantization and tensor parallel always on) (20GB RAM each) - - (1 GPU) TeaCache + Layerwise CPU offloading + GGUF - - (4 GPUs) CacheDiT + Ulysses=2 + TP=2 + VAE=2 + FP8 - - (4 GPUs) CacheDiT + Ring=2 + HSDP=2 + VAE=2 + GGUF - - (4 GPUs) TeaCache + CFG=2 + TP=2 + VAE=2 + FP8 -- Otherwise, consider 2 H100 GPU environment (80GB RAM each) with the following tests - - (1 GPU) TeaCache + Layerwise CPU offloading + GGUF - - (2 GPUs) CacheDiT + Ulysses=2 + FP8 - - (2 GPUs) CacheDiT + Ring=2 + GGUF - - (2 GPUs) TeaCache + CFG=2 + FP8 - - (2 GPUs) CacheDiT + TP=2 + VAE=2 + FP8 - - (2 GPUs) CacheDiT + HSDP=2 + VAE=2 + GGUF -- If 2 H100 GPU cannot handle the model either (e.g., HunyuanImage 3.0) - - Still design tests and feature combinations that can best fit real-world scenario. - - Do not include it in CI (or exclude it from the CI's filtering criteria). Instead, relevant PR authors are suggested to run these tests locally. -- Fallback plan - - If the model does not support layerwise CPU offloading, replace the corresponding test case with module-wise offloading - - If the model only supports specific or no caching feature, use this option or remove this option in all test cases. - - If the model only supports specific or no quantization feature, use this option or remove this option in all test cases. - - If the model does not support certain other features, remove this option from that test case. If, consequently, the coverage of this modified test case completely overlaps with others, remove this test case. - -For a *normal priority* model, further reduce the number of test cases. - -- Only write one or two test cases for the most common feature combinations. -- The author can explore themselves to see which feature combination balances output quality and performance. Alternatively, the author can refer to any example code in the PR that adds the model, or the example code in the PR that adds a feature (if the code involves this model of interest). - -Currently all the features are available in online serving mode. Hence, only need to add `tests/e2e/online_serving/test_{model}_expansion.py`. - -**Code Style** - -- Validation: test that the multimodal output files of your model have the correct shapes. `OpenAIClientHandler.send_diffusion_request` should have taken care of this. -- Test marks: always add `full_model` and `diffusion` for L4 nightly `test_*_expansion.py` cases. Add GPU-related marks if needed. Ref: [Markers for Tests](https://docs.vllm.ai/projects/vllm-omni/en/latest/contributing/ci/tests_markers/). -- To maximize code reuse, you may refer to - - `tests/conftest.py` for `omni_server` (running server in subprocess) and `openai_client` fixtures (sending requests and validating output), `generate_synthetic_image` and `assert_XXX_valid` helper. - - `tests/helpers/mark.py` for `@hardware_test(...)` and `hardware_marks`. - - [Parametrizing tests (pytest doc)](https://docs.pytest.org/en/stable/example/parametrize.html) to reuse test function implementation for different cases. -- Doc: add a concise docstring for each test function. -- Reference L4 test implementation: [tests/e2e/online_serving/test_qwen_image_edit_expansion.py](https://github.com/vllm-project/vllm-omni/blob/main/tests/e2e/online_serving/test_qwen_image_edit_expansion.py). diff --git a/docs/contributing/ci/test_examples/l4_performance_tests.inc.md b/docs/contributing/ci/test_examples/l4_performance_tests.inc.md deleted file mode 100644 index f1f3073dc52..00000000000 --- a/docs/contributing/ci/test_examples/l4_performance_tests.inc.md +++ /dev/null @@ -1,89 +0,0 @@ -When you want to add L4-level ***performance test*** cases, you can refer to the following format for case addition in `tests/dfx/perf/tests/test_qwen_omni.json`, `tests/dfx/perf/tests/test_tts.json`, or diffusion configs such as `tests/dfx/perf/tests/test_*_vllm_omni.json` (selected via `pytest ... run_benchmark.py --test-config-file `): - -```JSON -{ - "test_name": "test_qwen3_omni", - "server_params": { - "model": "Qwen/Qwen3-Omni-30B-A3B-Instruct", - "stage_config_name": "qwen3_omni.yaml" - }, - "benchmark_params": [ - { - "dataset_name": "random", - "num_prompts": [10, 20], - "max_concurrency": [1, 4], - "random_input_len": 2500, - "random_output_len": 900, - "ignore_eos": true, - "percentile-metrics": "ttft,tpot,itl,e2el,audio_rtf,audio_ttfp,audio_duration", - "baseline": { - "mean_ttft_ms": [500, 800], - "mean_audio_ttfp_ms": [2000, 3500], - "mean_audio_rtf": [0.25, 0.35] - } - } - ] -} -``` - -**Parameter Explanation** - -*Overview* - -| Field | Required | Description | -| ---------------- | -------- | --------------------------------------------------------------- | -| test_name | Yes | Unique identifier for the test case | -| server_params | Yes | Server-side configuration parameters | -| benchmark_params | Yes | Benchmark running parameters (supports multiple configurations) | - -**`server_params` Configuration** - -*Basic Parameters* - -| Parameter | Required | Example | Description | -| ----------------- | -------- | ---------------------------------- | ----------------------------- | -| model | Yes | "Qwen/Qwen3-Omni-30B-A3B-Instruct" | Model name or path | -| stage_config_name | Yes | "qwen3_omni.yaml" | Stage configuration file name | - -*Dynamic Configuration (update/delete)* - -Supports incremental modifications based on the basic configuration: - -| Operation | Description | -| --------- | ------------------------------------ | -| update | Update or add configuration items | -| delete | Delete specified configuration items | - -**Example**: - -``` -"update": { - "async_chunk": true, // Enable asynchronous chunk processing - "stage_args": { - "0": { - "engine_args.custom_process_next_stage_input_func": "vllm_omni.model_executor.stage_input_processors.qwen3_omni.thinker2talker_async_chunk" - } - } -}, -"delete": { - "stage_args": { - "2": ["custom_process_input_func"] // Delete this configuration for stage 2 - } -} -``` - -**`benchmark_params` Configuration** - -You can add any benchmark running parameters you need here. For all optional parameters, refer to the [benchmark documentation](https://github.com/vllm-project/vllm-omni/blob/main/docs/cli/bench/serve.md). General modifications are as follows: - -1. Change the --xxx-xx-xx running parameters to xxx_xx_xx format and fill them as keys in the JSON file. -2. For boolean variables in the running parameters, modify them to forms such as ignore_eos: true/false and fill them into the JSON file. -3. Optionally add a `baseline` object (see **Baseline thresholds** below). If you omit `baseline` or leave it empty, the performance test still runs but does not assert metric thresholds from this field. -4. The qps and concurrency modes are recommended to be mutually exclusive. For detailed explanations, see the table below: - -| Parameter | Type | Required | Example/Values | Description | -| --------------- | ----------- | -------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| num_prompts | int / array | Yes | 10,[10, 20, 30] | Number of requests. Supports single values or arrays. If a single value is used, it will be automatically expanded to match the number of qps or max_concurrency, e.g., [10,10,10]. If an array is used, its length must match the number of qps or max_concurrency. | -| request_rate | float / array | No | 0.5, [0.5, 1, inf] | Queries per second. Supports single values or arrays. If a single value is used, it will be automatically expanded to match the number of num_prompts, e.g., [1,1,1]. If an array is used, its length must match the number of num_prompts. | -| max_concurrency | int / array | No | 1, [1, 2, 3] | Maximum concurrent in-flight requests. Same array / expansion rules as `request_rate` (mutually exclusive with QPS mode). | -| baseline | object | No | see above | Optional per-metric thresholds; keys must match benchmark output fields. Scalar, list (per sweep step), or object (keyed by concurrency or QPS string). diff --git a/docs/contributing/ci/test_guide.md b/docs/contributing/ci/test_guide.md deleted file mode 100644 index 018c47b053f..00000000000 --- a/docs/contributing/ci/test_guide.md +++ /dev/null @@ -1,106 +0,0 @@ -# Test Guide -## Setting Up the Test Environment -### Creating a Container -vLLM-Omni provides an official Docker image for deployment. These images are built upon vLLM Docker images and are available on [Docker Hub](https://hub.docker.com/r/vllm/vllm-omni/tags). The version of vLLM-Omni indicates which vLLM release it is based on. -For a local test environment, you can follow the steps below to create a container: -## Installing Dependencies -### vLLM & vLLM-Omni -vLLM-Omni is built based on vLLM. You can follow [install guide](../../getting_started/installation/README.md) to build your local environment. - -### Test Case Dependencies -When running test cases, you may need to install the following dependencies: - -```bash -uv pip install ".[dev]" -apt-get install -y ffmpeg -``` - -## Running Tests -Our test scripts use the pytest framework. First, please use `git clone https://github.com/vllm-project/vllm-omni.git` to download the vllm-omni source code. Then, in the root directory of vllm-omni, you can run the following commands in your local test environment to execute the corresponding test cases. - -=== "L1 level" - - ```bash - cd tests - pytest -s -v -m "core_model and cpu" - ``` - The latest test command is available in the "Simple Unit Test" step of this [pipeline](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/test-ready.yml). - -=== "L2 level" - - ```bash - cd tests - pytest -s -v -m "core_model and not cpu" --run-level=core_model - ``` - If you only want to run a specific test case, you can use: - ```bash - pytest -s -v test_xxxx.py --run-level=core_model - ``` - If you only want to run specific test cases on a particular platform, you can use: - ```bash - pytest -s -v -m "core_model and distributed_cuda and L4" --run-level=core_model - ``` - The latest test commands for various test suites can be found in the [pipeline](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/test-ready.yml). - -=== "L3 level" - - ```bash - pytest -s -v -m "advanced_model" --run-level=advanced_model - ``` - If you only want to run a specific test case, you can use: - ```bash - pytest -s -v test_xxxx.py --run-level=advanced_model - ``` - If you only want to run specific test cases on a particular platform, you can use: - ```bash - pytest -s -v -m "advanced_model and distributed_cuda and L4" --run-level=advanced_model - ``` - The latest L3 test commands for various test suites can be found in the [pipeline](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/test-merge.yml). - - -=== "L4 level" - - ```bash - cd tests - pytest -s -v -m "full_model" --run-level=full_model - ``` - If you only want to run a specific test case, you can use: - ```bash - pytest -s -v test_xxxx.py --run-level=full_model - ``` - If you only want to run specific test cases on a particular platform, you can use: - ```bash - pytest -s -v -m "full_model and distributed_cuda and L4" --run-level=full_model - ``` - Note: To run performance tests (defaults to ``test_qwen_omni.json``; use ``--test-config-file tests/dfx/perf/tests/test_tts.json`` for TTS): - ```bash - pytest -s -v tests/dfx/perf/scripts/run_benchmark.py - ``` - The latest L4 (nightly) test commands use the `full_model` marker and `--run-level full_model` (see [test-nightly.yml](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/test-nightly.yml) and [test-nightly-diffusion.yml](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/test-nightly-diffusion.yml)). Example: - - ```bash - cd tests - pytest -s -v -m "full_model and omni and H100" --run-level=full_model - ``` - -=== "L5 level" - - L5 includes stability and reliability testing. Typical commands: - - ```bash - cd tests - - # Stability: Qwen3-Omni - pytest -s -v dfx/stability/scripts/test_stability_qwen3_omni.py - - # Stability: Wan2.2 (v1/videos diffusion benchmark loop) - pytest -s -v dfx/stability/scripts/test_stability_wan22.py - - ``` - - The latest L5 commands for CI can be found in the [pipeline](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/test-ready.yml). - -You can find more information about markers in the documentation: [marker doc](./tests_markers.md) - -## Adding New Test Cases -Please refer to the [L5 Layering Specification document](./CI_5levels.md). diff --git a/docs/contributing/ci/tests_markers.md b/docs/contributing/ci/tests_markers.md deleted file mode 100644 index 6130541a617..00000000000 --- a/docs/contributing/ci/tests_markers.md +++ /dev/null @@ -1,179 +0,0 @@ -# Markers for Tests - -By adding markers before test functions, tests can later be executed uniformly by simply declaring the corresponding marker type. - -## Current Markers -Defined in `pyproject.toml`: - -| Marker | Description | -| ------------------ | --------------------------------------------------------- | -| `core_model` | L1&L2 tests (run in each PR) | -| `advanced_model` | L3 tests (run on each merge to main) | -| `full_model` | L4 tests (run nightly) | -| `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 * | -| `xpu` | Tests that run on Intel XPU * | -| `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 | - -\* Means those markers are auto-added by `@hardware_test` (parametrization decorator) or `hardware_marks` (only returning the list of marks for flexibility). - -### Example usage for markers - -```python -from tests.helpers.mark import hardware_test - -@pytest.mark.core_model -@pytest.mark.omni -@hardware_test( - res={"cuda": "L4", "rocm": "MI325", "npu": "A2"}, - num_cards=2, -) -@pytest.mark.parametrize("omni_server", test_params, indirect=True) -def test_video_to_audio() - ... -``` - -### Decorator: `@hardware_test` - -This decorator is intended to make hardware-aware, cross-platform test authoring easier and more robust for CI/CD environments. The `hardware_test` decorator in `vllm-omni/tests/helpers/mark.py` performs the following actions: - -1. **Applies platform and resource markers** - Adds the appropriate pytest markers for each specified hardware platform (e.g., `cuda`, `rocm`, `xpu`, `npu`) and resource type (e.g., `L4`, `H100`, `MI325`, `B60`, `A2`, `A3`). - ``` - @pytest.mark.cuda - @pytest.mark.L4 - ``` -2. **Handles multi-card (distributed) scenarios** - For tests requiring multiple cards, it automatically adds distributed markers such as `distributed_cuda`, `distributed_rocm`, or `distributed_npu`. - ``` - @pytest.mark.distributed_cuda(num_cards=num_cards) - ``` -3. **Supports flexible card requirements** - Accepts `num_cards` as either a single integer for all platforms or as a dictionary with per-platform values. If not specified, defaults to 1 card per platform. - -4. **Integrates resource validation** - On CUDA, adds a skip marker (`skipif_cuda`) if the system does not have the required number of devices. - Support for `skipif_rocm` and `skipif_npu` will be implemented later. - - -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 -- Single call for multiple platforms: - ```python - @hardware_test( - res={"cuda": "L4", "rocm": "MI325", "xpu": "B60", "npu": "A2"}, - num_cards={"cuda": 2, "rocm": 2, "xpu": 2, "npu": 2}, - ) - ``` - or - ```python - @hardware_test( - res={"cuda": "L4", "rocm": "MI325", "xpu": "B60", "npu": "A2"}, - num_cards=2, - ) - ``` -- `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 -- 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"` - - ROCm only: `pytest -m "distributed_rocm and MI325"` - - NPU only: `pytest -m "distributed_npu"` - -### Function: `hardware_marks` - -`hardware_marks` returns a list of pytest mark objects with the same signature as `@hardware_test`. Use it when you need more flexibility, such as attaching hardware marks to individual `pytest.param` entries rather than an entire test function. - -```python -from tests.helpers.mark import hardware_marks - -MULTI_CARD_MARKS = hardware_marks( - res={"cuda": "H100", "rocm": "MI325", "npu": "A2"}, num_cards=2 -) - -@pytest.mark.parametrize("omni_server", [ - pytest.param(OmniServerParams(...), id="case_001", marks=MULTI_CARD_MARKS), -], indirect=True) -def test_feature(omni_server): - ... -``` - -## Add Support for a New Platform - -If you want to add support for a new platform (e.g., "tpu" for a new accelerator), follow these steps: - -1. **Extend the marker list in your pytest config** so that platform/resource markers are defined: - ```toml - # In pyproject.toml or pytest.ini - [tool.pytest.ini_options] - markers = [ - # ... existing markers ... - "tpu: Tests that require TPU device", - "TPU_V3: Tests that require TPU v3 hardware", - "distributed_tpu: Tests that require multiple TPU devices", - ] - ``` -2. **Implement a marker construction function for your platform** in `vllm-omni/tests/helpers/mark.py`: - ```python - # In vllm-omni/tests/helpers/mark.py - - def tpu_marks(*, res: str, num_cards: int): - test_platform = pytest.mark.tpu - if res == "TPU_V3": - test_resource = pytest.mark.TPU_V3 - else: - raise ValueError( - f"Invalid TPU resource type: {res}. Supported: TPU_V3") - - if num_cards == 1: - return [test_platform, test_resource] - else: - test_distributed = pytest.mark.distributed_tpu(num_cards=num_cards) - # Optionally: add skipif_tpu when implemented - return [test_platform, test_resource, test_distributed] - ``` -3. **Update `hardware_marks` to recognize your new platform**: - In the relevant place (see the `hardware_marks` implementation), add: - ```python - if platform == "tpu": - marks = tpu_marks(res=resource, num_cards=cards) - ``` - (`hardware_test` calls `hardware_marks` internally, so both will pick up the change.) -4. **(Recommended) Add a test using your new markers**: - ```python - @hardware_test( - res={"tpu": "TPU_V3"}, - num_cards=2, - ) - def test_my_tpu_feature(): - ... - ``` - -**Summary**: -- Add pytest markers for your new platform/resources -- Implement a marker function (`xxx_marks`) -- Plug into `hardware_marks` -- You're done: tests using `@hardware_test` or `hardware_marks` with your platform now automatically get the correct markers, distribution, and isolation! - -See code in `vllm-omni/tests/helpers/mark.py` for existing examples (`cuda_marks`, `rocm_marks`, `npu_marks`). diff --git a/docs/contributing/ci/tests_style.md b/docs/contributing/ci/tests_style.md deleted file mode 100644 index 3a8cb0f127c..00000000000 --- a/docs/contributing/ci/tests_style.md +++ /dev/null @@ -1,467 +0,0 @@ -# Test File Structure and Style Guide - -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. This document outlines the guidelines for organizing and naming test files. - -## Checklist before submitting your test files - -1. The file is saved in an appropriate place and the file name is clear. -2. The coding style follows the requirements outlined below. -3. All test functions have appropriate pytest markers. -4. For tests that need run in CI, please ensure it labeled as ``@pytest.mark.core_model` the test is configured under the `./buildkite/` folder. - - -## Test Types - -For more details about our [Five Levels Tests design](../ci/CI_5levels.md). - -### Unit Tests and System Tests -For unit tests and system tests, we strongly recommend placing test files in the same directory structure as the source code being tested, using the naming convention `test_*.py`. - -### End-to-End (E2E) Tests for Models -End-to-end tests verify the complete functionality of a system or component. For our project, the E2E tests for different omni models are organized into two subdirectories: - -- **`tests/e2e/offline_inference/`**: Tests for offline inference modes (e.g., Qwen3Omni offline inference) - -- **`tests/e2e/online_serving/`**: Tests for online serving scenarios (e.g., API server tests) - -## Test Directory Structure - -The ideal directory structure mirrors the source code organization. Legend: `✅` = test exists, `⬜` = suggested to add. - -``` -vllm_omni/ tests/ -├── config/ → ├── config/ -│ ├── model.py │ └── test_model.py ⬜ -│ └── lora.py │ └── test_lora.py ⬜ -│ -├── core/ → ├── core/ -│ └── sched/ │ └── sched/ -│ ├── omni_ar_scheduler.py │ ├── test_omni_ar_scheduler.py ⬜ -│ ├── omni_generation_scheduler.py │ ├── test_omni_generation_scheduler.py ⬜ -│ └── output.py │ └── test_output.py ✅ currently in entrypoints/test_omni_new_request_data.py (tests output.OmniNewRequestData) -│ -├── diffusion/ → ├── diffusion/ -│ ├── diffusion_engine.py │ ├── test_diffusion_engine.py ⬜ -│ ├── attention/ │ ├── attention/ -│ │ ├── layer.py │ │ ├── test_attention_sp.py ✅ -│ │ └── backends/ │ │ └── test_flash_attn.py ✅ -│ ├── distributed/ │ ├── distributed/ -│ │ └── ... │ │ ├── test_comm.py ✅ -│ │ │ │ ├── test_cfg_parallel.py ✅ -│ │ │ │ └── test_sp_plan_hooks.py ✅ -│ ├── lora/ │ ├── lora/ -│ │ └── ... │ │ ├── test_base_linear.py ✅ -│ │ │ │ └── test_lora_manager.py ✅ -│ ├── models/ │ ├── models/ -│ │ ├── qwen_image/ │ │ ├── qwen_image/ (e2e coverage) -│ │ ├── z_image/ │ │ └── z_image/ -│ │ └── ... │ │ └── test_zimage_tp_constraints.py ✅ -│ └── worker/ │ └── worker/ -│ ├── diffusion_worker.py │ └── test_diffusion_worker.py ✅ file at diffusion/test_diffusion_worker.py -│ └── diffusion_model_runner.py │ -│ -├── distributed/ → ├── distributed/ -│ └── omni_connectors/ │ └── omni_connectors/ -│ ├── adapter.py │ ├── test_adapter_and_flow.py ✅ -│ ├── kv_transfer_manager.py │ ├── test_basic_connectors.py ✅ -│ ├── connectors/ │ ├── test_kv_flow.py ✅ -│ └── utils/ │ └── test_omni_connector_configs.py ✅ -│ -├── engine/ → ├── engine/ -│ ├── input_processor.py │ ├── test_input_processor.py ⬜ (no processor.py in source) -│ ├── output_processor.py │ └── test_output_processor.py ⬜ -│ └── arg_utils.py │ └── test_arg_utils.py ⬜ -│ -├── entrypoints/ → ├── entrypoints/ -│ ├── stage_utils.py │ ├── test_stage_utils.py ✅ -│ ├── cli/ │ ├── cli/ (benchmarks/test_serve_cli.py covers CLI serve) -│ │ └── ... │ │ └── test_*.py ⬜ -│ └── openai/ │ └── openai_api/ # maps to entrypoints/openai/ -│ ├── api_server.py │ ├── test_api_server.py ⬜ (e2e indirect coverage) -│ ├── serving_chat.py │ ├── test_serving_chat_sampling_params.py ✅ -│ ├── serving_speech.py │ ├── test_serving_speech.py ✅ -│ └── image_api_utils.py │ └── test_image_server.py ✅ -│ -├── inputs/ → ├── inputs/ -│ ├── data.py │ ├── test_data.py ⬜ -│ ├── parse.py │ ├── test_parse.py ⬜ -│ └── preprocess.py │ └── test_preprocess.py ✅ currently in entrypoints/test_omni_input_preprocessor.py -│ -├── model_executor/ → ├── model_executor/ -│ ├── layers/ │ ├── layers/ -│ │ └── mrope.py │ │ └── test_mrope.py ⬜ -│ ├── model_loader/ │ ├── model_loader/ -│ │ └── weight_utils.py │ │ └── test_weight_utils.py ⬜ -│ ├── models/ │ ├── models/ -│ │ ├── qwen2_5_omni/ │ │ ├── qwen2_5_omni/ -│ │ │ ├── qwen2_5_omni_thinker.py │ │ │ ├── test_audio_length.py ✅ -│ │ │ ├── qwen2_5_omni_talker.py │ │ │ ├── test_qwen2_5_omni_thinker.py ⬜ -│ │ │ └── qwen2_5_omni_token2wav.py │ │ │ ├── test_qwen2_5_omni_talker.py ⬜ -│ │ └── qwen3_omni/ │ │ │ └── test_qwen2_5_omni_token2wav.py ⬜ -│ │ └── ... │ │ └── qwen3_omni/ -│ ├── stage_configs/ │ │ └── test_*.py ⬜ -│ │ └── *.yaml │ └── stage_configs/ (used by e2e, test_*.py can be added) ⬜ -│ └── stage_input_processors/ │ └── stage_input_processors/ -│ └── ... │ └── test_*.py ⬜ -│ -├── sample/ → ├── sample/ -│ └── __init__.py │ └── test_*.py ⬜ -│ -├── utils/ → ├── utils/ -│ └── __init__.py │ └── test_*.py ⬜ (no platform_utils.py currently) -│ -├── worker/ → ├── worker/ -│ ├── gpu_ar_model_runner.py │ ├── test_gpu_ar_model_runner.py ⬜ -│ ├── gpu_ar_worker.py │ ├── test_gpu_ar_worker.py ⬜ -│ ├── gpu_generation_model_runner.py │ ├── test_gpu_generation_model_runner.py ✅ -│ ├── gpu_generation_worker.py │ ├── test_gpu_generation_worker.py ⬜ -│ ├── gpu_model_runner.py │ ├── test_omni_gpu_model_runner.py ✅ -│ └── mixins.py │ └── (npu under platforms/npu/worker/) # not worker/npu/ -│ -├── platforms/ → (no tests/platforms/, e2e and stage_configs provide indirect coverage) -│ ├── cuda/ -│ ├── npu/worker/ # NPU worker here, not vllm_omni/worker/npu/ -│ ├── rocm/ -│ └── xpu/worker/ -│ -├── outputs.py → test_outputs.py ✅ (at tests root) -├── (logger, patch, request, version) → (no corresponding unit test) -│ -└── e2e (tests side only) → ├── e2e/ - ├── online_serving/ ✅ non-empty - │ ├── test_qwen2_5_omni.py - │ ├── test_async_omni.py - │ ├── test_qwen3_omni.py - │ ├── test_qwen3_omni_expansion.py - │ ├── test_mimo_audio.py - │ ├── test_image_gen_edit.py - │ └── test_images_generations_lora.py - └── offline_inference/ ✅ - ├── test_qwen2_5_omni.py - ├── test_qwen3_omni.py - ├── test_bagel_text2img.py - ├── test_t2i_model.py - ├── test_t2v_model.py - ├── test_ovis_image.py - ├── test_zimage_tensor_parallel.py - ├── test_cache_dit.py - ├── test_teacache.py - ├── test_stable_audio_expansion.py - ├── test_diffusion_cpu_offload.py - ├── test_diffusion_layerwise_offload.py - ├── test_diffusion_lora.py - ├── test_sequence_parallel.py - ├── test_qwen_image_edit_expansion.py - └── stage_configs/ (legacy schema, still present - ├── bagel_*.yaml for unmigrated models) - └── npu/, rocm/, etc. - -# Migrated models (qwen3_omni_moe, qwen2_5_omni, qwen3_tts) live under -# vllm_omni/deploy/ instead — see docs/configuration/stage_configs.md. -examples/ tests -│ └── examples -├── online_serving/ → ├── online_serving/ -│ └── {doc_page_title}/README.md │ └── test_{doc_page_title}.py ⬜ -└── offline_inference/ → └── offline_inference/ - └── {doc_page_title}/README.md └── test_{doc_page_title}.py ⬜ -``` - - - -### Naming Conventions - -- **Unit Tests**: Use `test_.py` format. Example: `stage_utils.py` → `test_stage_utils.py` - -- **E2E Tests**: Place in `tests/e2e/offline_inference/` or `tests/e2e/online_serving/` with descriptive names. Example: `tests/e2e/offline_inference/test_qwen3_omni.py`, `tests/e2e/offline_inference/test_diffusion_model.py` - -- **Expansion Tests** - -### Best Practices - -1. **Mirror Source Structure**: Test directories should mirror the source code structure -2. **Test Type Indicators**: Use comments to indicate test types (UT for unit tests, E2E for end-to-end tests) -3. **Shared Resources**: Place shared test configurations (e.g., CI configs) in appropriate subdirectories -4. **Consistent Naming**: Follow the `test_*.py` naming convention consistently across all test files - - -## Test codes requirements - -### Coding style - -1. **File header**: Add SPDX license header to all test files -2. **Imports**: Pls don't use manual `sys.path` modifications, use standard imports instead. -3. **Test type differentiation**: - - - Unit tests: Maintain mock style - - E2E tests for models: Consider using OmniRunner uniformly, avoid decorators - -4. **Documentation**: Add docstrings to all test functions -5. **Environment variables**: Set uniformly in `conftest.py` or at the top of files -6. **Type annotations**: Add type annotations to all test function parameters -7. **Pytest Markers**: Add necessary markers like `@pytest.mark.core_model` and use `@hardware_test` to declare hardware requirements (check detailed in [Markers for Tests](../ci/tests_markers.md)). - -### Template -#### E2E - Online serving - -E2E Online tests for Qwen3-Omni model with mix input and audio+text output. Based on `tests/e2e/online_serving/test_qwen3_omni.py`. - -```python -""" -E2E Online tests for Qwen3-Omni model with mix input and audio+text output. -""" - -import os - -os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" -os.environ["VLLM_TEST_CLEAN_GPU_MEMORY"] = "0" - -import threading -from pathlib import Path - -import openai -import pytest - -from tests.helpers.media import ( - convert_audio_bytes_to_text, - cosine_similarity_text, - generate_synthetic_video, -) -from tests.helpers.runtime import OmniServer, dummy_messages_from_mix_data -from tests.helpers.stage_config import get_deploy_config_path, modify_stage_config -from vllm_omni.platforms import current_omni_platform - -# Edit: model name and stage config path -models = ["Qwen/Qwen3-Omni-30B-A3B-Instruct"] - -#If you use the default configuration file, you can directly use the following address. -def get_default_config(): - return get_deploy_config_path("ci/qwen3_omni_moe.yaml") - -#If you need to modify the configuration file, you can use modify_stage_config. -def get_chunk_config(): - path = modify_stage_config( - get_default_config(), - updates={ - "async_chunk": True, - "stage_args": { - 0: { - "engine_args.custom_process_next_stage_input_func": "vllm_omni.model_executor.stage_input_processors.qwen3_omni.thinker2talker_async_chunk" - }, - 1: { - "engine_args.custom_process_next_stage_input_func": "vllm_omni.model_executor.stage_input_processors.qwen3_omni.talker2code2wav_async_chunk" - }, - }, - }, - deletes={"stage_args": {2: ["custom_process_input_func"]}}, - ) - return path - -stage_configs = [get_default_config(), CHUNK_CONFIG_PATH] - -test_params = [(model, stage_config) for model in models for stage_config in stage_configs] - - -#Please use this method to launch the online instance. -_omni_server_lock = threading.Lock() - -@pytest.fixture(scope="module") -def omni_server(request): - """Start vLLM-Omni server as a subprocess. Use module scope for multi-stage init (10-20+ min).""" - with _omni_server_lock: - model, stage_config_path = request.param - with OmniServer( - model, - ["--stage-configs-path", stage_config_path, "--stage-init-timeout", "120"], - ) as server: - yield server - - -@pytest.fixture -def client(omni_server): - """OpenAI client for the running vLLM-Omni server.""" - return openai.OpenAI( - base_url=f"http://{omni_server.host}:{omni_server.port}/v1", - api_key="EMPTY", - ) - -#Please use function definitions above the test function to define the prompts and other parameters you need. -def get_system_prompt(): - return { - "role": "system", - "content": [ - { - "type": "text", - "text": ( - "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." - ), - } - ], - } - -... - -#Please define test case tags according to the instructions in the marker documentation. -@pytest.mark.core_model -@pytest.mark.omni -@pytest.mark.parametrize("omni_server", test_params, indirect=True) -def test_mix_to_text_audio_001(client: openai.OpenAI, omni_server, request) -> None: - # PLEASE FOLLOW THESE TEMPLATE INSTRUCTIONS: - # ============================================================================ - # TEMPLATE USAGE GUIDE: - # 1. Copy this entire function as a starting point for multi-modal tests - # 2. Update the test name to reflect your specific test scenario - # 3. Modify input/output modalities as needed (see OPTIONS section below) - # 4. Adjust assertions based on your expected outcomes - # 5. Add custom validation logic for your specific use case - # ============================================================================ - - #Please list the relevant test points. - """ - Test multi-modal input processing and text/audio output generation via OpenAI API. - Deploy Setting: default yaml - Input Modal: text + audio + video + image - Output Modal: text + audio - Input Setting: stream=True - Datasets: single request - """ - # SECTION 1: TEST SETUP AND INITIALIZATION - # ========================================= - # INSTRUCTIONS: Initialize test variables and prepare test environment - # MODIFY: Add any additional test setup required for your scenario - e2e_list = list() - # SECTION 2: TEST DATA GENERATION - # ================================ - # INSTRUCTIONS: Generate or load test data for each input modality - # MODIFY: Replace synthetic generators with your actual data sources - # VIDEO DATA - Generate synthetic video for testing - # FORMAT: data:video/mp4;base64,{base64_encoded_video} - # PARAMETERS: width, height, duration_frames - video_data_url = f"data:video/mp4;base64,{generate_synthetic_video(224, 224, 300)['base64']}" - # IMAGE DATA - Generate synthetic image for testing - # FORMAT: data:image/jpeg;base64,{base64_encoded_image} - # PARAMETERS: width, height - image_data_url = f"data:image/jpeg;base64,{generate_synthetic_image(224, 224)['base64']}" - # AUDIO DATA - Generate synthetic audio for testing - # FORMAT: data:audio/wav;base64,{base64_encoded_audio} - # PARAMETERS: duration_seconds, channels - audio_data_url = f"data:audio/wav;base64,{generate_synthetic_audio(5, 1)['base64']}" - - # SECTION 3: MESSAGE CONSTRUCTION - # ================================ - # INSTRUCTIONS: Assemble the complete message payload for API request - # MODIFY: Add/remove modalities or change prompt structure as needed - - # USAGE: Construct a message containing all input modalities - # IMPORTANT: Ensure the message structure matches OpenAI API expectations - # CUSTOMIZATION POINTS: - # - system_prompt: Controls the assistant's behavior - # - content_text: The user's text prompt/question - # - *_data_url: URLs for media content (video/image/audio) - messages = dummy_messages_from_mix_data( - system_prompt=get_system_prompt(), - video_data_url=video_data_url, - image_data_url=image_data_url, - audio_data_url=audio_data_url, - content_text=get_prompt("mix"), - ) - - # SECTION 4: API REQUEST EXECUTION - # ================================= - # INSTRUCTIONS: Make the API call and measure performance - # MODIFY: Add timeout, retry logic, or additional parameters - start_time = time.perf_counter() - chat_completion = client.chat.completions.create(model=omni_server.model, messages=messages, stream=True) - - #Call using your preferred method and obtain the final audio and text outputs. - ... - - # SECTION 5: OUTPUT VALIDATION - # ============================= - # INSTRUCTIONS: Verify that outputs meet expected criteria - # MODIFY: Adjust validation logic for your specific requirements - - # ASSERTION 1: E2E Validation - # PURPOSE: Verify that the E2E latency is less than the baseline. - current_e2e = time.perf_counter() - start_time - print(f"the request e2e is: {current_e2e}") - e2e_list.append(current_e2e) - - print(f"the avg e2e is: {sum(e2e_list) / len(e2e_list)}") - - - - # ASSERTION 2: Text Output Validation - # PURPOSE: Verify that text output was generated with keyword content - assert text_content is not None and len(text_content) >= 2, "No text output is generated" - assert any( - keyword in text_content.lower() for keyword in ["square", "quadrate", "sphere", "globe", "circle", "round"] - ), "The output does not contain any of the keywords." - - - # ASSERTION 3: Cross-Modal Consistency - # PURPOSE: Verify text and audio outputs convey the same information - # CUSTOMIZATION: Adjust similarity threshold (0.9) based on accuracy requirements - assert audio_data is not None, "No audio output is generated" - audio_content = convert_audio_bytes_to_text(audio_data) - print(f"text content is: {text_content}") - 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" -``` - - -#### E2E - Offline inference -```python -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project -""" -Offline E2E smoke test for an omni model (video → audio). -""" - -import os -from pathlib import Path - -import pytest -from vllm.assets.video import VideoAsset - -from tests.helpers.mark import hardware_test -from ..multi_stages.conftest import OmniRunner - -# Optional: set process start method for workers -os.environ["VLLM_WORKER_MULTIPROC_METHOD"] = "spawn" - -models = ["{your model name}"] #Edit here to load your model -stage_configs = [str(Path(__file__).parent / "stage_configs" / {your model yaml})] #Edit here to load your model yaml - -# Create parameter combinations for model and stage config -test_params = [(model, stage_config) for model in models for stage_config in stage_configs] - -# function name: test_{input_modality}_to_{output_modality} -# modality candidate: text, image, audio, video, mixed_modalities -@pytest.mark.core_model -@pytest.mark.omni -@hardware_test( - res={"cuda": "L4", "rocm": "MI325", "npu": "A2"}, - num_cards=2, -) -@pytest.mark.parametrize("test_config", test_params) -def test_video_to_audio(omni_runner: type[OmniRunner], model: str) -> None: - """Offline inference: video input, audio output.""" - model, stage_config_path = test_config - with omni_runner(model, seed=42, stage_configs_path=stage_config_path) as runner: - # Prepare inputs - video = VideoAsset(name="sample", num_frames=4).np_ndarrays - - outputs = runner.generate_multimodal( - prompts="Describe this video briefly.", - videos=video, - ) - - # Minimal assertions: got outputs and at least one audio result - assert outputs - has_audio = any(o.final_output_type == "audio" for o in outputs) - assert has_audio -``` diff --git a/docs/contributing/metrics.md b/docs/contributing/metrics.md deleted file mode 100644 index 92dcd92ccac..00000000000 --- a/docs/contributing/metrics.md +++ /dev/null @@ -1,173 +0,0 @@ - -# Metrics - -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 - -### Start the Service with Metrics Logging - -```bash -vllm serve /workspace/models/Qwen3-Omni-30B-A3B-Instruct --omni --port 8014 --log-stats -``` - -### Send a Request - -```bash -python openai_chat_completion_client_for_multimodal_generation.py --query-type use_image -``` - -### 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 - -### Summary Metrics - -| 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`, which matches the table value `e2e_total_tokens`. - -**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** - -192.581 + 53.315 = **245.896** = transfers_total_time_ms, which matches the calculation (difference is due to rounding) diff --git a/docs/contributing/model/README.md b/docs/contributing/model/README.md deleted file mode 100644 index b3e951c8bfe..00000000000 --- a/docs/contributing/model/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Adding a New Model - -This section provides comprehensive guidance on how to add a new model to vLLM-Omni. - -## Documentation - -- **[Adding an Omni-Modality Model](adding_omni_model.md)**: Complete step-by-step guide using Qwen3-Omni as an example. - -- **[Adding a Diffusion Model](adding_diffusion_model.md)**: Complete step-by-step guide using Qwen/Qwen-Image-Edit as an example. - - - -## Quick Start - -For a quick reference, see the [Adding a New Multi-Stage Model Guide](adding_omni_model.md) and [Adding a New Diffusion Model Guide](adding_diffusion_model.md). diff --git a/docs/contributing/model/adding_diffusion_model.md b/docs/contributing/model/adding_diffusion_model.md deleted file mode 100644 index 6d5782a6e3c..00000000000 --- a/docs/contributing/model/adding_diffusion_model.md +++ /dev/null @@ -1,1071 +0,0 @@ -# Adding a Diffusion Model - -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 - -1. [Overview](#overview) -2. [Directory Structure](#directory-structure) -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 - -vLLM-Omni's diffusion inference follows this architecture: - -

- - - Diffusion Flow - -

- -**Key Components:** - -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/ -└── diffusion/ - ├── 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 -``` - -**Naming Conventions:** - -- **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 -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, - ) -``` - -**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 -``` - -#### 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__() - - # Store config - self.od_config = od_config - self.parallel_config = od_config.parallel_config if od_config else None - - # 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.register_modules( - vae=vae, - text_encoder=text_encoder, - tokenizer=tokenizer, - transformer=transformer, - scheduler=scheduler, - ) -``` - -**After (vLLM-Omni):** -```python -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. **`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 - -**Change signature:** - -```diff -- @torch.no_grad() -- def __call__( -+ def forward( - self, -+ req: OmniDiffusionRequest, # ← Add request parameter here -- ): -+ ) -> DiffusionOutput: # ← Add return type -``` - -[`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 = { - # 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 - ), -} -``` - -#### 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", - - # Add your model - "YourModelPipeline": "get_your_model_pre_process_func", # Optional -} -_DIFFUSION_POST_PROCESS_FUNCS = { - # 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", -} -``` - - -#### 3.3: Export from Module - -Create/update `__init__.py` to export your classes: - -```python -# vllm_omni/diffusion/models/your_model_name/__init__.py - -from .pipeline_your_model import ( - YourModelPipeline, - get_your_model_post_process_func, -) -from .your_model_transformer import YourModelTransformer2DModel - -__all__ = [ - "YourModelPipeline", - "YourModelTransformer2DModel", - "get_your_model_post_process_func", -] -``` - ---- - -### Step 4: Add Example Script - - -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 -``` - -**Offline (recommended minimum):** create `examples/offline_inference/your_model_name/end2end.py` and a README. - -- 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.: - -```bash -cd examples/offline_inference/your_model_name -python end2end.py --model your-org/your-model-name --modality text2img --prompts "A cute cat" -``` - -#### 4.2: Add Online Serving Example (OpenAI-Compatible) - -Mirror BAGEL’s online serving setup: - -- 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”: - -```bash -# Terminal 1: launch server -cd examples/online_serving/your_model_name -bash run_server.sh - -# Terminal 2: send request -python openai_chat_client.py --prompt "A cute cat" --modality text2img -``` - - -### Step 5: Test Your Implementation - -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, please submit test code (unit tests, system tests, or end-to-end tests) alongside their code changes. - -For comprehensive testing guidelines and the definition of test levels (L1-L5), please refer to the [Multi-Level Automated Testing System Documentation](../ci/CI_5levels.md). You are at least required to add an L4 *functionality* test described in that document. - ---- - -## 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](../../design/feature/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](../../design/feature/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](../../design/feature/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) -``` - -### Step Execution - -See detailed design guide: [How to add step execution support](../../design/feature/diffusion_step_execution.md) - -Use this only when your pipeline can be split into stable request-scoped and -step-scoped phases. The reference implementation is -`QwenImagePipeline`, which maps its request-level `forward()` into: - -1. `prepare_encode()` for prompt encoding, latent init, timestep prep, and per-request scheduler setup. -2. `denoise_step()` for one transformer/noise prediction. -3. `step_scheduler()` for one scheduler update and `step_index` advance. -4. `post_decode()` for the final VAE decode. - -Do not enable `step_execution=True` until those four methods are implemented -and validated against the request-level path. - -### Cache Acceleration - -#### TeaCache - -See detailed guide: [How to add TeaCache support](../../design/feature/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](../../design/feature/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, - } -) -``` - -### CPU Offload - -See detailed guide: [CPU Offloading for Diffusion Models](../../user_guide/diffusion/cpu_offload_diffusion.md) - -vLLM-Omni provides two offloading strategies to reduce GPU memory usage: - -1. **Model-level offload**: Mutual exclusion between DiT and encoders (only one on GPU at a time) -2. **Layerwise (Blockwise) offload**: Keeps only a single transformer block on GPU at a time with compute-memory overlap - -**Usage:** Enable offload when initializing: -```python -# Model-level offload -omni = Omni(model="your-model", enable_cpu_offload=True) - -# Layerwise offload -omni = Omni(model="your-model", enable_layerwise_offload=True) -``` - -**To support layerwise offloading:** Define the blocks attribute name in your transformer: - -```python -class WanTransformer3DModel(nn.Module): - _layerwise_offload_blocks_attrs = ["blocks"] # Attribute name containing transformer blocks - - def __init__(self): - self.blocks = nn.ModuleList([...]) # Transformer blocks -``` - -**Note:** Layerwise offloading is primarily recommended for large **video generation models** where the compute cost per block is high enough to effectively overlap with memory prefetch operations. - - ---- - -### Diffusion Pipeline Profiler (Performance Profiling) -When adapting a new diffusion model, it is often useful to analyze the latency of key components such as text encoding, diffusion denoising, and VAE decoding. -vLLM-Omni provides a timing utility via `DiffusionPipelineProfilerMixin` to help developers quickly identify performance bottlenecks. - -!!! info - `DiffusionPipelineProfilerMixin` is different from using `torch.profiler` for diffusion models, as introduced in this [tutorial](https://github.com/vllm-project/vllm-omni/blob/main/docs/contributing/profiling.md). `DiffusionPipelineProfilerMixin` only prints the timing information of multiple functions (such as `vae.decode`), while `torch.profiler` saves detailed GPU/CPU computation time, call/execution steps. - -This tool automatically measures the execution time of selected pipeline modules and prints the results in the logs. - -**Enabling Diffusion Pipeline Profiler** - - -Enable timing by setting: -``` -vllm serve Qwen/Qwen-Image --omni --port 8091 --enable-diffusion-pipeline-profiler -``` -You can optionally specify which modules to profile: -``` -class YourPipeline(xxx, DiffusionPipelineProfilerMixin): - def __init__(self, xxx): - ... - self.setup_diffusion_pipeline_profiler(profiler_targets=["diffuse"], enable_diffusion_pipeline_profiler) -``` -If not specified, the default targets are used: -``` -["vae.encode", "vae.decode", "diffuse", "text_encoder.forward", "tokenizer.forward"] -``` -**Adding DiffusionPipelineProfilerMixin to a Pipeline** -To enable timing support in your pipeline, inherit from DiffusionPipelineProfilerMixin. -```python -from vllm_omni.diffusion.profiler import DiffusionPipelineProfilerMixin - -class YourModelPipeline(nn.Module, DiffusionPipelineProfilerMixin): - # Optional: Specify custom timing targets - _PROFILER_TARGETS = ["vae.encode", "vae.decode", "diffuse", "text_encoder.forward", "tokenizer.forward"] - - def __init__( - self, - *, - od_config: OmniDiffusionConfig, - prefix: str = "", - ): - super().__init__() - self.od_config = od_config - self.parallel_config = od_config.parallel_config - # initialize pipeline components - ... - - # initialize timing profiler - self.setup_diffusion_pipeline_profiler( - enable_diffusion_pipeline_profiler=self.od_config.enable_diffusion_pipeline_profiler - ) -``` -The mixin dynamically wraps selected methods and records their execution time during inference. - -If you need to fetch the execution time of different modules, you will need to pass `self.stage_durations` to `DiffusionOutput`, as shown below: - -```diff -- return DiffusionOutput(output=img) -+ return DiffusionOutput( - output=image, stage_durations=self.stage_durations if hasattr(self, "stage_durations") else None - ) -``` - -**Pipeline Design for Timing** -The current diffusion timing utility is function-based, meaning it measures the execution time of individual methods. - -When implementing a new pipeline, avoid putting all logic inside a single function (e.g., forward). Instead, structure the pipeline in a modular way by separating key stages into independent methods, such as the diffusion loop. - -For example: -``` -def forward(self, req: OmniDiffusionRequest): - prompt_embeds = self.encode_prompt(req) - latents = self.diffuse(prompt_embeds, req) - images = self.vae.decode(latents) - return DiffusionOutput(output=images) -``` -This allows the timing utility to measure each stage (e.g., encode_prompt, diffuse, vae.decode) separately and helps identify performance bottlenecks more easily. - - -**Default Profiled Modules** - -By default, the following pipeline modules are timed: -``` -vae.encode -vae.decode -diffuse -text_encoder.forward -tokenizer.forward -``` - -**Example Output** - -When enabled, timing logs appear like this: -``` -[DiffusionPipelineProfiler] text_encoder.forward took 0.018s -[DiffusionPipelineProfiler] diffuse took 2.412s -[DiffusionPipelineProfiler] vae.decode took 0.063s -``` -These measurements help identify bottlenecks during model adaptation and optimization - - - -## 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_num_seqs=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 - -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/contributing/model/adding_omni_model.md b/docs/contributing/model/adding_omni_model.md deleted file mode 100644 index 1eaff10596c..00000000000 --- a/docs/contributing/model/adding_omni_model.md +++ /dev/null @@ -1,624 +0,0 @@ -# Adding an Omni-Modality Model - -This guide walks through the process of adding a new multi-stage model to vLLM-Omni, using **Qwen3-Omni** as a comprehensive example. Qwen3-Omni is a multi-stage omni-modality model that demonstrates the full capabilities of vLLM-Omni's architecture. - -## Table of Contents - -1. [Overview](#overview) -2. [Directory Structure](#directory-structure) -3. [Step-by-Step Implementation](#step-by-step-implementation) -4. [Key Components](#key-components) -5. [Model Registration](#model-registration) -6. [Stage Configuration](#stage-configuration) -7. [Stage Input Processors](#stage-input-processors) -8. [Testing](#testing) -9. [Adding a Model Recipe](#adding-a-model-recipe) -10. [Summary](#summary) - -## Overview - -vLLM-Omni supports multi-stage model architectures where different stages can run on different devices and process different modalities. The Qwen3-Omni model exemplifies this with three stages: - -1. **Thinker Stage**: Multimodal understanding (text + audio + video) → text generation -2. **Talker Stage**: Text embeddings → RVQ codec codes -3. **Code2Wav Stage**: RVQ codes → audio waveform - -Each stage is implemented as a separate model class that can be configured independently. - -## Directory Structure - -When adding a new model, you'll need to create the following structure: - -``` -vllm_omni/model_executor/models/ -└── your_model_name/ # Model directory (e.g., qwen3_omni) - ├── __init__.py # Exports main model class - ├── your_model.py # Main unified model class - ├── your_model_stage1_implementation.py # Stage 1 implementation (e.g., thinker) - ├── your_model_stage2_implementation.py # Stage 2 implementation (e.g., talker) - └── your_model_stage3_implementation.py # Stage 3 implementation (e.g., code2wav) - └── ... maybe other stage implementations - -vllm_omni/model_executor/stage_input_processors/ -└── your_model_name.py # Stage transition processors - -vllm_omni/model_executor/stage_configs/ -└── your_model_name.yaml # Stage configuration file -``` - -## Step-by-Step Implementation - -### Step 1: Create the Model Directory - -Create a new directory under `vllm_omni/model_executor/models/` - -### Step 2: Implement Stage Components - -For Qwen3-Omni, we have three stage components: - -#### 2.1 Thinker Stage (`qwen3_omni_moe_thinker.py`) - -The thinker stage handles multimodal understanding. Key features: - -- Inherits from base Qwen3 MoE model in vLLM, using vLLM fused ops & page attn to accelerate -- Implements multimodal processing interfaces -- Handles audio, video, and image inputs -- Generates text outputs - -```python -from vllm.model_executor.models.interfaces import SupportsMultiModal, SupportsPP -from vllm.model_executor.models.qwen3_moe import Qwen3MoeForCausalLM - -class Qwen3OmniMoeThinkerForConditionalGeneration( - Qwen3MoeForCausalLM, - SupportsMultiModal, - SupportsPP -): - """Thinker stage: multimodal understanding → text generation.""" - - def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""): - # Initialize base model - # Set up multimodal processors - # Configure audio/video/image encoders - pass -``` - -#### 2.2 Talker Stage (`qwen3_omni_moe_talker.py`) - -The talker stage converts text embeddings to codec codes: - -```python -class Qwen3OmniMoeTalkerForConditionalGeneration( - Qwen3MoeForCausalLM, - SupportsPP -): - """Talker stage: text embeddings → RVQ codec codes.""" - - def __init__(self, vllm_config, talker_config, prefix): - # Initialize base model - # Replace LM head with codec head - # Set up text projection from thinker - pass -``` - -#### 2.3 Code2Wav Stage (`qwen3_omni_code2wav.py`) - -The code2wav stage generates audio waveforms: - -```python -class Qwen3OmniMoeCode2Wav(nn.Module): - """Code2Wav stage: RVQ codes → audio waveform.""" - - def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""): - # Initialize audio decoder - # Set up codec processing - pass -``` - -### Step 3: Implement the Unified Model Class - -The main model class (`qwen3_omni.py`) orchestrates all stages: - -```python -@MULTIMODAL_REGISTRY.register_processor( - Qwen3OmniMoeThinkerMultiModalProcessor, - info=Qwen3OmniMoeThinkerProcessingInfo, - dummy_inputs=Qwen3OmniMoeThinkerDummyInputsBuilder, -) -class Qwen3OmniMoeForConditionalGeneration( - nn.Module, SupportsMultiModal, SupportsPP, Qwen3OmniMoeConditionalGenerationMixin -): - """ - Unified Qwen3 Omni MoE model combining thinker, talker, and code2wav. - - Architecture: - - Thinker: Multimodal understanding (text + audio + video) → text generation - - Talker: Text embeddings → RVQ codec codes - - Code2Wav: RVQ codes → audio waveform - - Usage: - Set `model_stage` in vllm_config to one of: "thinker", "talker", "code2wav" - """ - - def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""): - super().__init__() - self.have_multimodal_outputs = True - config: Qwen3OmniMoeConfig = vllm_config.model_config.hf_config - - # Determine which stage to initialize - self.model_stage = vllm_config.model_config.model_stage - - if self.model_stage == "thinker": - # Initialize thinker model - thinker_vllm_config = vllm_config.with_hf_config( - config.thinker_config, - architectures=["Qwen3OmniMoeThinkerForConditionalGeneration"] - ) - self.thinker = init_vllm_registered_model( - vllm_config=thinker_vllm_config, - prefix=maybe_prefix(prefix, "thinker"), - hf_config=config.thinker_config, - architectures=["Qwen3OmniMoeThinkerForConditionalGeneration"], - ) - self.model = self.thinker - - elif self.model_stage == "talker": - # Initialize talker model - talker_vllm_config = vllm_config.with_hf_config( - config.talker_config, - architectures=["Qwen3OmniMoeTalkerForConditionalGeneration"] - ) - self.talker = init_vllm_registered_model( - vllm_config=talker_vllm_config, - prefix=maybe_prefix(prefix, "talker"), - hf_config=config.talker_config, - architectures=["Qwen3OmniMoeTalkerForConditionalGeneration"], - ) - self.model = self.talker - - elif self.model_stage == "code2wav": - # Initialize code2wav model - code2wav_vllm_config = vllm_config.with_hf_config( - config.code2wav_config, - architectures=["Qwen3OmniMoeCode2Wav"] - ) - self.code2wav = init_vllm_registered_model( - vllm_config=code2wav_vllm_config, - prefix=maybe_prefix(prefix, "code2wav"), - hf_config=config.code2wav_config, - architectures=["Qwen3OmniMoeCode2Wav"], - ) - self.model = self.code2wav - else: - raise ValueError( - f"Invalid model_stage: {self.model_stage}. " - f"Must be one of: 'thinker', 'talker', 'code2wav'" - ) -``` - -#### Key Methods to Implement - -1. **`forward()`**: Handles the forward pass for each stage -2. **`embed_input_ids()`**: Embeds input token IDs -3. **`embed_multimodal()`**: Processes multimodal inputs (if applicable) -4. **`compute_logits()`**: Computes logits from hidden states -5. **`load_weights()`**: Loads model weights with proper prefixing of different stages - -### Step 4: Create `__init__.py` - -Export the main model class: - -```python -# vllm_omni/model_executor/models/qwen3_omni/__init__.py -from .qwen3_omni import Qwen3OmniMoeForConditionalGeneration - -__all__ = ["Qwen3OmniMoeForConditionalGeneration"] -``` - -## Key Components - -### 1. Model Interfaces - -Your model should implement the appropriate interfaces: - -- **`SupportsMultiModal`**: For models that process multimodal inputs -- **`SupportsPP`**: For models that support pipeline parallelism -- **`SupportsMRoPE`**: For models using multi-dimensional RoPE (if applicable) - -### 2. Multimodal Registration - -If your model processes multimodal inputs, register it with the multimodal registry: - -```python -@MULTIMODAL_REGISTRY.register_processor( - YourMultiModalProcessor, - info=YourProcessingInfo, - dummy_inputs=YourDummyInputsBuilder, -) -class YourModel(nn.Module, SupportsMultiModal): - pass -``` - -### 3. Weight Loading - -Implement `load_weights()` to handle weight loading with proper prefixing: - -```python -def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]: - """Load weights for all components of the omni model.""" - loaded_weights = set() - thinker_weights = [] - talker_weights = [] - code2wav_weights = [] - - # Separate weights by component - for k, v in weights: - if k.startswith("thinker."): - thinker_weights.append((k, v)) - elif k.startswith("talker."): - talker_weights.append((k, v)) - elif k.startswith("code2wav."): - code2wav_weights.append((k, v)) - - # Load each component's weights - if self.thinker and thinker_weights: - thinker_loaded = self.thinker.load_weights(thinker_weights) - thinker_loaded = add_prefix_to_loaded_weights(thinker_loaded, "thinker") - loaded_weights.update(thinker_loaded) - - # Similar for talker and code2wav... - - return loaded_weights -``` - -### 4. Output Format - -Use `OmniOutput` for stage outputs: - -```python -from vllm_omni.model_executor.models.output_templates import OmniOutput - -# In forward method -return OmniOutput( - text_hidden_states=hidden_states, - multimodal_outputs={"additional_data": data}, - next_token_id=next_token_id, -) -``` - -## Model Registration - -Register your model in `vllm_omni/model_executor/models/registry.py`: - -```python -_OMNI_MODELS = { - # ... existing models ... - - # Your new model - "YourModelForConditionalGeneration": ( - "your_model_name", # Module folder name - "your_model", # Module file name (without .py) - "YourModelForConditionalGeneration", # Class name - ), - "YourModelThinkerForConditionalGeneration": ( - "your_model_name", - "your_model_thinker", - "YourModelThinkerForConditionalGeneration", - ), - # ... other stages ... -} -``` - -The registry uses lazy loading, so the model class is imported only when needed. - -## Stage Configuration - -Create a YAML configuration file in `vllm_omni/deploy/`. For a complete example, see the [Qwen3-Omni configuration file](gh-file:vllm_omni/deploy/qwen3_omni_moe.yaml). - -### Key Configuration Fields - -- **`model_stage`**: Which stage to run ("thinker", "talker", "code2wav", etc.) -- **`model_arch`**: The model architecture name (must match registry) -- **`engine_input_source`**: List of stage IDs that provide input to this stage -- **`custom_process_input_func`**: Function to process inputs from previous stages -- **`final_output`**: Whether this stage produces the final output (True/False) -- **`final_output_type`**: Type of final output ("text", "audio", "image", etc.) - -## Stage Input Processors - -Stage transitions are the mechanism by which outputs from one stage are converted into inputs for the next stage. This section explains where and how stage transitions occur. - -### Where Stage Transitions Are Called - -Stage transitions happen automatically in the runtime orchestrator. Here's the detailed flow: - -1. **Location**: `vllm_omni/engine/orchestrator.py` in `_forward_to_next_stage()` -2. **Trigger**: When a stage completes processing and produces outputs -3. **Execution Flow**: - ```python - # In orchestrator.py - next_stage_id = stage_id + 1 - next_client = self.stage_clients[next_stage_id] - params = req_state.sampling_params_list[next_stage_id] - - # Save current stage outputs so stage_input_processors can consume them. - self.stage_clients[stage_id].set_engine_outputs([output]) - - # THIS IS WHERE STAGE TRANSITION HAPPENS - next_inputs = next_client.process_engine_inputs( - stage_list=self.stage_clients, - prompt=req_state.prompt, - ) - - # Build and submit request(s) to the next stage. - for next_input in next_inputs: - request = build_engine_core_request_from_tokens( - request_id=req_id, - prompt=next_input, - params=params, - model_config=self.stage_vllm_configs[next_stage_id].model_config, - ) - await next_client.add_request_async(request) - ``` - -### How Stage Transitions Work - -The stage transition process follows these steps: - -1. **Stage Completion**: When a stage finishes processing a request, the orchestrator stores outputs via `stage_client.set_engine_outputs(...)` - -2. **Transition Detection**: The orchestrator checks if there's a next stage and calls `process_engine_inputs()` on it - -3. **Input Processing**: The stage input processor configured in stage YAML (under `vllm_omni/model_executor/stage_input_processors/`) handles the transition: - ```python - def process_engine_inputs( - self, stage_list: list[Any], prompt: OmniTokensPrompt | TextPrompt = None - ) -> list[OmniTokensPrompt | TextPrompt]: - """Process engine inputs for this stage from upstream stage outputs.""" - - if self.custom_process_input_func is None: - # Default behavior: pass token IDs directly - # Extract outputs from source stage - source_stage_id = self.engine_input_source[0] - source_outputs = stage_list[source_stage_id].engine_outputs - # ... create OmniTokensPrompt from token_ids ... - else: - # Custom transition function (YOUR CODE HERE) - return self.custom_process_input_func( - stage_list, - self.engine_input_source, - prompt, - self.requires_multimodal_data - ) - ``` - - If `custom_process_input_func` is configured, it calls that function - - Otherwise, it uses default behavior (passing token IDs directly) - -4. **Custom Function Execution**: Your custom function receives: - - `stage_list`: List of all stage objects (to access upstream stage outputs) - - `engine_input_source`: List of source stage IDs (e.g., `[0]` for stage 0) - - `prompt`: Original prompt data (for preserving multimodal data) - - `requires_multimodal_data`: Whether multimodal data is required - -5. **Output Format**: The function must return a list of `OmniTokensPrompt` objects ready for the next stage - -### Data Structures in Stage Transitions - -Understanding the data structures is crucial for implementing stage transitions: - -**Input to your function:** -- `stage_list[source_stage_id].engine_outputs`: List of `EngineCoreOutput` objects -- - Each contains `outputs`: List of `RequestOutput` objects - - Each `RequestOutput` has: -- - - `token_ids`: Generated token IDs - - `multimodal_output`: Dict with keys like `"code_predictor_codes"`, etc.These are the hidden states or intermediate outputs from the model's forward pass - - `prompt_token_ids`: Original prompt token IDs - -**Output from your function:** -- Must return `list[OmniTokensPrompt]` where each `OmniTokensPrompt` contains: -- - `prompt_token_ids`: List[int] - Token IDs for the next stage - - `additional_information`: Dict[str, Any] - Optional metadata (e.g., embeddings, hidden states) - - `multi_modal_data`: Optional multimodal data if needed - -### How Model Outputs Are Stored - -The model's `forward()` method returns an `OmniOutput` object that contains: -- `text_hidden_states`: Final hidden states for text generation -- `multimodal_outputs`: Dict containing intermediate outputs - -These outputs are captured during the forward pass and stored in `multimodal_output` with specific keys: - -```python -# In your model's forward() method (e.g., qwen3_omni.py) -def forward(self, ...): - # ... processing ... - - # For thinker stage: capture embeddings and hidden states - multimodal_outputs = { - "0": captured_embeddings, # Layer 0 embeddings - "24": captured_hidden_states, # Layer 24 hidden states - "tts_bos_embed": tts_bos_embed, - "tts_eos_embed": tts_eos_embed, - # ... other intermediate outputs ... - } - - return OmniOutput( - text_hidden_states=hidden_states, - multimodal_outputs=multimodal_outputs, - ) -``` - -These keys are then accessible in your stage transition function: -```python -# In stage_input_processors/qwen3_omni.py -thinker_prefill_embeddings = output.multimodal_output["0"] # Access by key -thinker_hidden_states = output.multimodal_output["24"] -``` - -### Key Points - -1. **Accessing Upstream Outputs**: Use `stage_list[source_stage_id].engine_outputs` to get outputs from the source stage -2. **Extracting Data**: Access `output.multimodal_output[key]` to get specific hidden states or intermediate results - - Keys are defined by your model's `forward()` method when it creates `multimodal_outputs` -3. **Device Management**: Move tensors to appropriate devices (CPU for serialization, GPU for processing) -4. **Shape Transformations**: Reshape tensors as needed for the next stage (e.g., flattening codec codes) -5. **Batch Handling**: Process each request in the batch separately and return a list - -### Complete Flow Diagram - -

- - - Data Flow between stages - -

- -### Implementation Example - -Create stage transition processors in `vllm_omni/model_executor/stage_input_processors/your_model_name.py`: - -```python -# qwen3_omni.py - -def thinker2talker( - stage_list: list[Any], - engine_input_source: list[int], - prompt: OmniTokensPrompt | TextPrompt | None = None, - requires_multimodal_data: bool = False, -) -> list[OmniTokensPrompt]: - """ - Process thinker outputs to create talker inputs. - - Args: - stage_list: List of stage objects - engine_input_source: Source stage IDs (typically [0] for thinker) - prompt: Original prompt data - - Returns: - List of OmniTokensPrompt for talker stage - """ - source_stage_id = engine_input_source[0] - thinker_outputs = stage_list[source_stage_id].engine_outputs - talker_inputs = [] - - for thinker_output in thinker_outputs: - output = thinker_output.outputs[0] - # Extract thinker embeddings and hidden states - thinker_prefill_embeddings = output.multimodal_output["0"].float().clone().detach().cuda() - thinker_hidden_states = output.multimodal_output["24"].float().clone().detach().cuda() - - info = { - "thinker_prefill_embeddings": thinker_prefill_embeddings, - "thinker_hidden_states": thinker_hidden_states, - "thinker_sequences": thinker_output.prompt_token_ids + output.token_ids, - "thinker_input_ids": thinker_output.prompt_token_ids, - } - - talker_inputs.append( - OmniTokensPrompt( - prompt_token_ids=[0] * computed_length, - additional_information=info, - multi_modal_data=None, - ) - ) - - return talker_inputs - - -def talker2code2wav( - stage_list: list[Any], - engine_input_source: list[int], - prompt: OmniTokensPrompt | TextPrompt | None = None, - requires_multimodal_data: bool = False, -) -> list[OmniTokensPrompt]: - """ - Process talker outputs to create code2wav inputs. - """ - source_stage_id = engine_input_source[0] - talker_outputs = stage_list[source_stage_id].engine_outputs - code2wav_inputs = [] - - for talker_output in talker_outputs: - output = talker_output.outputs[0] - # Extract codec codes - codec_codes = ( - output.multimodal_output["code_predictor_codes"] - .to(torch.long) - .transpose(0, 1) - .cpu() - .to(torch.long) - .reshape(-1) - .tolist() - ) - - code2wav_inputs.append( - OmniTokensPrompt( - prompt_token_ids=codec_codes, - multi_modal_data=None, - ) - ) - - return code2wav_inputs -``` - -## Testing - -For comprehensive testing guidelines, please refer to the [Test File Structure and Style Guide](../ci/tests_style.md). - -## 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. - -## Summary - -Adding a new model to vLLM-Omni involves: - -1. **Create model directory structure** with stage implementations -2. **Implement unified model class** that orchestrates stages -3. **Register model** in `registry.py` -4. **Create stage configuration** YAML file -5. **Implement stage input processors** for stage transitions -6. **Write tests** to verify functionality -7. **Add model recipe** to the [vllm-project/recipes](https://github.com/vllm-project/recipes) repository (see [Adding a Model Recipe](#adding-a-model-recipe) section) - -### Qwen3-Omni Reference Files - -For a complete reference implementation, see: - -- **Main model**: `vllm_omni/model_executor/models/qwen3_omni/qwen3_omni.py` -- **Thinker**: `vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_moe_thinker.py` -- **Talker**: `vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_moe_talker.py` -- **Code2Wav**: `vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_code2wav.py` -- **Stage config**: `vllm_omni/deploy/qwen3_omni_moe.yaml` -- **Input processors**: `vllm_omni/model_executor/stage_input_processors/qwen3_omni.py` -- **Registry**: `vllm_omni/model_executor/models/registry.py` -- **Testing**: `vllm_omni/tests/e2e/offline_inference/test_qwen3_omni.py` - -For more information, see: -- [Architecture Overview](../../design/architecture_overview.md) -- [Supported Models](../../models/supported_models.md) -- [Stage Configuration Guide](../../configuration/stage_configs.md) diff --git a/docs/contributing/model/adding_tts_model.md b/docs/contributing/model/adding_tts_model.md deleted file mode 100644 index 34fd2dbb503..00000000000 --- a/docs/contributing/model/adding_tts_model.md +++ /dev/null @@ -1,968 +0,0 @@ -# Adding a TTS Model - -This guide walks through adding a new TTS model to vLLM-Omni. Two patterns are -supported: - -- **Two-stage pipeline** (e.g. Qwen3-TTS, Fish Speech): an AR code-predictor stage - feeds an audio decoder stage via the `async_chunk` framework. This is the standard - pattern for maximum streaming performance. -- **Single-stage AR model** (e.g. MOSS-TTS-Nano): the model runs entirely inside one - AR worker and streams audio chunks directly from its own `inference_stream()` generator. - -Qwen3-TTS is used as the reference for the two-stage pattern. For the single-stage -pattern, refer to MOSS-TTS-Nano. - -## Table of Contents - -1. [Overview](#overview) -2. [Cross-Cutting Invariants](#cross-cutting-invariants) -3. [Directory Structure](#directory-structure) -4. [Step-by-Step Implementation](#step-by-step-implementation) -5. [Key Components](#key-components) -6. [Model Registration](#model-registration) -7. [Stage Configuration](#stage-configuration) -8. [Stage Input Processors](#stage-input-processors) -9. [Online Serving Integration](#online-serving-integration) -10. [Single-Stage Models](#single-stage-models) -11. [Testing](#testing) -12. [Pre-commit and DCO](#pre-commit-and-dco) -13. [Summary](#summary) - -## Cross-Cutting Invariants - -These rules apply to every TTS model regardless of architecture (AR vs AR+diffusion, -single-stage vs two-stage, codec-based vs VAE-based). Each has surfaced as a silent -bug in a shipped PR — check them at the end of every phase, not just at the start. - -**I1. Streaming output contract.** Pick one per-step semantics for `forward()` and -document it in the docstring: - -- *Delta*: yield only new audio samples produced this step. Preferred — linear cost. -- *Cumulative*: re-decode from step 0 every call. O(N²); only acceptable when the - codec exposes no streaming decode. - -If you choose delta, audit the full chain: `forward()` returns the new chunk → -`_consolidate_multimodal_tensors()` in `vllm_omni/engine/output_processor.py` -concatenates the audio key into a single tensor at finish → streaming consumers -receive per-step chunks, offline consumers receive the concatenated tensor. A -mismatch (consolidator skips the key with `continue`, or consumers expect a list -but receive a tensor) is invisible in offline RTF benchmarks — users hear replays -or truncation only under live playback. - -**I2. Multimodal output consumer hygiene.** `outputs[0].outputs[0].multimodal_output[key]` -can be `Tensor`, `list[Tensor]` (pre-consolidation snapshot), `np.ndarray`, or -scalar. In every test, example, and benchmark: - -- Never write `dict.get("a") or dict.get("b")` on tensor values — Python evaluates - the tensor's truthiness and raises `Boolean value of Tensor with more than one - value is ambiguous`. Use explicit `if x is None` chains. -- Defensively handle the list form: - `if isinstance(x, list): x = torch.cat([t.reshape(-1) for t in x], dim=0)`. -- Assert `shape` / `dtype` / `duration` explicitly — do not rely on truthiness for - presence checks. - -**I3. Hot-loop GPU discipline.** Inside any per-step model loop (AR decode, -diffusion solver, CFM Euler step, per-frame vocoder): - -- No `tensor.item()`, `.cpu()`, or `.tolist()` — each triggers a GPU→CPU sync; a - 10-step × 60-frame × 4-op loop creates 2400 syncs per request. -- Prefer `dst.copy_(src)` over `dst.fill_(src.item())` for scalar-into-buffer writes. -- Whole-model `torch.compile(Model.forward, fullgraph=False)` usually outperforms - per-submodule compile — fewer dispatch boundaries, larger fusion regions. Measure - before choosing granularity. -- No Python control flow that depends on tensor values; use `torch.where` or masking. - -Profile before optimizing. - -**I4. Validation pyramid.** Offline RTF alone is necessary but not sufficient. A -new TTS model must pass all three levels: - -| Layer | Catches | Tool | -|-------|---------|------| -| Offline RTF / duration | Throughput regressions, missing audio, wrong sample rate | `end2end.py`, pytest e2e | -| Browser streaming playback | Delta-vs-cumulative bugs, chunk boundary glitches, TTFP regressions | Gradio demo over `/v1/audio/speech?stream=true` | -| Concurrent requests | Per-request state leaks, codec window round-robin gaps | `max_num_seqs>1` smoke with 4+ parallel prompts | - -**I5. Per-request state belongs to the request.** If the model caches anything -across `forward()` calls (streaming generators, codec buffers, sliding-window pads, -CUDA graph state), key it by `info.get("_omni_req_id")` and free the entry on -request finish. A shared buffer silently corrupts audio across concurrent requests — -the symptom is crosstalk or truncation under load, nothing in single-request tests. - -## Overview - -vLLM-Omni supports TTS models as multi-stage pipelines where each stage runs independently -and can be placed on different devices. Qwen3-TTS has two stages: - -| Stage | Name | Input | Output | -|-------|------|-------|--------| -| 0 | Code Predictor (AR) | Text tokens | Discrete RVQ codec codes | -| 1 | Code2Wav (Decoder) | RVQ codec codes | Audio waveform | - -Each stage is a separate model class configured independently via YAML. The two stages -are connected by the `async_chunk` framework, which enables inter-stage streaming for -low first-packet latency (see [Async Chunk Design](../../design/feature/async_chunk.md)). - -### Without async_chunk (batch mode) - -Stage 0 runs to completion before Stage 1 starts, resulting in long first-packet latency: - -```mermaid -flowchart TB - subgraph stage0["Stage 0: AR Code Predictor"] - direction LR - P[Prefill] --> D1[Decode 1] - D1 --> D2[Decode 2] - D2 --> Dots1["..."] - Dots1 --> DN[Decode N] - end - - subgraph stage1["Stage 1: Code2Wav"] - direction LR - DEC[Decode all codes at once] - end - - stage0 -- "all N codes" --> stage1 - stage1 --> FPL["First Packet Latency = Stage 0 + Stage 1"] - - style stage0 fill:#dae8fc,stroke:#6c8ebf - style stage1 fill:#f8d7c8,stroke:#d4856a - style FPL fill:#e8f0fe,stroke:#3366CC,stroke-width:2px -``` - -### With async_chunk (streaming mode) - -Stage 0 sends codec codes to Stage 1 every `chunk_size=25` tokens. Stage 1 begins decoding -immediately, reducing first-packet latency from the full AR time to just the first chunk: - -```mermaid -flowchart TB - subgraph stage0["Stage 0: Code Predictor (AR)"] - direction LR - P[Prefill] --> D1["Decode 1-25"] - D1 --> D2["Decode 26-50"] - D2 --> Dots1["..."] - Dots1 --> DN["Decode N"] - end - - subgraph stage1["Stage 1: Code2Wav"] - direction LR - C1["Chunk 1\n(25 frames)"] --> C2["Chunk 2\n(context + 25)"] - C2 --> Dots2["..."] - Dots2 --> CN["Final chunk"] - end - - D1 -. "chunk 1 (25 codes)" .-> C1 - D2 -. "chunk 2 (context + 25)" .-> C2 - DN -. "final" .-> CN - - stage0 --> FPL["⏱ First Packet Latency = Prefill + 25 decode steps only"] - - style stage0 fill:#dae8fc,stroke:#6c8ebf - style stage1 fill:#e8d4f8,stroke:#8a6cad - style FPL fill:#e8f0fe,stroke:#3366CC,stroke-width:2px -``` - -Key parameters: `chunk_size=25`, `left_context_size=25` (validated defaults from Qwen3-TTS -and Qwen3-Omni). - -## Directory Structure - -When adding a new TTS model, create the following structure: - -``` -vllm_omni/model_executor/models/ - your_model_name/ - __init__.py - your_model.py # Unified class (stage dispatch) - your_model_ar_stage.py # Stage 0: AR stage - your_model_decoder.py # Stage 1: audio decoder - -vllm_omni/model_executor/stage_input_processors/ - your_model_name.py # Stage 0 -> Stage 1 transition - -vllm_omni/model_executor/stage_configs/ - your_model_name.yaml # Batch mode config - your_model_name_async_chunk.yaml # Streaming mode config -``` - -**Qwen3-TTS reference files:** - -| File | Purpose | -|------|---------| -| `models/qwen3_tts/qwen3_tts.py` | Unified model class | -| `models/qwen3_tts/qwen3_tts_code_predictor_vllm.py` | Stage 0 - optimized AR | -| `models/qwen3_tts/qwen3_tts_code2wav.py` | Stage 1 - decoder | -| `deploy/qwen3_tts.yaml` (new schema) | Deploy config (async_chunk enabled) — paired with `models/qwen3_tts/pipeline.py` for the frozen topology | - -> **Chunked vs end-to-end modes**: `qwen3_tts` registers a single -> pipeline whose stage 1 declares alternate processor functions — an -> `async_chunk_process_next_stage_input_func` (per-chunk streaming, used -> when `deploy.async_chunk=True`) and a `sync_process_input_func` -> (batch-end, used when `deploy.async_chunk=False`). The loader selects -> one at merge time based on the bool, so `--no-async-chunk` alone -> switches modes — no variant yaml or variant pipeline registration is -> needed. Pipelines that only make sense in one mode (e.g. -> `qwen3_omni_moe` is always chunked) can keep using the unconditional -> `custom_process_*` fields. -| `stage_input_processors/qwen3_tts.py` | Stage transition processors | - -## Step-by-Step Implementation - -### Step 1: Implement Stage 0 - AR Stage - -Stage 0 is the autoregressive stage that generates intermediate audio representations. -**It must use vLLM's native decoder layers with fused ops and PagedAttention** for the LLM -backbone - this is the primary source of speedup over HuggingFace inference. - -#### 1.1 Use vLLM Decoder Layers Directly - -Build your transformer layers from the corresponding vLLM decoder layer class (e.g. -`Qwen3DecoderLayer` for Qwen3-based backbones, or the equivalent for LLaMA, Qwen2, etc.). -Do not wrap the HuggingFace model directly - that bypasses PagedAttention and fused kernels. - -```python -# your_model_ar_stage.py - -from vllm.model_executor.models.qwen3 import Qwen3DecoderLayer - -class YourTTSARStage(nn.Module): - - def __init__(self, config, vllm_config, prefix): - self.layers = nn.ModuleList([ - Qwen3DecoderLayer( - config, vllm_config=vllm_config, prefix=f"{prefix}.layers.{i}" - ) - for i in range(config.num_hidden_layers) - ]) - self.lm_head = ParallelLMHead(config.codec_size, config.hidden_size) -``` - -See `qwen3_tts_code_predictor_vllm.py` for the full implementation. - -#### 1.2 Forward Pass - -Implement `forward()` to return an `OmniOutput` with intermediate data for Stage 1: - -```python -def forward(self, input_ids, positions, intermediate_tensors=None, - inputs_embeds=None, **kwargs) -> OmniOutput: - hidden_states = self.run_layers(input_ids, positions, intermediate_tensors, inputs_embeds) - logits = self.lm_head(hidden_states) - - return OmniOutput( - text_hidden_states=hidden_states, - multimodal_outputs={ - "audio_codes": self.extract_codes(logits), - }, - ) -``` - -The keys in `multimodal_outputs` are what your stage input processor will read to build -Stage 1 inputs. - -#### 1.3 Weight Loading with Fused QKV - -When using vLLM's fused `QKVParallelLinear`, pack the HF `q_proj`/`k_proj`/`v_proj` weights -into `qkv_proj` using `stacked_params_mapping`. See the `load_weights()` method in -`qwen3_tts_code_predictor_vllm.py` for the standard pattern - it can be reused as-is -for any Qwen-family backbone. - -#### 1.4 Custom Stop Condition (if needed) - -Some TTS models use a learned stop head rather than an EOS token. If your model does this, -implement it inside `sample()`: - -```python -def sample(self, logits, sampling_metadata) -> SamplerOutput | None: - output = self.sampler(logits, sampling_metadata) - if self._stop_head_fired(): - output = mark_as_finished(output) - return output -``` - -### Step 2: Implement Stage 1 - Decoder - -Stage 1 decodes Stage 0 output into audio. It runs outside the scheduler (no PagedAttention -needed). Implement `chunked_decode_streaming()` to support async_chunk streaming: - -```python -# your_model_decoder.py - -class YourTTSDecoder(nn.Module): - - def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""): - super().__init__() - # Initialize your audio decoder (SpeechTokenizer, HiFiGAN, etc.) - - def forward(self, codes: torch.Tensor, **kwargs) -> torch.Tensor: - return self.decoder(codes) - - def chunked_decode_streaming(self, codes, chunk_size=25, - left_context_size=25) -> torch.Tensor: - """Decode with a sliding context window for smooth chunk boundaries.""" - end_index = codes.shape[-1] - context_size = 0 if end_index <= chunk_size else left_context_size - wav_chunk = self(codes) - # Trim left context to avoid duplicate audio - return wav_chunk[..., context_size * self.total_upsample:] -``` - -### Step 3: Implement the Unified Model Class - -The unified class dispatches to the correct stage based on `model_stage` in the config: - -```python -# your_model.py - -class YourTTSModelForConditionalGeneration(nn.Module, SupportsPP): - - def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""): - super().__init__() - self.model_stage = vllm_config.model_config.model_stage - - if self.model_stage == "ar_stage": - ar_vllm_config = vllm_config.with_hf_config( - vllm_config.model_config.hf_config.ar_config, - architectures=["YourTTSARStageForConditionalGeneration"], - ) - self.ar_stage = init_vllm_registered_model( - vllm_config=ar_vllm_config, - prefix=maybe_prefix(prefix, "ar"), - hf_config=ar_vllm_config.model_config.hf_config, - architectures=["YourTTSARStageForConditionalGeneration"], - ) - self.model = self.ar_stage - - elif self.model_stage == "decoder": - self.decoder = YourTTSDecoder(vllm_config=vllm_config, prefix=prefix) - self.model = self.decoder -``` - -### Step 4: Create `__init__.py` - -```python -# vllm_omni/model_executor/models/your_model_name/__init__.py -from .your_model import YourTTSModelForConditionalGeneration - -__all__ = ["YourTTSModelForConditionalGeneration"] -``` - -## Key Components - -### Model Interfaces - -Your unified model class should implement the appropriate interfaces: - -- **`SupportsPP`**: Required for pipeline parallelism support (all models should implement this) -- **`SupportsMultiModal`**: Only if your model accepts multimodal inputs (e.g. reference audio for voice cloning) - -### Output Format - -Use `OmniOutput` so the orchestrator can route intermediate data between stages: - -```python -from vllm_omni.model_executor.models.output_templates import OmniOutput - -return OmniOutput( - text_hidden_states=hidden_states, - multimodal_outputs={ - "audio_codes": codec_codes, - }, -) -``` - -### Weight Loading from a Single Checkpoint - -If both stages load from one checkpoint, separate them by prefix in the unified class: - -```python -def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]: - ar_weights, decoder_weights = [], [] - for name, tensor in weights: - if name.startswith("decoder."): - decoder_weights.append((name, tensor)) - else: - ar_weights.append((name, tensor)) - - if self.model_stage == "ar_stage": - return self.ar_stage.load_weights(ar_weights) - elif self.model_stage == "decoder": - return self.decoder.load_weights(decoder_weights) -``` - -## Model Registration - -Register all stage classes in `vllm_omni/model_executor/models/registry.py`: - -```python -_OMNI_MODELS = { - # (package_name, module_name, class_name) - "YourTTSModelForConditionalGeneration": ( - "your_model_name", "your_model", - "YourTTSModelForConditionalGeneration", - ), - "YourTTSARStageForConditionalGeneration": ( - "your_model_name", "your_model_ar_stage", - "YourTTSARStageForConditionalGeneration", - ), - "YourTTSDecoder": ( - "your_model_name", "your_model_decoder", - "YourTTSDecoder", - ), -} -``` - -The registry uses lazy loading - model classes are only imported when needed. - -## Stage Configuration - -Each stage has a `worker_type` that determines how it is scheduled: - -- `worker_type: ar` - autoregressive stage, uses `OmniARScheduler` with PagedAttention -- `worker_type: generation` - non-AR stage (e.g. decoder), uses `OmniGenerationScheduler` - -Key configuration fields: - -| Field | Description | -|-------|-------------| -| `model_stage` | Which stage to initialize (`ar_stage`, `decoder`, etc.) | -| `model_arch` | Architecture name, must match `registry.py` | -| `engine_input_source` | List of upstream stage IDs that provide input (e.g. `[0]`) | -| `engine_output_type` | Output type: `latent` for intermediate, `audio` for final | -| `custom_process_next_stage_input_func` | Async chunk processor function path (streaming only) | -| `final_output` | Whether this stage produces the final user-facing output | -| `final_output_type` | Type of final output (`audio`, `text`, etc.) | - -### Batch mode - -```yaml -# stage_configs/your_model_name.yaml - -stage_args: - - stage_id: 0 - stage_type: llm - runtime: - devices: "0" - engine_args: - model_stage: ar_stage - max_num_seqs: 64 - model_arch: YourTTSModelForConditionalGeneration - worker_type: ar - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - engine_output_type: latent - default_sampling_params: - temperature: 0.9 - top_k: 50 - max_tokens: 2048 - - - stage_id: 1 - stage_type: llm - runtime: - devices: "0" - engine_args: - model_stage: decoder - model_arch: YourTTSModelForConditionalGeneration - worker_type: generation - scheduler_cls: vllm_omni.core.sched.omni_generation_scheduler.OmniGenerationScheduler - engine_output_type: audio - engine_input_source: [0] - final_output: true - final_output_type: audio -``` - -### Streaming mode (async_chunk) - -Add `async_chunk: true` at the top level and specify `custom_process_next_stage_input_func` -on Stage 0 to define how intermediate outputs are chunked and forwarded: - -```yaml -# stage_configs/your_model_name_async_chunk.yaml - -async_chunk: true - -stage_args: - - stage_id: 0 - stage_type: llm - runtime: - devices: "0" - engine_args: - model_stage: ar_stage - max_num_seqs: 64 - model_arch: YourTTSModelForConditionalGeneration - worker_type: ar - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - engine_output_type: latent - custom_process_next_stage_input_func: > - vllm_omni.model_executor.stage_input_processors.your_model_name.ar2decoder_async_chunk - default_sampling_params: - temperature: 0.9 - top_k: 50 - max_tokens: 2048 - - - stage_id: 1 - stage_type: llm - runtime: - devices: "0" - engine_args: - model_stage: decoder - model_arch: YourTTSModelForConditionalGeneration - worker_type: generation - scheduler_cls: vllm_omni.core.sched.omni_generation_scheduler.OmniGenerationScheduler - engine_output_type: audio - engine_input_source: [0] - final_output: true - final_output_type: audio -``` - -## Stage Input Processors - -Stage input processors convert Stage 0 outputs into Stage 1 inputs. Create yours in -`vllm_omni/model_executor/stage_input_processors/your_model_name.py`. - -See `stage_input_processors/qwen3_tts.py` for the full reference implementation. - -### Data structures - -Understanding what's available in stage outputs: - -- `stage_list[source_id].engine_outputs` - list of `EngineCoreOutput` objects -- Each `EngineCoreOutput` has `outputs` - list of `RequestOutput` objects -- Each `RequestOutput` has: - - `token_ids` - generated token IDs - - `multimodal_output` - dict with keys matching your model's `OmniOutput.multimodal_outputs` - - `prompt_token_ids` - original prompt token IDs - -### Batch mode (non-streaming) - -Collects all Stage 0 outputs and forwards them to Stage 1 in one shot: - -```python -def ar2decoder( - stage_list: list[Any], - engine_input_source: list[int], - prompt: OmniTokensPrompt | TextPrompt | None = None, - requires_multimodal_data: bool = False, -) -> list[OmniTokensPrompt]: - source_id = engine_input_source[0] - decoder_inputs = [] - - for output in stage_list[source_id].engine_outputs: - result = output.outputs[0] - codes = result.multimodal_output["audio_codes"].cpu() - decoder_inputs.append( - OmniTokensPrompt(prompt_token_ids=codes.reshape(-1).tolist()) - ) - - return decoder_inputs -``` - -### Streaming mode (async_chunk) - -Buffers Stage 0 outputs and forwards a chunk to Stage 1 once `chunk_size` frames -have accumulated. The function signature follows the `OmniChunkTransferAdapter` protocol: - -```python -def ar2decoder_async_chunk( - transfer_manager: Any, - pooling_output: dict[str, Any] | None, - request: Any, - is_finished: bool = False, -) -> dict[str, Any] | None: - """Forward chunks of AR output to the decoder stage.""" - request_id = request.external_req_id - finished = bool(is_finished or request.is_finished()) - - # Extract and buffer the latest frame - if isinstance(pooling_output, dict): - frame = extract_frame(pooling_output) - if frame is not None: - transfer_manager.code_prompt_token_ids[request_id].append( - frame.cpu().tolist() - ) - elif not finished: - return None - - # Read chunk config from connector - chunk_size = 25 - left_context_size = 25 - - length = len(transfer_manager.code_prompt_token_ids[request_id]) - if length <= 0: - if finished: - return {"codes": [], "finished": torch.tensor(True, dtype=torch.bool)} - return None - - # Wait until a full chunk is ready (or request is finished) - chunk_length = length % chunk_size - if chunk_length != 0 and not finished: - return None - - # Build context window: left_context + chunk - context_length = chunk_length if chunk_length != 0 else chunk_size - end_index = min(length, left_context_size + context_length) - window = transfer_manager.code_prompt_token_ids[request_id][-end_index:] - - return { - "codes": torch.tensor(window).transpose(0, 1).reshape(-1).tolist(), - "left_context_size": max(0, int(end_index - context_length)), - "finished": torch.tensor(finished, dtype=torch.bool), - } -``` - -Key points: -- `transfer_manager` is the `OmniChunkTransferAdapter` that owns the chunk lifecycle -- Each call appends one AR decode step's output; a chunk is emitted every `chunk_size` steps -- The final (possibly partial) chunk is flushed when `is_finished` is true -- `left_context_size` frames of overlap are included for smooth audio boundaries - -## Testing - -For general testing conventions, see [tests_style.md](../ci/tests_style.md). - -Recommended test cases for a new TTS model: - -1. **Single request** - verify waveform output shape and sample rate -2. **Batched requests** - verify each request in the batch finishes independently -3. **async_chunk streaming** - verify audio chunks arrive incrementally and decode correctly -4. **Speaker conditioning** (if applicable) - verify different speaker inputs produce different outputs - -Reference test: `tests/model_executor/stage_input_processors/test_qwen3_tts_async_chunk.py` - -### E2E Online Serving Tests (`tests/e2e/online_serving/test_.py`) - -The `omni_server` fixture in `tests/conftest.py` is **module-scoped**. Each distinct -`OmniServerParams` id in the same test file forces the fixture to tear the server -down and spawn a new one mid-module. A few rules that save real CI debugging time: - -- **Prefer a single `OmniServerParams` set per file.** If you need to exercise two - deploy variants (e.g. `model.yaml` and `model_async_chunk.yaml`), either use one - variant and exercise streaming via request args, or split into two test files so - each file does exactly one server lifecycle. Mid-module teardown/restart is the - fragile path and surfaces startup races first. -- **Never depend on server-side fetching of external URLs** for reference audio or - other fixture data. CI runners (and China-hosted dev boxes) routinely fail on - SSL/DNS for public URLs. Inline the payload as a `data:audio/wav;base64,...` - ref_audio value — the serving layer accepts both forms. -- **Don't roll your own readiness probe.** The harness already waits for HTTP 200 - on `/health` before releasing the server to the test. If your model needs extra - warmup signals, expose them through `/health` rather than adding `time.sleep(...)` - inside the test. (Bare TCP `connect_ex` probes were insufficient; see - `tests/conftest.py` `OmniServer.wait_for_ready`.) -- **Use `core_model` marker + H100 hardware_test** to match the `test-ready.yml` - pipeline so your test is picked up by the `ready` label, not only nightly. - -## Online Serving Integration - -To expose your model through the `/v1/audio/speech` OpenAI-compatible endpoint, add -**all five** of the following integration points to -`vllm_omni/entrypoints/openai/serving_speech.py` in a **single commit**. Adding them -piecemeal causes partial-integration failures that are hard to debug. - -### 1. Stage constant - -Near the top of the file, alongside the other `_*_TTS_MODEL_STAGES` constants: - -```python -_YOUR_MODEL_TTS_MODEL_STAGES = {"your_model_stage_key"} -``` - -### 2. Union into `_TTS_MODEL_STAGES` - -Add to the `_TTS_MODEL_STAGES` set union: - -```python -_TTS_MODEL_STAGES: set[str] = ( - ... - | _YOUR_MODEL_TTS_MODEL_STAGES -) -``` - -### 3. Model type detection - -In `_detect_tts_model_type()`, add before the final `return None`: - -```python -if model_stage in _YOUR_MODEL_TTS_MODEL_STAGES: - return "your_model" -``` - -### 4. Request validation dispatch - -In `_validate_tts_request()`, add before the fallback `return`: - -```python -if self._tts_model_type == "your_model": - return self._validate_your_model_request(request) -``` - -### 5. Validation and parameter-builder methods - -Add two new methods: - -```python -def _validate_your_model_request( - self, request: OpenAICreateSpeechRequest -) -> str | None: - """Validate YourModel request. Returns an error string or None.""" - if not request.input or not request.input.strip(): - return "Input text cannot be empty" - return None - -def _build_your_model_params( - self, request: OpenAICreateSpeechRequest -) -> dict[str, Any]: - """Build additional_information dict for YourModel.""" - params: dict[str, Any] = {"text": [request.input]} - if request.voice is not None: - params["voice"] = [request.voice] - # Add any other model-specific fields here - return params -``` - -Then wire `_build_your_model_params` into the request-dispatch block in -`_create_tts_request()` (search for the equivalent `_build_*_params` call for an -existing model to find the right location). If the model supports voice cloning -(`ref_audio` → `prompt_audio_path`, `ref_text` → `prompt_text`), add those mappings -here too — follow any existing `_build__params` in `serving_speech.py` (e.g. -`_build_moss_tts_params` for the voice-cloning variant) for the pattern. - -> **Two dispatch patterns coexist:** Fish Speech uses a `self._is_fish_speech` boolean -> checked *before* `elif self._is_tts`. All newer models use the `_tts_model_type` -> string pattern shown above. For new models, always use the string pattern — do not -> add new `_is_*` boolean flags. - -> **Note on unused variables:** Only extract parameters in `_build_your_model_params` -> that you actually pass to the model's generate / `inference_stream` call. Extracting -> a variable without forwarding it will trigger a `ruff F841` pre-commit failure. - -### Merge conflicts - -`serving_speech.py` is modified by every new model PR and is the most common source of -rebase conflicts. When rebasing onto `main` and a conflict appears here, the resolution -is always to **keep both** the upstream model's additions and your own — never discard -either side. After resolving: - -```bash -git add vllm_omni/entrypoints/openai/serving_speech.py -git rebase --continue -``` - -## Single-Stage Models - -Some TTS models (e.g. MOSS-TTS-Nano) do not use a two-stage pipeline. Instead the -entire AR LM and audio decoder run inside a single AR worker, streaming audio chunks -directly from the model's own generator. - -### Directory structure - -``` -vllm_omni/model_executor/models/your_model_name/ - __init__.py - modeling_your_model_name.py # unified class: load_weights + forward + streaming - -vllm_omni/model_executor/stage_configs/your_model_name.yaml -``` - -No stage input processor is needed. - -### Stage config - -Use a single stage with `worker_type: ar`. The `is_comprehension: true` field and the -top-level `async_chunk: false` are required — omitting them causes silent -misclassification in the serving layer. Set `max_num_seqs` to at least 4 for -concurrent production use. - -```yaml -# stage_configs/your_model_name.yaml -async_chunk: false - -stage_args: - - stage_id: 0 - stage_type: llm - is_comprehension: true # required for serving_speech.py dispatch - runtime: - devices: "0" - engine_args: - model_stage: your_model_stage_key - model_arch: YourModelForCausalLM - worker_type: ar - scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - engine_output_type: audio - max_num_seqs: 4 # min 4 for concurrent requests; default 1 causes gaps - final_output: true - final_output_type: audio -``` - -### Generator-based streaming pattern - -This is the MOSS-TTS-Nano pattern, distinct from VoxCPM2's vLLM-native AR pattern -(see `plan/voxcpm2_native_ar_design.md` for that variant). Load model weights in -`load_weights()` (not `__init__`) so vLLM finishes distributed initialisation before -any CUDA allocations. Stream via a per-request generator stored in an instance dict: - -```python -class YourModelForCausalLM(nn.Module): - - def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""): - super().__init__() - self._lm: nn.Module | None = None # populated in load_weights() - self._stream_gens: dict[str, Any] = {} # request_key → generator - - def load_weights(self, weights): - # Load self._lm here, after vLLM distributed init - ... - - def forward( - self, - input_ids, - positions, - intermediate_tensors=None, - inputs_embeds=None, - runtime_additional_information: list[dict] | None = None, # one dict per request - **kwargs, - ) -> OmniOutput: - infos = runtime_additional_information or [{}] - # Return empty output during dummy/profiling calls - if not runtime_additional_information or all(i.get("_is_dummy") for i in infos): - self._ar_emit_stop_token = True - return OmniOutput(...) - - outputs, last_flags = [], [] - for info in infos: - request_key = str(info.get("_omni_req_id", "0")) # set by vLLM, not user code - if request_key not in self._stream_gens: - self._stream_gens[request_key] = self._create_stream_gen(info) - try: - chunk, is_last = next(self._stream_gens[request_key]) - except StopIteration: - chunk, is_last = torch.zeros(0), True - if is_last: - del self._stream_gens[request_key] - outputs.append(chunk) - last_flags.append(is_last) - - self._ar_emit_stop_token = all(last_flags) - return OmniOutput(multimodal_outputs={"model_outputs": outputs, "is_last": last_flags}) - - def _create_stream_gen(self, info: dict): - """Yield (waveform_tensor, is_last) from the model's inference_stream(). - - Handle both incremental ("audio" events) and batch ("result" event) models: - some upstream implementations emit one "result" event with the full waveform - instead of incremental "audio" events. Both paths must be covered. - """ - for event in self._lm.inference_stream(...): - if event["type"] == "audio": - yield event["waveform"], False - elif event["type"] == "result": - # Fallback for models that don't emit incremental audio events - yield event.get("waveform", torch.zeros(0)), True - return - yield torch.zeros(0), True - - def compute_logits(self, hidden_states, sampling_metadata): - # Emit EOS only when the last chunk has been yielded so the AR - # scheduler ends the request at the right time. - ... -``` - -For an in-tree reference, look for any single-stage AR model under -`vllm_omni/model_executor/models/` (for example -`moss_tts_nano/modeling_moss_tts_nano.py` once its integration has landed). - -## Pre-commit and DCO - -All contributions must pass the pre-commit checks and the Developer Certificate of -Origin (DCO) sign-off before merging. - -### Running pre-commit - -Install the hooks once with `pre-commit install`. Then run before committing: - -```bash -pre-commit run --files \ - vllm_omni/model_executor/models/your_model_name/*.py \ - vllm_omni/entrypoints/openai/serving_speech.py \ - vllm_omni/model_executor/models/registry.py \ - tests/e2e/offline_inference/test_your_model_name.py \ - tests/e2e/online_serving/test_your_model_name.py -``` - -When pre-commit **modifies files**, it exits with a non-zero code but the reformatting -is correct. Stage the modified files and commit again — do not revert the changes. - -Common failures and fixes: - -| Check | Cause | Fix | -|-------|-------|-----| -| `ruff F841` | Local variable assigned but never used | Remove the extraction or forward it to the model call | -| `ruff E402` | Module-level import not at top of file | Move import to the top-level import block | -| `ruff format` | Line length, spacing, or quote style | Accept the auto-fix, stage, and re-commit | - -### DCO sign-off - -Every commit must carry a `Signed-off-by` trailer. Use the `-s` flag when committing: - -```bash -git commit -s -m "feat(your-model): add YourModel TTS support" -``` - -Or configure git to add it automatically: - -```bash -git config format.signOff true -``` - -To fix a missing sign-off on the most recent commit: - -```bash -git commit --amend -s --no-edit -git push origin your-branch --force-with-lease -``` - -> The DCO check verifies that the commit author email matches the `Signed-off-by` email. -> Make sure `git config user.email` is set to the address associated with your GitHub -> account before committing. - -## Adding a Model Recipe - -After implementing and testing your model, add a model recipe to the -[vllm-project/recipes](https://github.com/vllm-project/recipes) repository so users can -get started quickly. See [Adding an Omni-Modality Model](./adding_omni_model.md#adding-a-model-recipe) -for the expected format. - -## Summary - -Adding a TTS model to vLLM-Omni involves: - -1. **Create model directory** with AR stage, decoder stage, and unified class (two-stage) - or a single unified class with generator-based streaming (single-stage) -2. **AR stage** - use vLLM's native decoder layers with fused QKV; do not wrap HF directly -3. **Decoder stage** - thin wrapper around your audio decoder; implement `chunked_decode_streaming()` -4. **Unified class** - dispatches on `model_stage`; same structure as `Qwen3TTSModelForGeneration` -5. **Register** all stage classes in `registry.py` -6. **YAML configs** - provide both batch and `async_chunk` variants (two-stage), or a single-stage AR config -7. **Stage input processor** - buffer Stage 0 outputs and forward in chunks of 25 (two-stage only) -8. **Online serving** - add all 5 integration points to `serving_speech.py` in one commit -9. **Tests** - cover single request, batching, and streaming -10. **Pre-commit + DCO** - run `pre-commit` before pushing; sign every commit with `git commit -s` -11. **Model recipe** - add to [vllm-project/recipes](https://github.com/vllm-project/recipes) -12. **Invariants** - re-check I1–I5 (streaming contract, consumer hygiene, hot-loop discipline, validation pyramid, per-request state) at the end of every phase - -### Qwen3-TTS Reference Files - -| File | Purpose | -|------|---------| -| `models/qwen3_tts/qwen3_tts.py` | Unified model class | -| `models/qwen3_tts/qwen3_tts_code_predictor_vllm.py` | AR stage with vLLM fused ops | -| `models/qwen3_tts/qwen3_tts_code2wav.py` | Decoder stage with `chunked_decode_streaming()` | -| `models/qwen3_tts/pipeline.py` | Frozen pipeline topology (registered at import time) | -| `deploy/qwen3_tts.yaml` | Deploy config (user-editable, async_chunk + SharedMemoryConnector) | -| `stage_input_processors/qwen3_tts.py` | Stage transition processors | - -For more information, see: - -- [Architecture Overview](../../design/architecture_overview.md) -- [Async Chunk Design](../../design/feature/async_chunk.md) -- [Stage Configuration Guide](../../configuration/stage_configs.md) diff --git a/docs/contributing/profiling.md b/docs/contributing/profiling.md deleted file mode 100644 index e1dbc8234b0..00000000000 --- a/docs/contributing/profiling.md +++ /dev/null @@ -1,286 +0,0 @@ -# Profiling Diffusion Models - -> **Warning:** Profiling is for development and debugging only. It adds significant overhead and should not be enabled in production. - -Diffusion profiling supports two backends through `profiler_config`: - -- `torch`: detailed CPU/CUDA traces, operator tables, and optional memory snapshots -- `cuda`: low-overhead CUDA range control for NVIDIA Nsight Systems (`nsys`) - -## 1. Configure `profiler_config` - -Use `profiler_config` to enable profiling for a diffusion model. For diffusion usage, pass it directly to `Omni(...)` or `vllm serve`. - -Minimal torch-profiler config: - -```yaml -profiler_config: - profiler: torch - torch_profiler_dir: ./perf -``` - -Supported fields: - -| Field | Description | -|---|---| -| `profiler` | Profiler backend. Supported values: `torch`, `cuda`. Use `torch` for `trace.json`, Excel operator tables, and optional memory snapshots. Use `cuda` for Nsight Systems only. | -| `torch_profiler_dir` | Output directory for torch-profiler artifacts. Required when `profiler: torch`. | -| `torch_profiler_use_gzip` | Compress `trace_rank*.json` into `trace_rank*.json.gz`. | -| `torch_profiler_record_shapes` | Record input shapes and add a `by_shape` sheet to `ops_rank*.xlsx`. | -| `torch_profiler_with_stack` | Record call stacks, add a `by_stack` sheet to `ops_rank*.xlsx`, and export `stacks_cpu_rank*.txt` and `stacks_cuda_rank*.txt`. | -| `torch_profiler_with_memory` | Enable memory profiling and attempt to dump `memory_snapshot_rank*.pickle`. The pickle is only generated when the current backend supports memory history and snapshot APIs. | -| `torch_profiler_with_flops` | Enable FLOPs collection in `torch.profiler`. This does not add a separate output file. | -| `torch_profiler_dump_cuda_time_total` | Export an additional text summary `profiler_out_.txt` sorted by `self_cuda_time_total`. | -| `delay_iterations` | Number of worker iterations to skip before profiling starts. | -| `max_iterations` | Maximum number of worker iterations to capture before auto-stop. | -| `wait_iterations` | Torch-profiler wait iterations before warmup. | -| `warmup_iterations` | Torch-profiler warmup iterations. | -| `active_iterations` | Torch-profiler active iterations. | - -### Minimal configurations by output - -Only collect trace output: - -```python -profiler_config = { - "profiler": "torch", - "torch_profiler_dir": "./perf", -} -``` - -Outputs: - -- `trace_rank*.json` -- `ops_rank*.xlsx` with a `summary` sheet - -Collect compressed trace output: - -```python -profiler_config = { - "profiler": "torch", - "torch_profiler_dir": "./perf", - "torch_profiler_use_gzip": True, -} -``` - -Outputs: - -- `trace_rank*.json.gz` -- `ops_rank*.xlsx` with a `summary` sheet - -Collect trace and full operator tables: - -```python -profiler_config = { - "profiler": "torch", - "torch_profiler_dir": "./perf", - "torch_profiler_record_shapes": True, - "torch_profiler_with_stack": True, -} -``` - -Outputs: - -- `trace_rank*.json` -- `ops_rank*.xlsx` with `summary`, `by_shape`, and `by_stack` -- `stacks_cpu_rank*.txt` -- `stacks_cuda_rank*.txt` - -Collect trace, operator tables, and memory snapshots: - -```python -profiler_config = { - "profiler": "torch", - "torch_profiler_dir": "./perf", - "torch_profiler_record_shapes": True, - "torch_profiler_with_stack": True, - "torch_profiler_with_memory": True, -} -``` - -Outputs: - -- `trace_rank*.json` -- `ops_rank*.xlsx` with `summary`, `by_shape`, and `by_stack` -- `stacks_cpu_rank*.txt` -- `stacks_cuda_rank*.txt` -- `memory_snapshot_rank*.pickle` when supported by the current backend - -### Full torch-profiler configuration - -If you want to enable the commonly used torch-profiler options together: - -```python -profiler_config = { - "profiler": "torch", - "torch_profiler_dir": "./perf", - "torch_profiler_use_gzip": False, - "torch_profiler_record_shapes": True, - "torch_profiler_with_stack": True, - "torch_profiler_with_memory": True, - "torch_profiler_with_flops": False, - "torch_profiler_dump_cuda_time_total": False, - "delay_iterations": 0, - "max_iterations": 0, - "wait_iterations": 0, - "warmup_iterations": 0, - "active_iterations": 0, -} -``` - -## 2. Profiling Diffusion with PyTorch Profiler - -Single-stage diffusion models use `start_profile()` / `stop_profile()` controls. The profiler only writes artifacts after profiling has been started and then stopped. - -```python -from vllm_omni import Omni - -omni = Omni( - model="Wan-AI/Wan2.2-I2V-A14B-Diffusers", - profiler_config={ - "profiler": "torch", - "torch_profiler_dir": "./perf", - }, -) - -omni.start_profile() -... -omni.stop_profile() -``` - -For diffusion offline example scripts under `examples/offline_inference/`, pass `--profiler-config` as a JSON object. The script enables profiling when this argument is set and wraps generation with `start_profile()` / `stop_profile()`. - -Example: - -```bash -python examples/offline_inference/image_to_video/image_to_video.py \ - --model Wan-AI/Wan2.2-I2V-A14B-Diffusers \ - --image input.jpg \ - --prompt "A cat playing with yarn" \ - --profiler-config '{ - "profiler": "torch", - "torch_profiler_dir": "./perf", - "torch_profiler_record_shapes": true, - "torch_profiler_with_stack": true - }' -``` - -Examples: - -1. [Image edit example](https://github.com/vllm-project/vllm-omni/blob/main/examples/offline_inference/image_to_image/image_edit.py) -2. [Image to video example](https://github.com/vllm-project/vllm-omni/tree/main/examples/offline_inference/image_to_video) - -## 3. Profiling Diffusion with Nsight Systems (`nsys`) - -For Nsight Systems, use `profiler: cuda` and wrap the process with `nsys profile`. - -```bash -nsys profile \ - --trace-fork-before-exec=true \ - --cuda-graph-trace=node \ - --capture-range=cudaProfilerApi \ - --capture-range-end=repeat \ - -o diffusion_trace \ - python image_to_video.py ... -``` - -The Python process being profiled must create the diffusion engine with: - -```python -profiler_config = {"profiler": "cuda"} -``` - -Then call `start_profile()` before the requests you want to capture and `stop_profile()` after them. The diffusion worker processes open and close the CUDA capture range themselves, so `nsys` sees the actual GPU work instead of only the parent process. - -## 4. Profiling Online Serving - -When `profiler_config.profiler` is set for a diffusion model, the server exposes: - -- `POST /start_profile` -- `POST /stop_profile` - -### Start the server - -Single-stage diffusion serving with torch profiler: - -```bash -vllm serve Wan-AI/Wan2.2-I2V-A14B-Diffusers \ - --omni \ - --port 8091 \ - --profiler-config '{ - "profiler": "torch", - "torch_profiler_dir": "/tmp/vllm_profile_wan22_i2v", - "torch_profiler_with_stack": true, - "torch_profiler_with_flops": false, - "torch_profiler_use_gzip": true, - "torch_profiler_dump_cuda_time_total": false, - "torch_profiler_record_shapes": true, - "torch_profiler_with_memory": true, - "delay_iterations": 0, - "max_iterations": 0, - "wait_iterations": 0, - "warmup_iterations": 0, - "active_iterations": 0 - }' -``` - -Single-stage diffusion serving with Nsight Systems: - -```bash -nsys profile \ - --trace-fork-before-exec=true \ - --cuda-graph-trace=node \ - --capture-range=cudaProfilerApi \ - --capture-range-end=repeat \ - -o serving_trace \ - vllm serve Wan-AI/Wan2.2-I2V-A14B-Diffusers \ - --omni \ - --port 8091 \ - --profiler-config '{"profiler": "cuda"}' -``` - -### Control capture - -Example profiling flow for an online Qwen-Image request: - -```bash -# Start profiling. -curl -X POST http://localhost:8091/start_profile - -# Send a Qwen-Image generation request while profiling is active. -curl http://localhost:8091/v1/images/generations \ - -H "Content-Type: application/json" \ - -d '{ - "model": "Qwen/Qwen-Image", - "prompt": "A red vintage bicycle parked beside a quiet canal at sunset" - }' - -# Stop profiling and flush profiler artifacts. -curl -X POST http://localhost:8091/stop_profile -``` - -## 5. Diffusion Pipeline Profiler - -For lightweight per-stage pipeline timing such as `vae.decode` or `diffuse`, see [Diffusion Pipeline Profiler](model/adding_diffusion_model.md#diffusion-pipeline-profiler-performance-profiling). That utility logs stage durations only and does not generate torch-profiler artifacts such as `trace.json`, Excel tables, or memory snapshots. - -## 6. Analyze Results - -Torch-profiler output: - -- Chrome/Perfetto trace: `trace_rank*.json` or `trace_rank*.json.gz` -- Excel workbook: `ops_rank*.xlsx` with `summary`, and optional `by_shape` / `by_stack` sheets -- Stack exports: `stacks_cpu_rank*.txt` and `stacks_cuda_rank*.txt` when stack capture is enabled -- Memory snapshot: `memory_snapshot_rank*.pickle` when memory capture is enabled and supported by the backend -- Optional CUDA-time text summary: `profiler_out_.txt` when `torch_profiler_dump_cuda_time_total` is enabled - -CUDA profiler / Nsight Systems output: - -- `.nsys-rep` report files written by `nsys -o ...` - -Recommended viewers: - -- [Perfetto](https://ui.perfetto.dev/) for torch traces -- `nsys stats .nsys-rep` for CLI summaries -- Nsight Systems GUI for CUDA kernel timelines - -For upstream background on the underlying vLLM profiling infrastructure, see the [vLLM profiling guide](https://docs.vllm.ai/en/stable/contributing/profiling/). diff --git a/docs/design/architecture_overview.md b/docs/design/architecture_overview.md deleted file mode 100644 index 1c38ba67183..00000000000 --- a/docs/design/architecture_overview.md +++ /dev/null @@ -1,202 +0,0 @@ -# Architecture Overview - -This document outlines the architectural design for vLLM-Omni. - -

- - - Omni-Modality Model Architecture - -

- -# Goals - -The primary goal of the vLLM-Omni project is to build the fastest and easiest-to-use open-source Omni-Modality model inference & serving engine. vLLM-Omni extends the original vLLM, which was created to support large language models for text-based autoregressive (AR) generation tasks. vLLM-Omni is designed to support: - -* **Non-textual Output:** Enables the integration, efficient processing and output of various data types, including but not limited to, images, audio, and video, alongside text. -* **Non-Autoregressive Structure:** Support model structure beyond autoregressive, especially Diffusion Transformer (DiT), which is widely used in visual and audio generation. -* **Integration with vLLM Core:** Maintain compatibility and leverage existing vLLM key modules and optimizations where applicable. -* **Extensibility:** Design a modular and flexible architecture that can easily accommodate new modalities, model architectures, and output formats. - - -# Representative omni-modality models - -According to analysis for current popular open-source models, most of them have the combination of AR+DiT. Specifically, they can be further categorized into 3 types below: - -**DiT as a main structure, with AR as text encoder (e.g.: Qwen-Image)** - A powerful image generation foundation model capable of complex text rendering and precise image editing. - -

- - - Qwen-Image - -

- -**AR as a main structure, with DiT as multi-modal generator (e.g. BAGEL)** - A unified multimodal comprehension and generation model, with cot text output and visual generation. - -

- - - Bagel - -

- -**AR+DiT (e.g. Qwen-Omni)** - A natively end-to-end omni-modal LLM for multimodal inputs (text/image/audio/video...) and outputs (text/audio...). - -

- - - Qwen-Omni - -

- -# vLLM-Omni main architecture - -

- - - vLLM-Omni Main Architecture - -

- -## Key Components - -| Component | Description | -| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| **OmniRouter** | provide an intelligent router for Omni-modality requests dispatch | -| **EntryPoints** | define the APIs for offline/online serving (APIServer, Omni/AsyncOmni), while `AsyncOmniEngine` and `Orchestrator` coordinate multi-stage AR/DiT execution | -| **AR** | adapted for omni-modality models while inheriting efficient features from vLLM, such as cache management | -| **Diffusion** | natively implemented and optimized using acceleration components | -| **OmniConnector** | supports fully disaggregation based on E/P/D/G (Encoding/Processing/Decoding/Generation) disaggregation across stages | - -Disaggregated stages are managed through stage configuration. In Qwen3-Omni, Thinker/Talker/Code2wav are declared as separate configured stages, and runtime routing is handled by `Orchestrator` over `StageEngineCoreClient` / `StageDiffusionClient`. - -## Main features - -vLLM-Omni aims to be fast, flexible, and easy to use with the following features: - -### Performance and Acceleration - -The framework achieves high performance through several optimization techniques: - -* **Efficient AR Support:** Leverages efficient KV cache management inherited from vLLM. -* **Pipelined Execution:** Uses pipelined stage execution overlapping to ensure high throughput. -* **Full Disaggregation:** Relies on the OmniConnector and dynamic resource allocation across stages. -* **Diffusion Acceleration:** Includes integrated support for diffusion acceleration. This is managed by the acceleration layer, which handles: - * **Cache:** Includes DBCache, TeaCache and third-party integration(e.g., [cache-dit](https://github.com/vipshop/cache-dit)). - * **Parallelism:** Supports TP, CP, USP, and CFG. - * **Attention:** Provides an interface for third-party integration (e.g., FA3, SAGE, MindIE-SD). - * **Quantization:** Supports various quantization implementations including FP8 and AWQ. - * **FusedOps:** Allows for custom and third-party integration. - -### Classifier-Free Guidance (CFG) Companion Flow - -vLLM-Omni natively models Classifier-Free Guidance (CFG) across disaggregated multi-stage setups via a "companion request" paradigm, eliminating redundant textual/multimodal context computation boundaries: -1. **Prompt Expansion:** In the initial autoregressive (AR) stage, a customized `prompt_expand_func` hook intercepts incoming generation prompts and pairs them directly with negative companion prompts (e.g., a default negative prompt) on the fly, tagging the secondary prompt with a specific internal role (`cfg_text`). -2. **Synchronized KV Cache Transfer:** The AR stage evaluates both the primary and companion sequence batches concurrently. The `OmniConnector` captures these specific structural dependencies and reliably passes the positive and negative outcome KV caches seamlessly across stage boundaries via shared memory or network protocols. -3. **KV Cache Collection & Injection:** Upon reaching the downstream Diffusion (DiT) Engine, an assigned `cfg_kv_collect_func` automatically intercepts the mapped companion caches (`cfg_text_past_key_values`). These auxiliary dependencies are natively gathered and seamlessly bound to the primary generation sequence variables, enabling the DiT Engine to cleanly implement cross-attention CFG guidance over accurate conditioning and unconditioning structures in parallel. - -### Flexibility and Usability - -vLLM-Omni is designed to be flexible and straightforward for users: - -* **Heterogeneous Pipeline Abstraction:** Manages complex model workflows effectively. -* **Hugging Face Integration:** Offers seamless integration with popular Hugging Face models. -* **Distributed Inference:** Supports tensor, pipeline, data, and expert parallelism. -* **Streaming Outputs:** Supports streaming outputs. -* **Unified API:** Provides a consistent and unified API interface compatible with vLLM. -* **OpenAI-compatible API Server:** Includes a FastAPI-based server for online serving that is compatible with the OpenAI API. - -# Interface design - -If you use vLLM, then you know how to use vLLM-Omni from Day 0: - -

- - - vLLM-Omni interface design - -

- -Taking **Qwen3-Omni** as an example: - -## Offline Inference -The **Omni** class provides a Python interface for offline batched inference. Users initialize the Omni class with a Hugging Face model name and use the generate method, passing inputs that include both text prompts and multi-modal data: - -``` -# Create an omni runtime with HF model name. -from vllm_omni.entrypoints.omni import Omni - -omni = Omni(model="Qwen/Qwen3-Omni-30B-A3B-Instruct") - -# Example prompts. -om_inputs = {"prompt": prompt, - "multi_modal_data": { - "video": video_frames, - "audio": audio_signal, - }} - -# Generate texts and audio from the multi-modality inputs. -outputs = omni.generate(om_inputs, sampling_params_list) -``` - -## Online Serving -Similar to vLLM, vLLM-Omni also provides a FastAPI-based server for online serving. Users can launch the server using the vllm serve command with the `--omni` flag: - -``` -vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091 -``` - -Users can send requests to the server using curl: - -``` -# prepare user content -user_content='[ - { - "type": "video_url", - "video_url": { - "url": "'"$SAMPLE_VIDEO_URL"'" - } - }, - { - "type": "text", - "text": "Why is this video funny?" - } - ]' - sampling_params_list='[ - '"$thinker_sampling_params"', - '"$talker_sampling_params"', - '"$code2wav_sampling_params"' - ]' - mm_processor_kwargs="{}" - -# send the request -curl -sS -X POST http://localhost:8091/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d @- < - - - TTFP Performance Data Comparison - -

- -

- - - RTF Performance Data Comparison - -

- -

- - - E2E Performance Data Comparison - -

- -## Architecture - -### Async Chunk Pipeline Overview - -The following diagram illustrates the **Async Chunk Architecture** for multi-stage models (e.g., Qwen3-Omni with Thinker → Talker → Code2Wav), showing how data flows through the 4-stage pipeline with parallel processing and dual-stream output: - -

- - - Async Chunk Pipeline Architecture - -

- -**Diagram Legend:** - -| Step | Stage Type | Description | -|------|-----------|------------| -| `prefill` | Initialization | Context processing, KV cache initialization | -| `decode` | Autoregressive | Token-by-token generation in AR stages | -| `codes` | Audio Encoding | RVQ codec codes from Talker stage | -| `output` | Final Output | Text chunks or audio waveforms | - -### Data Flow - -#### Stage 0: Thinker (Multimodal Understanding + Text Generation) -- **Prefill**: Processes multimodal input (text/image/audio/video), initializes KV cache -- **Decode Loop**: Generates text tokens autoregressively -- **Chunk Triggers**: Each decode step (typically `chunk_size=1`) can trigger downstream processing -- **Dual Output**: - - **Text Stream**: `text_0`, `text_1`, `text_2`... `text_n` streamed to output - - **Hidden States**: Passed to Talker stage for audio synthesis - -#### Stage 1: Talker (Text → RVQ Audio Codes) -- **Prefill**: Receives hidden states from Thinker as semantic condition -- **Decode Loop**: Generates RVQ codec codes autoregressively -- **Accumulation**: Codes accumulate to `codec_chunk_frames` (default=25) before forwarding -- **Dynamic IC**: Initial chunk size auto-selected based on server load to optimize TTFP -- **Output**: `codes` blocks (chunk 0, 1, ... n) sent to Code2Wav - -#### Stage 2: Code2Wav (Vocoder Decoder) -- **Non-Autoregressive**: Processes RVQ codes in parallel batches -- **Streaming Decode**: Converts codes to audio waveforms chunk-by-chunk -- **Batching**: Supports batched inference for multiple concurrent requests -- **Output**: Audio segments `audio_0`, `audio_1`, ... `audio_n` - -#### Stage 3: Output (Dual Stream) -- **Text Streaming**: `text_0` → `text_1` → `text_2` → ... (user sees response in real-time) -- **Audio Streaming**: `audio_0` → `audio_1` → ... (user hears audio progressively) - -### Execution Timeline - -``` -Timeline: Parallel vs Sequential - -Sequential (async_chunk=false): -[Thinker: ████████████████████] (2.0s) - [Talker: ████████████████████] (3.0s) - [Code2Wav: ████] (1.0s) -Total: 6.0s, TTFP: 6.0s - -Async Chunk (async_chunk=true): -[Thinker: ████░░░░████░░░░████] (2.0s, streaming) - [Talker: ░░████░░░░████░░] (3.0s, parallel) - [Code2Wav: ░░░░████░░] (1.0s, batched) -Total: ~3.5s, TTFP: ~0.5s - -█ = Active computation ░ = Waiting/idle -``` - -#### Sequential Flow (for comparison) -

- - - Sequential Data Flow - -

- -In sequential mode, each stage must wait for the previous stage to complete entirely before starting. - -### Async Chunk System Architecture -

- - - Async Chunk Architecture - -

- - -### Key Components - -1. **OmniConnector**: Inter-stage data transport only - - Shared memory or other IPC mechanisms - - **Transport-only API**: `put(from_stage, to_stage, put_key, data)` and `get(from_stage, to_stage, get_key)` (optionally with timeout) - - **No request-specific state**: Connector does not track put_requests, get_requests, request_payload, finished_requests, or other request-bound metadata; it only performs put/get operations - - Chunk keys and request/chunk lifecycle are managed by **OmniChunkTransferAdapter** - -2. **Transfer Adapter Layer**: Extensible abstraction for managing data transfer via connectors - - **OmniTransferAdapterBase**: Base class with background **recv_loop** and **save_loop** threads; - - **OmniChunkTransferAdapter**: Chunk-specific implementation that owns the full chunk lifecycle when async_chunk is enabled - - **Chunk ID and key construction**: Builds keys like `{req_id}_{stage_id}_{chunk_id}` for put/get - - **Async get**: `load_async(request)` enqueues the request; background **recv_loop** polls the connector (non-blocking); when data is available, updates the request and marks it in `_finished_load_reqs`; scheduler calls `get_finished_requests()` to learn which requests have chunks ready - - **Async put**: `save_async(pooling_output, request)` invokes `custom_process_next_stage_input_func` in the main thread to build the payload, then enqueues a save task; background **save_loop** performs `connector.put()`; payload processing and chunk accumulation (e.g. code2wav chunk_size) remain in the main thread - -3. **Stage Input Processors**: Custom functions that process stage outputs into chunks for different models - - Receive **transfer_manager** (OmniChunkTransferAdapter) - - Qwen3-omni reference: `thinker2talker_async_chunk`, `talker2code2wav_async_chunk` - -4. **Schedulers**: Modified to handle chunk-based scheduling with async IO-compute overlap - - `OmniARScheduler`: For autoregressive stages - - `OmniGenerationScheduler`: For generation stages - - Both schedulers use **OmniChunkTransferAdapter** and **before/after** hooks around `super().schedule()`: - - **Before** `super().schedule()`: `process_pending_chunks(waiting, running)` moves requests waiting for chunks to `WAITING_FOR_CHUNK`, enqueues load tasks for background polling - - **After** `super().schedule()`: `restore_queues(waiting, running)` restores requests with ready chunks back to waiting/running, `postprocess_scheduler_output(scheduler_output)` attaches cached additional_information, clears chunk-ready flags - - **put_chunk** `save_async(pooler_output, request)`; **get_chunk** / **get_chunk_for_generation** `load_async(request)` - -5. **Model Runners**: Handle chunk processing - - `OmniGPUModelRunner`: Processes chunks in AR stages - - `GPUGenerationModelRunner`: Processes chunks in generation stages - - Uses `ubatch_slices` from `get_forward_context()` to track per-request sequence lengths in batched inference - - Reuses `ubatch_slices_padded` for code2wav batching to properly split batch outputs - - Handles list-type multimodal outputs: iterates through requests and assigns corresponding tensor to each - - Improved request state management: removes unscheduled and finished requests from input batch - -6. **Model Implementation**: Model-specific chunk handling - - `Qwen3OmniMoeForConditionalGeneration`: Main model with async_chunk support - - **Code2Wav stage batching**: Uses `ubatch_slices` to construct batched codec codes tensor `[batch_size, 16, max_seq_len]` - - **Batch output handling**: `generate_audio()` returns `list[torch.Tensor]`, one audio tensor per request - - **Multimodal outputs**: Returns list of audio tensors for batch processing instead of single concatenated tensor - - `Qwen3OmniCode2WavDecoder`: Audio generation model - - `chunked_decode()` and `chunked_decode_streaming()`: Return `list[torch.Tensor]` (one per request) - - Uses `ubatch_slices` to split batched waveform output into per-request audio chunks - - Each request gets correctly sized audio based on its code sequence length: `waveform[:, :, :code_seq_len * total_upsample]` - -7. **Request status**: `RequestStatus.WAITING_FOR_CHUNK` is added via patch (e.g. in `vllm_omni/patch.py`) so requests waiting for a chunk are not scheduled by the base vLLM scheduler until the chunk is ready. - -## Configuration - -Enable async_chunk in stage configuration YAML: - -```yaml -async_chunk: true -stage_args: - - stage_id: 0 - engine_args: - custom_process_next_stage_input_func: vllm_omni.model_executor.stage_input_processors.qwen3_omni.thinker2talker_async_chunk - - stage_id: 1 - engine_args: - custom_process_next_stage_input_func: vllm_omni.model_executor.stage_input_processors.qwen3_omni.talker2code2wav_async_chunk -``` - -### Stage Configuration - -- `async_chunk: bool`: Enable/disable async chunk mode -- `custom_process_next_stage_input_func: str`: Path to custom chunk processing function; receives `(transfer_manager, pooling_output, request)`. For qwen3-omni: `thinker2talker_async_chunk`, `talker2code2wav_async_chunk` -- `stage_connector_config: dict`: Connector configuration -- `worker_type: str`: Model type, e.g. `"ar"` or `"generation"` (used by OmniChunkTransferAdapter for mode-specific payload handling) -- `max_num_seqs: int`: Maximum number of sequences for concurrent processing in the stage - - -### Connector Configuration - -```yaml -connectors: - - from_stage: 0 - to_stage: 1 - spec: - name: SharedMemoryConnector - extra: - stage_id: 0 -``` - -### Code2Wav Batch Configuration - -For optimal performance with async_chunk, the code2wav stage should be configured with batching: - -```yaml -stage_args: - - stage_id: 2 # code2wav stage - runtime: - devices: "1" - engine_args: - model_stage: code2wav - max_num_seqs: 64 # Enables batched audio generation -``` - -## Related Files - -- `vllm_omni/model_executor/stage_input_processors/qwen3_omni.py`: Chunk processing functions (receive `transfer_manager` as first param) -- `vllm_omni/distributed/omni_connectors/transfer_adapter/base.py`: OmniTransferAdapterBase (recv_loop, save_loop, load_async, save_async) -- `vllm_omni/distributed/omni_connectors/transfer_adapter/chunk_transfer_adapter.py`: OmniChunkTransferAdapter (process_pending_chunks, restore_queues, postprocess_scheduler_output) -- `vllm_omni/distributed/omni_connectors/connectors/shm_connector.py`: SharedMemoryConnector (transport-only put/get) -- `vllm_omni/core/sched/omni_ar_scheduler.py`: AR scheduler with chunk_transfer_adapter -- `vllm_omni/core/sched/omni_generation_scheduler.py`: Generation scheduler with same async chunk pattern -- `vllm_omni/worker/gpu_model_runner.py`: Model runner with chunk handling -- `vllm_omni/worker/gpu_generation_model_runner.py`: Generation model runner with batch output handling and ubatch_slices support -- `vllm_omni/model_executor/models/qwen3_omni/qwen3_omni.py`: Model implementation with code2wav batching -- `vllm_omni/model_executor/models/qwen3_omni/qwen3_omni_code2wav.py`: Code2wav decoder with batch support -- `vllm_omni/engine/arg_utils.py`: Configuration definitions (async_chunk, worker_type) -- `vllm_omni/config/model.py`: Model config with async_chunk field diff --git a/docs/design/feature/cache_dit.md b/docs/design/feature/cache_dit.md deleted file mode 100644 index 237a958774d..00000000000 --- a/docs/design/feature/cache_dit.md +++ /dev/null @@ -1,286 +0,0 @@ -# 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: - -- **Single or dual-transformer:** Models that may use one or two 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: Single or Dual-Transformer Model (Wan2.2) - -Wan2.2 can use either a single transformer or two transformers (one for high-noise steps and one for low-noise steps). The implementation automatically detects the mode based on the presence of `transformer_2`. - -**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_acceleration/cache_dit.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) | Single or dual-transformer | Auto-detects mode based on transformer_2 presence | -| **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/design/feature/cfg_parallel.md b/docs/design/feature/cfg_parallel.md deleted file mode 100644 index c73a87749f5..00000000000 --- a/docs/design/feature/cfg_parallel.md +++ /dev/null @@ -1,350 +0,0 @@ -# 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 - -Some models require 3 or more CFG branches (see [N-Branch CFG](#n-branch-cfg-3-branches)). - -CFG-Parallel eliminates this bottleneck by distributing the 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 2-branch CFG | Detects parallel mode, distributes computation, gathers results | -| [`predict_noise_with_multi_branch_cfg()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Predict noise with N-branch CFG | Round-robin dispatches N branches across M GPUs | -| [`scheduler_step_maybe_with_cfg()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Step scheduler | All ranks step locally (no broadcast needed) | -| [`combine_cfg_noise()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Combine 2-branch predictions | Applies CFG formula with optional normalization | -| [`combine_multi_branch_cfg_noise()`](https://docs.vllm.ai/projects/vllm-omni/en/latest/api/vllm_omni/diffusion/distributed/cfg_parallel/) | Combine N-branch predictions | Override for custom multi-branch combine logic | -| [`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()` - - All ranks compute CFG combine locally (deterministic, identical results) - -- **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: - -- All ranks compute the scheduler step locally — no broadcast needed because `predict_noise_maybe_with_cfg` already ensures all ranks have identical noise predictions after `all_gather` + local combine. - -### N-Branch CFG (3+ branches) - -Some models require more than 2 CFG branches. For example, Bagel and OmniGen2 use 3 branches, DreamID Omni uses 4 branches. - -`predict_noise_with_multi_branch_cfg()` handles these by automatically dispatching N branches across M GPUs using round-robin (rule: branch `i` → rank `i % M`): - -| Branches (N) | GPUs (M) | Dispatch | -|:---:|:---:|:---| -| 3 | 2 | `[[0, 2], [1]]` | -| 3 | 3 | `[[0], [1], [2]]` | -| 4 | 2 | `[[0, 2], [1, 3]]` | -| 4 | 3 | `[[0, 3], [1], [2]]` | -| 4 | 4 | `[[0], [1], [2], [3]]` | - -When a rank handles multiple branches, it runs them sequentially. After `all_gather`, all ranks execute `combine_multi_branch_cfg_noise()` locally, producing identical results. - ---- - -## 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 -- For models with 3+ CFG branches, see [Multi-Branch CFG](#multi-branch-cfg-3-branches) in the Customization section - -### 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 -``` - - -### Multi-Branch CFG (3+ branches) - -For models with 3 or more CFG branches, use `predict_noise_with_multi_branch_cfg()` instead of `predict_noise_maybe_with_cfg()`, and override `combine_multi_branch_cfg_noise()` for custom combine logic. This interface also works for standard 2-branch CFG — just pass 2 branches in `branches_kwargs`. - -**Example (3-branch with dual guidance scale):** - -```python -class YourMultiBranchPipeline(nn.Module, CFGParallelMixin): - def combine_multi_branch_cfg_noise(self, predictions, true_cfg_scale, cfg_normalize=False): - text_scale = true_cfg_scale["text"] - image_scale = true_cfg_scale["image"] - pos, ref, uncond = predictions - return uncond + image_scale * (ref - uncond) + text_scale * (pos - ref) - - def diffuse(self, ...): - for i, t in enumerate(timesteps): - positive_kwargs = {...} # conditional prompt - ref_neg_kwargs = {...} # negative prompt + reference - uncond_kwargs = {...} # unconditional - - noise_pred = self.predict_noise_with_multi_branch_cfg( - do_true_cfg=do_true_cfg, - true_cfg_scale={"text": text_guidance_scale, "image": image_guidance_scale}, - branches_kwargs=[positive_kwargs, ref_neg_kwargs, uncond_kwargs], - ) - latents = self.scheduler_step_maybe_with_cfg(noise_pred, t, latents, do_true_cfg) - - return latents -``` - -### Override Combine Functions - -There are two combine functions for different scenarios: - -- **`combine_cfg_noise()`** — Used by `predict_noise_maybe_with_cfg()`. Override when `predict_noise()` returns a tuple (e.g., video + audio) and you need per-element CFG logic. -- **`combine_multi_branch_cfg_noise()`** — Used by `predict_noise_with_multi_branch_cfg()`. Override to implement custom multi-branch combine formulas (see [Multi-Branch CFG](#multi-branch-cfg-3-branches) above). - -### Implement a Composite Scheduler for Multi-Output Models - -When each output has its own denoising schedule, implement a composite scheduler that dispatches to per-output schedulers. Assign it to `self.scheduler` so the default `scheduler_step()` works without override. - -**Complete example (video + audio with separate schedulers and diffuse loop):** - -```python -class VideoAudioScheduler: - """Composite scheduler dispatching to video and audio schedulers.""" - def __init__(self, video_scheduler, audio_scheduler): - self.video_scheduler = video_scheduler - self.audio_scheduler = audio_scheduler - - def step(self, noise_pred, t, latents, return_dict=False, generator=None): - video_out = self.video_scheduler.step(noise_pred[0], t[0], latents[0], return_dict=False, generator=generator)[0] - audio_out = self.audio_scheduler.step(noise_pred[1], t[1], latents[1], return_dict=False, generator=generator)[0] - return ((video_out, audio_out),) - -class MyVideoAudioPipeline(nn.Module, CFGParallelMixin): - def __init__(self, ...): - self.scheduler = VideoAudioScheduler(video_sched, audio_sched) - - def predict_noise(self, **kwargs): - video_pred, audio_pred = self.transformer(**kwargs) - return (video_pred, audio_pred) - - def combine_cfg_noise(self, positive_noise_pred, negative_noise_pred, scale, normalize): - # ... (as above) - - def diffuse(self, video_latents, audio_latents, timesteps_video, timesteps_audio, ...): - for t_v, t_a in zip(timesteps_video, timesteps_audio): - positive_kwargs = {...} - negative_kwargs = {...} if do_true_cfg else None - - video_pred, audio_pred = self.predict_noise_maybe_with_cfg( - do_true_cfg=do_true_cfg, true_cfg_scale=self.guidance_scale, - positive_kwargs=positive_kwargs, negative_kwargs=negative_kwargs, - ) - video_latents, audio_latents = self.scheduler_step_maybe_with_cfg( - (video_pred, audio_pred), (t_v, t_a), - (video_latents, audio_latents), do_true_cfg=do_true_cfg, - generator=generator, - ) - return video_latents, audio_latents -``` - -> **Note:** If you use a non-deterministic scheduler, e.g., DDPM, please set `self.scheduler_step_maybe_with_cfg(..., generator=torch.Generator(device).manual_seed(seed))` explicitly to control the randomness of scheduler step among ranks. - ---- - -## 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. ✅ **(Optional) Multi-branch** - For 3+ branch models, use `predict_noise_with_multi_branch_cfg()` and override `combine_multi_branch_cfg_noise()` -4. ✅ **Test** - Verify with `--cfg-parallel-size 2` (or 3/4 for multi-branch) and compare performance diff --git a/docs/design/feature/diffusion_step_execution.md b/docs/design/feature/diffusion_step_execution.md deleted file mode 100644 index b8c81f04f69..00000000000 --- a/docs/design/feature/diffusion_step_execution.md +++ /dev/null @@ -1,121 +0,0 @@ -# Diffusion Step Execution - -This guide documents vLLM-Omni's stepwise diffusion contract for model authors -and contributors implementing `step_execution=True` support for a diffusion -pipeline. - -For end-user enablement, supported models, and current limitations, see -[Step Execution](../../user_guide/diffusion/step_execution.md). - -## Current Support Scope - -`step_execution` is **not** a generic diffusion toggle. It only works for -pipelines that implement the segmented stateful contract in -[`vllm_omni/diffusion/models/interface.py`](gh-file:vllm_omni/diffusion/models/interface.py). - -Current in-tree support: - -| Pipeline | Example models | Step execution | -|----------|----------------|----------------| -| `QwenImagePipeline` | `Qwen/Qwen-Image`, `Qwen/Qwen-Image-2512` | Yes | -| All other diffusion pipelines | `QwenImageEditPipeline`, `QwenImageEditPlusPipeline`, `QwenImageLayeredPipeline`, GLM-Image, Wan, Flux, etc. | No | - -Current engine/runtime limitations: - -- `StepScheduler` only schedules `batch_size=1`. -- `cache_backend` is not supported in step mode. -- Request-mode extras such as KV transfer are not wired into step mode yet. -- Unsupported pipelines now fail early during model loading instead of failing on the first request. - -## Execution Contract - -Step mode is driven by four pipeline methods plus the shared mutable request -state object: - -- `prepare_encode(state)`: one-time request preparation. -- `denoise_step(state)`: compute the noise prediction for the current step. -- `step_scheduler(state, noise_pred)`: mutate latents and advance step state. -- `post_decode(state)`: decode the final output after denoising is complete. - -The state lives in -[`vllm_omni/diffusion/worker/utils.py`](gh-file:vllm_omni/diffusion/worker/utils.py) -as `DiffusionRequestState`. Store request-scoped tensors there, or use -`state.extra` for model-specific fields that do not justify extending the core -dataclass. - -The worker-side step loop lives in -[`vllm_omni/diffusion/worker/diffusion_model_runner.py`](gh-file:vllm_omni/diffusion/worker/diffusion_model_runner.py): - -1. `prepare_encode()` runs once for a new request. -2. `denoise_step()` runs every scheduler tick. -3. `step_scheduler()` mutates `state.latents` and advances `state.step_index`. -4. `post_decode()` runs exactly once after `state.denoise_completed` becomes true. - -## Recommended Split - -When converting an existing request-level `forward()` pipeline, keep the split -strict and mechanical: - -| Request-level phase | Stepwise method | What belongs there | -|---------------------|-----------------|--------------------| -| Input validation, prompt encoding, latent init, timestep prep, per-request scheduler creation | `prepare_encode()` | Anything that should happen once per request | -| Transformer forward / noise prediction | `denoise_step()` | Pure denoise computation for the current timestep | -| `scheduler.step(...)` and `step_index += 1` | `step_scheduler()` | Only latent/state mutation for one step | -| VAE decode / postprocess | `post_decode()` | Final decode only | - -Keep the stepwise path reusing the same helpers as the request-level path -whenever possible. Reimplementing the denoise loop from scratch is the easiest -way to introduce behavioral drift. - -## Qwen-Image Reference - -[`pipeline_qwen_image.py`](gh-file:vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image.py) -is the reference implementation and is split correctly for the current -contract: - -- `prepare_encode()` reuses `_prepare_generation_context()` so prompt encoding, - latent init, timestep creation, CFG setup, and shape bookkeeping stay aligned - with `forward()`. -- `prepare_encode()` deep-copies `self.scheduler` **after** - `prepare_timesteps()` so request-specific scheduler state is isolated. -- `denoise_step()` reuses `_build_denoise_kwargs()` plus - `predict_noise_maybe_with_cfg()`, so sequential CFG, CFG-parallel, and - non-CFG behavior stay identical to the request-level path. -- `step_scheduler()` only calls - `scheduler_step_maybe_with_cfg(..., per_request_scheduler=state.scheduler)` - and increments `state.step_index`. -- `post_decode()` reuses `_decode_latents()`, so the final image decode matches - the normal `forward()` path. - -That decomposition is the target pattern for future models. - -## Rules For New Pipelines - -- Do not keep request-scoped scheduler state on `self.scheduler`. Copy it into - `state.scheduler` during `prepare_encode()`. -- Do not mutate `state.step_index` inside `denoise_step()`. Only - `step_scheduler()` should advance the step. -- Do not decode partial outputs in `denoise_step()` or `step_scheduler()`. -- If the request-level pipeline has condition latents, masks, or edit-specific - tensors, store them in `state` or `state.extra`, not in global pipeline - attributes. -- Preserve CFG behavior by sharing the same helper path used by `forward()`. -- Keep `post_decode()` equivalent to the tail of `forward()`. - -## Validation Checklist - -Before marking a pipeline as `supports_step_execution = True`, verify: - -- Stepwise output matches request-level output for the same seed and sampling params. -- Per-request scheduler state is isolated across concurrent requests. -- Abort during denoise does not leak cached state. -- `step_index` reported by `RunnerOutput` matches the scheduler progress. -- CFG-parallel and non-CFG paths both work if the request-level pipeline supports them. - -## Related Files - -- Contract: [`vllm_omni/diffusion/models/interface.py`](gh-file:vllm_omni/diffusion/models/interface.py) -- State: [`vllm_omni/diffusion/worker/utils.py`](gh-file:vllm_omni/diffusion/worker/utils.py) -- Runner loop: [`vllm_omni/diffusion/worker/diffusion_model_runner.py`](gh-file:vllm_omni/diffusion/worker/diffusion_model_runner.py) -- Scheduler transport: [`vllm_omni/diffusion/sched/interface.py`](gh-file:vllm_omni/diffusion/sched/interface.py) -- Reference pipeline: [`vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image.py`](gh-file:vllm_omni/diffusion/models/qwen_image/pipeline_qwen_image.py) diff --git a/docs/design/feature/disaggregated_inference.md b/docs/design/feature/disaggregated_inference.md deleted file mode 100644 index 83c35ac0107..00000000000 --- a/docs/design/feature/disaggregated_inference.md +++ /dev/null @@ -1,108 +0,0 @@ -# Disaggregated Inference for Omni-Modality Models - -This guide explains how to configure and use distributed connectors -(`vllm_omni/distributed/omni_connectors`) in vllm-omni for multi-stage pipelines. - -Backend-specific setup lives in separate docs: - -- [SharedMemoryConnector](omni_connectors/shared_memory_connector.md) -- [MooncakeStoreConnector](omni_connectors/mooncake_store_connector.md) -- [MooncakeTransferEngineConnector](omni_connectors/mooncake_transfer_engine_connector.md) -- [YuanrongConnector](omni_connectors/yuanrong_connector.md) - -## Overview - -Connectors enable data transfer between pipeline stages (e.g., Thinker -> Talker). -Current connectors operate in D2H2D (device to host to device) mode. - -## Connector Choices - -| Use Case | Recommended Connector | Notes | -| :--- | :--- | :--- | -| Single node | SharedMemoryConnector | Auto-configured if no connector is specified. | -| Multi node (Mooncake Store) | MooncakeStoreConnector | TCP-based, requires Mooncake Master + metadata server. | -| Multi node (Mooncake RDMA) | MooncakeTransferEngineConnector | RDMA/TCP direct transfer with managed memory pool. Fastest. | -| Multi node (Yuanrong) | YuanrongConnector | Requires Yuanrong Datasystem + etcd. | - -## Core API - -The connector system is built around `OmniConnectorBase`. - -```python -class OmniConnectorBase(ABC): - @abstractmethod - def put(self, from_stage: str, to_stage: str, put_key: str, data: Any) -> tuple[bool, int, Optional[dict]]: - """ - Store data. - Returns: (success, serialized_size, metadata) - """ - pass - - @abstractmethod - def get(self, from_stage: str, to_stage: str, get_key: str, metadata: Optional[dict] = None) -> Optional[tuple[Any, int]]: - """ - Retrieve data. - Args: metadata - transport-specific handles returned by put() (e.g., SHM name). - Returns: (object, serialized_size) - """ - pass -``` - -### Metadata Passing - -Some connectors (e.g., SharedMemoryConnector) generate transient resources during `put()`. -This `metadata` must be passed through the control plane so `get()` can locate the data. - -## Configuration Model - -Define connectors in runtime: - -```yaml -runtime: - connectors: - connector_of_shared_memory: - name: SharedMemoryConnector - extra: - shm_threshold_bytes: 65536 -``` - -Wire stages to connectors: - -```yaml -stage_args: - - stage_id: 0 - output_connectors: - to_stage_1: connector_of_shared_memory - - - stage_id: 1 - input_connectors: - from_stage_0: connector_of_shared_memory -``` - -If a pipeline edge has no explicit connector, the system auto-creates a -SharedMemoryConnector for that edge. - -## Relationship with vLLM - -vLLM provides specialized distributed mechanisms for specific artifacts: - -- KV Transfer (`vllm.distributed.kv_transfer`): optimized for KV caches. -- EC Transfer (`vllm.distributed.ec_transfer`): optimized for encoder embeddings. -- Device Communicators (`vllm.distributed.device_communicators`): low-level primitives (NCCL, SHM). - -vllm-omni complements this with a generalized connector abstraction: - -1. Unifies transport via a single `put`/`get` API for any stage artifact. -2. Enables DAG-style pipelines across processes or nodes with per-edge transports. -3. Can wrap vLLM-specific transfers for KV paths while keeping a consistent interface. - -## Operational Notes - -- Fail-fast config validation: missing expected edges cause startup failures. -- Missing payloads halt stages: verify connector wiring and metadata propagation. - -## Future Roadmap: D2D Transport - -Current connectors use D2H2D paths. Future versions will introduce direct -device-to-device connectors (NCCL, UCX, IPC) to reduce latency for large -tensor payloads. diff --git a/docs/design/feature/expert_parallel.md b/docs/design/feature/expert_parallel.md deleted file mode 100644 index e05eec33613..00000000000 --- a/docs/design/feature/expert_parallel.md +++ /dev/null @@ -1,221 +0,0 @@ -# Expert Parallel - -This section describes how to add Expert Parallel (EP) to a diffusion transformer that uses Mixture-of-Experts (MoE) layers. -We use **HunyuanImage3.0** as the reference implementation. - ---- - -## Table of Contents - -- [Overview](#overview) -- [Step-by-Step Implementation](#step-by-step-implementation) -- [Testing](#testing) -- [Reference Implementations](#reference-implementations) -- [Summary](#summary) - ---- - -## Overview - -### What is Expert Parallel? - -**Expert Parallel** is a parallelism strategy in Mixture-of-Experts (MoE) models that distributes different expert networks across distinct computational devices. Each device holds and computes only a subset of experts (local experts), with tokens dispatched to and gathered from remote devices via collective communication operations (e.g., All-to-All, All-Gather). - -| Backend | Description | -|---------|-------------| -| `allgather_reducescatter` | Default backend based on allgather/reducescatter primitives, suitable for general EP+DP deployments.| - -## Configuration - -Enable EP by setting the `--enable-expert-parallel` flag. The EP size is automatically calculated as: - -```text -EP_SIZE = TP_SIZE × SP_SIZE × CFG_SIZE × DP_SIZE -``` - - -Where: - -- `TP_SIZE`: Tensor parallel size -- `SP_SIZE`: Sequence parallel size -- `CFG_SIZE`: Classifier-free guidance parallel size -- `DP_SIZE`: Data parallel size -- `EP_SIZE`: Expert parallel size (computed automatically) - -Note: -- Expert parallelism is only applicable to Mixture-of-Experts (MoE) models. -- The EP group is created **per pipeline stage**, meaning it includes all ranks that participate in model parallelism except pipeline parallelism. -- The underlying communication pattern for expert parallelism is **All-to-All** among the ranks in the EP group. - -For example, consider a configuration with `TP=2`, `SP=1`, `CFG=2`, and `DP=4` (total 2×1×2×4 = 16 GPUs). - -- Expert layers are handled by an EP group of size 16. - -- Attention layers use tensor parallelism of size 2 within each of the 8 DP groups (because `DP×CFG×SP = 4×2×1 = 8` groups, each containing the 2 TP ranks). Inside each such group, the attention weights are sharded across the 2 GPUs. - - -## Step-by-Step Implementation - -### Step 1: Configure Expert Parallelism Settings - -Calculate local experts per rank: - -``` -ep_size = 8 # Expert Parallel size (typically equals TP size) -num_experts = 64 -num_local_experts = num_experts // ep_size # 8 experts per card - -# Check divisibility -assert num_experts % ep_size == 0, "Experts must be divisible by EP size" -``` - -### Step 2: Use Sparse MoE Block to enable EP routing. - -Example: -``` -from vllm.model_executor.layers.linear import ReplicatedLinear -class HunYuanSparseMoeBlock(nn.Module): - def __init__( - self, - config: PretrainedConfig, - layer_id: int = -1, - prefix: str = "", - ): - super().__init__() - self.tp_size = get_tensor_model_parallel_world_size() - self.n_routed_experts = config.num_experts # 64 - - # Calculate local experts per rank (key for EP) - if self.tp_size > self.n_routed_experts: - raise ValueError(f"TP size {self.tp_size} > experts {self.n_routed_experts}") - - # Routing gate (replicated on all ranks, computes scores for all tokens to all experts) - self.gate = ReplicatedLinear( - config.hidden_size, - config.num_experts, - bias=False, - quant_config=None, - prefix=f"{prefix}.gate", - ) - - # EP expert layer (factory loads platform-specific implementation) - self.experts = HunyuanFusedMoE(...) -``` -**Key Points:** -- gate is **ReplicatedLinear** (replicated on all ranks) -- experts is created via **HunyuanFusedMoE factory**, which automatically handles EP dispatch - -### Step 3: Initialize EP Runtime - -Initialize the EP communication context before model loading. -``` -from vllm.utils.import_utils import resolve_obj_by_qualname -# Call during __init__ or model loading -op_name = "hunyuan_fused_moe" - -# Prepare EP runtime: establish communication groups, assign local expert indices, init _expert_map -current_omni_platform.prepare_diffusion_op_runtime(op_name) - -# Factory automatically resolves platform implementation (GPU: FusedMoE / NPU: AscendFusedMoE) -impl = resolve_obj_by_qualname( - current_omni_platform.get_diffusion_model_impl_qualname(op_name) -) -``` - -### Step 4: Expert Weight Mapping & Loading - -Each rank loads only the expert weights assigned to its local allocation. -``` -# Get expert parameter mapping (different per rank) -expert_mapping = HunyuanFusedMoE.make_expert_params_mapping( - model=self, - ckpt_gate_proj_name="gate_proj", - ckpt_down_proj_name="down_proj", - ckpt_up_proj_name="up_proj", - num_experts=64, - num_redundant_experts=0, -) -# Returns: [(param_name, weight_name, expert_id, shard_id), ...] -# Note: Each rank only contains mappings for its local expert_ids - -# Filter non-local experts during loading -for name, loaded_weight in weights: - if "mlp.experts" in name: - # Parse expert_id from weight name (implementation needed) - expert_id = parse_expert_id_from_name(name) - local_expert_start = (ep_rank) * num_local_experts - local_expert_end = (ep_rank + 1) * num_local_experts - - if not (local_expert_start <= expert_id < local_expert_end): - continue # Skip non-local expert weights -``` -### Step 5: Forward Pass with EP - -Example (MoE Forward): -``` -def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: - orig_shape = hidden_states.shape - hidden_states = hidden_states.view(-1, hidden_states.shape[-1]) - - # 1. Global routing computation (all tokens, all expert scores) - # hidden_states: [num_tokens, hidden_dim] (full tensor) - router_logits, _ = self.gate(hidden_states) # [num_tokens, num_experts] - - # 2. EP dispatch and compute (HunyuanFusedMoE handles all_to_all internally) - # - Dispatch: Send tokens to target ranks based on router_logits - # - Local Compute: Each rank processes only its num_local_experts - # - Combine: Results returned to original token positions - final_hidden_states = self.experts( - hidden_states=hidden_states, - router_logits=router_logits, - ) - - # 3. Add shared expert output (not EP, computed on all ranks) - if self.shared_mlp is not None: - shared_out = self.shared_mlp(hidden_states) - final_hidden_states = final_hidden_states + shared_out - - # 4. Tensor Parallel All-Reduce (synchronize across TP group) - if self.tp_size > 1: - final_hidden_states = self.experts.maybe_all_reduce_tensor_model_parallel( - final_hidden_states - ) - - return final_hidden_states.view(orig_shape) -``` - -## Testing -After adding Expert Parallel support, test 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" \ - --output "ep_enabled.png" \ - --num-inference-steps 50 \ - --guidance-scale 5.0 \ - --tensor-parallel-size 8 \ - --seed 1234 \ - --enable-expert-parallel -``` - -vLLM‑Omni currently focuses on core diffusion model inference acceleration, so the Expert Parallel implementation includes only the basic multi‑GPU expert sharding functionality (enabled via --enable-expert-parallel). Advanced features such as communication backend selection (--all2all-backend), load balancing (--enable-eplb and its configuration), and multi‑node deployment belong to the extended capabilities of the main vLLM project and have not yet been integrated into Omni. - -## Reference Implementations - -Complete examples in the codebase: - -| Model | Path | Pattern | Notes | -|-------|------|---------|-------| -| **HunyuanImage3.0** | `vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py` | Standard EP | Full implementation with validation | -| **EP Tests** | `vllm-omni/tests/e2e/offline_inference/test_expert_parallel.py` | E2E testing | EP correctness and performance | -| **Constraint Tests** | `vllm-omni/tests/diffusion/models/hunyuan_image3/test_hunyuan_fused_moe.py` | Unit testing | Validation logic | - ---- -## Summary - -Adding Expert Parallel support to diffusion model: - -1. **Identify MoE layers** - Locate the router and expert networks in each transformer block. -2. **Validate EP constraints** – Ensure num_experts is divisible by expert_parallel_size. -3. **Test** - Run with enable-expert-parallel, check memory reduction, speedup, and output quality against single‑GPU baseline. diff --git a/docs/design/feature/hsdp.md b/docs/design/feature/hsdp.md deleted file mode 100644 index 958ad192ead..00000000000 --- a/docs/design/feature/hsdp.md +++ /dev/null @@ -1,146 +0,0 @@ -# HSDP - -This section describes how to add HSDP (Hybrid Sharded Data Parallel) support to a diffusion transformer model. We use the Wan2.2 transformer as the reference implementation. - ---- - -## Table of Contents - -- [Overview](#overview) -- [Step-by-Step Implementation](#step-by-step-implementation) -- [Testing](#testing) -- [Reference Implementations](#reference-implementations) - ---- - -## Overview - -### What is HSDP? - -HSDP (Hybrid Sharded Data Parallel) is a memory optimization technique that **shards model weights** across multiple GPUs using PyTorch's FSDP2. Unlike Tensor Parallelism which splits computation, HSDP: - -- Shards weights across GPUs to reduce per-GPU memory usage -- Gathers weights on-demand during forward passes -- Can work standalone or combined with other parallelism (e.g., Sequence Parallel) - -This enables inference of large models (e.g., Wan2.2 14B) on GPUs with limited memory. - -**Important constraints:** -- HSDP cannot be used with Tensor Parallelism -- For standalone HSDP (no other parallelism), `hsdp_shard_size` must be specified explicitly - -### Architecture - -HSDP implementation relies on: - -1. **`_hsdp_shard_conditions`**: Model attribute specifying which modules to shard -2. **`apply_hsdp_to_model`**: Function that applies FSDP2 sharding -3. **`HSDPInferenceConfig`**: Runtime configuration for HSDP - ---- - -## Step-by-Step Implementation - -### Step 1: Identify Modules to Shard - -Determine which modules in your transformer should be sharded. Typically, these are: - -- Transformer blocks (e.g., `blocks.0`, `blocks.1`, ...) -- Large submodules with significant weight memory - -**Key questions:** -- Which modules have the largest weights? -- Which modules are repeated (like transformer blocks)? - -### Step 2: Define Shard Conditions - -Add `_hsdp_shard_conditions` to your model class. This is a list of functions that return `True` for modules that should be sharded. - -**Example (Transformer Blocks):** - -```python -class MyTransformerModel(nn.Module): - - @staticmethod - def _is_transformer_block(name: str, module) -> bool: - """Match transformer blocks for HSDP sharding. - - Args: - name: Module name from named_modules() (e.g., "blocks.0", "blocks.0.attn") - module: The module instance - - Returns: - True if this module should be sharded - """ - return "blocks" in name and name.split(".")[-1].isdigit() - - _hsdp_shard_conditions = [_is_transformer_block] -``` - -**Multiple Conditions Example:** - -```python -class MyModel(nn.Module): - - @staticmethod - def _is_transformer_block(name: str, module) -> bool: - return "blocks" in name and name.split(".")[-1].isdigit() - - @staticmethod - def _is_moe_expert(name: str, module) -> bool: - # Also shard MoE expert layers - return "experts" in name and name.split(".")[-1].isdigit() - - # Module is sharded if ANY condition returns True - _hsdp_shard_conditions = [_is_transformer_block, _is_moe_expert] -``` - ---- - -## Testing - -After adding HSDP 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( - use_hsdp=True, - hsdp_shard_size=8, # Shard across 8 GPUs -) -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 -vllm serve Your-org/your-model --omni --port 8091 --use-hsdp -``` - -**Verify:** - -1. Check logs for "HSDP Inference: replicate_size=..., shard_size=..." -2. Check logs for "Sharded N modules + root" -3. Verify memory usage is reduced proportionally -4. Compare generated output quality with HSDP disabled - ---- - -## Reference Implementations - -Complete examples in the codebase: - -| Model | Path | Notes | -|-------|------|-------| -| **Wan2.2** | `vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py` | Reference implementation | -| **HSDP Core** | `vllm_omni/diffusion/distributed/hsdp.py` | `apply_hsdp_to_model`, `shard_model` | -| **HSDP Tests** | `tests/diffusion/distributed/test_hsdp.py` | Unit tests | - ---- diff --git a/docs/design/feature/omni_connectors/mooncake_store_connector.md b/docs/design/feature/omni_connectors/mooncake_store_connector.md deleted file mode 100644 index 2ff11685977..00000000000 --- a/docs/design/feature/omni_connectors/mooncake_store_connector.md +++ /dev/null @@ -1,312 +0,0 @@ -# MooncakeStoreConnector - -## When to Use - -Best for multi-node distributed inference using Mooncake. - -## Installation - -```bash -# For CUDA-enabled systems (recommended) -pip install mooncake-transfer-engine - -# For non-CUDA systems -pip install mooncake-transfer-engine-non-cuda -``` - -## Start Mooncake Master - -```bash -# If you use Mooncake SSD storage -mkdir -p ./mc_storage - -mooncake_master \ - --rpc_port=50051 \ - --enable_http_metadata_server=true \ - --http_metadata_server_host=0.0.0.0 \ - --http_metadata_server_port=8080 \ - --metrics_port=9003 \ - --root_fs_dir=./mc_storage/ \ - --cluster_id=mc-local-1 & -``` - -## Configuration - -Define the connector in runtime: - -```yaml -runtime: - connectors: - connector_of_mooncake: - name: MooncakeStoreConnector - extra: - host: "127.0.0.1" - metadata_server: "http://:8080/metadata" - master: ":50051" - segment: 512000000 - localbuf: 64000000 - proto: "tcp" -``` - -Wire stages to the connector: - -```yaml -stage_args: - - stage_id: 0 - output_connectors: - to_stage_1: connector_of_mooncake - - - stage_id: 1 - input_connectors: - from_stage_0: connector_of_mooncake -``` - -Parameters: - -- host: local worker IP registered in the metadata server. -- metadata_server: metadata server URL for discovery and setup. -- master: Mooncake Master address. -- segment: global memory segment size in bytes. -- localbuf: local buffer size in bytes. -- proto: transport protocol ("tcp" or "rdma"). - -For more details, refer to the -[Mooncake repository](https://github.com/kvcache-ai/Mooncake). - ---- - -## Design - -### 1. Overview - -`MooncakeStoreConnector` is the storage-oriented remote connector in `vllm_omni/distributed/omni_connectors`. It is built on top of Mooncake distributed store APIs and provides a uniform `put()` / `get()` abstraction for transferring stage payloads across nodes. - -Compared with `SharedMemoryConnector`, this connector is intended for multi-node deployments. Compared with `MooncakeTransferEngineConnector`, it is simpler and more object-oriented: data is written into a distributed store and fetched back by key, rather than transferred through an explicit remote-memory write protocol. - -Its primary role is to provide a general-purpose remote connector for stage payloads when: - -- the pipeline spans multiple hosts -- a shared-memory connector is not possible -- a simpler remote backend is preferred over the RDMA-oriented transfer engine - -### 2. Relationship with the OmniConnector System - -`MooncakeStoreConnector` implements `OmniConnectorBase`, so it integrates with the same connector lifecycle as the other backends: - -- `OmniConnectorFactory` instantiates it from `ConnectorSpec` -- `load_omni_transfer_config()` maps edge config to the connector spec -- All callers (batch forwarding, chunk transfer, KV transfer, etc.) interact with it through the same `put()` / `get()` contract - -This means the rest of the pipeline does not need store-specific logic. It only relies on the generic connector contract. - -### 3. Design Goals - -The connector is designed around the following goals: - -- **Cross-node object transfer** using a single key-based abstraction -- **Minimal connector-specific control plane**, since the store itself is the shared medium -- **Compatibility with arbitrary Python payloads** through the Omni serializer -- **Operational simplicity** compared with the transfer-engine-based remote connector - -The connector is intentionally not optimized for zero-copy tensor movement or direct remote-memory access. - -### 4. Core Design - -#### 4.1 Object-Oriented Transfer Model - -`MooncakeStoreConnector` treats the transport backend as a distributed object store: - -1. Serialize the Python object into bytes. -2. Generate a unique connector key. -3. Store the bytes in Mooncake. -4. Fetch the bytes from Mooncake on the receiver side. -5. Deserialize the bytes back into the original object. - -This design makes the connector conceptually close to a distributed key-value transport. - -#### 4.2 Key Construction - -The connector uses `OmniConnectorBase._make_key()` to derive the internal store key: - -```text -{request_key}@{from_stage}_{to_stage} -``` - -This adds stage routing information to the logical request key and avoids collisions between different pipeline edges. - -#### 4.3 No Extra Metadata Path - -Unlike `SharedMemoryConnector` and `MooncakeTransferEngineConnector`, this connector returns: - -```python -metadata = None -``` - -from `put()`. - -This is a meaningful design difference: - -- the store itself is the shared rendezvous point -- consumers only need the same key -- no transport handle, address, or side-channel metadata needs to be propagated - -As a result, the control plane is simpler for this connector than for the SHM and RDMA variants. - -### 5. Initialization - -#### 5.1 Required Mooncake Components - -The connector requires the Mooncake Python bindings to expose: - -- `MooncakeDistributedStore` -- `ReplicateConfig` - -If these symbols are unavailable, construction fails immediately with `ImportError`. This keeps startup failures explicit and avoids silent fallback behavior. - -#### 5.2 Store Setup - -During `_init_store()`, the connector: - -1. creates `MooncakeDistributedStore()` -2. calls `store.setup(...)` -3. validates the return code -4. creates a `ReplicateConfig` -5. enables `with_soft_pin = True` - -The setup step is completed during connector construction, not lazily at first use. - -### 6. Put / Get Flow - -#### 6.1 Producer Flow: `put()` - -The producer-side flow is: - -1. Validate that the store has been initialized. -2. Serialize the payload into bytes. -3. Build the internal key with stage routing information. -4. Call `store.put(key, serialized_data, self.pin)`. -5. Update metrics and return success. - -The returned tuple is: - -```python -(True, len(serialized_data), None) -``` - -#### 6.2 Consumer Flow: `get()` - -The consumer-side flow is: - -1. Validate that the store has been initialized. -2. Build the same internal key. -3. Poll `store.get(key)` for up to 20 retries. -4. Sleep 50 ms between retries. -5. If data is found, deserialize it and return `(data, payload_size)`. -6. If all retries are exhausted, record a timeout and return `None`. - -This design gives the connector a bounded waiting model rather than an indefinite blocking get. - -### 7. Integration with Stage Communication - -All callers use the connector through the same `put()` / `get()` contract: - -- the sender calls `put()` to serialize and store the payload -- the receiver calls `get()` to retrieve and deserialize it -- no connector-specific metadata is required, since the store key is the rendezvous point - -Because `put()` returns `metadata=None`, the connector is naturally compatible with callers that do not forward metadata (e.g. polling-based flows). The trade-off is that all payloads incur full serialization and deserialization costs, which makes the connector functional but not the highest-performance option for large payloads such as KV cache blocks. - -### 8. Data Flow in the Pipeline - -The end-to-end transfer model is: - -```mermaid -sequenceDiagram - participant SenderStage - participant MooncakeStoreConnector - participant MooncakeStore - participant ReceiverStage - - SenderStage->>MooncakeStoreConnector: put(from_stage, to_stage, put_key, data) - MooncakeStoreConnector->>MooncakeStoreConnector: serialize object - MooncakeStoreConnector->>MooncakeStore: put(internal_key, bytes) - MooncakeStoreConnector-->>SenderStage: (success, size, None) - - ReceiverStage->>MooncakeStoreConnector: get(from_stage, to_stage, get_key) - MooncakeStoreConnector->>MooncakeStore: get(internal_key) - MooncakeStoreConnector->>MooncakeStoreConnector: deserialize bytes - MooncakeStoreConnector-->>ReceiverStage: (data, size) -``` - -This is a store-mediated remote transfer model rather than a direct peer-to-peer transport model. - -### 9. Strengths and Trade-offs - -#### Strengths - -- Simple conceptual model: store by key, fetch by key. -- No connector-specific metadata handoff is required. -- Works naturally for remote multi-node stage transfer. -- Easy to integrate into the existing connector abstraction. - -#### Trade-offs - -- Full serialization and deserialization are always required. -- Large payloads are more expensive than in direct-memory transports. -- Runtime behavior depends on external Mooncake services being available. -- Cleanup semantics are weaker than request-scoped local buffer management. - -### 10. Important Implementation Characteristics - -#### 10.1 Cleanup Is a No-op - -`cleanup()` only logs a debug message and does not actively delete remote data. The current design assumes Mooncake-side lifecycle management rather than explicit per-request removal. - -This keeps the connector implementation simple but means request-level reclamation is not modeled inside the connector itself. - -#### 10.2 Close Releases the Store Handle - -Unlike `SharedMemoryConnector`, where `close()` is a no-op, `MooncakeStoreConnector.close()` performs a meaningful shutdown: - -1. Calls `self.store.close()` to release the Mooncake store handle. -2. Sets `self.store = None` to prevent further operations. - -This ensures the connector releases its connection to the external Mooncake service on shutdown. Errors during close are logged but do not propagate. - -#### 10.3 Health Output Uses a Shared Schema - -`health()` reports: - -- `host` -- `metadata_server` -- `master` -- metrics - -and also includes placeholder fields such as `protocol`, `pool_device`, and `pool_size` to keep a more uniform shape across connector health outputs. This reflects a system-level consistency choice rather than a store-specific design need. - -#### 10.4 Get Is Retry-Based, Not Event-Driven - -The receiver side polls the store with a short retry loop. This is simple and robust, but it means the connector is latency-sensitive to: - -- store visibility delay -- network jitter -- payload size - -If the payload is not visible within the retry window, the connector reports a timeout. - -### 11. Summary - -`MooncakeStoreConnector` is the remote, store-based connector in the OmniConnector stack. Its design is straightforward: - -- serialize the payload -- store it in Mooncake under a stage-qualified key -- fetch it by the same key on the receiver side -- deserialize it back into the original object - -This connector fills an important gap in the system: - -1. It enables cross-node transfer without requiring shared memory. -2. It keeps the stage communication model uniform. -3. It provides a simpler operational alternative to the transfer-engine-based remote connector. - -Its simplicity is also its main trade-off: it favors a clean object-transfer model over the fast-path and peer-to-peer optimizations implemented by `MooncakeTransferEngineConnector`. diff --git a/docs/design/feature/omni_connectors/mooncake_transfer_engine_connector.md b/docs/design/feature/omni_connectors/mooncake_transfer_engine_connector.md deleted file mode 100644 index 306a0620b4b..00000000000 --- a/docs/design/feature/omni_connectors/mooncake_transfer_engine_connector.md +++ /dev/null @@ -1,793 +0,0 @@ -# MooncakeTransferEngineConnector - -## When to Use - -Best for high-performance multi-node data transfer between stages using Mooncake -Transfer Engine. Supports both RDMA and TCP protocols with a managed memory pool, -zero-copy deserialization, and optional GPUDirect RDMA. Applicable to any -inter-stage data (KV caches, request payloads, etc.), not limited to KV cache transfer. - -Compared to `MooncakeStoreConnector` (TCP key-value store), this connector -provides **~60x faster** data transfer via RDMA direct memory access. - -## Installation - -```bash -pip install mooncake-transfer-engine -``` - -Ensure RDMA drivers are installed on all nodes (e.g., Mellanox OFED for -InfiniBand/RoCE NICs). - -## Configuration - -Define the connector in runtime: - -```yaml -runtime: - connectors: - rdma_connector: - name: MooncakeTransferEngineConnector - extra: - host: "auto" # Auto-detect local RDMA IP - zmq_port: 50051 # ZMQ base port (see "Port Offset Scheme" below) - protocol: "rdma" # "rdma" or "tcp" - device_name: "" # RDMA device (e.g., "mlx5_0"), empty for auto-detect - memory_pool_size: 4294967296 # 4 GB (CPU); use 2147483648 (2 GB) for GPU - memory_pool_device: "cpu" # "cpu" for pinned memory (recommended), "cuda" for GPUDirect RDMA -``` - -Wire stages to the connector: - -```yaml -stage_args: - - stage_id: 0 - output_connectors: - to_stage_1: rdma_connector - - - stage_id: 1 - input_connectors: - from_stage_0: rdma_connector -``` - -## Parameters - -### Required - -| Parameter | Description | -|---|---| -| `role` | **Internal, do not set manually.** Auto-injected by the orchestration layer (`"sender"` for `output_connectors`, `"receiver"` for `input_connectors`). Defaults to `"sender"` if omitted. | -| `host` | Local IP address for RDMA. `"auto"` detects from network interfaces. | -| `protocol` | Transport protocol: `"rdma"` (InfiniBand/RoCE) or `"tcp"`. | - -### Memory Pool - -| Parameter | Default | Description | -|---|---|---| -| `memory_pool_size` | 4 GB (CPU) / 2 GB (GPU) | Total size of the RDMA-registered memory pool in bytes. Recommended 4 GB for CPU pinned memory; 2 GB for GPU VRAM to conserve device memory. | -| `memory_pool_device` | `"cpu"` | `"cpu"`: pinned host memory (recommended, works on all topologies). `"cuda"`: GPU VRAM for GPUDirect RDMA (requires NIC-GPU direct PCIe connectivity, PIX topology). | - -### Networking - -| Parameter | Default | Description | -|---|---|---| -| `zmq_port` | 50051 | ZMQ **base** port. The orchestration layer computes the actual port as `base + purpose_offset + stage_offset` (see table below). Users only set this base value. | -| `sender_host` | `None` | **Internal.** Receiver-side only — dynamically resolved via `update_sender_info()`. Not needed in YAML. | -| `sender_zmq_port` | `None` | **Internal.** Receiver-side only — defaults to the sender's adjusted port. Not needed in YAML. | -| `device_name` | `""` | RDMA device name (e.g., `"mlx5_0"`). Empty for auto-detect. Can also be set via `RDMA_DEVICE_NAME` env var. | - -#### ZMQ Port Offset Scheme - -To avoid port conflicts when multiple edges, purposes, DP replicas, or TP ranks share the same node, the actual ZMQ port is computed as: - -``` -side_channel_port = zmq_port + purpose_offset + stage_offset + dp_index * tp_size -sender_listen = side_channel_port + tp_rank -receiver_connect = remote_side_channel_port + tp_rank -``` - -| Component | Value | Description | -|---|---|---| -| `zmq_port` | 50051 (default) | Base port from YAML config | -| `purpose_offset` | `request_forwarding` = 0, `kv_transfer` = 100 | Separates control-plane vs KV-cache connections | -| `stage_offset` | `int(from_stage)` (0, 1, 2...) | Separates edges from different source stages | -| `dp_index * tp_size` | e.g., DP1 × TP2 = 2 | Each DP replica reserves a port range of size `tp_size` (following vLLM convention: `VLLM_MOONCAKE_BOOTSTRAP_PORT + dp_index * tp_size`) | -| `tp_rank` | 0, 1, 2... | Each TP rank within a DP replica uses its own port | -| orchestrator | +200 | Extra offset when caller is the orchestrator (avoids collision with stage workers on the same node) | - -**Example** (base=50051, stage 0→1, DP=2, TP=2, kv_transfer): - -| Caller | DP | TP rank | Port | -|---|---|---|---| -| Stage worker | DP0 | rank 0 | `50051 + 100 + 0 + 0×2 + 0 = 50151` | -| Stage worker | DP0 | rank 1 | `50051 + 100 + 0 + 0×2 + 1 = 50152` | -| Stage worker | DP1 | rank 0 | `50051 + 100 + 0 + 1×2 + 0 = 50153` | -| Stage worker | DP1 | rank 1 | `50051 + 100 + 0 + 1×2 + 1 = 50154` | -| Orchestrator | — | — | `50051 + 200 + 0 = 50251` | - -## Memory Pool Modes - -| Mode | Config | Recommended Pool Size | Data Flow | Best For | -|---|---|---|---|---| -| CPU Pinned | `memory_pool_device: "cpu"` | 4 GB | GPU → CPU pool → RDMA → CPU pool → GPU | Most hardware topologies (recommended) | -| GPUDirect | `memory_pool_device: "cuda"` | 2 GB | GPU → GPU pool → RDMA (NIC reads GPU BAR1) → GPU pool | NIC-GPU direct PCIe (PIX topology) | - -> **Note**: GPUDirect RDMA requires the NIC and GPU to share a direct PCIe -> switch (PIX topology). On systems where they are connected via PXB or NODE, -> CPU pinned memory is faster due to GPU BAR1 bandwidth limitations. - -## Environment Variables - -| Variable | Description | -|---|---| -| `RDMA_DEVICE_NAME` | Override RDMA device name (e.g., `mlx5_0`). | -| `MC_IB_PCI_RELAXED_ORDERING` | Set to `1` to enable PCIe relaxed ordering for GPUDirect. | - -## Docker / Container Setup - -RDMA requires host-level device access: - -```bash -docker run -it \ - --cap-add=SYS_PTRACE \ - --cap-add=IPC_LOCK \ - --security-opt seccomp=unconfined \ - --network=host \ - --device=/dev/infiniband \ - -v /sys/class/infiniband:/sys/class/infiniband:ro \ - your-image:tag -``` - -## Performance - -Benchmark results on H800 GPUs with mlx5_0 RDMA NIC (~186 MB KV cache): - -| Metric | MooncakeStoreConnector | MooncakeTransferEngineConnector (CPU) | -|---|---|---| -| KV transfer wall time | ~810 ms | **~14 ms** | -| RDMA throughput | N/A (TCP) | ~22 GB/s | -| Speedup | 1x | **58x** | - -## Troubleshooting - -### Quick Diagnostics - -```bash -# 1. Check RDMA devices and link status -ibdev2netdev -# Expected: "mlx5_X port 1 ==> (Up)" -# RoCE devices map to Ethernet interfaces (e.g., enp75s0f0) -# IB devices map to ib0, ib1, etc. - -# 2. Check InfiniBand device details -ibstat - -# 3. Verify /dev/infiniband is accessible (required in containers) -ls /dev/infiniband/ - -# 4. Check Mooncake installation -python -c "from mooncake.engine import TransferEngine; print('OK')" - -# 5. Check environment variables -echo "RDMA_DEVICE_NAME=${RDMA_DEVICE_NAME:-}" -echo "MC_IB_PCI_RELAXED_ORDERING=${MC_IB_PCI_RELAXED_ORDERING:-}" -``` - -### Common Issues - -| Symptom | Cause | Fix | -|---|---|---| -| `Failed to modify QP to RTR` | Cross-NIC QP handshake failure (multi-NIC DGX) | Set `device_name` to a single RoCE NIC (e.g., `mlx5_2`) or set `RDMA_DEVICE_NAME` env var | -| `transport retry counter exceeded` | RDMA path between incompatible NICs | Same as above — restrict to one NIC | -| `zmq.error.Again: Resource temporarily unavailable` | ZMQ recv timeout (transfer took too long) | Check NIC selection; increase data may need longer timeout | -| `Mooncake Engine initialization failed` | Missing RDMA drivers or `/dev/infiniband` | Install Mellanox OFED; in Docker add `--device=/dev/infiniband` | -| `MemoryError` in allocator | Memory pool too small for payload | Increase `memory_pool_size` | -| GPU transfer slower than CPU | GPU BAR1 bandwidth limitation (PXB/NODE topology) | Use `memory_pool_device: "cpu"` instead of `"cuda"` | - -### Multi-NIC Environments (DGX) - -On DGX machines with 12+ RDMA NICs, only RoCE NICs (with a bound network -interface) reliably support loopback. IB-only NICs may fail cross-NIC QP -handshakes. To identify RoCE NICs: - -```bash -ibdev2netdev | grep -v "ib[0-9]" -# RoCE devices show Ethernet interface names like enp75s0f0 -``` - -Then configure the connector: -```yaml -device_name: "mlx5_2" # or set RDMA_DEVICE_NAME=mlx5_2 -``` - -See the RDMA Test README in tests/distributed/omni_connectors/README.md -for test-specific setup instructions. - -For more details on the underlying engine, refer to the -[Mooncake repository](https://github.com/kvcache-ai/Mooncake). - ---- - -## Design - -### 1. Overview - -`MooncakeTransferEngineConnector` is the high-performance remote connector in `vllm_omni/distributed/omni_connectors`. It is built on top of Mooncake `TransferEngine` and combines: - -- a **direct data plane** for remote memory writes -- a **ZMQ side channel** for metadata lookup, handshake, and completion signaling -- a **managed local memory pool** for both send and receive buffers - -Unlike `MooncakeStoreConnector`, which treats the backend as a distributed store, `MooncakeTransferEngineConnector` is designed as a peer-to-peer transport. Its goal is to move large stage payloads efficiently while still fitting the common `put()` / `get()` API defined by `OmniConnectorBase`. - -It is the most performance-oriented connector in the current OmniConnector family and is intended for large remote payloads such as: - -- KV cache transfer -- stage hidden-state payloads -- streaming chunk payloads -- other binary-heavy inter-stage artifacts - -### 2. Relationship with the OmniConnector System - -`MooncakeTransferEngineConnector` implements the same connector contract as the other backends: - -- `put(from_stage, to_stage, put_key, data)` -- `get(from_stage, to_stage, get_key, metadata=None)` -- `cleanup(request_id, ...)` -- `health()` -- `close()` - -It is integrated into the system through the standard connector plumbing: - -- `OmniConnectorFactory` constructs the connector from `ConnectorSpec` -- `load_omni_transfer_config()` resolves the edge-level connector configuration -- `get_connectors_config_for_stage()` and `resolve_omni_kv_config_for_stage()` inject the connector role -- All callers (batch forwarding, chunk transfer, KV transfer, etc.) interact with it through the same `put()` / `get()` contract - -The key system-level distinction is that this connector is **role-aware**: - -- sender instances expose data and listen for pull requests -- receiver instances allocate buffers and actively pull data from the sender - -### 3. Design Goals - -The connector is designed around four primary goals: - -1. **High-throughput remote transfer** - Avoid store-mediated round trips and write directly into the receiver memory region. - -2. **Fast path for raw payloads** - Support `torch.Tensor`, `bytes`, and `ManagedBuffer` without forcing all traffic through full object serialization. - -3. **Unified connector abstraction** - Preserve the same `put()` / `get()` interface used by the rest of the OmniConnector stack. - -4. **Safe lifecycle management** - Manage allocation, reuse, cleanup, and failure recovery for a registered memory pool. - -### 4. Architecture Overview - -At a high level, the connector is composed of four main subsystems: - -```mermaid -classDiagram - class OmniConnectorBase { - <> - +put(from_stage, to_stage, put_key, data) - +get(from_stage, to_stage, get_key, metadata) - +cleanup(request_id) - +health() - +close() - } - - class MooncakeTransferEngineConnector { - +supports_raw_data: bool - -engine: TransferEngine - -allocator: BufferAllocator - -pool: torch.Tensor - -zmq_ctx: zmq.Context - -_local_buffers: dict - -_sender_executor: ThreadPoolExecutor - -_listener_thread: threading.Thread - +put(...) - +get(...) - +update_sender_info(sender_host, sender_zmq_port) - +get_connection_info() - +cleanup(request_id, from_stage, to_stage) - +close() - } - - class BufferAllocator { - -total_size: int - -alignment: int - -free_blocks: list - +alloc(size) int - +free(offset, size) - } - - class ManagedBuffer { - -allocator: BufferAllocator - -offset: int - -size: int - -pool_tensor: torch.Tensor - +tensor - +as_tensor(dtype, shape) torch.Tensor - +to_bytes() bytes - +release() - } - - class TransferEngine { - +initialize(host, handshake, protocol, device_name) - +register_memory(base_ptr, size) - +batch_transfer_sync_write(remote_session, src_addrs, dst_addrs, lengths) - +unregister_memory(base_ptr) - +get_rpc_port() int - } - - class QueryRequest { - +request_id: str - } - - class QueryResponse { - +request_id: str - +data_size: int - +is_fast_path: bool - } - - class MooncakeAgentMetadata { - +remote_hostname: str - +remote_port: int - +request_id: str - +dst_addrs: list[int] - +lengths: list[int] - } - - OmniConnectorBase <|-- MooncakeTransferEngineConnector - MooncakeTransferEngineConnector *-- BufferAllocator - MooncakeTransferEngineConnector *-- TransferEngine - ManagedBuffer --> BufferAllocator : releases to - ManagedBuffer --> "1" torch.Tensor : views - MooncakeTransferEngineConnector ..> ManagedBuffer : returns / retains - MooncakeTransferEngineConnector ..> QueryRequest : decodes - MooncakeTransferEngineConnector ..> QueryResponse : encodes - MooncakeTransferEngineConnector ..> MooncakeAgentMetadata : exchanges -``` - -#### 4.1 Transfer Engine - -Mooncake `TransferEngine` is responsible for the actual data-plane transfer. It registers local memory and performs synchronous remote writes through: - -```python -batch_transfer_sync_write(...) -``` - -#### 4.2 Managed Memory Pool - -Each connector instance owns a large pre-registered memory pool: - -- CPU pinned memory when `memory_pool_device == "cpu"` -- GPU memory when `memory_pool_device == "cuda"` - -This avoids repeated memory registration and allows each transfer to allocate subranges from one long-lived pool. - -#### 4.3 Buffer Manager - -Two helper classes control local memory ownership: - -- `BufferAllocator` - Manages aligned subrange allocation and free-list merging. - -- `ManagedBuffer` - Represents one live slice of the pool and exposes: - - `.tensor` - - `.as_tensor(dtype, shape)` - - `.to_bytes()` - - `.release()` - -#### 4.4 ZMQ Side Channel - -ZMQ is used for transport coordination, not for the data payload itself. It handles: - -- metadata query from receiver to sender -- pull request submission -- completion or error signaling -- internal notification from worker threads back to the listener thread - -This split makes the control plane lightweight while keeping the bulk payload on the transfer engine data plane. - -### 5. Role Model - -#### 5.1 Sender Role - -A sender connector: - -- accepts `put()` calls -- stores live transfer-ready buffers in `_local_buffers` -- starts a ZMQ listener thread -- responds to metadata queries and pull requests from receivers - -#### 5.2 Receiver Role - -A receiver connector: - -- does not bind the sender-side ZMQ listener -- accepts `get()` calls -- allocates receive buffers from its own pool -- requests metadata or transfer service from the sender - -The role is not inferred dynamically. It is injected by the stage configuration layer: - -- incoming edge for a stage -> `role="receiver"` -- outgoing edge for a stage -> `role="sender"` - -This is important because incorrect role assignment would break initialization semantics. - -#### 5.3 Host Auto-Detection - -The `host` configuration field supports the special value `"auto"`. When set, the connector auto-detects the local IP address that would be used for external communication (via a UDP socket probe to `8.8.8.8`). If that fails, it falls back to hostname resolution, and ultimately to `127.0.0.1`. - -This is useful in environments where the operator does not want to hard-code IP addresses in the connector config. - -#### 5.4 RDMA Device Filtering - -The `device_name` configuration field allows the operator to specify which RDMA NICs to use (comma-separated, e.g. `"mlx5_0,mlx5_1"`). If not set in config, the connector also checks the `RDMA_DEVICE_NAME` environment variable. - -This is important in environments with mixed InfiniBand/RoCE NICs, where not all devices are suitable for the transfer engine. - -### 6. Local Memory Management - -#### 6.1 Memory Pool Registration - -During initialization, the connector: - -1. allocates a large pool tensor -2. records its base pointer -3. registers that memory with Mooncake -4. creates a `BufferAllocator` for subrange management - -This means every later transfer only allocates offsets inside the pre-registered pool rather than registering memory per request. - -#### 6.2 BufferAllocator - -`BufferAllocator` maintains a sorted free list of `(offset, size)` blocks and enforces alignment. Its responsibilities include: - -- aligned allocation -- freeing previously allocated blocks -- adjacent block merging -- double-free detection -- overlap detection to catch corruption - -This is a critical piece of the connector because both sender and receiver depend on long-lived pool reuse. - -#### 6.3 ManagedBuffer - -`ManagedBuffer` is the main fast-path data wrapper. It can: - -- expose the pool slice as a zero-copy 1D `uint8` tensor -- reinterpret that slice as a typed tensor -- copy out the contents as Python `bytes` -- release the slice back to the allocator - -The connector uses `ManagedBuffer` in two different ways: - -- as a send-side holder to keep the pool slice alive -- as a receive-side return type when `is_fast_path=True` - -### 7. Put Flow - -#### 7.1 High-Level Behavior - -`put()` is only valid in sender mode. Its job is to expose a payload for later remote pull by the receiver. - -The high-level flow is: - -1. validate connector state and role -2. convert the input into a pool-backed transferable representation -3. store the transfer metadata in `_local_buffers` -4. return lightweight metadata describing how the receiver can fetch the data - -#### 7.2 Payload Type Handling - -`put()` supports three payload classes: - -**A. `ManagedBuffer`** - -If the buffer belongs to the same pool, the connector can use it directly without copying. This is the most efficient path. - -If the buffer comes from a different pool, the connector falls back to a copy path. - -**B. `torch.Tensor` or `bytes`** - -These payloads are copied into the local pool and marked as fast-path data: - -- no Omni object serialization is required -- receiver can get a `ManagedBuffer` back - -**C. Generic Python object** - -Any other payload is serialized via `OmniSerializer.serialize(...)` and then copied into the pool. - -In this case: - -- `is_fast_path=False` -- the receiver will deserialize back into a Python object - -#### 7.3 Sender Metadata - -The sender returns: - -```python -{ - "source_host": self.host, - "source_port": self.zmq_port, - "data_size": size, - "is_fast_path": is_fast_path, -} -``` - -This metadata is intentionally lightweight. It tells the receiver: - -- where the sender-side control plane lives -- how large the remote transfer will be -- whether the payload should be returned as a `ManagedBuffer` or a deserialized object - -#### 7.4 Sender Buffer Table - -The sender stores each live payload in `_local_buffers` under the stage-qualified key. Each entry contains: - -- source addresses -- lengths -- the holder object -- ownership information (`should_release`) -- `is_fast_path` -- creation time - -This table is the sender-side truth source for both metadata queries and pull requests. - -### 8. Get Flow - -#### 8.1 High-Level Behavior - -`get()` runs on the receiver side and performs four steps: - -1. resolve metadata -2. allocate a destination buffer in the local pool -3. request the sender to write into that destination buffer -4. return either a `ManagedBuffer` or a deserialized object - -#### 8.2 Metadata Resolution Paths - -The `metadata` parameter in `get()` is optional. The connector supports two resolution modes depending on whether the caller supplies it. - -**With metadata** - -When the caller passes metadata, the connector uses it directly. The metadata carries: - -- `source_host` / `source_port` — sender ZMQ endpoint -- `data_size` — payload byte count -- `is_fast_path` — whether the receiver gets a `ManagedBuffer` or a deserialized object - -This mode is suitable when the control plane already forwards the sender's `put()` output to the receiver. - -**Without metadata** - -When `get(metadata=None)` is called, the connector queries the sender over ZMQ to discover the same fields (`data_size`, `is_fast_path`). The caller must first call: - -```python -update_sender_info(sender_host, sender_zmq_port) -``` - -so that the connector knows where to send the query. - -This mode is suitable for polling-based flows (e.g. KV transfer, async chunk transfer) where the receiver does not have metadata from the control plane. - -#### 8.3 Destination Allocation - -Once metadata is resolved, the receiver: - -1. allocates a subrange from its own local pool -2. wraps it in a `ManagedBuffer` -3. builds a `MooncakeAgentMetadata` request containing: - - receiver hostname - - receiver RPC port - - request ID - - destination addresses - - transfer lengths - -This tells the sender exactly where to write the incoming data. - -#### 8.4 Transfer Completion - -The receiver then sends the pull request over ZMQ and waits for: - -- `TRANS_DONE` -- or `TRANS_ERROR` - -If the transfer succeeds: - -- for `is_fast_path=True`, the receiver returns `(ManagedBuffer, size)` -- for `is_fast_path=False`, the receiver copies to bytes, deserializes, releases the buffer, and returns `(object, size)` - -### 9. Sender-Side Listener Design - -#### 9.1 Listener Thread - -In sender mode, the connector starts `_zmq_listener_loop()` after initialization. The listener: - -- binds `tcp://{host}:{zmq_port}` -- receives incoming requests -- uses a poller for socket events and internal notifications -- periodically reclaims stale buffers - -If the bind fails, initialization fails immediately. The code does not silently downgrade the connector role. - -#### 9.2 Worker Thread Pool - -The listener hands work to `_sender_executor` so that the listener thread does not block on transfer work. - -There are two request types: - -- metadata query -> `_handle_query_request(...)` -- transfer request -> `_handle_pull_request(...)` - -#### 9.3 Query Handling - -For metadata queries, the sender looks up the request ID in `_local_buffers` and returns: - -- data size -- fast-path flag - -This supports consumers that only know the sender endpoint but not the original sender metadata. - -#### 9.4 Pull Handling - -For a transfer request, the sender: - -1. locates the source addresses in `_local_buffers` -2. constructs the remote session identifier -3. calls `batch_transfer_sync_write(...)` -4. replies `TRANS_DONE` or `TRANS_ERROR` - -On success, the sender immediately calls `cleanup(meta.request_id)` and frees the producer-side buffer if it owns it. - -This choice is important: it makes the connector effectively a **single-consumer transfer model** for each successful put/get pair. - -### 10. Fast Path Semantics - -This connector explicitly advertises: - -```python -supports_raw_data = True -``` - -That means it can move raw payloads without forcing everything through the Omni object serializer. - -#### Fast Path - -For `torch.Tensor`, `bytes`, or pool-local `ManagedBuffer`: - -- sender returns `is_fast_path=True` -- receiver returns a `ManagedBuffer` -- caller is responsible for calling `release()` - -This avoids an unnecessary copy on the receiver side. - -#### Serialized Object Path - -For arbitrary Python objects: - -- sender serializes the payload -- receiver converts the receive buffer to bytes -- receiver deserializes the object -- receive buffer is released internally - -This preserves a uniform object-oriented API while still allowing optimized raw-data transport when possible. - -### 11. Failure Handling and Cleanup - -#### 11.1 Timeouts and Socket Recovery - -The receiver caches ZMQ REQ sockets per thread, but invalidates them after failures. This avoids reusing sockets that may be stuck in a bad state after timeout or receive errors. - -Timeout is scaled based on payload size: - -- a base timeout -- plus additional time for large payloads - -This is intended to reduce false timeouts for large remote writes. - -#### 11.2 Stale Buffer Reclamation - -The sender periodically reclaims old entries from `_local_buffers` using a TTL policy. This protects the memory pool from permanent leaks if a receiver crashes or never consumes a prepared payload. - -This is a practical recovery mechanism, although the code notes that TTL cleanup can still race with very long-running in-flight transfers. - -#### 11.3 Connector Shutdown - -`close()` is a full resource teardown routine. It: - -- stops the listener thread -- shuts down the worker executor -- releases all pending buffers -- closes cached sockets -- unregisters memory from the engine when supported -- terminates the ZMQ context -- drops the pool reference - -This makes `MooncakeTransferEngineConnector` the most lifecycle-aware connector in the current connector family. - -### 12. Current Implementation Constraints - -The current code documents several important topology constraints. - -#### 12.1 One Sender to One Receiver per Successful Transfer - -After a successful transfer, the sender-side buffer is cleaned up immediately. This means the same prepared payload is not retained for multiple independent receivers. - -#### 12.2 One Receiver to One Active Sender Endpoint - -The receiver only stores one `(sender_host, sender_zmq_port)` pair through `update_sender_info(...)`. So the metadata-query mode is currently single-sender at a time. - -#### 12.3 Explicit Buffer Ownership Matters - -When the connector allocates a pool slice internally, it is responsible for releasing it. When a caller passes an externally owned `ManagedBuffer`, the connector keeps it alive for transfer but does not assume ownership of its eventual release. - -These constraints are consistent with the current implementation and should be treated as design assumptions rather than incidental behavior. - -### 13. Data Flow in the Pipeline - -The end-to-end sender/receiver interaction is: - -```mermaid -sequenceDiagram - participant SenderStage - participant SenderConnector - participant ReceiverConnector - participant ReceiverStage - - SenderStage->>SenderConnector: put(from_stage, to_stage, put_key, data) - SenderConnector->>SenderConnector: place payload in local memory pool - SenderConnector-->>SenderStage: metadata(source_host, source_port, data_size, is_fast_path) - - ReceiverStage->>ReceiverConnector: get(..., metadata) - ReceiverConnector->>ReceiverConnector: allocate destination buffer - ReceiverConnector->>SenderConnector: ZMQ pull request with dst addr - SenderConnector->>ReceiverConnector: TransferEngine remote write - SenderConnector-->>ReceiverConnector: TRANS_DONE - ReceiverConnector-->>ReceiverStage: ManagedBuffer or deserialized object -``` - -For metadata-less polling, the flow simply adds a metadata query step before the pull request. - -### 14. Strengths and Trade-offs - -#### Strengths - -- Best remote-transfer design in the current connector stack for large payloads. -- Supports raw-data fast path. -- Keeps stage communication under the same connector abstraction. -- Includes real lifecycle and memory-pool management. -- Works for both stage payload transfer and KV transfer scenarios. - -#### Trade-offs - -- More complex than the store-based connector. -- Correctness depends on role injection and endpoint coordination. -- Caller must release fast-path receive buffers. -- Current implementation is optimized for single-consumer transfer semantics. - -### 15. Summary - -`MooncakeTransferEngineConnector` is the high-performance peer-to-peer transport in the OmniConnector system. Its design combines: - -- a registered memory pool -- a safe subrange allocator -- a ZMQ control plane -- a Mooncake transfer-engine data plane - -This allows the connector to support both: - -1. a **fast path** for raw tensors and bytes -2. a **generic object path** for arbitrary Python payloads - -Within vLLM-Omni, it is the connector that most directly targets performance-sensitive remote transfer, especially for large payloads and KV cache movement. Its additional complexity is deliberate: it is the connector that turns the generic OmniConnector abstraction into a transport capable of efficient remote memory movement rather than simple object storage. diff --git a/docs/design/feature/omni_connectors/shared_memory_connector.md b/docs/design/feature/omni_connectors/shared_memory_connector.md deleted file mode 100644 index 5b35014f233..00000000000 --- a/docs/design/feature/omni_connectors/shared_memory_connector.md +++ /dev/null @@ -1,259 +0,0 @@ -# SharedMemoryConnector - -## When to Use - -Best for single-node deployments where stages run on the same host. It is -auto-configured when no explicit connector is specified for an edge. - -## How It Works - -All payloads are serialized and stored in shared memory (`/dev/shm`); the SHM -segment name is returned in metadata. The configuration exposes a -`shm_threshold_bytes` field for a future inline-vs-SHM split, but the current -implementation always uses shared memory regardless of payload size. - -## Configuration - -```yaml -runtime: - connectors: - connector_of_shared_memory: - name: SharedMemoryConnector - extra: - shm_threshold_bytes: 65536 -``` - -## Notes - -- Auto-mode uses SharedMemoryConnector if no connector is declared for an edge. - ---- - -## Design - -### 1. Overview - -`SharedMemoryConnector` is the default same-node connector in `vllm_omni/distributed/omni_connectors`. It is designed for stage-to-stage transfer when producer and consumer processes run on the same host and can share `/dev/shm`. - -The connector provides a unified `put()` / `get()` API for arbitrary Python objects while keeping the control plane lightweight: - -- The payload is serialized by the connector. -- The serialized bytes are placed in shared memory. -- The queue/control plane only carries a small metadata handle. - -This makes `SharedMemoryConnector` the simplest connector in the OmniConnector family and the default fallback when an edge does not explicitly configure another backend. - -### 2. Relationship with the OmniConnector System - -`SharedMemoryConnector` implements `OmniConnectorBase`, so it follows the same lifecycle and API contract as the other connectors: - -- `put(from_stage, to_stage, put_key, data)` -- `get(from_stage, to_stage, get_key, metadata=None)` -- `cleanup(request_id)` -- `health()` -- `close()` - -Within the larger system: - -- `load_omni_transfer_config()` automatically fills missing edges with `SharedMemoryConnector`. -- Callers interact with the connector exclusively through the `put()` / `get()` / `cleanup()` contract — the connector does not require caller-specific logic. - -Compared with the remote Mooncake-based connectors, `SharedMemoryConnector` is intentionally minimal and local-only. - -### 3. Design Goals - -The connector is built around the following goals: - -- **Low-friction local transfer** for single-node multi-process pipelines. -- **Unified object semantics** for arbitrary Python payloads. -- **Small control-plane overhead** by passing only metadata through queues. -- **Zero external dependencies** beyond Python shared memory and the existing stage utilities. - -It is not intended to provide cross-node transfer, RDMA, or raw tensor zero-copy semantics across processes. - -### 4. Core Design - -#### 4.1 Serialization Model - -`SharedMemoryConnector` always starts from a Python object and serializes it through the shared Omni serializer: - -```python -payload = self.serialize_obj(data) -``` - -This keeps the connector behavior consistent with the rest of the connector stack: - -- producer code does not need connector-specific serialization logic -- consumer code always receives the original object after deserialization -- the connector can reuse the same serializer used by other backends - -#### 4.2 Shared Memory as the Data Plane - -The actual data plane is a shared-memory segment created by: - -- `shm_write_bytes(...)` -- `shm_read_bytes(...)` - -The connector stores a small metadata object such as: - -```python -{ - "shm": {"name": ..., "size": ...}, - "size": ... -} -``` - -This metadata is passed over the control plane and allows the downstream stage to locate the shared-memory segment. - -#### 4.3 Locking Model - -To avoid races between the producer and consumer, the connector uses a lock file per request: - -```text -/dev/shm/shm_{put_key}_lockfile.lock -``` - -Locking is done with `fcntl.flock`: - -- producer uses `LOCK_EX` -- consumer uses `LOCK_EX` - -Both sides acquire an exclusive lock. This ensures that the shared-memory segment is not read while it is still being written and makes the handoff safer in a multi-process environment. - -### 5. Put / Get Flow - -#### 5.1 Producer Flow: `put()` - -The producer-side flow is: - -1. Serialize the input object to bytes. -2. Compute the payload size. -3. Acquire the per-request lock file. -4. Write the bytes into shared memory. -5. Return lightweight metadata to the caller. - -The returned tuple is: - -```python -(success, serialized_size, metadata) -``` - -where `metadata` contains the shared-memory handle needed by the consumer. - -#### 5.2 Consumer Flow: `get(metadata=...)` - -The primary consumer path is metadata-driven: - -1. Extract the shared-memory handle from `metadata`. -2. Acquire the exclusive lock. -3. Read the raw bytes from shared memory. -4. Deserialize the bytes back into the original Python object. -5. Remove the lock file if it still exists. - -This is the path used by the current stage-to-stage connector flow. - -#### 5.3 Compatibility Flow: `get(metadata=None)` - -The connector also keeps a compatibility path for callers that only know the key: - -1. Attempt to open the shared-memory segment by name via `SharedMemory(name=get_key)`. -2. If the segment exists and has non-zero size, acquire the exclusive lock and read the bytes. -3. Deserialize the bytes and return the object. - -If the segment does not exist or any exception occurs, the call returns `None` immediately. There is no retry loop in this path -- it is a single-attempt open. - -This path is mainly for older code paths and is not the preferred mode for the current connector pipeline. - -### 6. Key Implementation Characteristics - -#### 6.1 Threshold Exists, but the Current Code Always Uses SHM - -The class keeps a `shm_threshold_bytes` field and still exposes metrics for inline writes. However, the current implementation uses: - -```python -if True: - ... -``` - -inside `put()`, which means the current code path always writes to shared memory. - -So the design still suggests a future split between: - -- small payloads inline -- large payloads in shared memory - -but the current behavior is effectively: - -- all payloads go through shared memory - -This should be documented because it affects real runtime behavior. - -#### 6.2 Cleanup Is Currently Passive - -`cleanup()` is currently a no-op. The intended assumption is: - -- the consumer reads the segment -- the underlying shared-memory helpers unlink it - -If the consumer never executes `get()`, the shared-memory segment may remain allocated. This means the connector relies on the normal success path for resource reclamation. - -#### 6.3 Close Is Currently Minimal - -`close()` is also a no-op. There is no connector-owned background thread, socket, or memory pool to tear down, so the lifecycle is simple. The trade-off is that `close()` does not scan or recover leaked shared-memory resources. - -### 7. Data Flow in the Pipeline - -The typical flow with `SharedMemoryConnector` is: - -```mermaid -sequenceDiagram - participant SenderStage - participant SharedMemoryConnector - participant QueueOrControlPlane - participant ReceiverStage - - SenderStage->>SharedMemoryConnector: put(from_stage, to_stage, put_key, data) - SharedMemoryConnector->>SharedMemoryConnector: serialize object - SharedMemoryConnector->>SharedMemoryConnector: write bytes to /dev/shm - SharedMemoryConnector-->>SenderStage: metadata {shm, size} - SenderStage->>QueueOrControlPlane: forward connector metadata - QueueOrControlPlane->>ReceiverStage: task + connector metadata - ReceiverStage->>SharedMemoryConnector: get(from_stage, to_stage, get_key, metadata) - SharedMemoryConnector->>SharedMemoryConnector: read bytes from /dev/shm - SharedMemoryConnector->>SharedMemoryConnector: deserialize object - SharedMemoryConnector-->>ReceiverStage: (data, size) -``` - -This is a classic split-control-plane / data-plane design, but constrained to a single host. - -### 8. Strengths and Trade-offs - -#### Strengths - -- Very simple deployment model. -- No external service dependency. -- Fits naturally into the existing queue-driven orchestration flow. -- Good default for local multi-process pipelines. - -#### Trade-offs - -- Same-node only. -- Full object serialization and deserialization are still required. -- Resource cleanup depends on the normal consumer path. -- Shared memory capacity is limited by host configuration. - -### 9. Summary - -`SharedMemoryConnector` is the baseline local transport for the OmniConnector system. Its design is intentionally straightforward: - -- serialize object -- place bytes in shared memory -- pass metadata through the control plane -- deserialize on the receiving side - -It plays two important roles in vLLM-Omni: - -1. It is the simplest production-ready connector for same-node stage pipelines. -2. It serves as the automatic fallback connector when no explicit edge transport is configured. - -Although the current implementation is deliberately minimal, it provides the foundation for reliable local connector semantics and keeps the stage communication model uniform across the system. diff --git a/docs/design/feature/omni_connectors/yuanrong_connector.md b/docs/design/feature/omni_connectors/yuanrong_connector.md deleted file mode 100644 index 12127ba3e64..00000000000 --- a/docs/design/feature/omni_connectors/yuanrong_connector.md +++ /dev/null @@ -1,358 +0,0 @@ -# YuanrongConnector - -## When to Use - -Best for multi-node distributed inference using Yuanrong Datasystem. - -## Mechanism - -Uses Yuanrong Datasystem's distributed KV store (`datasystem.kv_client`). - -- Data Plane: TCP or RDMA for high-bandwidth transfer. -- Control Plane: Yuanrong Datasystem workers and etcd. -- Keying: deterministic keys based on `put_key` (often composed as `request_id:fromStage_toStage`). - -## Installation - -```bash -pip install openyuanrong-datasystem -``` - -## Start etcd - -```bash -# Download and install etcd (v3.5.12 or higher) -ETCD_VERSION="v3.5.12" -ETCD_ARCH="linux-arm64" -wget https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-${ETCD_ARCH}.tar.gz -tar -xvf etcd-${ETCD_VERSION}-${ETCD_ARCH}.tar.gz -cd etcd-${ETCD_VERSION}-${ETCD_ARCH} -sudo cp etcd etcdctl /usr/local/bin/ - -# Start etcd -etcd \ - --name etcd-single \ - --data-dir /tmp/etcd-data \ - --listen-client-urls http://0.0.0.0:2379 \ - --advertise-client-urls http://0.0.0.0:2379 \ - --listen-peer-urls http://0.0.0.0:2380 \ - --initial-advertise-peer-urls http://0.0.0.0:2380 \ - --initial-cluster etcd-single=http://0.0.0.0:2380 & - -# Verify etcd is running -etcdctl --endpoints "127.0.0.1:2379" put key "value" -etcdctl --endpoints "127.0.0.1:2379" get key -``` - -For production environments, refer to the -[official etcd clustering documentation](https://etcd.io/docs/current/op-guide/clustering/). - -## Start Datasystem Worker - -```bash -# Replace ${ETCD_IP} with etcd node IP, ${WORKER_IP} with local node IP -dscli start -w \ - --worker_address "${WORKER_IP}:31501" \ - --etcd_address "${ETCD_IP}:2379" \ - --shared_memory_size_mb 20480 -``` - -To stop the worker: - -```bash -dscli stop --worker_address "${WORKER_IP}:31501" -``` - -## Configuration - -Define the connector in runtime: - -```yaml -runtime: - connectors: - connector_of_yuanrong: - name: YuanrongConnector - extra: - host: "127.0.0.1" - port: 31501 - get_sub_timeout_ms: 1000 -``` - -Wire stages to the connector: - -```yaml -stage_args: - - stage_id: 0 - output_connectors: - to_stage_1: connector_of_yuanrong - - - stage_id: 1 - input_connectors: - from_stage_0: connector_of_yuanrong -``` - -Parameters: - -- host: datasystem worker host. -- port: datasystem worker port (default: `35001` if omitted; the example above uses `31501` to match the worker startup command). -- get_sub_timeout_ms: get timeout in milliseconds (0 for no timeout). - -For more details, refer to the -[Yuanrong Datasystem repository](https://atomgit.com/openeuler/yuanrong-datasystem). - ---- - -## Design - -### 1. Overview - -`YuanrongConnector` is the Datasystem-based remote connector in `vllm_omni/distributed/omni_connectors`. It uses Yuanrong Datasystem's distributed key-value client as the transport backend and exposes the same `put()` / `get()` interface as the other OmniConnectors. - -Like `MooncakeStoreConnector`, it is a store-oriented remote connector rather than a direct peer-to-peer transport. Its role is to let stage payloads move across nodes through a deterministic key-based storage abstraction while keeping the rest of the pipeline on the common connector API. - -It is intended for deployments that already use Yuanrong Datasystem and want a remote connector that integrates with the existing OmniConnector configuration and orchestration model. - -### 2. Relationship with the OmniConnector System - -`YuanrongConnector` implements `OmniConnectorBase`, so it participates in the same connector lifecycle as the other backends: - -- `OmniConnectorFactory` constructs it from a `ConnectorSpec` -- stage edge configuration is resolved by `load_omni_transfer_config()` -- All callers (batch forwarding, chunk transfer, KV transfer, etc.) interact with it through the same `put()` / `get()` contract - -This means the connector is not exposed directly to stage logic. Stages only interact with the generic connector contract, and the backend choice remains a configuration concern. - -### 3. Design Goals - -The connector is built around the following goals: - -1. **Cross-node payload transfer through Datasystem** - Reuse Yuanrong Datasystem as the remote exchange medium for stage data. - -2. **Uniform object transfer semantics** - Allow arbitrary Python objects to be transmitted through the shared Omni serializer. - -3. **Minimal connector-specific control plane** - Use deterministic keys so that consumers can retrieve data without an extra transport metadata handoff. - -4. **Operational reuse of existing infrastructure** - Fit into environments that already deploy Yuanrong Datasystem workers and etcd. - -The connector is not designed for direct remote-memory writes or tensor-specific fast-path transfer. - -### 4. Core Design - -#### 4.1 Store-Oriented Transfer Model - -`YuanrongConnector` treats the transport backend as a distributed object store: - -1. serialize the Python payload -2. build a deterministic connector key -3. write the serialized bytes into Datasystem -4. read the bytes back on the receiver side -5. deserialize them into the original object - -This is the same broad architectural class as `MooncakeStoreConnector`, but implemented on top of Yuanrong Datasystem APIs instead of Mooncake store APIs. - -#### 4.2 Deterministic Keying - -Unlike the default `_make_key()` in `OmniConnectorBase`, `YuanrongConnector` defines its own key format: - -```text -{request_id}:{from_stage}_{to_stage} -``` - -This has two design implications: - -- the request identifier remains the primary lookup handle -- stage routing information is embedded in the key so that the same logical request ID can safely appear on different edges - -The explicit override also makes the key format easier to align with Datasystem-side debugging and operational inspection. - -#### 4.3 No Extra Metadata Hand-off - -`put()` returns: - -```python -(success, serialized_size, None) -``` - -and does not generate connector-specific metadata. - -This design works because the receiver can reconstruct the exact same key from: - -- `get_key` -- `from_stage` -- `to_stage` - -As a result, the connector does not require a separate side-channel metadata handoff. - -### 5. Initialization - -#### 5.1 Datasystem Client Dependency - -The connector requires the Datasystem Python bindings to expose: - -- `KVClient` -- `SetParam` -- `WriteMode` - -If any of these symbols are unavailable, connector construction fails immediately with `ImportError`. This keeps configuration errors explicit and avoids a partially initialized runtime. - -#### 5.2 Client Setup - -During `_init_client()`, the connector: - -1. reads `host` and `port` -2. creates `KVClient(host, port)` -3. calls `client.init()` - -At construction time it also creates a `SetParam` and fixes: - -```python -self.set_param.write_mode = WriteMode.NONE_L2_CACHE_EVICT -``` - -This means the connector has a stable write policy for all writes and does not currently expose write-mode selection as a higher-level connector option. - -### 6. Put / Get Flow - -#### 6.1 Producer Flow: `put()` - -The producer-side flow is: - -1. verify that the Datasystem client has been initialized -2. serialize the input object with the shared Omni serializer -3. build the Datasystem key using the connector-specific `_make_key()` -4. call `client.set(key, serialized_data, self.set_param.write_mode)` -5. update metrics and return success - -The returned metadata is always `None`, because the Datasystem key itself is the lookup contract between producer and consumer. - -#### 6.2 Consumer Flow: `get()` - -The consumer-side flow is: - -1. verify that the Datasystem client has been initialized -2. rebuild the same key with `from_stage`, `to_stage`, and `get_key` -3. call: - -```python -client.get([key], False, self.get_sub_timeout_ms) -``` - -4. take the first returned element if present -5. deserialize it and return `(data, payload_size)` - -If the returned list is empty or contains no data for the key, `get()` returns `None`. - -### 7. Timeout and Retrieval Semantics - -The connector uses `get_sub_timeout_ms` as its read timeout. Unlike `MooncakeStoreConnector`, which performs an explicit retry loop in Python, `YuanrongConnector` delegates waiting behavior more directly to the Datasystem client call. - -This leads to a slightly different retrieval model: - -- `MooncakeStoreConnector`: retry-oriented polling in connector code -- `YuanrongConnector`: single client call with backend-managed timeout behavior - -From the connector API perspective the result is the same, but operationally the waiting behavior is more dependent on Datasystem client semantics. - -### 8. Integration with Stage Communication - -All callers use the connector through the same `put()` / `get()` contract: - -- the sender calls `put()` to serialize and store the payload -- the receiver calls `get()` to retrieve and deserialize it -- no connector-specific metadata is required, since the Datasystem key is the rendezvous point - -Because `put()` returns `metadata=None`, the connector is naturally compatible with callers that do not forward metadata (e.g. polling-based flows). The trade-off is that all payloads incur full serialization and deserialization costs, and there is no raw tensor fast path, which makes the connector functional but not optimized for the largest payloads. - -### 9. Data Flow in the Pipeline - -The end-to-end transfer model is: - -```mermaid -sequenceDiagram - participant SenderStage - participant YuanrongConnector - participant Datasystem - participant ReceiverStage - - SenderStage->>YuanrongConnector: put(from_stage, to_stage, put_key, data) - YuanrongConnector->>YuanrongConnector: serialize object - YuanrongConnector->>Datasystem: set(key, bytes) - YuanrongConnector-->>SenderStage: (success, size, None) - - ReceiverStage->>YuanrongConnector: get(from_stage, to_stage, get_key) - YuanrongConnector->>Datasystem: get([key], timeout) - YuanrongConnector->>YuanrongConnector: deserialize bytes - YuanrongConnector-->>ReceiverStage: (data, size) -``` - -This is a store-mediated remote connector design with deterministic key lookup and no explicit side-channel metadata exchange. - -### 10. Strengths and Trade-offs - -#### Strengths - -- Reuses existing Yuanrong Datasystem infrastructure. -- Keeps the connector contract simple and uniform. -- Requires no connector-specific metadata handoff. -- Suitable for remote stage transfer in Datasystem-based deployments. - -#### Trade-offs - -- Always pays full serialization and deserialization cost. -- Does not support raw bytes / tensor fast-path semantics. -- Depends on external Datasystem worker availability. -- Retrieval and timeout behavior are partly delegated to the backend client. - -### 11. Important Implementation Characteristics - -#### 11.1 Cleanup Is a No-op - -`cleanup()` only logs a debug message and does not explicitly remove data from Datasystem. The current design assumes backend-side lifecycle or garbage collection rather than request-scoped delete semantics inside the connector. - -This mirrors the same design trade-off seen in other store-based connectors: simplicity over explicit per-request data reclamation. - -#### 11.2 Close Only Releases the Local Client Handle - -`close()` does not perform a remote shutdown. It simply clears the local `client` reference and marks the connector as closed from the process perspective: - -```python -self.client = None -``` - -This is appropriate for a client-based store connector, but it also means that backend resource lifecycle remains outside the connector's control. - -#### 11.3 Error and Timeout Metrics Are Coarse-Grained - -The connector tracks: - -- `puts` -- `gets` -- `bytes_transferred` -- `errors` -- `timeouts` - -In the current code, failed `put()` increments `errors`, while `get()` exceptions increment `timeouts`. This is operationally useful, but it does not distinguish between: - -- backend timeout -- not-found result -- transport failure -- deserialization failure - -So the metrics should be read as high-level health indicators, not detailed root-cause diagnostics. - -### 12. Summary - -`YuanrongConnector` is the Datasystem-backed remote connector in the OmniConnector family. Its design is straightforward: - -- serialize payloads -- store them under a deterministic stage-qualified key -- retrieve them by the same key -- deserialize them on the receiving side - -Within vLLM-Omni, it provides a clean integration point for Yuanrong Datasystem-based deployments while preserving the same connector abstraction used by the rest of the pipeline. - -Its design priorities are simplicity, infrastructure reuse, and API consistency rather than direct-memory transport optimization. diff --git a/docs/design/feature/prefix_caching.md b/docs/design/feature/prefix_caching.md deleted file mode 100644 index ebad8b69106..00000000000 --- a/docs/design/feature/prefix_caching.md +++ /dev/null @@ -1,164 +0,0 @@ -# Automatic Prefix Caching in Omni Models - - ---- - -## Table of Contents - -- [Overview](#overview) -- [High-Level Approach](#high-level-approach) -- [Example](#example) -- [What About Multimodal Inputs?](#what-about-multimodal-inputs) - ---- - -### Overview - -Prefix caching in the context of kv-cache management is a useful optimization for avoiding redundant computations. The main idea is that we store portions of the kv-cache from processed requests, so that we can reuse them if incoming requests have the same prefix as previous requests. - -vLLM manages the kv-cache as blocks, which represent a span of tokens of a fixed length. Blocks are hashable by the content that they contain, which typically means the tokens within the span, but also could be influenced by other factors, e.g., LoRA and multimodal data. - -vLLM implements automatic prefix caching for managing its kv-cache, which is best understood by reading the design document [here](https://docs.vllm.ai/en/latest/design/prefix_caching/). vLLM-Omni builds on top of the prefix caching mechanism in a noninvasive way to allow caching between stages in Omni pipelines. This typically means for a given stage we aim to support caching for the following: - -- The last hidden states produced by the stage -- Model / stage specific multimodal data - -!!! note "Note 1" - This document describes vLLM-Omni's mechanism for caching tensor outputs that are meant to be passed between stages, when requests have common prefixes, similar to the way in which vLLM has prefix caching for the kv-cache. This works in conjunction with vLLM's multimodal encoder caching, but is distinct. See the final section for a concrete example for how they tie together in practice. - -### High-Level Approach -!!! note "Note 2" - Prior to reading this section, it's recommended to take a look at the design documents in vLLM for [Automatic Prefix Caching](https://docs.vllm.ai/en/latest/features/automatic_prefix_caching/), which will make some of the concepts more clear. - -The main focus of vLLM-Omni's approach to prefix caching stage outputs is to build on vLLM's prefix caching in the least invasive way possible while minimizing impact for cache misses, and consuming a minimal amount of GPU memory. To understand the implementation, there are a few important things to note: - -- Between stages, device tensors are generally moved to CPU; this is important since we're just caching the outputs of stages, so it is okay to keep the entire cache on the CPU. - -- For a tensor to be considered cacheable, the first dimension (currently) needs to be the same as the token count, as it allows us to reuse block/slot mappings for our externally maintained tensor caches. This allows us to dynamically discover the tensors to be marked as cacheable outputs in each Omni model without having to explicitly specify cacheable output field names in every model. - -With this in mind, consider the set of blocks in a 2D layout, where the row represents the index of blocks being considered, and the columns represent the slots corresponding to tokens within each block. Since we know the `num_blocks` and `block_size` from our kv cache config, if we want to cache a tensor with feature size `D`, we can preallocate a CPU tensor of size `(num_blocks, block_size, D)`, and use the same block index and slot mapping to retrieve the corresponding feature vector. - - -### Example -!!! note "Note 3" - Prefix caching in vLLM-Omni currently is only supported on AutoRegressive stages with one kv-cache group. It can be enabled/disabled per-stage via the `enable_prefix_caching` parameter in the model's stage config. - -The way in which vLLM-Omni ties into vLLM's prefix caching is best understood by example. Say that we have the following: - -- `num_blocks=8` -- `block_size=4` -- `hidden_size=2` -- A stage specific multimodal output tensor named `mm_feature` with feature dimension `16` - -The prefix cache flow is then outlined below. - -1. When the model is initialized, we can determine the `hidden_size` from the `ModelConfig`, and allocate a cache of size `(num_blocks, block_size, hidden_size)`. - -2. Say we process the request `The quick brown fox was tired and slept beneath the shady tree`, which is 12 tokens and evenly divides into 3 blocks as shown below. - -``` - [ The quick brown fox ] [ was tired and slept ] [beneath the shady tree ] -Block 1: |<--- block tokens ---->| -Block 2: |<------- prefix ------>| |<--- block tokens --->| -Block 3: |<------------------ prefix -------------------->| |<--- block tokens ---->| -``` - -When the request processes, we inspect the multimodal outputs and identify the `mm_feature` tensor, which will be of shape `(seq_len, feature_dim)`, i.e., `(12, 16)` in this example. We note that the first axis is dependent on the `seq_len` and add a new cache_tensor of shape `(num_blocks, block_size, feature_dim)` to our multimodal cache for tensors. - - -3. If we lay out the cache as a 2D tensor of shape (`num_blocks`, `block_size`), we'll have something like the following: - -``` -0: [ The quick brown fox ] -1: [ was tired and slept ] -2: [beneath the shady tree ] -3: [EMPTY] -... -7: [EMPTY] -``` - -Or, if we flatten it down to 1D, -``` -0: The -1: quick -2: brown -3: fox -... -11: tree -12: [EMPTY] -... -``` - -which we can think of as row indices into the hidden states tensor if we view it as the 2D shape `(num_blocks x block_size, feature_dim)`. That is, the analogous flattened (from 3D -> 2D) mapping of the cache for hidden states becomes the following. -``` -0: -1: -2: -3: -... -11: -12: [EMPTY] -... -``` - -Similarly, for the multimodal outputs cache, the flattened coordinates are the same, but the `mm_feature` maps to vectors of length `16` instead of the hidden size of `2`. Note that in practice, we may have multiple multimodal output tensors per forward pass, which may have different names and different feature dimensions. - - -4. Now, say that we receive a new request `The quick brown fox jumped over the dog`. - -``` - [ The quick brown fox ] [ jumped over the dog ] -Block 1: |<--- block tokens ---->| -Block 2: |<------- prefix ------>| |<--- block tokens --->| -``` - -Here, we will have a cache hit for `Block 1` which will be detected by vLLM based on the hash of the first block when it's handling the prefix caching on the kv-cache. As a result, when we get the output from the scheduler, we will see that `num_computed_tokens=4` (corresponding to the cached first block), and we only need to process the remaining 4 new tokens in the new prefill. - -Since we have the block indices / slot mappings from the kv cache manager, we can simply mirror the mappings and leverage the same indices for the cached hidden states and multimodal outputs. This allows us to look up the correct tensors from our externally maintained 3D caches. - -``` -0: [ The quick brown fox ] < already in the cache -1: [ was tired and slept ] -2: [beneath the shady tree ] -3: [ jumped over the dog ] < added on the second request -4: [EMPTY] -... -7: [EMPTY] -... -``` - -Finally, to pass the full hidden states and multimodal outputs to the next stage, we simply concatenate the cached contents with the corresponding new tensors computed from the current forward call. - - -### What About Multimodal Inputs? -It's also useful to consider the case about how Omni prefix caching is handled when we have multimodal inputs that don't cleanly end on block boundaries, as well as how this works with multimodal encoder caching in vLLM. For example: - -``` - [ Im0 Im1 Im2 Im3 ] [ Im4 Im5 foo ] -Block 1: |<--- block tokens ---->| -Block 2: |<------- prefix ------>| |<--- block tokens --->| -``` - -In this case, only `Block 1` will have outputs stored in the prefix tensor cache, because vLLM does not store partial blocks. This may appear to be a problem at first glance, because the multimodal input is fragmented across a new block that wasn't cached. - -In reality, this isn't a big problem for correctness, because vLLM also maintains an encoder cache for multimodal inputs. In other words, after the first pass, we'll have the following: - -- The Block 1 hash, which is used for prefix caching -- The hash describing the image data starting at position 0 and with length 6 -- In vLLM's encoder cache, a mapping from the image hash above to the encoder output - - -To understand what happens, say we get the following input as a second request: -``` - [ Im0 Im1 Im2 Im3 ] [ Im4 Im5 bar baz ] -Block 1: |<--- block tokens ---->| -Block 2: |<------- prefix ------>| |<--- block tokens --->| -``` - -First, the scheduler will check for a prefix cache hit, which we will see on `Block 1`. As a result, we will have 4 tokens marked as precomputed, and only see the remaining 4 tokens in the following prefill. - -Because we have multimodal data in a scheduled span that isn't fully precomputed, we still need to call the visual encoder. However, since we have the image hash and encoder cache, we will retrieve the encoder outputs for `Im4` and `Im5` as we create the multimodal embeddings. - -When we pass our multimodal tensors to the language model component in the same stage, we'll then expect the same outputs, because the prefix caching behaviors in vLLM-Omni / vLLM match, so the LLM will use vLLM's KV cache manager's prefix caching to correctly handle the attention information for `Block 1` while calculating the outputs for `Block 2`, giving us the correct results for processing `Block 2` with the context of `Block 1`. - -Finally, we look up the output hidden states/multimodal tensors corresponding to the prefix cache hit `Block 1` and concatenate it with the forward pass result to get the final result, which is expected to be identical to the full hidden states when prefix caching is disabled. diff --git a/docs/design/feature/ray_based_execution.md b/docs/design/feature/ray_based_execution.md deleted file mode 100644 index ae10d661fd6..00000000000 --- a/docs/design/feature/ray_based_execution.md +++ /dev/null @@ -1,59 +0,0 @@ -# Distributed utils - -This directory (vllm_omni/distributed/ray_utils) contains utilities for distributed execution in vllm-omni, supporting both **Ray** and **Multiprocessing** backends. -## 1. Installation -```bash -pip install "ray[default]" -``` -## 2. Ray Utils - -The `ray_utils` module provides helper functions for managing Ray clusters and actors, which is essential for: -* **Multi-node deployment**: Running pipeline stages across different physical machines. -* **Resource management**: Efficient GPU/CPU allocation. - -### 2.1 Basic Usage - -To use the Ray backend, specify `worker_backend="ray"` when initializing the engine. - -**Command Line Example:** -```bash -vllm serve Qwen/Qwen2.5-Omni-7B \ - --omni \ - --port 8091 \ - --worker-backend ray \ - --ray-address auto -``` - -### 2.2 Cluster Setup - -**Step 1: Start Head Node** -Run this on your primary machine: -```bash -ray start --head --port=6399 -``` - -**Step 2: Connect Worker Nodes** -Run this on each worker machine: -```bash -ray start --address=:6399 -``` - -> **Tip**: For a complete cluster setup script, refer to the vLLM example: -> [run_cluster.sh](https://github.com/vllm-project/vllm/blob/main/examples/online_serving/run_cluster.sh) - -### 2.3 Distributed Connector Support - -When running on Ray, the system automatically adapts its communication strategy: - -* **Cross-Node**: Recommended to use `MooncakeTransferEngineConnector` (RDMA, fastest) or `MooncakeStoreConnector` (TCP fallback). -* **Same-Node**: Can still use `SharedMemoryConnector` for efficiency, or Ray's native object store (plasma). -* **SHM threshold default differs**: when `worker_backend="ray"`, the SharedMemoryConnector default threshold is set to `sys.maxsize`, which forces payloads to go inline (no SHM). Override `shm_threshold_bytes` in the connector config if you want SHM for Ray runs. - -### 2.4 Internal Helpers - -* **`initialize_ray_cluster`**: Connects to an existing Ray cluster or starts a local one. - -## 3. Troubleshooting - -* **Connection Issues**: Ensure the Ray head node is accessible and ports (default 6399 in this example) are open. -* **Version Mismatch**: Ensure all nodes run the same version of Ray and Python. diff --git a/docs/design/feature/sequence_parallel.md b/docs/design/feature/sequence_parallel.md deleted file mode 100644 index d0328bcf611..00000000000 --- a/docs/design/feature/sequence_parallel.md +++ /dev/null @@ -1,531 +0,0 @@ -# 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) -- [UAA Mode (Experimental)](#uaa-mode-experimental) -- [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 | - ---- - -## UAA Mode (Experimental) - -`ulysses_mode="advanced_uaa"` enables the experimental UAA ("Ulysses Anything Attention") feature, which lets Ulysses attention handle arbitrary sequence lengths and arbitrary attention head counts. The same idea is also supported by [Cache-DiT](https://cache-dit.readthedocs.io/en/latest/user_guide/CONTEXT_PARALLEL/#uaa-ulysses-anything-attention). - -Use it when plain Ulysses-SP would otherwise fail because: - -- the local sequence shards are not evenly divisible after split hooks, or -- the attention head count is not divisible by `ulysses_degree`. - -### Design Summary - -1. **Strict mode stays unchanged.** - `ulysses_mode="strict"` keeps the original fast path and still requires divisible sequence/head shapes. - -2. **UAA uses variable all-to-all split sizes for sequence shards.** - Before the Ulysses Q/K/V exchange, each rank all-gathers its local sequence length and uses those lengths as `all_to_all_single(..., output_split_sizes=seq_lens)`. This lets Ulysses gather the full sequence even when each rank started with a different local shard length. - -3. **UAA pads heads only inside the Ulysses exchange.** - If `head_cnt % ulysses_degree != 0`, UAA pads the head dimension up to the next multiple of `ulysses_degree`, performs the forward/reverse all-to-all, then slices the temporary head padding away after the reverse exchange. The same rule is applied to joint attention tensors. - -4. **Hybrid Ulysses + Ring is still shape-constrained.** - Ring attention expects every rank in a ring group to exchange exactly the same post-Ulysses sequence shape. UAA therefore validates those shapes before entering the ring path and raises a clear error if ring peers disagree on `S_global`. - -5. **Tiny scalar gathers stay out of TorchDynamo tracing.** - `_all_gather_int()` is marked with `@torch.compiler.disable` so the scalar `item()` conversions used by UAA metadata collection do not get traced into `torch.compile`. - -### UAA vs `auto_pad` - -- `auto_pad=True` pads sequence tokens in `_sp_plan` and requires attention backends that support `attention_mask`. -- `advanced_uaa` does not depend on mask-based token padding inside Ulysses attention. It is therefore a better fit for non-divisible head counts and uneven Ulysses shard sizes. -- `auto_pad=True` remains incompatible with Ring attention because the ring backend does not consume `attention_mask`. -- `advanced_uaa` is still experimental and hybrid mode remains limited by Ring's equal-shape requirement. - ---- - -## 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 - -This is the ideal approach for integrating sequence parallelism into new models, as it is easier to maintain and ensure compatibility with other types of acceleration. - -**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), - } -``` - -**Pattern 3: Shard RoPE for Dual Stream Attention** -In some cases, different streams in attention may need to handle sequence parallelism differently. For example, we may want to shard the image embeddings, while replicating the text embeddings to correctly configure joint attention. - -```python -class DualStreamTransformer(nn.Module): - """ - Dual-stream model where we need to replicate the text components, but shard - the image components to correctly handle sequence parallelism. - """ - _sp_plan = { - # In this case, the rope_preparer returns a tuple of len 4, where the - # first 2 items correspond to the text, and the second 2 correspond to - # visual inputs, so we only shard the second. - "rope_preparer": { - # Outputs 0, 1 (text) - NOT sharded (replicated) - # Outputs 2, 3 (image) - sharded - 2: SequenceParallelInput(split_dim=0, expected_dims=2, split_output=True), # img_cos - 3: SequenceParallelInput(split_dim=0, expected_dims=2, split_output=True), # img_sin - }, - # Shard transformer block INPUT - "transformer_blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3), - }, - # Gather at output - "proj_out": SequenceParallelOutput(gather_dim=1, expected_dims=3), - } -``` - -NOTE: be careful to test adequately when refactoring classes that take this style of plan, as changing the order of the return values will break sequence parallelism. - -### 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:** strict Ulysses sequence parallel requires divisible shapes. If the shard length is uneven, or if the model head count is not divisible by `ulysses_degree`, the strict path will raise an error. - -**Solutions:** - -1. Use `ulysses_mode="advanced_uaa"` for Ulysses-SP when you want the experimental uneven-shape path without relying on attention-mask padding. -2. If the model already uses `_sp_plan` token padding and the attention backend supports `attention_mask`, set `auto_pad=True` and add attention-mask plumbing. - -> **Experimental Feature:** `ulysses_mode="advanced_uaa"` is experimental. It is intended to relax Ulysses divisibility constraints, but hybrid Ulysses + Ring still requires equal post-Ulysses sequence lengths inside each ring group. - -> **Experimental Feature:** `auto_pad=True` is an experimental feature and may be changed in the future. We plan to improve this solution to involve minimal changes to model files. More details are [here](https://github.com/vllm-project/vllm-omni/issues/1324). - -**Constraints of auto_pad:** - -| Constraint | Description | -|------------|-------------| -| **Attention Backend Compatibility** | The attention backends must support `attention_mask`. Currently only `TORCH_SDPA` and `FLASH_ATTN` (default for diffusion models) are supported. | -| **Ring Attention Limitation** | Ring attention does not support `attention_mask`. Therefore, when using `auto_pad=True`, the combination of Ulysses + Ring attention is not feasible. | - -1. Enable `auto_pad=True` for all sequence-dimension inputs in `_sp_plan`: -```python -_sp_plan = { - "rope": { - 0: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True, auto_pad=True), - 1: SequenceParallelInput(split_dim=1, expected_dims=4, split_output=True, auto_pad=True), - }, - "blocks.0": { - "hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3, auto_pad=True) - }, - ... -} -``` - -2. Create attention mask dynamically when padding is applied: -```python -from vllm_omni.diffusion.forward_context import get_forward_context -from vllm_omni.diffusion.attention.backends.abstract import AttentionMetadata - -# In model forward(), before transformer blocks: -hidden_states_mask = None -ctx = get_forward_context() -if ctx.sp_original_seq_len is not None and ctx.sp_padding_size > 0: - batch_size = hidden_states.shape[0] - padded_seq_len = ctx.sp_original_seq_len + ctx.sp_padding_size - hidden_states_mask = torch.ones(batch_size, padded_seq_len, dtype=torch.bool, device=hidden_states.device) - hidden_states_mask[:, ctx.sp_original_seq_len:] = False - -# Pass mask to attention layers -attn_metadata = AttentionMetadata(attn_mask=hidden_states_mask) if hidden_states_mask is not None else None -output = self.attn(query, key, value, attn_metadata) -``` - -**Important Quality Considerations:** - -While `auto_pad` enables generation for irregular resolutions, be aware of potential quality impacts: - -| Aspect | Impact | -|--------|--------| -| **Training Distribution** | Models perform best on aspect ratios seen during training (e.g., 1:1, 16:9, 4:3). Unusual ratios like 700x400 (1.75:1) may produce lower quality results. | -| **Padding Overhead** | Padded positions consume compute even when masked. For best efficiency, prefer resolutions divisible by `sp_size`. | - -**Recommendations for users:** -- Use standard aspect ratios when possible (e.g., 768x432 for 16:9 instead of 700x400) -- Ensure post-patch dimensions are divisible by `sp_size` for optimal quality -- Test generation quality when using unusual resolutions - -### 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 | -|-------|------|---------|-------| -| **LongCat** | `vllm_omni/diffusion/models/longcat_image/longcat_image_transformer.py` | Dual-stream | Text components replicated, image components sharded | -| **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? And which module boundaries need to be moved to facilitate this? -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/design/feature/teacache.md b/docs/design/feature/teacache.md deleted file mode 100644 index 8577cff1f05..00000000000 --- a/docs/design/feature/teacache.md +++ /dev/null @@ -1,491 +0,0 @@ -# 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}") -``` - -Note: some models may require the vLLM context and config to be initialized to initialize vLLM modules. To this end, you may need a workaround like the following to be able to run coefficient estimation. -```python -from vllm_omni.diffusion.forward_context import set_forward_context -from vllm_omni.diffusion.distributed.parallel_state import ( - init_distributed_environment, - initialize_model_parallel, -) -from vllm.config import VllmConfig -... - -if __name__ == "__main__": - os.environ["MASTER_ADDR"] = "localhost" - os.environ["MASTER_PORT"] = "8192" - os.environ["LOCAL_RANK"] = "0" - os.environ["RANK"] = "0" - os.environ["WORLD_SIZE"] = "1" - - vllm_config = VllmConfig() - init_distributed_environment() - initialize_model_parallel() - - # NOTE: you may have to pass an initialized OmniDiffusionConfig as a kwarg - # here to make current sp checks happy; if this is the case, just create one - # .from_kwargs() with the model name to get around this check for now, - # since your estimator subclass should handle the actual model configuration. - # - # This will be cleaned up in the future - with set_forward_context(vllm_config): - -``` - - -**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/cache_acceleration/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/design/feature/tensor_parallel.md b/docs/design/feature/tensor_parallel.md deleted file mode 100644 index bcafde7e73a..00000000000 --- a/docs/design/feature/tensor_parallel.md +++ /dev/null @@ -1,279 +0,0 @@ -# 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_parallelism.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/design/feature/vae_parallel.md b/docs/design/feature/vae_parallel.md deleted file mode 100644 index e330b41a68f..00000000000 --- a/docs/design/feature/vae_parallel.md +++ /dev/null @@ -1,459 +0,0 @@ -# VAE Patch Parallelism - -This document describes how to add **VAE Patch Parallelism** support to a diffusion model. -We use **Qwen-Image** as the reference implementation for decode parallel, and **Wan2.2** for encode parallel. - ---- - -## Table of Contents - -- [Overview](#overview) -- [Step-by-Step Implementation (Decode)](#step-by-step-implementation-decode) -- [Encode Parallel Implementation](#encode-parallel-implementation) -- [Testing](#testing) -- [Reference Implementations](#reference-implementations) -- [Summary](#summary) - ---- - -## Overview - -### What is Vae Patch parallel? - -**VAE Patch Parallelism** is an acceleration technique for both **encoding** and **decoding**. Instead of processing the entire tensor at once, the tensor is: - -+ Split into multiple spatial tiles - -+ Distributed across multiple ranks - -+ Encoded/Decoded in parallel - -+ Merged to reconstruct the final output - -This approach: - -+ Distributes computation across multiple devices - -+ Reduces peak memory usage per device - -+ Accelerates encoding/decoding latency - -### When to Use Encode vs Decode Parallel - -| Operation | Use Case | Example | -|-----------|----------|---------| -| **Decode Parallel** | Text-to-Image, Text-to-Video | Latent → Image/Video | -| **Encode Parallel** | Image-to-Video (I2V) | Image → Latent (for conditioning) | - -### Architecture -We introduce **DistributedVaeExecutor** as the core component responsible for distributed VAE encoding/decoding. - -The executor is model-agnostic and accepts three function parameters: - -+ split – Partition the latent into tiles - -+ exec – Decode a single tile - -+ merge – Combine decoded tiles into the final output - -#### Execution Flow - -+ Call split(z) to generate a list of TileTask and a GridSpec - -+ Dispatch tasks across ranks using workload-based balancing - -+ Each rank executes exec(task) on its assigned tiles - -+ Gather decoded tile results to rank 0 - -+ Rank 0 performs merge(...) - -+ (Optional) Broadcast final result to all ranks - -This design separates: - -+ Distributed execution logic - -+ Model-specific tiling and merging logic - -#### Why split / exec / merge is necessary? - -The latent tensor cannot be arbitrarily partitioned. - -During decoding: - -+ Each output pixel may depend on neighboring pixels - -+ The receptive field is model-dependent - -Therefore: - -+ Tiles must include overlap - -+ Merge must perform blending to avoid seams - -## Step-by-Step Implementation (Decode) - -### Step 1: Implement DistributedAutoencoderKLQwenImage -`QwenImagePipeline` use `AutoencoderKLQwenImage` for vae, so implement a distributed version: - - -``` -class DistributedAutoencoderKLQwenImage(AutoencoderKLQwenImage, DistributedVaeMixin): - @classmethod - def from_pretrained(cls, *args: Any, **kwargs: Any): - model = super().from_pretrained(*args, **kwargs) - model.init_distributed() - return model -``` -**Key points**: -+ Inherit both AutoencoderKLQwenImage and DistributedVaeMixin -+ Call init_distributed() after loading weights - -### Step 2: Implement split/exec/merge -Reuse `AutoencoderKLQwenImage.tiled_decode` logic and divide it into three stages. And we need return tiles with `GridSpec` and `TileTask`: -``` -class GridSpec: - split_dims: tuple[int, ...] # Tensor dimensions being split (e.g., (2, 3) for (B, C, H, W)) - grid_shape: tuple[int, ...] # Tile grid layout (num_rows, num_cols) - tile_spec: dict = field(default_factory=dict) # Metadata required for merging - output_dtype: torch.dtype | None = None # Final output dtype -``` -``` -class TileTask: - tile_id: int # task id - grid_coord: tuple[int, ...] # Tile position in grid - tensor: torch.Tensor | list[torch.Tensor] # The tile tensor - workload: int | float = 1 # Used for load balancing (e.g., tile area) -``` -And tiled base split/exec/merge as follow: -``` -def tile_split(self, z: torch.Tensor) -> tuple[list[TileTask], GridSpec]: - # mostly copy from AutoencoderKL - _, _, num_frames, height, width = z.shape - sample_height = height * self.spatial_compression_ratio - sample_width = width * self.spatial_compression_ratio - - tile_latent_min_height = self.tile_sample_min_height // self.spatial_compression_ratio - tile_latent_min_width = self.tile_sample_min_width // self.spatial_compression_ratio - tile_latent_stride_height = self.tile_sample_stride_height // self.spatial_compression_ratio - tile_latent_stride_width = self.tile_sample_stride_width // self.spatial_compression_ratio - - blend_height = self.tile_sample_min_height - self.tile_sample_stride_height - blend_width = self.tile_sample_min_width - self.tile_sample_stride_width - - # Split z into overlapping tiles and decode them separately. - # The tiles have an overlap to avoid seams between tiles. - tiletask_list = [] - for i in range(0, height, tile_latent_stride_height): - for j in range(0, width, tile_latent_stride_width): - time_list = [] - for k in range(num_frames): - self._conv_idx = [0] - tile = z[:, :, k : k + 1, i : i + tile_latent_min_height, j : j + tile_latent_min_width] - time_list.append(tile) - tiletask_list.append( - TileTask( - len(tiletask_list), - (i // tile_latent_stride_height, j // tile_latent_stride_width), - time_list, - workload=time_list[0].shape[3] * time_list[0].shape[4], - ) - ) - tile_spec = { - "sample_height": sample_height, - "sample_width": sample_width, - "blend_height": blend_height, - "blend_width": blend_width, - } - grid_spec = GridSpec( - split_dims=(3, 4), - grid_shape=(tiletask_list[-1].grid_coord[0] + 1, tiletask_list[-1].grid_coord[1] + 1), - tile_spec=tile_spec, - output_dtype=self.dtype, - ) - return tiletask_list, grid_spec - -def tile_exec(self, task: TileTask) -> torch.Tensor: - """Decode a single latent tile into RGB space.""" - self.clear_cache() - time = [] - for k in range(len(task.tensor)): - self._conv_idx = [0] - tile = self.post_quant_conv(task.tensor[k]) - decoded = self.decoder(tile, feat_cache=self._feat_map, feat_idx=self._conv_idx) - time.append(decoded) - result = torch.cat(time, dim=2) - return result - -def tile_merge(self, coord_tensor_map: dict[tuple[int, ...], torch.Tensor], grid_spec: GridSpec) -> torch.Tensor: - """Merge decoded tiles into a full image.""" - grid_h, grid_w = grid_spec.grid_shape - result_rows = [] - self.clear_cache() - - result_rows = [] - for i in range(grid_h): - result_row = [] - for j in range(grid_w): - tile = coord_tensor_map[(i, j)] - if i > 0: - tile = self.blend_v(coord_tensor_map[(i - 1, j)], tile, grid_spec.tile_spec["blend_height"]) - if j > 0: - tile = self.blend_h(coord_tensor_map[(i, j - 1)], tile, grid_spec.tile_spec["blend_width"]) - result_row.append(tile[:, :, :, : self.tile_sample_stride_height, : self.tile_sample_stride_width]) - result_rows.append(torch.cat(result_row, dim=-1)) - dec = torch.cat(result_rows, dim=3)[ - :, :, :, : grid_spec.tile_spec["sample_height"], : grid_spec.tile_spec["sample_width"] - ] - return dec -``` - -### Step 3: Override tiled_decode -We need to override tiled_decode, the main logic is: -+ check distributed is enabled -+ select split/exec/merge -+ Invoke self.distributed_executor.execute to decode -``` -def tiled_decode(self, z: torch.Tensor, return_dict: bool = True): - if not self.is_distributed_enabled(): - return super().tiled_decode(z, return_dict=return_dict) - - logger.info("Decode run with distributed executor") - result = self.distributed_executor.execute( - z, - DistributedOperator(split=self.tile_split, exec=self.tile_exec, merge=self.tile_merge), - broadcast_result=True, - ) - if not return_dict: - return (result,) - - return DecoderOutput(sample=result) -``` -`broadcast_result` is set to True or False depending on the model; when enabled, the result will be used even on ranks other than 0. - -### Step 4: Modify Pipeline -Change vae model from AutoencoderKLQwenImage to DistributedAutoencoderKLQwenImage -``` -class YourModelPipeline(nn.Module): - def __init__( - self, - *, - od_config: OmniDiffusionConfig, - prefix: str = "", - ): - super().__init__() - ... -- self.vae = AutoencoderKL.from_pretrained( -- model, subfolder="vae", local_files_only=local_files_only).to(self.device) -+ self.vae = DistributedAutoencoderKL.from_pretrained( -+ model, subfolder="vae", local_files_only=local_files_only -+ ).to(self.device) -``` - -## Encode Parallel Implementation - -For models that require VAE encoding (e.g., Image-to-Video), you can also parallelize the encode operation. We use **Wan2.2** as the reference implementation. - -### Step 1: Implement encode_tile_split - -Similar to decode, split the input tensor into tiles. Key considerations: - -+ **Patchify handling**: If the model uses `patch_size`, scale tile parameters accordingly -+ **Temporal chunking**: Video VAEs may have temporal compression (e.g., 4x) - -```python -def encode_tile_split(self, x: torch.Tensor) -> tuple[list[TileTask], GridSpec]: - _, _, num_frames, height, width = x.shape - encode_spatial_compression_ratio = self.spatial_compression_ratio - - # Scale tile parameters for patchified coordinate system - tile_sample_min_height = self.tile_sample_min_height - tile_sample_min_width = self.tile_sample_min_width - tile_sample_stride_height = self.tile_sample_stride_height - tile_sample_stride_width = self.tile_sample_stride_width - - if self.config.patch_size is not None: - # When input is patchified, scale tile parameters accordingly - encode_spatial_compression_ratio = self.spatial_compression_ratio // self.config.patch_size - tile_sample_min_height = tile_sample_min_height // self.config.patch_size - tile_sample_min_width = tile_sample_min_width // self.config.patch_size - tile_sample_stride_height = tile_sample_stride_height // self.config.patch_size - tile_sample_stride_width = tile_sample_stride_width // self.config.patch_size - - latent_height = height // encode_spatial_compression_ratio - latent_width = width // encode_spatial_compression_ratio - - tile_latent_min_height = tile_sample_min_height // encode_spatial_compression_ratio - tile_latent_min_width = tile_sample_min_width // encode_spatial_compression_ratio - tile_latent_stride_height = tile_sample_stride_height // encode_spatial_compression_ratio - tile_latent_stride_width = tile_sample_stride_width // encode_spatial_compression_ratio - - blend_height = tile_latent_min_height - tile_latent_stride_height - blend_width = tile_latent_min_width - tile_latent_stride_width - - tiletask_list = [] - # Use temporal compression ratio from config instead of hardcoding - temporal_compression = self.config.scale_factor_temporal - - for i in range(0, height, tile_sample_stride_height): - for j in range(0, width, tile_sample_stride_width): - time_list = [] - frame_range = 1 + (num_frames - 1) // temporal_compression - for k in range(frame_range): - if k == 0: - tile = x[:, :, :1, i : i + tile_sample_min_height, j : j + tile_sample_min_width] - else: - tile = x[ - :, :, - 1 + temporal_compression * (k - 1) : 1 + temporal_compression * k, - i : i + tile_sample_min_height, - j : j + tile_sample_min_width, - ] - time_list.append(tile) - tiletask_list.append( - TileTask(len(tiletask_list), (i // tile_sample_stride_height, j // tile_sample_stride_width), - time_list, workload=time_list[0].shape[3] * time_list[0].shape[4]) - ) - - grid_spec = GridSpec( - split_dims=(3, 4), - grid_shape=(tiletask_list[-1].grid_coord[0] + 1, tiletask_list[-1].grid_coord[1] + 1), - tile_spec={ - "latent_height": latent_height, "latent_width": latent_width, - "blend_height": blend_height, "blend_width": blend_width, - "tile_latent_stride_height": tile_latent_stride_height, - "tile_latent_stride_width": tile_latent_stride_width, - }, - output_dtype=self.dtype, - ) - return tiletask_list, grid_spec -``` - -### Step 2: Implement encode_tile_exec - -```python -def encode_tile_exec(self, task: TileTask) -> torch.Tensor: - """Encode a single sample tile into latent space.""" - self.clear_cache() - time = [] - for k, tile in enumerate(task.tensor): - self._enc_conv_idx = [0] - encoded = self.encoder(tile, feat_cache=self._enc_feat_map, feat_idx=self._enc_conv_idx) - encoded = self.quant_conv(encoded) - time.append(encoded) - result = torch.cat(time, dim=2) - self.clear_cache() - return result -``` - -### Step 3: Implement encode_tile_merge - -```python -def encode_tile_merge( - self, coord_tensor_map: dict[tuple[int, ...], torch.Tensor], grid_spec: GridSpec -) -> torch.Tensor: - """Merge encoded tiles into a full latent tensor.""" - grid_h, grid_w = grid_spec.grid_shape - result_rows = [] - for i in range(grid_h): - result_row = [] - for j in range(grid_w): - tile = coord_tensor_map[(i, j)] - if i > 0: - tile = self.blend_v(coord_tensor_map[(i - 1, j)], tile, grid_spec.tile_spec["blend_height"]) - if j > 0: - tile = self.blend_h(coord_tensor_map[(i, j - 1)], tile, grid_spec.tile_spec["blend_width"]) - result_row.append(tile[:, :, :, - : grid_spec.tile_spec["tile_latent_stride_height"], - : grid_spec.tile_spec["tile_latent_stride_width"]]) - result_rows.append(torch.cat(result_row, dim=-1)) - - enc = torch.cat(result_rows, dim=3)[ - :, :, :, : grid_spec.tile_spec["latent_height"], : grid_spec.tile_spec["latent_width"] - ] - return enc -``` - -### Step 4: Override tiled_encode method - -Override `tiled_encode` instead of `encode`. The parent's `_encode()` handles patchify before calling `tiled_encode()`, so input `x` is already patchified. - -```python -def tiled_encode(self, x: torch.Tensor) -> torch.Tensor: - """ - Encode using distributed VAE executor. - - Note: x is already patchified by parent's _encode() before calling this method. - """ - if not self.is_distributed_enabled(): - return super().tiled_encode(x) - - self.clear_cache() - result = self.distributed_executor.execute( - x, - DistributedOperator( - split=self.encode_tile_split, - exec=self.encode_tile_exec, - merge=self.encode_tile_merge, - ), - broadcast_result=True, # Latents needed by all ranks for diffusion - ) - self.clear_cache() - return result -``` - -**Key differences from decode parallel:** - -| Aspect | Decode Parallel | Encode Parallel | -|--------|-----------------|-----------------| -| `broadcast_result` | Often `False` (only rank 0 needs output) | `True` (all ranks need latents for diffusion) | -| Patchify | Applied in merge (unpatchify) | Handled by parent `_encode()` before `tiled_encode()` | -| Temporal chunking | Frame-by-frame | Chunk-based (e.g., 1 + 4n frames) | - -## Testing -Verify numerical consistency between: -+ vae_patch_parallel_size = 1 - -+ vae_patch_parallel_size = N - -Example: -torch.allclose(output_1, output_n, atol=1e-5) - -Testing requirements: -+ Fix random seed -+ Use identical tiling strategy - -```python -m = Omni( - model=model_name, - vae_use_tiling=True, - parallel_config=DiffusionParallelConfig( - tensor_parallel_size=2, - vae_patch_parallel_size=1, # or 2 - ), - ) -``` -When vae_patch_parallel_size is larger than the DiT world size, it will automatically fall back to using the DiT world size instead. - -## Reference Implementations - -Complete examples in the codebase: - -| Model | Path | Decode Parallel | Encode Parallel | -|-------|------|-----------------|-----------------| -| **Z-Image** | `vllm_omni/diffusion/distributed/autoencoders/autoencoder_kl.py` | ✅ | ❌ | -| **Wan2.2** | `vllm_omni/diffusion/distributed/autoencoders/autoencoder_kl_wan.py` | ✅ | ✅ | -| **Qwen-Image** | `vllm_omni/diffusion/distributed/autoencoders/autoencoder_kl_qwenimage.py` | ✅ | ❌ | - ---- - -## Summary - -Adding VAE Patch Parallel support to diffusion model: - -1. **Implement Distributed VAE** - Inherit from base VAE class and `DistributedVaeMixin` -2. **Decode Parallel** - Refactor `tiled_decode` into `tile_split`/`tile_exec`/`tile_merge` -3. **Encode Parallel** (optional) - Implement `encode_tile_split`/`encode_tile_exec`/`encode_tile_merge` for I2V models -4. **Change VAE model in pipeline** - Use the distributed version -5. **Test** - Verify numerical consistency with `vae_patch_parallel_size=1` vs `N` diff --git a/docs/design/figures/omni/E2EL_s_vllm_omni_vs_transformers.png b/docs/design/figures/omni/E2EL_s_vllm_omni_vs_transformers.png deleted file mode 100644 index 15112d5862ae56719f3b2a56852a4c9cb9dc0160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63871 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ཿR$V!4PiQ%C>F%4&QQ` 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 P65k@?^2M_fT>z^&Bs_UekKv}}g_%i<&e%9! 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 lcmMCdjsNH87IL?< diff --git a/docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Baseline_vs_Batch.png b/docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Baseline_vs_Batch.png deleted file mode 100644 index 24be814b7e98c8d565d9124e10469cc8fa1a0e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99062 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 z 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

AM<$U&>v05mJ5)C9>{ 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 diff --git a/docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Batch_vs_Batch_CUDA_Graph.png b/docs/design/figures/omni/Mean_AUDIO_TTFP_ms_Batch_vs_Batch_CUDA_Graph.png deleted file mode 100644 index 2d1a04e9c2cf7f061b9391f27d069954561fcab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122692 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"os7b6vlb!)fN%d4`8^|MX6?`Po_h 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 diff --git a/docs/design/figures/omni/Mean_E2EL_ms_Batch_CUDA_Graph_vs_Async_Chunk.png b/docs/design/figures/omni/Mean_E2EL_ms_Batch_CUDA_Graph_vs_Async_Chunk.png deleted file mode 100644 index 54452013eb4a2bfe237ad1cbb14e9b5783c6bd4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128096 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 d{LRQQx>2LtrpE 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

)~sSM(lbNj+=l{#k+ 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

gCO^^7fO}5SSo%C(SRlu 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 P_)Yf{UH9E2_@?~>R+}eJ diff --git a/docs/design/figures/omni/RTF_vllm_omni_vs_transformers.png b/docs/design/figures/omni/RTF_vllm_omni_vs_transformers.png deleted file mode 100644 index d93ba0b2af5b250c7b73d16c31c34891bea00152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79240 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�<3E>&W&=eQH*5 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

V(S;uS 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 Y?ZTLlQ-tR!aA( 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

P+(f< z??2poyfDfWegzF=SV5{MP(S+87Azb_KF`HTJ>jjyDstm@T)Ie$>twMaFOvbX{W`p3 zA1^h}nwg`94+E-ZDb{9nj4$MeOK}_1h|b837OlAKXLOmGX@x6%S-Vf*s^|LTe=bbp z`O(|(7D)lqk8vYFkG`mP=7%EwzV(MhS%STITOk%t#rzbC{+pF+!M3Qm5loc9`a1%2 zHGvc2*h3@nX;iJKSr9Wuh*oaSo4*+y>oW}-V+Q__z5~5QyBU)eXm0_%+4B~>fw`M$a8z_+$ z6ZYaXXTtWx8P433+@>Lhih?CF=XHTb!VV47JNQ`)y!&MFGNnC(R`3QOCV`Rx(+ca! zGg0Iu(T+*LmObZl-lC17-zAX;o^q8h=gE=nk|&_{WIjVh%B+N}?VZ|sg*ri%(M3}( zmCL3?0L3U1F5PV-E<#<#>(Q0xi%KnqHEWYbAmGGCK9?0)Qj3$xr4_8VKBA4+AaWk=W3K%?9xnzJt-r9Wi-<{TMWM_ zip~Z(df9it^cJRJ^yreC$^Q=h&T!a+5;6COuxKwnqq^BsZ@Kp^GRWa^EW-s+Jc! z;!Lpz;e4EtV19t__U1q_WIM$7TW&%F(${x$Xag?CJP3}PH20&NCN0+*znQza=S-UZvV)fXd~IswaI}YBlQ9)JsHbsenG+H` zzr}8}X#uNLeN&T2SAq|SY#COr3yoI}=K3&+ExQla@@7~0x%G3pW^Xcoik`fFYqI=5 zz^gCPchd|+(;W*Yw;XLbzqrpteI896|KJzgxaGW4UY-0X&a%ID;pSelnc9_@WPeE1 z4U>mQD{~_p)`1CZRVANyY#uva7i4}x=-N1zw^U&$`7}R&KARf)(m&WJrxnzMGI@%A zbOZl-T-~b)H8DMA-0`^kJ%r}bkL>{N0r$_U41`dSO8VxYwDohpT)qTq>kF@97#EYU?JLT-jl)*|Jz2WS*Q2q}>S|O{(Czy|#Dj&z0uaX=fSN zs?a8Dp?8Gbp;p<+doljq?u{Q_HLiSr#u!&MHU6r7tR`+>Y)ygXNn4dfGXIXJ`*|B0 z|0}Nb3ek_gRo+VXQJG!sJsKQ?L2f1Y z%zt})_LZc=V!y@ulQq9bUPXPB85Jg!)e-!GD+t5lAFqoH?AhYp@vCatx6M>INeJ9_ zS#xWd9BtDzZF_g`jL_$_Er%p+%mb&u1%@Gv4wE;#6#mWpv>>$;4kCtsh!xrZ$1Nl>flgz3*L;qf5sF}t#$P& zeC5c*pE2m~37`H`MpeHo`f;8m{8ftX9^1LMo%Mazdb0`!Rdn0+Ekk{Tm&{eMl5gu= zxsj$hYJmeeTaL1*)INAt9?o-BymGfj9jk}Nr!zg|Ck9hu$v*{2n?s_E!g>p_hoL+En?Xuu z9pB_O+GRs8-|LY+t%TmPtpkSHEtd#B z{-XBUvDM<>GvRRa%Yly!!2MvR&d#Zw=chF1XG`W0*56X50J2%kC2@xR6+-FLi(ez> zfq7)YC5F(j{Wi|Rm79m`{wqzUcTav5KE3Z|WIVMrZ2ZW|t9P%Srp`vfEw#MC+-`9= z?y2DB(ayqHT?tp;c5(cdWby9wh1mu%LxTmI3bb3X(znwKvGIy1r3%qT33Ve&r0b@2 zew+FG^Vw~C6JvvqYpffb%~oz_Z;0;;EApxxGdreBMas$rEABlfmfVHk{Pnz2Rk)b* zG+jIQ-=p^`HNIr75d-F#KH^i;gz(m*mo*bYbNvIR z(>OFTO6LpzM4{k8T#C|2rja|dcJ7#h5h({JutAj0sBzNO$$xxY8flv3osx6?NN`}W zFxif6B473b_p)F?KGxVhd%`U>#(d_Q-TIFEqDTYJ_sIuwx}hJQdcLO%!~_$O2e&ze zth@D|Hqf5EAYILk7%S*qi|+3(=t>ew8cXhe5f&CbaJ)5Zp~AszW^TIY;PADzddIJI zdS1*wuEDvYth$8+!tcXQD4&#DR`|Mz3050B(!ZL%etaZVo>oP& zb$^p~)b@ktH<*`}vt$R+eih30GHuttQ-rzbNS#wld+N2J9arA+l&h+Bo~yih+GMhW z@!^UygF8kA^M#yC17~H3z^g(cAc+@ntUok|D2P-jQIu~GUyDyfJQq*c?VYYj@(%WF zdMJdvS8m*0Wl|#3s`k4UwxAg&8LTrPGcZ1xaULCi_k!1Y~f134Evx= zfnFjPIUu#hQY?$5Cyq|^5RQxioFk|-Ztmj()i}_cE(4jfO<=fXtgylHT(|-`l(Q4( z7{mk;akMha(8HPH`Ns4`Wt15CRXJjSOpc7Gq}S{qVLrNxS2d~*FwfKl*U(i7nqr?ol%O+b3XfsU=>ZWv&^n*u`~c zYk3<|F|1}>xDRPfFzVyhp!gZa?zJ;=gW6I=4e=yb9G7YX4Y$COx$7jJ#0%ibjN)bL z1{zC)%duj7|4?^dHnj~4;6O1-mk>-JvJ06BmD#lTJ0TcuJi5-vOhw8cHpbrotH;-{ z+m@Y{QVJpI3`~DGck+YC5gfgq%Dj0Xy~3A5^eIfgNWSIpXC*=4cVhze!@w|#w=QSU zQI-7%UMP)9S;%GSfgtk5k)*x^kfH9?6tN)9LIgQg2cRNz=p^HjiG_H==JS9@vXkE% zcH>3G8cRSrg@FjkZTrZgzGcMeUj-&fD__2b62D8d1K(GI4mic%w2xw?!*CWxQQ*6p znhQriwlJ7~Z4F{)?iT`p{?$Uf1UxyYxnA^}YriWSi-x)bGmyi!LB|R&+5Hm7a(pQp z9&I$DinFic++Nmt135MRYH$W5j?jrwhBFzXlA+)yzR;d@{QL#;Ji||^v3nNkXaU#n zC4=rX>R*H+_ry`}qF3!{&f)_NFyUbBx4^`j1aWdWq(7bv$EX~g)c1N8gC9pz-*p2P zdWjXw!l_$;Crrw`HLF+-27$l{Y$<8E8D9s!EkqK4oZ0jHnj2r#euCO%=*Q&r*L-a3gxodkjA-AGYxZcaOAt@KmyG1Xy-X>eFpgF!Lpmw7L;R6BZV7`KJqxcV(}_A z5sj+G-rD=JDYV|SO?+R#icREi8#inX zKn4<>K!PzpwB{twctlX~7U!5rt&;&<6#GbIkt+ymOvA7C9J(qrrTz{b0NqC=n=}|G zmN@DIU(O$c!lWqj=soiFj4C~F#-?=cMKI?@z;Qo6LIGwN)+!TTjc>~0F;wt_YvHN12_QtpF~K~jK1nL*kG61kp96S!^0(= zz2D90`Xy4m-msgaiYt5#Oe^k~m?ubotQHW+f9ptGHUS%-yi*z34&Fp{Yim2xBHt$8 z2CXJBcS5`r1y9M_NA$Tn^YYg@;sG!oSrECFy8>6nuf`l5f!M2u-o*>30HjuH9zIE_ z2Tp;tD*^Ag(5ZTnX*5L-r@u@o2&0f5AyLX$#@ zq9Y(}#uVu5EGkv4=4yT#S{~L0H35!ju&@ZZ`kJuOy*K9OxVw-Tkg)!aDB-@ zvg3~LRSHj497hor?29<#{Vljo&pDKo>=AS~CryUwmk`>Msk=CMJ>VU-7k~$V6qyH5 zsFa$fY`&=xZ6`7z-d5u+sZIDzAsv5?*!bk=bOtD24_}C7nJ_AeOcTwN+ipujW#oJS z#%uzsPSes2#3(V^$b{q#U|GHbQXnBv2X+qw=F|4Ja>JI`6124e+U{Xr`}l*YJAi~v zoQrQ!>x|`FgnC=bK8{b9r9U|qDsl`Yd^Onlmhup{0_MEHM=;YjC-TGIeU*byFxj7y zHE)`Z7%XQq9IMme6icW*!|p(Q+wZzufuoj`FpuW}iR-#Q zTCZ(D7hOgnkyeO%>h56@Am*8uz(jG=FR`7fj@;3 zwbcjCm}ZyYD+@m;>WAX(rrSh?>IPnTvylggwgG_gKpx1QaI*B3_?(j`c=b}JqCH_c zT0}hLoTKw#5d%C;&2b%cqZXPsP*dv?M6N>heYHaP75-v2sb(}|#e-UL|f7O2x9%kgu zlwVsz#!aOFW52yotFPKbOV{l(e%?P{GdoOKjKvx9w#UXpIy1N*K++w7zK;TLV+jIDO2F2cU=8_B2AQcz zavB6}pql?}yv|KYC|oCORLJ>35vCs>jY5!SKfp2;(u2D}qlh3}1L}&ReFP ze^#BJ=H^q1ys6>?=DC5S>!(Ff_Ao8SXyJE5A8#;Oh6h7H0R08(Lb35EK$=0}nmkK= zDePhv!rTgg-0Xs2^(96u`%ol*2b~%VGG?aq>JbWrQ1l0_{=E()>s&Tz(O#?pvx1zL zKvKZ&=QQLu;>k9`#@JuJ)VOrued!=Mi0#DCDw1FYz_2bS&v}C~ zfU)<002)mCUc86TT;1~W?%z_J(i^G&ItQJ$lK@P21A#Ql z_juC@*9>XvO+A-LaX!td)pTY_#M05v{1N8!grKRpuM^lX>k$N$5S-i2*}g=1VF98lvCnc=_H)}g5552gkyhjJ2+Lo0#tBh_}l|NZPa z1@J=;LCVn=y}$nux+m0LeB6@Q=G{2?$2(o=Rw9zuWvyF~IqmVu{-3V2<`;j>i5BPD zyI+|N_1#_K@ddbf_r79Gnrk-6WkXLl@Q^C@Pq8rD;`l9BYbhOGg^6q%#Ax97o@8N3 z^Tv-!hTQxBKmJJv-_{@M`a%6{WA{(}h5zg{bi@Vc`{p92uaHj*3xbOYmbTBsddp@@ zS7Nw&hZ7R0^XKs|79@GEbGau%|19*SlJ+0bJIzL!>7HF7#$ie@QcGu5OoGetN}sGBl_rgvsnTvaESP)B)_EhepTU3NL)7zOLqGU z=(m>=_V-l}K%+nX`(vWxcS~UpnlDF9qAb2XjeoN0B-mKd#m#0P%na2v4WFh?BELDf zvak-1p;~u5jHNV9R|GAD7L9EEG;p@1M;wu%p}*sUyhbEhG;oZH2!X@DnCo1ImLTiU zoW;_El*aiN%;iO2_nbRyTr7L5RM~bcs!gxtML3aDDODf5Tj$DTB-vjMm8&)K)ie|$ zr6YLAG-k!G`?-a9@8(B962f-LR8-PnaABzf2Hu41e>S{Fn_i#8R{g2NLmB?&_WqhC z`?J`u7CiTuJui6gKY(e~N`g6cEzsNk-(rt%C^z!;jwxq-qVm3!YS;D3apE-|h;@7v z{1ZmaeDxn7W^-A2Q(ObjsQ5}b^nvwaj@F8qw>V734VI6*$2eKeFn-q(| zbY=9PJVwv#v3B3Kki3=iPuoAFIM$dfAHI>ZVs^~C&Q&13SBd~+yI}E{2nqI#y<>_3 zQtK2coO-}{kN0N2fO0#5|6cWW6PD?yNWcT|Ff(U0Q}>LyV1-k)&&cv8&Z>XrteCLPvFaA~R4qxUZBI$`U*nsPbEuR4kk(0kz47D*WtT#;I?B=_^CKDnj@0mDGKzYd z3_{#l2OdZ%JRSp$qCwVX-iE;Te#R0=*aOu~Mvd$vvSAiQo~Z%(_WtPe1V02~HI(yDoPI zB&@`2(yhEV=TG79DoB^fSTJv%tC3z$X?h{#VNPYF3vVysX`J6mH`NO1eAqu%WnocR zidnVv91NzXm#Q~@6SDHs{g>%#Zual&u`KtZ7p&=o^tKGU7QG7TEQd)s8AFeD^W(;-&1tIhzHtu-Eeu|-EC_5 z-6Py|+c!Rqzvj7Yh0mW*_ez(a<|z)+863;gn&B2dnvGGTlpCzKcivB$SDXDJ_bKNal0$WMlaH?# z7vi4tT!prncl)~rx0cUdD;eb>W=od+5)5kJR3ek8Dw;;xoX6+XS(~y8=3Z8Ky=5d_ zhy0qIRiL^RW5Fc0BKy#~+bO?()WW<`;D=?Yu7P`6U7zA}yEDJ~9}-pkFF6|C{QbJT zP}`n+n^N9ftOkW?RliS9Cm)w<=d7(6OIvEKcV{*w z)mx!=_@RSC_v;$xzY1n~HCdWYHa1R>Rg69R*^Wcmwn)QNUE!UI{+D!7ngi8K z9(SbOxuTrU@O7;jZ&It=OoN}^vdFY}yx6uNW}@fe&ih?RdPi5{@2v;l>xpkYm?o|$ z84OD5cE>R6K8+bQ>-P$r3}Y|6zfN5 z?SYXgm&5wDr6*R(HSm~!)cX8@3sV3boc9B|uN13z_*?;gy7C&AXT%LhMO0_Z))P3* z_@SKhf2kKXs$v`HKXUlpY(N+Q+;za_ZqO6ppKw)vyXj_+!1l?@=xB|Y7)~Qpz`GGh zk6+@?a0En*_>2r8#!uTuZs9`0S9L5Z_$_gU8~7{c#ZYz<0X2_D#x>#r2Y^F3XD)!8 z=!)5UL#b@Z!vg}gDfO=GD28wdMkc2S1QO=bD{%x-+2%e;(g+Zz2@ zl_c^A3Q;cz*h7zUBaK`a&F+zb%z7w#S8mSe0J#3Wb2b37rRLq;4W4{?6N*y^hxlz$ zlPOqgN~Gx+*%A~%AdlezZEWz%t8)jj zRF#=qCLn|n0P3_JKNWl)Y)K2oSAV~3QWe^s;;x{85mgO$3_(!?La1iuOD4d?(q=M4 zA-%CXF0?SEUe1p>mrBfDEo=FF!s=L-MBdaaE+%^rzt#o52udlcN-}NT3kOl8S|pO| zzjvkxJJ|$Yt+}VL#G>B^dEUbs{o9;_T&OSvY>a-VeJ1z|iS!pTf^tF`G{RrF`HKg_ z5!%r%#zo08#wk#+(uPJ4TtZ^VkMOse-3be_pLPYp{z05UdW z2@2jcH^=MB<~Kkn8F!|j6Gi5q1X%pMmQDk0i4!;jX$dz32DJhG2!}z3z+rwkqbgtH z_oWox#GbyS`5`~{KpG|mp8@6V6v<@yZEy+*&;CSGHX%Xrhzi1xo%3-yoZ)9Hky1-B z18@fy42Mw4}8lG3g-yqBfa*hO5^@=~8^2}h@Kdp!uYKxV_d3FyPKFM`6yokgJgYaSPXKi)>ba}wO!rhS=-mPp@P zKn#acN()R{x05UQAV7>&w6jH*aN}@D&|}&$Iv+ES^#F+vV~tsjj92A{2WFT6t8VLsh&% z1ZOJ5vV{)=6rS({Iz&UY{00SW&hW}Zb{gbLNKmh0mV)MW7-IX7TVu)j(8_YNe#HH@ z?Vy`nO(TKPfD0y?r|kn12%LT<0RrZilahQMu#yLwh|sA6r!dX6#Y#}Pv~@A}_$xAW z6DXE2eB6T2eEY}@6`w;LJdhJ1(8NS76u>(Wq6&_d5y`0`Z-Ysy0D`I8einKbJ-k#t zJZ8Oc;N8cn;u!g%!#n}&0ESW_>Ph+(h92fw5Du}+FUNeeb>q6nO@oC9uKPd{1`Wpm zDU^N_Qpu2rdo)j&Sn_#PcGM8e)En$x9Nc->*9Jx{nvLNpEj9r~`YVf}%2-WFgxvx} zd(y!X&TcFVkm$7&*K+179W%IGf}nCv6_ zgS&N&J; zHEb9Rwwq;PN#6H?=0i9Yi#tg;TAg@CPs~z=0WwE{#W)&rY)d}=ig2jK!=sQiY^N$( zHe>8=U<{1ldOiV?v}>kL-`A2Fp{00vrN3}|ch;Wr<+`^^ZeO znhUzK!)oOzlIr_d2%2m1QHcyO+YSgJYLcN;1^K}+DWHGE&f#f% zeg`{Tx9%{Rl00+$k&vsf)b6@gyGd{Nl~Q1O^U@wPe%(G~F*G3oCi&ewVJkYu;_ZRV z*jo_`uNRV9bzcwfAGb+1t;kX0k34S;P~S2OU;W+i%|ipjqWryW`)tkM*B^dtFBa9B)^#^%ZN%fFcPOcAth~1GhktWpkk8Eg6J_x( zOj?Xf!uay8i<2SxIq{5|72#PLGJB@cwu^j~CO>_HTCX!q%WiHv#Z?ciwW?Hf#2;|R zJi_rc$+b}_!ukBs+iTZ9V#G=XYu)XzEDi_D2af&{&e;Np8>^;|q`TpS7kJ`vojdhOaO;7v_bgK52$xPplPE&Ck@j)0buZ>yS4JW`%vm-b;6X#6Qm`WhMJ5q*=MC zZMii*OfJtK*Z86Z^rTlXTP&z8hhMdhM(*Pv`o~!PZo*>3l5*bGb{L|dj?WP6F z7uOm%RE~uD%DZn>V&&uabs(|)Qn$(GzqaR7gS{Ab!bJnN{gBy_BPHx=D%5%%nxllpM(-;LJ>$fDq3Igu}T$6p-!;`KSX7 zg_)Hu2_XkXI5|l~(q!SEuoA?)((68OQN;K9XIkSC|1MRShe>7HSF(~Y-b?z|j6A-D zpmo{Yiyp9&erN*e=`73#qMj{J07XXt{rulv)C7f-HX-JSqJTvQ&}ur0KYD(DD+haHT;k9&q>F)=_@iC!SZ4kTVSzKW-wG;(Yv4`r14 zfq3acTI%>4B+tvba&U+2mW_eWg}1SjTh^Q4(LYrdwZpTbT1*V1l zQum@O$*G~tn-H*80EC>C+VzcbxIisIP7?a35BSQiqlomi)^dJvKxkBW>=e@eeUX`Q z7XKol7yl=so3h<{j2(CytxTis}x7M>T}b1!W-=rS;mjY51=&6ihGi9az=4k z@{q@VWf02yub1%Do*^80C1XLLSn|MnJHU9)d;gjr%2ze?Ni z)XYee_byj|cw+Q+;}N?yXz+xt?asaks=R3RHZe;qzo_+t&J?UMN31?WpYQ0!FA<{? zrH28(BZG9&ocG#Io%O125dH&{{Hd_CS?0PiUIiYbS8B023Viwq_{ntkWG7_@zU|~z zf4AV@y~o*hB6(FU*3QCZ)uzHK0*`Z@XN-gBGmQp}NH05<@R!k9h4;62pagbnm80Gi z8WkAQT2uCy)IlyBSF;aLs4T;T&7({{BGYm+yK(lzjk)^+=*I2WKN#jVkMErY&*EcO z$5X^Pik?^9m%U@?RMxY{9L|X9YC_*jQ+UA z1Gx72<&wc0CauUx?H*ny0zXJN^W^U5R{}tM)5*jk+s**K%stVj6GH_NL*k z#px4QT*;lw+{T}Ka{H~O8zlLdoxEY3w3XMu_nVO>Ybn2rMH~vBeG&VqZk}nM;i$Ia zPi>~}0WWVC%NdO7XF2~Pf+pXpI-Q%ez3Uf?Ds@}&g3si<=*~tp2||&Ur6NKpLEABE z{-Q2OFp)mR_ipV~kW8GP3gYdLiUARDCSS+X2VY{SH0-&A1zsb8EQMs?e>4wP>P>q9|a~Wq8 zBRm!1uGxs^Ed3*`Cwblxwl{kBM9G(;-_jOBWh2nXf*bY=lCEX2|f+7 zZT(6gbX}L%8e1lPekYF3Hk?kkhn%r&K49NI7J7=VN$N1D-!-SD_4;8p)9Co<-B-ja zP78zwQ)@&LHD3fRQG?%ARZX0%$-sbez>{s`(y&ed6u>l=ylp(^L`E+PqA#Kl_VEjo zYLJBOlPLlyK5A<^&CVhCYE+MLn2m&1fVe{E5^NSKf7LceIymcBj z+B|M!J39wMW&f*i0x$|KMj>Thw;tSwDVjM4|155e}8B&%6yc~CEi zTNqtmRb#rz_nEILn@6#Pl}yuq2rHWqCawj$E=FR4j4 zP*4RVD%nl*Iw%ZM>S3PMUh_tx#rSFTmXpXGRTK2a0DZp2*E!GVAL8zrqXrBZmhi#A z7zrwYrf2i>&LnWjT{NeW2(J@DVBU}x0pK#vz}Zb4rkQ&Tc*+oSz6lvLSwUGMC=QrN z1#|?2OMS$bMpUT{laxMpi~(*kk1$Z(g^Os5vUL9XnxuHn!%P*T z;lJvq#Fy!Zw4`jDG955!8`KAu9K5=59OO?zB&HT8asFvyiJ_Pk<`1!z>;HYIY)>}s zuTL6DjXE68TjraT>z<;yh$~!<9#UTlEh= zkC3J#+ot#gj^YgnthxXoo7XBjJ#=Gbp?(S>&u`cO8y60d1iG;TEjJJ2?>f-Xcs7?b zr6}TZB}U*UEd2f&NAo9L0$xf03iLs!9el<(_XGhD7;rn!3F`FZkDw*4_ z8s9vEBD6d{pbZ$G33F>ULsX>%kN=SkjfD6Yw*ut%!%v)cgpC59wK^*1;Apzh7 z`6j@*(%;6{WZ+jneKJ;K!>Qe|562sc?YTnr*w-hFnCzMpf7WiTHO?GkkK-Kr zgpf=rESK(JUbhS8{&nbC{4pvsQ?$C-SQEyr?bCTY_KZ?vF9y(c5Br;h?a1P^(`;fR z3Vmi3_M!i18JQunf`b;b*vGDhlLjT9liUK)ersnGG?u@~?}<>*4+`mTFV zQQ2MvIm7p{_+{IOc5G1RDL@qmBGaqK&V4US9V_BCAmvNL5$l+}o|`|Llv>g2nfDco z>Oa#UCjdyb-v~wK!({*k&Xyb?jLBbXzqMZVtbt_@Glr8n5fX+3!i6Azx;9*h{OR) z@yNUkA-pkCt#CtXm>;wCc@{Cxw#|~qdZ649=|>UuClF4MV;Ti*%tXZfA^;0Aa zs-sZ^T8dfnIef-#Xu~e6pyDU0j+(xC2`5O{h8-~I zW2lS~^JVD(?o@xlvU8pA`!V8+&5t@5h#spQ6 zFaZPf#3=gWXHjh1s1h~uVz!eQehZJf@RAnXi!mrb{@Lp>mz}$OJw!yYP;{zo>csnY z7TU-|Xf77Y1Y=A!NMp$r%|JI!atjhnH)CdbRGA_BEBFAYg>x_P;e2vsB$0+|%E{e~ z!vEzkA9R>ZEANipg(@vA`bGw$!T~aeec%$uuS`M!NV+=njSxv8(-tvNt zkNFgP`T+ozJ1=IL5=3cc$FqTt4g}d=FZ&%odkobfL8^HRM4^|Wm!fMQV#;v0(1c;&-2 zc(pg(k8quL!5#|)6d8q&9FMUeRQW)pwOq%Ou~mm*9zYWzK$IQS6yy^X5)|!2f^Xbn zqLHAYk=TN$VUr+@xcX#~1u-V%ybnxNmLzipVwL!5*jX7O-Vv28mNLAG)Hprg4fyin zj5YSmm;xY7`Mt2anI8QXb7+9fIAMPx+?YuxoSGjVKcW$~H7Y-+Y%yT)nwat*AQPq& zS$YTu5CTXD17;3tbG_*>ua$;0)@zX(sxdgEGMopBj+lvuB*kzVB4Z(q&C0GtVL-+m zmW!J}rsubIM(ED{FsLkNp(O~hNG(AzIWjjAr&Z~7bLREr}H5=859gHT{S4KVFdG8VuL0Nb8R@)jJ=F+6Gj2@1X(N=@vib;1Xa=}-#3 zWYk*C*DJp386Hi;cY(5dX}I7`hJPlW)a#845e~HsbP6XE7z5`7tl!Q!$o_hZ|e8ZN8st85YX+ z*-k&AzqhZ6dKN!CJ(!&TMA|X`OwitlT0k5|mHB4)z26ecTRG2SRnjYX@*wTi1>GMy z?izc)CaBmlrlkUJtdII2U{v{VB5l0A+yQ zBd|y_{PLDL3hi|Im)!Dv>Xq6rn^!GHmM3kgzD_OHwRfL7AZyEsTza+6RYdI{9AYZ^ zB(-^~;=4J87$5Fy<%w_BvM%@B3`!tp(l3%iYIWimf)UGDB{Qi0rZ_j$O<(!<~ta>u)fd$9b2 z)k9Y>@yox4$&Fl{pRdKfbyT+7`rmaNJ+ob9ZBo!f>DHCwf7({E;@=EPOp}Rw}=yTUzi7d@-wr}PQ^YlMWN~JkZ_q9Dg z*qds9Mm6U z(X?K>exq+bsM{8O{Xi#jOIwpZjjL8l6a8&&Fhf_f>`i%+!Jf(d)6Teiq%#SOcJmj$ zIi>M?tbQhMEI*i%e#~v-X$mH&jQ$>+Q_s|5P+Am{H9X^-65J?rTKWnt4|? zjLrPGrFq))iB3*8e!-=ryx%J#+jy-tCvM)eYWnfEXxZ3bmn`9yg`2N5DH^jPq^Hte zotvY-n$Ei3U$jhNG@Z|=b6Alts|@%y)w-J_9kLo1pJgX+W~PA-%y{;|t~txk$I|AH z9aFzVduHk{qf=I{aZuq$quJ_ja%S2_uIFZ1&N&NyO*_&9|FZF)v??e4<=v+FhSEiP z8t7Z?3uV5PdhWKdo?EzOq?*08aZBBPyeNXKbDZ#Q3Z0as}Ggrs(L4!x!8?%)5$sG>J6c@+o$Ioe_QK83Sr+%EZVZ zb2jt7=;M+0L0wVdc59KNoh;+&)#v8YqTwG4THiAavgZdbzjcM2XVTt%A@Yt-^p%<2 z*`q;lIePL`?P#w)L7cF2f8w2a|Iyc4q?NE8Q|;(nEiIi1gT%WR111G&G#?!?lqoE} zKScin@HV$^SDeJvRt2t^c$Q*PMYq%|Tfb>H1k6_Dx_qr3myFv_`{dqi{B+@y_5OLB zU-5*A&HD#NWziMFPLgi9JT>Nbz4Rtbgn!1G9}Rj{mcJ@aVW}E591S!7jInf*>Qp|x z*}KRdNDA>;mW6P}D)?cOqbf7F5xdmGVPNX_Qhn?4+mGop0Y5K!lOf>+?~eob+QRKf zbBCn-QoOTUO%gJkh?6HpuRVLFm10La%M)n7V%P8S+P-lJXYZkCafd?5K>9*STPHY( zj>aqA0!2Vdj255rQ;yzvd;D`oj<$qo4*dzYk<{Udzh#bmwliWIO)H2^N9sz(w<#oz z161fqh%vG#FPO}io8#ZZS_x_#By1Z(HgH`)ltkg=gqaHP0lBf*AegxQX|9*>6L0~H zhUW%Y;fQ@ml~nsp8;iS58p?*Ch~*e-C4Uec3Z*{-oAwT)900i6PkQD@BIOOGP-&we(1)$PjyiDg6`!@316s z)*eR;abnjxX{;v!24zAQ{;E*es!k^$jHG6nOg#)E-ZiPpBpva|n^(4cH3?fb|8Ded z*(ashR8AY`a4S1aq<{BGLwpzdk$kzOQdDbZ+*tLk8~EM0DADpCZdLbx>|aoqq9>VR zK1-PhL4LKsW=oTvwVi`W$>V|G=d!D@H#^O&KBi5$xF@?<=ene-gfF_*aXkDkp{v@v zd5}J(Zup|2{aM=fjreJ8zmj~J?diP+*2by3?;YcRsiV$>bKD7aDa+9#lyRMk(py?n zpKje@D_?Cn_6hw=;tQbBpMZMGIa=S{&8iIL?ILCc#moloX1n*VPhiq2-<)2ju8y-z zFpL?_(xp^=(sC{j)e4RNdrRPhrL=;{nQ{r&)V0@VpBLRxD-69}E-te!9BSiMDicA< zg)YSE9Wzf82g($Svgqg2ue3M=2feGSh@Y%W50dLad4*+_=UmLQW%e%(DD|T{MEZ6! zdl5-SJC7xTdm4sjeXR>FORHRb+cIf=#Cx}M&yu4-n zAIfBMdoN;pC0$c>Q=P;zU05~6%4U2^boN^Oa$InAPOn4X{5sEOyj?j?7a~fc*|Np) zOTAm3NN!%wYaz_oRDTt{)fV-!@m!=@x)alt_5AF&j9u!|v_RQn>$6ME{{U<)pETH< zv#WZmCr#fpIZx!JltoRTWQ&tgEX4!dOrk%!5(%#ihF-d4W32U5#S@f#`W~pkH zeiZG=rdooxY4~E{kNF#xS#|Ov1ZVdT_CwCQEcNu%kJct#jEqZfavc}gpGktx@$S4uw6Ar9@$H1|J-&ifGx|BvH$=ZuqisO-ZXj!5=6oKf!1 zy3Q)2RAgmuNgN7&aL!qkJ{o0Oehc1W`K$m;vOKf(Qgd%Yje$0On6I8K^Xfk#Qv zQ|49XYihUu(G}d872Wjt@CB620%k$R%cUU z5B=}^cYBn6h7v6GYQKOk^ccWCgx2g71VS%AK$oNPurTr5UsafNphL`j3|=tmc(rC4C~NvQ=}&#V z&an<;-x2`3wnei_W8uBAnnS6=sJsuI6_R9D4GHgrMV)PJHXSe(%1d2NNkdzc zrwxMlNKVe_a`xdc_oU+(0E!|uNC>Q}Le@mgtWQTs`LPF;K!HoXAS^%#_t^zAVL@P$ za5k(28K5psw3=guKb1RtT>kxB`i_`W3!huqh~0FZyBLw|s4b)hzCve#yM!y_fk0J8 ztLuPrL4f{1)Tx)l0jLkVPXcA?xjJrL-fwPqM;S&%Y-7Q(sC^K$X7tE8x`YuzAfILL zn`D5K`@Os1APrOF7x(r#Sj}jekfXQ zbEaaHC1T6kMAm#-9Dccm=9;B@g`*=uYwaXnyhYKg2`*t2gjSD@{Jyx+WT;GRJRUep z!vrehCLUI3C6=wk;1(9*~gE_pO%HcBw(joW-NwzwyBzRvMmgu)b&G=WV$;f$R z(!jlfpt+J%TY7$N%Q8t2MIrNv=-$`CO#Y9l9tP>4(3)GjRf8flbqy4F)&V|J;d>^j z-6uf63CzrW)mf03r9^EeYvr8Ns+m13tSu|nv4jGu2Pi!OAj>Iuh7qh2E1Gmx9o0wf z>DnkPS4f&RsNq1rA}-9^gk`_9BDUAfo3gNwy}P0SXfQ_W?Rj$;cv^`q7hsV}!bgh; z>B-aPpBQl4meWw+_7Ja-HMf4nZ#6h;qACd>aXQ_|DQ-|4v^}giMc}5S5x>_4%huVy zwBoA9JDB|T9TYcNaiM9Z?T-ozVC@8#$?bj0E=_QVWpId`&U1fVRYdQF*%y>6%1Ayc zBRfiLOG52;umBPxT0NDVx5G@BVJnb4NdN&{TI1Txg&@m1fE_ScIYs7h)302e60uxo zre$cG+<>LoLgg8TZ%k5Z_CC{^FXTl_6^>CK)6|&~rf}u-8&mK-hr(;>0t)5?2)$P? z3weae>Y;%b3HYx(>pc8_019eC>!Hgj6hB z15hBM!;)nO3)K%Be!=&Az>9etfi!f(HD`Q+QHNA%M-?LcVlj9_-LINZ75x-Dbr~1) zASX`~!#R=IyiEgL7}3h7SZa|DyQJh8m|PtL1SAHL%=U?JFMGfJco3(rpgWSe!Q}n$L5G01!$oowWX?WX+=0VXD_PRNfPqN-e(L~% zwEiJiOk#n4LMVvnZDr~6t`_rBP01e!Ip!Ej)er}RfQ=>?4 zH;9?@0-M?j)D(z~=-**q7%?Bv4;HO(#mlpk+Jw2zVz*KM@GoAM=w1~sY?mo^mb8x| zl4y!KdnTb>VXe_2UPQq*j$$WC7oB!59jYT&p8>sm?TRj;m)6~hCAdZr#-A-|I#%d9t@6=j=McD><*!q>T z)V<{~9SA|!tV;LUMAq6LG6Rm^G`(umdW0}He#K5l!Z%MP#YixZ3&op&UA>tj0Feyg z?)|lyY0FK`QM)uBlBAWH2XJ9&v83>&?2+=`$&`rswn;qkt|B@mHvc_9r5!8Nlz5nZ zIv7q3ES@f@?Kgq05W=P)t4>bM3^(7nSndM9`@o>l9&RcYX@=FK{PAs^ z@zz1tEyTKX-&n>R=YOF276b}D7L^7TxsDZz7)}|=cusLoAkUh%;6fwHSCiThAMot0 z=DL(Wb>@8%E|Om4bnNWbSrH=_iUY=IXq@Z9EG;b!W8I>{Q{UnfLv%=t{6TP#j#!~; zw+Mt5M=tytmzciFxeOCBjPikD5a{?3riGWhepC^Q1j%S!+iTU;Qmpm;2#H9ruL3+0 z22JBHF}rv8aO|BDiE?5bC<~(lqDV&P-GGZz%sev!&2+parb(ZvKt=y#SE#0U^s_PdPLNB`LrT1f8=O)@(xcF%5=WQa0>J0-E2 zUFD3gLq!%Fin%Ew`pS14;AcfZNe)JM$W>ase26{OT9<5IeA&^aEqHXWSjb*;P(C_)D* zQ!*+vd==>kU9l;Rs^oyK7n7$QwqQL=r!_Jl0y6c#h`J5 zi33I^SMD+CDe-4b61aY&9H=!3i#8rCoOCgC?~e@>>PUiy=n5A+GIe^YuxZhvV0PEQ@<^@(_Y&yRICUd0)^H7Hb-{8n@VfppULTS;Eryj zdvZ0t;4D8wVRcBxLS{uNK^MQuf7e-vdq!M&&)mKTOibt01T47IBoKsb@0)Cb(LbVi z-Ns7F!c8AB#&W>9VhkohmCy}9nlKqvjHSH^$0jyq{VQUZN&UIcVf<*Xsk^Wc$ElYHpq<^;XQMo_kZ+j26w#9l9)LfE)K{=GkQCp`0V=<)6JhW+pV!3b}My ziw`;U4PaRDhgzcA*G;F#H1g-1hSRd;qW=ewDMnh`Otu$q+&ZLV{3D885-Kvk*hNKD zNvYm8>a97Y6D$sY7y`6<)1vX>hW-}1EdJ}^U6U^ziGrWTK6!>@&Hdd+y2<`{x#|I_ zm91`mH#GFYqpUO}2~+mW?^-jaA@dR6Cq2trF5@VNYAwU-7TO#2UkukCzs{uZje8jx z)GjmnenM93w8O>)P~nCVHj_T(H-bem(vTN z3j^;Dg@G<;YRg{x-S^e@Mf#sFZlYgL`QoR?c+vz|<3^6ht3MePC<9KME`09hIxJcpgo}vW zUC%SR8vC_zcOP}UB60WH+EjAP&o=xF(_rQXqwhas0~Fm2sFoP@r{Pvms!jo)j>KcHYTLOl9{w!%u=V#Zd%3O;RJJ?zx|#R+ znd7!rcSDV*Z`nQV^rrc{4yRsvJkoL5+b&meS20PS@_BkFn|B>A^EdkIe(0^&bau|Q z6WL9KJF;=L(`6aWjWNvX)5gF&P*J?&r|UkqV}Hg7B<`Ken+k>hx-SILED#P~VSW4w zCjo6O-UeA@t1}8NdQ&fQAd6v8Lp~m#=l3hFG`Sfn#QkKq5_Eb$diUe&w;I=;nr_{Z z>C?!m89_E>HAGC|X2M!hc5h;B%2uVy(tt<>6O{_*!!^&{n(kdfJ&my@kO)%c!o z{nYUsaVwJc&QZ709nVnBpA_{vEBs2%I(YSZoBQDU5~lE*tRid0OpbZOxI!D7@L`V= zG`lo#@uLpp^mG**2I+#KVEd zQpl@?2T?~qvzjyl{|87`5c~dIxC11o%tM9szvSBHaTkl+I^OJ=ozA-86u~k29p8~o zr_1*BRDc68at{GnOk6wP-Dnxzap}K6u<+jD%B&pYx%DAO&?f4D;p5%E!shRys0j44 z=YEngw8ix0rx_RFd!ixXLFxGTHUI^UP2MUY<*#eKOt3$AiV+Kr{K!#|{B?Mc6W*D; z3XbSUbFF;0xd9L`gqe(`ND3UT!a|C?E1#>zE(Wi#I(~vC9pe5)W$CExzuoU* zz;3aNs)q;R`3IYBZ*AQcDuP6@XF&5&bPAfh5mkLo&Jg*$dImK}#0_{GoNbN>$bN2{ zYTsPe`L4rZ@W*lf-v0pN`RSVT|Gb#^dK{4wYng{|DWKZf2NajY+Aw3nu)?0;{0*sD z5oRtSSE9Z?UDvy!pS?lz@XQ4)fsC3 zO4rtk?N9s;%28|c8@NV)YjbfXS~c%Nw8s>x*I*^8ptC3C)I z&BTF%J)xs0Wq#YocV+8~aR2UnRmz>Jef}I+L@oa|`DsSp@J+gfAlKmN__$;I(1QP^ zE+kdBi2As2y~BC>!BpV1H`c}kp>iMS-e46P`k%Cop8?C*b11c2s!Ce?evGE%=X-U( zRI_74+-htvMg?0R=!TG0bv%KHkZp=Td zo&ADF58h9(f3{tw-L_%skv~hQ|8-npG-mi!*u=$~|7&oX-3{x<=|`6*x;%L4zgBj4 zNRCBS#a8^lw$FM6QUMy9c{Jk_KoLG7RR>j z7Pok-k>Q&=9@hV{2aGa+lDoRY?Cu1-QeY4McLyu~ZD2YUOxFaU4V3Rl}U%xwvz0t%SIJ>~3=C9<3fse#1KEIKH(8UWHXHQFOWLED`}A|<4MN2BWJTN^x^ zN}ag|&{@igt;GB2!*Ttua5#1;r7x!d(H4-ww1-*h5qlXF3yUuv0|B$h6aK)C=p1*O z=$q~-&_eYVI4T`X#wK%s(^CKTOaUMN5^`{j0S z8|Fw}rs#+iwTo@)gT&%{wQp#x)-Gq?fOyjz2L41;W6s2j7~iUjEgH2S%CRC`Y@%tS zJ>Q38ci=Mj%xwP$FiF=;^vMerR|SY)w!Opb;vpj`&u_sY$WFPW*7sfu@P-tu%vDx8Az3)6$ZQu^a*1P+LlNQPcg5nPBP zE|PMq-&0O-;J%n8$vQOPc=2gFV~%j(H#67FH~5z#?E-!#(Jw3o zWJ*q4fk=0IDx6Crat%Ya5L#6bFhHZArvmWuYwq(eQp3XDbqVa42Enj`a=mtDl6Qik zFNV-&I5-o%SYRg2!ndWLjb=A_v4+9SOiZE*!5LQC=Nw`&i%)&m1w};M^l&p#g~k$2 z^$2~09Jd~cDIMN6?*&T;x0;fD)H~ypSthi52xt}@1cm5{IAi&fmU$Y$wRMP_hASfrTwiHJJBl3lZs~*#}Y{X!}TtAcLDEZ$A+0jZ!h%WJs`OdU{3A@VahlvaZ zcHi2(CuP1b`=M!!%^& z7Yi49$cUD_LRYHgLqMfI5J|~G(BP3ISmZW2kWOd?Y7RY@EPNmZhH{e`QCsqBPPGbq zs04MBA9Q8=0%#^f9q6zKcJ5D(7ZkpM!&0x%b*3oS0bKIF8bs?)Xu*;Mi?gHr z7`RsNl;nnoSM$Y}VQynYAX#+1QgAPDK>=+rE9j_t&oJha4URwdUwEuYF)ZDyJKK+T zkamhu-Oe4pjk#=t!DS<-rgE~c(P?DCiA;d*#EAH2hie-3fO6?jBuqp<^20YZFETi5 zm`nT-3DQYBrKDG}e#?wtvdZ^>J{p+PzY3s@xb&fZDEzdW*+W5R`e2;!9}d7jQa6LR zDhw#LO-B$w6nJ{*MLYRAB4Aa27&p018++tPY$L(^A!aSEZ5pIsj?1I9y-3(e#U@^4 zGFIyYl0t^e01R^n-bGWTq;MnbsRcw(5Q8A+g_+ztz1l^S+_t`UQ$?<70;OhYCj|rD zUg(!5K{ki$1ovR7lVH_c86>SEoBInj&rs=-sPWybU3rw0QQIW#Eg zf?aL&PoDRYT)K%8J@;0i%mqzaP|c^_E6@>vi8hnY9OYcHb&+csA+>( zVN`?pyp%IhrQ@}=(ed{3E>uUW$pCyX?d+#WA#yd>bOQ_3AP{UUJB){}{l;`{Fzj0J z=U^cM$-JQ3#fx%7X&Hy&w`3v) zDY+1-ggf`=gvTYO)FkGE!9Zb#Aps=zHpD7@exVwgmu3!;UkerwNWkf1t-#?}Ln@Et zOvXMG*HrDU^$U;Qe=*4c^MLo0zzkDtaZ|OZ?`?73BGojT!7VT&)Seekriz_5v1RGn z8NLJkdTRaw@pUXGkI#esAWtk7t1T34dZ*lj$0BS0fwP@@EGtsy`Qw17Y-IwY0>Z3a zpd04s{_6>E)Sf_E9!A?m)L~J zX%ukxaNU4~8}37kplP?O4aEf<@$9J!$IR`rnc;MB5Vs&30*NqwVpsvFnG(T? zbcRFrm*{5i3+r`Tq4^_z${cRl7eprp7e-DTAx5DrWSs<)3C`grA=Z`@Zg_>%l5(9W zB!13?sJ~yeXH)?Dw z2mmN08UkqZmJXKkAruyqrxLYnZlPr{0JK=sAcHA>Slp}))*8gyd7+C1BMu@V8%sV&Lne9(AO}D zg(k}df|O(DPXSLe*_2V=p`mF3pJlJ6D8VkM%jiFW9F9^XUCT6rOSiX>>&y)%D@VmY zUbga@YGQK=aB+3{V)CNn_l~CGfM~@$Gb!f`jT88$*c^b38xq63ANe1398StJI|2hj zi`n5CgE@dBLVe5<{pVH86QqbMhd~O>vO0KB(C=lGz$gw_WqZj{@GRfy;cEt)J4+4e z0;-h^^A9zcNWrUKs{(aB%&03I74wi~y(S2Qs;H3;Bbh%OLx{y?Kagh4|H;HI=0nPB zCQE#n-`y4u1h6~P%6sS&hE((k$m+)5{h`$^oL<~s=F`4kp06X81Ndv*pL))vCt|Xk zXfC?%2}rl<*^wNev72BDGSLb3Z7f5uk$1aG(UW#W+I6uVs-c84rmds2_X<1nOYu5lJ>aYfmoBZl1S3W?M zTvXMOAtmY0?Cv7P`&X`}mozWW9gSqBB&%->BD>uuFEs>5Hu@Hp6;(cN_d4Y;XNg4g z%$WJ5q>jnPiZ7O`yX7a`-K=p{dQoO;Z(&|_VP}p1GF5(Yxkc5Row*_V7u{W%V@aW$+ox-mY4mayjj#Z*Bxya_x8)wB4T_%}**ZA=Pj8;90ef0Q1-`J&_a zdx*G{r;0TKX6xc^+1uEsqJA)CxsZ*QymR~oEj7BZ-KW?Mq;&2VtFRJNfKbRSvxwo3^<8YJy zRTb6r06ir>8Bc2PRNQ~b_@B@I{J?MOojx%6wbiutDna$vt1%v=o3}%St2xyTaSOXn zTjN?E-ga-b<8tk#x_oF@A8*7y7K67hvQ3uW(qGcw+Dx#iQfW&K=Fcb_*J;c=ONjK%dNdAL5P*JT^Ae)E}( zV9NKqRpMRuZ~Oax3z=J7WvwjQV1)YNz7;~>9OWWzX}I_!vD5zp{P-ULWg4daDUVOg z2`^$bpetW7x0N~qfc*M_XYU$2*YbHcF8h8)YSUbG+;MN$%Jj;g_*4nt1J~@c6NZI^=OF;pq1UWv@ z28isgym*vJn%UJq{{t*D3h1A93%ObS7w>-rB>3F7KyEPcE*OLhI;ya;})i`D=C6y!Zx8X}$BHur}C=YxU zdBR_A{>kCy)2eZZGt1ISd?AYeC@g?T$R2mR?yJ>$|IgSC%l@23;#ho1WWz-XGli4U z&?QWshfX^|+jDTp?#&B zJA%yx%3C=mZI%{#Z*F^d{F|l1UE6U@J9++)_?kItAz{_7G{3aQ;>S&^(xxAL zjk8a#lw~f*Z9c01J|$aKw0EdSN#pl7q@+}p24sCW^;a{+_mx)|tNwaQ(`X#S41ZED zVIgmhazIhN&u2cSrK5z;=R?CIHH*g%*kY!*nZw=;n#no1*hy+j{tw_M+!?T8+Es#D z3g%$OxBSH69$E!dfU#SEFw7=rmzRSO#pfD{^GaV2ZNVe8epg(FY+8jm6kh3d@KOhP zs*5{_S$a9*E0o#S_FIIqI=r@Kl%cl=wfuYqcu|R2 zbK!4B^OPg1F4VGn0|B>EM)oiOk9hRK-(&5ngXdI!?KZb_1oS<#dxUm1 ziMcyw9`<&OwKKj@{k|d1-E`7+;=6l5*NR?=&ctUI`!j%Qk+_jH0(SG~VT54azb%$t z_2&yyzmt}=L{=5zeac3gWp~=mydM#iWGtWlyX{rte|OPuou~HERVDi67e(74y?ZKr zN3K$37c`rsr|W`+RRDpS{;={h;a}pl($VA}ca-=$FCv)=`;^@HhV6i@3eMl;rEh)w zeNuEO-c?pQ*#GOjnlbyof{!)dK2ZE|Ew%8?p<}UFw{iMJ>8M*}#S>=JQ_?4RLEc%3 zf<$s*RRQNj%;`UE=S_*<%okW|Q*Dz!E1Erg7KVeO@Jw{p#RdDj+se0^ra8MkCo1*) zn@8?_C>!`8+(;1LHQ)X?`(%7@y7F3Z{1`=T$zrr&!Wu`aC@3NrSbLTSU)8umnjU|Aya=jk;_;oBD+JO13cB+w!xT;TjCs z49Lr&7E+I%eiJW`sI6FWUGUF;U-3gSz2HuO;yv8dmqCT@{JGQb@vt9)9mVVu zq`WI(NH_^N=@PCvz87|5bzPzi1NKL9&PnWM{}i;E^~=^~pW@&aXaPzi8E31y z=cOFjrk{2mfYAbe+|rL+BeqG^L^uF(GYhl9&ILBr6cKtzm`Az__&abcY~1t4Y3Mm@ zGN84ZLWAz^las5jNh0aI*eY)6_r9FS0%ir#Rbd20m}zWO&3EQZdc+ru$d`~{+~$NZ zUgAeMNFe0C2EOnL8W-1#MijM22h&D;5?drwkF}MyAP>(+u2ygA5|z+QE&_DFv0&b0 znp&R&xbkM7+cNog#2=qYZ*;+l^RaFdRbDK)mTce!S1i^`C{dii3220S+tjgp#lhpZ4FZarVyD}1}L@wU=+r4*2B%W^({=fqCUC0pg2xY_(hOF?W#$=}V@R1yNLsb~!r5 z^c2Pm;3^!cVlA;g?`f zK$Zg+L;)HC=t|GwE}A~hTo$+wiw#Frj&{asLr{LH=8HBiS~fQeaz&)>-dluu(_T^& z-*u=h85kmlqI&Njn8EJPd~{HWD~}(uB+PUgAYDwO;M~ffDgMAQ4ggYs#Al@q(C~q` zYXb5Fk!I1XoD=LfI%B|a;gyKZ6^O7J2Q*rhk`g6P#vK8wdDyGX2PfU>8g#Y@sxh!i zJ89j3k2#zZsOCbnl!kopCj40FZ5PJ5sftMIFi#T#c;dB3WDR7bBfd?54Ny=tAmXX- zKzOtdIrt7zq$mdSqKIi)N{skW6&`i+%7)5XWyu^!^-#?UEqW>JC_!YQ!pIL{pq%KY z$DrV+u7j^XfOAW@e)AsN6CY)8c9K$%u6`vdTXj$-Z=1wPm7X&mnvuNY*EMTPg z(w2vw)U?S=R0SSjR^X1HW|^yo1F#vS6k$|N#P4Wcak^LW%`dfdmbJEnz^5GQx|Vz9 zpFYsjGoghZfI-C=yq2lNHb@na@MqZR+Y&gw<<1@Y-vPgfsFH}mwwU>=PzJHzu4M&? zLeI2rwD(QMjkaToH8UnQ2D?m9P6+At?PrtM<(PyPgje(8T~@&-x(IoP9yy>uy5n!P zO>;vgEXE_3&h3T4WNh+pBD1~_R3~E|ay>=Wa#B|})jS83iF)=Xv&T71R3(&&3kLW& zFH_N}A}c)$@pd{NS$50;Gbs#;0+w}c%_0!Z`E&l6??27d#W2rIVVLE}LE$O@hk}xm z=_%Y${8=2yuopl3TZ8Tt34lm!V=;?rz>&S7-qh5#{o7Le<{Iim#sh3DGL|vnJWCy* zwtV8|VpQ|s5<=(q5mNr$ihkR#Ix=8e5IVBpGE$U*L!}{Hg55-+4iO(AU@mBOgjFZ1 z7$iJJp(4^$E7$5_ApGP_=MT%s~u5 zlKS%+X;c@3wR-!J3J|uWx$=$JU+O0+$<*)zv3kz4*QsL8mG2p;iDi zRhfsCx^Kaux^yC#-`Ww3+2Clmg+hmftO=l5{4C7JfbtMS2Huck7YJWV-Ni~9(o2E! z1n-KVz5h7`97>F}hd(Ofla0E{T1nTkYTc1sKTdBj$qC8gkuLzYf%S445I7deTzOI& z4tl>4^Siv*2xR&CqZBUezvnSJ$=cuc8?Np ziSpRyne3ycwn)vt5`u;07UKvV`6Lq+kx`HhOotU3B(Osk`&bmxjY}=ms6%{VWCXfG zBziq`F%D!H$O0lUbQS!uCv4EdEKcqvG0-WqDL zR6~R=$TMdm<*k=8w8D2X$QTA(Bo#+Cm{hB#|DuzkqWOATBOoSrwl0PU$~G&L4_`2R z#r1lu_+jfr;5QE~}Pr*;&ZfoI= z-JjW*XSijr1j*}5(2RY@22!}O=I*Ice9BeATkFDmHj(2cP>5Ip1`0?AekskVn<=b{ zYK72`1M>I+XSE-piZhnD+OQ0S>F6-)TIC^;qZmxEnaCJGte5UdI^35_puq34;2C!z zOG!!!#*fUN+M?#n9rL$G{MIl${QVLF;|xv9$ov*^Qu6Cmgu$NcLPshV;0J8F%opfu ztcnayg0yGQS>1yRJk7V(WSfls37ozI>Ukc39^@>7f861vdQ2>=XV;xE7%#|tT zF*4A-g0dtg2s#bm)d*x6-p z333#8&&(IvTc}w--(S3}8@Tn{OE)!-Tjw?w%Tj|TjkK16FXonX7W6^%OLbKzF0x3P zLKTH05Q`r&c{n8OQ6g$|M9~P)WimA7n(~LwagxxYf~~zUIl!{R9#dAhS+2{yP9Cs` z#7{iGZe~Pd@0O0(*7*_%O=ucxV$wx@jP5opVnXEq>`Uqq0QQ;(10aCj(n|x;iW63; z&1Lkr5VWnh3{xVW(Z`e%Ot~lRTu@U&DE58D^e=W89IQvoP++9&9~WHyL;mH8(Zv(y zA!cz_{BNYRhrNItfTd$N2mD$Eq5!P8U{UM@0gow0ZMORD7zZAw;XC`qVD$9rn^MBhAN9XjBqiZynG%IUu{&PLc^y}NB%@aR$(9_{@&zd=I{yU-#Z-wP* zaCxuAq1F5Qa&RwpO`~uMh0=@h;?RLIp$vqgy#M;MIj@l$9hcfK8T)E<%5a^(-QR{o zwly3~!;By=M38uae=8^dwx@^KTHmg<#H>|oH960@Q|trZ#82g&xb*K{N-@q_aBZ;7 zHh#7*P-lL-LWWBDak5$ORL8h^T&7y+zh+%(mFd`eyZZXUs@wILZSd>C1&z)kh(qtk z{xg9t_n`093ms`Zl@@ld6u*9SG6{}S?(SL_tTUS|y>t4A)Awp|zPEYBf7VqE7mx0_ znEfc`&bzs|nIsSpx6xNpobUe9L+ON$r4GOH`0LzvsTIB;8RpW)dh8PmJrDT-y%dZY z_DB5fwtg<(1`x(%wBWCHLy$ny^GE?Y27|U3P2k|X^-14pUMlE~QmI zsVR>eELA?RzOGnRRMdCh(6KV7R<;2D!+hlas)gk*9v;iu)r^1_rRM6Zg;&n6YrS`@ zJMy@QSX#CF#M60q@X45(e0tY)^_S0DtVWhnpCJoB%ZyoL zvDHh!dF)((oLwl3M(E95nAv~O?0l|$+CA?(sCjz*djfN`B!A}6uDs$KhRwC-3;%u! zqYcphKYm{6?Umdb4-6IkrI%FgHD>kUQqA?`iSmPhR{=Stg}9oZHg&5PXYi&s8Y$zk zH}7euEL7T2O9k@l5$Zu~n0?YR{ZZXctL~}w_LMZ~=S0Z>a<-_>a`m!A$meX2 zZ+xGrvmXf#HI11{daU2;pNI6^H^8s0T{j=E7`^R!tHhqFbGyOzC<~x&8i~!m|M&UA znSo}`f%e@AB>Yll51w|zc*`9jY7iQJRrBP$xD~Cgbj(|E?shGOjcB)%F@eG_S1d(a$oh`T;z|{oXLZI>|w;0p}9w3BPjW z6~CY4SU-Q>G)vuU*6WiwmQfq)5BTlUEhjDe=Jl8RJAH*8e|mgcy0ewL_PKv%%i@rA z*lgVP#&>thC2ysaQtAV?+x5f4L4{wbl6)O0#aCL#e;56T8h*rWKAC#0e2Vyqnc63v z(@|DNVa<#Sr$Zk69CRWg5*30g;$hONVPT@o#(#+|zq z3;R93H=Or2U;gUz z_55kknsq&fnWTfvq0ETerzP!CrUC=!zPpDPnY0fZ%%GK0kL3?HNuFQR=78UC5jai| zN24OiwM2rp#@l-M?POdW5JH0h4LRX+A>aJX+%ZECtw?(VW|{GWg`zVnoGB{mCld85iK76k2Jd%Ndp7>eSYN=Zooll#5hDJV8Rdmb)7a`wwz&4CxG1sOqQd%GE6B0sAtraNNwjaGDQ? zT}b#r#Jt6@JHB*(u51A~o`W8dLI~B`^vAIcwoD+M3v>JP$Qzu`v!3eEknSQzJ>^@;DXyzHy$#3W?wEp;HrMuN)Dvjt0d;d)A0NZkb?X9>g`RUTT z4|ZCwP7PODA1W+HkZ*c;9gD#-g3d>8w*uty^a4 zm(V~FH_Pd9JEfM@ilcn}?W%Ob4ms_^`X=kY_H4p(zt-;uCQ9NjsYS&H=?{4=jon&Z ztzJZut^FEp-e0)v940KDHvOlTi7IVZJYyg2e}3s(rINK>ip5$OtU(6Vz8(0Yf;#$U zp!e)a9kr~Q{`JZ$O?uRY^L&}SY@jYdbKdU_W8&w3!WrA`+l&j~uqrupp7FOo@4K{1 zjfB)>lXlg5d7as9m`o$(*hd>q=XYZ>c850u>8er!arV=}eq;vIm z4NGY1XM~tn$X~PGaiPtE9SX>F>wNwItX+?p%K5x1WzKmmOABPX^}Li@6LP>ieGv)fA;SMqkB#Qi_WUEe{*YaTctg+xWi0dJV3v*J?l@^!L)~nq=<{R zj!9EsR6{|Je`q*`6BZ&I;=sWK12_}<5~z~W)|Sjs%4)32j3;f}Vf3h5bC1!ARD*AU zJ=Rz&QJYv9#f*O>9nnX1OVGz5IPR#55oQYUk6cP5eNm@mR6-COo`p^a+9rF{aGy*x zm-@rR1rJ<4^h+d(($uM(TNx|#DewAcmt+jhWcq_0V$9xBPTpXm(Wnf8sBn^{trP(? zX-yLYS{puO={i5Ss`*#&EW|HCw zCi9m(lHmc2eFyTeHu$ksSh#aNTYOImrEmz!Jq-7B%U%^F7|0uVR|!2ZG>di-Ns*Mn zO$Exc1e=I6P6YypIriSiwP@rV>d5^4B5`P&zL1>&b9|bA;j^Ju?8nyeyvk{ zN`;N;OAZK36~h=4m4OQJJ5FbQ9j#7Gq3TGxbi-;^<|(Wlu%xQ4rW}~m)e3JmLIW{c zxv;R#Ds_<%HeSu%6rOZrjS6>Xzz71)z6>Pf_gcrjzAbgzBOqe^XcUm}5Gz<8&ib1> z*HMPUG6ha!c$h3l#R&^yE~04gIWQckT9wL89xa_pgJSeZ2>3qJK^7JU0+(O~`77ay z1-WbzGhQjE&p99hI)z);z$0i0qIn9`uhV_`N!`-YWYrnYo+NvOI^L$O6bq^>K2)U& zGMl+Xrzm~^f*#s3z6Y2#0m%k{vi@7E)|ShMXi4`i_Rm|u{uuBMBj&;Pz9)3ez$%IJ z=^`VE%(;6b5?PRJ9Rb=nI*tP;EE!2JgwtGIGI$LS{ih(9Xk3#QE|OLoTv>vf1QaxU z)GcghB$CCN_Hv<%_kgezX=jB`Jzizop_iTuJq{8`m=&oVN&P|lvsl<*KiU*zRwkDD zUe%nk2TT%NqQlM1Ek+tXK~CP@=M^a#&4S6VWhKBlSBa~}!kC~yfMq5!G#%=C!cETYfbA z0GQyAfQ9BmfV3IiXT@GK6P&Fz^Zyw-_jsoMKaOt<8*&-Cxec4kT#6#OwV`Zt88hTo z66Josi)JpNubG*9=F;X?M7eiE%C%fWZpr;FB+=#f+rN7}w#Rn1o%1=L_v`h1#`XoV z%261pyXV1q3z?r*x%jNCZ%LU>y-SuQb_0$o4)3!RawSY=^OT_I)>>L`?~PeW8ga7M zOl$6c0HZ+t*R#6{R9ckd6Wlj7E)Lrv?1@%Efnq8`s@6rBR%*zmm;yq*PZ-1$ddMV_ z4ZlpnrK6y1X|WzQp%ZF?jl`)u^|ds>{dcY#hBNy;)x)6+mgnh!=`dAWi$cGE2?SGr zDMR9AgfOUc0K(HO@x!7y$3CF&eY7Z@Szph&y$@#wxE+)D+oedluZN2Xy`#{K>AL#U zD?YlQ?rm8?ZopdEG~ukDxOJj=@v~!DMhEyeS|ao75-f0pHP!?42n7Oi`Co-|pmvs$ zX}Wv-4Dyhehx`!3x%o9EY`35nP1X_Q-)x9*gP^|71X#sdIM2TCNRH$@d#eJ$p5!kgfm2* z05ySiYxh4pGRHM4d0Un9@(~b1UpT`j6Snji>lrYD_1gME8D1|D`N4Od6t3##@L$XRNf#F4K zC^A2=hw)9nCs8@tT}AAj#kREj8(hJa{ReS?d-!5Xy9K?qS+L!gnH6bjMQVEBG9AAY zfCc4Ac7dFHh#d4ch7N&nM2_*3;G3((LPg;;klzssCLHML=;w3Y%5yZqNcP&##pECv zI9C2LEQrk}EVnFUuawI0kP|_yi|b)ziSusTnX|f3ltK${D8jcIY-#~F^^4b?OkYoX z_o_l3PBP0-v?i5g2oyCXtF|HxOi4h+l_C^BS{=~FXMa8DQ4*1qC?*|AD`oE!$33{L zuGbm9%pQVu8GN*|_>K)M6(vq%LWTIXO=hX`=<{OI5lZ8zP*z8VfDqd`%6<~}oR%<5 z$OQ{vr;_0tZSX|I60EgftZ^?|Co52K`}Qyd2Bz_#c<9AbFFkvt2q_5jr*I{O%%4mu zEDxgKuRd^Xug7!P5%D^es#m{7r*D(K*-7NWyEk?o7zIx*#8m*; zE+`sKbHSsR5;YbP<}8fdtWmLIJAh^h;B1ix;ZpS5_`V*pSRH6Z{Ff9ejON69q3h{! zGGJ|OBO5Pr(!6>2WU zEcbj3H8Eq0rzcDz1Yo^nh%yR-w=xz6!LmRNQE1sCLtJWjFC$(>2miwy{0%BMh*1cT z2d*O8)f$b`P{wmq;VfB%m#j-FF4tQTUaH3Ki63I`1^`+lb^uVkL@ozr z6UWO;M3fVZyt#Dqby*)?@2u&=@H2}YXz^lyDW9Zq88D7i9@5Sm+&tkXN<}MV!jaME z`c3k4peG&oruj^$i-&h)5EAWBqBg#Zfs*~U@0iW-bGR{K4MUm|N}+QSr+L`ik~s)z zA$2-kJxBCX;S*q<#>gYiW#LX5gze;j#|`=MI*3xgVFWrvN9x2UWq}guhOR)WSq9QN zC8Vw?D6APrbqIi`t9~*J^Zpk>4L z^_2n_&Fa^U5uJ)uEvB>;6f5V!t3WzgK8;HyjHF=Z1nd63YQ`(%9ptTslrjf?2;7S> zef+l1WowFJAi>_)iyiumu$`LltjLCU z*<9M&Ez&P4f=wQoX7_a?^qkJH>0R#R+e=?tR`T@v`)@|j2c*yC4E!DtVPn-#sxQ+0pnf%AblTpC za(>H6$^78vp3jY;N7XNjhDU$>v`ocCo$c~dv8m~b@ykdUA&kAY@-1VB_GX66MlLoW zh?*BKL8n5~uNYZxS=e~2{@6d)IOJ5F{b&Cyv+;&f20pB~?Cs3ik`}Fz>NkVctdo!N zmJX5G40k`Ra{JJF?O`f2eo%6@z{B8N#bm(e-kFeBuPf}%_D%IR@zrR$7I&$z-J;%# zuXSB|{-w3t9lJDH*)n=_=d}Lc$!Wxss7KAWFWot;)DZJelGMDfar^A^Wjimog{Idg z&zFDLjNclOe>P|>#cCzeTubvtQy;Rz**Ptr=!iUltE|kiS{_j(s%2;4 zBa`yTv%QPefiLZD=jb-JjyY{#k7o5>TM8U~^y&HA(*Z0xPvCLaWKdcEVGiEnOVsR^ zZenYgkWE8&2WoR>@HL`w_`lELkNRXftNhOTyEe`@&xGklbwB+g6>XhWvUuaUt?x~= zyHYrA{HGv%-yte05CM|VlDR+47#fKTnlwWI zN#uCgvoa>rlTOP%>srXXIHd&FqJyxoP^A}k&xnV8Z!Ef!`5vE9-Al^<68ZK;W#r@V zg6f)NLDweslF3&yi+Ir(Hbl_d|Ig~=)Wr&)5`_9emsybG`%ve}t$f!*W!8tfF`dV43II5ud8hMueTzhY&%L1~?*H#D;>fN% zUa$m)Q5TjAIkBqi0`i4d>_O)50RBBIiJz*=eoH*%V)&;1TLK^~ai#{eozCvE8=IYx zDm92vK0rs11@H;Q#=U9{dl>!neZ1el$Ga&YFeMC1{YC?mX;fNdF5GuV0~n_l;sO^+ z4-O)f5>3S4NVe&kRPrWo!YHh_pHEE9a4L3;K@OW{ya&|Rv?#in&`1v5Jp6j>dU!nT z+x-YSea5?8T8Zsl7Xs+_P-cK4(Y?xq%x3oO90UUE&gdq@K}|X_2a*C90#zuZ*6fTW z2R=X>9?pmkhIKX^7r#U+_tcg^z!>vcHYh*xpQnEFj@%;NI3#uz!z1581IUYnHH)43 zm3j9l@Pg#)2o6Nvp&^dW{9X>u{U4xIusjGh@C+7$vxML*OL^)00oCXJBkB*N$-jS2-7)Y0;ePKpD;%oW=Z5CVY<|HdS<;GovSYYqY*v=4FrF z*dw?~8cTNNCJ5g-$=|((*@U?$lFnCv@Gk8!KiF09{ zhZu{g8Vk6hq|aH*ypCZDw;TzH(WOLz)n7EhemnrUp+4FelDY|(c+6`hBonT~R*l%7 zEXtEb>m4rAZdUPCVUaxng=|cf`Q$tgsONtGGJjN5uw)Ajgu?)@8XR2*Q^{1Av0$EX z+d@im+~7Qvw^2Jioa(ATLCL}n50>4|tUKsj2~T@0-$B4N39dX$e<>mOSNQA7hJLdU zH+81R(1w1?xWxM9T67#doZ>6R6u29=_O)2n9e_e&r&&VJR0beF$KHG9KPfcL}Pz73$fGXyjjoER~(Kw8R%oVmfWLQ^|9r4(sFLr z_7u%E|H17KL5?RnXuGc6PtVx=9Ju#N|tG{B-}?2P}5^|6XCTlA2|-|pp>FT6t=Q?uU6W~Y)LB3ed-r$|wG%0J#BTE}ds{Vr!K1U5T)-Kc4v z_I}pn(0Y8lUT$M$XK!z3kp{ITQpFf^vpIG7OQ@I zdhPwy*~KNB+4Zf^vF9~)oAT?H9Ry#{LISUkgD)1qjKfWrH~_6>e!ptkA5DkR2|hkG!4D(@UznB z;!&&sb=-uJLjf0_R!dd2tHJ$~mh(pLr8$>)3KhI9o&=dvkP#+u4g{PG z;{*vw30&9_)1KHD182zv$h)=M0ic(;@!TLvf$vx<&N)!#Ml?xL2{PCEoMCnvwk;6^ zmZOm1+T?}Z*HC6*)vbVAWh(&_C|F9?i9xp$wOCds!s3AtiqLf8zm{g9k$ckN@$IDO zU8taOPCjoy_423jZa^id+Q1Q&f!vZYG;0TO!UR$T&y&|_^-w427%U84pO6WQ>k-z7 zG3g8evN|8Qu$IVu*Yuh&Qu}q=K64NbqM=z)95D8_7nhQ0$<4^C9}4GnQ^3C%Zoxfz zagf}1#l>9g6=BdyPMNJTU%dQ?q+HM01!YGBK=r^$b?i} zr0VVRL*vzBq289iZCD zWSXYJ(qHwpC1g*709OA4n9Bnhi^c+8Cz&M*5K)JJzpN(^ zbxG3KcT`#vXh0aLuSCK(Wn>}b>gmo;3liIG+RXl~Qo@Fp+QoXqF&d9BhuCDa;Dd!W zf$HTs_$e(PDyLeHWiGdPh6aQR8h9pCuUnVRs--z%4($UnAb>q60WDQ(EcJ)-NKi&< zEwrrdU#*g*)xv0IkHoQw$2_N5YsVSyuf90d1ZqQxE{?ze%d@3^1H~|!4sf_}7{_Z1 zmp^GA@()hVgt}ppcc!S>vk>aNE`-J2l$sd)l&!I7ak>?I?_e7!Wb$ZQi@0G#=00FD zQx-^A$-gcr?kH0=t-?0FZinnOiL_#+&lSG9FGZ=vI81W<01RrI98z-5XCH03H=X&@ zJRAt;koyd4=OtfW!v^>fNS3xohI%eE@V_bZ@++QwihaYbt1# zsJkkn_x*0&1t|Ifbm5+8lV!~3=x;e_8b4J_Sgv+uybczU@TTLD!=o6bL&vl#43v*i zd`1?vNCVxA3_U03MR;IuN#l(t2|?sBRD!EZM~g%h<}^i>ud-y)rs1t8lF$9)bkj7v zd{!cF>JZ3v%~jeuS=rT6tMdKcnNT)HQNjD4VgeOk$i=`utK6jO-taD+TSj{z0MMIlt5y_o!~rxaA{ zgm2bsk`-7Al!qU)F>GhQdV5IS_VTGLCenZaojm!wP4Gj`w~-)@NaNadQm8V)?$9yZ zlZzXo>jKGyw=rDM+{f=K0=OSxt-ZywM|w8nzfMnPtRXX`O0^Y=d@hzv#XJ|C>}oA$ zL5oc|usn10-y;`#Ko1_3;UrA*kYFdkJU@-XUS<5;1Qy*G!fiWTAeA}^b6 z_i)^Ytkvs`v+$=qyYYu7oU{CLEU+R#Na0x$Yt1fMu$n?IQg<~ zIS`G(9qMdU!L`nxO7wDk-qU?K=B;d^O!|2?8iG( z9CCe$CB(GGDh9b}8K&r3w9A7MXc$>z)9%n>FSNCn!7bh1VL11cc*_-`XRVR4;Pd$F zo6W;j-r#62*?im>jm+sLL<583+k^+YlUMl@TFLVyJ~Y_Zy6!Us8}hxdYDa(WJDAH@ z2pDPLC4mfqKF}Y0*Kx}i^}BK!Ad#ouCXdNtjpopq*@nF0I9pMYi_)O0%`}HL1s=$) zgN-b15lj@Cs+2JnZMSxAM{<%dGj<%OF`v7~zb;rf3#flAP*xvyH zjYZNGJf?GOjXuV=G(jh1Mt>rW&CED>A~;;Je&_G8e{0suc@Ej4xBJ3tMI_tu$hY8` z1L)5$>QHI~Nq3_ysJ4JCmS-QHKm&->o00sQ6Q1v39Go0Z35^uPg)pG4gz|*}0Qrs% zqB%>;OoyeUjG4}X0wL<~V(R5gIC`fY+H}*We*V=DSS26MdRwt5B%_f(V<+JD82md{ zZzGmKyWu7@naV5Un1bEndDTvWbuTobls_476C{<@P)UWtP5#mW@dJ`6a$`|O7LD}B zK~Bntw>M|lWmaA)8+6g10)j|{Uyoz~j6NQ{qzq=kL?*+H1%};n$!>>0RlNkQ!N5h% zTBxWcGrq}FIzq^V&5r}b^^@{LnH*s|RPY8V8SBI1*>@ouF0PhZB+zd$pI>onx@DklTSz7yOuAoV@ zbtRw`PM&X5XAhFVLJ*!1#vF(5sOhXrpiCEMvP_Pdv}$bx7=Hh=-GR$@Q5x}q$z)by zm8fVULSXw}S{)pOAzwxUl5=4LSkrEFBr>!C;f2LdCX=RIM0>ViKZP(Ua}>IiyFiOt zqgEU{JzRPQB|LC@Pl0NEVGtxS`Ata-0%VG)>bQ#T{(fmJaQ`V(RF~s!sTxdsC{an- zG$HHao{et4#O_2e5<0Klv6}_in$k$HmNiMblqL`%7xdDyC==QV`NeD789#u>%d#+1|=z1 z=8-`Bp(I|M7Tp~OrwY1gpHrtTcvz=kAt9N~LNUwDbDh-8rg&X5vy8!Wny(WhQ%)SE ziW?pZu0E337a~>&UDh++9~6irfsSqkbKM-&76on{(#(R4<3T10Ek-pZ9&jG=u){Q; zpFAp*%Xz5ZLISua^+?2zAMnY^dwB*+^=p%E$l4OJv`h$+}oG)=PTz^Q7`=)WgE92#x#^~oTX&t zJB5VbtkiUVqzoLW%%r_7`V#n>_}+8hS*O?IoTiOUPm^2jk~jV14G&LbQS8^7xcvOk z7eU3Lz_Gr7Sn@sezekdSyNSoz4IA$m_GO=2#cNLer!3GgfBmQ4z(^~e_Sb13knhEh z(+$Iv{Oq^F&YG!R_IBnj-M;1yYYul9pZ$8aKW|%GxAJ@{Hn}b^rsVFpLA`9Y%ZB2 zAB%=PHr;%xNgKJuHNJarIkou4XCPCukkmC#WzJdKxZzIk8*?K#iu zY|Jcca2X97ow)GsQOpYqH+#Mo_o~LuM3#|M&!o3lPvVXkv$WVVWZhx7fBGK5bEX{m zwBL7NJ#=RCna%EB%a%#C#sYnjvtB;hZ>;Wk^~H~0D40$=dS^u)aa{Au5{(G*RPPgO z$S_$>aIxjK*rX?AYW-=WZq`+O)f2sCsc*&0s-0B{ zU(JnhW$uS3IBmjZzYdLxH4u*%$0Jf4w+Ra19vg@EtUqzb#-3uYMm1f^Dq?A+zc%Cq zt<%1&Z75YK-E6LwO{>Ze&vRT0EEi(*W;)j)XLL$B_D%(7`&A6REaS6_e%$DI4tF1R z?M0g9^ZK{Gz15od>r#!yU!H7ChuArIDI=Ykbu+owdMPc>pr@}HW!*h>kMg^!`Lkr- zji(OpD9*bt-Jc(3%&4CJ9j@aYCLHV6q|-I=TsDbO`9LKcDV}YFy&E(6GqI{9OJfCv z&Uy6K=Be$p#+Ktv*RUd;7oWeXm=Rnf;y-g!a$v7+tI1YAdy=9uTD9W#bngo~I+!cx zQlhq_S$h0D1HSL{<}v@V*d}4k?}Oi&#BcrOxc5lk(@Q7B4?J5(9ef>PqIx#OYxsYw zRxyTLTWn^Oo$oM`3YWw-SN43}-|bbShWTr%dSV*BeD9kXTcF!-+7ubvT93>e#H)>p zS$-RL3?2UJ)LWtQ<%FsjmzP)I@tEJmnrP)8DZZ)ySdVf#8TqPJIDW69^I?p5+`$6m z=TO@4LWRv&;_!n_wFXni%E+0ezL?h6Yz^m=tP#bR&a+jqr3)6Ht+VcAkz^k(38t7u zD^_)QfB!x8MO7@jNIvSb&j=sar;6KIAy3EDWA;1(y&hP5^Aj&^X{yQ8`B&~&AHs*7 zJiRJU&li3S&3FP0%JD$je~_&3OM8^`*dlOj)8AI7s#6p5dFFasQww3fdK}c)f#iGQ ze8Pc1_GG9|{0>jvQVS}FX&#)}dbVMtBX`ev>5*2_e&CD6R;$$4X`d%NS3NcF3tozr zw87BERidH-zl(AWhN6K|UpmC;A< z)SW|XzW6;2OC%pW|Lar!)G=iAs%A*d$i=C8`shF_2QsM8k6Ab9)}VFv*ePiJOVAhU zsAof3fn*RDK{0i;re?mfxC-a(7NwwebE0kRe)}HWNg)rLKey3z5-@W`~lQ{Qsp>1cNIM+KnwM+3q zRozeiXw9A-W-dGUhu4qjmVLIhd*b`+wc5F&#UpKVu{SezmLo0Kq{){aylQ-^ndZDv zH5n=-kzyLIR@-^$oea1Yb9iSavkHF<2v`Gq8^J?P16P1lji*0|8hdNy6q z;agDErQy$4=NI=*cYP^)@~njzCrDUqU2=GuB5Et16;%h)TejakzU>~p{v_m+_D7?< z)81m&UueCn)|skm{(au}L!n_WF%g)D4&CJn)gn#>>dw5|P>ww_%IdtW0+xS?FRpBlBHWfCYhCV$h}hO1Zg#YPRpnPxra z{!a61QaXC~gnC2cdwt(Y@>Fcy$nA=k(YA7TMn4*qzjd|QajdB!IBaO>IB+>3J=DgX zf~r59!b}Jy+E#j9iKwsjvQ}PKUbp6C%Y;wBB~T)v?UPyT#esJY!Vti^WIRt%gg;)TldEq_Caz zi25#{NNy~3O^S8BuAlI0R-Nr)KMPfDbn-?7j-BzBemkRF>ky@^x$93He*Vzr{c+S% z3*nvXqw2Aag17efZ08$JzZSr=TK-+RSvaom)#0&oEHRV+Os!>vSe9Bg^U!)apej7* z?6KF1_~Y2r;ndb7ud&o{anmaBr4bXo@QBEf9lisH=;*RB-8YptL#*vWx?p~9KH5KW zT;F?*>P0@sN#yrDS~~voQ0+`yrRt>An{U^%QyiXUwIp8nqW@0zwf5Kj{}Mg_Dz#d? z+OXdFqS@qFqt(Ci{!VC>_WSR{x3i9HbJr;T-})>=uD(o?Pkr@Q#nMadTu|?3PPBUx zdC4UGv%{9!$bWCX5>w$MMTS+W)J1h~%A1pES=2yj}iTc(Ln8#0^bk&)pBt zpL~#xu&_&bQNH!nCyN-adts+_at(R*4!JC;tYkTdaNRgEec_Fo#!K_ijg!MCOnQ7z z_C3sYWPOz$4321=^4psJQrF`1th#aT^Tqmb(Hm8#>n|HwZrCWc>V4$M7sG4y{LtE8 zD0t^Qh4r|1xvuh!(pGk=Ds<%aB`LW5$WyBsljED_4doi2Wza_C5%2dWjIMKAdH1ZT zUK~9*n_bXA`9`^&ZZow_4EYqPuVr^^TR;ClKqWDfMeC|QU7gQ(@F7dprfl-1i2t-- z{%%=BEGO&BRgbcd9-dx7C)G}WykT0QNdX*C-s}(ps~)jB8Y%>@Tp#{=QuE})b_+zL zw?VC!_8+*}E;7D8W~Jwo_o2Ec zSM1C!=|m+n-Ns#Ky^vqdqyL?I_o>M1V|l0UNi&Xb-;$Q9npAW~lF!NZQIb}rg3DUm zpZA4D+tmFg=k@J5{$-@StTzAfF~s)l%lCIS+_zHsg7?Cdk4-NcBpnt#f%R#Yw!Eag z@EmKr6-A0n8`w-vByz8%S4m$+?cayuR$t&1g!|NluzdFrkS_83| zAJv-rKy4hLciXmRr4oW_nY{O281AZl4-FUm3($`>KKwyRb9l=@c>fEjXZs1YW2I16 zvf>8?i)J@n;!8*MO3sWG-)*Tn{gZg-Op+;GCf*!-P3ams`e|$GeYd8PR$kP2!;v8) z1(%DEzf4`__ z$BWRaN9Qx^5mU<}FMVhQSP5#Zh<;bw50FVy4g`Z_+nZ@7Z)$h~z*|tB*jP!KVxpvB zi(T$sr-;Zh+bSuUEcrlWfJ4wzMuUvid#W6glDv(gfHK#9{YdHsPG`~hD2W`R5&L#m zqMP-T;Th9-06<(9Yp{;!z_m?BxYrHD?hoimqlJgcBln3c#ok3GK!0$=`AFi-PJNr+ zt|X$EvnCgd4oTRd!ZgP91|-_#?~ZbQF{ep{zK4q@Cj3qiDys9+=7j}z23%(RZNos$ zsgO!JRiT1VXp_n8GKeEqf*slf4!TriF8Sdw01WK-yY^-*8({dV1S#{rnirwuTWnb~ zC)Ud2cZG9Rdl|ge*{uX75HWBr!I!dlSS}lobok?fKA;Cy`S#^2L>mAzUDCo>7=IhY z?szJ&F8`H7B8@922)3E+drm(zZm%eTy3{8q9rGNN_bj#FZQ%%Csh(fP_jrUNDe<%> zrH)ap$cKr^W`7^PUa1%2xwXgm3lQr|D@;+`#~{f7JZ+JlGS|icS}H8-bTun+r!8_6 z(-V~797Li7_6P-y;qjc-iFpq#>!m+0Qpa-10u4-Gcg9T>zV1Jis4!(<1n zxW3*8b{%18I)!aTi2@#4EdN*WBbeT z?9pQ8a|u?>TgiG@;WoKuk*WG0edo()V)crwT6*3$N0dT(dgUetluRj<@j?nK8v|;q z%ODwT^B9G1U9r*6$3E8&Vk~8tO76J14jv6RvrKM)NOydjV8>&xL0(IPAN21$0md|# zF;KspQQ#xS*_>8+uIRZe&*W3#fzGJYAOZa-{T^Hvgf3jqtO);=%oubbySfR(LXucY zFc4{j^8Jz$8u2-3d79-7OfbD!e>j;vrXJcx@2suHst*|F@kWTgON~KFPz-vS=kZS| z#=$*vApo8&yV_S6Q^yAp;$CA_C zh!H+I9k(|ZO8qA7_Qevp-z{&$xj93_3PtAq_}3I01@r?wa6p*>SjaFgrJHU$fGXqQ zY083!eyeE#E$L@bsNY4c79oSr(ri-_2&kd(7EKWC2B=Xo~goCh9|7;T3d z773-=M8pRY;Rs`wpD3?InXUVpM>0W)CmivjEU|mDNV!~qA_bkSz8a0*jJ%XeefMUM zvizCPZie%geu`Dme{lx!6l{lHIdCsoRab$|AfQD!*uxn4ID-V*35i~ zqTLC{`_n}?Oi+sCEFNBJT{Gm@=^Y3a%(=4a8fA1oDNo9kNKWt*NB=9?erlX~9^hMPIQ;Bfz$8$(7QD6gMXsJ2ttdbW01)ZvtKC+~ zN<42ndy^M3rUt=l*~zNqvp8_%FAg(~y_O5--SBV@!9YoED60fcG7Lv$A|(Rbu5j@D zjLM!O&u+yj?n_}wyy=rI{q&y<`8#*>C?o<#jmQOu5_ySKcgsFwli8i!tRy=-GiC@`^mIQ& z55uj!qXAC=U0b2c7`PU=brX_PA_k6S0a8^N-P<}ExEsIqD{+>KnHr^{qh)3TdML`g zpa#key6@?00rs7%o}uyP{|eKe6aG3XJf!TQ3Z+-D<{`6@zZG0M(b7|(PW-jnB2B)4 zJV!s2i3b-WW~VQGjti_J>!SVbkWRT@8UoOt7rgQ!0Jh)8U5m^0VQ#6h)AKQ-*@X(Z zu+BWjepf)0APK;Ab)eyn5H4Wab72{$VCSf^_opT(@g%?x!+-BP zU;vIr8bAXjMH&Fb4cc27^%`E@%LWse@wI<2>acL0IzYPd({}xCX*_XDmLx>JAO&Hh~!{3V^_Dmct}<2{Vx>szc*NNiXNm1(?Mt zjFQ1L%xb};`L%`G<~d<=QYJURHOO;<2-7zEZO%IX_S4MxfRm36k` zGS?BV&)^9*ydVBSHeyrfyv&lXQ7VGJ3YQ=qvr4-Jr!1QZ>(Bi#P9$FFNSXY(sMw8v zHQ=W!;3jRn2Uz7&exO8W3EgY@Zx735#`yc&5WnzUQY1muyvHy(V2j2??G?^zbKgHB z#Y|oelE4|I(X$KFI>|um8;peG`1AKKD^vr9(k&1qgbj`;oITPFE2hFv z>o2fHT%G&fdQ!Aidk8O~De)qc1Yk$=0Z{ELoU)fwR;Z%oC$mJEB;XtzEdBCr*NVPC zngQ{|GBHw~7`?yN*}lSlgj87Xe&T}9D}+$d(&)M(J|NSg9&s%e!7H7y9F_Oqi4Xi_ zU3Se-edF&}gDN$3`nYRoZ)KTpYid+kf#36t&#gw)h^yw6tSo6{35|8+En~jrnBste zmEq4W-NFek+n@X9g(DV^*d7ufnDaR&qTOAuJhjY}t6hccUJ`BbKUq-C)yQT*?&lC5 z+RQwVa?LLpEm0e_B#vCc1~(e)i5p4>O*vz#5?JhmbIDa}t{@D=pQic2HCp^rard9Q zny~aUleDN3J*LpmJ;@DY+)9|&Tg^s?Zig`$6H5t0M9e(PYGTnZvb{_}$*pQ=VtU=SWn z3M`gGCqbkpcW<;-B~nRI2>*QQ_H!FRj6C-DyX4GnsY0P~r|9hh0SvDV2$?;t%T$z7 zyM_kcTNz1Nh4ig%N>H!Zot~S&|Lrwe@BYvAD}vjrZz%2jf}b1Jw`p#(4V<&`?7D21 z{e^wT&=jS3x90kBHk18w0&TBnuhySnQU(7gY;dEKCFi4L*zY3M@t9M7+H!u_T)&pH zmMH{j>5+@r>f(+TAU(SJ5|nY)`#+jkb4J7{_z&=SZE9(X0$df3<>h!gJ$2S%zvuX_ zrNTQUEau7XZfsv64XTf-qhX`|#0ul&+Yq3rZFKYyG*^+2!|OXhPx57297uND{Be_9V0ul#O>URgAL++twFY^s@4*6t>Ct`y8M1o zrc~j+1^hVbpEG*JX;Y%8I4C56{8+`&4UX3}?}uuyWFGx6aoU}OoK(rWC4;-tv(*Cw zXChlt7^FvOZ@IAq_ePPZgpQrR~|?qRV>VJPLqP zJi1Y%*Ptl>E|WUSbzh+otP6en_l_v7|Uj&3#`QzwpF)-5LFSCrI{{;|nWvrO`cj|T%+wqJ4O?VpB&qu`?h zaO|ty?<|C^1YJ=sfUDrHD-j?Zau6>v%g=7$j%QziSk<`|`|4M2z1Xf$_#eRD1fHJL zRV@F_zl~{;zaV?%*NY1M<>;8umHnazw}u|Z^7CdLH+@Lj`KRgyfZr>>_(PJ74G-l> z3+d`5n?FQw`Br+);C&_FOz8bbZ-TUczuKKDwQX6LfFm3MWU(F9PPI{@mk1JFKK9RN`tEzbPpK&U$;$8bA~S8sK*)zD+tE zWxn1xH>K57etjL`TT%J)Q%tMSJdtU*kLYm5sA{A5z=Vh1zPI=+g2w?KLq5eNO<#QZ zn{yIthAccirz;?;srg+_fyYx>4nn3LRV_ASM6Ds!i|gVDdCnUx3u_qrIyX9PK^&_lUl&e-x~WuU4kIXf~`?gEj3|=Ba{m+-NdNnAuKpe?`7lT-&8OUwG0Q#P>qLs&Ps_|EphF%+kov@Pm^WK7*SDmU}5S z<|xn7T`&;r*;wGiZ#-ljP*{n9RRCB}1LH)1HqE$8f`musdtK-3!C4Yld95_Un(O0r z8@oxc_=zYXo%?-gU0Oq<+}$6~#Dr&El*cJ|(2~c7;t5E-nH0z3#OgM|DHSjfRb-@) zN2|fZG*WR`2jZlJQUF4OwTV(~j2@6R%a{n#K2SHZ;QVG*>=Vi*j!WQ}e zP)_Ai7U7pW5NT>$*h^xa0$zy_c$X>J#moyBB*3WIcGFmlya|X@jFw{5U1(p`8aD04 z5gK46l}N|u{H7Dkv}D;vkQA7DNPi!~5kO{abBV^{(5(?6Bd7iyPco5CAE8o zbXy|}p=X+VM8o_^2p<{tyTfG{p3$B?%zIMr{Z60?4CG_+`D+A|>~DuLMv^EU$8aA4ggl|&&E88m@k_&c9xef>8KVT`FwpzWvPP-vK( z%#Ed82I1bwM#c|Z7%-Ei!B7AvV=-_*LAeJ75HsKy#Xut8 z%kuy@B;Zs`rbH(iCPf>$?XNU>=@roNAy!6Bg`@aX&zzq+5>AU`kUT}{ov%u1BFhLR zBfg%bSNz_1CW`E`y9LSy2Zk;5lOV4vaO5$a*R|5Dr1K=MPzKe7MPXEOD>qqBu z)n?Ph8a$N{7LYv9Ps{}kC=72AEvC^#N9fU9iTvOLB*?^5LI?m4~W`1f2ln|3O9(^2is?nq)nkpJWA+<%(*icURNCFERW2$78 zxap%L8!6dOhUghnbwY_D&wKc5Gg{DCgmDG;v|frrE4#G0e?by43L;va_>`qcBu|d5 zGeK}b9+7Es4EOu}iezH1ra`ZHM1M+a*v8p@6JEO9eVCHbnRmni)ZjGevM_bKIO3@$ z`m{WVi1PJHnQ22p4kXg8+HtFEL9@r zl|J46EAqDG2T#!#cpj5QI34_D%D4nx@$~m_hWsT?J;v=8kuH108+1+_H4o9lNiy3} zpqat%VSeF+5-R!08wnk{N^Km)0_~m2nG+la&aJ>YG$u>M2dF60F)E5pVY4d){lX~J zRGk>wne$G8iUzkNA6@74G7}iQ%eV|1u*dl-?E}>eUqYKm3cI{)Yzi!+)kI^;m*okC zph8D~Q(jRKpDEXN_uyR$txN{V!)nAYvf*N4VGq#DA!+o;x9YN8X$p}8OLd8pJU^qV zUirl5`D6#Q%~KI6BVJ%-pGU*4jP62pA9ZSxTIpgs*2~3y0xcYlKD5WL(uQvbg1&>2 zh5A%MpPit#3!b>jM(P4BTjNoEk}|$mRZ1*GRj=aI05m!j!~sm+ z8IWWAIlH>{&J^QYTh9XqDWRyeVmBJ-j8u|793A?TmQ;u%&Sx~>toEI(K!UAkdwc*) z5fFVwWH7Rx#j51GrHK2mqyC;2CS~@NS)NOF$pi@ifbyw%Rx0(AgD6m?QJg#=vu$2C zzCY?m_L?W1UWDM=7x({Y_qJZK3_>m0KK|3$F8KlFuG^>(lq{b5D0B^e$ktM+g91#r zu`7%`&-!c!j5P}fLEl?+x3UlIXW$pl}3bO=BP*cyd&&4SlwiCwnjOd&KIN(F)? zgr_{X1@$=a*Ji}jO(xme_rV=A?YSQbU- zZBm(9JTgJ0{Ab{~lnBYQ0Hl-ZOl6D`QmvUc&hv2(FR1ejQn#37h5~3PuF;PsdyULX z*cUpbETx$b*rF(?SbMIBh(5GZ>0R2p0Nb4CXF)DXB^vx-q@DoC3?u1=VCEG0Y+C{w z{s%BywR=^5M_^4IfQE5kiXwiHCfQV2wR3cx+rhn-iI>_eox0$;I~(U=ptDHg8xH&F z+No5z=UA?i^I$zL1`oXG#@|zQ!(5HbMjGoWIfa0po=R29QtVgckQ)_D$4B0>Xr$hp zESs4vZ6JqblM)j}B-^>JMQ~%*ke&!trWojGk)!+(C|zk}{f#IHD}-|sfD4Ii64xiF zW1oBAN)~v(xdA`$FEVBkyM|;j|U; zV)}s$!Zt!o(Z+4$lA$9s3!TfHMm7s06)j5VA9O?Lb1tUC=-O!&9=0}a$!Hnv3$w4U z>Fd3B=kDu$zkBXEzk6TB;jYehp| zZ>d2ZP<|_``dN*Ilh>P$UOwbA^fsmk%rD2T=PK%g^}{co3euZcyZ@ll9yaS1AwAe% zKU};udYYjNVz%15DGzU=&*GI}{Ybd{D%rr$WsyV zd5odyP@OdG*5PP+SOZgwLQ_Ka2!8DMzDI822f#-9aK>sXa_=UUo~%Gi!O|a`^bXcU zK)RuGjBs+;E+iZb+M-$wf%_}_NCVoG#d4Up2W{6Es%-W?E; z^wS@K3ofUOe-PlFV)xx zG8)f~bJaF*4c-6}=5~1LF^2NLGE~lCaA5kZnqI_;|D6AcRDguelN|p(6e3>L1la zxI&rxQudp8t_0dw_YufaEA&%U+}Q;jEk$sv3FKS+fjI(%T=AT9xsx42%1zgCpD_Yk z9Y8j8DyBm%nLa9;b7#RiR7=X+i4A`^)fv~W#Z{36t$@GnyvWcJ@Yl0%YXjA~s82{& zaed}>aNmbMK_7Yao!ANmY+t8&&U~Z&t_`Qk!JoUl6#<1tV0kz$!SXP4G9<0%w&|hF z3J4s9;G&bE=Q!ifyCo6)m!XunCw;J$%Avwq?o<=UXh$f2o1s6AfLa4$tOh3k2V~kS A`~Uy| diff --git a/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-tts.jpg b/apps/ComfyUI-vLLM-Omni/docs/images/comfyui-tts.jpg deleted file mode 100644 index f446de2a004321f6ad2c5fccb4a6db13c7630a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309855 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.nTNdLFh&#e#oD@@9v}tgq+9*PJUl}di?kRnUFyMDm!QU{{VMR+2Io#f%6H; zn9ecxM?uqt5Jy!J6PyG1PjB78kTZihB06>MXQu!lB0vQ080qor+wcC~5Fl;Db;%yM z_)H&;2gig$ps3>jK=l57cvyk~^1zt~to*(M_znO)!c_)y>61S%kK@PCeJ$*wdv=>e=StJPQ)MrT~-`V^)Q4&)!4n*QJ@+4z`Iup_W(^@M^X#F>D&>W-XCWN3Co?r5hmi9%wt3Hs@*7+{F1CPI7dA(OH+l}Vw zQuE6+w&rbin{O$Tl0h;sF^=H+{@?d3c}VNrPkduNI52a70f{8ce&1dISP&$r%!v5@ zKR%pnUQlxuvy=SV<&QR~EH)iYS<4<_XwG2L>8(#ln}(azH5xZjTeTB5JwZlDHCAi0 zmgLY}*g}xwlyAJ2mWK*fHOT7(6#z^}$M$yh5uOkL5g>KUs9=1*nfML>?VrjA?WcV9 z`}UE(dqipuU1?reS6#H;n$s=mtt9FDY&_sXTd>uy|}prH*~ zsqHqDQ>nXRUwet5bOBS=41A}A49}P(X8?b={r!F%8IVR`j;dCF4^F>6_}~OVkP3{% z2*4hh#y&!SXA~>l4YlE)wCbRctc0Y3Ps1=fPu<109c`w{mSHIb#tACy5+rUtPgsnT z0LB65l=GX_8)8C8ov9O!nK|p+ z-M@G5zq_tI*L~gbJoh>0d%hpZOln%dM{9`k3)t7xZs3h9CW8~Elz9+L_74n;2N0IB z{*mj^XH_#t6B=q4n-4pZ4h3goSpms1sR5^0`~|EAdnl@6VI%>R)YA2c1K0^F&d@DZ zux4_%2F!&Se+>XcDyRo3Y{cZ3}!SsNyA8O$5Vd&m51;P1S4mZzThGz zm{$Imd8=y5tT=fo+JWQ?IrIy#K~>n29k}!5t$%DBTXa1e6edbR5lY60t6+vsRWjzi z9Q!h#jbB=&8ETDxf?UCef!ywfG?l#}$b}%`yKap2rxo8$8G85zfR&^d+i-QKJ zbX(ksYu=0PJKBl|+Nv6#zg^z;IQ^5$Qh0bVzT&Y@br5G=dOXK3ETPR&zdz6{kY3iN zt*yOxFIRr3AY<*Z+1zwEdAn8|2oAH@@{ue@;}oy9)bkxD|FzE>#OsA+tPw z{>|1_vE3SF1;UbGI|HbSU#Xu4PRAjd+lU0si44}_P3@Wbrr?%zw?@H;pJ*q}8RJqc5&Nm%> zpS=6IB-iq=D?=t}8_p0~m0St_N=h>T^F zj_c2r;j#B|dN%jm)l&-`HV7`Kwr;4AO>|a!yoRPRlIHWZ17(WG{NY>Xwl`w3_kuD4 zF;@~@5~BgSOZ>(~)641UcOx0Iv~6=V*(q7mgXJdESRzUPYw!a;_8{Gil$T@&yg94RuqOXLWP^$6wbrP_~qkVq#Cm z)aMMA^)V0P54{tJMXaj=>C$%z;tX|H@k@j1XnPNH2WywJh>v0hCI!tz3zBmJv5v(} z0S&EdmuYD&Fx_Uyg4q}TLetc>4kJzh6~QV$`Zzet^xD)rybD@bkJ)&2(2FXfU|m`L zRDbx&vu65Fvsf*kPS#vY$5H1tO1E{Xq~$~91%iD3lGLZBG%cx|f@C$PSzDV|&C6l+ ztR?8fpJCI_T4KI#J?uB=*0Vh)NwS=Y<0rFYTDO+(SNc2j-T~}a zT8~u~&Z8zU%`%J*XV1W+?G5 zaj${9DrwD~o!yM5PK$O{?g~+6nQmw~cFb`XU3*wcO=|BO^t-0*&`wdklQR4A)K{rj zRW7|KCxx|BYv>J>_YXizAm~YogP%V~F)*O7T!W@I{{bw%oj?4ZpU>u`(M_Y_l{0YT zOdpdO4X~K%C^^&>Gb!a-@U>_>Z+rXzUu#FyR(Mo2Mb_0|00<`H@VL80&dwGe!m2*Vm z52o4bCX9b#{^oQ&9ughb`SHdtAYhz#Y+~%imrp*X503T15;pPOCD z?h%c$(>8~$Ql&LnS?Fc&6f^TwSw?cJ2t+tsx>p6uYpWyb2%vU-?2g##jc-am&&csdNQC7H)6tJU^g2oz-Uj=&TN#0ETTCtk zk_4)?Dy{6=qdRo>N~W6KrdzU=_B4-L;fP8DHx>2v!`Iq$klM-u=-!-mQs+I`m3cu) zPFKlqyQNsaSv76SC+nM{ZHH=U)uiw@y}4G$nOWf>s=9Mnwa$FHHIaWN3elC-ZWFCw zlL$*`sQZu+B1uYe$0j*AvVAi6tX2xs6-N!N>1Me)U8MZk@As#LWBu@#p$jww0e2_T zNuKx28n;}|YO%6cT*l^5f zLVu;1bwtwTv5Tw%dBHk-Sj(T=&}-giOK`_;Xy5XRsE43wb>D%iAiI(OGm(B~i}0L< zdtYKn2w=xAw$A(u#$ZnoSqA(=-+?l1 zcn66Bb1upm5y_-9=V7e8&)Z_=pY-A5?ZV70Kwgky89Ekb({ku%^z>e$Xl<0U6?xIvyyZ1vy(*vJ)`L6!_8$4{ad zA~0sN;)ejb_`vS3nEv?W0vE@0KInU+Ctfd3z+~|3RWK^=yayP=%I2Gce;FSq&al># z1C2s=^nO1+JUc#JzwIn$FNpijEPnKgEWQcv5AKW@{4_4PhxlAF?BeKCenhbok3u$^ zuk4^&`pCkuC^I1WWejH76YsU!$@=&wiWu|tr)l1Yi5`sLCGSD0%nd0lHsA%8#Kgpn z(-#uWG870SUkbf*h)IJKj}%|NXUy5Hx3++GkzvKoaWmj)9WuU@%s3iA_ZXPi zm&q8~B#RlqQ1`fdbk^9Ll_1L^Uw>dpyw6wX(woJ!u~r36RC zZ{^%w=8+MwILGBTZruCq9f8@_G!PvmLT@IQdhM6rL}htFo^ z9WLovL|XMK+U40rp9!?Df(Zqte1EI(b4k3vuot4Z<^aT+!NFzwhZU;HH{Lbg{x!EM zqeP#FYb^CE`Hp$q_>n7eSM!_Yvoj?vA3c&#j(+tU^UF0&s#=Ej=>+EY)&A`jacy70 zS*5d8R2lO$wNm>koTEh8ChjxBC^>|cJ8{}9#cOGfG6&dO)+_10lr4UWTDv#e8n7lb zTZuPbQ%7r769%ihMm+f-{rPWo#FFfP&UF^mX&Q*tc;nkqaobouGvLtnfETpPv^jNH zFZ;YD8{XgHe5vhGx$Q4yWP8apaulwKa{Rnt5Bm>r)}rwAcRmtzR639mi8`s?-94Ue z?QVj|{0Cq)cVFvUMWFknTANFm+1LWKMIYB#t&f+*1A!IlM?30+Jy%zq5c|s z1*Oy#i8q_QpJGhjVJY3h2M~U+{{jDK*Lk!paE30Zk?q>Z;uKsaf9TnR&`OSdhAPUj zLTBmx$}LLoz;hLr1Hi+i)PKD=AgK?Jyf%RvCg9i9rbW5+Dw>Z*29b6p;iRR~Ie4eR zPU+9=n83-K;>&4R*3Q2%z7dskVyKER2`y*2{)nHCN84!iMCG@?UU}uYcV(zGj!*2b zGarq+P-PBoCiVUOM{GcA5T;>;;FliOmn%&xF_7Q2eMPBS7KIJfT1iTRyr+?|!Yz`- z$DHQ-nQaH;|J=li4`ISwgOY=ec(5cfA<1+@>%=;XMf)k~DX9nMshFd^TED<2(UO^L zI0w1?CKdV8zZ}sOn@Eb4uyUycLIDdHlV2RHGJQ-6@91H1#aJA=I_xUQ6Py*+Dygp+GAaz@ z0k!BJbmCXHjc^Ru$3rly7IR1*Gze2!a4!M308&F>NA%(QctxF z1)+;4$)y)3K>uep_(>9f!2c$mD&z8rr+R3MN6fvGP=(K23K=OH%EWo2gieOuySOG4 z0qC&OmZ$YGwts{mah)t0QgL#5#Yrcmc2=2XF)`?1xxDZmMJf?ZNe=a=V3j%OY7uV4 zY!c-1y%$3^jk}%zr-r`v4;5^_5OZ?zDtUt7<78A1Z9`g)a;a;kis&EpZd>91RMMuC60z>E1=S!Yo4ku# zLL22X`tD3Jdm`$j0JR@l7<6G?M)mah#GM$!!}i7;1i8))rSmdTgvm_GNsI!rulw5F z6-7!t*%O-UZn=f)>py{Cn`+}pIPUiaF|%7M6FShktL=>E5=i$)Pg4T%3rczLacd(! zge9M1&4g6*!if*BM4)gW0gc`0=%Y!%c@J&l#*YF#|IN~&l(2>nOqYBv<5j>qR2K>7-C%2i|`hnr^^nJrS5}ygmVfF712oHdVkNO>L z9jL+DuT)C;CRF^{&(B1v@`S^mQYCp5w29urwc5b-%jUUj|0sHf_AP&*X1Y&l-;U)9 zNq-r%(SWeBtXg*#hY*sGkmCb`Cv#44xk^exn!LtC{Duf*2o$M9A2puiurte&s|tNh z5w>1dFL%MzMX&@x z4EjD_znqYALBF9a4+H?L@UUJU-~wDKW6K>$s+_pEgdu6fm>Ix87;d2un-)2K$nJE} z*J@Q!t@RK1;7?ykQ_1m&u zz|}e(FWj$JM@h4g2cw{rnWfmvl7Tn}V+11e6;M>z^NIsR+AH?wk0oP>g6vKJ*-Lx5 z>89%G>ey8KlPGrINxYL7fcyr)ok>ozRJiusrkB-3die_gHmUWGR_d-QggG$GX>Ba` z!`07_rk&?)d=$O1_>9!Hj1U%~WI8Xb)cLR2`0ktOv{us7f5?rcGKef4HCA{EWJ6A7 zBB8^1?jqxpm>=I=!LbXNL4*(TjHk1M%E)Ptnn4>dkm9JY^c|4mKR|XcHeDucm?E z{t{gR|B?wz^6#AvibQORdxDhgv$S!-lgMgue3Qwvga#>?`V54L>AhM6`!L{E!GWfl zt8}5Rrq^18ib`-&^HwLnp^)pdv{L~Fx#T*r!D2U$N8ul+Qv!HLO%eYK2xF~4JnZxt z7gW%z84^Limxf1ro+S0=`hAfTC<#D{s}o?4oCJP61WcGXm%iJx{Ppf3@q|SMc^dqs zIWrl*uv9S#ngSuZ1||6Y-gxZuDJWEtxnFcXB|=aEBdvhgOY z@-Mw64uQ@`RY@`N3IJW$1R_tk0NEwh#r=x4(g^~HrZJTSDWbQ4I@>!&WqRD5`Mk_K z@>ycUv=uncXW}w&=&``15^NCDPz)1ZEv(=8`W~SAdtk{b0e1;&RLw9mt)%&du|jn5 zYo_EjW8%%E){Xc2EF&)&@dFOzJ2PiKw# z<>7~h;z=zCeo{g}ZM{Z3WSv;OLOM}iE&422(-WXit`r53Hh`e%2Q1*Y-EXW#tjwha zRNIn==1F+33UHodn(^X5kcqPu=r^UAZJLN4+6!w1shD8?oa++z1MvEIfa9?6K#+=F zhN7%RyG({Z#s0?H+G`PRty#M0-yliM1cA=R4q5N$)RJP1sWg?8_j`>er2hIUSC#M! zntUmH9Yo3uNc>Tj8A2P}P*$L@#1w^FY7xc072jPR*RjT>%Ng6!p1KX2nk!G&?15%~ zBy4UTnAQ0ThG#9_b7)F;3L0=gVX%aWV)E4zKJ6)9rj|dT;MMLPoF;$i5^PQmy9~zS zpnZaPtsI8eNHJAhs-V>pcI%PkPDM<7F&|}RKkdBGXzkeWWpi#YqE=)&@ku`qZqW#(e@S3@jSpi6q5LpQQqL3#Ij}HOmYuYxNM@_&usD zWp+y7)vaLFRtzOK!ep{G7m}iBDZ0q@X9h``C)dT5rH37+0ldKpBo4c^gtku5*@A*5 zp&MutD?2K8C_%xS9g`gpQ;Xdd`Rr5@tPUZW{j^CT>EyoeGZY%6M#k6kT4#3^*LM=@ zxK}NDosRbTy9{7nDdZ246ZV`ICAsSGS2ToP8i0&l#1f(oO~U&@$;uU51B%u8m5FRKQa4q;1R0{t z(DDxC_FfT4oCA2t(qkpmh(Q$F_#=TduYx+}pXA;rY&RdW=IdF;q!GCvLs;$#l0KJ; zId`6;gaTnqjc>uMc&mQ8VQ)X>)~zdw)d8XalDOd|X%E_@@Y#kH%MtZG_0*q)2}M;w zc)-M~$f)`eZCV?YlWg1 zG1elrsRly~lat@K|Afsb4yx{;IaqYK)Pl26icJcI1uaYh1mtCGEuJ#_dB;obE zGDx+M$Y~A&e|p5#B#b2GtWE%6fY2RU-&gN;3qZ>3phynh2XtEgW_Mg$z+g7jrNmwU znn=%5sfhV=VX2=}Jej@L&Uw;uR1qjUN=6-Xg)YPbgjVrV&BOw`Z^wl)TaB%b>@KmU zN&Je}FU5Xp%zR6$R2jb3d2R0&KR!dYvz+K+*=WlTd6r!iP4tov)QOeJj#Vg$j zE=W|DIuxj4SbRXIRn<;!PjGWo`elE`7MEe9lok1oOP{ZiJw_lI<&W{TcmnDICK#Vw z2a9NbEb#sZpgj77wa}xcx>n<}CHi)1pp8dDfIDJLVzxk4OmM)phu&*7tj8`virVSr ze}F~jll4bXay&5UIXUg&e}JkdWL}OB#z?H|%b6EEp46+;@8~3q&8{Y%T{zd64`j9z zdVD4|n?a$w(b0GUU*x+M@+maLvvVki*g8e_J<_5I$W=4i^6D=khw&F%$Ll1b+~C;WR7?_!5OF6hiC`XYY| z)$5WB@m3~t{aFHlbf}lf__KKTo{yiu5c*lMZUUjD4nY_~7Gmau zsC>j@C)tRc(2Kp;TQmCN)-|Q^A0S!n;QS<>n}3vgMosJX2{&Jmkuf~xb&LbU zlVf1JznA@`6NN-updA&;F}!0f*w}B1#Yj zl8ey+wAILY>2{D3DCmo4Oz6JAW?+8wog#JkzsfRVjF`L9z?=#CZ|DUIX)NU~;A{;` zzGjfvp#Q$r^Y{u?UCyF}5dL@b`f?C;ae0ew9?TcyyL~D*iddoZ2`qd-<5n*cfbc#; z1*0vp{0kqy?=xG2g`z(eKKuuu;{HUxkzjee#vp;l*=~=w_dG1OE4Z$+1)xh1NB1{a z6OSNbQRZ^xcp==4yYBACb;Bg6LP%Ns#X32g+S1k(y`gPP;5R{`$X^gd;@=ndr^%vN zBe9-gPj(1AU|^Cg z+}h*&9}*CD3@%c_Ar91aio((DZv6irq?y3iKbw#fkI#bU!Sr5k1jOPw|X_ed4k(c1GA$3F$gedh)_sKsXvyn45C^!S@Z>>>fV zk)aq@a2$L+vG(eiWuM!_Rg!VX<|d$GKtOp(SMjqR-p{&QK{vh zY|tB^zJrk28Cb=9A@63;_~O>1b&{8@I?bRT8=8?I#hznKo&@uY;FIKEs9%(#C=0vG~m75vZ6c|T%vLFoSjXi5QdZc?@i=!CZ>-AA2Q zlGx05N%7c^Ce&6W#D${o!syLW6e;bVtNXzsDWO-3Y!pd^UnJQbFdhvtoDZL94Ej0` zz#P!XAO>0U%TWN2u(>WOnrpC8+auH3*-QkmN$z;S}2F8_slG>=MOG=U%XQk)d;JM#q+T~G*OdupI z%hWih=E%cbmQMNQnK<3+UqSZ_$I;J0wTr(fq;T7J;U*!A;Fr#(#bRRpwJwE z7~w^NDTfDlYVA^0i!ecD^?v|$9Rs_pfDy@=RQCmgxw$K=>Z>~ronZI7tcuoUi*P+? z8frvF4aqq)8ugx$TuRj6;2|z2zRu>z6BTIf@cD+&Wo^k* zp~KsB%Uv_wx^zKM$=_YZGlG22IYMu0*>t7M@$HS3R!c|WjIO{p)mGJ#LH9%zNAvre z!6yH+nS)A(oYCK8CU#m{EAQ5#?-lOH#D}{dvrHv^&$h26EJrL=+^w-U`;Vs`R`Maz zRSo&&DwR=v<2t%^lPQ;I}%#&?_n2Xu%gV`iq)WpD$6v( z;_X4Mw(f(4g4=t~f2J9_EY0%;ZIk-7G!!caGCJ6-9pSNaN-7@t)>$;R_9(S^YgEW< zE`fGWrPPZt#MD{3$@%o|Ay+Mbt;o^revwZ5+>5LZl{Sby@d{s8Me_uj6P0?M_O~sv^&5?p}k-&o3?Mziy;cZ)W+t?^B(r8Y9|KMA!tH4f< z&5A?G_wOamdI$6K`R>;%txI;ZRQK9=W&U@`DvHbd#sP&6qPtR7wbm*`@VE3so;3HW z)$VaJ$T8n9b9*HPjnyluI_2#)St!>m`?n?^RV+l_{6#+hSebQjB(UX<5ne$ao_0;% zvYhMOLL(E`xfNyKvJ6eziu)l=x?-isp+8?lo>IaJ)xZZN(^@*TeACG+lVhu$7q(Pc zu(NkuUh_Eg?wI82{h_&Pe`hn}W7N{dmC}C5I_9RvlSF!EP{x$JG?Fg=Q1Prx5_7NTgkF!_iLpI_wratt8TG(Z>gQW z6AUR_Q5n-wW{-o=Fto0LwJfu@yi?4MR56&Cz9S+zWEhT9(sEgo--FtF*EG3T>e>1m zjM_fI>ld5cuMT3}3lZBh^9WY>p1XKmQ7cD(X+>UzoW(Eo*9ga`5X8^060>kEy%E=K z+L^i}SArS+8-}pJXvBc?%B<5@OKuMb^zUK+wp479DB!Nr^T;PrRXveP1z*`S+r(wx z^fU)u_Dq_i4#o4UZ#ge)(^_YIEET2=?Y>Q=+cW9G4`->y462D(=cB{B3dRNs)n?`w zIEq^P3Qe<;5|16k>fBV4wa?D>Vm-%IJmFQVOO5B4w`Mil5p3R`a`rRxI+b7BClSQS zwbeEA`YloWb0vbqT`DDZ0Y^qF7S4C^c_p{;F1i4TtS&a$C-!dO zybFR}+f{Y&DIr#{Ht;U(7A;Bb=4ku;{n8Y58FUr#FE#W$q;#VUC#{=3M{%~L-lfc^ zi^{gh?xCRTqn0O}guo_j<+zp8s+{12Tbpm=ZC-fo?lp(IPFf?9BRhhpExruJ>1}2` zX|od-yj{f40H&?qf5jzts(jw9wyIIhKi1Nc8(nEsI%86L(Db^cbE2DPbg!tJRjpEqwmfZe#kuj4-nE-?18SPyL^9tI3%Y-8ZS_0SqP4?sP3twSxZbB9&vTZ3?-DG3eW_xx0At&HQ}v9i`4DVI z)u;seR*8bOC|2+iMq_2?^t`w2QuTQxuv za&Xr^IN;-E=}=T!#V$J<1N@b9xyXG8?^9R`+{YRwO3rg}A{F|xFFNvCT4y^ssb^BqYC(!~!p@a+4#X%<-pG0KGOz48 zar!beZ^(8IR^$3Do93C3b+UV5Q(e|G`P3F00+Fv`7t2bT_N-6%LRpi<+t(MYM+pBJ5|k|^oqg6Z z6d{w=-p&Q%u;O^Grum2!RaOqSm2Mk8(zGQQz8{a-bqL)a&oI(QRxR7+XdC{n*dYLy zt=QyxilA*&Utdxs!(T*99u6dhtoZz>KtS(d{FJF`Gc_d$OipjdW{oisGR3G|{#v-u zVM&B@@AbGr8D^gK$5vAhWS1|18t`)Z2Dt_g0Nj0WdBnH=DSgijbLEBEa{MZ~bQEz& zvw70BzW0BcsXA~5 zIFXM0cRR;2<=+0)4x-z0qC<0zR(bj^TZV|{r;MLQ_Sc*Ou?jr=srxf!O$2sec;$Eh z6-rhME>~?w!xf9lq{;9A*Q_H0Q1TtD{xvPuAe&-HrQGd|JlW39`&S)!ZmD{l!6tX@0Z@f!ZE z_9PG!x7l-8AV_m0o}8N1K&XRN=$P}R%Z?~}$a9f_SDo8fIz&>Yb+B{HpHm(?@tn=$ z+0#v{-?!Dc_y*td4MZ*w+31gfA!^_GWybeyds<3he0SlS2%cJxv;r1bmGBSG*Ry^aI)sji;Im)K=PvwAPQ0x~KHLS*ET8AKE5WS) z16Yfwv?I!?%XS$=>b1hlTxD+IlWn`t7SMtv27!qE#P9ihsZ%@h#j7Ywys2*tk$Fv2`oXg z>z7crYh|talLl!?S;7`A!v>c7G|Mz*`w4NPUL0VFDrPY}mg_5taTn&swBi3RH{2?O zID4T0e-DJTGykFh2h6+tCGVb2jRBd_I2z~eCgt@Xr)96nTKHau%6%hzncqFF`}1s7;c@nW4I}xsxi(7i zg3;Pe@)Av>1eldFhPbGTxgt>yk?a55-V53@#&12uz4g833JM-GKofx0ElmO@P7Okj zbDEdUvRbe*MVkKp#HH?en9pB(Zx-}!7ef-0_g(}uur);1fgIC0t~5Yv;r8a+PHWma z)Vti2N$WpAsQyhNsoK*s#lc#;2QTC65y!WWb8o<`B8B>n#=Uegxm?s2sFOi}*{*e1 zC63s;hsU+XualWc3QNby4+nFUSa8q`e$8J9(lt$2Q>_-^{aGEM$y)SX$_r2z;O#V(>mB_p++ou7^mJ zh%lrB1ME>t44ykx!Sl|jJul3#yfXsX$lwQY6DQu@{H8({EcV?8Q*r7W=R``ww!R3y zDp`tubb_@$e&cD!XAdHLIxdS2;GL34d8lgU!n6b(m(X#Hr`Qb^Lnr|#nUO5MPa^Y1 z6>l&NFLQMF+JCJzCa7||y%)Tb8#Y8PA<(=R<365#{MaUnWi+BU!T$!LzAvA(P^^Y1 zi9ZiL!D3*<3R2zsb9jd89S26iUamaE{ml(H?>{vdamV@(;4XrOr=$kh+iuWJ7;!G} z()nD{GU<)@FYc6lbz%z?j7oGAyvfxWIeVRIlUb`U%RUIkpmUcH!ngB(_F8*5`oI-u)*cb@Bn&T$cLAwJZDR|>z- zPP0j0KyeACu4j+8_vZtO+GkrXBuMCQPd3YQTjM)?iBq%}=|>a;TlBaAEj%lY2@@tE zaCz-e92mWX&ZpD@%%bAoB(VHAUYJ>6K=k&x5YiP4>fNXz9^{41i5$6tSuQF+>ufBX zyBcrR29CLiBlDL)+GmTeL9VL5Vd#|LH=iq9y@{P#)4&L=o|gv+lwm_5QmDLQ&j){B zrvi>o!*I}_!Ja^gFy{n*!yka;F%i;pX~`L%i`zJPoU{w%L6%j|+ z2PO0J8q=d_d00Vv>c?80d$jOGTH4S}a~hVGt(jxUH#07{%fs$A^cySVNul<19Sal! z>``-GxP7@L=X!>d)>xd(IZN>f9K4{}nwAnHf!vT7A?FoA#qPjNp?q}T$CTd#%lVga zDNJ`P05(?B7`7MV;X5)E%SMnSO=5$ekba7^dLmd6_*IHAqX#(~756BFR5OdWiB&qV zpU74du;Q0sC_W1U5xmL zl2t2((nh*9oRf4VWr7qsJv>WBic8a8S;?u8)TFE&@J<4?a+2?=AXiUK_c=AqR43pj z|4wZ~LMY$sI`o47Q0tbqW)-=!Q?P5<7|=Y~&Z}_Fye3s`>qcKwI-8b;)6`ZzJW^tm zvr^@Wy=4F5%J|E{A*IEOPJ>$abPoAFWOY$gG((u^;Kf9{f((#=W zt{#31NULu^Xp8Wt@He^7zJ+P%s4q;x>U9-#mCsh3BPO-$do~Ro2hMEsS1WdZhR@uc zr)Q0*{pGqIaj&Q;UGCqXe?+OSI@oCmxg8a?YRw5hR-gkgEm$-`rMo8Sb(cM1gn@f% z+pX(E!*X=P;bE6cqpr1WO}1+Oc0g#0UQIK`0N8!5t=H?PM7e#X^|qjf8pNqf2Pr3% zlu8i$PUlxO)3POdcJ%%7g!JMSboZ)=DSbePWo>1cjlKNph<)v6oB~~?4B|ueby$th zSzN9kt66!zwWD=p-d19uhj4CI{!cU(RH~JLqJZ=c^Uyz34fXw%*5X0lWEV z{bjdV^>^Ntm8K0XxxbGrF6tpN`X8+?q?ffdGYw*^TQ!#~es>H+k%h<;MCDEG1w3CU zWfQvFEp}&3*GAsEZ}w|JFNx%MdHRJDN+yM0DY^t-B}u^pQYD*8=TkBiH7y9FBN;f{ zxwAWwug0|F9%Z+Q`r;jSW;M4QTGm&`eZ}xpHIfVnMddI2S9L4tkD4C93lzO?r9AG(_iH6Su z3xgtV>iC&^o_^g7yE8!|n#TvZ#a5RU-Wra(bK&r8ZDj*3+i5}jXBE{{BdN=WHpQKj zdWn^KM)M0Qx_U}FD{k?y_gT8O6bR1ond%;`Q6iU>3`Z^P`57yt&w37pDu>G*u~gX| zIx8Q|R79iwWz;)jxmaeUv;N#y^Lvz&+)!P%PgXb=?F;&2U47lv<-Ywqkv+FLHN>F= z7j)akNvdc(CqJ)k#+ED1I_V-a7r1Ymq?m=ZEaW%Uor6n0qZ(6C6{QaK^Ye`xaP|F1 z`?5X%H2?feSB*7mF5&!)&aLWsK97~J+RuH0TaMFSFuY*1LVRwYq^Ygts#m8P)`lUK ztPw#U1Y(_u08sel)VC8n+V(`tgeGZ{-aj$R9#aXK24{767|22z|<(}1& zXFcq+Nh_UtnQgdwiQQ`Cifdr~_v5+3N0+>gw1qE+*Z1k7d}EDE!&@U+2oA2RWrAli z4;55dtSeZfkJQC9^Ur1p_h~*7i{Ab9Mkp0J&PPA#B28?3?n>$Aa>BR&e&05d6WQhr z=r-m*nvYXKP%TF~pR1Y8Q95?RpebLiCF`mWop1^FV}Y?^rEaWq{61e%PnE8kTB}Wu zBeKQ^6jwGY*xLeOQ~Jkq`+Pnvg_p_4d(B!+9dxF04Q=#SWt*`hX|%&lMs`<9wQu?7 zYOc#bAFHm3SON>%jsHa5F|TPm+SKgG{?lke^RUId?#PC}mBghbFNSx+=J+BwxWuRI zmnv;*U^>6Q>n;4{(3_#;=tO|I`2?2dO!B@{-B;Tax$+6>f;s6*0{gfsCs15^qYm0G z2Ri%oI5#H%9@V@d&^~9t})wr z6pXYnw!VINfn{ITQWl3Y@A|l)+~Kb{qV73FScsk_prqp9tZ*C8kj6jJpAnYN%oQ{v z1ZCL6t+?#wfNbQn{x$$*Cmh{WNYqUZU1)%Z;tv^7N^zqEC(9K2A` z@~YR%wcknTw{KL{H)*S?ZVy`b$jyyS*KGV=evqEkVKjWHWZl+n(Ilau=F$013U*nu z_}H(?j8Jp>AuwJ3I>_xI2H@Yk6>eT(olPwVA@++zC?9~;tb zEeD&)SQ|tmfl& zb5$IgB;<@!v!Xd0=GW>@qpl(=TA<`=XCN^L?XFwP?`oGaeabZa72us_Yy zARon?+qEe4`7AE}rc2q^dVCdpm6r868kHL5P~Jq7MYC>PQ06oZdpjT7kTZg!n&#Zxl|@vvm0-goj_)*7&(zOJnwrXqn>NX}Yzd%A6eJ7^my|d^XYX*c z+XEA0_X!ZL3WwUG&+^~DX=hq4MiCqeU20w2ac>^dm0Nc%AS>O+1i#FeV(wXSI}%is zCX|&s=6BWD$gK8Fj~b%Nk3@T$&T1u>ZW|5MU}HY{J6u1PTi$Z5axQY(w46iaxtesN z!`e^zXOH;K!%N^30GA#H^GM)mk}pZv?$-U_Gptc!OP1otzxm@VVF1R|PorvslW}W} zS5EC2L1joB;cL{*U;sct1TFVT!gc(0b=`X(|1m#qitZ;PNg8_)3+R(Qx;vxz!HkxP zkp#S_$oRCeQuZ_sF!CJ|3Npn}4fF_fe1_FTjl~wgi;VFT^F3(~!iY>#bAIsm@nioQ zBB^)`N}MIxxIq^LG5!c;f*_;{M`UM0@ex?OI3CG#fG1zePO~2y7@!cmBsGo4%;Utz zPEwGm9~_X^?ZGUO4#jeM)b^2``0arf z$H&8XXG01*$QG^xNzwxVSoHQkg2{aX#-F-ZdV4f-HeFH3r{i=7T&ZT6f3nZf9p7kr zmH9aFx~#0nq0r6cgBJiZVE*}{v=7>IeD!ie!M;z~%r0ONZL1oI#E~6Xio6MsI6m$L z?E=Wn%Gm3k0zCr&Ce=$k?v7P*Y_fRt`9=8WMJwHcIu~qfbQsE zMm8XILPmV>^$lHsF3YJtDX@3*%4aG;GLK7S6+#U#Ro zgoMsB2AC!Cqt*fJWv~QLsDxjjcn-5~!e^P{ap%Xij&+hj@c2|ze#gR`AkTbL&RsQK4v}IjDF{2#z=j~M;=`E8p(*m4 z;^Wh7Z!ife%vpwSpt1>)gmuig>H(&rQ@?DYIE#%v2*OAI{l*@R8*u*nNlGlp%Xu1B zG=mLRW~F~WY7UU(TbB}3RwQMClL>ByKMdIhM(!uK4Fa$R^uUZ-i5Lb!#{mDtZK~(3 z!>M*FO-Zsxmw?2CLNfY{p*XbYHf(=he0mLwI^@1U-YF;QvUkFXqZ6*J1+B#{gXYG5 z(<7jN$w9!H(gRRDqg_u4Wt$?QEa#BX{N4r%p8WipKweD)Of4pSfeB%+h2REpG?@_bOj?&Pf#ug~)b*2_ zNEL}lSvit3=zp+BV9(;_VYE!<#$tMw*T#82KpDQd}1(qLh zTUCWAF6cZ}VHjlMaJtARH8f1G?P0r0O(l&cF~rpWZqfNe+}~1Qo-n55e}Ix7_@i#< zo}_k>6WpS@_&xn49`4PHMTb`Ify=R`>14u%{LMSqj zKTLt7n86^k0)Uz#a1fZ#7FVYH)qyb~5AEb#m5DBjzssXKUQoA}g2si*;vL~*0WR3Z zcz^kIV5((GnS(%aVNuCA7$3+%o9}vX@G*e5It0VBIq@+^EOp7eI}^tEOyV!@m_SF^ zlH@-BFbi>OM0x>Es_Ud**|D8dhgb?oSuka#qR1r^nWbgQ3BqFV$vtUF(O#KbydjD} zOoAlxfO__^&XitU-c~VF<(!xuMF`JYwu|&tFV>+{i116mrgCJ)0YDwBcuJ9!AoV+x zcbahhlUh#@;R%xn&UAriFb4==R)dczJPs4dhy#FMsuOSkDN1-`E2Mzuvud`FG7D}?^H^fh(}1?BAP#2ifF z%b1Kr39KIaMmZ}k*U@i_GqmkfS*<4fg5?aAW~zH*AH3&ux2I=VIm^p!rp$_JYK-{b z!%}C(R|u?AQo#KnQq{-pSLFlw0O&?$<6F<+~gklkayQSaNP@nNFF*{wODDStl0BZ{%;%@b-TI9YNy0wFfA< zCC#lj$!}`yW6W+)YFh>J_s#7u$V;~{`A4S{dTUW=Z7ao`$y5f2^U^7d<^u zs;w?xEp4b%vvCxUQzxLcH?(&!xpnNn?e#%>_S4YX{{Y%sQgc7q8jYS}@>7|#wtY#j ztr~L2b)wY`X^ZWGi$&hKfXs>a*?$vhi1NGXP>dk83a1V+$9#!)@Q|l_8 zUTJPzYu!h$ZR)RPV z%@1woRoho-n*w!>hg>b2?zGdlEoW`JT}2&5HA^+sG!-;$<2ixOy(zC#?LW(IMEghb z+K1a?PVAE)10^0+Jl(1ORZ+VLfLe7q`GS=7j47~f-1DV z4X&d0!;}P%ena#qRVje*M8^%&oU7(`vDH=j14?r1Uh187X*U6J(b{iE>KpE=w|x}o zV(N(uRY6ZKwMF-r_S&l@A2Dlh`jJ$8z_;7cPQx0R z7JG#oev3?VTamU~hqi|<`C-ndJ)wEkt2v#>Jygc7)n3~=GufwI^D{!&`DJdm-Skzb z+QQRIrL;#go#h^}6;4;PYr0sd^_{kzyVV+}sCl($)~6`GE!`R@v%`WBkUO-|*}`?tL%bfVshMOFL4RL_E33PAcX&(F!JfA)5^ z>dIYh&6Wnd(EOdZb5m65Dt<}x`4$%HuCouRYj;iLKh`eYk9;~xcXc~H*X~+(1Upa?mxa%!5rY$s8 zI>Ob>!=$-+S*UeWj?=K+_f%Nz2)ET=XsYWice}$%7dnro-1hdI(OTb_f0dD|ue2tX z)!J`UdnWQ%N^(gx{MfYW3oZWcEZm~FYTY%;#8heux*M&@H~LHEexb7IApKX<6!&_o zl{db#ShRuhmzzGveDvixp) z-9u4PbgH}5R2Bswq(f?TwKAaU>ek{yDA;M|>QvJ#JhXnVb*Hp%Bz11K_Pw!kTUT=b z09*4u`|TIV&2+lWGwsc${gK+{A1o|>%{;f$)E9j%&jzZg^ya#^a=%>Kbwc$YE*RBH zsJB(QQK%C|S97Fh-k*ma(){Bdxt2Ey*UDABNx?hobG?zM?{pN#9TIjDg3Y)!E0CwoU|4sdE7 zL0>sB%nGh;>92cow?}EcCwkR4O1o_X?$gw2D>F6<3xU1qcO7NHO{ncjsoOKal>_+_JR$Kyy3VQB8*N9vohuL1wO#W2@`ZCxm)f`6J4@?bGpw}# z05dAIhKl4xkDL6{(XTUe)7;DEu7=ZAIv!%{J1yaYmUTNd)s#Y!I*E^{zCUkWbvu;| zJl#{^aCJv2xt~Q}s_eB~xz}{JeF^T4>w8U3j?@iY^ka4PRJ0T)RnR+bO-7zIwbj&A zRG&+=L@H|P>8Y7g-Kc2_x2m}@&J77=8joA@pP5=ePaDl%okpP5S|3#D>pE}rD|Ho? zBXhdisVIJ#qFXNtyI6nUY1Y%Jb%ZIkg#L^9pLykaxvlw2dDm?Af%b0HT4UOV&&Zeg zBV^Lt_T{Fe<{q$GIh)Gc#oC4LUD`DTRUFB8ZIm|}D}BnY zliPc7YK>u_xzYJgZ(Q&8lF&Mj+3R2OD*ph>9#3*5Te~GwWVf0tt9p`(@p@+V{a6F@^Ue=retGhbo|m6zhIHfH+2&QB zOzF*0S#RXcqgQK|+_UO!F=o|t^)$4I(-zD7h_~BsbWGiya>msyC2xq^bu}z_RSxM5 zG0QGw>rGJpgwdJW^~ncSk%9E`Kr zbry=!T;;jy?K7qxtI(S1H8<@~q|vPDYu;^&l%j&Ju7TP$)O(qnrq-O|_LI& zUUO29l>W*31DINGLHkWMgn{8DZUIX)Ur#V;5?OUqr^e&U-*1pv`+SH4RZkjtz=_~E)RohLW-vaC_ zwDq=vrtd^8Pkl|p-YFaR7l(&ZTUHOZ=jXHTxAt(q=*=&#>oo0c&s=i1K=W?i-kz(x zRHlnh^A^;ry`I;1P2S65sH4>~*VI<}R7`j?x^xqUOGb(Oj%z&&(Ycr+NPXskLUAp}JpmwyOvYxVqA1S{pUc9sO6WTwQSDRlov`;&(cF$%WLTSBc%sm0B zty;drch}Y}Ia5ok%C9z>iiTde{V(G^T$+N_ZuiqsQp0L|NFOfGk`$CBAdm*|qM&kS zB*6J(#QJbTB(4%vl}HNQl1F*_S@QwZg9AC90T87xaukwC8-Y|4kRVJ%M9v3p+%`PP zDhW_t07sX&{{UAaV?QECPy>=BOF&0-hQ|LQ^Qpf!dZnLW#@}bBK^+PobG4U{3%5Tfzw>#^DMe0#8n$_97At$vKVyN(Ci5 zh+fhY1SBL#=`%gBRFE-0HMGgeQA)Cur*cN=Fac1;Am9*wIpNR{OqFa&3KEX09*T@) z0XPO@rbr3uva;AwCMP6y#zghT53FZ^1c|^xg#NNpfrBuUx=+St1W3;St8m&v5}n+s1%d!tcPDX$5<%(-BndN_IfIU*PY?6J2~s;0p(0EeAi{*>3X`0Y zP6q&HwAlwzSOR?LP3qKRpiEa&fOmCQa~nTpiq>PwG6bH(q4{ysy2d{{^<*8t<0bMZt}c~b^WW1wJtKfH z3rk5$Ww*RVC`!;7DJ>XDi82?GM5p~3?l|Gg>XrIR)+!zuT5fe`&$%Ft^yv_!r9{Le z#=t=&f?&^YNsZHKAP}A=-1#X-gu+CH6!^|(p$Rijl}A}HPsRrU;#E$R zq!~-hZUTB2(HP8va(xKt9VJ--N+V&FB|c#!KoVj;&rnFur(?hs*)9|NZW zttWqqK#HaJDe2cx<86l7Va2T> z<%NAxRHYC+06x-3#F&vheXLWjdn$fJIu@x1xa;q1U25YME_j3dZE)l(NO;^Obr8QM;IxQ3od)312Sx0N2Wx4SxYU`?7Wr}oXD|u=S zB|DNgDkPJiw!fBX`aJ^2u{W~qo%WMx5*bBfdw$jtUs9ReLR3kKAcT-iM;`RYSt>Ip82NPjxbZx>JG7Oo zl@%Wn;r2lv_r|N>4^KhIxBXKDZ700QKX+c=+1HCD!y$IQRcMV1U8yZ=_kBaCF3;&p z9m%%~RaQ!BS{hpYMRc~U3J$e&T{XtnYo)Agp;Q$28uyt}YS&2X9JZ(`D=I2fZgI`( zGPN9%t*TK`CT4S)9eC+2Yiz63T(d%`5NawkCHCietziy2r`yx|nvTmuS6baa*m9PJ znIsFtm<2>1dl!Bd!QIepkm;}diGtd%X_9l1(-e^8vYA$0|YHCe9 zsu1py(HfUtT}{HRbg23ZOHrn_>F&#Jnd0?vWoh?XbtSaC;DtWe6UV;MUe0{Q*KO!G zbn>+NlgvFm%uP$D#m@T8t$}aln(G?We@WI>vdsmpekBX$iR!wfQ7yf%)z#559C5gL z0nDv6%UxfnYIT(r_3b6Cxp%HPZ-1)OOwiV98(jvlvpGVWy`qBaU2L}8YUnDFNb#Yp zx!c;Qrxgelthi9I&^AwKZcS)o2xJ)kr_ZQl8(w6&h;c)oLPmh3Gz z8e28LT3%@__Nq$TpiRb|+vRm#6*D{Oox8lR3<0M3fyp~AhUC?sTYhs<>WxiR&AnC2 z`pVrad!fJRN}E-aNNFuaNm*j9X4y?wS6C|b1yv<|TCNV!E8SAXJu7NyZ@gK%dTC;s;eziwJkesW|b7~Q>m)Qol}gpr17+D0V-Jo4iZOjNc)KO6B#6q008X; zAO$3+dEAu)9)c!12v^<7PN&45|pTQ>PGId9RWYMJ2JF+l)a!%{B#8Mi~?{o zJunI26WDla4X5>qS6G-h1cD$$0U%?b0Z1Sqo#d0|+^j30gS5!>>LzC#0l6}vDuP>r zHwd19f(ac4QU+iS5Gf^Oz(SG^)R7>A0098Zf_g?|<2)4ZN>oBfNlb!PF+IQlWXOpC z;sKK!00;;|z#&I)1dhODNY8m6GuA``PEz1WR2ah4VD<-ccV>EYKAFi7l{Qle+=)=h z5fj|wq3?(vdlI4N1!^0WJAlR~F)}xL03rmKk-!ciK)3>+!C3<-gVad??t(G|V<*u_ z-Uv|w5TytyPS6H0PGTTLW+rez+IRVsr4*>l6oMn*XW^JnXz9Wm$~-X&l!XEhK|Kt_ z!4VUWk3a*G3ML^XY5@URk(d}Hf+S3gU>>*$%99>aRCgfm+ae^SL`drd;Kyj;EG9yd zuu3)vGJ13%j=iKLdY-%@qF3TcQWNPSClLgRGZPacCm7%a3EFnp724F5=;+_01Sb-1x002L~R~n)47CWK4=0advHYV zSqdl!2}}?b0Af0kf(%5HIO~*^E1^kJfdmBvrV=m+7&FvjK*oCz05WApQtZGVs!~Qw zfg3={$T22I4T2D$g_QtAfSAGVNyr#71mms=hY~{0#Q;i5l#-x8SL+W=!Y4k4e7NBz zcLb$d2t@Uer4c_PAoYV0i2xn|N`tY&B2Sp5N9E8-7!!j%Qga7^AZ`I*9mQm&Qz?(L zxWQ6~VK8LLo`eDjTALeo`Gh3r{UDq{=^`*EhTtYdEI|fR0ZAhSoSwZ7Mj#%L1InSz z%Nt=nQPiHJF(cQwjCIN3B+TzfQAjFLDFA`AKxc#k>Kh^gg5gO(5E4&L#GG{? zNyO*Vgh&bpcu-jL;skUUPeT|3s6B9a0mH-rJ4jY00#XqYaX8PYfO35}P?V`qLOi8A zRzWgi4^!pHB$@9bIyY)o78?fzG3LU$<_}CyQ$0Fl7ZPBpNJ5rW697yRJ#u9Bfd{0M z&;Y;&Om6}K0EEi3l!WyF0|q3?G1eSB(FBztQW5@&WJo1I83!FtXc3T<2q`K_3NA=c z2^c-FNZmObr@l^jL;$tNi!&smKU*+<9-o9_NC*`qDO_Hx(Lun^*kfe~6LX==&k`K=wkv&HVT}sGFN{-T;g#*_( z!m*ySC$XLY`z7sF`6q82v)25={RZJ3d&soTHXwBuB_SM2q)brg3ij=;VCMk_t5m^{wWi1yF+ zat&xdW?C+L)6`t`bv+H$7b?3xnYbxhzSR{7(_E}Wx2Nh4F%emEs7;!uP23KiQtvBf zlT-6I+w+sU-`YFd1DrOUFU-a?&$JJ*HFvXajiR_(G^;n;cDSk1T&%D+b=36K`p&9? zi%F)lL|vR+eWvGnyb5ZIdedT4uGFzf>F*xg-pjhDo4V(ims8KXEwi2;!0&q`^BUhn z%T8WjE*!Si)LKuLnsV2xbXsaT-D0Qaew(gyMOW0^DKD>brs-~N`X=eob5rjcAT(9G z@>csrUUb(lZ}zQa?D<=L=JzhCxtYnXTCbcot7kH~zhrirzP0)eUTIs+1-W;N&AyI- zRS#3YSwlfyr`x2lTrTzO*V57RMxORg=Y7KC?CtcXh`Lxb{{Xc9yIzCkUFxyRYo_~h zw`&W2iqt>gs%rP|Hs7Ex7Z%#87penfqx4pdcT96Y($?ycpxV_Mw!4`&`s6|5_e!hIqo=sssC6rJ^@h649=7hFr>Z;w>S=wF{h99k%=YZM&|9^K=vR_F z$mNf-&nJaGrFl0x{$}$Fnl`>%yQrMIRnt5!skU1*?z`3Lps8W&ab~W8E2Vy!s%97E zIj8wDbp!=XS2PTds8!?YO(0EqkSc`);?;T=Mqc_Dc4; zZ=E^=o9=V_m7Ko5dsyCmr#VxsG(Rr12Da7J7M)F_t=dypa`Rs48<#V*)vnWauBWon z)M1+W9f7ZM?qL`rn@1 z&9G=q0yXvOfft(wkg)1D)pu)CUGJ6$TGW&dSn2DnZ0X18uU9LT1qD?r@2w~KJ2~5Z z)x5^h+P7KzKk{zj%RO~#<%P<#oBZa{`exav`GJ0-YU!u+){Ao1{-Ceau3s$m6xWM& z>W+aLT-)jp?N#!XXsBtPwdW_dpR-T4C5xK;tmlO%Ik_#%r#bPXIl;+2Tg$yCqdBRm z==A=LyLN3;bgQMSqpq;fwz|4r&VJb5 z#r%r0>w8Zw=sDNPTZJDyTi04=nB$W^&%V%nzEl&Wv|J3r8$P36{Y$7_cL@aGpfD4HGi@{Ff{I$ z)EY9LiqBxvKF#`-k;JD{nY?lX&GOl(=$Znfh;EQCazuXQW-)<)C%d)|}fd+ILV|bn9gW+y^a^zPU94+SJ8}rLuay0he<((P_HEHTzOr0& zPO;S2TMxE&yXS_crKM+1QQNDzL(E=7Rq|H#ZnE8~?$6g#a~9s4t##VlM&+KK$mhFJ zwEm`P6*WvY29MSslZV;@$8_bbzeC=+JrfEwXkCcCs&ik&tp*dN}y-DpM?AX?v<~7S# zS(mQ)XUzK#Fq)v$x*e)z>Kz8fm0v>L-q&n<^(|E;x~__f$91(gaJX6T_Y}}P(Ys~# zrS?taM=mr!Bl#Pt{i`(wl)C#(>3?WWX>(v&`G3h?Yv}7%jr2U+eAq zS^B!#8t3aOEg(@)U2Yb3^!pdL(@OnSQmNgicdfaf`7`tt<<3f3^bU;nh4x?9yw3Kt zU$Z4IF1@HOHl0a**E$-K*o%cnv^Iuj*ULUs){6zUowrecp!XZTmVV<~Nkw4RBq5|$ zb0;Br@$7%>+s}?#`#|ZcPiQ`B>a7#c+wJn&(K zUu@?#mDSgQd$iJ3Y8w3^P~DQp7yKJ z{?g2AKWeLGlTEpx?3#YxTSax{=8qH{&gTWjqfqNA3#E0pTI$xTwEckSjCY@FrMoW$3z^1k29Jvz>o z(3�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%0A7fUI6}A_H>ux38`&xFi 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