作为一名合格的粉(bai)丝(piao)人员,居然这次才知道这个活动,当然不能错过这次机会。开始整活。
按照活动中的要求,第一步要完成加入社区,没问题。终于找到组织了
然后是第二步,体验“数据处理性能优化”,开始吧。按照教程的目录一步一步的走。
下载数据集:巧妇难为无米之炊嘛,先把数据材料整到位
作为白嫖怪,当然会使用华为云的资源呀
第一个小问题在运行正常代码的时候会报错没有mindvision,所以第一步是先安装上。
安装:pip install mindvision
设置:conda install mindspore-gpu=1.9.0 cudatoolkit=10.1 -c mindspore -c conda-forge
然后再继续使用教程中的代码,这样就没有报错了,很成功的下载并保存了数据集文件
数据加载性能优化环节,分别提供了使用内置算子Cifar10Dataset、使用Cifar10ToMR以及GenerDataset。下面我们分别试一试效果
Cifar10Dataset
Cifar10ToMR
GenerDataset
通过运行的时间也不难看出GenerDataset是最快的。
内置算子Cifar10Dataset
类和shuffle
函数两种方式进行混洗,看看效果
Cifar10Dataset
类
shuffle
函数
呐呐呐,效果很明显。结果也很正确,当然也可以调整buffer_size继续优化性能。
数据增强性能优化
这个是非常明显的,相当的快速,性能很强。
下面再使用python的函数进行数据增强,对比看看效果
这里主要是最大化利用计算资源,减小内存访问的延迟。那么可以将进程和node节点
numactl --cpubind=0 --membind=0 python train.py
如果能够事先设定各个进程的计算资源分配,就能避免这种资源竞争带来的开销。
numactl --cpubind=0 python train.py
。如果发现操作系统的CPU运行模式为平衡模式或者节能模式,可以通过将其调整为性能模式,提升数据处理的性能。
cpupower frequency-set -g performance
MindSpore提供了一种自动数据调优的工具——Dataset AutoTune,用于在训练过程中根据环境资源的情况自动调整数据处理管道的并行度, 最大化利用系统资源加速数据处理管道的处理速度。
启动自动数据加速(不保存调优后的推荐配置):
import mindspore.dataset as ds
ds.config.set_enable_autotune(True)
启动自动数据加速并设定调优结果的保存路径:
import mindspore.dataset as ds
ds.config.set_enable_autotune(True, "/path/to/autotune_out")
设定自动数据加速的调优间隔(单位是step,与网络训练时step的含义一致):
import mindspore.dataset as ds
ds.config.set_autotune_interval(100)
MindSpore提供两种方式供用户启用数据准备异构加速功能。
使用全局配置设置自动异构加速。在这种情况下,所有map数据处理算子的offload参数将设置为True(默认为None)。值得注意的是,如果用户指定特定map操作算子的offload为False,该map算子将直接应用该配置而不是全局配置。
import mindspore.dataset as ds
ds.config.set_auto_offload(True)
在map数据处理算子中将参数offload设置为True(offload默认值为None)。
import mindspore.dataset as ds
import mindspore.common.dtype as mstype
import mindspore.dataset.vision as vision
import mindspore.dataset.transforms as transforms
dataset = ds.ImageFolder(dir)
type_cast_op = transforms.TypeCast(mstype.int32)
image_ops = [vision.RandomCropDecodeResize(train_image_size),
vision.RandomHorizontalFlip(prob=0.5),
vision.Normalize(mean=mean, std=std),
vision.HWC2CHW()]
dataset = dataset.map(operations=type_cast_op, input_columns="label", offload=True)
dataset = dataset.map(operations=image_ops , input_columns="image", offload=True)
异构硬件加速技术支持应用于具有多个数据输入列的数据集,如下例所示。
dataset = dataset.map(operations=type_cast_op, input_columns="label")
dataset = dataset.map(operations=copy_column,
input_columns=["image", "label"],
output_columns=["image1", "image2", "label"],
column_order=["image1", "image2", "label"])
dataset = dataset.map(operations=image_ops, input_columns=["image1"], offload=True)
dataset = dataset.map(operations=image_ops, input_columns=["image2"], offload=True)
异构加速器功能目前仍处于开发阶段。当前的功能使用受到以下条件限制:
该功能目前不支持经过数据管道算子concat和zip处理后的数据集。
异构加速算子必须是作用于特定数据输入列的最后一个或多个连续的数据增强操作,但数据输入列的处理顺序无限制,如
dataset = dataset.map(operations=type_cast_op, input_columns="label", offload=True)