Files
vllm-omni/pyproject.toml
T

368 lines
13 KiB
TOML
Raw Normal View History

2025-09-11 14:32:51 +08:00
[build-system]
requires = [
"setuptools>=77.0.3,<81.0.0",
"wheel",
"setuptools-scm>=8.0",
]
2025-09-11 14:32:51 +08:00
build-backend = "setuptools.build_meta"
[project]
name = "vllm-omni"
dynamic = ["version", "dependencies"]
2025-12-01 04:09:24 -08:00
description = "A framework for efficient model inference with omni-modality models"
2025-09-11 14:32:51 +08:00
readme = "README.md"
requires-python = ">=3.10,<3.14"
license = "Apache-2.0"
2025-09-11 14:32:51 +08:00
authors = [
2025-12-01 04:09:24 -08:00
{name = "vLLM-Omni Team"}
2025-09-11 14:32:51 +08:00
]
keywords = ["vllm", "multimodal", "diffusion", "transformer", "inference", "serving"]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
2025-09-11 14:32:51 +08:00
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Software Development :: Libraries :: Python Modules",
]
# Dependencies are now managed dynamically via setup.py based on detected hardware platform.
# This allows automatic installation of the correct platform-specific dependencies (CUDA/ROCm/CPU/XPU/NPU)
# without requiring extras like [cuda]. See requirements/ directory for platform-specific dependencies.
2025-09-11 14:32:51 +08:00
[project.optional-dependencies]
2025-09-11 14:32:51 +08:00
dev = [
"pytest==9.1.1",
"pytest-asyncio==1.4.0",
"pytest-cov==7.1.0",
"pytest-mock==3.15.1",
"websockets==16.1",
"pytest-subtests==0.15.0",
"datasets==3.6.0",
"mypy==1.11.1",
"pre-commit==4.0.1",
"openai-whisper==20250625",
"psutil==7.2.2",
"soundfile==0.14.0",
"imageio[ffmpeg]==2.37.4",
"opencv-python==5.0.0.93",
"mooncake-transfer-engine-cuda13==0.3.11.post1",
"av==18.0.0", # for ComfyUI tests
"openpyxl==3.1.5", # for nightly CI
"pyttsx3==2.99",
"opencc==1.4.1",
"mistune==3.3.4", # for example tests
"torchmetrics==1.9.0", # for accuracy similarity metrics
"ray[default]==2.56.1", # for RL test
"jiwer==4.0.0",
"zhon==2.1.1",
"zhconv==1.4.3",
"scipy==1.18.0",
"funasr==1.3.29",
"lpips==0.1.4", # for quantization fp8
"orjson==3.11.9", # to make v1/embeddings API fast
"voxcpm==2.0.3", # for VoxCPM2 path-locating in tests
"torchdiffeq==0.2.5", # for covo_audio Test
"FlagEmbedding==1.4.0", # for hunyuan_image3 tests
"kernels==0.14.1", # for accuracy tests comparison with diffusers output (0.15.0 incompatible with diffusers 0.38.0)
"s3tokenizer==0.3.0", # for tts test
"step-audio2==1.0.0", # Step-Audio2 / MiniCPM-o 4.5 Token2Wav (flashcosyvoice / hyperpyyaml)
]
demo = [
"gradio>=6.7.0",
"opencv-python>=4.12.0.88", # cli/stream_client frame reading
"requests>=2.28.0", # cli/stream_client HTTP
"cn2an>=0.5.22", # Chinese number normalization for TTS (e.g. "1次" -> "一次")
]
forced-aligner = [
"qwen-asr>=0.0.6", # faithful Japanese/Korean word segmentation for the TTS forced aligner
]
2026-08-12 07:00:35 +08:00
indextts2 = [
"fugashi>=1.2.0",
"unidic-lite>=1.0.0",
"wetext>=0.0.9; sys_platform != 'linux'",
"WeTextProcessing; sys_platform == 'linux'",
]
# Local-test-only extras
local = [
"FlagEmbedding",
]
# LongCat-Video-Avatar A2V/AI2V runtime dependencies for vocal
# separation and loudness normalization.
longcat-video-avatar = [
"audio-separator==0.44.2",
"pyloudnorm==0.1.1",
"soundfile>=0.13.1",
]
# Optional Blackwell-only fused-bias FP8 GEMM; package is `quack-kernels` (imported
# as `quack`), not the unrelated `quack`. See docs/user_guide/quantization/fp8.md.
quack = [
"quack-kernels>=0.3.11",
]
# Optional Blackwell-native FlashAttention-4 backend. Keep this opt-in because
# the CuTe/CUTLASS dependency is CUDA 13 and Blackwell specific.
fa4 = [
"flash-attn-4[cu13]==4.0.0b18",
]
2025-09-11 14:32:51 +08:00
docs = [
"mkdocs>=1.5.0",
"mkdocs-api-autonav",
"mkdocs-material",
"mkdocstrings-python",
"mkdocs-gen-files",
"mkdocs-awesome-nav",
"mkdocs-redirects",
"mkdocs-glightbox",
"mkdocs-git-revision-date-localized-plugin",
"mkdocs-minify-plugin",
"regex",
"ruff",
"pydantic",
2025-09-11 14:32:51 +08:00
]
2026-06-24 13:36:45 +08:00
soulx-svs = [
"funasr>=1.0.0",
"g2pM>=0.1.2.5",
"g2p-en>=2.1.0",
"ToJyutping>=3.2.0",
]
2025-09-11 14:32:51 +08:00
[project.urls]
Homepage = "https://github.com/vllm-project/vllm-omni"
Repository = "https://github.com/vllm-project/vllm-omni"
2025-09-11 14:32:51 +08:00
Documentation = "https://vllm-omni.readthedocs.io"
"Bug Tracker" = "https://github.com/vllm-project/vllm-omni/issues"
2025-09-11 14:32:51 +08:00
[project.scripts]
vllm-omni = "vllm_omni.entrypoints.cli.main:main"
2026-06-01 22:12:24 +08:00
# Register vllm-omni's model registrations on every vllm subprocess. vllm
# auto-loads anything advertised under `vllm.general_plugins` in its own
# `load_general_plugins()`, so worker subprocesses spawned by vllm (which
# only import vllm, not vllm_omni) will still pick up the omni archs.
[project.entry-points."vllm.general_plugins"]
vllm_omni_register_models = "vllm_omni.engine.arg_utils:register_omni_models_to_vllm"
2025-11-24 14:57:05 +08:00
2025-09-11 14:32:51 +08:00
[tool.setuptools.packages.find]
where = ["."]
include = ["vllm_omni*"]
2025-11-24 14:57:05 +08:00
[tool.setuptools.package-data]
"vllm_omni" = ["_version.py", "py.typed"]
2025-11-24 14:57:05 +08:00
[tool.setuptools_scm]
# no extra settings needed, presence enables setuptools-scm
2025-11-17 18:13:05 +08:00
[tool.ruff]
2025-11-18 20:54:26 +08:00
line-length = 120
2025-11-17 18:13:05 +08:00
exclude = [
".eggs",
".git",
".hg",
".mypy_cache",
".tox",
".venv",
"build",
"dist",
"vllm_omni.egg-info",
]
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort (handled separately, but included for compatibility)
"N", # pep8-naming
"UP", # pyupgrade
"TID251", # flake8-tidy-imports.banned-api
2025-11-17 18:13:05 +08:00
]
ignore = [
"E203", # whitespace before ':' (conflicts with black)
# W503 is not needed in ruff as it's compatible with black by default
2025-11-18 20:54:26 +08:00
"N801", # class names should use CapWords convention
"N802", # function name should follow snake_case
"N806", # variable in function should follow snake_case
"N812", # lowercase imported as non-lowercase: functional as F
2025-11-17 18:13:05 +08:00
]
[tool.ruff.lint.per-file-ignores]
"examples/**" = ["E501"] # Allow long lines in examples
"tests/**" = ["E501"] # Allow long lines in tests
2026-06-01 22:12:24 +08:00
# MiniCPM-o reference modeling code vendored from upstream HF/transformers/MiniCPM-o.
# These files keep upstream conventions (star imports, long lines, math-symbol
# argument names) so they stay easy to diff against upstream releases.
"vllm_omni/model_executor/models/minicpmo_4_5/minicpmo_4_5_omni_llm.py" = ["E402", "E501", "F403", "F405", "N803"]
# NemotronVoiceChat inference modules vendored from NVIDIA-NeMo/Speech (branch
# nemotron-labs-voicechat). Numerics-bearing code is kept byte-close to
# upstream to stay diffable and parity-safe, so upstream style (long lines,
# legacy typing, whitespace, unused-import shims) is exempted. TID251 and the
# F-correctness rules still apply.
"vllm_omni/model_executor/models/nemotron_voicechat/nemo_vendored/**" = ["E501", "E721", "E741", "F401", "F841", "I001", "N803", "N814", "UP006", "UP007", "UP008", "UP011", "UP032", "UP035", "W291", "W293"]
"vllm_omni/experimental/fullduplex/joyvl/decision/prompts.py" = ["E501"] # System/summarizer prompts are long prose lines
2025-10-24 12:16:48 +08:00
[tool.ruff.lint.flake8-tidy-imports.banned-api]
"librosa".msg = "The librosa module is banned, use vllm.multimodal helpers instead"
"torch.cuda.max_memory_allocated".msg = "Use torch.accelerator.max_memory_allocated"
"torch.cuda.reset_peak_memory_stats".msg = "Use torch.accelerator.reset_peak_memory_stats"
"torch.cuda.device_count".msg = "Use torch.accelerator.device_count"
"torch.cuda.current_device".msg = "Use torch.accelerator.current_device_index"
"torch.cuda.empty_cache".msg = "Use torch.accelerator.empty_cache"
"torch.cuda.synchronize".msg = "Use torch.accelerator.synchronize"
2025-09-11 14:32:51 +08:00
[tool.mypy]
2025-11-17 18:13:05 +08:00
python_version = "3.12, 3.13"
2025-09-11 14:32:51 +08:00
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
strict_equality = true
[tool.pytest.ini_options]
2026-02-13 18:05:07 +08:00
asyncio_mode = "auto"
2025-09-11 14:32:51 +08:00
testpaths = ["tests"]
python_files = ["test_*.py", "*_test.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
"--strict-markers",
"--strict-config"
2025-09-11 14:32:51 +08:00
]
markers = [
# ci/cd required
"core_model: L1&L2 tests (run in each PR)",
"advanced_model: L3 level tests (run on each merge)",
"full_model: L4 level tests (run nightly)",
"local_model: tests (run locally)",
# function module markers
"diffusion: Diffusion model tests",
"omni: Omni model tests",
"tts: TTS model tests",
"cache: Cache backend tests",
"parallel: Parallelism/distributed tests",
"sp: Sequence parallelism tests",
"example: Doc example code tests",
# platform markers
"cpu: Tests that run on CPU",
"gpu: Tests that run on GPU (auto-added)",
"cuda: Tests that run on CUDA (auto-added)",
"rocm: Tests that run on AMD/ROCm (auto-added)",
2026-03-13 20:24:05 -07:00
"xpu: Tests that run on XPU (auto-added)",
"npu: Tests that run on NPU/Ascend (auto-added)",
"musa: Tests that run on MUSA/Moore Threads (auto-added)",
# specified computation resources marks (auto-added)
# Tag with [hardware-resource] for tests.helpers.mark.get_hardware_mark_list().
"H100: [hardware-resource] Tests that require H100 GPU",
"H200: [hardware-resource] Tests that require H200 GPU",
"L4: [hardware-resource] Tests that require L4 GPU",
"B200: [hardware-resource] Tests that require B200 GPU",
"MI325: [hardware-resource] Tests that require MI325 GPU (AMD/ROCm)",
"B60: [hardware-resource] Tests that require Intel Arc Pro B60 XPU",
"S5000: [hardware-resource] Tests that require S5000 GPU (Moore Threads/MUSA)",
"A2: [hardware-resource] Tests that require A2 NPU",
"A3: [hardware-resource] 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",
2026-03-13 20:24:05 -07:00
"distributed_xpu: Tests that require multi cards on XPU platform",
"distributed_npu: Tests that require multi cards on NPU platform",
"distributed_musa: Tests that require multi cards on MUSA 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",
2026-03-13 20:24:05 -07:00
"skipif_xpu: Skip if the num of XPU cards is less than the required",
"skipif_npu: Skip if the num of NPU cards is less than the required",
"skipif_musa: Skip if the num of MUSA cards is less than the required",
# more detailed markers
"sp: Sequence parallelism tests (multi-GPU)",
"slow: Slow tests (may skip in quick CI)",
2025-09-11 14:32:51 +08:00
"benchmark: Benchmark tests",
]
filterwarnings = [
"ignore:.*does not have '__test__' attribute.*:UserWarning",
"ignore:.*does not have '__bases__' attribute.*:UserWarning",
]
2025-11-18 20:54:26 +08:00
[tool.coverage.run]
core = "sysmon"
source = ["vllm_omni"]
# Online-serving tests launch the server via subprocess.Popen and stop it with
# SIGTERM. pytest-cov no longer instruments subprocesses implicitly, and a
# SIGTERM-ed process discards its data, so without patch/sigterm a coverage run
# over an online test measures only the pytest parent.
patch = ["subprocess"]
concurrency = ["multiprocessing", "thread"]
sigterm = true
[tool.coverage.report]
show_missing = true
skip_covered = true
2025-11-18 20:54:26 +08:00
[tool.typos.default]
extend-ignore-identifiers-re = [
".*_thw",
".*thw",
"ein",
2025-11-28 14:22:11 +08:00
".*arange",
".*MoBA",
".*temperal_downsample",
".*_nd",
".*nd$",
".*EmbedND$",
".*nothink.*",
".*NOTHINK.*",
".*nin.*",
".*[Oo]no_[Aa]nna.*",
".*cann.*",
2026-05-03 15:53:28 +08:00
".*[Nn][Dd]3.*",
".*updator.*",
"byt5.*",
# NemotronVoiceChat vendored triton kernel: dout/DOUT abbreviate d_out
# (output feature dim), not "doubt".
".*dout.*",
".*DOUT.*",
2026-05-03 15:53:28 +08:00
]
extend-ignore-re = [
"\\.\\.\\.n,d->\\.\\.\\.nd",
2025-11-18 20:54:26 +08:00
]
2026-03-05 00:54:59 +00:00
[tool.typos.default.extend-words]
ue = "ue"
semantics = "semantics"
fullset = "fullset"
Vai = "Vai"
tockens = "tockens"
CANN = "CANN"
2026-06-11 05:03:19 +08:00
# Step-Audio reasoning parser streams `</think>` tokens split across chunks
# (e.g. "</" + "thi" + "nk>"). The fragment "thi" appears literally in its
# parser logic and tests and is not a typo of "the"/"this".
thi = "thi"
ND = "ND"
byt5 = "byt5"
# "seeked" is the standard HTML media element DOM event name (fires when a
# seek completes), used by the word-timestamps Gradio demo. Not a typo.
seeked = "seeked"
# Ryan Leary: author credited in the NemotronVoiceChat vendored NeMo
# features.py copyright header. A surname, not a typo of "leery".
Leary = "Leary"
2026-08-12 07:00:35 +08:00
# IndexTTS 2.5 language codes and speech-emotion-recognition event token.
fo = "fo"
ba = "ba"
SER = "SER"