@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 18551e820c
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 15, 18:30 UTC

[V1] TPU - Fix CI/CD runner (#14974)

Alexander Matveev committed Mar 17, 2025 at 17:07 UTC 18551e820c10f2e834050b94dc41b384232b10e2
4 files changed +69 -65
.buildkite/run-tpu-test.sh deleted
-25
@@ -1,25 +0,0 @@
1 -#!/bin/bash
2 -
3 -set -e
4 -
5 -# Build the docker image.
6 -docker build -f Dockerfile.tpu -t vllm-tpu .
7 -
8 -# Set up cleanup.
9 -remove_docker_container() { docker rm -f tpu-test || true; }
10 -trap remove_docker_container EXIT
11 -# Remove the container that might not be cleaned up in the previous run.
12 -remove_docker_container
13 -
14 -# For HF_TOKEN.
15 -source /etc/environment
16 -# Run a simple end-to-end example.
17 -docker run --privileged --net host --shm-size=16G -it \
18 - -e "HF_TOKEN=$HF_TOKEN" --name tpu-test \
19 - vllm-tpu /bin/bash -c "python3 -m pip install git+https://github.com/thuml/depyf.git \
20 - && python3 -m pip install pytest \
21 - && python3 -m pip install lm_eval[api]==0.4.4 \
22 - && pytest -v -s /workspace/vllm/tests/tpu/test_custom_dispatcher.py \
23 - && python3 /workspace/vllm/tests/tpu/test_compilation.py \
24 - && python3 /workspace/vllm/tests/tpu/test_quantization_accuracy.py \
25 - && python3 /workspace/vllm/examples/offline_inference/tpu.py"
.buildkite/run-tpu-v1-test.sh
+16 -7
@@ -15,13 +15,22 @@ remove_docker_container
15 source /etc/environment
16 # Run a simple end-to-end example.
17 docker run --privileged --net host --shm-size=16G -it \
18 - -e "HF_TOKEN=$HF_TOKEN" -e "VLLM_USE_V1=1" --name tpu-test \
18 + -e "HF_TOKEN=$HF_TOKEN" --name tpu-test \
19 vllm-tpu /bin/bash -c "python3 -m pip install git+https://github.com/thuml/depyf.git \
20 && python3 -m pip install pytest \
21 && python3 -m pip install lm_eval[api]==0.4.4 \
22 - && pytest -v -s /workspace/vllm/tests/tpu/test_custom_dispatcher.py \
23 - && pytest -v -s /workspace/vllm/tests/v1/tpu/test_basic.py \
24 - && pytest -v -s /workspace/vllm/tests/entrypoints/llm/test_accuracy.py::test_lm_eval_accuracy_v1_engine \
25 - && python3 /workspace/vllm/tests/tpu/test_compilation.py \
26 - && python3 /workspace/vllm/tests/tpu/test_quantization_accuracy.py \
27 - && python3 /workspace/vllm/examples/offline_inference/tpu.py"
22 + && echo TEST_1 \
23 + && VLLM_USE_V1=1 pytest -v -s /workspace/vllm/tests/v1/tpu/test_basic.py \
24 + && echo TEST_2 \
25 + && VLLM_USE_V1=1 pytest -v -s /workspace/vllm/tests/entrypoints/llm/test_accuracy.py::test_lm_eval_accuracy_v1_engine \
26 + && echo TEST_3 \
27 + && VLLM_USE_V1=1 pytest -s -v /workspace/vllm/tests/tpu/test_quantization_accuracy.py \
28 + && echo TEST_4 \
29 + && VLLM_USE_V1=1 python3 /workspace/vllm/examples/offline_inference/tpu.py" \
30 + && echo TEST_5 \
31 + && VLLM_USE_V1=1 python3 /workspace/vllm/tests/tpu/test_compilation.py \
32 +
33 +
34 +# TODO: Fix these tests
35 +# && VLLM_USE_V1=1 pytest -v -s /workspace/vllm/tests/tpu/test_custom_dispatcher.py \
36 +
tests/tpu/test_compilation.py
+39 -24
@@ -34,7 +34,9 @@ with depyf.prepare_debug(temp_dir):
34
35 # disable custom dispatcher, let Dynamo takes over
36 # all the control
37 - llm = LLM(model="google/gemma-2b",
37 + llm = LLM(model="Qwen/Qwen2.5-1.5B-Instruct",
38 + max_model_len=512,
39 + max_num_seqs=64,
40 enforce_eager=True,
41 compilation_config={"level": CompilationLevel.DYNAMO_AS_IS})
42 outputs = llm.generate(prompts, sampling_params)
@@ -44,38 +46,51 @@ with depyf.prepare_debug(temp_dir):
46 print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
47 assert generated_text.startswith(answer)
48
47 -compiled_code = sorted(
49 +compiled_codes = sorted(
50 glob.glob(os.path.join(temp_dir, "__transformed_code*.py")))
51
50 -# we should only trigger Dynamo compilation three times:
51 -# one for the profiling phase without kv cache
52 -# one for the prefill phase with symbolic shapes
53 -# one for the decode phase with symbolic shapes
52 +for i, compiled_code in enumerate(compiled_codes):
53 + print("{} file: {}".format(i + 1, compiled_code))
54 +
55 +# We should only trigger Dynamo compilation 4 times:
56 +# 1. forward pass (symbolic)
57 +# 2. compute_logits (symbolic)
58 +# 3. forward pass (shape 16)
59 +# 4. forward pass (shape 32)
60 # and later calls should not trigger Dynamo compilation again.
55 -# NOTE: it might still trigger XLA compilation.
61 +# NOTE: It might still trigger XLA compilation.
62 +
63 +# Check we have 4 compiled codes
64 +assert len(compiled_codes) == 4
65
57 -# check we have three compiled code
58 -# this is the assumption when we use the custom dispatcher
59 -assert len(compiled_code) == 3
66 +kv_cache_prefix = "kv_cache"
67 +attn_prefix = "ragged_paged_attention"
68
61 -# check all the compilations are as expected
62 -compiled_fn = sorted(
69 +# Check all the compilations are as expected
70 +compiled_fns = sorted(
71 glob.glob(os.path.join(temp_dir, "__compiled_fn*Captured*.py")))
72
65 -# the first compilation is the profiling phase,
66 -# it should not have any kv cache
67 -with open(compiled_fn[0]) as f:
73 +for i, compiled_fn in enumerate(compiled_fns):
74 + print("{} file: {}".format(i + 1, compiled_fn))
75 +
76 +# The first compilation is symbolic, so it should not have any kv_caches
77 +with open(compiled_fns[0]) as f:
78 + content = f.read()
79 + assert kv_cache_prefix not in content
80 +
81 +# The second compilation is symbolic, so it should not have any kv_caches
82 +with open(compiled_fns[1]) as f:
83 content = f.read()
69 - assert "kv_caches" not in content
84 + assert kv_cache_prefix not in content
85
71 -# the second compilation is the prefill phase,
72 -# it should have kv cache and the flash_attention op
73 -with open(compiled_fn[1]) as f:
86 +# The third compilation is shape 16, so it should have kv_caches and the
87 +# ragged_paged_attention
88 +with open(compiled_fns[2]) as f:
89 content = f.read()
75 - assert "kv_caches" in content and "torch.ops.xla.flash_attention" in content
90 + assert (kv_cache_prefix in content and attn_prefix in content)
91
77 -# the third compilation is the decode phase,
78 -# it should have kv cache and the paged_attention op
79 -with open(compiled_fn[2]) as f:
92 +# The forth compilation is shape 32, so it should have kv_caches and the
93 +# ragged_paged_attention
94 +with open(compiled_fns[3]) as f:
95 content = f.read()
81 - assert "kv_caches" in content and "torch.ops.xla.paged_attention" in content
96 + assert (kv_cache_prefix in content and attn_prefix in content)
tests/tpu/test_custom_dispatcher.py
+14 -9
@@ -14,12 +14,17 @@ from ..utils import compare_two_settings
14 def test_custom_dispatcher(monkeypatch: pytest.MonkeyPatch):
15 with monkeypatch.context() as m:
16 m.setenv("VLLM_RPC_TIMEOUT", "30000")
17 - compare_two_settings(
18 - "google/gemma-2b",
19 - arg1=[
20 - "--enforce-eager",
21 - f"-O{CompilationLevel.DYNAMO_ONCE}",
22 - ],
23 - arg2=["--enforce-eager", f"-O{CompilationLevel.DYNAMO_AS_IS}"],
24 - env1={},
25 - env2={})
17 + compare_two_settings("Qwen/Qwen2.5-1.5B-Instruct",
18 + arg1=[
19 + "--max-model-len=256",
20 + "--max-num-seqs=32",
21 + "--enforce-eager",
22 + f"-O{CompilationLevel.DYNAMO_ONCE}",
23 + ],
24 + arg2=[
25 + "--max-model-len=256", "--max-num-seqs=32",
26 + "--enforce-eager",
27 + f"-O{CompilationLevel.DYNAMO_AS_IS}"
28 + ],
29 + env1={},
30 + env2={})