执行摘要
- 一句话:XPU kernel 发布独立到 +xpu 标签空间
- 推荐动作:该 PR 体量小、逻辑直白,适合快速浏览,可作为发布基础设施命名空间隔离的参考。值得关注的设计点:把后缀设计成带默认值的参数透传,使 CUDA/ROCm/MUSA 行为零变化,同时为后续后端扩展留了口子;但两处 tag 拼接分散在 workflow 与脚本中,建议后续抽成单一配置源,并补充 URL 生成的单元测试。
功能与动机
作者在 PR body 中明确说明动机:\"To put xpu kernel releases into a separate https://github.com/sgl-project/whl/releases/tag/v0.1.0+xpu space so that it would not be mixed up with other package releases at https://github.com/sgl-project/whl/releases/tag/v0.1.0\"。此前 sglang-kernel-xpu 与其他后端 wheel 共用同一个 GitHub Release tag,产物混杂、难以区分;本次把 XPU 发布挪到独立 tag 下,使发布空间与后端一一对应。
实现拆解
- 索引脚本参数化:在
scripts/update_kernel_whl_index.py 的 _update_non_cuda_wheel_index 中新增 release_tag_suffix="" 参数,默认空串,保证 rocm/musa 等既有调用方行为不变。
- URL Tag 拼接:生成
full_url 时由 v{ver} 改为 v{ver}{release_tag_suffix},使 XPU 索引页里的下载链接指向 v0.1.0+xpu 独立 Release 空间。
- XPU 专属调用:
update_wheel_index_xpu() 显式传入 "+xpu",与 sglang_kernel_xpu 包名、sglang-kernel-xpu 索引目录共同构成 XPU 独立发布链路。
- 发布 workflow 同步:
.github/workflows/release-whl-kernel-xpu.yml 中 tag_name 从 ${{ inputs.tag_name }} 改为 ${{ inputs.tag_name }}+xpu,保证 GH Release 实体与索引 URL 落在同一标签。
- 配套情况:无新增测试;CI 主测试(Latest PR Test)通过,Extra 测试显示失败且本材料无失败详情,建议合并前确认。
关键文件:
scripts/update_kernel_whl_index.py(模块 索引脚本;类别 source;类型 core-logic;符号 _update_non_cuda_wheel_index, update_wheel_index_xpu): 索引生成逻辑的核心改动处:新增 release_tag_suffix 参数并在下载 URL 拼接中使用,是本次功能真正生效的代码路径,且通过参数默认值保证其他后端行为不变。
.github/workflows/release-whl-kernel-xpu.yml(模块 发布流水线;类别 infra;类型 infrastructure): XPU kernel 发布 workflow 的 tag_name 加上 +xpu 后缀,与索引脚本保持同构,是发布侧的另一半改动,若缺失则索引 URL 与实际 Release 不匹配。
关键符号:_update_non_cuda_wheel_index, update_wheel_index_xpu
关键源码片段
scripts/update_kernel_whl_index.py
索引生成逻辑的核心改动处:新增 release_tag_suffix 参数并在下载 URL 拼接中使用,是本次功能真正生效的代码路径,且通过参数默认值保证其他后端行为不变。
# 非 CUDA 后端(xpu/rocm/musa)共用的索引生成入口。
# release_tag_suffix 用于把指定后端的发布放到独立的 GitHub Release tag 空间,
# 例如 xpu 后端传入 "+xpu" 后,Tag 形如 v0.1.0+xpu,
# 避免与其他后端共享 v0.1.0 标签导致产物混淆。
def _update_non_cuda_wheel_index(
backend,
version=None,
package_name="sglang_kernel",
index_package_name="sglang-kernel",
release_tag_suffix="",
):
backend_dir = f"{backend}{version or ''}"
index_dir = pathlib.Path(f"sgl-whl/{backend_dir}/{index_package_name}")
index_dir.mkdir(exist_ok=True, parents=True)
base_url = "https://github.com/sgl-project/whl/releases/download"
for path in sorted(pathlib.Path("python/sglang/kernels/aot/dist").glob("*.whl")):
# 跳过不属于该后端的 wheel
if re.search(f"{backend}", path.name) is None:
continue
with open(path, "rb") as f:
sha256 = hashlib.sha256(f.read()).hexdigest()
# 从 wheel 文件名解析版本号,容忍 +{backend} 之类的本地版本后缀
ver = re.findall(
rf"{re.escape(package_name)}-([0-9.]+(?:\.post[0-9]+)?)(?:\+{backend}[0-9]+)?-",
path.name,
)[0]
# 核心变化:下载 URL 的 Tag 部分由 ver 与 release_tag_suffix 拼接而成,
# 默认空串时保持历史行为(v0.1.0),xpu 则生成 v0.1.0+xpu。
full_url = f"{base_url}/v{ver}{release_tag_suffix}/{path.name}#sha256={sha256}"
with (index_dir / "index.html").open("a") as f:
f.write(f'<a href="{full_url}">{path.name}</a><br>\n')
# XPU kernel 专属入口:使用独立的 +xpu 发布命名空间
# 与 workflow 中 tag_name 的 +xpu 拼接保持一致。
def update_wheel_index_xpu():
_update_non_cuda_wheel_index(
"xpu",
package_name="sglang_kernel_xpu",
index_package_name="sglang-kernel-xpu",
release_tag_suffix="+xpu",
)
评论区精华
该 PR 没有形成公开的 review 讨论:唯一审查者 alexnails 直接 APPROVED(无评论),作者通过 Issue 评论 /tag-run-ci-label 手动触发 CI。CI 面板显示 Latest PR Test 通过、Latest PR Test (Extra) 失败,失败原因需结合 CI 日志确认,本材料未提供。
风险与影响
- 风险:
- 两处 tag 拼接一致性:发布 workflow(
release-whl-kernel-xpu.yml)与索引脚本(update_kernel_whl_index.py)各自拼接一次 tag,任何一处漏改都会导致 index.html 链接 404 或产物混入旧标签,建议后续统一配置源。
- 旧链接失效:已发布到
v0.1.0 的 XPU wheel 索引链接将随命名空间切换而失效,依赖旧链接的安装脚本需切换。
+ 字符兼容性:+ 在 GitHub tag 与 URL 中合法,但部分工具链对 +(如 PEP 440 本地版本标识语义)的解析可能不一致。
- 测试缺失:URL 生成逻辑无单测覆盖,回归主要依赖人工验证。
- 影响:影响范围限定在 XPU kernel 发布链路(
sglang-kernel-xpu 索引页及对应 GH Release),CUDA/ROCm/MUSA 路径零变化(后缀默认空串)。对终端用户而言,通过标准 pip --extra-index-url 指向该索引时,解析行为基本透明;对团队而言,确立了按后端隔离 Release tag 的发布约定,后续其他后端可直接复用 release_tag_suffix 参数扩展。
- 风险标记:发布命名空间变更, 两处 tag 拼接需保持一致, 缺少测试覆盖
关联脉络
- PR #36814 xpu: move prefill-only model tests to the nightly-xpu-1-gpu grid: 同属 XPU 平台支持与 CI 生态完善线,表明 XPU 后端基础设施在持续补齐。
参与讨论