Skip to content

Commit a60fe0c

Browse files
[vllm-triage] Detect test-level regressions in jobs that fail on both twins (#8521)
This PR fills a gap in the new error detection The following will now be covered with the following behavior: If Job A fails in vllm pytorch nightly with tests 1/2 failing and Job A fails in vllm full ci with test 1, then new error (test 2) is never detected and nothing is pulled. Now Job A test 2 will come up with as a new failure. We know this without looking at the exception chain. In addition if a new failure from the above is detected. We record the exception chains of the shared test failures for that job test 1 and will let the agent determine if there are any additional failures for that job.
1 parent 5ae9e8a commit a60fe0c

5 files changed

Lines changed: 907 additions & 44 deletions

File tree

.github/workflows/vllm-torch-nightly-triage.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ jobs:
170170
- cluster-logs/*.log one representative Buildkite log per cluster,
171171
ANSI-stripped and tail-trimmed. The first lines of each file give the
172172
cluster name, job name, job URL, state and exit status.
173+
Files prefixed `both_` are red-on-both-twins clusters (see report.json
174+
"regressed_tests"): the job fails on both the torch-nightly and
175+
baseline build, but fails MORE tests on nightly. A "shared failure(s)"
176+
section pairs each shared failure's torch_nightly_exception_chain and
177+
baseline_exception_chain so you can judge whether a shared failure
178+
changed. Only the torch-nightly-only tests listed above that section
179+
are definitely new.
173180
174181
For each cluster, identify the actual failure: the failed test IDs and the
175182
real exception. Remember that "Engine core initialization failed. See root

tools/torchci/tests/test_vllm_log_parser.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import unittest
88
from pathlib import Path
99

10-
from torchci.vllm_log_parser import parse_log, strip_markers
10+
from torchci.vllm_log_parser import get_test_signature, parse_log, strip_markers
1111

1212

1313
FIXTURES_DIR = Path(__file__).parent / "fixtures"
@@ -889,5 +889,24 @@ def test_undefined_symbol_not_tagged(self) -> None:
889889
self.assertFalse(parsed_log.job_is_infra)
890890

891891

892+
class TestGetTestSignature(unittest.TestCase):
893+
"""Signature is the (test_id, pytest_exception_class) 2-tuple."""
894+
895+
def test_signature_is_id_and_class(self) -> None:
896+
log = (
897+
"FAILED tests/test_a.py::test_one - ValueError: bad\n= 1 failed in 1.00s ="
898+
)
899+
failure = parse_log(log).pytest_results[0].test_failures[0]
900+
self.assertEqual(
901+
get_test_signature(failure),
902+
("tests/test_a.py::test_one", "ValueError"),
903+
)
904+
905+
def test_signature_empty_class_for_bare_failed(self) -> None:
906+
log = "FAILED tests/test_a.py::test_one\n= 1 failed in 1.00s ="
907+
failure = parse_log(log).pytest_results[0].test_failures[0]
908+
self.assertEqual(get_test_signature(failure), ("tests/test_a.py::test_one", ""))
909+
910+
892911
if __name__ == "__main__":
893912
unittest.main()

0 commit comments

Comments
 (0)