Prhub

#2334 [release] bump to v0.3.2

原始 PR 作者 zhuzilin 合并时间 2026-08-28 10:17 文件变更 8 提交数 2 评论 0 代码增减 +1994 / -26

执行摘要

发布 v0.3.2,新增 SGLang 确定性补丁与发布校验脚本

PR body 为空,动机主要从提交与变更内容推断:v0.3.2 需要同步发布包的版本号,并修复构建环境中的 cu13/cu129 依赖残留问题(build_conda.sh 注释说明了这一点)。新增的 sglang-deterministic.patch 旨在让 SGLang 的 FP8 量化与 MoE 调度在 Blackwell 上具备确定性,避免 EAGLE 采样与训练侧数值不一致;megatron-sglang-aligned.patch 则通过 FP32 残差和路径对齐 Megatron 与 SGLang 的归一化边界。新增 check_release.py 是为了让此类发布操作可被脚本校验,降低漏改版本号或补丁失配的风险。

建议负责构建与发布的同学精读 check_release.pybuild_conda.sh:前者用 AST/正则做交叉校验的思路简洁可靠,可直接作为发布门禁;后者集中体现了 conda/Docker 双路径对齐的维护成本。对于关心 FP8 推理的工程师,sglang-deterministic.patch 中 UE8M0 scale 与 SiLU 舍入的处理与近期 PR#2327 的 FP8 开关联动,值得深入研究。该 PR 无需逐行审查补丁,但应确认补丁与上游 commit 固定一致。

讨论亮点

该 PR 没有 review 评论,合并过程无公开讨论。从补丁内容看,设计重点集中在数值对齐策略:例如 sglang-deterministic.patch 中 UE8M0 量化采用四舍五入的 power-of-2 scale 以避免与下游 GEMM dequant 的 scale 不匹配(补丁注释称可避免约 14 倍误差放大);megatron-sglang-aligned.patch 通过环境变量开关引入 FP32 残差和,避免改动默认训练路径。这些决策未在 PR 内展开讨论,但实现上做了条件开关与明确注释。

实现拆解

  1. 同步发布版本号setup.pysetup(version="0.3.2")docs/conf.py__version__ = "0.3.2"docker/version.txt 同步到 v0.3.2,保证 wheel、文档与镜像三处版本标识一致。
  2. 新增 SGLang 确定性补丁:添加约 1620 行的 docker/patch/v0.5.15.post1/sglang-deterministic.patch,修改 SGLang 的 per_token_group_quant_8bit_v2.cuh 等内核,将 SiLU 计算与 UE8M0 量化 scale 调整为与 SM90 sgl_kernel 一致的单次低精度舍入边界;同时包含 DeepGEMM num_sms 配置、MoE dispatcher 创建逻辑调整,以保证 Blackwell FP8 推理的数值可复现。
  3. 新增 Megatron-SGLang 对齐补丁:添加约 119 行的 docker/patch/v0.5.15.post1/megatron-sglang-aligned.patch,修改 megatron/core/transformer/transformer_layer.py,通过环境变量 MEGATRON_USE_SGLANG_FUSED_RESIDUAL_RMS 开关启用 FP32 残差和 + 原生 RMSNorm 路径,使训练侧与 SGLang 的残差归一化边界对齐。
  4. 更新 conda 构建脚本build_conda.shSGLANG_VERSION 提升到 v0.5.15.post1,新增 FLASH_QLA_COMMIT 环境变量并固定其安装提交;在安装 SGLang 后强制恢复 cuda-python==12.9 以修复 cu13 运行时混入;在 patch 循环中追加 sglang-deterministic.patch
  5. 新增发布校验能力:新增 .claude/skills/release/SKILL.mdscripts/check_release.py,脚本用 AST 与正则解析 setup.pydocs/conf.pydocker/Dockerfiledocker/justfilebuild_conda.shdocker/README.md,交叉核对 slime 版本、SGLang 版本、MEGATRON_COMMIT/TMS_COMMIT/FLASH_QLA_COMMIT 以及补丁目录内容是否一致,并在 main() 中汇总错误。
文件 模块 状态 重要度
.claude/skills/release/scripts/check_release.py 发布校验 added 8.71
docker/patch/v0.5.15.post1/sglang-deterministic.patch 运行时补丁 added 7.46
docker/patch/v0.5.15.post1/megatron-sglang-aligned.patch 对齐补丁 added 6.47
build_conda.sh 构建脚本 modified 5.09
setup.py 打包配置 modified 4.49
docs/conf.py 文档配置 modified 4.49
docker/version.txt 镜像版本 modified 1.72
.claude/skills/release/SKILL.md 发布技能 added 4.47

关键符号

main _setup_version _assigned_string _shell_exports _docker_args _loop_items _use_sglang_fused_residual_rmsnorm _sglang_native_rmsnorm_from_fp32_sum

关键源码片段

.claude/skills/release/scripts/check_release.py dependency-wiring

新增的发布一致性校验脚本,用 AST/ 正则解析版本号与补丁目录,是本次发布流程自动化的核心。

def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--repo", type=Path, default=Path.cwd())
    parser.add_argument("--expected-version")
    args = parser.parse_args()
​
    repo = args.repo.resolve()
    errors: list[str] = []
​
    # 校验 slime 自身版本:setup.py 与 docs/conf.py 必须一致,
    # 并可通过 --expected-version 约束本次发布的期望版本。
    setup_version = _setup_version(repo / "setup.py")
    docs_version = _assigned_string(repo / "docs/conf.py", "__version__")
    if setup_version != docs_version:
        errors.append(f"setup.py={setup_version} but docs/conf.py={docs_version}")
    if args.expected_version and setup_version != args.expected_version:
        errors.append(f"release version is {setup_version}, expected {args.expected_version}")
​
    # Docker 镜像与 conda 构建的 SGLang 版本与依赖 commit 必须对齐,
    # 避免两条安装路径运行时行为不一致。
    docker_text = (repo / "docker/Dockerfile").read_text()
    conda_text = (repo / "build_conda.sh").read_text()
    docker_args = _docker_args(docker_text)
    conda_exports = _shell_exports(conda_text)
​
    # 镜像 tag 形如 v0.5.15.post1-cu129,去掉 -cu 后缀后与 conda 版本比对
    image_tag = docker_args.get("SGLANG_IMAGE_TAG", "")
    docker_sglang_version = re.sub(r"-cu\d+$", "", image_tag)
    conda_sglang_version = conda_exports.get("SGLANG_VERSION", "")
    if docker_sglang_version != conda_sglang_version:
        errors.append(
            f"Docker SGLang={docker_sglang_version or '<missing>'}, "
            f"conda SGLang={conda_sglang_version or '<missing>'}"
        )
​
    # Megatron、TMS、FlashQLA 等固定提交也必须两侧一致
    for pin in ("MEGATRON_COMMIT", "TMS_COMMIT", "FLASH_QLA_COMMIT"):
        if docker_args.get(pin) != conda_exports.get(pin):
            errors.append(
                f"{pin}: Docker={docker_args.get(pin, '<missing>')}, "
                f"conda={conda_exports.get(pin, '<missing>')}"
            )
​
    # 后续代码继续校验 docker/README.md 的 stable 版本、docker/justfile
    # 的镜像 tag,以及 docker/patch/<version> 与 docker/patch/latest 的补丁一致性。
build_conda.sh core-logic

更新 conda 构建流程:提升 SGLang 版本、新增 FLASH_QLA_COMMIT 固定、修复 cuda-python 版本回退、加入新补丁。

# 安装 SGLang 后,SGLang 会顺带升级 cuda-python 到 >=13,与 CUDA 12.9
# 运行时冲突;这里强制恢复到 12.9,修复 site-packages/nvidia 目录混装问题。
pip install --force-reinstall "cuda-python==12.9"# $patch_dir 在此之前已指向 docker/patch/$PATCH_VERSION;
# 逐项应用 slime 维护的 SGLang 补丁。新增的 sglang-deterministic.patch
# 固定 FP8 量化的 scale 计算与 SiLU 舍入行为,保证 Blackwell 上的 EAGLE
# 采样与训练侧数值对齐,从而让 rollout 结果可复现。
for patch_name in sglang.patch sglang-top_p.patch sglang-release_hicache.patch sglang-pull_weights.patch sglang-deterministic.patch; do
    patch_path="$patch_dir/${patch_name}"
    if [ ! -f "$patch_path" ]; then
        echo "patch not found: $patch_path"
        exit 1
    fi
    git apply "$patch_path"
done

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 外部源码补丁风险docker/patch/v0.5.15.post1/ 下的补丁直接修改上游 SGLang/Megatron 源码,若后续升级 SGLang 版本,这些补丁可能无法干净应用,阻碍依赖升级。
  2. 构建环境修复依赖强制重装build_conda.shpip install --force-reinstall "cuda-python==12.9" 和 torch 系 cu129 wheel 的强制重装,依赖 PyPI 与 PyTorch 索引可用性,若 wheel 变动可能导致构建失败;同时 site-packages/nvidia 混装修复属于精细操作,仍有回归可能。
  3. 版本号多处同步:slime 版本同时出现在 setup.pydocs/conf.pydocker/version.txt,以及 Docker 镜像 tag 中,任何遗漏都会造成发布产物不一致;虽有 check_release.py 校验,但该脚本本身没有对应自动化测试(本 PR 未新增测试文件)。
  4. 补丁影响面:sglang-deterministic.patch 改动 FP8 量化与 MoE 调度路径,若运行环境非 SM90/Blackwell,或 --force-fp8-ue8m0-scale 等开关未按预期组合,可能引入数值不一致或性能回退。

对用户:安装 v0.3.2 的 Docker/conda 环境会打入 SGLang 与 Megatron 补丁,FP8 量化和 MoE 推理行为发生变化,默认数值确定性提升,但可能略微影响吞吐;同时依赖被固定在特定 commit,升级路径受限。对系统:构建流程更复杂,conda 环境需要额外修复步骤(cuda-python 回退,补丁应用),但发布校验脚本降低了版本错配风险。对团队:发布操作开始向 Claude 技能化演进,后续发版可通过 check_release.py 进行预检,减少人工检查成本。

外部源码补丁 构建脚本变更 版本号多处同步 新增脚本无测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论