Skip to content

[Bug] Qwen3-14B 泛化验证报告 #43

Description

@sunghajung6688

Qwen3-14B 泛化验证报告

本报告对 Qwen3-14B 在 PyPTO serving 流程(融合 40 层 PAGED decode_fwd + chunked prefill)上的性能精度进行系统性验证,覆盖从短序列到长序列(256 → 4096)、单 batch 到多 batch(1 → 16)的泛化表现。规范方法、执行命令与判定标准如下,实测数据由各章节结果表记录。


一、验证概述

验证对象:Qwen3-14B PyPTO serving 全流程(主进程 scheduler + worker 进程 NPU 执行,prefill/decode 共用同一 PAGED KV pool)。

验证范围:

维度 内容
性能 序列长度 256 / 512 / 1024 / 2048 / 4096;batch 1 / 2 / 4 / 8 / 16
精度 多 batch 输出一致性(greedy);CEval、GSM8K 基准分数

判定原则:

  • 性能:全矩阵点在阈值内、无 OOM / 无异常拐点 → 通过。
  • 精度:多 batch 一致性为硬性要求(逐 token 必须一致);数据集分数相对参考实现对齐 → 通过。

二、测试环境

仓库 commit bf6f16f0ca7d1eb9619197ea74fd359e4d502a0f
pypto-lib 子模块 commit 3723473332792c476806c06398162d32fe49882d
NPU 平台 / device a3
PyPTO 版本 9b144026b3b193e6afbc8d6fb1617e97ee26d9a6
验证日期 2026-06-29(进行中)

参考实现(精度真值):golden 分数应使用 AISBench 在标准后端(如 vLLM-Ascend / HuggingFace transformers)上、以与被测服务相同的 prompt 模板与采样参数测得,确保评测协议一致;低算力环境下可对照仓库内 examples/model/qwen3_14b/cpu_generate.py(CpuModelExecutor)。


三、性能验证

3.1 指标定义

性能主测试采用 vLLM bench(vllm bench serve)的随机输入输出(--dataset-name random),输入/输出长度精确可控,得到干净的 TTFT / 解码间隔(ITL)/ 吞吐 / 分位数据。

指标 含义 数据来源
TTFT(ms) 首 token 延迟,≈ prefill 耗时 vllm bench serve 的 TTFT
decode 延迟(ms/token) 解码每 token 间隔(ITL) vllm bench serve 的 ITL
吞吐(tok/s, req/s) 端到端吞吐 vllm bench serve 的 Output / Request throughput
稳定性 同配置多次运行 p50/p99 vllm bench serve 的 percentiles
kernel device_wall(ms) prefill/decode 设备侧纯算力耗时 npu_generate --profile-verbosedevice_wall(kernel 级钻取)
KV cache 占用(GB) KV pool 实际占用 serving 启动日志 [KV cache sizing]

矩阵维度映射:--random-input-len 对应输入序列长度维度(256 / … / 4096),--num-prompts(全压并发)对应 batch 维度,--random-output-len 控制解码长度。两者正交扫表即得到 3.2 矩阵。

输出长度对齐提示:随机输入输出测试要求 decode 跑满 --random-output-len。当前 server.pyCompletionRequest 未解析 ignore_eos,随机 token 触发 EOS 概率较低但偶发会提前截断;若需严格固定输出长度对比,建议在 serving 端补 ignore_eos 支持。

3.2 测试矩阵

  • 序列长度 max-seq-len:256 / 512 / 1024 / 2048 / 4096
  • batch max-num-seqs:1 / 2 / 4 / 8 / 16

优先覆盖 9 个代表点(其余作为扩展):

seq=256 seq=1024 seq=4096
batch=1
batch=4
batch=16

3.3 执行方式

(A) 随机输入输出性能测试(vLLM bench serve,主):先起服务,再用随机数据压测。

# 起服务(长上下文 / 多 batch 需大环)
task-submit --device auto --run \
  "PTO2_RING_HEAP=4294967296 PTO2_RING_TASK_WINDOW=1048576 PTO2_RING_DEP_POOL=1048576 \
  python -m python.cli.main \
    --model /path/to/Qwen3-14B --backend npu --platform a2a3 --device {} \
    --max-model-len <S> --max-num-seqs <B> --port 8899"

# 安装 vllm bench 依赖
pip install 'vllm[bench]'

# 随机输入输出压测:--random-input-len 扫序列长度,--num-prompts 控并发(batch)
vllm bench serve \
  --backend openai \
  --base-url http://127.0.0.1:8899 \
  --endpoint /v1/completions \
  --model Qwen3-14B \
  --dataset-name random \
  --random-input-len <256|512|1024|2048|4096> \
  --random-output-len <32|128|512> \
  --num-prompts <N> \
  --ignore-eos \
  --output-json results_<S>x<O>x<N>.json

多请求并发未配置大环时,可能返回 HTTP 200 但不出 token(报 rtMalloc failed: 207001 等),须带大环。

(B) kernel 级计时钻取(npu_generate --profile,补 prefill/decode kernel 的 device_wall):

task-submit --device auto --max-time 0 --run \
  "PTO2_RING_HEAP=536870912 PTO2_RING_TASK_WINDOW=131072 PTO2_RING_DEP_POOL=131072 \
  python examples/model/qwen3_14b/npu_generate.py \
    --model-dir /path/to/Qwen3-14B \
    --prompt '<按需拼接至目标输入长度>' \
    --platform a2a3 \
    --max-seq-len <256|512|1024|2048|4096> \
    --max-num-seqs <1|2|4|8|16> \
    --max-new-tokens 32 \
    --profile --profile-verbose"

3.4 性能结果

(1) 性能矩阵(vllm bench serve;单点 mean;prefix-caching 关、greedy;吞吐为 vllm 报告值)

batch 输入 seq 输出 TTFT(s) TPOT(ms) Output(tok/s)
1 256 256 0.85 72 13.3
1 512 256 1.56 71 13.1
1 1024 512 3.10 69 13.3
1 2048 512 6.27 94 9.4
4 256 256 2.74 194 19.6
4 512 256 8.29 244 14.5
4 1024 512 10.23 122 28.3
4 2048 512 24.15 144 21.0
16 256 256 15.64 351 38.6
16 512 256 20.33 536 37.5
16 1024 512 42.20 360 36.2
16 2048 512 ~70 ~1400 23–31

TTFT 可复现;decode TPOT 单点跑间有方差(b1/s2048 复跑 94→139、b4/s256 三跑 167–194)。要点:TTFT 随 prefill 总 token(batch×seq)近线性(÷~330 tok/s);batch=16 吞吐饱和 ~37 tok/s(与 seq 无关);b16/s2048 容量崩塌(13 s 级 decode 停顿、吞吐回落),由并发 KV token 数驱动。b8、seq=4096 待补。

(2) kernel device_wall(命令 B,kernel 级钻取)

配置点 prefill device_wall(ms) decode device_wall(ms/step)
seq=4096, batch=1
seq=4096, batch=16
seq=1024, batch=16

(3) KV cache 占用(serving 启动日志)

配置 num_pages kv_cache_size(GB) context_tokens
seq=4096, batch=16

3.5 性能判定标准

  1. TTFT 随 seq 近线性增长,无明显拐点。
  2. decode 延迟在固定 batch 下基本不随 seq 变化(paged KV 预期行为)。
  3. batch 16 / seq 4096 不 OOM;吞吐随 batch 单调上升至饱和。
  4. 任一矩阵点失败 / 回退 / 超阈值 → 不通过,需附根因。

四、精度验证

4.1 多 batch 输出一致性

目标:验证融合 decode 的固定 batch + row 0 复制填充机制不污染 active 行。

方法(greedy,temperature=0,排除采样噪声):

  • 固定同一组 prompt(≥ 20 条,中英文 + 长短混合)。
  • 分别在 batch=1 / 8 / 16 下生成。
  • 判定 A(硬性):各 batch 下输出 token_ids 序列完全一致 → 通过。
  • 判定 B(数值,辅助):同输入首 token logits 相对 golden 的 max_abs_diff < 1e-2(bf16 量级)。
prompt golden 首 token batch=1 batch=8 batch=16 一致 logits max_abs_diff

重点关注:padding 行复制来源的 row 0 在不同 batch 下结果是否稳定;长序列(seq=4096)下 chunked prefill + paged decode 拼接是否引入误差。

判定:全部一致 → 通过(硬性要求,任一不一致即不通过)。

4.2 基准数据集

精度与性能评测均通过 AISBench(华为昇腾评测套件)对在线服务进行(见 4.3)。精度评估采用 greedy,与 golden 同条件对照。

数据集 分数 指标 题量 / 备注 判定
CEval 81.0% acc 1346 题,52/52 学科 对齐 ✓
GSM8K 89.99% acc(match) 1319 题;thinking 关 对齐 ✓
MMLU 79.6% acc 14042 题,57 学科;weighted 77.9% 对齐 ✓
CMMLU 81.0% acc 11582 题,67/67 学科 对齐 ✓
HumanEval 90.24% pass@1 164 题 对齐 ✓
GPQA(diamond) 42.9% acc 198 题;thinking 关 对齐 ✓

数据集初测(AISBench,greedy):

  • CEval(06-29):52 学科全完成、1346 题、正确 1094、acc 81.0%
  • CMMLU(06-29):67 学科全完成、11582 题、正确 9473、acc 81.0%
  • MMLU(07-01):57 学科全完成、acc 79.6%(naive)/ 77.9%(weighted);分类 STEM 76.8 / 社科 85.5 / 人文 80.1 / 其他 77.8,弱项为数学(58.9)、化学(56.0)、法律(54.4)、global_facts(47.0)——与各模型在 MMLU 上的典型弱项一致。
  • GSM8K(07-02):1319 题全集、acc 89.99%、空输出 0(thinking 关、max_out_len 2048、batch 16,8901 端口;此前一次 32.9% 系服务/端口异常,已弃)。
  • HumanEval(07-02):164 题、pass@1 90.24%、0 空输出(测试用例执行验证)。
  • GPQA diamond(07-02):198 题、acc 42.9%、0 空输出(thinking 关;超难题,Qwen3-14B 量级正常)。

CEval / CMMLU 均空输出 0、NaN 退化 0 → 融合 40 层 PAGED decode_fwd 在规模化推理(累计 ~2.9 万题)下数值稳定、无退化 ✓。六集分数与 Qwen3-14B 公开水平一致:中文/英文知识 79.6–81%、数学/代码 ~90%、GPQA 42.9%(关思考)。

4.3 数据集评估方法(AISBench)

数据集的精度与性能评测统一采用华为 AISBench(基于 OpenCompass,面向服务化 API 后端)对本仓库的在线服务进行评测。本仓库 serving 暴露的 /v1/completions/v1/chat/completions 即为 AISBench 的服务化后端,二者协议一致,无需额外适配。

(1) 安装 AISBench

git clone https://github.com/AISBench/benchmark.git
cd benchmark/
pip3 install -e ./ --use-pep517
pip3 install -r requirements/api.txt
pip3 install -r requirements/extra.txt
ais_bench -h          # 验证安装

(2) 下载数据集(置于 benchmark/ais_bench/datasets/)

cd ais_bench/datasets

# C-Eval
mkdir -p ceval/formal_ceval && cd ceval/formal_ceval
wget https://www.modelscope.cn/datasets/opencompass/ceval-exam/resolve/master/ceval-exam.zip
unzip ceval-exam.zip && rm ceval-exam.zip && cd -

# MMLU
wget http://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/mmlu.zip && unzip mmlu.zip && rm mmlu.zip

# GSM8K
wget http://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/gsm8k.zip && unzip gsm8k.zip && rm gsm8k.zip

(3) 配置服务化后端

编辑 benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py,指向本仓库 serving:

参数 取值
host_ip / host_port serving 监听地址与端口(--port,默认 8000)
path / model 模型权重路径 / --served-model-name
max_out_len 输出上限;max_out_len + 输入长度 ≤ serving 的 --max-model-len
batch_size 按数据集规模设定
temperature 精度评估取 0(greedy)

AISBench 服务化后端走 OpenAI 的 v1/chat/completionsv1/completions,与本仓库 server.py 提供的两个端点一致。

(4) 执行评测

精度(accuracy):

ais_bench --models vllm_api_general_chat \
  --datasets ceval_gen_0_shot_cot_chat_prompt.py \
  --mode all --dump-eval-details --merge-ds

性能(吞吐/时延,可与 3.3 的 bench_serving 交叉验证):

ais_bench --models vllm_api_general_chat \
  --datasets ceval_gen_0_shot_cot_chat_prompt.py \
  --summarizer default_perf --mode perf

常用数据集 prompt 配置文件名(以 AISBench 仓库 ais_bench/datasets/ 内 README 与数据集列表为准):

数据集 配置文件
C-Eval ceval_gen_0_shot_cot_chat_prompt.py
MMLU mmlu_gen_0_shot_cot_chat_prompt.py
GSM8K gsm8k 对应配置(见数据集列表)

结果落盘:精度 → outputs/default/<时间戳>/summary/summary.csv|md;性能 → performances/<模型>/<数据集>.csv|json。将对应 acc / 性能数值填入 4.2 与第三章结果表。

4.4 精度判定标准

  • 多 batch 一致性:逐 token 完全一致 → 通过。
  • 数据集:本实现分数相对 golden 落差 ≤ 1 个百分点 → 对齐(覆盖 bf16 + 采样差异的合理区间)。

五、结论

维度 子项 判定 备注
性能 短序列(256)延迟/吞吐 初测 ✓ batch=1:TTFT 851 ms、decode ≈14 tok/s
性能 长序列(4096)容量/吞吐 待测 外推 TTFT ≳12 s(下限),须实测无 OOM
性能 batch 扩展性(→16) 待测
精度 多 batch 一致性 待测
精度 数据集(6 个) 对齐 ✓ CEval/CMMLU 81%、MMLU 79.6%、GSM8K 90%、HumanEval 90.2%、GPQA 42.9%(累计 ~2.9 万题,零退化;见 4.2)

总体结论:进行中。性能 batch=1 已扫 seq 256/512/1024/2048、batch=4/seq=256 已测:TTFT 近线性、seq≤1024 暖跑稳态 decode ≈14 tok/s;⚠️ seq=2048 decode 抬头(ITL 均值 ~94 ms);batch 扩展性差:scaling 1×(b1)→1.5×(b4)→2.9×(b16)近饱和;batch=16 TTFT 15.6 s(prefill 计算瓶颈)、TPOT 351 ms(见 3.4)。精度 6 个数据集全部对齐 ✓:CEval/CMMLU 81%、MMLU 79.6%、GSM8K 90%、HumanEval 90.2%、GPQA 42.9%(thinking 关;累计 ~2.9 万题,零退化)。待办:补 batch=8、追 batch 扩展性根因(prefill/decode 计算受限)、长 seq(4096)、多 batch 一致性。

已知问题 / 后续:


附录 A:命令速查

# 单点三级计时
python examples/model/qwen3_14b/npu_generate.py --model-dir <DIR> \
  --prompt '<P>' --platform a2a3 --max-seq-len <S> --max-num-seqs <B> \
  --max-new-tokens 32 --profile --profile-verbose

# 起 serving(大环)
PTO2_RING_HEAP=4294967296 PTO2_RING_TASK_WINDOW=1048576 PTO2_RING_DEP_POOL=1048576 \
python -m python.cli.main --model <DIR> --backend npu --platform a2a3 \
  --device {} --max-model-len <S> --max-num-seqs <B> --port 8899

# 随机输入输出压测(vLLM bench serve,指向在线服务)
pip install 'vllm[bench]'
vllm bench serve --backend openai --base-url http://127.0.0.1:8899 \
  --endpoint /v1/completions --model Qwen3-14B --dataset-name random \
  --random-input-len <S> --random-output-len <O> --num-prompts <N> \
  --ignore-eos --output-json results.json

# 数据集精度/性能评测(AISBench,指向在线服务)
ais_bench --models vllm_api_general_chat --datasets ceval_gen_0_shot_cot_chat_prompt.py \
  --mode all --dump-eval-details --merge-ds            # 精度 acc
ais_bench --models vllm_api_general_chat --datasets ceval_gen_0_shot_cot_chat_prompt.py \
  --summarizer default_perf --mode perf                # 性能吞吐/时延

# 健康检查
curl --noproxy "*" http://127.0.0.1:8899/health

附录 B:运行日志归档

各次跑分留存 trace / SA_PROFILE_OUTPUT / 控制台日志,便于事后逐 kernel 回溯。归档位置:—

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions