模型推理与优化加速(一): 概念同步
逐步学习如何优化模型推理
概览
本文章主要描述的是如何一步步学习模型的性能优化. 手动操作, 一步步学习各种优化方法. 本章节为初步认知部分, 让小白同学也能初步认知
完整目录
概念认知同步: 关键评估指标与思维框架
阶段一:入门与基本工具
概念与流程
小模型练习序列
下载小模型, 了解参数量、文件大小、加载时间差异
思考
阶段二:核心优化技术
图与算子层优化
数值精度与量化
剪枝、稀疏与结构压缩
知识蒸馏(Distillation)
内存与缓存优化(LLM 专属逐步进入)
并行与分布式推理
编译与自动生成(进阶)
阶段三:系统化与服务化
推理服务架构
资源利用与成本控制
高级加速技术(LLM 专用)
监控与可观测
部署形式
成品案例分析
概念认知
首先指标定义对于性能优化非常重要, 否则“优化”会变为一种体感. 我们要知道慢在哪里, 做出优化决策, 与已有速度进行对比, 同时能计算出两者的成本差异. 毕竟优化一个是为了快, 一个是为了节省成本
推理流水线里有什么?
每一条每一批的模型推理从用户准备好数据开始, 会经历很多步骤到达模型层, 经过神经网络加权后输出结果, 还需要经过后处理才能返回给用户.
它包含了:
网络传输:客户端输入信息传到模型服务, 服务器返回结果给客户端预处理:数据清洗、格式转换(如图像缩放、文本分词); 特征提取(如将文本转为 token 或嵌入向量); Prompt 编码(LLM 场景下的输入准备)。前向计算:Embedding映射和查找; transformer层或时序模型计算; 预测结果产生后处理:对结果反归一化, 格式化
算子分布会影响模型推理
算子分布是指在模型推理中, 各种算子的操作和执行分布性能表现. 他是深度学习模型中计算图的基本单元. 例如矩阵乘法(MatMul)、卷积(Conv)、激活函数(ReLU)、归一化(BatchNorm / LayerNorm)等。
如果在计算的过程中, 某些算子占用时间过多, 可以考虑优化这些算子(高效实现 or 算子融合) 或者减少调用频率
序列阶段也会影响性能
针对某些数据推理中, 序列数据的特点是: 数据是按照顺序排序的, 可能需要逐步处理, 也可能需要全局计算.
比如预测销量模型中, 序列数据关注的是一个区域的历史数据和增量数据的处理
总体思维框架
如果要分析推理性能问题, 需要从上到下进行分析; 而落实到的行动里, 可以由五层模型分析和校验
问题语境层:场景类型(实时/批量/生成式/检索式),成功标准是什么指标层:用什么量化(延迟、吞吐、资源、质量、稳定性、成本)分解层:把指标切成可干预的组成部分(流水线阶段、算子分布、序列阶段)归因层:把异常数值映射到常见瓶颈类别(计算密集 / 内存带宽 / IO / 启动开销 / 结构冗余)决策层:优化动作的优先级(收益/复杂度/风险三角)
后续我们会通过实际例子, 来描述以上问题, 并且尝试提出解决方案
场景语境与成功标准
实时场景:对于聊天问答、推荐这些低延迟的场景而言,P95/P99延迟 + 首token延迟是我们重点关注的批量场景:大批量推理的场景下, 主指标为:吞吐 + 成本生成式场景:对于流式序列任务、离线生成图像, 我们更关心首token + 稳态token延迟 + 生成质量(BLEU, ROUGE, FID)检索式场景:对于检索场景,Embedding生成 + 检索效率和准确性是最重要的
核心指标体系
性能类指标
| 指标 | 定义 | 细分 / 拆解 (包含哪些流程) | 常用单位 | 典型采集方式 |
|---|---|---|---|---|
| 单次延迟 (Latency) | 单次端到端请求 | 模型加载+前处理+前向处理+后处理+网络请求 | ms | 日志 or 埋点 |
| 首 token 延迟 (TTFT) | 文本类型模型推理后首次输出时间 | 预处理+prompt编码+首轮注意力计算 | ms | 分阶段打点; 对比常温vs冷启动 |
| 稳态 token 间延迟 | 连续输出token的平均间隔 | 循环前向 + KV Cache命中率 | ms/token | 流式回调时间差 |
| 吞吐 (Throughput) | 单位时间处理的数据量或token数 | 静态批次吞吐 vs 连续批处理吞吐 | samples/sec or tokens/sec | 聚合/周期计数 |
| 并发度利用率 | 实际活跃请求占可承载数量比例 | 峰值并发 vs 平均并发 | % | 服务测并发统计 |
| GPU 利用率 | SM/Compute 利用率 | 计算占比 vs 内存等待(stall) | % | nvidia-smi / Nsight Systems |
| 内存占用 | 模型参数 + 中间激活 + 缓存区 | 权重内存 / workspace / KV Cache | GB | 显存采样+分区统计 |
| KV Cache 增长率 | 长序列生成中缓存扩张速度 | 代际大小 vs 分页/压缩效果 | MB/token | vLLM内部指标 |
| 启动时间 (Cold Start) | 从进程/容器启动到首请求可用 | 权重加载 + 初始化编译 | s | 埋点, 避免和首次推理混淆 |
质量保证指标
| 分类 | 指标 | 说明 | 常见阈值/关注点 |
|---|---|---|---|
| LLM | 准确率 / F1 / Recall | 分类或抽取任务 | 量化后下降幅度(如 ≤1–2%) |
| 困惑度 (Perplexity) | 语言模型原生评估 | INT4 或极端剪枝下降是否突增 | |
| BLEU / ROUGE / 任务自定义指标 | 文本生成特定 | 蒸馏与剪枝对生成一致性影响 | |
| 回答一致性 (对比基准输出差异) | LLM 多轮推理 | 量化后语义漂移 | |
| 回归/时序模型 | WAPE/WMAPE | 业务量级加权、可解释 | 相对基线劣化 ≤1–2% |
| Pinball Loss(分位数) | 分布/分位一致性 | 各 q 分位不劣化(≤1–2%) | |
| PICP(有区间时) | 置信区间覆盖率 | 与目标覆盖或基线偏差 ≤1–2 pct | |
| 强化学习模型 | 平均/中位回报 | 主任务收益 | 不低于基线 x% |
| 策略 KL(对基线) | 控制策略漂移 | ≤设定阈值 | |
| CVaR(或分位回报) | 尾部风险控制 | 不恶化(≥基线 |
稳定性与可运维指标
| 指标 | 说明 | 价值 |
|---|---|---|
| P95/P99 延迟 | 长尾性能 | 是否有偶发极慢请求 |
| 超时率 / 拒绝率 | SLA 失败次数 | 调度 / 资源不足信号 |
| GPU OOM 频次 | 显存溢出 | KV Cache 策略是否合理 |
| 负载抖动 (Utilization variance) | 短时间内 GPU 利用率波动 | 批处理策略是否均衡 |
| 失败重试次数 | 调用层回退机制触发 | 兼容性或内存碎片问题 |
成本与销量指标
| 指标 | 定义 | 作用 |
|---|---|---|
| 每 QPS 成本 | CPU / GPU / 可用 QPS | 评估扩容 vs 优化的 ROI |
| 每 1K tokens 成本 | tokens 处理量 / 资源消耗 | LLM 商业化计价参考 |