sskj — 多平台大模型推理性能基准测试项目
更新(2026-08-31 17:05:00 CST):新增 Kimi-K3 PP8 + DFlash PD 适配验证入口。基于 SGLang PR #33863 固定源码,接通 PP 分段 hidden 投影、P 侧 prompt draft KV 生成、D 侧输入生命周期与 TP4→TP32 的 draft GQA KV 传输,保留 Kimi SM120 FlashInfer MXFP4 接入。修复 P 普通预热误带 DFlash verify metadata 的启动问题,23 项 CPU 回归通过;修复镜像已同步 601–608,服务级验证正在进行,尚无 GSM8K 结果。配置为 P TP4/PP8/EP4、D TP32/PP1/EP4、BF16 KV、8K Chunk,计划固定 64 题 C1/C8。详见 experiments/pro6000/kimi3_pro6000_pd_dflash_validation/README.md。
更新(2026-08-27 13:53:26 CST):完成 Kimi-K3 八节点标准 PD 第一阶段。P 组 601-604 使用 PP8×TP4×EP4、FlashInfer MXFP4、Chunk 8K,D 组 605-608 使用 PP1×TP32×EP32、Marlin,通过 Mooncake 0.3.12.post1 和 4 Rail RDMA 传输;统一 P/D page_size=64 后,16K→1 与 16K→512 的 C1/C8 共 91/91 请求成功。代表结果:16K→1 C8 Input TPS 6364.31、TTFT P50/P95 20.555/21.345 秒;16K→512 C8 TPOT P50/P95 63.20/66.55 ms。详见 experiments/pro6000/kimi3_pro6000_pd_pp8_standard/README.md。
更新(2026-08-20 10:13:01 CST):完成 Kimi-K3 Prefill TP Reduce Scatter 可行性审计并停止该方向。K3 的 MLA 输出门控仍依赖完整 7168 维 hidden,且 69/93 层为 KDA;保留或恢复 gate hidden 后,原 hidden All-Reduce 无法消除并新增 2112 维 latent All-Gather,估算通信量反增约 14.7%。研究原型仅保留为否决证据,不进入四节点实验或上游 PR;后续转向 MoE A2A 与 Pipeline Parallelism。详见 experiments/pro6000/kimi3_pro6000_sglang_tp_reduce_scatter_prefill/README.md。
更新(2026-08-19 16:51:43 CST):完成 Kimi-K3 / RTX 6000D / SGLang Prefill MoE backend 交付文档收敛与 Chunk=4K 补测。四节点 TP32×EP4、16K→1、C=8/16 下 12/12 重复、480/480 请求成功;FlashInfer 相对 Marlin 提升约 9.8% Input TPS、降低约 9.0% TTFT。结合 4K/8K/16K 全部结果,最终推荐保持 flashinfer_mxfp4 + chunked_prefill_size=8192。
更新(2026-08-19 14:23:52 CST):601 的 GitLab SSH key 已生效,内部 Kimi-K3 SM120 审计分支已推送至 qqtang/sskj:hzy-kimi-k3-sm120-flashinfer-mxfp4。远端已有普通分支 hzy,因此不能创建 hzy/... ref,最终采用无层级冲突的分支名;GitHub SGLang feature 分支保持不变。
更新(2026-08-19 13:58:50 CST):用户同步 GitHub fork 后,将 Kimi-K3 SM120 SGLang 的 7 个提交无冲突重放到最新 main 593b1a9,range-diff 逐提交确认补丁等价;最终 Draft HEAD b95b534 已推送至 ACEEE-1222/sglang:hzy/kimi-k3-sm120-flashinfer-mxfp4。在 601 统一验证镜像中重跑最终 HEAD 的语法与定向回归,结果为 10 passed, 3 deselected;代表性四机性能数据保留,不重复消耗 GPU。
更新(2026-08-19 13:07:48 CST):完成 Kimi-K3 SM120 SGLang Draft PR 的最终代表点验收。基于 SGLang 300c87a 与 FlashInfer #4460 b525c51,在 601-604 四节点 TP32×EP4 上完成 16K→1、C=8、Chunk=8K 的 Marlin/FlashInfer 各 3 次 A/B;240/240 请求成功。FlashInfer 的 Input TPS 中位数提升 10.96%,TTFT P50/P95 分别下降 9.91%/9.92%。公开 PR Checklist 已全部勾选,轻量汇总和原始证据索引已归档。
更新(2026-08-19 10:45:18 CST):新增 Kimi-K3 SM120 SGLang Draft PR 的单点代表性验收入口。使用精确 SGLang 300c87a、FlashInfer #4460 实现 b525c51 和统一镜像,在 601-604 四节点 TP32×EP4 上仅复测 16K→1、C=8、Chunk=8K 的 Marlin/FlashInfer A/B,各 3 次重复;完整命令、镜像身份、原始日志和汇总统一落入单个 Run 目录。
更新(2026-08-18 23:00:42 CST):完成依赖 FlashInfer #4460 的 SGLang Draft PR 收敛。确认不提交任何 FlashInfer PR,也不 vendor 或 pin 未合并 kernel;在 601 GPU6 上从 #4460 源码构建 FlashInfer 0.6.18 wheel,SGLang 定向测试 8/8 通过。Draft 标题、依赖、兼容策略、测试和四机 EP4 数据见 experiments/pro6000/kimi3_pro6000_sglang_sm120_flashinfer_mxfp4/SGLANG_DRAFT_PR.md。
更新(2026-08-18 22:21:40 CST):完成 Kimi-K3 SM120 FlashInfer MXFP4 去重审计。确认 CUTLASS SiTU kernel 已由未合并的 FlashInfer PR #4460 实现,不再提交平行 kernel;SGLang 贡献收敛为 Kimi gate/up 与 scale 布局、SiTU 4.0/25.0 参数映射、非连续输入和 SM120 attention-residual guard,并保留 601-604 EP4 的全部服务级结果。详见 experiments/pro6000/kimi3_pro6000_sglang_sm120_flashinfer_mxfp4/UPSTREAM_DUPLICATION_AUDIT.md。
更新(2026-08-18 18:38:17 CST):完成 Kimi-K3 四节点 TP32×EP4 的真实 Prefill MoE backend 验收;24/24 重复均 40/40 成功,FlashInfer MXFP4 在 8K Chunk、C=8/16 下相对 Marlin 提升约 11% Input TPS、降低约 10% TTFT,并确认 8K 优于 16K。实验默认 EP 改为 4,补齐非连续 Prefill 输入与 FlashInfer 官方 SiTU 回归,详见 experiments/pro6000/kimi3_pro6000_sglang_sm120_flashinfer_mxfp4/README.md。
更新(2026-08-18 13:55:30 CST):Kimi-K3 四节点 MoE backend 验收入口支持通过环境变量覆盖 EP size 及 backend/chunk/concurrency 子矩阵,用于先执行 TP32×EP4、16K Chunk、16K→1、C=16 的最大压力容量验证,同时保留默认 TP32×EP32 全矩阵。
更新(2026-08-18 13:03:33 CST):Phase 5 候选镜像改为针对 Kimi 基础镜像原生 SGLang 源码应用最小兼容补丁,仅补齐 SM120 FlashInfer MXFP4 backend 分发、权重布局与 SiTU 激活映射,避免整体替换新版 Python 包造成 sglang-kernel 版本错配。
更新(2026-08-18 12:24:19 CST):新增 Kimi-K3 / 601-604 / SGLang TP32×EP32 的真实 Prefill MoE backend 验收实验;固定比较 Marlin 与 FlashInfer MXFP4 在 16K→1、C=8/16、Chunk=8K/16K 下的 TTFT、E2E 与 Input TPS,并提供四节点一致候选镜像构建、原始证据和自动汇总,详见 experiments/pro6000/kimi3_pro6000_sglang_tp32ep32_moe_backend_prefill/README.md。
更新(2026-08-17 11:56:47 CST):完成 Kimi-K3 / RTX PRO 6000D / SGLang FlashInfer MXFP4 MoE Phase 2 correctness harness;SwiGLU 控制矩阵 8/8 通过,覆盖 edge routing、EP global ID、NaN/Inf、确定性、CUDA Graph 和 Kimi 真尺寸,SiTU 目标矩阵 8/8 稳定复现同一 C++ 缺口,详见 experiments/pro6000/kimi3_pro6000_sglang_sm120_flashinfer_mxfp4/README.md。
历史更新见
git log。项目目的与工作流见下方。 项目目的:当新显卡(GPU/NPU)到货时,用最短时间完成大模型在该平台上的推理性能评估与部署配置选型。 当前模型:DeepSeek-V4-Flash(FP8 / INT8);后续接入 GLM5.2,完全复用本项目的实验与报告流程。 新平台接入 SOP:docs/NEW_PLATFORM_GUIDE.md。
这个项目解决什么问题
- 新卡快速评估:新平台到货后,按 SOP 复制实验目录、改少量配置,即可跑起与既有平台口径一致的 benchmark,横向可比。
- 部署配置选型:通过 TP×DP 并行矩阵 + 自适应并发搜索,回答"该平台上哪种并行配置在什么并发下满足 SLO、吞吐最高"。
- 数据资产化:每轮实验产出结构化结果(jsonl/csv/manifest),汇总成飞书性能报告并回填多维表格,形成可检索的历史数据库。
标准工作流(全流程)
① 跑实验 experiments/<platform>/<experiment>/run_adaptive_concurrency*.sh
└─ 公共搜索逻辑: scripts/common/adaptive_bench_lib.sh
② 落盘 adaptive_results/<run_id>/
└─ adaptive_points.jsonl / adaptive_shapes.jsonl / adaptive_summary.* / run_manifest.json
③ 分析 用 Python 从 jsonl 实算(禁止目测),SLO 口径见 docs/SLO_STANDARDS.md
④ 飞书报告 按飞书 wiki「性能报告编写指南(README)」写到「显卡性能报告/<平台>」节点下
⑤ 回填多维表格 飞书「模型推理适配 Bench 迭代跟踪」:每成功探测点一行
- SLO 口径(S2 层,DSV4-Flash / GLM5.2 均适用):TTFT P95 < 3s,TPOT P95 < 50ms,严格小于。详见
docs/SLO_STANDARDS.md。 - 报告编写规范(章节骨架、分析口径、发布流程)以飞书 wiki「显卡性能报告 / 性能报告编写指南(README)」为准。
- 多维表格每行 = 一个成功探测点(config、Concurrency、Throughput、Input/Output TPS、TTFT/TPOT/E2E P95、SLO达标状态、开发文档链接)。
目录结构
仓库的目录布局、scripts/common/ 组件职责、结果命名规范与 results.json schema,统一见 docs/EXPERIMENT_GUIDE.md(单一权威来源)与 docs/BENCHMARK_WORKFLOW.md。
实验索引
TP/DP matrix + 自适应并发(当前主流形态)
| 实验 | 说明 |
|---|---|
experiments/h20/dsv4_h20_vllm_tp_dp_matrix/ |
H20 + vLLM,TP2/DP4、TP4/DP2、TP8/DP1 |
experiments/h20/dsv4_h20_sglang_tp_dp_matrix/ |
H20 + SGLang,同上 |
experiments/h200/dsv4_h200_vllm_tp_dp_matrix/ |
H200 + vLLM |
experiments/h200/dsv4_h200_sglang_tp_dp_matrix/ |
H200 + SGLang |
experiments/p800/dsv4_p800_sglang_tp_dp_matrix/ |
P800 + SGLang(INT8;TP2/DP4 启动 OOM 无数据,见 config.env 注释) |
experiments/pro6000/dsv4_pro6000_vllm_tp_dp_matrix/ |
RTX 6000D + vLLM |
experiments/pro6000/dsv4_pro6000_sglang_tp_dp_matrix/ |
RTX 6000D + SGLang |
experiments/pro6000/kimi3_pro6000_sglang_tp32ep32/ |
RTX 6000D + SGLang,Kimi-K3(TP32×EP32,部署手册见 docs/KIMI_K3_DEPLOY.md) |
experiments/pro6000/kimi3_pro6000_sglang_tp32ep32_moe_backend_prefill/ |
RTX 6000D + SGLang,Kimi-K3 真实 Prefill 的 Marlin/FlashInfer MXFP4 与 Chunk 8K/16K 对照 |
experiments/pro6000/kimi3_pro6000_sglang_tp_reduce_scatter_prefill/ |
Kimi-K3 Prefill TP Reduce Scatter 可行性审计;因 MLA gate 与 KDA 依赖完整 hidden,结论为不推荐继续 |
experiments/pro6000/kimi3_pro6000_pd_pp8_standard/ |
Kimi-K3 八节点标准 PD:P=PP8/TP4/EP4、D=PP1/TP32/EP32、Mooncake 4 Rail RDMA,含 16K→1/512 C1/C8 原始证据 |
experiments/pro6000/kimi3_pro6000_pd_rdma/ |
RTX 6000D + SGLang,Kimi-K3 PD 分离(MoonCake RDMA,8 节点,见 deploy_pd.sh + docs/KIMI_K3_DEPLOY.md 附录 B) |
每个目录内:run_bench.sh 跑固定并发矩阵;run_adaptive_concurrency.sh 从 C=1 指数倍增搜饱和点;run_adaptive_concurrency_add16.sh 从 C=16 线性 +16 步进、带 TTFT SLO 停止与回退(当前主力用法,见 experiments/ADAPTIVE_CONCURRENCY_USAGE.md)。
其他实验(H200 老形态 & 专项)
| 实验 | 说明 |
|---|---|
experiments/h200/dsv4_h200_sglang/ …/dsv4_h200_vllm/ |
H200 单引擎 baseline |
experiments/h200/dsv4_h200_sglang_vs_vllm/ |
H200 引擎控制变量对比 |
experiments/h200/dsv4_h200_dspark/ …/dsv4_h200_vllm_dspark_vs_default/ |
DSpark 投机解码相关 |
experiments/h200/dsv4_h200_vllm_mtp_vs_default/ |
vLLM MTP 对比 |
experiments/h200/dsv4_h200_vllm_tp{2,4,8}_custom_bench/ |
自定义压测客户端(多服务负载均衡) |
experiments/h200/dsv4_h200_max_context_length/ …/dsv4_h200_long_context_matrix/ …/dsv4_h200_256k_4k_probe/ …/dsv4_h200_64k_sglang_vs_vllm/ |
长上下文专项 |
experiments/p800/dsv4_p800_sglang/ …/dsv4_p800_max_context_length/ …/dsv4_p800_long_context_matrix/ …/dsv4_p800_256k_4k_probe/ |
P800 baseline 与长上下文专项 |
experiments/TEMPLATE/ |
老式固定场景实验模板 |
快速复现
以 H20 vLLM 自适应并发搜索为例(其他平台同理,换目录即可):
# 1. dry-run:只打印搜索计划,不加载模型
cd experiments/h20/dsv4_h20_vllm_tp_dp_matrix
DRY_RUN=1 bash run_adaptive_concurrency_add16.sh
# 2. 单组合冒烟:只测 TP=8、1K/128,并发上限 8
RUN_ID=smoke-$(date +%Y%m%d-%H%M%S) \
TP_LIST="8" ISL_LIST="1024" OSL_LIST="128" GRID_LIMIT=1 SEARCH_MAX_CONCURRENCY=8 \
bash run_adaptive_concurrency_add16.sh
# 3. 正式跑(放 tmux)
tmux new-session -d -s h20-vllm-adaptive \
"cd $(pwd) && bash run_adaptive_concurrency_add16.sh"
更多用法(断点续跑 RESUME_RUN_ID、常用覆盖参数)见 experiments/ADAPTIVE_CONCURRENCY_USAGE.md。
新平台 / 新模型接入
- 新显卡:按
docs/NEW_PLATFORM_GUIDE.md执行,核心动作是复制experiments/h20/dsv4_h20_<engine>_tp_dp_matrix、改config.env/adaptive_config.env/matrix.json三件套,再加platforms/<chip>.env。 - 新模型(GLM5.2):复用同一实验目录结构,新增
experiments/<platform>/glm52_<platform>_<engine>_tp_dp_matrix/,改模型路径、量化与引擎启动参数即可;SLO 口径、报告流程、多维表格结构不变。
环境要求
- 公共:bash、Python 3、
sglang.bench_serving压测客户端(Docker 或 venv);绘图分析用envs/charts/(matplotlib)。 - 各平台的镜像 / venv / 模型路径见对应实验目录的
config.env与platforms/<chip>.env;模型与数据集路径是机器相关的,换机器时按实际路径调整。 - 环境搭建规范见
envs/README.md与envs/UV_ENV_SETUP.md。
运维与部署分层
- 模型团队用
deploy/profiles/<platform>/<model>-<engine>.env与python -m sskj.deploy start|stop|status管理服务生命周期。 - 运维只跑测试:
python -m sskj.bench run --url http://<host>:<port> --platform <platform> --experiment <name> --profile smoke|matrix。 - 运维手册见
ops/README.md,统一测试层复用现有scripts/common/parse_backend.py等指标口径。
注意事项
- 提交内容:实验代码 + 最终产物(results.json / report.md / adaptive 的 jsonl 与 summary);日志、raw_outputs、gpu_logs 不入库(
.gitignore已排除)。 - 仓库会clone到多台机器,实验脚本内引用公共组件一律用
${SCRIPT_DIR}/../../../scripts/common(TEMPLATE 为../../),不要写绝对路径。