Skip to content

Commit 2b207b0

Browse files
authored
Merge branch 'main' into feat/dist-build-fast
2 parents dafc0cd + f320995 commit 2b207b0

16 files changed

Lines changed: 355 additions & 41 deletions

.github/pages/index.html

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>ROCm AMD Infinity Context</title>
7+
<style>
8+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9+
10+
body {
11+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
12+
background: #0d1117;
13+
color: #e6edf3;
14+
min-height: 100vh;
15+
display: flex;
16+
flex-direction: column;
17+
align-items: center;
18+
padding: 3rem 1.5rem;
19+
}
20+
21+
header {
22+
text-align: center;
23+
max-width: 680px;
24+
margin-bottom: 3rem;
25+
}
26+
27+
header h1 {
28+
font-size: 2rem;
29+
font-weight: 700;
30+
color: #f0f6fc;
31+
margin-bottom: 0.5rem;
32+
}
33+
34+
header p {
35+
font-size: 1rem;
36+
color: #8b949e;
37+
line-height: 1.6;
38+
}
39+
40+
.cards {
41+
display: flex;
42+
gap: 1.5rem;
43+
flex-wrap: wrap;
44+
justify-content: center;
45+
max-width: 840px;
46+
width: 100%;
47+
}
48+
49+
.card {
50+
background: #161b22;
51+
border: 1px solid #30363d;
52+
border-radius: 10px;
53+
padding: 1.75rem 2rem;
54+
flex: 1 1 320px;
55+
max-width: 380px;
56+
text-decoration: none;
57+
color: inherit;
58+
transition: border-color 0.15s, box-shadow 0.15s;
59+
}
60+
61+
.card:hover {
62+
border-color: #58a6ff;
63+
box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.15);
64+
}
65+
66+
.card-icon {
67+
font-size: 1.75rem;
68+
margin-bottom: 0.75rem;
69+
}
70+
71+
.card h2 {
72+
font-size: 1.1rem;
73+
font-weight: 600;
74+
color: #58a6ff;
75+
margin-bottom: 0.5rem;
76+
}
77+
78+
.card p {
79+
font-size: 0.9rem;
80+
color: #8b949e;
81+
line-height: 1.6;
82+
}
83+
84+
footer {
85+
margin-top: 4rem;
86+
font-size: 0.8rem;
87+
color: #484f58;
88+
text-align: center;
89+
}
90+
91+
footer a { color: #484f58; text-decoration: underline; }
92+
</style>
93+
</head>
94+
<body>
95+
<header>
96+
<h1>ROCm AMD Infinity Context</h1>
97+
<p>
98+
A disaggregated KV-cache inference stack for large language models on AMD
99+
Instinct GPUs. Combines vLLM with LMCache to offload KV tensors across GPU
100+
VRAM, CPU DRAM, local NVMe, and NFS-over-RDMA.
101+
</p>
102+
</header>
103+
104+
<div class="cards">
105+
<a class="card" href="prometheus/">
106+
<div class="card-icon">📊</div>
107+
<h2>Prometheus Metrics Reference</h2>
108+
<p>
109+
Full catalogue of every metric exposed by the AIC monitoring stack —
110+
node exporter, NVMe exporter, RDMA exporter, and the vLLM/LMCache
111+
inference exporters. Generated nightly from live scrape data.
112+
</p>
113+
</a>
114+
115+
<a class="card" href="cliff/">
116+
<div class="card-icon">⛰️</div>
117+
<h2>Cliff Performance Dashboard</h2>
118+
<p>
119+
Nightly KV-cache cliff benchmark results across all three storage arms:
120+
VRAM-only, NVMe (GDS), and NFS-over-RDMA. Tracks throughput and
121+
latency trends over time.
122+
</p>
123+
</a>
124+
</div>
125+
126+
<footer>
127+
<a href="https://github.com/ROCm/rocm-aic">ROCm/rocm-aic</a> on GitHub
128+
</footer>
129+
</body>
130+
</html>

.github/scripts/spur-monitoring-cpu-smoke.sh

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ METRICS_PAGE_DIR="${AIC_SHARED_NFS}/${USER}/metrics-page-${SHORT}"
4848
4949
cleanup() {
5050
echo "=== Cleaning up ==="
51-
rm -rf "${WORKDIR}" "${METRICS_PAGE_DIR}"
51+
rm -rf "${WORKDIR}"
5252
}
5353
trap cleanup EXIT
5454
@@ -90,8 +90,11 @@ if [[ "${AIC_SMOKE_USE_REGISTRY}" == "1" ]]; then
9090
docker pull "${AIC_IMAGE}"
9191
else
9292
echo "=== Loading image from ${TARBALL_DIR} ==="
93-
tarball="$(find "${TARBALL_DIR}" -maxdepth 1 \( -name '*.tar.zst' -o -name '*.tar.gz' -o -name '*.tar' \) 2>/dev/null | head -1)"
94-
[[ -n "${tarball}" ]] || { echo "ERROR: no tarball in ${TARBALL_DIR}" >&2; ls -la "${TARBALL_DIR}" >&2 || true; exit 1; }
93+
# Match only the main image tarball: run-build-distribute.sh names it
94+
# "${base}-${arch_tag}.{ext}" where base = AIC_IMAGE with '/:' -> '--'.
95+
img_base="$(printf '%s' "${AIC_IMAGE}" | tr '/:' '--')"
96+
tarball="$(find "${TARBALL_DIR}" -maxdepth 1 -name "${img_base}-*.tar.zst" -o -name "${img_base}-*.tar.gz" -o -name "${img_base}-*.tar" 2>/dev/null | head -1)"
97+
[[ -n "${tarball}" ]] || { echo "ERROR: no tarball for ${AIC_IMAGE} in ${TARBALL_DIR}" >&2; ls -la "${TARBALL_DIR}" >&2 || true; exit 1; }
9598
case "${tarball}" in
9699
*.tar.zst) zstd -dc "${tarball}" | docker load ;;
97100
*.tar.gz) gzip -dc "${tarball}" | docker load ;;
@@ -100,7 +103,7 @@ else
100103
fi
101104
102105
MON_DIR="${WORKDIR}/monitoring"
103-
METRICS_DIR="/tmp/aic-prom-tsdb-${SHORT}"
106+
METRICS_DIR="${METRICS_PAGE_DIR}/prom-tsdb"
104107
mkdir -p "${METRICS_DIR}" "${METRICS_PAGE_DIR}"
105108
106109
export AIC_IMAGE MON_DIR AIC_METRICS_DIR="${METRICS_DIR}"
@@ -175,12 +178,13 @@ docker run -d --name aic-prometheus \
175178
# ---------------------------------------------------------------------------
176179
echo "=== Starting vLLM emulator (8000) ==="
177180
docker run -d --name aic-vllm-emulator \
181+
--entrypoint python3 \
178182
--network host \
179183
-v "${WORKDIR}/monitoring/scripts/vllm_emulator_server.py:/app/vllm_emulator_server.py:ro" \
180184
-e VLLM_MODEL="${VLLM_CPU_MODEL:-facebook/opt-125m}" \
181185
-e PYTHONUNBUFFERED=1 \
182186
"${AIC_IMAGE}" \
183-
python3 /app/vllm_emulator_server.py
187+
/app/vllm_emulator_server.py
184188
185189
# ---------------------------------------------------------------------------
186190
# 4. Wait for vLLM emulator to be healthy (up to 3 min)
@@ -317,5 +321,6 @@ mkdir -p metrics-page
317321
scp -o ServerAliveInterval=30 \
318322
"${AIC_SPUR_HOST}:${REMOTE_METRICS_PAGE_DIR}/index.html" \
319323
metrics-page/index.html
324+
ssh -o ServerAliveInterval=30 "${AIC_SPUR_HOST}" rm -rf "${REMOTE_METRICS_PAGE_DIR}"
320325

321326
echo "CPU monitoring smoke test passed for ${SHORT}"

.github/scripts/spur-tiny-test.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=4 "${AIC_SPUR_HOST}" env \
3434
KEEP_ARTIFACTS="${KEEP_ARTIFACTS}" \
3535
AIC_SPUR_CONTROLLER="${AIC_SPUR_CONTROLLER}" \
3636
SPUR_CONTROLLER_ADDR="${AIC_SPUR_CONTROLLER}" \
37+
HF_TOKEN="${HF_TOKEN:-}" \
3738
bash << 'REMOTE'
3839
set -euo pipefail
3940
@@ -71,6 +72,7 @@ AIC_SPUR_CLUSTER=1 \
7172
AIC_IMAGE="${AIC_IMAGE}" \
7273
AIC_IMAGE_DIR="${TARBALL_DIR}" \
7374
AIC_TINY_HF_HOME="${TINY_HF_HOME}" \
75+
HF_TOKEN="${HF_TOKEN:-}" \
7476
make -C "${WORKDIR}" tiny-test
7577
7678
echo "=== tiny-test complete ==="

.github/workflows/aic-amd-nightly-cliff.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,4 @@ jobs:
5959
destination_dir: cliff
6060
publish_branch: gh-pages
6161
force_orphan: false
62+
keep_files: true

.github/workflows/aic-amd-nightly-tiny-test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ jobs:
1414
AIC_SPUR_HOST: ${{ secrets.AIC_SPUR_HOST }}
1515
AIC_SHARED_NFS: ${{ secrets.AIC_SHARED_NFS }}
1616
AIC_SPUR_CONTROLLER: ${{ secrets.AIC_SPUR_CONTROLLER }}
17+
HF_TOKEN: ${{ secrets.AIC_HF_TOKEN }}
1718

1819
steps:
1920
- name: Run tiny-test on SPUR head node

.github/workflows/aic-lint.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,13 @@ jobs:
2828
- uses: hadolint/hadolint-action@v3.1.0
2929
with:
3030
recursive: true
31+
32+
htmlhint:
33+
name: HTMLHint
34+
runs-on: ubuntu-latest
35+
steps:
36+
- uses: actions/checkout@v4
37+
- name: Install htmlhint
38+
run: npm install -g htmlhint
39+
- name: Run htmlhint
40+
run: htmlhint '.github/pages/*.html'

.github/workflows/aic-monitoring-cpu-smoke.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
# and generates a static HTML reference page
1414
#
1515
# On success the HTML is deployed to the gh-pages branch so it is served at
16-
# the repo's GitHub Pages URL.
16+
# https://rocm.github.io/rocm-aic/prometheus/.
1717
#
1818
# Requires (all already in use by sibling nightly workflows):
1919
# secrets.AIC_SPUR_HOST — SSH target for the SPUR head node
2020
# secrets.AIC_SHARED_NFS — shared NFS path for image tarballs + scratch
2121
# secrets.AIC_SPUR_CONTROLLER — SPUR controller address
2222
#
2323
# One-time repo setup: Settings → Pages → Source: gh-pages branch, / (root).
24+
# The page will be served at https://rocm.github.io/rocm-aic/prometheus/.
2425

2526
name: AIC Monitoring CPU Smoke Test
2627

@@ -67,5 +68,7 @@ jobs:
6768
with:
6869
github_token: ${{ secrets.GITHUB_TOKEN }}
6970
publish_dir: ./metrics-page
71+
destination_dir: prometheus
7072
publish_branch: gh-pages
7173
force_orphan: false
74+
keep_files: true
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Copyright (c) Advanced Micro Devices, Inc. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: MIT
4+
#
5+
# Publishes .github/pages/index.html to the root of the gh-pages branch so
6+
# https://rocm.github.io/rocm-aic/ shows a landing page linking to the
7+
# Prometheus metrics reference (/prometheus/) and Cliff dashboard (/cliff/).
8+
9+
name: AIC Pages Root
10+
11+
on:
12+
push:
13+
branches: [main]
14+
paths: [.github/pages/index.html]
15+
workflow_dispatch:
16+
17+
permissions:
18+
contents: write
19+
20+
jobs:
21+
deploy:
22+
name: Publish root index to GitHub Pages
23+
runs-on: ubuntu-latest
24+
steps:
25+
- uses: actions/checkout@v4
26+
27+
- name: Deploy root index to GitHub Pages
28+
uses: peaceiris/actions-gh-pages@v4
29+
with:
30+
github_token: ${{ secrets.GITHUB_TOKEN }}
31+
publish_dir: ./.github/pages
32+
destination_dir: .
33+
publish_branch: gh-pages
34+
force_orphan: false
35+
keep_files: true
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Copyright (c) Advanced Micro Devices, Inc. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: MIT
4+
#
5+
# Automatically opens a PR to sync README.md version shields whenever
6+
# docker/Dockerfile component ARGs are updated on main.
7+
8+
name: AIC Update README Shields
9+
10+
on:
11+
push:
12+
branches: [main]
13+
paths: [docker/Dockerfile]
14+
workflow_dispatch:
15+
16+
jobs:
17+
update-shields:
18+
name: Sync README version shields
19+
runs-on: ubuntu-latest
20+
permissions:
21+
contents: write
22+
pull-requests: write
23+
24+
steps:
25+
- uses: actions/checkout@v4
26+
27+
- name: Extract versions from Dockerfile
28+
id: vers
29+
run: |
30+
ROCM=$(grep '^FROM' docker/Dockerfile | grep -oP '\d+\.\d+\.\d+' | head -1)
31+
VLLM_VER=$(grep 'ARG VLLM_VERSION=' docker/Dockerfile | grep -oP '[\d.]+')
32+
VLLM_ROC=$(grep 'ARG VLLM_ROCM_VARIANT=' docker/Dockerfile | grep -oP 'rocm\w+')
33+
LMCACHE=$(grep 'ARG LMCACHE_REF=' docker/Dockerfile | grep -oP 'v[\d.]+')
34+
NIXL=$(grep 'ARG NIXL_REF=' docker/Dockerfile | grep -oP 'v[\d.]+')
35+
HSA=$(grep 'ARG HSA_SNOOP_REF=' docker/Dockerfile | grep -oP 'v[\d.]+')
36+
echo "rocm=$ROCM" >> "$GITHUB_OUTPUT"
37+
echo "vllm=${VLLM_VER}+${VLLM_ROC}" >> "$GITHUB_OUTPUT"
38+
echo "vllm_ver=$VLLM_VER" >> "$GITHUB_OUTPUT"
39+
echo "vllm_roc=$VLLM_ROC" >> "$GITHUB_OUTPUT"
40+
echo "lmcache=$LMCACHE" >> "$GITHUB_OUTPUT"
41+
echo "nixl=$NIXL" >> "$GITHUB_OUTPUT"
42+
echo "hsa=$HSA" >> "$GITHUB_OUTPUT"
43+
44+
- name: Update README shields and prose
45+
env:
46+
ROCM: ${{ steps.vers.outputs.rocm }}
47+
VLLM: ${{ steps.vers.outputs.vllm }}
48+
VLLM_VER: ${{ steps.vers.outputs.vllm_ver }}
49+
VLLM_ROC: ${{ steps.vers.outputs.vllm_roc }}
50+
LMCACHE: ${{ steps.vers.outputs.lmcache }}
51+
NIXL: ${{ steps.vers.outputs.nixl }}
52+
HSA: ${{ steps.vers.outputs.hsa }}
53+
run: |
54+
# Badge URLs
55+
sed -i "s|ROCm-[0-9.]*-green|ROCm-${ROCM}-green|g" README.md
56+
sed -i "s|vLLM-[^-]*-blue\.svg|vLLM-${VLLM}-blue.svg|" README.md
57+
sed -i "s|LMCache-v[0-9.]*-blue\.svg|LMCache-${LMCACHE}-blue.svg|" README.md
58+
sed -i "s|NIXL-v[0-9.]*-blue\.svg|NIXL-${NIXL}-blue.svg|" README.md
59+
sed -i "s|hsa--snoop-v[0-9.]*-blue\.svg|hsa--snoop-${HSA}-blue.svg|" README.md
60+
61+
# Stack overview diagram (line starting with "rocm/dev-ubuntu-24.04:")
62+
sed -i "s|rocm/dev-ubuntu-24.04:[0-9.]*-complete|rocm/dev-ubuntu-24.04:${ROCM}-complete|g" README.md
63+
sed -i "s|ROCm [0-9.]*\(, Python\)|ROCm ${ROCM}\1|g" README.md
64+
# vLLM in diagram/table (e.g. "v0.25.0+rocm723" or "0.25.0+rocm723")
65+
sed -i "s|vLLM v[0-9.+a-z]* (pre-built|vLLM v${VLLM} (pre-built|" README.md
66+
sed -i "s|v[0-9.]*+rocm[0-9]* (pre-built wheel, bundles torch)|v${VLLM} (pre-built wheel, bundles torch)|" README.md
67+
# vLLM source URL in component table
68+
sed -i "s|wheels\.vllm\.ai/rocm/[0-9.]*/rocm[0-9]*|wheels.vllm.ai/rocm/${VLLM_VER}/${VLLM_ROC}|" README.md
69+
# LMCache version in prose (table row)
70+
PATCH_COUNT=$(ls patches/lmcache/*.patch 2>/dev/null | wc -l)
71+
sed -i "s|\`v[0-9.]*\` + [0-9]* AMD patches|\`${LMCACHE}\` + ${PATCH_COUNT} AMD patches|" README.md
72+
# NIXL version in table row
73+
sed -i "s|\`v[0-9.]*\` + \`nixl-rocm|\`${NIXL}\` + \`nixl-rocm|" README.md
74+
75+
- name: Open PR if README changed
76+
uses: peter-evans/create-pull-request@v7
77+
with:
78+
token: ${{ secrets.GITHUB_TOKEN }}
79+
commit-message: "docs: sync README shields with Dockerfile versions"
80+
title: "docs: sync README version shields with Dockerfile"
81+
body: |
82+
Automated update: README.md version shields and Stack overview prose
83+
synced from `docker/Dockerfile` ARGs.
84+
85+
| Component | Version |
86+
| --- | --- |
87+
| ROCm | `${{ steps.vers.outputs.rocm }}` |
88+
| vLLM | `${{ steps.vers.outputs.vllm }}` |
89+
| LMCache | `${{ steps.vers.outputs.lmcache }}` |
90+
| NIXL | `${{ steps.vers.outputs.nixl }}` |
91+
| hsa-snoop | `${{ steps.vers.outputs.hsa }}` |
92+
93+
Generated by the [AIC Update README Shields](${{ github.server_url }}/${{ github.repository }}/actions/workflows/aic-update-readme-shields.yml) workflow.
94+
branch: auto/readme-shields
95+
labels: documentation
96+
delete-branch: true

0 commit comments

Comments
 (0)