性能 Benchmark¶
Benchmark 文档应该回答“怎么重新测”,而不是保存一组很快会过时的数字。本页只保留当前仓库可运行的 benchmark 入口、推荐口径和结果解读方法。
什么时候跑¶
- 改了数据读取、cache、batch transform 或 schema 解析。
- 改了 dense optimizer、scheduler 或 AMP / compile 默认值。
- 改了 TileLang / torch backend 的 attention、RMSNorm 或 embedding fused operator。
- 想比较两个实验包的吞吐差异,但不想把模型指标和系统吞吐混在一起。
正式结论必须记录代码版本、硬件、CUDA / PyTorch 版本、命令和 JSON 输出。不要复用旧机器上的绝对数值。
准备数据¶
不要直接用 1000 行 demo 数据做吞吐结论。先按 快速开始 从 Hugging Face 下载 demo_1000.parquet,并把归档 schema 放到同一目录:
然后把 demo 数据放大到一个稳定口径,例如 300x:
uv run taac-generate-pcvr-synthetic-dataset \
--source-dir data/sample_1000_raw \
--output-dir outputs/perf/pcvr_synthetic_300x \
--multiplier 300 \
--force
这个命令会生成 parquet 和 schema.json,默认对 user / item / 时间字段做轻量 offset,避免完全重复的 id 干扰部分缓存观察。
数据管道 Benchmark¶
数据管道 benchmark 不跑模型,只测 parquet 读取、batch 构建、cache 和增强带来的吞吐变化。
mkdir -p outputs/benchmarks
uv run taac-benchmark-pcvr-data-pipeline \
--dataset-path outputs/perf/pcvr_synthetic_300x/demo_300000.parquet \
--schema-path outputs/perf/pcvr_synthetic_300x/schema.json \
--preset none \
--passes 3 \
> outputs/benchmarks/data_pipeline_none.json
常用 preset:
| preset | 含义 |
|---|---|
none |
纯数据加载,不启用 cache 或增强 |
cache |
启用 LRU cache |
opt |
启用 OPT batch cache |
augment |
启用序列裁剪、特征 mask 和 domain dropout |
opt-augment |
OPT cache + 数据增强 |
建议至少跑:
for preset in none opt augment opt-augment; do
uv run taac-benchmark-pcvr-data-pipeline \
--dataset-path outputs/perf/pcvr_synthetic_300x/demo_300000.parquet \
--schema-path outputs/perf/pcvr_synthetic_300x/schema.json \
--preset "$preset" \
--passes 3 \
> "outputs/benchmarks/data_pipeline_${preset}.json"
done
重点看 JSON 里的 rows_per_sec、batches_per_sec、measured_rows、measured_batches 和 cache_impl。如果 measured_rows 太小,结论通常不稳定。
如果只想验证 Arrow RecordBatch 到 PCVR batch 的转换优化,使用 converter-only 模式。它会先把 Arrow batch 预加载到内存,再只计时 _convert_batch(),避免 parquet IO、DataLoader worker、shuffle buffer 和 cache 抖动掩盖 Python/NumPy 转换开销。
uv run taac-benchmark-pcvr-data-pipeline \
--dataset-path outputs/perf/pcvr_synthetic_300x/demo_300000.parquet \
--schema-path outputs/perf/pcvr_synthetic_300x/schema.json \
--benchmark-mode convert \
--preset none \
--converter-batches 256 \
--warmup-batches 16 \
> outputs/benchmarks/data_pipeline_convert_none.json
做转换层优化时,先在改动前保存一次 benchmark_mode=convert 的 JSON,再在改动后用同一命令重跑,优先比较 rows_per_sec、batches_per_sec、measured_batches 和 strict_time_filter。
PCVR Smoke 诊断图¶
本地只有 demo1000 时,不要把 AUC 当成主结论。训练和评估命令会写出 training_telemetry.json、evaluation_telemetry.json 和 validation_predictions.jsonl,可以直接生成运行成本、预测分布、模型相关性、样本分歧和稳定性图:
uv run taac-plot-pcvr-diagnostics \
--run baseline=outputs/smoke/baseline_seed42 \
--run baseline_plus=outputs/smoke/baseline_plus_seed42 \
--run interformer=outputs/smoke/interformer_seed42 \
--run onetrans=outputs/smoke/onetrans_seed42 \
--run symbiosis=outputs/smoke/symbiosis_seed42 \
--run tokenformer=outputs/smoke/tokenformer_seed42 \
--run unirec=outputs/smoke/unirec_seed42 \
--run rankup=outputs/smoke/rankup_seed42 \
--output-dir figures/pcvr_diagnostics
如果 run 目录还没有 evaluation.json 和 validation_predictions.jsonl,先跑对应的 bash run.sh val ...;如果还需要推理耗时图,也要先跑 bash run.sh infer ...。绘图命令默认会拒绝缺少评估产物的输入,避免生成只有 no-data 的占位图。
详细口径见 PCVR Smoke Diagnostics。
Optimizer Benchmark¶
Dense optimizer benchmark 用一个合成 MLP 负载比较优化器 step 成本,适合看 adamw、fused_adamw、orthogonal_adamw、muon 这类选择的系统开销。各 optimizer 的配置方式和行为边界见 优化器。
uv run taac-benchmark-pcvr-optimizer \
--device cuda \
--batch-size 512 \
--feature-dim 128 \
--hidden-dim 512 \
--depth 4 \
--steps 50 \
--warmup-steps 10 \
--repeats 5 \
--optimizers adamw,orthogonal_adamw,muon \
> outputs/benchmarks/optimizer_cuda.json
如果只是本地 CPU 可用性检查,可以把 --device cuda 改成 --device cpu,但不要拿 CPU 数字推断线上 GPU 训练性能。
Accelerator 算子 Benchmark¶
算子 benchmark 用来比较 torch backend 和 accelerator backend 的耗时,并同时做误差检查。每个已接入算子的参数、命令模板、支持状态和最近一次验收快照记录在 Benchmark 总览。尚未接入的 Triton / TileLang 候选项记录在 算子路线图。本页只保留最小入口命令。
RMSNorm:
uv run taac-benchmark-pcvr-tilelang-ops \
--operator rms_norm \
--device cuda \
--rows 8192 \
--cols 128 \
--dtype float16 \
--backends torch,tilelang,triton \
> outputs/benchmarks/rms_norm_accelerators.json
LayerNorm:
uv run taac-benchmark-pcvr-tilelang-ops \
--operator layer_norm \
--device cuda \
--rows 8192 \
--cols 128 \
--dtype float16 \
--backends torch,triton \
> outputs/benchmarks/layer_norm_accelerators.json
Flash Attention:
uv run taac-benchmark-pcvr-tilelang-ops \
--operator flash_attention \
--device cuda \
--batch 8 \
--heads 8 \
--query-len 128 \
--kv-len 128 \
--head-dim 64 \
--dtype float16 \
--backends torch,tilelang \
> outputs/benchmarks/tilelang_flash_attention.json
Embedding bag mean:
uv run taac-benchmark-pcvr-tilelang-ops \
--operator embedding_bag_mean \
--device cuda \
--batch 8192 \
--embedding-vocab-size 1000000 \
--embedding-dim 64 \
--embedding-bag-size 4 \
--embedding-padding-prob 0.25 \
--dtype float16 \
--backends torch,tilelang,triton \
--block-cols 64 \
> outputs/benchmarks/embedding_bag_mean_accelerators.json
cuEmbed forward-only 对照可以在同一入口显式加入 cuembed:
uv run taac-benchmark-pcvr-tilelang-ops \
--operator embedding_bag_mean \
--device cuda \
--batch 8192 \
--embedding-vocab-size 1000000 \
--embedding-dim 64 \
--embedding-bag-size 4 \
--embedding-padding-prob 0.25 \
--dtype float16 \
--backends torch,tilelang,triton,cuembed \
--block-cols 64 \
> outputs/benchmarks/embedding_bag_mean_accelerators.json
如果在 CPU 上运行,TileLang、Triton 或 cuEmbed backend 可能报告 unsupported,这是正常的环境信号,不等于 torch fallback 有问题。cuEmbed backend 还需要可用 CUDA toolkit 来完成 PyTorch extension JIT。
解读原则¶
- 先比较同一机器、同一代码版本、同一命令参数下的相对变化。
rows_per_sec适合看数据管道;step time 更适合看 optimizer 和算子。- cache benchmark 至少跑多 pass,否则 warmup 和首次访问会掩盖真实收益。
- TileLang 结果要同时看速度和误差状态;速度快但 accuracy failure 不能算可用。
- benchmark 输出放在
outputs/benchmarks/,不要提交生成结果,除非要做一次明确的报告快照。
源码入口¶
- 数据生成:
src/taac2026/application/benchmarking/generate_pcvr_synthetic_dataset.py - 数据管道 benchmark:
src/taac2026/application/benchmarking/pcvr_data_pipeline_benchmark.py - Optimizer benchmark:
src/taac2026/application/benchmarking/pcvr_optimizer_benchmark.py - TileLang benchmark:
src/taac2026/application/benchmarking/pcvr_tilelang_ops_benchmark.py