1、vllm推理
vLLM 的推理分为 Prefill 和 Decode 两个阶段。
Prefill 会并行处理整个 Prompt,完成 Transformer 前向计算,并为每层生成 KV Cache。最后根据 Prompt 最后一个位置的 logits 采样出第一个输出 token。这个阶段包含大量 GEMM,计算密度较高,所以通常是 compute-bound,主要看 GPU 的 Tensor Core 算力。对于超长上下文,Attention 的二次复杂度也会成为瓶颈。
Decode 从第一个输出 token 开始自回归生成。每一轮输入最新 token,复用历史 KV Cache,再生成下一个 token。由于每轮只处理少量 token,却需要读取大量模型权重和不断增长的 KV Cache,所以通常是 memory-bound,主要受 HBM 显存带宽限制。
TTFT 指请求到达后,客户端收到第一个输出 token 的时间,大致可以拆成:
TTFT = 预处理 + 排队调度 + Prefill + 首次采样 + 传输
优化 TTFT,我会先通过监控确认时间花在排队、Prefill 还是返回链路,然后分别处理。
第一,减少输入 token,例如压缩历史对话和 RAG 文档;多模态模型还可以减少图片数量、分辨率和视频帧数。
第二,对重复的 system prompt、工具定义或公共文档启用 Prefix Caching,复用已有 KV Cache。它要求前缀 token 完全一致,而且首次请求没有收益。
第三,高并发时降低排队和阶段间干扰。可以调整并发量、max_num_batched_tokens 和 max_num_seqs,使用 Chunked Prefill,或者做 Prefill/Decode 分离。Chunked Prefill 能缓解长 Prompt 的队头阻塞,但分块过小可能增加单请求 TTFT。
第四,提高 Prefill 本身的执行效率,例如使用更小或低精度模型、高效 Attention kernel、更强硬件,以及合理的 Tensor Parallel。并行度过高也会引入通信开销,需要实测。
2、xprofiler工具
昆仑芯推出的性能采集工具,用于采集应用运行期间的 XPU 执行轨迹;导出的 Trace 文件通过 Perfetto 进行可视化和 SQL 分析,以定位性能瓶颈
它的核心作用是回答:
推理任务的时间到底消耗在了哪里?
例如:
XPU 计算
Kernel 执行
Cluster/SDNN 运算
数据搬运和 DMA
Stream 等待
多卡同步
Kernel 下发间隔
设备负载不均
显存带宽使用
典型使用流程是:
启动 XProfiler
→ 运行推理程序或发送推理请求
→ XProfiler 记录 CPU/XPU 活动
→ 导出 Trace JSON
→ 使用 Perfetto 查看时间线
→ 统计和定位性能瓶颈
最常用的 time 模式命令是:
/usr/local/xpu/profiler/xprofiler \
--xpu=all \
--time=60 \
--resolution-interval=500 \
--export-profile=/实际路径/trace.json
XProfiler 有三种运行模式:
fork
由 XProfiler 启动一次性程序,记录程序从启动到退出的全过程。
time
记录已经运行的服务在指定时间窗口内的活动,适合 SGLang 这类常驻推理服务。
deamon
由业务代码调用 profiler start/stop,只记录指定代码片段。