feat: implement workflow to sync LMSYS SGLang blog (#23438)

This commit is contained in:
zijiexia
2026-04-30 16:17:29 -07:00
committed by GitHub
parent 918f910cf0
commit 8b23d32ec1
5 changed files with 118 additions and 191 deletions
+2
View File
@@ -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:
@@ -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
View File
@@ -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 */}
+1 -18
View File
@@ -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"
}
]
}