Prhub

#28598 [misc] Share bench HTTP-client base-URL resolution with IPv6-compatible formatting

原始 PR 作者 hnyls2002 合并时间 2026-06-18 11:50 文件变更 4 提交数 3 评论 3 代码增减 +49 / -52

执行摘要

共享 base-URL 解析并修复 IPv6 格式化

每个 HTTP bench 客户端都重复实现了“使用 --base-url,否则从 --host/--port 构建”的逻辑,且部分构建使用了原始 f-string,未对 IPv6 地址加括号(如 bench_serving 的 embedding 路径),导致 IPv6 环境下 URL 格式错误。集中解析逻辑可避免重复并统一 IPv6 兼容格式化。

推荐阅读,尤其是 resolve_base_url 的设计和 _BACKEND_API_PATHS 的引入方式。该 PR 展示了如何通过提取通用函数消除重复代码并修复一致性问题,是良好的工程实践。

讨论亮点

该 PR 没有展开 review 讨论(GitHub Review 评论数 0)。PR body 已清晰说明变更动机和实现细节,未引发争议。

实现拆解

按照 PR 描述,分为以下步骤:

  1. sglang/srt/utils/network.py 中添加 resolve_base_url(base_url, host, port) 函数,该函数如果 base_url 非空则直接返回,否则通过 NetworkAddress(host, port).to_url() 生成 IPv6 安全的 URL。
  2. 修改 bench_serving.py:导入 resolve_base_url;移除原有的 if/elif 后端 URL 构建链,替换为 _BACKEND_API_PATHS 字典映射;调用 resolve_base_url 生成 base_url,然后与 API 路径拼接;修复 embedding 路径中缺少 IPv6 括号的问题。
  3. 修改 send_one.py:导入 resolve_base_url;在 BenchArgs 中添加 base_url 字段,新增 --base-url 命令行参数;在 send_one_prompt() 中使用 resolve_base_url 替换原有的 f-string 构造。
  4. 修改 endpoint.py:导入 resolve_base_url;在 launch_or_reuse_server() 中使用 resolve_base_url('', server_args.host, server_args.port) 替换原有的 f-string 构造。
文件 模块 状态 重要度
python/sglang/bench_serving.py 基准测试 modified 7.15
python/sglang/srt/utils/network.py 网络工具 modified 6.1
python/sglang/benchmark/endpoint.py 基准启动 modified 5.26
python/sglang/test/send_one.py 测试工具 modified 4.73

关键符号

resolve_base_url launch_or_reuse_server send_one_prompt run_benchmark

关键源码片段

python/sglang/bench_serving.py dependency-wiring

核心变更文件:引入 _BACKEND_API_PATHS 字典替换冗长的 if/elif 链,简化 URL 构建逻辑,并修复 embedding 路径 IPv6 问题。

# bench_serving.py - 后端 API 路径映射表
_BACKEND_API_PATHS = {
    "sglang": "/generate",
    "sglang-native": "/generate",
    "sglang-oai": "/v1/completions",
    "sglang-oai-chat": "/v1/chat/completions",
    "sglang-embedding": "/v1/embeddings",
    "vllm": "/v1/completions",
    "vllm-chat": "/v1/chat/completions",
    "lmdeploy": "/v1/completions",
    "lmdeploy-chat": "/v1/chat/completions",
    "trt": "/v2/models/ensemble/generate_stream",
    "truss": "/v1/models/model:predict",
}# 使用
base_url = resolve_base_url(args.base_url, args.host, args.port)
if args.backend == "gserver":
    api_url = args.base_url if args.base_url else _na.to_host_port_str()
else:
    api_url = f"{base_url}{_BACKEND_API_PATHS[args.backend]}"

评论区精华

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

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

风险与影响

主要风险是回归:虽然作者声称对于 IPv4/hostname 输出 byte-identical,但 endpoint.py 中原使用 f'http://{host}:{port}' 现在变为 NetworkAddress(host, port).to_url(),若 NetworkAddress.to_url() 内部行为有变化(例如对非 IPv6 的 host 添加括号?)可能导致 URL 不同。但检查 NetworkAddress 实现可知 to_url() 仅对 IPv6 地址加括号,对 IPv4/hostname 返回 http://host:port 格式,因此无差异。另外,bench_serving 中 gserver 后端特殊处理(bare host:port)未受影响。总体风险较低,但应确认测试覆盖(特别是 IPv6 场景)。

影响限于 bench 和测试客户端。用户:bench 脚本在 IPv6 网络下正确工作;send_one 新增 --base-url 选项,与 bench 脚本一致。系统:无性能影响。团队:URL 解析逻辑集中,后续维护更简单。

兼容性回归风险(IPv6 括号添加) 缺少 IPv6 集成测试

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论