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-verbose 的 device_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.py 的 CompletionRequest 未解析 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 性能判定标准
- TTFT 随 seq 近线性增长,无明显拐点。
- decode 延迟在固定 batch 下基本不随 seq 变化(paged KV 预期行为)。
- batch 16 / seq 4096 不 OOM;吞吐随 batch 单调上升至饱和。
- 任一矩阵点失败 / 回退 / 超阈值 → 不通过,需附根因。
四、精度验证
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/completions、v1/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 回溯。归档位置:—
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)。
验证范围:
判定原则:
二、测试环境
bf6f16f0ca7d1eb9619197ea74fd359e4d502a0f3723473332792c476806c06398162d32fe49882d9b144026b3b193e6afbc8d6fb1617e97ee26d9a6参考实现(精度真值):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)/ 吞吐 / 分位数据。vllm bench serve的 TTFTvllm bench serve的 ITLvllm bench serve的 Output / Request throughputvllm bench serve的 percentilesnpu_generate --profile-verbose的device_wall(kernel 级钻取)[KV cache sizing]3.2 测试矩阵
max-seq-len:256 / 512 / 1024 / 2048 / 4096max-num-seqs:1 / 2 / 4 / 8 / 16优先覆盖 9 个代表点(其余作为扩展):
3.3 执行方式
(A) 随机输入输出性能测试(vLLM bench serve,主):先起服务,再用随机数据压测。
(B) kernel 级计时钻取(
npu_generate --profile,补 prefill/decode kernel 的 device_wall):3.4 性能结果
(1) 性能矩阵(vllm bench serve;单点 mean;prefix-caching 关、greedy;吞吐为 vllm 报告值)
(2) kernel device_wall(命令 B,kernel 级钻取)
(3) KV cache 占用(serving 启动日志)
3.5 性能判定标准
四、精度验证
4.1 多 batch 输出一致性
目标:验证融合 decode 的固定 batch + row 0 复制填充机制不污染 active 行。
方法(greedy,
temperature=0,排除采样噪声):max_abs_diff < 1e-2(bf16 量级)。判定:全部一致 → 通过(硬性要求,任一不一致即不通过)。
4.2 基准数据集
4.3 数据集评估方法(AISBench)
数据集的精度与性能评测统一采用华为 AISBench(基于 OpenCompass,面向服务化 API 后端)对本仓库的在线服务进行评测。本仓库 serving 暴露的
/v1/completions与/v1/chat/completions即为 AISBench 的服务化后端,二者协议一致,无需额外适配。(1) 安装 AISBench
(2) 下载数据集(置于
benchmark/ais_bench/datasets/)(3) 配置服务化后端
编辑
benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py,指向本仓库 serving:host_ip/host_port--port,默认 8000)path/model--served-model-namemax_out_lenmax_out_len+ 输入长度 ≤ serving 的--max-model-lenbatch_sizetemperature0(greedy)(4) 执行评测
精度(accuracy):
性能(吞吐/时延,可与 3.3 的
bench_serving交叉验证):常用数据集 prompt 配置文件名(以 AISBench 仓库
ais_bench/datasets/内 README 与数据集列表为准):ceval_gen_0_shot_cot_chat_prompt.pymmlu_gen_0_shot_cot_chat_prompt.pygsm8k对应配置(见数据集列表)结果落盘:精度 →
outputs/default/<时间戳>/summary/summary.csv|md;性能 →performances/<模型>/<数据集>.csv|json。将对应 acc / 性能数值填入 4.2 与第三章结果表。4.4 精度判定标准
五、结论
总体结论:进行中。性能 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:命令速查
附录 B:运行日志归档
各次跑分留存 trace /
SA_PROFILE_OUTPUT/ 控制台日志,便于事后逐 kernel 回溯。归档位置:—