pyproject.toml 12.1 KB
Newer Older
1
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
3
# SPDX-License-Identifier: Apache-2.0

Neelay Shah's avatar
Neelay Shah committed
4
[project]
5
name = "ai-dynamo"
6
version = "0.9.0"
Neelay Shah's avatar
Neelay Shah committed
7
8
9
description = "Distributed Inference Framework"
readme = "README.md"
authors = [
Neelay Shah's avatar
Neelay Shah committed
10
    { name = "NVIDIA Inc.", email = "sw-dl-dynamo@nvidia.com" },
Neelay Shah's avatar
Neelay Shah committed
11
]
12
13
license = { text = "Apache-2.0" }
license-files = ["LICENSE"]
Neelay Shah's avatar
Neelay Shah committed
14
15
requires-python = ">=3.10"
dependencies = [
16
    "ai-dynamo-runtime==0.9.0",
17
    "transformers>=4.56.0",
18
19
20
21
    "pytest>=8.3.4",
    "types-psutil>=7.0.0.20250218",
    "kubernetes>=32.0.1,<33.0.0",
    "fastapi>=0.115.0",
22
    "distro",
23
24
    # filelock: required by planner
    "filelock",
25
    "typer",
26
    "click<8.2.0",
27
    "setuptools",
28
    "prometheus_client>=0.23.1,<1.0",
Neelay Shah's avatar
Neelay Shah committed
29
]
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "Intended Audience :: Science/Research",
    "Intended Audience :: Information Technology",
    "License :: OSI Approved :: Apache Software License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Scientific/Engineering",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
    "Operating System :: POSIX :: Linux",
]
keywords = ["llm", "genai", "inference", "nvidia", "distributed", "dynamo"]
Neelay Shah's avatar
Neelay Shah committed
46

47
48
49
[project.urls]
Repository = "https://github.com/ai-dynamo/dynamo.git"

50
[project.optional-dependencies]
51
52
trtllm =[
    "uvloop",
53
    "msgpack==1.1.2",
54
    "tensorrt-llm==1.3.0rc5",
55
56
]

57
58
vllm = [
    "uvloop",
59
    "nixl[cu12]<=0.9.0",
60
    "vllm[flashinfer,runai]==0.15.1",
61
    "vllm-omni==0.14.0",
62
    "blake3>=1.0.0,<2.0.0",
63
64
]

65
66
sglang = [
    "uvloop",
67
    "sglang[diffusion]==0.5.9",
68
    "nixl[cu12]<=0.9.0",
69
    "cupy-cuda12x>=13.0.0",
70
71
]

72
73
74
75
76
[project.entry-points.pytest11]
vllm_tests = "dynamo.vllm.tests.conftest"
trtllm_tests = "dynamo.trtllm.tests.conftest"
sglang_tests = "dynamo.sglang.tests.conftest"

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
[dependency-groups]
docs = [
    # Core Sphinx
    "sphinx>=8.1",
    "nvidia-sphinx-theme>=0.0.8",
    # Sphinx extensions
    "ablog>=0.11",
    "sphinx-copybutton>=0.5",
    "sphinx-design>=0.6",
    "sphinx-prompt>=1.9",
    "sphinx-sitemap>=2.6",
    "sphinx-tabs>=3.4",
    "sphinx-book-theme>=1.1",
    "sphinxcontrib-mermaid>=1.0",
    "sphinxcontrib-bibtex>=2.6",
92
    "sphinx-reredirects>=1.0.0",
93
94
95
96
97
98
    # Markdown and notebook support
    "myst-parser>=4.0",
    "myst-nb>=1.2",
    "nbsphinx>=0.9",
]

99
[build-system]
100
101
102
requires = ["hatchling"]
build-backend = "hatchling.build"

103
104
105
[tool.hatch.build.hooks.custom]
path = "hatch_build.py"

106
[tool.hatch.build.targets.wheel]
107
packages = [
108
    "components/src/dynamo",
109
]
110

111
112
113
[tool.hatch.metadata]
allow-direct-references = true

114
115
116
117
118
[tool.codespell]
# note: pre-commit passes explicit lists of files here, which this skip file list doesn't override -
# this is only to allow you to run codespell interactively
# this also overrides the grpc_generated folder, since it is generated

119
120
# Ignore data files and auto-generated files
skip = "./.git,./.github,./lib/llm/tests/data,*.lock,*.sum"
121

122
123
# ignore allowed words used in code
ignore-words-list = "afterall,ser,ende"
124
125
# use the 'clear' dictionary for unambiguous spelling mistakes
builtin = "clear"
126
127
# use custom dictionary in addition to the built-in one
dictionary = "./codespell.txt"
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# disable warnings about binary files and wrong encoding
quiet-level = 3

[tool.isort]
profile = "black"
use_parentheses = true
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
ensure_newline_before_comments = true
line_length = 88
balanced_wrapping = true
indent = "    "
skip = ["build"]
Neelay Shah's avatar
Neelay Shah committed
142
known_first_party = ["dynamo"]
143
144
145
146
147
148
149
# isort may confuse what is 1st or 3rd library. e.g.
# when dynamo/vllm/omni/xx.py import vllm, local isort may treat this `vllm` as first
# party heuristically. This causes local sort differs from GitHub sort and pre-commit
# failure. To mitigate 1) one can install 3rd party lib so that isort is aware of it,
# 2) hardcode 3rd party lib here, 3) add "# isort: skip_file" to problematic files
# as the last resort.
known_third_party = ["vllm", "tensorrt_llm", "sglang"]
150
151
152

[tool.pytest.ini_options]
minversion = "8.0"
153
tmp_path_retention_policy = "failed"
Neelay Shah's avatar
Neelay Shah committed
154
155

# NOTE
156
# We ignore model.py explicitly here to avoid mypy errors with duplicate modules
Neelay Shah's avatar
Neelay Shah committed
157
# pytest overrides the default mypy exclude configuration and so we exclude here as well
158
159
160
161
162
163
164
addopts = [
    "-ra",
    "--showlocals",
    "--strict-markers",
    "--strict-config",
    "--mypy",
    "--ignore-glob=*model.py",
Ryan Olson's avatar
Ryan Olson committed
165
    "--ignore-glob=*vllm_integration*",
166
    "--ignore-glob=*trtllm_integration*",
Richard Huo's avatar
Richard Huo committed
167
    "--ignore-glob=*kvbm/python/kvbm*",
168
    "--ignore-glob=*_inc.py",
169
    "--ignore-glob=*/llm/tensorrtllm*",
170
    "--ignore-glob=docs/*",
171
    "--ignore-glob=components/src/dynamo/sglang/request_handlers/*",
172
    "--ignore-glob=components/src/dynamo/sglang/multimodal_utils/*",
173
    "--ignore-glob=components/src/dynamo/vllm/multimodal_utils/*",
174
    "--ignore-glob=examples/backends/sglang/slurm_jobs/*",
175
176
    # FIXME: Get relative/generic blob paths to work here
]
177
178
179
xfail_strict = true
log_cli_level = "INFO"
filterwarnings = [
180
181
182
    "error",
    "ignore:.*cuda*:DeprecationWarning", # Need this to avoid deprecation warnings from CUDA in tensorrt_llm.
    "ignore:.*pkg_resources.*:DeprecationWarning",
183
184
    "ignore:.*pkg_resources.*:UserWarning",
    "ignore:.*multipart.*:PendingDeprecationWarning",
185
    "ignore:.*PyType_Spec.*custom tp_new.*:DeprecationWarning", # Ignore protobuf deprecation warning
186
187
188
    "ignore:.*unclosed.*socket.*:ResourceWarning", # Ignore unclosed socket warnings
    "ignore:.*unclosed event loop.*:ResourceWarning", # Ignore unclosed event loop warnings
    "ignore:.*Exception ignored in.*:pytest.PytestUnraisableExceptionWarning", # Ignore unraisable exception warnings
189
    "ignore:The pynvml package is deprecated.*:FutureWarning", # Ignore pynvml deprecation warning, temporary until upstream library updates to nvidia-ml-py
190
191
192
193
    # Pydantic V2 deprecation warnings from TRTLLM dependencies (raised at import time during collection)
    "ignore:Support for class-based `config`.*:pydantic.warnings.PydanticDeprecatedSince20",
    "ignore:Using extra keyword arguments on `Field`.*:pydantic.warnings.PydanticDeprecatedSince20",
    "ignore:The `schema` method is deprecated.*:pydantic.warnings.PydanticDeprecatedSince20",
194
195
    # Pydantic warning about field shadowing in tensorrt_llm.serve.openai_protocol.ResponseFormat
    'ignore:Field name "schema" in "ResponseFormat" shadows an attribute in parent:UserWarning',
196
197
    # pytest-benchmark automatically disables when xdist is active, ignore the warning
    "ignore:.*Benchmarks are automatically disabled.*:pytest_benchmark.logger.PytestBenchmarkWarning",
198

199
200
201
202
203
204
    ################################################################################################
    # vLLM
    ################################################################################################
    # vLLM tokenizer deprecation warning (AnyTokenizer moved to vllm.tokenizers.TokenizerLike)
    "ignore:.*vllm\\.transformers_utils\\.tokenizer\\.AnyTokenizer.*has been moved.*:DeprecationWarning",

205
206
207
    ################################################################################################
    # TRT-LLM
    ################################################################################################
208
209
210
211
212
    # torchao sometimes emits SyntaxWarning from docstrings (e.g. invalid escape sequences) at import
    # time; our global `error` policy would otherwise fail test collection. Do not rely on module=
    # matching here because these can be raised during compilation where the module field may not
    # match as expected.
    "ignore:.*invalid escape sequence.*:SyntaxWarning",
213
214
215
216
    # torchao deprecation warnings for import path changes (see https://github.com/pytorch/ao/issues/2752)
    "ignore:Importing.*torchao\\.dtypes.*:DeprecationWarning",
    # nvidia-modelopt warning about transformers version incompatibility
    "ignore:transformers version .* is incompatible with nvidia-modelopt.*:UserWarning",
217
]
218
219


220
221
# NOTE: Can also manually mark tests with @pytest.mark.asyncio
asyncio_mode = "auto"
222
223
224
# IMPORTANT: tests/conftest.py also registers a subset of these markers for
# environments where pyproject.toml is not available (e.g. some CI containers).
# Keep the marker definitions here and in tests/conftest.py synchronized.
Neelay Shah's avatar
Neelay Shah committed
225
markers = [
226
    "pre_merge: marks tests to run before merging",
227
    "post_merge: marks tests to run after merge",
228
    "parallel: marks tests that can run in parallel with pytest-xdist",
229
230
    "nightly: marks tests to run nightly",
    "weekly: marks tests to run weekly",
231
    "release: marks tests to run on release pipelines",
232
    "gpu_0: marks tests that don't require GPU",
Neelay Shah's avatar
Neelay Shah committed
233
234
    "gpu_1: marks tests to run on GPU",
    "gpu_2: marks tests to run on 2GPUs",
235
236
    "gpu_4: marks tests to run on 4GPUs",
    "gpu_8: marks tests to run on 8GPUs",
Neelay Shah's avatar
Neelay Shah committed
237
238
239
240
    "e2e: marks tests as end-to-end tests",
    "integration: marks tests as integration tests",
    "unit: marks tests as unit tests",
    "stress: marks tests as stress tests",
241
    "performance: marks tests as performance tests",
242
    "benchmark: marks tests as benchmark tests",
Neelay Shah's avatar
Neelay Shah committed
243
    "vllm: marks tests as requiring vllm",
244
    "trtllm: marks tests as requiring trtllm",
Neelay Shah's avatar
Neelay Shah committed
245
    "sglang: marks tests as requiring sglang",
246
    "multimodal: marks tests as multimodal (image/video) tests",
Ryan Olson's avatar
Ryan Olson committed
247
    "slow: marks tests as known to be slow",
248
    "h100: marks tests to run on H100",
249
    "aiconfigurator: marks e2e tests that cover aiconfigurator functionality",
250
251
    "router: marks tests for router component",
    "planner: marks tests for planner component",
Alec's avatar
Alec committed
252
    "kvbm: marks tests for KV behavior and model determinism",
253
    "kvbm_concurrency: marks concurrency stress tests for KVBM (runs separately)",
254
    "model: model id used by a test or parameter",
255
256
    "custom_build: marks tests that require custom builds or special setup (e.g., MoE models)",
    "k8s: marks tests as requiring Kubernetes",
257
    "fault_tolerance: marks tests as fault tolerance tests",
258
    "deploy: marks tests as deployment tests",
259
260
261
262
263
264
265
    # Built-in markers
    "skip: skip this test",
    "skipif: skip if condition is true",
    "xfail: expected failure",
    "usefixtures: use fixtures",
    "parametrize: parameterized test",
    "filterwarnings: filter warnings",
266
267
268
    "asyncio: asyncio test marker",
    # Third-party plugin markers
    "timeout: test timeout in seconds (pytest-timeout plugin)",
Neelay Shah's avatar
Neelay Shah committed
269
]
270
271
272
273
274
275
276

# Linting/formatting
[tool.ruff]
# Same as Black.
line-length = 88
indent-width = 4

Blazej's avatar
Blazej committed
277
278
[tool.ruff.lint.extend-per-file-ignores]
"icp/tests/**/test_*.py" = ["F811", "F401"]
279
"*_inc.py" = ["F821"]
Blazej's avatar
Blazej committed
280

281
282
283
284
285
286
287
288
289
# This is IDE (e.g. Cursor's default Python language server)
# Configure it so that developers can use "go-to-definition", "hover types" and other
# features.
[tool.basedpyright]
extraPaths = ["components/src", "lib/bindings/python/src"]
# This is for external dependencies.
venvPath = "."
venv = ".venv"

290
[tool.mypy]
Neelay Shah's avatar
Neelay Shah committed
291

292
293
# --disable-error-code: WAR large set of errors due to mypy not being run
#   previously. We can slowly enable sets of errors to fix over time.
Neelay Shah's avatar
Neelay Shah committed
294
295
# disable_error_code = []

296
# --explicit-package-bases: WAR errors about duplicate module names used
297
298
299
#   throughout the llm examples. For example, the common module in
#   tensorrt_llm and vllm are both named common.
explicit_package_bases = true
Neelay Shah's avatar
Neelay Shah committed
300

301
302
303
304
# --ignore-missing-imports: WAR too many errors when developing outside
#   of container environment with PYTHONPATH set and packages installed.
#   NOTE: Can possibly move mypy from pre-commit to a github action run only in
#   a container with the expected environment and PYTHONPATH setup.
Neelay Shah's avatar
Neelay Shah committed
305
306
ignore_missing_imports = true

307
308
309
310
check_untyped_defs = true

[[tool.mypy.overrides]]
# Skip mypy analysis on internal dependencies of vllm
311
module = ["vllm.*"]
312
follow_imports = "skip"
313
ignore_missing_imports = true
314

315
316
[tool.sphinx]

317
# extra-content-head
318
319
320
321
322
323
324
325
326
327
328
329
330
extra_content_head = [
   '''
   <script src="https://assets.adobedtm.com/5d4962a43b79/c1061d2c5e7b/launch-191c2462b890.min.js" ></script>
   ''',
]

#extra-content-footer
extra_content_footer = [
   '''
   <script type="text/javascript">if (typeof _satellite !== "undefined") {_satellite.pageBottom();}</script>
   ''',
]