Prhub

#34304 Remove the torchao integration (--torchao-config)

原始 PR 作者 b8zhong 合并时间 2026-08-14 21:49 文件变更 23 提交数 2 评论 2 代码增减 +6 / -309

执行摘要

移除失效的 torchao 集成与 --torchao-config 参数,精简量化链路

PR body 明确引用 issue #34295:自 torchao pin 升级到 0.17.0 后,--torchao-config 对每个可接受值都会抛 ImportError,因此没有任何可用的功能需要走弃用流程,直接移除更合理。这既清理了死代码,也消除了一个长期误导用户的 CLI 参数和依赖负担。

该 PR 值得快速浏览作为"功能移除"的范例:体现了在依赖升级导致功能失效后,直接删除而不是保留死代码的决策逻辑。对于关心量化功能现状的读者,重点看 server_args.py 中参数删除方式、loader.py 中分层加载分支的收敛,以及 docs/docs/advanced_features/quantization.mdx 中支持矩阵的更新。不建议作为架构参考深入精读。

讨论亮点

该 PR 没有传统 review 评论,评论区仅两条非技术性内容:

  • mintlify[bot] 发布了文档预览部署链接(lmsysorg-remove-torchao),供核对 quantization 文档渲染效果。
  • 作者 b8zhong 指出 CI 上出现 "Flake on main"(run #31640770400),并附链接,说明该失败来自 main 分支的既有不稳定问题,与本次改动无关。

无遗留技术争议或未解决问题。

实现拆解

该 PR 的变更可拆解为 5 步:

  1. 删除核心工具模块:移除 python/sglang/srt/layers/torchao_utils.py(95 行),其中包含 apply_torchao_config_to_modelproj_filterproj_filter_conv3d 等全部 torchao 量化入口。

  2. 主流程去耦合

    • python/sglang/srt/model_loader/loader.pyLayeredModelLoader.load_model 删除 import、torchao_config = get_exec().graph.torchao_configfill_module 内按 fqnproj 即量化的分支,以及 model.torchao_applied = True 标记。
    • python/sglang/srt/model_executor/model_runner.pymaybe_apply_post_load_model_transforms 删除 torchao_applied 检查和 apply_torchao_config_to_model 调用,并移除模块级 import。
  3. 参数与依赖契约收敛

    • python/sglang/srt/server_args.py 删除 torchao_config 字段(位于 exec.graph 命名空间),同时更新 # Torch compile and torchao 注释为 # Torch compile
    • python/sglang/check_env.py 的依赖列表移除 torchaopython/pyproject.tomlpyproject_cpu.tomlpyproject_npu.tomlpyproject_xpu.tomlpyproject_other.toml3rdparty/amd/wheel/sglang/pyproject.toml 均移除对应依赖声明;docker/xpu.Dockerfile 移除安装步骤。
  4. 模型量化分支修正python/sglang/srt/models/paddleocr_vl.py 将可量化判断从 ["bitsandbytes", "torchao"] 收缩为 "bitsandbytes",避免残留引用。

  5. 测试与文档清理:删除 test/manual/quant/test_torchao.py(92 行),删除 test/manual/test_srt_engine_with_quant_args.py 中的 test_2_torchao_args 方法;python/sglang/test/runners.py 移除 torchao_config 构造参数。文档侧更新 docs/docs/advanced_features/quantization.mdxserver_arguments.mdxnvidia_jetson.mdxascend-npus/reference/support_features.mdx,移除 torchao 相关说明和支持矩阵行。

文件 模块 状态 重要度
python/sglang/srt/layers/torchao_utils.py 量化工具 removed 8.33
test/manual/quant/test_torchao.py 量化测试 removed 7.08
python/sglang/srt/model_loader/loader.py 模型加载 modified 6.61
python/sglang/srt/model_executor/model_runner.py 模型执行 modified 6.08
python/sglang/srt/server_args.py 服务参数 modified 5.67
python/sglang/srt/models/paddleocr_vl.py 多模态 modified 4.7
python/sglang/check_env.py 环境检查 modified 3.78
python/sglang/test/runners.py 测试运行 modified 3.42
test/manual/test_srt_engine_with_quant_args.py 量化参数 modified 5.15
docs/docs/advanced_features/quantization.mdx 量化文档 modified 3.73
python/pyproject.toml 依赖配置 modified 2.93
docker/xpu.Dockerfile 镜像构建 modified 2.38

关键符号

apply_torchao_config_to_model proj_filter proj_filter_conv3d maybe_apply_post_load_model_transforms test_2_torchao_args

关键源码片段

python/sglang/srt/layers/torchao_utils.py deletion

torchao 集成的核心入口,整个文件(95 行)被删除,包含 apply_torchao_config_to_model 和两个过滤函数,是本次移除的主目标。

# 该文件随 PR#34304 整体删除:torchao 固定到 0.17.0 后,
# --torchao-config 的每个取值都会在 import 阶段抛 ImportError,
# 因此不再需要这套量化工具。import logging
from typing import Callable, Optionalimport torchlogger = logging.getLogger(__name__)
​
​
def proj_filter(module: torch.nn.Module, fqn: str):
    """过滤函数:仅量化名字中含 ``proj`` 的投影层。"""
    return "proj" in fqn
​
​
def proj_filter_conv3d(module: torch.nn.Module, fqn: str):
    """过滤函数:跳过 Conv3d,避免量化不支持的卷积层。"""
    if isinstance(module, torch.nn.Conv3d):
        logger.warning(f"Quantize: skipping {fqn} because it's a Conv3d")
        return False
    return "proj" in fqn
​
​
def apply_torchao_config_to_model(
    model: torch.nn.Module,
    torchao_config: str,
    filter_fn: Optional[Callable] = proj_filter,
):
    """按配置字符串对模型应用 torchao 量化。    支持 int8wo / int8dq / int4wo-<group_size> / fp8wo / fp8dq-*,
    全部在此统一入口分派;删除后服务端不再具备该能力。
    """
    if torchao_config == "" or torchao_config is None:
        return model
​
    # 惰性导入原本用于抑制 torchao 的启动告警
    from torchao.quantization import (
        float8_dynamic_activation_float8_weight,
        float8_weight_only,
        int4_weight_only,
        int8_dynamic_activation_int8_weight,
        int8_weight_only,
        quantize_,
    )
    from torchao.quantization.observer import PerRow, PerTensor
​
    if "int8wo" in torchao_config:
        quantize_(model, int8_weight_only(), filter_fn=proj_filter_conv3d)
    elif "int8dq" in torchao_config:
        quantize_(model, int8_dynamic_activation_int8_weight(), filter_fn=filter_fn)
    elif "int4wo" in torchao_config:
        group_size = int(torchao_config.split("-")[-1])
        assert group_size in [32, 64, 128, 256], \
            f"int4wo groupsize needs to be one of [32, 64, 128, 256] but got {group_size}"
        quantize_(model, int4_weight_only(group_size=group_size), filter_fn=filter_fn)
    elif "fp8wo" in torchao_config:
        # 需要较新硬件:fp8e4nv 在 CUDA arch < 89 上不支持
        quantize_(model, float8_weight_only(), filter_fn=proj_filter_conv3d)
    elif "fp8dq" in torchao_config:
        granularity = torchao_config.split("-")[-1]
        granularity_map = {
            "per_row": PerRow(),
            "per_tensor": PerTensor(),
        }
        assert granularity in granularity_map, \
            f"Supported granularity are: {granularity_map.keys()}, got {granularity}"
        quantize_(
            model,
            float8_dynamic_activation_float8_weight(granularity=granularity_map[granularity]),
            filter_fn=proj_filter_conv3d,
        )
    else:
        raise ValueError(f"Unexpected config: {torchao_config}")
​
    return model

评论区精华

CI flake on main 测试

作者 b8zhong 在 PR 评论区指出:'Flake on main https://github.com/sgl-project/sglang/actions/runs/31640770400/job/94284276555?pr=34304',认为失败来自 main 分支的既有不稳定测试。

结论:该失败与 torchao 移除无关,未引发进一步讨论或代码调整。 · no-action

风险与影响

风险主要来自以下三方面:

  1. 公开 CLI 参数移除--torchao-config 被删除后,仍使用该参数的用户脚本会直接启动失败。不过由于该参数此前在所有取值下都会抛 ImportError,实际可用用户几乎为零,回归影响有限。
  2. 跨模块引用残留:删除涉及 server_args.pyloader.pymodel_runner.pypaddleocr_vl.pyrunners.py 等 5 个以上源码文件,若存在对 get_exec().graph.torchao_configmodel.torchao_applied 的其他引用,可能在运行时触发 AttributeError。本 PR 依靠代码搜索清理,但未提供自动化验证。
  3. 多平台依赖移除pyproject_npu.tomlpyproject_xpu.toml、AMD wheel、XPU Dockerfile 均移除 torchao,若这些平台仍有隐含的运行时依赖未声明,可能影响构建或启动。

整体风险较低,因被删除功能已完全不可用。

影响范围:

  • 用户:不能再使用 --torchao-config 参数,需要改用 SGLang 原生量化通道(如 --quantization fp8nvfp4_online 等)。
  • 系统:启动依赖减少一项,python/sglang/check_env.py 的环境检查列表和多个平台的打包配置同步收窄;LayeredModelLoadermaybe_apply_post_load_model_transforms 的控制流简化。
  • 团队:后续维护者不再需要维护一套与 torchao API 紧耦合的适配代码,量化功能入口更聚焦于原生实现;文档移除也可避免误导用户尝试不可用的配置。

影响程度:中低,属于契约收敛型清理。

公开 CLI 参数移除 跨模块引用残留 依赖移除影响多平台构建

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论