-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathpyproject.toml
More file actions
228 lines (204 loc) · 7.55 KB
/
Copy pathpyproject.toml
File metadata and controls
228 lines (204 loc) · 7.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
[build-system]
requires = ["setuptools>=64", "setuptools_scm>=8", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "amd-aorta"
# The version is not hard-coded here: it is derived from git tags at build time
# by setuptools_scm (see [tool.setuptools_scm]). ``dynamic`` tells setuptools the
# version is supplied by the build backend, so there is a single source of truth
# (the ``vX.Y.Z`` tag) that both released wheels and local/editable installs read.
dynamic = ["version"]
description = "PyTorch compute-communication overlap debugging toolkit with GPU hardware queue evaluation"
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.10"
authors = [
{name = "AMD ROCm Team"}
]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: System :: Hardware",
]
keywords = ["gpu", "rocm", "amd", "pytorch", "cuda", "benchmark", "fsdp", "distributed-training", "hardware-queue"]
# Base dependencies (PyTorch installed separately - see requirements.txt)
dependencies = [
"pyyaml>=6.0",
"click>=8.0.0", # For aorta CLI
]
[project.scripts]
aorta = "aorta.cli:main"
# Plugin discovery: workloads register here via aorta.workloads entry-point group.
# Public workloads (when they land) register here; private workloads
# register from downstream packages' pyproject.toml under the same group.
#
# ``_subprocess`` is platform-internal: it wraps an opaque user launch
# command for ``aorta probe`` (issue #188). The leading underscore both
# (a) prevents collision with user-facing workload names and (b) marks
# the entry as visibly platform-internal in ``aorta triage list-workloads``
# when that command lands. Direct ``aorta run --workload _subprocess``
# invocations fail at ``SubprocessWorkload.setup()`` because the
# reserved argv config key is only injected by ``aorta probe``.
[project.entry-points."aorta.workloads"]
_subprocess = "aorta.workloads._subprocess:SubprocessWorkload"
hrx = "aorta.workloads.hrx:HrxWorkload"
hrx_perf = "aorta.workloads.hrx_perf:HrxPerfWorkload"
inference = "aorta.workloads.inference:InferenceWorkload"
llm_determinism = "aorta.workloads.llm_determinism:LlmDeterminismWorkload"
race = "aorta.workloads.race:RaceWorkload"
# Single-process GPU smoke test (no torchrun); ideal for emulated/CI runs.
gpu_smoke = "aorta.workloads.gpu_smoke:GpuSmokeWorkload"
training = "aorta.workloads.training:TrainingWorkload"
# Side-effect-free isolation metadata. The dispatcher reads these entry-point
# values without importing workload modules, so ``--dry-run`` and ``auto``
# policy resolution cannot trigger torch/native-library imports. Third-party
# process-capable workloads register the same group alongside aorta.workloads.
[project.entry-points."aorta.workload_policies"]
_subprocess = "aorta.run.validation:IN_PROCESS_REQUIRED_POLICY"
llm_determinism = "aorta.run.validation:PROCESS_OPTIONAL_POLICY"
race = "aorta.run.validation:PROCESS_REQUIRED_POLICY"
[project.entry-points."aorta.workload_startup_env"]
race = "aorta.run.validation:race_startup_env"
[project.optional-dependencies]
# For analysis/visualization scripts
analysis = [
"matplotlib>=3.7.0",
]
# For aorta-report CLI (full functionality)
report = [
"numpy>=1.20.0",
"pandas>=1.3.0",
"openpyxl>=3.0.0",
"matplotlib>=3.7.0",
"seaborn>=0.12.0",
"beautifulsoup4>=4.12.0",
]
# For hw_queue_eval subpackage
hw-queue = [
"numpy>=1.20.0",
"pandas>=1.3.0",
"tabulate>=0.9.0",
]
# For hw_queue_eval profiling features
hw-queue-profiling = [
"amd-aorta[hw-queue]",
"matplotlib>=3.5.0",
"seaborn>=0.12.0",
]
# For aorta agent closed-loop (LiteLLM proposer)
agent = [
"litellm>=1.0.0",
]
# For aorta.ebpf kernel tracing module.
# The runtime requirements are the bpftrace binary and CAP_BPF/CAP_PERFMON
# (or sudo); no Python deps beyond the base.
ebpf = []
# Test-only tooling (pytest + plugins). Kept separate from `dev` so the CI
# test jobs can install a slim environment without the lint/type tooling.
tests = [
"pytest>=8.0.0",
"pytest-cov>=4.1.0",
"pytest-timeout>=2.1.0",
"pytest-xdist>=3.3.0",
"pytest-forked>=1.6.0", # per-test process isolation for the CPU CI gate
]
# Development dependencies (tests + lint/type tooling)
dev = [
"amd-aorta[tests]",
"pre-commit>=3.0.0",
"black>=23.0.0",
"isort>=5.12.0",
"mypy>=1.0.0",
"ruff>=0.1.0",
]
# Full installation
all = [
"amd-aorta[analysis]",
"amd-aorta[report]",
"amd-aorta[hw-queue]",
"amd-aorta[hw-queue-profiling]",
"amd-aorta[agent]",
"amd-aorta[dev]",
]
[project.urls]
Homepage = "https://github.com/ROCm/aorta"
Documentation = "https://github.com/ROCm/aorta#readme"
Repository = "https://github.com/ROCm/aorta"
[tool.setuptools_scm]
# Single source of truth for the version: the ``vX.Y.Z`` git tags.
# * a checkout sitting exactly on a tag builds a clean ``X.Y.Z``;
# * a checkout ahead of the latest tag builds ``X.Y.(Z+1).devN+g<sha>`` so a
# local ``pip install .`` / ``pip install git+...`` always reflects the most
# recent release (plus how far past it the tree is), never a stale literal.
# Only exact ``vMAJOR.MINOR.PATCH`` tags are matched (same shape as
# ``scripts/bump_version.py``), so neither the rolling ``dev-wheels`` nightly tag
# nor a stray ``v1`` / ``v1beta`` / ``v0.2.0rc1`` / ``v1.2.3.4`` tag can be
# mistaken for a release. The ``--match`` glob is only a coarse first pass (glob
# ``*`` also spans dots, so it alone still admits ``v0.2.0rc1`` and
# ``v1.2.3.4``); ``--exclude`` drops any tag carrying a non-digit/non-dot
# character or a fourth numeric segment, and ``tag_regex`` then anchors the
# extracted version to exactly three numeric components with no leading zeros
# (so it round-trips through the integer parsing in ``bump_version.py`` and the
# release gate unchanged). A tree with no git
# metadata (e.g. an unpacked sdist without .git) falls back to the literal below;
# built sdists/wheels embed the resolved version in their metadata, so installing
# from those still reports the correct version.
tag_regex = "^v(?P<version>(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*))$"
git_describe_command = [
"git",
"describe",
"--dirty",
"--tags",
"--long",
"--match",
"v[0-9]*.[0-9]*.[0-9]*",
"--exclude",
"v*[!0-9.]*",
"--exclude",
"v*.*.*.*",
]
fallback_version = "0.0.0+unknown"
[tool.setuptools.packages.find]
where = ["src"]
include = ["aorta*"]
[tool.setuptools.package-data]
aorta = [
"py.typed",
"ebpf/scripts/*.bt",
"ebpf/scripts/PROVENANCE.md",
"workloads/hrx_kernels/*.cpp",
"workloads/hrx_kernels/README.md",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
addopts = "-v --tb=short"
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"gpu: marks tests that require GPU",
"rocm: marks tests that require ROCm specifically",
"hw_queue: marks hw_queue_eval tests",
]
[tool.black]
line-length = 100
target-version = ['py310', 'py311', 'py312']
include = '\.pyi?$'
[tool.isort]
profile = "black"
line_length = 100
[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
ignore_missing_imports = true
[tool.ruff]
line-length = 100
select = ["E", "F", "W", "I", "N", "UP", "B", "C4"]
ignore = ["E501"]