feat: implement workflow to sync LMSYS SGLang blog (#23438)
This commit is contained in:
@@ -21,8 +21,10 @@ documentation:
|
|||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- '**/*.md'
|
- '**/*.md'
|
||||||
|
- '**/*.mdx'
|
||||||
- 'docs/**/*'
|
- 'docs/**/*'
|
||||||
- 'README*'
|
- 'README*'
|
||||||
|
- 'docs_new/**/*'
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
+5
-4
@@ -23,17 +23,18 @@ jobs:
|
|||||||
- name: Sync blog cards
|
- name: Sync blog cards
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: python scripts/update_lmsys_sglang_blogs.py
|
run: python docs_new/scripts/update_lmsys_sglang_blogs.py
|
||||||
|
|
||||||
- name: Commit and push changes
|
- name: Commit and push changes
|
||||||
run: |
|
run: |
|
||||||
if git diff --quiet; then
|
if git diff --quiet -- docs_new/index.mdx; then
|
||||||
echo "No changes to commit."
|
echo "No blog card changes to commit."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "github-actions[bot]"
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git add index.mdx src/generated/lmsys_sglang_blogs.json
|
git add docs_new/index.mdx
|
||||||
|
git diff --cached --quiet && exit 0
|
||||||
git commit -m "docs: sync LMSYS SGLang blog cards"
|
git commit -m "docs: sync LMSYS SGLang blog cards"
|
||||||
git push
|
git push
|
||||||
+110
-110
@@ -82,6 +82,116 @@ It is designed to deliver low-latency and high-throughput inference across a wid
|
|||||||
alignItems: "stretch",
|
alignItems: "stretch",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
<a
|
||||||
|
href="https://lmsys.org/blog/2026-04-25-deepseek-v4/"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
style={{
|
||||||
|
display: "block",
|
||||||
|
border: "1px solid rgba(128, 128, 128, 0.3)",
|
||||||
|
borderRadius: "0.75rem",
|
||||||
|
overflow: "hidden",
|
||||||
|
textDecoration: "none",
|
||||||
|
color: "inherit",
|
||||||
|
height: "100%",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
aspectRatio: "16 / 9",
|
||||||
|
overflow: "hidden",
|
||||||
|
background: "rgba(128, 128, 128, 0.15)",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="https://lmsys.org/images/blog/deepseek_v4/benchmark_vs_oss.png"
|
||||||
|
alt="DeepSeek-V4 on Day 0: From Fast Inference to Verified RL with SGLang and Miles"
|
||||||
|
style={{
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
objectFit: "cover",
|
||||||
|
objectPosition: "center",
|
||||||
|
display: "block",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style={{ padding: "0.9rem 1rem 1rem" }}>
|
||||||
|
<p
|
||||||
|
style={{
|
||||||
|
margin: 0,
|
||||||
|
fontWeight: 600,
|
||||||
|
lineHeight: 1.35,
|
||||||
|
fontSize: "0.98rem",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{"DeepSeek-V4 on Day 0: From Fast Inference to Verified RL with SGLang and Miles"}
|
||||||
|
</p>
|
||||||
|
<p
|
||||||
|
style={{
|
||||||
|
margin: "0.55rem 0 0",
|
||||||
|
fontSize: "0.85rem",
|
||||||
|
opacity: 0.75,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{"April 25, 2026"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://lmsys.org/blog/2026-04-10-sglang-hisparse/"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
style={{
|
||||||
|
display: "block",
|
||||||
|
border: "1px solid rgba(128, 128, 128, 0.3)",
|
||||||
|
borderRadius: "0.75rem",
|
||||||
|
overflow: "hidden",
|
||||||
|
textDecoration: "none",
|
||||||
|
color: "inherit",
|
||||||
|
height: "100%",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
aspectRatio: "16 / 9",
|
||||||
|
overflow: "hidden",
|
||||||
|
background: "rgba(128, 128, 128, 0.15)",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="https://lmsys.org/images/blog/hisparse/hisparse_overview.png"
|
||||||
|
alt="HiSparse: Turbocharging Sparse Attention with Hierarchical Memory"
|
||||||
|
style={{
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
objectFit: "cover",
|
||||||
|
objectPosition: "center",
|
||||||
|
display: "block",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style={{ padding: "0.9rem 1rem 1rem" }}>
|
||||||
|
<p
|
||||||
|
style={{
|
||||||
|
margin: 0,
|
||||||
|
fontWeight: 600,
|
||||||
|
lineHeight: 1.35,
|
||||||
|
fontSize: "0.98rem",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{"HiSparse: Turbocharging Sparse Attention with Hierarchical Memory"}
|
||||||
|
</p>
|
||||||
|
<p
|
||||||
|
style={{
|
||||||
|
margin: "0.55rem 0 0",
|
||||||
|
fontSize: "0.85rem",
|
||||||
|
opacity: 0.75,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{"April 10, 2026"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
<a
|
<a
|
||||||
href="https://lmsys.org/blog/2026-03-25-gtc2026/"
|
href="https://lmsys.org/blog/2026-03-25-gtc2026/"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@@ -302,116 +412,6 @@ It is designed to deliver low-latency and high-throughput inference across a wid
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a
|
|
||||||
href="https://lmsys.org/blog/2026-02-20-gb300-inferencex/"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
style={{
|
|
||||||
display: "block",
|
|
||||||
border: "1px solid rgba(128, 128, 128, 0.3)",
|
|
||||||
borderRadius: "0.75rem",
|
|
||||||
overflow: "hidden",
|
|
||||||
textDecoration: "none",
|
|
||||||
color: "inherit",
|
|
||||||
height: "100%",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
aspectRatio: "16 / 9",
|
|
||||||
overflow: "hidden",
|
|
||||||
background: "rgba(128, 128, 128, 0.15)",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
src="https://lmsys.org/images/blog/gb300_inferencex/img-1.png"
|
|
||||||
alt="Unlocking 25x Inference Performance with SGLang on NVIDIA GB300 NVL72"
|
|
||||||
style={{
|
|
||||||
width: "100%",
|
|
||||||
height: "100%",
|
|
||||||
objectFit: "cover",
|
|
||||||
objectPosition: "center",
|
|
||||||
display: "block",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div style={{ padding: "0.9rem 1rem 1rem" }}>
|
|
||||||
<p
|
|
||||||
style={{
|
|
||||||
margin: 0,
|
|
||||||
fontWeight: 600,
|
|
||||||
lineHeight: 1.35,
|
|
||||||
fontSize: "0.98rem",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{"Unlocking 25x Inference Performance with SGLang on NVIDIA GB300 NVL72"}
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style={{
|
|
||||||
margin: "0.55rem 0 0",
|
|
||||||
fontSize: "0.85rem",
|
|
||||||
opacity: 0.75,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{"February 20, 2026"}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
href="https://lmsys.org/blog/2026-02-19-gb300-longctx/"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
style={{
|
|
||||||
display: "block",
|
|
||||||
border: "1px solid rgba(128, 128, 128, 0.3)",
|
|
||||||
borderRadius: "0.75rem",
|
|
||||||
overflow: "hidden",
|
|
||||||
textDecoration: "none",
|
|
||||||
color: "inherit",
|
|
||||||
height: "100%",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
aspectRatio: "16 / 9",
|
|
||||||
overflow: "hidden",
|
|
||||||
background: "rgba(128, 128, 128, 0.15)",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
src="https://lmsys.org/images/blog/gb300_longctx/cover.png"
|
|
||||||
alt="Deploying DeepSeek on GB300 NVL72: Big Wins in Long-Context Inference"
|
|
||||||
style={{
|
|
||||||
width: "100%",
|
|
||||||
height: "100%",
|
|
||||||
objectFit: "cover",
|
|
||||||
objectPosition: "center",
|
|
||||||
display: "block",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div style={{ padding: "0.9rem 1rem 1rem" }}>
|
|
||||||
<p
|
|
||||||
style={{
|
|
||||||
margin: 0,
|
|
||||||
fontWeight: 600,
|
|
||||||
lineHeight: 1.35,
|
|
||||||
fontSize: "0.98rem",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{"Deploying DeepSeek on GB300 NVL72: Big Wins in Long-Context Inference"}
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style={{
|
|
||||||
margin: "0.55rem 0 0",
|
|
||||||
fontSize: "0.85rem",
|
|
||||||
opacity: 0.75,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{"February 19, 2026"}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* END_LMSYS_SGLANG_BLOG_CARDS */}
|
{/* END_LMSYS_SGLANG_BLOG_CARDS */}
|
||||||
|
|||||||
@@ -7,13 +7,11 @@ import json
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from dataclasses import asdict, dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime, timezone
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[1]
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
INDEX_PATH = ROOT / "index.mdx"
|
INDEX_PATH = ROOT / "index.mdx"
|
||||||
OUTPUT_JSON_PATH = ROOT / "src" / "generated" / "lmsys_sglang_blogs.json"
|
|
||||||
|
|
||||||
START_MARKER = "{/* BEGIN_LMSYS_SGLANG_BLOG_CARDS */}"
|
START_MARKER = "{/* BEGIN_LMSYS_SGLANG_BLOG_CARDS */}"
|
||||||
END_MARKER = "{/* END_LMSYS_SGLANG_BLOG_CARDS */}"
|
END_MARKER = "{/* END_LMSYS_SGLANG_BLOG_CARDS */}"
|
||||||
@@ -256,20 +254,6 @@ def replace_generated_block(index_text: str, generated_cards: str) -> str:
|
|||||||
return updated_text
|
return updated_text
|
||||||
|
|
||||||
|
|
||||||
def write_metadata(posts: list[BlogPost], total_blog_files: int) -> None:
|
|
||||||
OUTPUT_JSON_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
payload = {
|
|
||||||
"generatedAt": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
|
|
||||||
"sourceRepo": "https://github.com/lm-sys/lm-sys.github.io/tree/main/blog",
|
|
||||||
"keywords": KEYWORDS,
|
|
||||||
"maxCards": MAX_CARDS,
|
|
||||||
"totalBlogFilesScanned": total_blog_files,
|
|
||||||
"cardsPublished": len(posts),
|
|
||||||
"posts": [asdict(post) for post in posts],
|
|
||||||
}
|
|
||||||
OUTPUT_JSON_PATH.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8")
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
sources = download_blog_sources()
|
sources = download_blog_sources()
|
||||||
relevant_posts: list[BlogPost] = []
|
relevant_posts: list[BlogPost] = []
|
||||||
@@ -291,7 +275,6 @@ def main() -> None:
|
|||||||
if updated_index != current_index:
|
if updated_index != current_index:
|
||||||
INDEX_PATH.write_text(updated_index, encoding="utf-8")
|
INDEX_PATH.write_text(updated_index, encoding="utf-8")
|
||||||
|
|
||||||
write_metadata(posts=selected_posts, total_blog_files=len(sources))
|
|
||||||
print(
|
print(
|
||||||
"Scanned "
|
"Scanned "
|
||||||
f"{len(sources)} blog files, matched {len(relevant_posts)} posts, "
|
f"{len(sources)} blog files, matched {len(relevant_posts)} posts, "
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
{
|
|
||||||
"generatedAt": "2026-04-07T00:14:40.777335Z",
|
|
||||||
"sourceRepo": "https://github.com/lm-sys/lm-sys.github.io/tree/main/blog",
|
|
||||||
"keywords": [
|
|
||||||
"sglang",
|
|
||||||
"sgl-project/sglang",
|
|
||||||
"sgl-kernel",
|
|
||||||
"sglang-jax",
|
|
||||||
"sgl diffusion",
|
|
||||||
"sglang diffusion"
|
|
||||||
],
|
|
||||||
"maxCards": 6,
|
|
||||||
"totalBlogFilesScanned": 80,
|
|
||||||
"cardsPublished": 6,
|
|
||||||
"posts": [
|
|
||||||
{
|
|
||||||
"slug": "2026-03-25-gtc2026",
|
|
||||||
"title": "Highlights of SGLang at NVIDIA GTC 2026",
|
|
||||||
"url": "https://lmsys.org/blog/2026-03-25-gtc2026/",
|
|
||||||
"image": "https://lmsys.org/images/blog/gtc2026/happyhour-crowd.jpg",
|
|
||||||
"date": "March 31, 2026"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"slug": "2026-03-25-eep-partial-failure-tolerance",
|
|
||||||
"title": "Elastic EP in SGLang: Achieving Partial Failure Tolerance for DeepSeek MoE Deployments",
|
|
||||||
"url": "https://lmsys.org/blog/2026-03-25-eep-partial-failure-tolerance/",
|
|
||||||
"image": "https://lmsys.org/images/blog/eep-partial-failure-tolerance/figure.png",
|
|
||||||
"date": "March 25, 2026"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"slug": "2026-03-17-rocm-miles-rl-amd",
|
|
||||||
"title": "ROCm Support for Miles: Large-Scale RL Post-Training on AMD Instinct\u2122 GPUs",
|
|
||||||
"url": "https://lmsys.org/blog/2026-03-17-rocm-miles-rl-amd/",
|
|
||||||
"image": "https://lmsys.org/images/blog/rocm_miles_rl/fig_1.png",
|
|
||||||
"date": "March 17, 2026"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"slug": "2026-03-11-run-nvidia-nemotron-3-super",
|
|
||||||
"title": "SGLang Adds Day-0 Support for NVIDIA Nemotron 3 Super for building High-Efficiency Multi-Agent Systems",
|
|
||||||
"url": "https://lmsys.org/blog/2026-03-11-run-nvidia-nemotron-3-super/",
|
|
||||||
"image": "https://lmsys.org/images/blog/nemotron-3-super/figure_1.svg",
|
|
||||||
"date": "March 11, 2026"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"slug": "2026-02-20-gb300-inferencex",
|
|
||||||
"title": "Unlocking 25x Inference Performance with SGLang on NVIDIA GB300 NVL72",
|
|
||||||
"url": "https://lmsys.org/blog/2026-02-20-gb300-inferencex/",
|
|
||||||
"image": "https://lmsys.org/images/blog/gb300_inferencex/img-1.png",
|
|
||||||
"date": "February 20, 2026"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"slug": "2026-02-19-gb300-longctx",
|
|
||||||
"title": "Deploying DeepSeek on GB300 NVL72: Big Wins in Long-Context Inference",
|
|
||||||
"url": "https://lmsys.org/blog/2026-02-19-gb300-longctx/",
|
|
||||||
"image": "https://lmsys.org/images/blog/gb300_longctx/cover.png",
|
|
||||||
"date": "February 19, 2026"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user