Benchmark——基准测试

目录

一、基本概念

二、几个关键点

1、 数据集:

2、 工作负载:

3 、度量指标:

4、测试工具:

三、测试流程

 四、测试实例

五、SOTA,benchmark和baseline区别


一、基本概念

Benchmark (computing), the result of running a computer program to assess performance.
A best-performing test, also called the gold standard.

    一句话,benchmark是一种对算法、模型或方法性能的标准化评估和比较方法,是一种评价方式。

    通俗的讲,我们最熟悉的benchmark模型是高考。高考是测试和评估我们对高中 知识掌握情况的活动。在考试后,通过高考这个测试确定一个已知的分数——一本线。在高考这项测试中使用的数据集便是每年的高考试卷,测试方式是通过闭卷考试,各个学科是实验指标,我们的水平是算法的性能。

    在计算机领域,benchmark可用于测试多个方面,例如cpu性能,网络性能,Web性能数据仓库性能等。


二、几个关键点

为了更深入地了解Benchmark,我列举出了一些关于其的关键点,并根据我们的项目分析这些关键点。

1、 数据集:

    为了进行Benchmark,通常会使用一个标准的数据集。为了更好地模拟实际工作负载并提供更准确的性能评估,这些数据集通常模拟真实世界的数据,包括各种数据类型和规模。数据集又分为结构化数据、半结构化数据和非结构化数据。

2、 工作负载:

    在Benchmark中,工作负载指的是被测试系统或组件所要处理的任务、操作或数据集合。工作负载通常包括一系列的指令、操作序列或数据访问模式,旨在模拟真实世界的使用场景。这些操作可能包括数据加载、数据查询、报表生成、ETL过程等。

计算机硬件和处理器领域:

整数运算(Integer Arithmetic): 测试处理器在整数运算方面的性能。
浮点运算(Floating-Point Arithmetic): 测试处理器在浮点运算方面的性能。
内存带宽(Memory Bandwidth): 评估处理器与内存之间的数据传输速率。
矩阵运算(Matrix Operations): 用于测试处理器在科学计算和图形处理等方面的性能。


图形处理单元(GPU)领域:

图形渲染(Graphics Rendering): 评估GPU在处理图形渲染任务时的性能。
深度学习推理(Deep Learning Inference): 测试GPU在深度学习模型推理阶段的性能。
图像处理(Image Processing): 用于测试GPU在图像处理和计算机视觉任务上的性能。
并行计算(Parallel Computing): 评估GPU在并行计算工作负载下的性能。


存储系统领域:

随机读写(Random Read/Write): 测试存储系统处理随机读写操作的性能。
顺序读写(Sequential Read/Write): 评估存储系统处理顺序读写操作的性能。
数据库负载(Database Workload): 模拟数据库访问模式,测试存储系统在处理数据库工作负载时的性能。
大规模文件传输(Large-Scale File Transfer): 测试存储系统在大文件传输方面的性能。


数据库领域:

事务处理(Transaction Processing): 模拟数据库事务处理的工作负载,测试数据库的事务性能。
大规模数据查询(Large-Scale Data Queries): 测试数据库在处理复杂查询时的性能。
数据插入和更新(Data Insertion and Updates): 评估数据库在插入和更新数据时的性能。
多用户并发(Multi-User Concurrent Access): 模拟多用户同时访问数据库的场景,测试数据库的并发性能。


网络领域:

网络带宽测试(Network Bandwidth Testing): 评估网络设备在不同带宽下的性能。
网络延迟测试(Network Latency Testing): 测试网络设备对延迟敏感应用的支持。
网络吞吐量测试(Network Throughput Testing): 评估网络设备在高负载情况下的吞吐量。
安全性测试(Security Testing): 模拟网络攻击和安全漏洞,测试网络设备的安全性能。


人工智能领域:

模型训练工作负载(Model Training Workload): 评估机器学习模型在训练阶段的性能。
推理工作负载(Inference Workload): 测试模型在执行推理任务时的性能。
自然语言处理(NLP)工作负载: 模拟NLP任务,如文本生成和情感分析,测试模型在这些任务上的性能。
计算机视觉工作负载: 包括图像分类、目标检测等任务,用于测试模型在计算机视觉方面的性能。


 

3 、度量指标:

    度量指标用于衡量系统在特定方面的性能表现,指标根据基准测试的具体目的和应用场景而有所不同。

计算机硬件和处理器领域:

时钟频率(Clock Speed): 处理器的时钟速度。
吞吐量(Throughput): 处理器每秒能够执行的指令数量。
缓存性能(Cache Performance): 缓存命中率和缓存访问延迟。
整数和浮点运算性能(Integer and Floating-Point Performance): 处理器在整数和浮点运算上的性能。
并行性能(Parallel Performance): 处理器在多核和多线程环境下的性能。


图形处理单元(GPU)领域:

图形渲染速度(Graphics Rendering Speed): GPU在处理图形渲染任务时的速度。
帧率(Frame Rate): GPU每秒呈现的帧数。
显存带宽(Memory Bandwidth): GPU内存传输数据的速度。
并行计算性能(Parallel Computing Performance): GPU在并行计算任务上的性能。


存储系统领域:

读写速度(Read/Write Speed): 存储系统读取和写入数据的速度。
随机访问性能(Random Access Performance): 存储系统在处理随机访问时的性能。
吞吐量(Throughput): 存储系统每秒处理的数据量。
响应时间(Response Time): 存储系统对请求的响应时间。


数据库领域:

查询性能(Query Performance): 数据库在处理复杂查询时的性能。
事务处理性能(Transaction Processing Performance): 数据库在处理事务时的性能。
并发连接(Concurrent Connections): 数据库同时处理的连接数量。
索引性能(Indexing Performance): 数据库在创建和使用索引时的性能。


网络领域:

带宽(Bandwidth): 网络传输的数据量。
延迟(Latency): 数据从发送到接收之间的时间延迟。
吞吐量(Throughput): 网络每秒传输的数据量。
网络稳定性(Network Stability): 网络在高负载和不稳定条件下的表现。


人工智能领域:

模型训练速度(Model Training Speed): 训练机器学习模型所需的时间。
推理性能(Inference Performance): 模型在执行推理任务时的速度。
模型准确性(Model Accuracy): 模型在测试数据上的准确性。
模型大小(Model Size): 模型所占用的存储空间。


 

4、测试工具:

    测试工具是用于执行基准测试的软件或硬件工具。具体选择什么工具要看进行测试的系统、硬件、软件的特点以及测试的需求。对于数据仓库,一些常用的基准测试工具包括TPC Benchmark工具、HiveBench、Apache JMeter等。

 1、TPC

        TPC(Transaction Processing Performance Council)基准测试工具是一系列用于评估数据库系统性能的标准化基准测试。 TPC基准测试包括多个测试套件,每个套件都模拟了不同类型的数据库工作负载,如在线事务处理(OLTP)和决策支持(DSS)等。常见的TPC测试套件包括TPC-C(OLTP)、TPC-H(DSS)和TPC-DS(Decision Support)等。 提供了标准化的测试方法,使得不同数据库系统之间的性能比较更加公平和准确。

 2、HiveBench:

         HiveBench是用于评估Apache Hive(一种基于Hadoop的数据仓库查询工具)性能的基准测试工具。 HiveBench通过执行一系列的查询和操作,来模拟真实场景下的数据仓库工作负载,包括数据导入、查询处理和数据导出等。 可以帮助用户评估Hive查询的性能,并优化Hive的配置和查询语句,以提升数据仓库的性能。

3、 Apache JMeter

         Apache JMeter是一个用于性能测试的开源工具,通常用于测试Web应用程序的性能,但也可以用于测试数据仓库系统的性能。 JMeter可以模拟多个并发用户对数据仓库系统进行查询和操作,从而评估系统在不同负载下的性能表现。 JMeter灵活性强,支持多种协议和数据格式,可以进行定制化的测试场景设置,适用于各种数据仓库系统的性能测试需求。


三、测试流程

    基准测试的方式包括了微基准测试、宏基准测试、介基准测试等多种方法。基准测试有一定格式的流程。以进行数据仓库测试为例,对数据仓库的基准测试方法是一个系统化的过程,旨在评估数据仓库在不同负载条件下的性能和可扩展性。以下是以测试数据仓库为例进行基准测试的一般方法:

     

1、 确定测试目标:

        在开始基准测试之前,首先需要明确测试的目标和要求。测试目标的不同影响后续评估的性能指标、测试数据集的规模和复杂性,以及测试的时间范围等的选择。

2、 设计数据集:

        根据实际业务需求和数据特征,设计代表性的数据集。数据集应该包含各种数据类型、大小和复杂度,以确保测试覆盖了不同的使用情况和查询模式。这些数据集通常模拟真实世界的数据,以确保测试有效性。

 3、创建工作负载:

        设计和创建代表性的工作负载,模拟真实世界的数据访问模式和业务场景。以数据仓库为例工作负载应该包括数据加载、查询、报表生成、ETL过程等操作,并且需要考虑到并发用户数、查询复杂度、数据分布等因素。

 4、选择测试工具:

        根据测试需求的特点,选择合适的基准测试工具。常用的工具包括TPC Benchmark工具(如TPC-DS、TPC-H)、自定义脚本和查询生成工具等。

5、 配置测试环境

        配置测试环境,包括硬件设施、软件环境和网络设置等。确保测试环境的稳定性和一致性,以便准确比较不同测试结果。

 6、执行基准测试:

        使用选择的测试工具和设计好的工作负载,在配置好的测试环境中执行基准测试。对于数据仓库而言,我们要记录每个测试运行的详细信息,包括执行时间、资源利用率、查询响应时间等。

 7、分析和评估结果

        对测试结果进行分析和评估,比较不同测试运行之间的性能指标和度量指标。识别性能瓶颈和潜在问题,并提出改进建议。

8、优化和调整

        根据测试结果和分析,进行数据仓库的优化和调整。这可能涉及到硬件升级、软件配置调整、索引优化等方面的工作。


 四、测试实例

Java 官方提供了一个基准测试工具 JMH(Java Microbenchmark Harness),我们可以用它测试

  1. 一段代码平均执行多长时间
  2. 对比不同实现的性能

我在网上找到了一个微基准测试工程在这里分享

最为便捷的是使用 Maven 创建项目:

mvn archetype:generate \
          -DinteractiveMode=false \
          -DarchetypeGroupId=org.openjdk.jmh \
          -DarchetypeArtifactId=jmh-java-benchmark-archetype \
          -DgroupId=com.technologiesinsight.jmh \
          -DartifactId=jmh-demo \
          -Dversion=1.0

构建完成后,会发现一个文件夹 jmh-demo。这是一个标准的 maven 工程,会有一个默认的测试类:MyBenchmark,位于 com.technologiesinsight.jmh 包下,也就是上面命令的 -DgroupId 填写的包名。测试类内容如下: 

package com.technologiesinsight.jmh;

import org.openjdk.jmh.annotations.Benchmark;

public class MyBenchmark {

    @Benchmark
    public void testMethod() {
        // This is a demo/sample template for building your JMH benchmarks. Edit as needed.
        // Put your benchmark code here.
    }
}

其中,我们可以在 testMethod 填写基准测试代码。

这里以声明一个字符串举例

import org.openjdk.jmh.annotations.Benchmark;

/***
 *
 * Benchmark                Mode  Cnt          Score         Error  Units
 * MyBenchmark.testMethod  thrpt   25  217365928.196 ± 6111510.557  ops/s
 *
 */
public class MyBenchmark {
    @Benchmark
    public String testMethod() {
        return  "hello world";
    }

}

接下来就可以运行了,进入项目目录,执行 mvn clean package 打包,执行 java -jar target/benchmarks.jar 运行,控制台会出现类似如下信息:

// 第一部分开始
# JMH version: 1.21
# VM version: JDK 1.8.0_201, Java HotSpot(TM) 64-Bit Server VM, 25.201-b09
# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/bin/java
# VM options: -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.technologiesinsight.jmh.MyBenchmark.testMethod

// 第二部分开始
# Run progress: 0.00% complete, ETA 00:08:20
# Fork: 1 of 5
# Warmup Iteration   1: 188758589.759 ops/s
# Warmup Iteration   2: 187065201.979 ops/s
# Warmup Iteration   3: 206670810.488 ops/s
# Warmup Iteration   4: 211958028.465 ops/s
# Warmup Iteration   5: 224040261.103 ops/s
Iteration   1: 224379265.753 ops/s
Iteration   2: 208679880.245 ops/s
Iteration   3: 206755976.374 ops/s
Iteration   4: 214591855.201 ops/s
Iteration   5: 219524929.562 ops/s
// ……此处省略迭代信息

// 第三部分开始
Result "com.technologiesinsight.jmh.MyBenchmark.testMethod":
  217365928.196 ±(99.9%) 6111510.557 ops/s [Average]
  (min, avg, max) = (204122743.394, 217365928.196, 233217556.736), stdev = 8158691.742
  CI (99.9%): [211254417.640, 223477438.753] (assumes normal distribution)


# Run complete. Total time: 00:08:22

REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.

Benchmark                Mode  Cnt          Score         Error  Units
MyBenchmark.testMethod  thrpt   25  217365928.196 ± 6111510.557  ops/s

输出信息可以分为三部分,使用 // 标注。第一部分是执行的环境、参数信息。第二分每次迭代的详情,第三部分是基准测试的结果。

我们着重看最后报告部分:

1
2
Benchmark                Mode  Cnt          Score         Error  Units
MyBenchmark.testMethod  thrpt   25  217365928.196 ± 6111510.557  ops/s

 下面是我在网上看到的另一个测试实例,也值得学习

如何做Benchmark(基准测试) - 知乎 (zhihu.com)

在机器学习方面我以我在寒假看的一篇机器学习领域的处理时间序列论文为例子,在论文中也对这个模型进行了benchmark测试。

这篇文章提出了一个预测MTS的深度模型crossformer,进行的测试目标毫无疑问是这个模型。

测试的数据集是现实世界上的数据。包括电力变压器两年的7项指标、气侯方面包括能见度、风速、交通的12个指标、交通方面每小时的道路占用率和流感疾病等方面。

然后,选择多个基准模型包括LSTMa、Transformer、Informer等,这些模型可能是以前在该任务上表现良好的模型

​        模型在这些Benchmark数据集上进行测试,并记录各种性能指标,如MSE/MAE等。这样,我们可以比较不同方法在相同数据集上的表现,确定哪个算法在这个特定任务上表现最佳。

上面的表格便是测试结果。通过这个表格我们可以看出,文章中提出的crossformer模型在性能方面对比其他的基准模型有较大的提升。

在最后进行超参数检验。对不同方法的超参数进行调整,以确保它们在最佳条件下运行,从而获得最佳性能。这有助于确定哪种方法对特定任务最有效。


五、SOTA,benchmark和baseline区别

这几个是我接触过的比较类似的概念

SOTA是state of art的缩写,指某特定时间背景下的最高水准。

benchmark通常指的是一个(标准的)衡量规定或是评估标准。具体的可以理解成,在某个标准的数据集上用某种规定的方式(进行实验)并且用某几个指标来衡量算法的性能,这样规定被称为benchmark。由于benchmark的标准化还是一个正在进行的过程,所以benchmark通常也可以粗略的理解成某个标准的数据集。

baseline指的是一个基准,也叫基线,简单来说就是用来对比的一个参照对象,人们往往通过用和baseline比较性能的方式来凸出自己新提出的算法的优势。在机器学习领域,baseline通常是一个广为人知的算法,可以是最基础同时性能又不错的算法,也可以是最先进、性能最好的算法(SOTA)。例如,著名的围棋程序AlphaGo所使用的baseline便是人类最强的围棋选手。

六、参考资料

  1. 维基百科中对于基准测试的定义 https://en.wikipedia.org/wiki/Benchmark_(computing) 

2、基准测试 (Benchmark) 入门篇 | 科技洞见 - 技术练达即文章 (technologiesinsight.com)icon-default.png?t=N7T8https://technologiesinsight.com/posts/9ee5/

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值