GPU压力测试篇- TensorFlow

2023-11-15

简介

该文档介绍使用Tensorflow框架,测试 NVIDIA 驱动的常见python 代码。

环境信息

编号

软件

软件版本

备注

01

驱动

470.57.02

02

cuda 版本

11.2

03

cudnn 版本

8.1.1.33

04

tensorflow

2.6

功能测试代码:

import tensorflow as tf
with tf.device('/CPU:1'):
  a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

c = tf.matmul(a, b)
print(c)

GPU 压力测试代码:

# On Titan X (Pascal)
# 8192 x 8192 matmul took: 0.10 sec, 11304.59 G ops/sec
# http://stackoverflow.com/questions/41804380/testing-gpu-with-tensorflow-matrix-multiplication

import os
import sys
import tensorflow as tf
import time
import timeit
import datetime

n=1000000000 #10亿次
dtype = tf.float32
with tf.device("/gpu:0"):
    matrix1 = tf.Variable(tf.ones((1, n), dtype=dtype))
    matrix2 = tf.Variable(tf.ones((n, 1), dtype=dtype))


def gpu_run():
    with tf.device("/gpu:0"):
        product = tf.matmul(matrix1, matrix2)
    return product

print("开始计算:", time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
gpu_time = timeit.timeit(gpu_run, number=1000)
print("计算结束:", time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))

CPU/GPU 压测比较代码:

# 屏蔽tensorflow输出的log信息
# 注意:代码在import tensorflow之前
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"

import sys
print("python的版本信息:",sys.version)
#python的版本信息: 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)]

import tensorflow as tf

'''
验证GPU相对于CPU,在并行计算优势明显
'''
n=100000000 #1亿次

# 创建在 CPU 环境上运算的 2 个矩阵
with tf.device('/cpu:0'):
    cpu_a = tf.random.normal([1, n])
    cpu_b = tf.random.normal([n, 1])
    print(cpu_a.device, cpu_b.device)

# 创建使用 GPU 环境运算的 2 个矩阵
with tf.device('/gpu:0'):
    gpu_a = tf.random.normal([1, n])
    gpu_b = tf.random.normal([n, 1])
    print(gpu_a.device, gpu_b.device)

import timeit

def cpu_run(): # CPU 运算函数
    with tf.device('/cpu:0'):
        c = tf.matmul(cpu_a, cpu_b)
    return c

def gpu_run():# GPU 运算函数
    with tf.device('/gpu:0'):
        c = tf.matmul(gpu_a, gpu_b)
    return c

# 第一次计算需要热身,避免将初始化时间结算在内
cpu_time = timeit.timeit(cpu_run, number=100)
gpu_time = timeit.timeit(gpu_run, number=100)
print('首先计算10次(含热身环境)的平均时间,CPU计算消耗时间:%.3fms,GPU计算消耗时间:%.3fms!'%(cpu_time*1000, gpu_time*1000) )

#正式计算10次,取平均时间
cpu1_time = timeit.timeit(cpu_run, number=10)
gpu1_time = timeit.timeit(gpu_run, number=10)

print('正式计算10次的平均时间,CPU计算消耗时间:%.3fms,GPU计算消耗时间:%.3fms!'%(cpu1_time*1000, gpu1_time*1000))

压测

编号

先卡类型

显卡架构

计算时间

cuda 版本

TF版本

算力使用率

备注

01

P40-22G

帕斯卡

17秒

10.1

2.3

100%

x86_64

02

T4-16G

图灵

15秒

11.2

2.6

100%

x86_64

03

V100-32G

沃尔塔

7秒

10.1

2.3

100%

x86_64

04

A10-24G

安培

10秒

11.2

2.6

100%

x86_64

05

A100-40G

安培

6秒

11.2

2.6

100%

x86_64

1. 背景目的

对现有gpu的性能没有相关的测试,需要进行摸底测试

预期测试目的:

  • 完成gpu对训练及预测服务的性能测试

  • 对现场部署及使用提供支持

2. 测试环境

OS:Centos7
Linux kernel:Linux 3.10.0-1160.90.1.el7.x86_64
Docker Version:1.13.1
Docker Image:nvcr.io/nvidia/tensorflow:23.03-tf1-py3 (V1.15版本)

Docker OS:Ubuntu 20.04.5 LTS
Nvidia GPU Version:NVIDIA-SMI 470.161.03
CUDA Version: 12.1
TensorFlow Version:1.15.1
python Version:3.8.10

3. 测试方案

3.1、训练性能测试方案

  • 训练文件来源:GitHub - tensorflow/benchmarks: A benchmark framework for Tensorflow

  • 训练模型:resnet50

  • 训练数据集:全量imagenet数据,总大小约150G,图片张数超过1400w

  • 测试步骤:

    • 将全量的已转换为tfrecord格式的imagenet数据上传至存储卷下

    • 创建3个notebook任务,资源配置如下:

CPU

GPU

memory

6

0.5

20G

6

1

20G

12

2

40G

  • 上传tf_cnn_benchmark代码
  • 运行测试指令:python tf_cnn_benchmarks.py --model=resnet50 --num_gpus=${NUM_GPUS} --batch_size=32 --variable_update=parameter_server --data_dir=${DATA_DIR} --num_epochs=2

${DATA_DIR}为训练数据集文件train目录的路径
${NUM_GPUS}为当前notebook任务申请的GPU数量

2. 预测性能测试方案:

  • 预测服务模型:TensorFlow-Resnet50 v1,SavedModel格式

  • 模型来源:https://tfhub.dev/tensorflow/resnet_50/classification/1

  • 发压工具:

    • 下载

    • 说明:封装locust的性能测试工具,支持模型预测的性能测试。

  • 测试步骤:

    • 模型中心导入TensorFlow-Resnet50

    • 创建模型对应服务,资源配置如下:

CPU

GPU

MEMORY

4

0.5

8G

4

1

8G

8

2

16G

  • 创建相关应用
    • 利用发压工具对服务接口持续发压,观察压力测试结果及压测期间gpu显存使用情况及gpu使用率

一、GPU性能测试数据报告如下

1 需求背景

使用性能评估对服务终端进行压力测试,评估服务端性能,有助于定位性能瓶颈。

由于全量版本过多,高优测试一轮每个框架的最新版本,模型性能。

2. 测试方案

2.1 模型预测配置

  1. 每个副本 默认资源配置

    1. 副本数:1

    2. CPU:4

    3. 内存:8GB / 8192MB

    4. GPU:

      1. 仅用CPU的模型预测:0

      2. 依赖GPU(或必须使用GPU才能发挥性能的模型预测 :TensorFlow、Pytorch、Paddle):1

    5. GPU类型:Tesla-T4

注意

当测试时,发现服务的资源配置成为性能瓶颈时,应适当改大资源,否则无法测试出最大的性能数据。

2.2 模型选择

模型类型

镜像名称:镜像tag

是否使用GPU

模型类型

其他说明

Sklearn-v0.20

infsms-sklearn0.20.2

e0828eb1d118

modelserver

-

GBDT-v1.2.0

infsms-xgboost1.2.0

d09b82ae7baa

modelserver

服务需要设置环境变量:

OMP_NUM_THREADS:1

(NUM_WORKERS建议设置,本次测试没有设置此参数)

H2O-v3.26.0.5

infsms-h2o3.26.0.5

929fa6a953d1

modelserver

-

R-3.5.2

infsms-r3.5.2

64ff114623cb

modelserver

多并发请求成功率全部低于30

PMML

infsms-pmml0.9.11

d0276f6c47d9

modelserver

多并发请求成功率全部低于50

TensorFlow-v2.6.0

infsms-tensorflow2.6.0-cuda11.2-cudnn8

e88ef44c5251

modelserver

-

paddle-2.1

infsms-paddle2.1.0-cuda10.1-cudnn7

683ef1373304

modelserver

-

PyTorch-v1.10.1

infsms-pytorch1.10.0-cuda10.2-cudnn7

8812b855b620

modelserver

-

OONX-1.8

infsms-onnx1.3.0-cuda10.1-cudnn7

9840c6d7a900

modelserver

模型起预测onnx框架image信息匹配的不对

2.3 性能指标说明

  1. 最大并发:长时间压测下,预测服务能承受的稳定无异常的最大并发数。

  2. 最大TPS:长时间压测下,预测服务能达到的最大TPS

  3. 资源使用率:

    1. 包括CPU使用率、GPU算力平均使用率、GPU显存平均使用率、内存使用率

    2. 来自前端页面 用户可见的副本监控数据(获取自性能评估报告、 Prometheus监控数据)

    3. 仅列出压测过程中 采样到的最大占用率

3 模型预测性能

3.1 GBDT-v1.2.0模型预测

性能指标

pod性能数据

1个并发

中间数据

最大并发

中间数据

中间数据

中间数据

中间数据

单副本资源数

4/0/8G

4/0/8G

4/0/8G

4/0/8G

4/0/8G

4/0/8G

4/0/8G

Users(并发数)

1

30

50

100

300

500

1000

递增速率(VU/s)

1

2

5

10

20

35

66

发压时间

30min

30min

30min

30min

30min

30min

30min

发送请求数

537930

1406038

1408861

1405880

814857

822581

873953

req/s(QPS)

299.02

782.87

784.44

782.78

452.95

457.24

485.8

failures(整体失败率)

0

0

0

0

0.68%

1.64%

3.61%

failures/s

0

0

0

0

3.08

7.49

17.5

响应时间(最大)

75

77

119

1311

91852

91792

92606

响应时间(最小)

2

2

2

6

5

8

18

响应时间(中位数)

3

38

63

130

140

140

140

响应时间(平均值)

2.97

37.62

64.03

126.88

664.91

1184.59

2365.61

响应时间 latency 95%

3

40

67

130

270

290

3400

响应时间 latency 99%

4

42

69

140

7200

59000

61000

CPU使用率

20%

53%

53.06%

53.12%

46%->32%

40%->34%

35%

内存使用率

2.34%

2.34%

2.35%

2.37%

2.46%

2.65%

3.19%

分析说明:
  1. 最大并发为100

  2. 30min发压时间的平均QPS 最大是784.44左右

  3. 并发达到50后,QPS基本稳定,超过100并发时,开始出现报错:报错基本集中在发压后几分钟内,几分钟后请求成功率逐步上升,趋势图如下

3.2 Sklearn-v0.20 模型预测

性能指标

pod性能数据

1个并发

中间数据

最大并发

中间数据

单副本资源数

4/0/8G

4/0/8G

4/0/8G

4/0/8G

Users(并发数)

1

50

100

300

递增速率(VU/s)

1

5

10

20

发压时间

30min

30min

30min

30min

发送请求数

450442

1255059

1260003

690064

req/s(TPS)

250.38

697.64

700.39

383.58

failures(整体失败率)

0

0

0

0.86%

failures/s

0

0

0

3.29

响应时间(最大)

1046

1078

1343

91855

响应时间(最小)

2

3

5

15

响应时间(中位数)

3

70

140

150

响应时间(平均值)

3.07

70.3

141.36

772.63

响应时间 latency 95%

3

77

160

1100

响应时间 latency 99%

5

83

160

12000

CPU使用率

19%

54.27%

54.33%

54%->34%

内存使用率

1.95%

2%

2.02%

2.15%

分析说明
  1. 最大并发为200

  2. 30min发压时间的平均TPS 最大是700.39左右

  3. 并发达到100后,TPS 基本稳定,超过100并发时,开始出现报错。

3.3 H2O-V3.26.5模型预测

性能指标

pod性能数据

1个并发

最大并发

中间数据

中间数据

中间数据

中间数据

单副本资源数

4/0/8G

4/0/8G

4/0/8G

4/0/8G

4/0/8G

4/0/8G

Users(并发数)

1

50

100

300

500

1000

递增速率(VU/s)

1

5

10

20

35

66

发压时间

30min

30min

30min

30min

30min

30min

发送请求数

29799

28356

10579

11883

18374

36941

req/s(TPS)

16.59

15.79

5.9

6.62

10.24

20.59

failures(整体失败率)

0

0

0.59

66.66

75.15

99.91

响应时间(最大)

1671

6552

61043

92294

92502

61352.15

响应时间(最小)

33

102

1963

21743

21946

26621

响应时间(中位数)

57

3100

8300

60000

60000

61000

响应时间(平均值)

59.57

3166

17643

55670

61223.9

61352.15

响应时间 latency 95%

80

3900

38000

67000

78000

85000

响应时间 latency 99%

94

4800

58000

92000

92000

92000

CPU使用率

50%

76.43%

91.5%

92.5%

94.14%

94.56%

内存使用率

20%

33.34%

35.09%

35.62%

36.14%

37.18%

分析说明
  1. 最大并发为50

  2. 30min发压时间的平均TPS 最大是16.59左右

  3. 并发超过50时,开始出现报错。

3.4 Paddle-v2.1模型预测

性能指标

pod性能数据

1个并发

最大并发

中间数据

中间数据

中间数据

中间数据

单副本资源数

4/1/8G

4/1/8G

4/1/8G

4/1/8G

4/1/8G

4/1/8G

Users(并发数)

1

50

100

300

500

1000

递增速率(VU/s)

1

5

10

20

35

66

发压时间

30min

30min

30min

30min

30min

30min

发送请求数

20305

50549

50534

46758

57051

81977

req/s(TPS)

11.29

28.1

28.14

26.03

31.77

45.64

failures(整体失败率)

0

0

0.37

16.19

31.11

51.93

响应时间(最大)

1366

3977

62301

92458

91758

109176

响应时间(最小)

33

147

531

101

59

1

响应时间(中位数)

83

1800

3500

3600

4700

7500

响应时间(平均值)

79.65

1768.93

3592.37

12314.43

17432.58

26336.36

响应时间 latency 95%

87

1800

3600

60000

60000

61000

响应时间 latency 99%

90

1800

3600

67000

68000

68000

CPU使用率

11.73

26.80

26.42

26.42

26.34

23.13

内存使用率

21.39

21.42

21.46

21.60

22.11

22.79

AI加速卡算力平均使用率

21.30

16.64

后期是0

17.22

中途有使用率为0的一段

72.27

59.12

58.96

AI加速卡显存平均使用率

5.94

5.94

5.94

5.94

5.94

5.94

分析说明
  1. 最大并发为50

  2. 30min发压时间的平均TPS 最大是28.1左右

  3. 并发超过50时,开始出现报错。 加速卡算力平均使用率存在0的情况。

3.5 Tensorflow-v2.6模型预测

性能指标

pod性能数据

1个并发

中间数据

最大并发

中间数据

中间数据

中间数据

单副本资源数

4/1/8G

4/1/8G

4/1/8G

4/1/8G

4/1/8G

4/1/8G

Users(并发数)

1

50

100

300

500

1000

递增速率(VU/s)

1

5

10

20

35

66

发压时间

30min

30min

30min

30min

30min

30min

发送请求数

20992

78283

76802

65464

78072

103178

req/s(TPS)

11.67

43.51

42.76

36.45

43.4

57.35

failures(整体失败率)

0

0

0

11.94

21.95

41.15

响应时间(最大)

1892

2224

63084

92619

92785

91528

响应时间(最小)

36

78

153

872

1004

1

响应时间(中位数)

86

1100

2300

2900

2900

3700

响应时间(平均值)

76.74

1139.09

2344.31

8678.17

13413.85

20421.58

响应时间 latency 95%

90

1300

2500

60000

60000

60000

响应时间 latency 99%

92

1300

2600

61000

61000

61000

CPU使用率

14.16

53.05

53.08

53.04

42.71

42.73

内存使用率

29.98

30.34

30.49

30.83

31.32

32.01

AI加速卡显存平均使用率

96.44

96.44

96.44

96.44

96.44

96.44

AI加速卡算力平均使用率

32.58

120.36

120.47

136.48

119.38

134.65

分析说明
  1. 最大并发为100

  2. 30min发压时间的平均QPS 最大是42.76左右

  3. 并发超过100时,开始出现报错。

  4. 并发超过100时,加速卡算力平均使用率存在一直为96.44的情况。.

  5. 并发超过50时,AI加速卡算力平均使用率超过100%。

3.6 Pytorch-v1.10模型预测

性能指标

pod性能数据

1个并发

最大并发

中间数据

中间数据

中间数据

中间数据

单副本资源数

4/1/8G

4/1/8G

4/1/8G

4/1/8G

4/1/8G

4/1/8G

Users(并发数)

1

50

100

300

500

1000

递增速率(VU/s)

1

5

10

20

35

66

发压时间

30min

30min

30min

30min

30min

30min

发送请求数

19985

50643

49420

47723

55325

83476

req/s(TPS)

11.11

28.15

27.52

26.57

30.8

46.48

failures(整体失败率)

0

0

0.16

15.29

30.06

51.07

响应时间(最大)

123

3926

54769

92485

92408

91646

响应时间(最小)

34

165

599

228

1006

2

响应时间(中位数)

83

1800

3600

3700

6200

7300

响应时间(平均值)

81.1

1766.19

3656.31

12284.4

18043.53

24809.95

响应时间 latency 95%

87

1800

3600

60000

60000

60000

响应时间 latency 99%

89

1800

3700

67000

66000

61000

CPU使用率

11.92

26.84

26.73

23.50

24.78

22.76

AI加速卡显存平均使用率

8.87

8.87

8.87

8.87

8.87

8.87

AI加速卡算力平均使用率

6.4

出现为0情况

11

出现为0情况

30

出现为0情况

70

60

64.9

内存使用率

32.72

35.72

32.80

33.15

33.56

34.38

分析说明
  1. 最大并发为50

  2. 30min发压时间的平均TPS 最大是28.15左右

  3. 并发超过50时,开始出现报错

  4. 加速卡算力平均使用率存在一直为8.87的情况

  5. 并发小于300时,AI加速卡算力平均使用率出现为0时间段

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPU压力测试篇- TensorFlow 的相关文章

  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 在 Tensorflow tf.nn.nce_loss 中出现 TypeError:'Mul' Op 的输入 'y' 的类型为 float32,与参数 'x' 的 int32 类型不匹配

    我正在研究 Tensor Flow 中的 Bag of Words 实现 并得到了 类型错误 Mul Op 的输入 y 的类型为 float32 与参数 x 的 int32 类型不匹配 在 tf nn nce loss 中 我尝试查看 tf
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助
  • 如何通过在 Python 3.x 上按键来启动和中断循环

    我有这段代码 当按下 P 键时会中断循环 但除非我按下非 P 键 否则循环不会工作 def main openGame while True purchase imageGrab if a sum gt 1200 fleaButton ti
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • 在 pytube3 中获取 youtube 视频的标题?

    我正在尝试构建一个应用程序来使用 python 下载 YouTube 视频pytube3 但我无法检索视频的标题 这是我的代码 from pytube import YouTube yt YouTube link print yt titl
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • Python 将日志滚动到变量

    我有一个使用多线程并在服务器后台运行的应用程序 为了无需登录服务器即可监控应用程序 我决定包括Bottle http bottlepy org为了响应一些HTTP端点并报告状态 执行远程关闭等 我还想添加一种查阅日志文件的方法 我可以使用以
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 如何读取Python字节码?

    我很难理解 Python 的字节码及其dis module import dis def func x 1 dis dis func 上述代码在解释器中输入时会产生以下输出 0 LOAD CONST 1 1 3 STORE FAST 0 x
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f

随机推荐

  • 依托 axios 实现全局请求防抖

    更新 该方法已过时 此 API 自 v0 22 0 起已弃用 传送门 新的代替方案是 AbortController 并且 前端取消请求无法真实取消 原因在于请求发送到服务器后服务器或许已经做了处理 但是前端只是关闭了返回通道 可是实际上服
  • wr720n刷成网络打印_OPENWRT for TP-LINK TL-WR720N 4M-8M固件,含NAS、3G、Printer,支持3070和8187网卡 20120906 - V2EX...

    还记得好久以前很多朋友团购的WR720N吗 一直等着OPENWRT出patch好让703N的固件能支持720N的硬件开关 很遗憾到现在还没有 今天看到antclan修改的固件 觉得基本上可以刷了 转贴来自 http www right co
  • 基于javaweb+mysql的情缘图书馆管理系统(java+SSM+Tomcat+Maven+mysql)

    基于SSM的情缘图书馆管理系统 SSM框架 适合java初学者 主要功能包括 图书编目管理 图书编目 编目维护 图书信息管理 图书录入 图书信息 图书借阅管理 借阅图书 借阅信息 归还 续借 读者管理 办证 读者信息 读者类别 证件操作 系
  • top k算法讲解

    在实际工作中 我们时常会有寻找长度为n的数组中 排在前k的元素 对于top k的问题 最暴力的处理方式就是直接对数组进行排序 然后再去截取前k个数字 从而达到自己的目的 这种算法的实现复杂度为O nlogn 其实有O n 的算法或者是O n
  • UML常用图的几种关系的总结

    在UML的类图中 常见的有以下几种关系 泛化 Generalization 实现 Realization 关联 Association 聚合 Aggregation 组合 Composition 依赖 Dependency 1 泛化 Gen
  • OpenCV_基于Laplacian算子的图像边缘增强

    Refer from http blog csdn net icvpr article details 8502949 下面代码实现了基于Laplacian算子的图像边缘增强 算法 边缘增强图像 源图像 边缘图像 cpp view plai
  • RFID酒店布草洗涤管理系统应用

    1 行业背景 布草作为酒店服务商领域的传统产业 一直是围绕着酒店业的发展而逐步发展起来的 无论是星级酒店 还是经济连锁酒店 布草都是不可或缺的重要物料 各式酒店都面临着成千上万件布草的交接 洗涤 熨烫 整理 储藏等工序 如何有效地完成洗涤布
  • 2022电赛E题(不使用K210)软硬件方案

    请各位客观移步小黄鱼搜索DreamChuan用户 拍下链接即可获取全部软硬件方案哦 物美价廉 2022电赛E题声源定位 不使用K210相关软硬件 使用MAX9814麦克风加stm32F103ZET6加28BYJ48步进电机方案 部分代码开源
  • log4j 配置文件详解

    log4j logger stdout debug 灵活设置日志格式 log4j appender stdout layout org apache log4j PatternLayout 文件 log4j appender stdout
  • 阅读-MTCNN

    原始数据 人脸数据集WIDER FACE 该数据集仅提供了大量的人脸边框定位数据 如果使用wider face的 wider face train mat 注解文件需要转换成txt格式的 我这里用h5py写了个 转换脚本 这里我提供一个已经
  • Python实现输入电影名字自动生成豆瓣评论词云图(带GUI界面)小程序

    Python实现输入电影名字自动生成豆瓣评论词云图 带GUI界面 小程序 一 项目背景 电影逐渐成为人们生活的不可或缺的一部分 而了解一部电影的可以通过电影评分与大众推荐度 但以上的方式都太过于片面 了解一部电影的方法是通过已经观看完电影的
  • Windows CE嵌入式导航系统研究(应用程序相关)

    1 1 1 TCPMP多媒体播放器 本系统中采用的多媒体播放器是TCPMP TCPMP播放器播放速度很快且支持多达几十中多媒体格式 TCPMP开源项目 同时支持Windows CE操作系统 而且提供很好的扩展性 例如需要重新编写TCPMP界
  • 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。

    258 各位相加 难度简单475 给定一个非负整数 num 反复将各个位上的数字相加 直到结果为一位数 返回这个结果 示例 1 输入 num 38 输出 2 解释 各位相加的过程为 38 gt 3 8 gt 11 11 gt 1 1 gt
  • 大文件上传服务器jvm调优,JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减小GC的频率和Full GC的次数 算法 1 Full GC编程 会对整个堆进行整理 包括Young Tenured和Perm Full GC由于须要对整个堆进行回收 因此比较慢 所以
  • 【Flutter 2-11】Flutter手把手教程UI布局和Widget——列表ListView

    作者 弗拉德 来源 弗拉德 公众号 fulade me ListView ListView是在移动端非常常见的控件 在大多数的展示场景中都离不开ListView 在Flutter中对ListView的封装也非常好 简单几行代码就可以满足我们
  • 马尔萨斯 ( Malthus)人口指数增长模型&Logistic 模型

    3 要求与任务 从 1790 1990 年间美国每隔 10 年的人口记录如下表所示 用以上数据检验马尔萨斯 Malthus 人口指数增长模型 根据检验结果进一步讨论马尔萨斯 人口模型的改进 并利用至少两种模型来预测美国2010 年的人口数量
  • wandb安装方法及本地部署教程

    文章目录 1 wandb介绍 2 wandb安装 2 1 注册wandb账号 2 2 创建项目并获得密钥 2 3 安装wandb并登录 3 wandb本地部署 3 1 设置wandb运行模式 3 2 云端查看运行数据 4 总结 1 wand
  • 游戏开发unity编辑器扩展知识系列:扩展Hierarchy右键菜单

    代码如下 MenuItem GameObject 生成带图片的Image false 100 public void Test 效果如下 注意 MenuItem的priority参数必须小于50 MenuItem的itemName参数只支持
  • Postman和jmeter的区别(整理)

    1 创建接口用例集 没区别 Postman是Collections Jmeter是线程组 没什么区别 2 步骤的实现 有区别 Postman和jmeter都是创建http请求 a postman请求的请求URL是一个整体 jmeter分成了
  • GPU压力测试篇- TensorFlow

    简介 该文档介绍使用Tensorflow框架 测试 NVIDIA 驱动的常见python 代码 环境信息 编号 软件 软件版本 备注 01 驱动 470 57 02 02 cuda 版本 11 2 03 cudnn 版本 8 1 1 33