在 MindSpore 中 dataset_sink_mode 的设置对算法的性能有多少影响呢???
参考代码:
https://www.cnblogs.com/devilmaycry812839668/p/14971668.html
dataset_sink_mode=True 时,我们可以理解是把数据进行部分的缓存到计算设备上,那么dataset_sink_mode为False和True时对性能影响大吗???
实际代码:
dataset_sink_mode=False 时:


- #!/usr/bin python
- # encoding:UTF-8
- """" 对输入的超参数进行处理 """
- import os
- import argparse
- """ 设置运行的背景context """
- from mindspore import context
- """ 对数据集进行预处理 """
- import mindspore.dataset as ds
- import mindspore.dataset.transforms.c_transforms as C
- import mindspore.dataset.vision.c_transforms as CV
- from mindspore.dataset.vision import Inter
- from mindspore import dtype as mstype
- """ 构建神经网络 """
- import mindspore.nn as nn
- from mindspore.common.initializer import Normal
- """ 训练时对模型参数的保存 """
- from mindspore.train.callback import ModelCheckpoint, CheckpointConfig
- """ 导入模型训练需要的库 """
- from mindspore.nn import Accuracy
- from mindspore.train.callback import LossMonitor
- from mindspore import Model
- parser = argparse.ArgumentParser(description='MindSpore LeNet Example')
- parser.add_argument('--device_target', type=str, default="CPU", choices=['Ascend', 'GPU', 'CPU'])
- args = parser.parse_known_args()[0]
- # 为mindspore设置运行背景context
- context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target)
- def create_dataset(data_path, batch_size=32, repeat_size=1,
- num_parallel_workers=1):
- # 定义数据集
- mnist_ds = ds.MnistDataset(data_path)
- resize_height, resize_width = 32, 32
- rescale = 1.0 / 255.0
- shift = 0.0
- rescale_nml = 1 / 0.3081
- shift_nml = -1 * 0.1307 / 0.3081
- # 定义所需要操作的map映射
- resize_op = CV.Resize((resize_height, resize_width), interpolation=Inter.LINEAR)
- rescale_nml_op = CV.Rescale(rescale_nml, shift_nml)
- rescale_op = CV.Rescale(rescale, shift)
- hwc2chw_op = CV.HWC2CHW()
- type_cast_op = C.TypeCast(mstype.int32)
- # 使用map映射函数,将数据操作应用到数据集
- mnist_ds = mnist_ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=resize_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=rescale_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=rescale_nml_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=hwc2chw_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- # 进行shuffle、batch、repeat操作
- buffer_size = 10000
- mnist_ds = mnist_ds.shuffle(buffer_size=buffer_size)
- mnist_ds = mnist_ds.batch(batch_size, drop_remainder=True)
- mnist_ds = mnist_ds.repeat(repeat_size)
- return mnist_ds
- class LeNet5(nn.Cell):
- """
- Lenet网络结构
- """
- def __init__(self, num_class=10, num_channel=1):
- super(LeNet5, self).__init__()
- # 定义所需要的运算
- self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')
- self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')
- self.fc1 = nn.Dense(16 * 5 * 5, 120, weight_init=Normal(0.02))
- self.fc2 = nn.Dense(120, 84, weight_init=Normal(0.02))
- self.fc3 = nn.Dense(84, num_class, weight_init=Normal(0.02))
- self.relu = nn.ReLU()
- self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
- self.flatten = nn.Flatten()
- def construct(self, x):
- # 使用定义好的运算构建前向网络
- x = self.conv1(x)
- x = self.relu(x)
- x = self.max_pool2d(x)
- x = self.conv2(x)
- x = self.relu(x)
- x = self.max_pool2d(x)
- x = self.flatten(x)
- x = self.fc1(x)
- x = self.relu(x)
- x = self.fc2(x)
- x = self.relu(x)
- x = self.fc3(x)
- return x
- # 实例化网络
- net = LeNet5()
- # 定义损失函数
- net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
- # 定义优化器
- net_opt = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.9)
- # 设置模型保存参数
- # 每125steps保存一次模型参数,最多保留15个文件
- config_ck = CheckpointConfig(save_checkpoint_steps=125, keep_checkpoint_max=15)
- # 应用模型保存参数
- ckpoint = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)
- def train_net(args, model, epoch_size, data_path, repeat_size, ckpoint_cb, sink_mode):
- """定义训练的方法"""
- # 加载训练数据集
- ds_train = create_dataset(os.path.join(data_path, "train"), 32, repeat_size)
- model.train(epoch_size, ds_train, callbacks=[LossMonitor(1875)], dataset_sink_mode=sink_mode)
- def test_net(network, model, data_path):
- """定义验证的方法"""
- ds_eval = create_dataset(os.path.join(data_path, "test"))
- acc = model.eval(ds_eval, dataset_sink_mode=False)
- print("{}".format(acc))
- mnist_path = "./datasets/MNIST_Data"
- train_epoch = 10
- dataset_size = 1
- model = Model(net, net_loss, net_opt, metrics={"Accuracy": Accuracy()})
- import time
- a=time.time()
- train_net(args, model, train_epoch, mnist_path, dataset_size, ckpoint, False)
- b=time.time()
- print(b-a)
- #train_net(args, model, train_epoch, mnist_path, dataset_size, ckpoint, True)
- #test_net(net, model, mnist_path)
运行时间:
108.28s
120.17s
119.88s
110.11s
108.42s
平均值:113.37s
dataset_sink_mode=True 时:


- #!/usr/bin python
- # encoding:UTF-8
- """" 对输入的超参数进行处理 """
- import os
- import argparse
- """ 设置运行的背景context """
- from mindspore import context
- """ 对数据集进行预处理 """
- import mindspore.dataset as ds
- import mindspore.dataset.transforms.c_transforms as C
- import mindspore.dataset.vision.c_transforms as CV
- from mindspore.dataset.vision import Inter
- from mindspore import dtype as mstype
- """ 构建神经网络 """
- import mindspore.nn as nn
- from mindspore.common.initializer import Normal
- """ 训练时对模型参数的保存 """
- from mindspore.train.callback import ModelCheckpoint, CheckpointConfig
- """ 导入模型训练需要的库 """
- from mindspore.nn import Accuracy
- from mindspore.train.callback import LossMonitor
- from mindspore import Model
- parser = argparse.ArgumentParser(description='MindSpore LeNet Example')
- parser.add_argument('--device_target', type=str, default="CPU", choices=['Ascend', 'GPU', 'CPU'])
- args = parser.parse_known_args()[0]
- # 为mindspore设置运行背景context
- context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target)
- def create_dataset(data_path, batch_size=32, repeat_size=1,
- num_parallel_workers=1):
- # 定义数据集
- mnist_ds = ds.MnistDataset(data_path)
- resize_height, resize_width = 32, 32
- rescale = 1.0 / 255.0
- shift = 0.0
- rescale_nml = 1 / 0.3081
- shift_nml = -1 * 0.1307 / 0.3081
- # 定义所需要操作的map映射
- resize_op = CV.Resize((resize_height, resize_width), interpolation=Inter.LINEAR)
- rescale_nml_op = CV.Rescale(rescale_nml, shift_nml)
- rescale_op = CV.Rescale(rescale, shift)
- hwc2chw_op = CV.HWC2CHW()
- type_cast_op = C.TypeCast(mstype.int32)
- # 使用map映射函数,将数据操作应用到数据集
- mnist_ds = mnist_ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=resize_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=rescale_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=rescale_nml_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- mnist_ds = mnist_ds.map(operations=hwc2chw_op, input_columns="image", num_parallel_workers=num_parallel_workers)
- # 进行shuffle、batch、repeat操作
- buffer_size = 10000
- mnist_ds = mnist_ds.shuffle(buffer_size=buffer_size)
- mnist_ds = mnist_ds.batch(batch_size, drop_remainder=True)
- mnist_ds = mnist_ds.repeat(repeat_size)
- return mnist_ds
- class LeNet5(nn.Cell):
- """
- Lenet网络结构
- """
- def __init__(self, num_class=10, num_channel=1):
- super(LeNet5, self).__init__()
- # 定义所需要的运算
- self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')
- self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')
- self.fc1 = nn.Dense(16 * 5 * 5, 120, weight_init=Normal(0.02))
- self.fc2 = nn.Dense(120, 84, weight_init=Normal(0.02))
- self.fc3 = nn.Dense(84, num_class, weight_init=Normal(0.02))
- self.relu = nn.ReLU()
- self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
- self.flatten = nn.Flatten()
- def construct(self, x):
- # 使用定义好的运算构建前向网络
- x = self.conv1(x)
- x = self.relu(x)
- x = self.max_pool2d(x)
- x = self.conv2(x)
- x = self.relu(x)
- x = self.max_pool2d(x)
- x = self.flatten(x)
- x = self.fc1(x)
- x = self.relu(x)
- x = self.fc2(x)
- x = self.relu(x)
- x = self.fc3(x)
- return x
- # 实例化网络
- net = LeNet5()
- # 定义损失函数
- net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
- # 定义优化器
- net_opt = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.9)
- # 设置模型保存参数
- # 每125steps保存一次模型参数,最多保留15个文件
- config_ck = CheckpointConfig(save_checkpoint_steps=125, keep_checkpoint_max=15)
- # 应用模型保存参数
- ckpoint = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)
- def train_net(args, model, epoch_size, data_path, repeat_size, ckpoint_cb, sink_mode):
- """定义训练的方法"""
- # 加载训练数据集
- ds_train = create_dataset(os.path.join(data_path, "train"), 32, repeat_size)
- model.train(epoch_size, ds_train, callbacks=[LossMonitor(1875)], dataset_sink_mode=sink_mode)
- def test_net(network, model, data_path):
- """定义验证的方法"""
- ds_eval = create_dataset(os.path.join(data_path, "test"))
- acc = model.eval(ds_eval, dataset_sink_mode=False)
- print("{}".format(acc))
- mnist_path = "./datasets/MNIST_Data"
- train_epoch = 10
- dataset_size = 1
- model = Model(net, net_loss, net_opt, metrics={"Accuracy": Accuracy()})
- import time
- a=time.time()
- train_net(args, model, train_epoch, mnist_path, dataset_size, ckpoint, True)
- b=time.time()
- print(b-a)
- #train_net(args, model, train_epoch, mnist_path, dataset_size, ckpoint, True)
- #test_net(net, model, mnist_path)
运行时间:
108.94s
111.44s
114.04s
112.52s
108.29s
平均值:111.04s
可以看到,dataset_sink_mode=True 确实可以提高一些运算性能,但是看测试的结果也没有太多的提升,所以一般情况下这个dataset_sink_mode设置不太需要考虑,当然如果是实际的生产环境那种情况或许还是有一定区别的。
====================================================
本文实验环境为 MindSpore1.1 docker版本
宿主机:Ubuntu18.04系统
CPU:I7-8700
GPU:1060ti NVIDIA显卡
在 MindSpore 中 dataset_sink_mode 的设置对算法的性能有多少影响呢???的更多相关文章
- 关于网站高性能中磁盘cpu以及内存对网站性能的影响
之前和同事聊天的时候,提到了这个硬件方面(包括内存,cpu,以及硬盘的存储选择),个人认为可以从这几个方面来提高底层硬件的性能,从而提高网站的整体吞吐量和速度. 一.主机: (1).CPU:决定处理的 ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
- Batch Normalization原理及其TensorFlow实现——为了减少深度神经网络中的internal covariate shift,论文中提出了Batch Normalization算法,首先是对”每一层“的输入做一个Batch Normalization 变换
批标准化(Bactch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanish ...
- 回声消除中的LMS和NLMS算法与MATLAB实现
自适应滤波是数字信号处理的核心技术之一,在科学和工业上有着广泛的应用领域.自适应滤波技术应用广泛,包括回波抵消.自适应均衡.自适应噪声抵消和自适应波束形成.回声对消是当今通信系统中普遍存在的现象.声回 ...
- 【Matlab开发】matlab中bar绘图设置与各种距离度量
[Matlab开发]matlab中bar绘图设置与各种距离度量 标签(空格分隔): [Matlab开发] [机器学习] 声明:引用请注明出处http://blog.csdn.net/lg1259156 ...
- vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置
vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...
- 如何基于MindSpore实现万亿级参数模型算法?
摘要:近来,增大模型规模成为了提升模型性能的主要手段.特别是NLP领域的自监督预训练语言模型,规模越来越大,从GPT3的1750亿参数,到Switch Transformer的16000亿参数,又是一 ...
- 如何在 Java 中实现 Dijkstra 最短路算法
定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...
- 转-ArcGIS Engine中的License设置
AE开发中的License有两种方法进行设置,一种是通过LicenseControl控件,另一种是通过IAoInitialize接口设置.整个应用程序中只能有一种方式存在,如果进行了两种License ...
- Android中的颜色设置
1.在android中经常看到设置的颜色为八位的十六进制的颜色值,例如 public static final class color { public static final int lightb ...
随机推荐
- 图片jpg,png转为BASE64编码
-- using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; namespace aliy ...
- Docker入门系列之四:Docker镜像
在本文中,您将学习如何加快Docker构建周期并创建轻量级镜像.遵循之前的文章中的食物隐喻,我们将沙拉隐喻为Docker镜像,同时减少Docker镜像的数量. 在本系列的第3部分中,我们介绍了十几个D ...
- rabbitMq消息接收转换对象,Json解析字符串报错syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62解决
Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ syntax error, expect {, actual string ...
- Win10任务栏图标居中
win+q键搜索并打开字符映射表 点击第五行的空白字符,然后先后点击下方的选择以及复制 在桌面新建一个文件夹,然后重命名,将刚才复制的空白字符粘贴进去,如图,这样我们就拥有了一个空白名称的文件夹 在任 ...
- 了解Microsoft Media Foundation
关于Microsoft Media Foundation 是什么 Microsoft Media Foundation是用来处理(创建.修改.传输.合成)多媒体数据(音视频)的一个平台. 有什么用 M ...
- 在C#中进行单元测试
单元测试 前言 时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的. 我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写 ...
- python基础-数据容器的通用操作
五种数据容器的特性 列表list[] 元组tuple() 字符串str"" 集合set{} 字典dict{key:value} 元素数量 支持多个 支持多个 支持多 ...
- 从零开始带你上手体验Sermant自定义插件开发
本文分享自华为云社区<Sermant自定义插件开发上手体验>,作者:华为云开源. 一.研究缘由 由于目前我们所处的行业是汽车行业,项目上进行云服务的迁移时使用到了Sermant中的相关插件 ...
- 【ClickHouse】3:clickhouse基本操作一 用户权限管理
背景介绍: 有三台CentOS7服务器安装了ClickHouse HostName IP 安装程序 程序端口 centf8118.sharding1.db 192.168.81.18 clickhou ...
- podman+openresty+openssl,https双向认证demo测试
前言 暂不讨论https原理,单论配置的话: 1. https单项认证 server: server.crt + server.key client: server_ca.crt 2. https双向 ...