Skip to content

Commit 8ec3c6b

Browse files
authored
Merge branch 'main' into ashar/hybrid-concurrency-detector
2 parents 3fdd2e6 + 195740b commit 8ec3c6b

232 files changed

Lines changed: 17384 additions & 1380 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/trivy-scan/action.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ runs:
2626
output: 'trivy-results.sarif'
2727
severity: ${{ inputs.severity }}
2828
exit-code: '1'
29+
# trivy-action drops the severity filter for SARIF output unless told
30+
# otherwise, which fails the scan on findings outside `severity` (e.g.
31+
# UNKNOWN-severity Go vulndb notes).
32+
limit-severities-for-sarif: 'true'
33+
version: 'v0.72.0'
2934

3035
- name: Upload Trivy SARIF to Security tab
3136
uses: github/codeql-action/upload-sarif@v4.35.4 # v4.35.4 68bde559dea0fdcac2102bfdf6230c5f70eb485e

.github/workflows/ci-pr-checks.yaml

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Matrix jobs (e2e-image-common, e2e-image-router, e2e-router) are each
2+
# followed by a *-status job that aggregates their result, since GitHub
3+
# required status checks cannot reference individual matrix legs.
14
name: CI - Test
25

36
on:
@@ -222,7 +225,7 @@ jobs:
222225
archive: llm-d-router-endpoint-picker
223226
- name: simulator
224227
source: pull
225-
image: ghcr.io/llm-d/llm-d-inference-sim:v0.9.2
228+
image: ghcr.io/llm-d/llm-d-inference-sim:v0.10.2
226229
archive: llm-d-inference-sim
227230
name: e2e-image-common (${{ matrix.image.name }})
228231
steps:
@@ -256,6 +259,19 @@ jobs:
256259
retention-days: 1
257260
compression-level: 0
258261

262+
e2e-image-common-status:
263+
needs: e2e-image-common
264+
if: always()
265+
runs-on: ubuntu-latest
266+
steps:
267+
- name: Check e2e-image-common result
268+
run: |
269+
result="${{ needs.e2e-image-common.result }}"
270+
if [[ "$result" != "success" && "$result" != "skipped" ]]; then
271+
echo "::error::e2e-image-common failed for at least one matrix image"
272+
exit 1
273+
fi
274+
259275
e2e-image-router:
260276
needs: check-changes
261277
if: ${{ needs.check-changes.outputs.src == 'true' }}
@@ -306,6 +322,19 @@ jobs:
306322
retention-days: 1
307323
compression-level: 0
308324

325+
e2e-image-router-status:
326+
needs: e2e-image-router
327+
if: always()
328+
runs-on: ubuntu-latest
329+
steps:
330+
- name: Check e2e-image-router result
331+
run: |
332+
result="${{ needs.e2e-image-router.result }}"
333+
if [[ "$result" != "success" && "$result" != "skipped" ]]; then
334+
echo "::error::e2e-image-router failed for at least one matrix image"
335+
exit 1
336+
fi
337+
309338
e2e-router:
310339
needs:
311340
- check-changes
@@ -393,3 +422,16 @@ jobs:
393422
PULL_VLLM_RENDER_IMAGE: "false"
394423
HF_TOKEN: ${{ secrets.HF_TOKEN }}
395424
run: make test-e2e-run
425+
426+
e2e-router-status:
427+
needs: e2e-router
428+
if: always()
429+
runs-on: ubuntu-latest
430+
steps:
431+
- name: Check e2e-router result
432+
run: |
433+
result="${{ needs.e2e-router.result }}"
434+
if [[ "$result" != "success" && "$result" != "skipped" ]]; then
435+
echo "::error::e2e-router failed for at least one matrix suite"
436+
exit 1
437+
fi

.github/workflows/md-link-check.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
uses: actions/checkout@v7
5050

5151
- name: Run lychee link checker
52-
uses: lycheeverse/lychee-action@v2.8.0
52+
uses: lycheeverse/lychee-action@v2.9.0
5353
with:
5454
# Exclude release-notes.d/ — fragments are sourced verbatim from
5555
# PR bodies; let the original PR's link check be authoritative.
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
name: Nightly - Router Perf Test (Optimized Baseline 10k-1k)
2+
3+
on:
4+
schedule:
5+
- cron: '0 9 * * *' # Run daily at 09:00 UTC
6+
workflow_dispatch: # Enable manual triggering from UI
7+
inputs:
8+
gcp_project_id:
9+
description: 'GCP Project ID'
10+
default: 'llm-d-scale'
11+
required: true
12+
type: string
13+
gke_cluster_name:
14+
description: 'GKE Cluster Name'
15+
default: 'llm-d-ap-usc1-router-perf'
16+
required: true
17+
type: string
18+
gke_cluster_zone:
19+
description: 'GKE Cluster Zone/Region'
20+
default: 'us-central1'
21+
required: true
22+
type: string
23+
sim_replicas:
24+
description: 'Number of simulator replicas'
25+
default: '10'
26+
required: true
27+
type: string
28+
router_config:
29+
description: 'Path to consolidated router Helm values configuration'
30+
default: 'test/perf/config/router-configs/optimized-baseline.yaml'
31+
required: true
32+
type: string
33+
test_name:
34+
description: 'Test identifier name'
35+
default: 'optimized-baseline-job1'
36+
required: true
37+
type: string
38+
perf_job:
39+
description: 'Performance job configuration path'
40+
default: 'test/perf/config/shared_prefix_job1.yaml'
41+
required: true
42+
type: string
43+
gcs_bucket:
44+
description: 'GCS bucket name for storing performance test results'
45+
default: 'llm-d-router-perf-results'
46+
required: true
47+
type: string
48+
49+
permissions:
50+
contents: read
51+
actions: read
52+
53+
jobs:
54+
run-perf-benchmark:
55+
runs-on: ubuntu-latest
56+
env:
57+
# This cluster must have the Gateway API Inference Extension CRDs
58+
# already installed in it.
59+
GCP_PROJECT_ID: ${{ inputs.gcp_project_id || 'llm-d-scale' }}
60+
GKE_CLUSTER_NAME: ${{ inputs.gke_cluster_name || 'llm-d-ap-usc1-router-perf' }}
61+
GKE_CLUSTER_ZONE: ${{ inputs.gke_cluster_zone || 'us-central1' }}
62+
SIM_REPLICAS: ${{ inputs.sim_replicas || '10' }}
63+
ROUTER_CONFIG: ${{ inputs.router_config || 'test/perf/config/router-configs/optimized-baseline.yaml' }}
64+
TEST_NAME: ${{ inputs.test_name || 'optimized-baseline-job1' }}
65+
PERF_JOB: ${{ inputs.perf_job || 'test/perf/config/shared_prefix_job1.yaml' }}
66+
GCS_BUCKET: ${{ inputs.gcs_bucket || 'llm-d-router-perf-results' }}
67+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
68+
steps:
69+
- name: Checkout llm-d/llm-d-router
70+
uses: actions/checkout@v6
71+
72+
- name: Checkout kubernetes-sigs/inference-perf
73+
uses: actions/checkout@v6
74+
with:
75+
repository: kubernetes-sigs/inference-perf
76+
path: inference-perf
77+
78+
- name: Authenticate to Google Cloud
79+
uses: google-github-actions/auth@v2
80+
with:
81+
credentials_json: ${{ secrets.GKE_SA_KEY }}
82+
83+
- name: Set up gcloud CLI and kubectl
84+
uses: google-github-actions/setup-gcloud@v2
85+
with:
86+
project_id: ${{ env.GCP_PROJECT_ID }}
87+
install_components: 'kubectl,gke-gcloud-auth-plugin'
88+
89+
- name: Get GKE credentials
90+
run: |
91+
gcloud container clusters get-credentials "${{ env.GKE_CLUSTER_NAME }}" \
92+
--zone "${{ env.GKE_CLUSTER_ZONE }}" \
93+
--project "${{ env.GCP_PROJECT_ID }}"
94+
95+
- name: Install helm
96+
run: |
97+
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
98+
99+
- name: Set up Python
100+
uses: actions/setup-python@v5
101+
with:
102+
python-version: "3.10"
103+
104+
- name: Install Graphviz
105+
run: |
106+
sudo apt-get update && sudo apt-get install -y graphviz
107+
108+
- name: Install Python dependencies
109+
run: |
110+
python3 -m pip install --upgrade pip
111+
python3 -m pip install pyyaml
112+
113+
- name: Run Performance Test Script
114+
run: |
115+
python3 test/perf/run_nightly_perf.py \
116+
--router-config ${{ env.ROUTER_CONFIG }} \
117+
--test-name ${{ env.TEST_NAME }} \
118+
--perf-chart ${{ github.workspace }}/inference-perf/deploy/inference-perf \
119+
--perf-job ${{ env.PERF_JOB }} \
120+
--sim-replicas ${{ env.SIM_REPLICAS }} \
121+
--results-dir test/perf/results/optimized-baseline \
122+
--router-machine-family e2 \
123+
--gcp-project ${{ env.GCP_PROJECT_ID }} \
124+
--collect-pprof-profiles \
125+
--gcs-bucket ${{ env.GCS_BUCKET }}
126+
127+
- name: Upload Performance Results Artifact
128+
uses: actions/upload-artifact@v4
129+
if: always()
130+
with:
131+
name: epp-perf-results
132+
path: test/perf/results/optimized-baseline/

.github/workflows/pr-rebase.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jobs:
7070
7171
- name: Checkout base repo
7272
if: steps.check-access.outputs.skip != 'true'
73-
uses: actions/checkout@v4
73+
uses: actions/checkout@v7
7474
with:
7575
ref: ${{ steps.pr.outputs.base-ref }}
7676
fetch-depth: 0

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,7 @@ vendor
5353
# Helm dependency artifacts
5454
config/charts/*/charts/
5555
config/charts/*/Chart.lock
56+
57+
# Performance benchmark local results directory
58+
test/perf/__pycache__/
59+
test/perf/results/

.golangci.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ linters:
4545
text: "avoid meaningless package names"
4646
- linters: [revive]
4747
text: "avoid package names that conflict with Go standard library package names"
48+
# Packages transferred verbatim from llm-d-kv-cache (#1862); style cleanup tracked separately
49+
- path: pkg/(kvcache|kvevents|telemetry|utils)/
50+
linters:
51+
- revive
52+
- perfsprint
53+
- goconst
54+
- dupword
55+
- prealloc
4856
settings:
4957
importas:
5058
no-unaliased: false # unaliased imports are allowed; only enforce when an alias is used

CODEOWNERS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
# Tokenization
4545
/pkg/epp/framework/plugins/requestcontrol/dataproducer/tokenizer/ @vMaroon @liu-cong @sagearc @llm-d/router-maintainers
4646

47+
# KV-cache subsystem — indexer, KV-block index, KV-events
48+
/pkg/kvcache/ @vMaroon @liu-cong @hyeongyun0916 @yankay @sagearc @llm-d/router-maintainers
49+
/pkg/kvevents/ @vMaroon @liu-cong @hyeongyun0916 @yankay @sagearc @llm-d/router-maintainers
50+
4751
# Request handling
4852
/pkg/epp/framework/interface/requesthandling/ @zetxqx @llm-d/router-maintainers
4953
/pkg/epp/framework/plugins/requesthandling/ @zetxqx @llm-d/router-maintainers

DEVELOPMENT.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ Creates a new `kind` cluster (or reuses an existing one) in the `default` namesp
8585
> [!NOTE]
8686
> You can pre-pull external images to avoid slow downloads:
8787
> ```
88-
> docker pull ghcr.io/llm-d/llm-d-inference-sim:v0.9.2
88+
> docker pull ghcr.io/llm-d/llm-d-inference-sim:v0.10.2
8989
> docker pull vllm/vllm-openai-cpu:v0.21.0
9090
> ```
9191
@@ -447,7 +447,7 @@ The `deploy/components/` directory contains all reusable Kustomize components:
447447
- `vllm-decode/` — Decode pod with routing sidecar
448448

449449
**Deployment overlays** — applied on top of the base components:
450-
- `overlays/simulator/` — adds `--mode=${VLLM_SIM_MODE}`, vllm renderer sidecar, KV cache args, and `--zmq-endpoint` on Decode. Included by default in all dev scenario overlays.
450+
- `overlays/simulator/` — adds `--mode=${VLLM_SIM_MODE}`, KV cache args, and `--zmq-endpoint` on Decode. Included by default in all dev scenario overlays.
451451
- `overlays/real-vllm/` — adds `--kv-events-config` on Decode, `--ec-transfer-config` on Encode, and a shared PVC for encoder embeddings.
452452

453453
**Infrastructure components** — shared cluster infrastructure:
@@ -523,12 +523,12 @@ a shared PVC (`ec-cache-pvc`) for encoder embeddings transfer.
523523

524524
| Component | What it adds | When to use |
525525
|---|---|---|
526-
| `overlays/simulator/` | `--mode=${VLLM_SIM_MODE}`, vLLM renderer, KV cache args, `--zmq-endpoint` on Decode | Dev/test with simulator image |
526+
| `overlays/simulator/` | `--mode=${VLLM_SIM_MODE}`, KV cache args, `--zmq-endpoint` on Decode | Dev/test with simulator image |
527527
| `overlays/real-vllm/` | `--kv-events-config` on Decode (per-pod ZMQ publisher), `--ec-transfer-config` on Encode, ec-cache PVC | Production with real vLLM image |
528528

529529
| Variable | Default | Description |
530530
|---|---|---|
531-
| `VLLM_IMAGE` | `ghcr.io/llm-d/llm-d-inference-sim:v0.9.2` | vLLM container image to deploy. Can be a simulator or a real vLLM image (e.g., `vllm/vllm-openai:v0.16.0`). Defaults to the simulator image. |
531+
| `VLLM_IMAGE` | `ghcr.io/llm-d/llm-d-inference-sim:v0.10.2` | vLLM container image to deploy. Can be a simulator or a real vLLM image (e.g., `vllm/vllm-openai:v0.16.0`). Defaults to the simulator image. |
532532
| `VLLM_SIM_MODE` | `echo` | Simulator response mode. `echo` returns the input prompt as the response (useful for routing validation). `random` returns random sentences from a pre-defined bank. Only applies when using the simulator overlay. |
533533

534534
### Cleanup
@@ -622,7 +622,7 @@ kubectl --context kind-e2e-tests get pods
622622
| `VLLM_EXTRA_ARGS_E` | _(empty)_ | Additional flags for the Encoder vLLM container (e.g. `--mm-processor-kwargs={}`) |
623623
| `VLLM_EXTRA_ARGS_P` | _(empty)_ | Additional flags for the Prefill vLLM container (e.g. `--gpu-memory-utilization=0.9`) |
624624
| `VLLM_EXTRA_ARGS_D` | _(empty)_ | Additional flags for the Decode vLLM container (e.g. `--tensor-parallel-size=2`) |
625-
| `VLLM_IMAGE` | `ghcr.io/llm-d/llm-d-inference-sim:v0.9.2` | vLLM container image to deploy. Can be a simulator or a real vLLM image (e.g., `vllm/vllm-openai:v0.16.0`) |
625+
| `VLLM_IMAGE` | `ghcr.io/llm-d/llm-d-inference-sim:v0.10.2` | vLLM container image to deploy. Can be a simulator or a real vLLM image (e.g., `vllm/vllm-openai:v0.16.0`) |
626626
| `VLLM_SIM_MODE` | `echo` | Simulator response mode. Supported values: `echo` (returns the input prompt as the response), `random` (returns a random sentence from a pre-defined bank) |
627627
| `SIDECAR_IMAGE` | `ghcr.io/llm-d/llm-d-router-disagg-sidecar:dev` | Routing sidecar image loaded into the Kind cluster |
628628
| `VLLM_RENDER_IMAGE` | `vllm/vllm-openai-cpu:v0.21.0` | vLLM renderer image loaded into the Kind cluster |

Dockerfile.builder

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
FROM golang:1.25.12
1+
FROM golang:1.26.5
22

33
RUN mkdir /app
44
WORKDIR /app
55

66
ARG TYPOS_VERSION=v1.34.0
77
ARG KIND_VERSION=v0.27.0
8-
ARG GOLANGCI_LINT_VERSION=v2.8.0
8+
ARG GOLANGCI_LINT_VERSION=v2.10.0
99
ARG KUBECTL_VERSION=v1.35.3
1010
ARG KUSTOMIZE_VERSION=v5.6.0
1111
ARG DOCKER_VERSION=29.3.0

0 commit comments

Comments
 (0)