Skip to content

[Bug] TGI/Triton/MindIE 服务化后端不解析 details.generated_tokens,性能报告 Token Throughput 恒为 0 #616

Open

Description

@lsyx6399

操作系统及版本

不适用(代码走查问题,跨平台)

安装工具的python环境

docker容器中的python环境

python版本

3.11

AISBench工具版本

ais_bench-benchmark 3.1.0(main @ 7bcb644)

AISBench执行命令

ais_bench --models tgi_api_general --datasets synthetic_gen --mode perf

TGI / Triton / MindIE 三个服务化后端均受影响。

模型配置文件或自定义配置文件内容

from ais_bench.benchmark.models import TGICustomAPI

models = [
    dict(
        attr="service",
        type=TGICustomAPI,
        abbr="tgi-api",
        path="",
        model="",
        stream=True,
        retry=2,
        host_ip="127.0.0.1",
        host_port=8080,
        max_out_len=512,
        batch_size=4,
        generation_kwargs=dict(temperature=0.7),
    )
]

预期行为

性能报告中的 Input/Output Token Throughput、generate_tokens_speed 应反映服务端返回的实际 token 数。

实际行为

三个后端的 parse_text_response / parse_stream_response 只写 output.content,从不设置 output.input_tokens / output_tokens:

  • ais_bench/benchmark/models/api_models/tgi_api.py:125-132
  • ais_bench/benchmark/models/api_models/triton_api.py:92-98
  • ais_bench/benchmark/models/api_models/mindie_stream_api.py:123-124

这三个服务实际上都在响应里返回了 token 数 —— 仓库自带的 mock 服务就是按真实协议实现的:
tools/infer_serve_simulator/api/tgi_api.py:32-39、triton_api.py:28-33、mindie_origin.py:61-70
都返回 details.generated_tokens,但解析侧把它丢了。

因此 base_perf_metric_calculator.py:490-523 的 Input/Output Token Throughput 恒为 0,
summarizers/default_perf.py:184-186 的 generate_tokens_speed 也是 0,只有延迟类指标可用。

附带问题:summarizers/default_perf.py:154-162 本应在服务未上报 token 时用 tokenizer 兜底估算,
但 Output.__init__ 把计数器初始化为 0(models/output.py:19-20),jsonl 里这两个键一定存在且非 None,
而判断写的是"键不存在或 is None",因此兜底逻辑永远不触发 —— 对任何未上报 usage 的后端,报告里都是 0 token。

前置检查

  • 我已读懂主页文档的快速入门,无法解决问题
  • 我已检索过FAQ,无重复问题
  • 我已搜索过现有Issue,无重复问题
  • 我已更新到最新版本,问题仍存在

Activity

  1. github-actions commented on Oct 28, 2026

    @github-actions

    🌟欢迎给AISBench benchmark测评工具提issue,我们会尽快处理您的诉求~

  2. github-actions commented on Oct 28, 2026

    @github-actions

    🤖 基于AI机器人的issue内容完整性检查结果:

    问题内容检查结果

    检查状态

    PASS

    详细检查

    • 操作系统及版本: COMPLETE
    • 安装工具的python环境: COMPLETE
    • python版本: COMPLETE
    • AISBench工具版本: COMPLETE
    • AISBench执行命令: COMPLETE
    • 模型配置文件或自定义配置文件内容: COMPLETE
    • 实际行为: COMPLETE

    改进建议

    所有内容已完备!

    补充说明

    该GitHub Issue内容非常详尽和专业。所有必填部分都已提供,并且信息具体、清晰,包含了必要的代码路径、版本信息和详细的行为描述,甚至还包括了对相关代码逻辑的分析和附带问题的提出,对于问题排查和解决非常有帮助。

    👉 如果想重新检查,在评论区@issue_checker即可。

    【强烈推荐❤️‍🔥】确保issue描述完整后,可以试着将issue交给Ask DeepWiki回答,deepwiki包含了和工具相关的所有知识库

  3. aisbench-issue-master commented on Oct 29, 2026

    @aisbench-issue-master

    感谢反馈,问题描述与代码定位都比较完整。

    结论

    问题成立,属于「响应字段已具备但未被消费」的信息丢失型缺陷,优先级建议 P1:Input/Output Token Throughput 与 generate_tokens_speed 是性能报告的核心指标,恒为 0 会让 TGI/Triton/MindIE 三条链路的性能数据整体失去可比性;且该缺陷不抛异常、只表现为「数字不对」,排查成本高于崩溃类问题。

    根因分析

    1. 解析侧未覆盖非 OpenAI 协议的 token 字段:ais_bench/benchmark/models/api_models/tgi_api.py:125-132、triton_api.py:92-98、mindie_stream_api.py:123-124 的 parse_text_response / parse_stream_response 只写 output.content,未设置 input_tokens / output_tokens;而 details.generated_tokens 是 TGI 官方 API 的真实字段,接真实服务时同样会失效,问题不局限于模拟器联调。
    2. 兜底逻辑被 0 初始化静默短路:Output.__init__(ais_bench/benchmark/models/output.py:19-20)把计数器初始化为 0,jsonl 中这两个键必然存在且非 None,而 ais_bench/benchmark/summarizers/default_perf.py:154-162 的判断是「键不存在或 is None」,因此 tokenizer 兜底永不触发——任何未上报 usage 的后端都会得到 0 token。
    3. 缺少字段级契约断言:现有 smoke case 只验证链路连通,未校验 throughput 数值,因此这类「链路通但指标为 0」的静默回归不会被 CI 捕获。

    建议修复方向

    • 字段优先、兜底不归零:优先读取 details.generated_tokens(Triton 同路径,位于 text_output + details 结构中);字段缺失时回退 tokenizer 计数并打 warning 留痕,而不是直接返回 0,避免在异常、截断、ignore_eos=False 提前 EOS 等场景引入新的 KeyError 或静默归零。
    • 修正兜底判定:default_perf.py:154-162 需区分「键缺失」「值为 None」与「值为 0 且确认无 usage」三种情形,保证未上报 usage 的后端真正走 tokenizer 估算。
    • 抽取公共取值逻辑:建议在 BaseAPIModel 增加统一的 _extract_output_tokens(response, text, field_path),三条链路按各自字段路径复用,避免口径漂移。
    • 补齐测试:在 tests/UT/models/api_models/ 为三个后端各补「字段优先」与「缺失回退且非零」用例;smoke 侧在 perf_*_stream_* 断言中增加 output_token_throughput > 0。

    仍需确认

    • issue 正文称 tools/infer_serve_simulator/api/mindie_origin.py:61-70 已返回 details.generated_tokens,但另有核对意见认为该模拟器仅返回 generated_text。MindIE 模拟器侧是否缺该字段需要先确认:若缺失,应作为独立子问题与后端解析拆开处理,否则 perf_*_mindie_stream_* 仍无法验证。
    • 已看到 [bugfix] Parse token usage for TGI/Triton/MindIE backends #615 与本 issue 交叉引用,需确认该 PR 是否覆盖上述全部范围(后端解析、兜底判定、模拟器、测试)。
  4. lsyx6399 commented on Oct 29, 2026

    @lsyx6399
    Author

    感谢详细复核,几点确认/补充:

    关于「MindIE 模拟器是否返回 details.generated_tokens」:issue 描述准确,模拟器确实返回该字段。tools/infer_serve_simulator/api/mindie_origin.py:74-75(流式)与 :91-92(非流式)都有 "details": {"generated_tokens": output_length},与 tgi_api.py:28-29/47-48、triton_api.py:27-28/43-44 一致。因此 #615 的解析侧改动可以端到端验证,MindIE 不需要拆独立子问题。

    关于 #615 的覆盖范围:PR #615 已覆盖前两条建议的核心——

    • 字段优先:三个后端新增 _update_usage_from_details() 从 details.generated_tokens 取 token(TGI/Triton/MindIE 各自字段路径)。
    • 兜底判定修正:summarizers/default_perf.py 的 is None 改为 <= 0,让未上报 usage 的后端真正走 tokenizer 估算,且打 warning 留痕。

    未覆盖的(可作后续):

    • 抽取公共 _extract_output_tokens 到 BaseAPIModel:当前三后端各自实现 _update_usage_from_details,有少量重复,可上提。为控制 PR 规模与 review 风险,本次未做,可单独提一个 refactor PR。
    • smoke 侧断言 output_token_throughput > 0:同意,但涉及 perf smoke 用例改造,建议与 [bugfix] Parse token usage for TGI/Triton/MindIE backends #615 分开。

    如需要我把这两项补进 #615,或开 follow-up,请告知。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions