在开始优化工作之前,很有必要建立一个清晰、量化的认识,关于您的特征平台当前性能特点。基准测试提供了这个基准,让您能够衡量变化的影响,识别瓶颈,并就扩展和架构做出明智的决定。如果没有系统的测量,优化就变成了猜测,有浪费精力的风险,并可能导致其他地方的性能下降。
本节侧重于系统测量特征平台性能的两个主要维度的方法:在线服务延迟和离线计算吞吐量。
定义基准测试目标
第一步是定义哪些性能方面最重要,对于您的特定使用场景。常见目标包括:
- 了解当前性能: 在典型负载条件下建立延迟和吞吐量的基准。
- 识别瓶颈: 找出限制整体性能的组件或操作(例如:数据库读取、网络传输、计算步骤)。
- 评估设计选择: 比较不同架构模式、数据模型或基础设施选择的性能影响(例如,比较两种不同的在线存储数据库技术)。
- 容量规划: 确定所需资源,以满足预期未来负载或服务水平目标 (SLO)。
- 回归测试: 确保代码更改或基础设施更新不会对性能产生负面影响。
通常,基准测试工作侧重于两个重要方面:
- 在线服务延迟: 特征平台为实时推理请求检索特征的速度有多快?这直接影响生产机器学习应用程序的响应速度。
- 离线计算吞吐量: 特征平台生成或回填大量特征数据的效率如何,用于模型训练或批处理?这影响了实验和模型再训练周期的速度。
在线服务延迟基准测试
在线服务性能通常通过以下时间来衡量:响应来自客户端应用程序(例如,模型服务端点)的特征检索请求所需的时间。
指标
重要延迟指标包括:
- 平均延迟: 所有请求的平均响应时间。虽然易于计算,但可能受异常值影响。
- 分位数延迟 (p50, p95, p99, p99.9): 这些能够更好地了解用户体验。例如,p95 延迟表示 95% 的请求所经历的最长时间。高分位数 (p99, p99.9) 对于了解最差性能和尾部延迟问题很重要。
- 每秒请求数 (RPS) 或每秒查询数 (QPS): 系统能处理的最大负载,同时保持可接受的延迟 SLO。
- 错误率: 失败或超时的请求百分比。
方法
有效的在线基准测试需要模拟真实的生产流量模式。
- 定义工作负载: 描述典型请求:
- 每次调用请求的特征数量。
- 请求特征的数据类型。
- 实体 ID 的分布(考虑潜在的“热键”)。
- 读/写混合(如果适用,尽管通常是读密集型)。
- 选择工具: 使用能够模拟并发用户和特定请求模式的负载生成工具。例如 Locust, k6, Apache JMeter 或自定义脚本。这些工具允许您增加负载、维持负载并收集详细指标。
- 配置环境: 在一个与生产环境(硬件、网络、软件版本)高度相似的环境中运行基准测试。尽可能隔离被测试的特征平台组件,以避免混杂因素。
- 执行测试: 运行长时间测试,以观察负载下的行为,而不仅仅是初始爆发性能。改变并发级别(模拟用户),以找到延迟急剧增加或出现错误的饱和点。
- 分析结果: 绘制延迟分布(直方图或 CDF)并跟踪 RPS 对应的分位数延迟。识别性能下降的拐点。
95th 百分位延迟随请求负载增加的分布,比较了基线配置和优化后的配置。优化后的系统在明显更高的负载下保持更低的延迟。
离线计算吞吐量基准测试
离线基准测试侧重于批处理特征生成或回填过程的效率,通常涉及大量数据和分布式计算框架,如 Apache Spark 或 Apache Flink。
指标
重要的吞吐量指标包括:
- 作业完成时间: 处理特定数据集或时间范围所需的总实际时间。
- 数据处理速率: 每单位时间处理的源数据量(例如,GB/小时)或每单位时间生成的特征行数。
- 资源利用率: 作业期间的 CPU、内存、网络和 I/O 使用情况。这有助于识别资源瓶颈(例如,CPU 密集型与 I/O 密集型)。
- 成本: 运行计算作业相关的基础设施成本。
方法
对离线作业进行基准测试需要代表性数据和配置。
- 定义测试作业: 选择典型的特征工程管道或回填任务。
- 准备代表性数据: 使用与生产数据量和特征(数据分布、基数、稀疏度)相似的数据集。使用微小样本数据集通常会产生误导性结果。
- 配置环境: 使用与目标生产环境可比的集群配置(节点数量、节点类型、执行器内存/核心)或系统地改变配置以了解扩展行为。
- 执行作业: 在测试数据和配置上运行定义的作业。使用框架的工具(例如 Spark UI)监控执行进度。
- 收集指标: 记录作业持续时间、来自集群监控工具(例如 Ganglia, Datadog, CloudWatch)的资源利用率指标,以及任何输出统计信息(处理的行数,写入的数据)。
- 分析结果: 比较不同配置或代码版本的完成时间。分析资源利用率图表以识别瓶颈(例如,倾斜任务、高垃圾回收时间、I/O 等待时间)。计算处理速率和成本效率。
离线基准测试运行流程,从数据和配置开始,在监控的同时执行作业,并分析所得的持续时间、速率和瓶颈。
建立基准并确保可重复性
有效的基准测试需要一致性。
- 隔离变量: 在基准测试运行之间一次只改变一个因素(例如,代码更改、数据库版本、实例类型),以准确归因性能差异。
- 一致的环境: 确保底层硬件、网络配置、操作系统和依赖项版本在比较测试中保持稳定。容器化有助于实现这一点。
- 预热期: 对于在线系统,在测量前运行一段时间的测试,以允许缓存预热并使系统达到稳定状态。
- 多次运行: 对每种配置执行多次运行,并对结果取平均值(或使用统计方法),以消除瞬时波动。
- 记录所有信息: 记录每次基准测试运行的精确配置、代码版本、使用的数据集、负载参数和结果。
基准测试不是一次性活动。为您的重要特征平台操作建立基准,并将性能测试集成到您的 CI/CD 管道中,以尽早发现退步。通过系统地测量性能,您获得所需的信息,以构建和维护不仅仅是功能性的特征平台,而是真正达到生产就绪水平,并能够大规模支持高要求机器学习应用程序的。