From 516b61b65d7f7dd0a405ad6290dba4e93b46d870 Mon Sep 17 00:00:00 2001 From: JunYuLiu Date: Mon, 31 Aug 2020 14:39:31 +0800 Subject: [PATCH] Add a new markdown and a notebook --- tutorials/notebook/README.md | 31 +- .../computer_vision_application.ipynb | 2 +- ...ert_dataset_to_mindspore_data_format.ipynb | 4 +- .../customized_debugging_information.ipynb | 6 +- .../data_loading_enhancement.ipynb | 2 +- .../notebook/debugging_in_pynative_mode.ipynb | 4 +- tutorials/notebook/linear_regression.ipynb | 2 +- tutorials/notebook/loading_dataset.ipynb | 4 +- .../calculate_and_datagraphic.ipynb | 8 +- ...nsight_image_histogram_scalar_tensor.ipynb | 46 +- ...sight_model_lineage_and_data_lineage.ipynb | 12 +- tutorials/notebook/mixed_precision.ipynb | 6 +- tutorials/notebook/model_security.ipynb | 2 +- .../images/compose.png | Bin 0 -> 17792 bytes .../data_enhancement_performance_scheme.png | Bin 0 -> 31509 bytes .../data_loading_performance_scheme.png | Bin 0 -> 33037 bytes .../images/operator_fusion.png | Bin 0 -> 13115 bytes .../images/pipeline.png | Bin 0 -> 5841 bytes .../images/shuffle_performance_scheme.png | Bin 0 -> 18160 bytes ..._the_performance_of_data_preparation.ipynb | 772 ++++++++++++++++++ tutorials/notebook/quick_start.ipynb | 4 +- ...chronization_training_and_evaluation.ipynb | 2 +- .../images/cifar10_c_transforms.png | Bin 0 -> 46693 bytes .../advanced_use/images/compose.png | Bin 0 -> 17792 bytes .../data_enhancement_performance_scheme.png | Bin 0 -> 31509 bytes .../data_loading_performance_scheme.png | Bin 0 -> 33037 bytes .../advanced_use/images/operator_fusion.png | Bin 0 -> 13115 bytes .../advanced_use/images/pipeline.png | Bin 0 -> 5841 bytes .../images/shuffle_performance_scheme.png | Bin 0 -> 18160 bytes ...ize_the_performance_of_data_preparation.md | 389 +++++++++ tutorials/source_zh_cn/index.rst | 1 + 31 files changed, 1230 insertions(+), 67 deletions(-) create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/images/compose.png create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_enhancement_performance_scheme.png create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_loading_performance_scheme.png create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/images/operator_fusion.png create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/images/pipeline.png create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/images/shuffle_performance_scheme.png create mode 100644 tutorials/notebook/optimize_the_performance_of_data_preparation/optimize_the_performance_of_data_preparation.ipynb create mode 100644 tutorials/source_zh_cn/advanced_use/images/cifar10_c_transforms.png create mode 100644 tutorials/source_zh_cn/advanced_use/images/compose.png create mode 100644 tutorials/source_zh_cn/advanced_use/images/data_enhancement_performance_scheme.png create mode 100644 tutorials/source_zh_cn/advanced_use/images/data_loading_performance_scheme.png create mode 100644 tutorials/source_zh_cn/advanced_use/images/operator_fusion.png create mode 100644 tutorials/source_zh_cn/advanced_use/images/pipeline.png create mode 100644 tutorials/source_zh_cn/advanced_use/images/shuffle_performance_scheme.png create mode 100644 tutorials/source_zh_cn/advanced_use/optimize_the_performance_of_data_preparation.md diff --git a/tutorials/notebook/README.md b/tutorials/notebook/README.md index f7eac5dd..1e7d9963 100644 --- a/tutorials/notebook/README.md +++ b/tutorials/notebook/README.md @@ -50,18 +50,19 @@ | 教  程  名  称 | 文  件  名  称 | 教  程  类  别 | 内  容  描  述 | :----------- | :----------- | :------- |:------ -| 手写数字分类识别入门体验教程 | [quick_start.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/quick_start.ipynb) | 快速入门 | - CPU平台下从数据集到模型验证的全过程解读
- 体验教程中各功能模块的使用说明
- 数据集图形化展示
- 了解LeNet5具体结构和参数作用
- 学习使用自定义回调函数
- loss值与训练步数的变化图
- 模型精度与训练步数的变化图
- 使用模型应用到手写图片的预测与分类上 -| 线性拟合 | [linear_regression.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/linear_regression.ipynb) | 快速入门 | - 了解线性拟合的算法原理
- 了解在MindSpore中如何实现线性拟合的算法原理
- 学习使用MindSpore实现AI训练中的正向传播和方向传播
- 可视化线性函数拟合数据的全过程。 -| 加载数据集 | [loading_dataset.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/loading_dataset.ipynb) | 使用指南 | - 学习MindSpore中加载数据集的方法
- 展示加载常用数据集的方法
- 展示加载MindRecord格式数据集的方法
- 展示加载自定义格式数据集的方法 -| 将数据集转换为MindSpore数据格式 | [convert_dataset_to_mindspore_data_format.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/convert_dataset_to_mindspore_data_format/convert_dataset_to_mindspore_data_format.ipynb) | 使用指南 | - 展示将MNIST数据集转换为MindSpore数据格式
- 展示将CSV数据集转换为MindSpore数据格式
- 展示将CIFAR-10数据集转换为MindSpore数据格式
- 展示将CIFAR-100数据集转换为MindSpore数据格式
- 展示将ImageNet数据集转换为MindSpore数据格式
- 展示用户自定义生成MindSpore数据格式 -| 数据处理与数据增强 | [data_loading_enhancement.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb) | 使用指南 | - 学习MindSpore中数据处理和增强的方法
- 展示数据处理、增强方法的实际操作
- 对比展示数据处理前和处理后的效果
- 表述在数据处理、增强后的意义 -| 自然语言处理应用 | [nlp_application.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/nlp_application.ipynb) | 应用实践 | - 展示MindSpore在自然语言处理的应用
- 展示自然语言处理中数据集特定的预处理方法
- 展示如何定义基于LSTM的SentimentNet网络 -| 计算机视觉应用 | [computer_vision_application.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/computer_vision_application.ipynb) | 应用实践 | - 学习MindSpore卷积神经网络在计算机视觉应用的过程
- 学习下载CIFAR-10数据集,搭建运行环境
- 学习使用ResNet-50构建卷积神经网络
- 学习使用Momentum和SoftmaxCrossEntropyWithLogits构建优化器和损失函数
- 学习调试参数训练模型,判断模型精度 -| 模型的训练及验证同步方法 | [synchronization_training_and_evaluation.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/synchronization_training_and_evaluation.ipynb) | 应用实践 | - 了解模型训练和验证同步进行的方法
- 学习同步训练和验证中参数设置方法
- 利用绘图函数从保存的模型中挑选出最优模型 -| 使用PyNative进行神经网络的训练调试体验 | [debugging_in_pynative_mode.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/debugging_in_pynative_mode.ipynb) | 模型调优 | - GPU平台下从数据集获取单个数据进行单个step训练的数据变化全过程解读
- 了解PyNative模式下的调试方法
- 图片数据在训练过程中的变化情况的图形展示
- 了解构建权重梯度计算函数的方法
- 展示1个step过程中权重的变化及数据展示 -| 自定义调试信息体验文档 | [customized_debugging_information.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/customized_debugging_information.ipynb) | 模型调优 | - 了解MindSpore的自定义调试算子
- 学习使用自定义调试算子Callback设置定时训练
- 学习设置metrics算子输出相对应的模型精度信息
- 学习设置日志环境变量来控制glog输出日志 -| MindInsight的模型溯源和数据溯源体验 | [mindinsight_model_lineage_and_data_lineage.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb) | 模型调优 | - 了解MindSpore中训练数据的采集及展示
- 学习使用SummaryRecord记录数据
- 学习使用回调函数SummaryCollector进行数据采集
- 使用MindInsight进行数据可视化
- 了解数据溯源和模型溯源的使用方法 -| 计算图和数据图可视化 | [calculate_and_datagraphic.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/mindinsight/calculate_and_datagraphic.ipynb) | 模型调优 | - 了解MindSpore中新增可视化功能
- 学习使用MindInsight可视化看板
- 学习使用查看计算图可视化图的信息的方法
- 学习使用查看数据图中展示的信息的方法 -| 标量、直方图、图像和张量可视化 | [mindinsight_image_histogram_scalar_tensor.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/mindinsight/mindinsight_image_histogram_scalar_tensor.ipynb) | 模型调优 | - 了解完整的MindSpore深度学习及MindInsight可视化展示的过程
- 学习使用MindInsight对训练过程中标量、直方图、图像和张量信息进行可视化展示
- 学习使用Summary算子记录标量、直方图、图像和张量信息
- 学习单独对标量、直方图、图像和张量信息进行记录并可视化展示的方法 -| 混合精度 | [mixed_precision.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/mixed_precision.ipynb) | 性能优化 | - 了解混合精度训练的原理
- 学习在MindSpore中使用混合精度训练
- 对比单精度训练和混合精度训练的对模型训练的影响 -| 模型安全 | [model_security.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/model_security.ipynb) | AI安全和隐私 | - 了解AI算法的安全威胁的概念和影响
- 介绍MindArmour提供的模型安全防护手段
- 学习如何模拟攻击训练模型
- 学习针对被攻击模型进行对抗性防御 +| 手写数字分类识别入门体验教程 | [quick_start.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/quick_start.ipynb) | 快速入门 | - CPU平台下从数据集到模型验证的全过程解读
- 体验教程中各功能模块的使用说明
- 数据集图形化展示
- 了解LeNet5具体结构和参数作用
- 学习使用自定义回调函数
- loss值与训练步数的变化图
- 模型精度与训练步数的变化图
- 使用模型应用到手写图片的预测与分类上 +| 线性拟合 | [linear_regression.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/linear_regression.ipynb) | 快速入门 | - 了解线性拟合的算法原理
- 了解在MindSpore中如何实现线性拟合的算法原理
- 学习使用MindSpore实现AI训练中的正向传播和方向传播
- 可视化线性函数拟合数据的全过程。 +| 加载数据集 | [loading_dataset.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/loading_dataset.ipynb) | 使用指南 | - 学习MindSpore中加载数据集的方法
- 展示加载常用数据集的方法
- 展示加载MindRecord格式数据集的方法
- 展示加载自定义格式数据集的方法 +| 将数据集转换为MindSpore数据格式 | [convert_dataset_to_mindspore_data_format.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/convert_dataset_to_mindspore_data_format/convert_dataset_to_mindspore_data_format.ipynb) | 使用指南 | - 展示将MNIST数据集转换为MindSpore数据格式
- 展示将CSV数据集转换为MindSpore数据格式
- 展示将CIFAR-10数据集转换为MindSpore数据格式
- 展示将CIFAR-100数据集转换为MindSpore数据格式
- 展示将ImageNet数据集转换为MindSpore数据格式
- 展示用户自定义生成MindSpore数据格式 +| 数据处理与数据增强 | [data_loading_enhancement.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb) | 使用指南 | - 学习MindSpore中数据处理和增强的方法
- 展示数据处理、增强方法的实际操作
- 对比展示数据处理前和处理后的效果
- 表述在数据处理、增强后的意义 +| 自然语言处理应用 | [nlp_application.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/nlp_application.ipynb) | 应用实践 | - 展示MindSpore在自然语言处理的应用
- 展示自然语言处理中数据集特定的预处理方法
- 展示如何定义基于LSTM的SentimentNet网络 +| 计算机视觉应用 | [computer_vision_application.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/computer_vision_application.ipynb) | 应用实践 | - 学习MindSpore卷积神经网络在计算机视觉应用的过程
- 学习下载CIFAR-10数据集,搭建运行环境
- 学习使用ResNet-50构建卷积神经网络
- 学习使用Momentum和SoftmaxCrossEntropyWithLogits构建优化器和损失函数
- 学习调试参数训练模型,判断模型精度 +| 模型的训练及验证同步方法 | [synchronization_training_and_evaluation.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/synchronization_training_and_evaluation.ipynb) | 应用实践 | - 了解模型训练和验证同步进行的方法
- 学习同步训练和验证中参数设置方法
- 利用绘图函数从保存的模型中挑选出最优模型 +| 优化数据准备的性能 | [optimize_the_performance_of_data_preparation.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/optimize_the_performance_of_data_preparation.ipynb) | 应用实践 | - 数据加载性能优化
- shuffle性能优化
- 数据增强性能优化
- 性能优化方案总结 +| 使用PyNative进行神经网络的训练调试体验 | [debugging_in_pynative_mode.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/debugging_in_pynative_mode.ipynb) | 模型调优 | - GPU平台下从数据集获取单个数据进行单个step训练的数据变化全过程解读
- 了解PyNative模式下的调试方法
- 图片数据在训练过程中的变化情况的图形展示
- 了解构建权重梯度计算函数的方法
- 展示1个step过程中权重的变化及数据展示 +| 自定义调试信息体验文档 | [customized_debugging_information.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/customized_debugging_information.ipynb) | 模型调优 | - 了解MindSpore的自定义调试算子
- 学习使用自定义调试算子Callback设置定时训练
- 学习设置metrics算子输出相对应的模型精度信息
- 学习设置日志环境变量来控制glog输出日志 +| MindInsight的模型溯源和数据溯源体验 | [mindinsight_model_lineage_and_data_lineage.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb) | 模型调优 | - 了解MindSpore中训练数据的采集及展示
- 学习使用SummaryRecord记录数据
- 学习使用回调函数SummaryCollector进行数据采集
- 使用MindInsight进行数据可视化
- 了解数据溯源和模型溯源的使用方法 +| 计算图和数据图可视化 | [calculate_and_datagraphic.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/mindinsight/calculate_and_datagraphic.ipynb) | 模型调优 | - 了解MindSpore中新增可视化功能
- 学习使用MindInsight可视化看板
- 学习使用查看计算图可视化图的信息的方法
- 学习使用查看数据图中展示的信息的方法 +| 标量、直方图、图像和张量可视化 | [mindinsight_image_histogram_scalar_tensor.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/mindinsight/mindinsight_image_histogram_scalar_tensor.ipynb) | 模型调优 | - 了解完整的MindSpore深度学习及MindInsight可视化展示的过程
- 学习使用MindInsight对训练过程中标量、直方图、图像和张量信息进行可视化展示
- 学习使用Summary算子记录标量、直方图、图像和张量信息
- 学习单独对标量、直方图、图像和张量信息进行记录并可视化展示的方法 +| 混合精度 | [mixed_precision.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/mixed_precision.ipynb) | 性能优化 | - 了解混合精度训练的原理
- 学习在MindSpore中使用混合精度训练
- 对比单精度训练和混合精度训练的对模型训练的影响 +| 模型安全 | [model_security.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/model_security.ipynb) | AI安全和隐私 | - 了解AI算法的安全威胁的概念和影响
- 介绍MindArmour提供的模型安全防护手段
- 学习如何模拟攻击训练模型
- 学习针对被攻击模型进行对抗性防御 diff --git a/tutorials/notebook/computer_vision_application.ipynb b/tutorials/notebook/computer_vision_application.ipynb index f6a65a86..bd966948 100644 --- a/tutorials/notebook/computer_vision_application.ipynb +++ b/tutorials/notebook/computer_vision_application.ipynb @@ -71,7 +71,7 @@ "metadata": {}, "source": [ "本次面向Ascend 910 AI处理器硬件平台,将卷积神经网络ResNet加入到案例中,你可以在这里下载完整的样例代码案例作为基础用例:\n", - "https://gitee.com/mindspore/docs/blob/master/tutorials/tutorial_code/resnet" + "https://gitee.com/mindspore/docs/blob/r0.7/tutorials/tutorial_code/resnet" ] }, { diff --git a/tutorials/notebook/convert_dataset_to_mindspore_data_format/convert_dataset_to_mindspore_data_format.ipynb b/tutorials/notebook/convert_dataset_to_mindspore_data_format/convert_dataset_to_mindspore_data_format.ipynb index 60f0ffe0..6e9332fc 100644 --- a/tutorials/notebook/convert_dataset_to_mindspore_data_format/convert_dataset_to_mindspore_data_format.ipynb +++ b/tutorials/notebook/convert_dataset_to_mindspore_data_format/convert_dataset_to_mindspore_data_format.ipynb @@ -281,7 +281,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 本例中需要的数据位置在https://gitee.com/mindspore/docs/tree/master/tutorials/notebook/convert_dataset_to_mindspore_data_format/csv_data/data.csv\n", + "- 本例中需要的数据位置在https://gitee.com/mindspore/docs/tree/r0.7/tutorials/notebook/convert_dataset_to_mindspore_data_format/csv_data/data.csv\n", "中,使用过程中可以在此路径下找到文件并下载,并且保存在`jupyter工作目录/dataset/`下,如图所示:" ] }, @@ -838,7 +838,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "3. 准备需要写入的数据,按照用户定义的Schema形式,准备需要写入的样本列表,本例中需要的数据位置在https://gitee.com/mindspore/docs/tree/master/tutorials/notebook/convert_dataset_to_mindspore_data_format/images/transform.jpg\n", + "3. 准备需要写入的数据,按照用户定义的Schema形式,准备需要写入的样本列表,本例中需要的数据位置在https://gitee.com/mindspore/docs/tree/r0.7/tutorials/notebook/convert_dataset_to_mindspore_data_format/images/transform.jpg\n", "中,使用过程中可以在此路径下找到图片并下载,并且保存在`jupyter工作目录/dataset/`下。" ] }, diff --git a/tutorials/notebook/customized_debugging_information.ipynb b/tutorials/notebook/customized_debugging_information.ipynb index 7ef6762a..0f30cdcf 100644 --- a/tutorials/notebook/customized_debugging_information.ipynb +++ b/tutorials/notebook/customized_debugging_information.ipynb @@ -18,7 +18,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "本文将使用[快速入门](https://gitee.com/mindspore/docs/blob/master/tutorials/tutorial_code/lenet.py)作为样例,并通过构建自定义调试函数:`Callback`、`metrics`、`Print算子`、日志打印等,同时将构建的自定义调试函数添加进代码中,通过运行效果来展示具体如何使用MindSpore提供给我们的自定义调试能力,帮助快速调试训练网络。\n", + "本文将使用[快速入门](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/tutorial_code/lenet.py)作为样例,并通过构建自定义调试函数:`Callback`、`metrics`、`Print算子`、日志打印等,同时将构建的自定义调试函数添加进代码中,通过运行效果来展示具体如何使用MindSpore提供给我们的自定义调试能力,帮助快速调试训练网络。\n", "体验过程如下:\n", "1. 数据集准备。\n", "2. 定义深度学习网络LeNet5。\n", @@ -46,7 +46,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "这里我们需要将MNIST数据集中随机取出一张图片,并增强成适合LeNet网络的数据格式(如何处理请参考[quick_start.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/quick_start.ipynb)),训练数据集下载地址:{\"\", \"\"}。\n", + "这里我们需要将MNIST数据集中随机取出一张图片,并增强成适合LeNet网络的数据格式(如何处理请参考[quick_start.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/quick_start.ipynb)),训练数据集下载地址:{\"\", \"\"}。\n", "
数据集放在----`Jupyter工作目录+\\MNIST_Data\\train\\`,如下图结构:" ] }, @@ -303,7 +303,7 @@ "\n", "`GLOG_logtostderr`:控制日志输出方式,设置为`1`时,日志输出到屏幕;值设置为`0`时,日志输出到文件。设置输出屏幕时,日志部分的信息会显示成红色,设置成输出到文件时,会在`GLOG_log_dir`路径下生成`mindspore.log`文件。\n", "\n", - "> 更多设置请参考官网:" + "> 更多设置请参考官网:" ] }, { diff --git a/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb b/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb index fb562620..893cbb57 100644 --- a/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb +++ b/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb @@ -439,7 +439,7 @@ "source": [ "2. 使用一类图片当作数据,体验操作。在一个数据量比较大的图片数据集中,例如数据集名称叫`images`,它的存储方式是在`images`文件夹下,有不同子类别的文件夹,一个子类别文件夹中的图片属于同一类。所以我们本次体验所使用的图片放置方法,就需要创建`enhance_images`文件夹,接着在`enhance_images`下建一个名为`sample`的子类别文件夹,将图片放在`sample`文件夹中即可。如果有更多类别图片,可以在`enhance_images`下创建对应的子类别文件夹,将图片放入即可。\n", "\n", - " 增强体验使用的数据位置在中,使用过程中可以在此路径下找到图片数据,并参照本次体验中图片放置的位置来新建文件夹。" + " 增强体验使用的数据位置在中,使用过程中可以在此路径下找到图片数据,并参照本次体验中图片放置的位置来新建文件夹。" ] }, { diff --git a/tutorials/notebook/debugging_in_pynative_mode.ipynb b/tutorials/notebook/debugging_in_pynative_mode.ipynb index b068dddd..2d07612e 100644 --- a/tutorials/notebook/debugging_in_pynative_mode.ipynb +++ b/tutorials/notebook/debugging_in_pynative_mode.ipynb @@ -34,7 +34,7 @@ "\n", "4. 执行神经网络训练,查看网络各参数梯度。\n", "\n", - "> 你可以在这里找到完整可运行的样例代码:。" + "> 你可以在这里找到完整可运行的样例代码:。" ] }, { @@ -55,7 +55,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "这里我们需要将MNIST数据集中随机取出一张图片,并增强成适合LeNet网络的数据格式(如何处理请参考[quick_start.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/quick_start.ipynb)),训练数据集下载地址:{\"\", \"\"} 。\n", + "这里我们需要将MNIST数据集中随机取出一张图片,并增强成适合LeNet网络的数据格式(如何处理请参考[quick_start.ipynb](https://gitee.com/mindspore/docs/blob/r0.7/tutorials/notebook/quick_start.ipynb)),训练数据集下载地址:{\"\", \"\"} 。\n", "
数据集放在----Jupyter工作目录+\\MNIST_Data\\train\\,如下图结构:" ] }, diff --git a/tutorials/notebook/linear_regression.ipynb b/tutorials/notebook/linear_regression.ipynb index 291d0a4c..9237cc74 100644 --- a/tutorials/notebook/linear_regression.ipynb +++ b/tutorials/notebook/linear_regression.ipynb @@ -548,7 +548,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`nn.RMSProp`为完成权重更新的函数,更新方式大致为公式11,但是考虑的因素更多,具体信息请参考[官网说明](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.nn.html?highlight=rmsprop#mindspore.nn.RMSProp)。" + "`nn.RMSProp`为完成权重更新的函数,更新方式大致为公式11,但是考虑的因素更多,具体信息请参考[官网说明](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.nn.html?highlight=rmsprop#mindspore.nn.RMSProp)。" ] }, { diff --git a/tutorials/notebook/loading_dataset.ipynb b/tutorials/notebook/loading_dataset.ipynb index d1865e5f..62be30b1 100644 --- a/tutorials/notebook/loading_dataset.ipynb +++ b/tutorials/notebook/loading_dataset.ipynb @@ -308,7 +308,7 @@ "\n", "MindSpore天然支持读取MindSpore数据格式——`MindRecord`存储的数据集,在性能和特性上有更好的支持。 \n", "\n", - "> 阅读[将数据集转换为MindSpore数据格式](https://www.mindspore.cn/tutorial/zh-CN/master/use/data_preparation/converting_datasets.html),了解如何将数据集转换为MindSpore数据格式。\n", + "> 阅读[将数据集转换为MindSpore数据格式](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/converting_datasets.html),了解如何将数据集转换为MindSpore数据格式。\n", "\n", "可以通过`MindDataset`对象对数据集进行读取。详细方法如下所示:" ] @@ -407,7 +407,7 @@ "## 加载自定义数据集\n", "\n", "现实场景中,数据集的种类多种多样,对于自定义数据集或者目前不支持直接加载的数据集,有两种方法可以处理。\n", - "一种方法是将数据集转成MindRecord格式(请参考[将数据集转换为MindSpore数据格式](https://www.mindspore.cn/tutorial/zh-CN/master/use/data_preparation/converting_datasets.html)章节),另一种方法是通过`GeneratorDataset`对象加载,以下将展示如何使用`GeneratorDataset`。\n", + "一种方法是将数据集转成MindRecord格式(请参考[将数据集转换为MindSpore数据格式](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/converting_datasets.html)章节),另一种方法是通过`GeneratorDataset`对象加载,以下将展示如何使用`GeneratorDataset`。\n", "\n", "1. 定义一个可迭代的对象,用于生成数据集。以下展示了两种示例,一种是含有`yield`返回值的自定义函数,另一种是含有`__getitem__`的自定义类。两种示例都将产生一个含有从0到9数字的数据集。\n", " \n", diff --git a/tutorials/notebook/mindinsight/calculate_and_datagraphic.ipynb b/tutorials/notebook/mindinsight/calculate_and_datagraphic.ipynb index 2eb475d3..71d3b6d1 100644 --- a/tutorials/notebook/mindinsight/calculate_and_datagraphic.ipynb +++ b/tutorials/notebook/mindinsight/calculate_and_datagraphic.ipynb @@ -287,7 +287,7 @@ "1. 导入所需的代码包,并示例化训练网络。\n", "2. 通过MindSpore提供的 `SummaryCollector` 接口,实现收集计算图和数据图。在实例化 `SummaryCollector` 时,在 `collect_specified_data` 参数中,通过设置 `collect_graph` 指定收集计算图,设置 `collect_dataset_graph` 指定收集数据图。\n", "\n", - "更多 `SummaryCollector` 的用法,请点击[API文档](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.train.html?highlight=summarycollector#mindspore.train.callback.SummaryCollector)查看。\n", + "更多 `SummaryCollector` 的用法,请点击[API文档](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.train.html?highlight=summarycollector#mindspore.train.callback.SummaryCollector)查看。\n", "\n" ] }, @@ -338,7 +338,7 @@ "\n", "> 其中 /path/ 为 `SummaryCollector` 中参数 `summary_dir` 所指定的目录。\n", "\n", - "![title](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/mindinsight_map.png)" + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/mindinsight_map.png)" ] }, { @@ -352,7 +352,7 @@ "- 节点信息:显示当前所查看节点的信息,包括名称、类型、属性、输入和输出。便于在训练结束后,核对计算正确性时查看。\n", "- 图例:图例中包括命名空间、聚合节点、虚拟节点、算子节点、常量节点,通过不同图形来区分。\n", "\n", - "![title](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/cast_map.png)" + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/cast_map.png)" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![title](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/data_map.png)" + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/data_map.png)" ] }, { diff --git a/tutorials/notebook/mindinsight/mindinsight_image_histogram_scalar_tensor.ipynb b/tutorials/notebook/mindinsight/mindinsight_image_histogram_scalar_tensor.ipynb index 08a68bdb..7313052d 100644 --- a/tutorials/notebook/mindinsight/mindinsight_image_histogram_scalar_tensor.ipynb +++ b/tutorials/notebook/mindinsight/mindinsight_image_histogram_scalar_tensor.ipynb @@ -305,10 +305,10 @@ "\n", "当前支持的Summary算子:\n", "\n", - "- [ScalarSummary](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.ops.operations.html?highlight=scalarsummary#mindspore.ops.operations.ScalarSummary): 记录标量数据\n", - "- [TensorSummary](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.ops.operations.html?highlight=tensorsummary#mindspore.ops.operations.TensorSummary): 记录张量数据\n", - "- [ImageSummary](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.ops.operations.html?highlight=imagesummary#mindspore.ops.operations.ImageSummary): 记录图片数据\n", - "- [HistogramSummary](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.ops.operations.html?highlight=histogramsummar#mindspore.ops.operations.HistogramSummary): 将张量数据转为直方图数据记录" + "- [ScalarSummary](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.ops.operations.html?highlight=scalarsummary#mindspore.ops.operations.ScalarSummary): 记录标量数据\n", + "- [TensorSummary](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.ops.operations.html?highlight=tensorsummary#mindspore.ops.operations.TensorSummary): 记录张量数据\n", + "- [ImageSummary](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.ops.operations.html?highlight=imagesummary#mindspore.ops.operations.ImageSummary): 记录图片数据\n", + "- [HistogramSummary](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.ops.operations.html?highlight=histogramsummar#mindspore.ops.operations.HistogramSummary): 将张量数据转为直方图数据记录" ] }, { @@ -393,7 +393,7 @@ "\n", "下面展示使用`SummaryCollector`来记录标量、直方图信息。\n", "\n", - "在MindSpore中通过`Callback`机制,提供支持快速简易地收集损失值、参数权重、梯度等信息的`Callback`, 叫做`SummaryCollector`(详细的用法可以参考API文档中[mindspore.train.callback.SummaryCollector](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.train.html?highlight=summarycollector#mindspore.train.callback.SummaryCollector))。`SummaryCollector`使用方法如下: \n", + "在MindSpore中通过`Callback`机制,提供支持快速简易地收集损失值、参数权重、梯度等信息的`Callback`, 叫做`SummaryCollector`(详细的用法可以参考API文档中[mindspore.train.callback.SummaryCollector](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.train.html?highlight=summarycollector#mindspore.train.callback.SummaryCollector))。`SummaryCollector`使用方法如下: \n", "\n", "`SummaryCollector` 提供 `collect_specified_data` 参数,允许自定义想要收集的数据。\n", "\n", @@ -577,17 +577,17 @@ "\n", "在本地浏览器中打开地址:`127.0.0.1:8080`,进入到可视化面板。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/mindinsight_panel.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/mindinsight_panel.png)\n", "\n", "在上图所示面板中可以看到`summary_01`日志文件目录,点击**训练看板**进入到下图所示的训练数据展示面板,该面板展示了标量数据、直方图、图像和张量信息,并随着训练、测试的进行实时刷新数据,实时显示训练过程参数的变化情况。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/mindinsight_panel2.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/mindinsight_panel2.png)\n", "\n", "### 标量可视化\n", "\n", "标量可视化用于展示训练过程中标量的变化趋势,点击打开标量信息展示面板,该面板记录了迭代计算过程中的损失值标量信息,如下图展示了损失值标量趋势图。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/scalar_panel.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/scalar_panel.png)\n", "\n", "上图展示了神经网络在训练过程中损失值的变化过程。横坐标是训练步骤,纵坐标是损失值。\n", "\n", @@ -599,7 +599,7 @@ "- 分步回退是指对同一个区域连续框选并放大查看时,可以逐步撤销操作。\n", "- 还原图形是指进行了多次框选后,点击此按钮可以将图还原回原始状态。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/scalar_select.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/scalar_select.png)\n", "\n", "上图展示的标量可视化的功能区,提供了根据选择不同标签,水平轴的不同维度和平滑度来查看标量信息的功能。\n", "\n", @@ -614,15 +614,15 @@ "\n", "直方图用于将用户所指定的张量以直方图的形式展示。点击打开直方图展示面板,以直方图的形式记录了在迭代过程中所有层参数分布信息。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/histogram_panel.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/histogram_panel.png)\n", "\n", "如下图为`conv1`层参数分布信息,点击图中右上角,可以将图放大。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/histogram.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/histogram.png)\n", "\n", "下图为直方图功能区。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/histogram_func.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/histogram_func.png)\n", "\n", "上图展示直方图的功能区,包含以下内容:\n", "\n", @@ -636,11 +636,11 @@ "\n", "下图为展示`summary_01`记录的图像信息。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/image_panel.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/image_panel.png)\n", "\n", "通过滑动上图中的\"步骤\"滑条,查看不同步骤的图片。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/image_function.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/image_function.png)\n", "\n", "上图展示图像可视化的功能区,提供了选择查看不同标签,不同亮度和不同对比度来查看图片信息。\n", "\n", @@ -652,7 +652,7 @@ "\n", "张量可视化用于将张量以表格以及直方图的形式进行展示。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/tensor_func.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/tensor_func.png)\n", "\n", "上图展示了张量可视化的功能区,包含以下内容:\n", "\n", @@ -661,7 +661,7 @@ "- 纵轴:可以选择步骤、相对时间、绝对时间中的任意一项,来作为直方图纵轴显示的数据。\n", "- 视角:可以选择正视和俯视中的一种。正视是指从正面的角度查看直方图,此时不同步骤之间的数据会覆盖在一起。俯视是指 偏移以45度角俯视直方图区域,这时可以呈现不同步骤之间数据的差异。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/tensor.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/tensor.png)\n", "\n", "上图中将用户所记录的张量以表格的形式展示,包含以下功能:\n", "\n", @@ -804,7 +804,7 @@ "source": [ "此时点击打开MindInsight**训练列表**看板中的`./summary_loss_only`目录,如下图所示,可以看到只记录有损失值标量信息。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/loss_scalar_only.png)" + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/loss_scalar_only.png)" ] }, { @@ -900,11 +900,11 @@ "source": [ "此时点击打开MindInsight**训练列表**看板中的`./summary_histogram_only`目录。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/histogram_only.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/histogram_only.png)\n", "\n", "在MindInsight面板中,如上图所示,只展示了直方图信息。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/histogram_only_all.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/histogram_only_all.png)\n", "\n", "点击进入直方图面板,如上图所示,只展示了`conv1`层的直方图信息。" ] @@ -1043,7 +1043,7 @@ "source": [ "此时点击打开MindInsight**训练列表**看板中的`./summary_tensor_only`目录,如下图所示,可以看到只记录有张量信息。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/tensor_only.png)" + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/tensor_only.png)" ] }, { @@ -1177,7 +1177,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/image_only.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/image_only.png)\n", "\n", "在MindInsight面板中,如上图所示,只展示了输入图像信息。" ] @@ -1192,11 +1192,11 @@ "\n", "点击MindInsight看板中的**对比看板**,打开对比看板,可以得到多次(不同)训练搜集到的标量数据对比信息。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/multi_scalars.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/multi_scalars.png)\n", "\n", "上图展示了`summary_01`(上图中红色曲线)和`summary_loss_only`(上图中蓝色曲线)的标量曲线对比效果,横坐标是训练步骤,纵坐标是标量值。\n", "\n", - "![](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/multi_scalars_select.png)\n", + "![](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/multi_scalars_select.png)\n", "\n", "上图展示的对比看板可视的功能区,提供了根据选择不同训练或标签,水平轴的不同维度和平滑度来进行标量对比的功能。\n", "\n", diff --git a/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb b/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb index 3a09e78d..e2f8f721 100644 --- a/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb +++ b/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb @@ -29,7 +29,7 @@ "6. 数据溯源的使用。调整数据参数多次训练并存储数据,并使用MindInsight的数据溯源功能对不同数据集下训练产生的模型进行对比分析,了解如何调优。\n", "\n", "\n", - "本次体验将使用快速入门案例作为基础用例,将MindInsight的模型溯源和数据溯源的数据记录功能加入到案例中,快速入门案例的源码请参考:。" + "本次体验将使用快速入门案例作为基础用例,将MindInsight的模型溯源和数据溯源的数据记录功能加入到案例中,快速入门案例的源码请参考:。" ] }, { @@ -292,7 +292,7 @@ "source": [ "MindSpore 提供 `SummaryCollector` 进行记录训练过程中的信息。通过 `SummaryCollector` 的 `collect_specified_data` 参数,可以自定义记录指定数据。\n", "\n", - "在本次体验中,我们将记录训练数据与数据集预处理的操作,我们将 `collect_specified_data` 中的 `collect_train_lineage`, `collect_eval_lineage`, `collect_dataset_graph` 设置成 `True`。SummaryCollector的更多用法,请参考[API文档](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.train.html?highlight=collector#mindspore.train.callback.SummaryCollector)。\n" + "在本次体验中,我们将记录训练数据与数据集预处理的操作,我们将 `collect_specified_data` 中的 `collect_train_lineage`, `collect_eval_lineage`, `collect_dataset_graph` 设置成 `True`。SummaryCollector的更多用法,请参考[API文档](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.train.html?highlight=collector#mindspore.train.callback.SummaryCollector)。\n" ] }, { @@ -353,7 +353,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "这里主要展示如何启用及关闭MindInsight,更多的命令集信息,请参考MindSpore官方网站:。\n", + "这里主要展示如何启用及关闭MindInsight,更多的命令集信息,请参考MindSpore官方网站:。\n", "\n", "启动MindInsight服务命令:\n", "\n", @@ -389,7 +389,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/model_lineage_all.png)" + "![image](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/model_lineage_all.png)" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/model_lineage_cp.png)" + "![image](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/model_lineage_cp.png)" ] }, { @@ -442,7 +442,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](https://gitee.com/mindspore/docs/raw/master/tutorials/notebook/mindinsight/images/data_lineage.png)" + "![image](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/mindinsight/images/data_lineage.png)" ] }, { diff --git a/tutorials/notebook/mixed_precision.ipynb b/tutorials/notebook/mixed_precision.ipynb index b57154f1..59f64ef3 100644 --- a/tutorials/notebook/mixed_precision.ipynb +++ b/tutorials/notebook/mixed_precision.ipynb @@ -42,7 +42,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> 你可以在这里找到完整可运行的样例代码:。" + "> 你可以在这里找到完整可运行的样例代码:。" ] }, { @@ -56,7 +56,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](https://www.mindspore.cn/tutorial/zh-CN/master/_images/mix_precision.jpg)" + "![image](https://www.mindspore.cn/tutorial/zh-CN/r0.7/_images/mix_precision.jpg)" ] }, { @@ -952,7 +952,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "当然,如果你想参考单步训练或者手动设置混合精度训练,可以参考官网教程。" + "当然,如果你想参考单步训练或者手动设置混合精度训练,可以参考官网教程。" ] }, { diff --git a/tutorials/notebook/model_security.ipynb b/tutorials/notebook/model_security.ipynb index f1c00155..3e39acbe 100644 --- a/tutorials/notebook/model_security.ipynb +++ b/tutorials/notebook/model_security.ipynb @@ -579,7 +579,7 @@ "source": [ "### 攻击模型\n", "\n", - "调用MindArmour提供的FGSM接口(`FastGradientSignMethod`),使用被攻击前抽取的96张数据图像`test_images`作为被攻击数据集,保存被攻击后数据集图像到当前notebook目录下的`ada_data`文件中。其中,参数`eps`为攻击对数据范围产生的单步对抗性摄动的比例,该值越大,则攻击程度越大。关于`FastGradientSignMethod`的详细使用说明,可参考[官方API文档](https://www.mindspore.cn/api/zh-CN/master/api/python/mindarmour/mindarmour.attacks.html?highlight=fastgradientsignmethod#mindarmour.attacks.FastGradientSignMethod)。" + "调用MindArmour提供的FGSM接口(`FastGradientSignMethod`),使用被攻击前抽取的96张数据图像`test_images`作为被攻击数据集,保存被攻击后数据集图像到当前notebook目录下的`ada_data`文件中。其中,参数`eps`为攻击对数据范围产生的单步对抗性摄动的比例,该值越大,则攻击程度越大。关于`FastGradientSignMethod`的详细使用说明,可参考[官方API文档](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindarmour/mindarmour.attacks.html?highlight=fastgradientsignmethod#mindarmour.attacks.FastGradientSignMethod)。" ] }, { diff --git a/tutorials/notebook/optimize_the_performance_of_data_preparation/images/compose.png b/tutorials/notebook/optimize_the_performance_of_data_preparation/images/compose.png new file mode 100644 index 0000000000000000000000000000000000000000..a1dcbf92d4ce37bd9b794b6c04bc38b131cc3a40 GIT binary patch literal 17792 zcmeIa1yEeU)-F1@ySoNRLVy4vxLX7b1a~Jm1b24{37ViGNN|F?LkJ8Kf()*MyW4AW z&iT)O@BQzSs$2Ey-FnneyJmJz@71e&uU_l>zC97jigGxZl$a0*1m}gkv?>IG*am?h zc%q|%PsoyXjlcoJL0-!l0>L7@|3?^|^}U8b=piqpCDhzMZ_j!-P_O&2UfU}vL4ELc z5#-|`^7uLOFKaYvWwcbbBUdYP&WnrZ`CaQjOq}X?Y$*P}I@fX!*o z8{9On)>4E<0H<#ze%-nxfXox?^*KFHOPIB@T*Kx9?oaT*$V6zN*cv?MxVt^%YMjzC z8iEjk6XUIESZz9AW@n?TJGhWI?wbmXt3l>=qqh&Q?0JcrMzj|PV`c6Q?NKAjmq@>> zG#hNAynSaoSS4Ic7Cqs$z1hotcd>Z|zDl6tLqzNUoM)g>7#Zp}RaqFcoD{Z6_2j!I zZOcFHOW%KhpN{i6y?)*kt-T~eX6~1SBX-Aq_a`shA*744`7%s@hiTRaX-cKg9a0sApSQI>nN?}6IB5}Af$wNp<}rG`UA8N-s3eK(#OPiP=v)jQ+aSK-eH|jglhK{A z8sE=;+p6}6!yF%8E>HM-=_fYh0BPTMZh4WDXoR}J$|?2_{mg_B$dTQQYSrN(nuv*S z#@Ld03yLt+pGZC-RbeB}Dw5GGc{^!?N&KB8(l{iCtz46tH#iVIEXYBCCZ3&?pGFZG z(brv=wy%=?vhYug4PTTCcYuvCLVXTueM*RkDCWd33jS9peb%T>PqDx!YMR##rtify zblJ4NuxZf@6SKPXN9tNWUuxIu6Y40}a^e51Sa;3fF06lA91W}+Jz#T6C3Z?fiPa@O z4KbQrM_c^!O!GJPim_dVg+_}xwCj-)RM)>d(x!mwV1Z+WT7sXQl9~f=<`%z6zYLzQ zr7_8~{DLJhynCt7lzaF+&Xf(V^9ahXUqeWO%9;rhYQ#|!7WnBo;+682*62*sm>nBG zq&~1a)a#-nUx)6d{_B>JZ&p?(8L=eB!g^|2rKL-mF3z6RCTa5&IXP%zS+;F2WMZqk z^b5hH4IeKrZ`F*`KNb#EWJq{S&woMs@qE%4`hm!dDoEsUne{RIUJU(Sl=z98 zVfM+*z5ww#mCmAT;{ac1YPm&EqGJA2A)zQ;j+3L`Lgv1Kg*7sw@@q(D#LpLf zB&2TGGmVnU!QoE-{Kof3ty~scGPF z5+#$+RMj(S3kxnDI+?MH%r=qtgq7M~#5g88GiEiPoD_epi?}?d&3{BY?4^6 zZB5~2E?iYrm6Dm+TUfRJRP-r|`V%PY;PcLJY~ernOzxg|;p2vlOir>DCk+}xT3&P; z6C`sQ$g*d&9VA)=qs@;`Yo|Lp_;GrR(oMsd$~E0P;*2Z8HwHSDiN-AXZ&g$LaU(R9P5JHQzzEV7S2AI;zg_YX-q;3Cl}Jm zZ;0;KH8UYO9bNC_IkDnrLDq)PThxN(cssUF!lfDa$1S1c{`QjWq@CT11fO?W{rd|k zMpkVsH7tZqPhE^O))m2BJF<$N82yBv&xvxb-Jp%f`K5~h)k~L|nBTj2+1XWO97Ja} zPNw*m=T^a&eu(c%Yi`?gV?=aJKW327__801B1)g;R#(Zn2uM~~^zaCC2ab$5Ho191 zrgS}G-xMO}cLpF`o#o^*1?qkIk~2^r>%G#K08#*~(oU|Po*qXdOL9&cAEH7vZ5M&( z#8D3%7MC8J3v+0)e|RXh|7#MRn=CH(WYW#>)x;?sJH${ay2ES3>~+1M$_L^);U1Bn zr{*!A#jv2MezNduC8LLHGRe+T+o=_v<`35vGXyc7B=_(lqVuL4Ex$kg<&KIvw7gPS z#qV?KJ%w9b_7Tj(L4?(clRzJ7R(7_8%ZtZc5c~Fp1$xCyn)}(4POdcTOzxpa7|v!O z#*E;|x8}gh2(n%9;Qf4&4OgxC_54(Dw4C9az#`W8pV(a0mwAjsc-UDdgS`uBB99wB zKQVzukMn^0{j^>J8|KD9j-6(Xfd$r6o+<_s5|aDHcrDknzYVp*A8?8A;MI=3eIsH5 znfrQsi_mm2^def9mPqfXLV8B36i0fH@h1Y@Fqz~xjwVQ~i$Vuy`!UT74Ik6j(ze2q zUNN$uE#N$l;>gbdR`d)t#SA6iDQO;IjI7S^p8nD-zCaFS;xwG8$C?XGO1tQ-R|RY5 z;is4UK9|@TSD9t>$z?mKmnSQS9@w}sZCkEc6&2Ymo;{Ez46@MB{WT$0oHLCHZQ}#x z$|>s4id2&AS#YOE<~Ej)IU+y2v*H8uEsZMHo@|T6l-lQ=WX1DZ-PuPs;nX+In!M^R z4`JX&k3y!|?O!H8IAzdXrz@$l=yATi_PB)?Sc zGCjqq7=8Y*{eyf%C4~r%Jex@#lM2g6+l4QFO)~9=SzjG1JdXk!V>=d^!}cJNJoA7X z16IPz2RH}PgdF)ai{+E6DcEgP;j+2>&aRNXFBJHCFQ*274RzYpGAx|^8Lw_$9uXkE zG>~*($dpc2bsf4mlAj73Zn7<(P=T)H_hfzcC7p|?l>w)~Dr8F)uxyAeW<^Y{O zG+|jNN=>ywzS`ov)+Z6ZQcB671gEDg(?TySv2Pa*B02Jm!5|L|t{<$KJhez)?jTypKVrrhl(3LpI48{Kw&jvmN#auIi^zMXo29BLr$l2gO+v5E$~ zi;jsiaVYT3fNGu4Ujln$&*qj`7OG7uSK{eD0MFk{<8IIJj`!F+WBH(RDU8NpI`@HCd+C* zB>oB$!yPEq$<8Ml*1x7bKA3<&lJIUtzsBmz2gt%Jv@Gp~k$m6=WVJl!r0hOtl9;@b zR023VQ({xDJ{k`8vG6*hjAeQ|Pz*(mrD#fX`@%%d+7EKFa6h?l?jM{N>aZ*eqF z>GT`+#`icyckK;5=EKTvitonXi3xcTC$)GDsM3}5r}H}=_qrc(iW=0|zU_?6@F}|# zffX1)ylRqOo?sX3v^-1|cujqS)^tJETD@bdo(?~wpf{h_-N1K!ONT*Kx^$ zjsIX<6mraHl~W6JGtc7Y2FamOZw!VN0C!PzA6Hv2P_FY?!oy(3< z944=b^T`^%EsiNQAwkN$5ZUS|ga0s}_!!@0zMsYQDe~4hR+&{OufMs!dhu@R;A+Sw z@kCY3C2)cG4wxtXdmq@?IVM{*YsqeD3Cvr7b(9Q4sfE1{k{d^hgP|n9`sKWey-(Ss z&nZkB2j?#8S$^NS&hzKlZy4@en9}XeNFL199->w2|D`D{?E0b=2?8fmDm_oQURcj= z-OG)V6U565JU#S#2rF;MM^H2IO1Y*XN^|KKkart>(4Sd|7 z6D%%S=%W+S@5vb#KB9GcYbn9bjk^0+-79ziNnwJtJTyI~blsg15Weg9{@(8?c35Yu zfq?h((;XOV!$;djhh5(3xZC`+I`Yty$6^v2^?QgF74OhuK1NudnJi_9iBGiLn9Y`= zBdre^pGD34e~oBe;rFT$sQ%59#qBf3jwwrf{$_h)=kdU)^!L0B^-Z6*_98-VyVSm? zQOQ|WsA47EsHRaUt*48f@SPnJZqa1%VkTnDY&WH3IQOH{T8rnBi{)_cpN!O)#@Sm8 zBWA_QyYwg!EIm91YTQpgjf}y;Cvfc>%ShfwnR0!}jeHF!itJjT>pj z3rc)Dx17rRBvOm{F=YVy331q`}H)yL1|Ln7|~5i^R`f97xGBz|E`Bx$^sz zvs^jKPG~YLV|Ug;up6z%sp2Oo^Lv!iR36E#Vdyosd~A|W;mPt=dC_6M_g9o1WWbrn^!Bv0$Ts<+;Ka_}#lX}>>TKo>f%bY#6NA&CI zouIbs@A<>$AXx^hoc%*^h-Oo1DfYzZOgId8Ch&`p8+u95D|)-EW|6=-ky*=kC7FJ0 zu0Lvx?3Ku-r?o-eLlBejrO!>w-{lAaOol?v4icN|Y*^?YT(D##J6j-!0lRj0FR$Kt2pAL~968~u3S#Pbf^q^z2LMn=-_?f-$_%noP>1M&E-f2;|}H4KnR3dUryuyF!qtyq5J4kf33N1Ud-pkhkz+ zBGqD7+O#8`%|`fKosLU`QtEkOb~XZTBjSq>*p1Xn!vUhlC%c6atxZMk6T^WNc_=cP zi@IEEPT?0V^WsL(Aj_>58JCA778RNcwwCSjd-yX)>qdjD(#bAwK*rX8<+d<7>*qh@ zQ!AOYb(XdM9bCOalikwBQk);&`DA({OdB1m5XoWjO4Q{}557AcLL;7aTIWIQJz}61ASDLu~5Z)E*#pMUD9iH@ge9cgi%ti8GcsRH&7sX2Bu?-ee z{Htn_WspC8w% zJFJDts;zMsC^MG%nMma8EnCZ2m$v0+e;zD6zQ@`?avBkV5gn_vxKijm{I0;_1M}iS zNi#hB2P0ub+ZKsiQB@2mFW&%s0zOH;wwA;HoGTa}IC*qZ&HH?z?NrqDn5U%s^ex)x3wy5pG{+mql3 zzgYgpt3&9u4Anm?R9#`y^h}t4o-(RoY|6)P}b75I;B(nZuLhxhewOp0S zH;McDz9e&n%m2oNnsNGR&KURXBmg{B_dvC}A|@L6a%00vI#-4HgOx6IOLRpMn+4GwdXOhp>s_G;WA#6({0-8>ab*yuLF*$F5$>{)0E`xNXnV?|K zybHD$Dpk=jF^SkJrku2st|0hD*4vdZLYJVuzc#C@m((kXniEF8t>vMfYvEy!>|r3J z<|jm|Ee6T##Pl=AnS@$c z7eSpHfdh2Gy~}3MpKPhG8EN7elNA~A2g=uT%6nxOKGPu|6PiB5s;@iGRO=JxsIY(etUC3r zRx0znD5z(DDMOO?A(W8W@cjz?7Q;080hk zj6YN{8d}^Jrr%R^F-oZv0|?)t{_`t}ulj&}uxNcV;eto=&*lMIz1G&&4`7pKwD z(xdNh(EaTrIfDDxe2*K?#4G!vp1a`0vum{c-tTV}c~s7=jRzJHsN>5mOqqe3o-b~2 z&a^Dm+!rHDG!o;(=KtYP+4g7m=XsQxymmsnXqpKA(-{iGBES&cl8%&HJh`zfmQ?P~KfO{7T|M2r3Spm7xBu~yKa{oe(*VKLpWj<$H@JToH z_HS>I(-_hDY9lzl+mL=^#ZRZ`?fAtk3;ohI+j{im$Ly&;ys`%D6#wj?`Y9xF@ymI8 zEdiZCh!EW^J9{O2!{^Acmk*i_##+N#kKR&W4vG=$4Jm*X^$(|5`e3)2TC)1?+kPZW z?`5_a>s30ofabi-)`hYVZ4u>=c+oM^IKL6s5!kd2|FAoPLN9GBoJ zYwUoUg8fj?1rfMt#O!yl;hV=fQXma-l-izp_ILhzOg?5Lkb}X=VLRh3e*q$~BCa=08r^DzUyN;O6;Cs2^{9`eY=UFhLB5_fu zis*J1e2(7tB+u@#=I+=s3a0$tk6so=U|r18Li>Xj)ez8#jNByuv*UL-V)&-s>FRn` z#_i)tJU^_{mY|%0Y@Dxmt5*<6|Dvqb5^r(yS*J(uP2l$&s(#@+>|AFkpow?B(g!<3#l|AgNP4!lNYjz zp}<fyNGFF}qj!fs%(s`heY9Ry8x~V0oKHkJ{7zR!&-CzqVWkxOOA8?K zQ)?dcksGu$)BsXmHxp$*jQPork)=vyo^O+)+;tv&Zm2b1VDqTL9=ZGn&AW+!pJEs} z>ikHrU1Zj#ShHuGIK2&gNr551s+1%vr;;UA9QPgNTguvRDxe7G)c0nrKr@0(tEAHF zvFDRBQ6L`)9Rr{px{s!Ko+P4{bL*;j*!-?N@igBP3hxNHeSh`#Wmk6oo4(eYSChN9 zs1|+$1%!K`sqEr;Yx_}unJ!s$L{R`woAiM0my+tbney3FdQ8^1()0R~?|ah|XnQh_ z@aFC>-Y(>ut45Fou_pDmg&C{*Hv-#Xt?KPR2W@j(O2&C0RHq8flW`pzCK|iz1@1TI zZ+6eLcE>Y29ru{j3qD)gf;gg~iCFU3ZXkf`Wv)`0pIR$0U`XTJ&}({Bf?<_+8L+@kB7sdPUJrevRY}%fK|i zRTd@1m<`DP{E?U0Vwpxy7RT4i?q<=L`7@5l9@AR0d-JN|A}nkm`>sBLBRY z_}FNH-8x?J>E1zxX7fq*Sdhpd`%d59ON5x3Z!>#56H;-A1BxC=VqS!K2MiggF-4IG zDR9j7GGBuFTrr8ouXx%n^g2sMAWH5hM&{Lc-+@bpWb+n%mO)-OfA9-R*#}Wgu4K-rK2PF>!`=HpoYbxyrBF!fxSSp_#M)kuu!hylNUOO0BU|Rb?ip*NqVWsVEB+ zjUPT5N-J}9>#n?~vmt+O+%QTDn*L)>wIdKx?$t=IL%`a&mx=r@6NP|<_5W&rK$Id5 zmX=;$FE~jUxf}*!}mN?A?!WFjON{|9+n*%0LPH$2|XQzW<*d$vU#qG}wsa z2Y{r;G``r3KOp{x6CnNrNg8G9(S(q{48cm?fSh z8Gc%Qd`AnZWbZ6ua}dx2MTG-Db@`MHxY{^9s$r1;s3Spz6(NoIw~p+RWDn>sv?6{* zsrI*iB#mMt##A0>1jUgJA4=pnrc8yT3b7_TA*G~5aHmAwXIyzwtk1ZthzMfBw0Ndk zq&I32rHQXu5@O{N2EN9Ru{*5flyhQtii)AvmbT}Z(~~*JM`_7xv~U1L56Ry$@+}%~ zH;QI)UuXjX-mc^jL2zeI`{H5S4qp4#Nu+O@^aS9aNMhYNx$k(FV+m=CN8{%B#(g3Z@VKbu$iVj0a34Y0vnDY6v zbc=G^>IjBzgK(@1i_WJCDk{mz>MEK+1sqTqTH4zF16PrTa6Nw(3dC5aEBsB#u^mD_ zmDVP#I=Bq=%d{)aw&*B`=(W;Ce0(Y#$(_G{^E%bDe=}d>a+w#B8C2p5952tW@b?lISq{zV``UI z{?$_v9@ZZj4s8B&B6^nSXd@#d?W+VV9gx@R>g=SB7l&p5^Pm>&xuJ7c5IDv~(dBn|i#TePmq(CQ`SqkX4_A4O34cltEb=sEe4=z8Trr zP=mG1s&r;z?4%8(8o_}GGp^-$2(5TDG&G-)pCW)YpQgzk8r8|f5A#Dve8ZD7Fg08{ z*fDJJ_as`k(Bi04Ko0M~5QAKOSUf2HEG+YInvQ^PlJ-jGvewqbF$0{O<1 z`t_kRqxD!#CMUaIDQTdGp9(@Am()uU$Ui=Wig=wTaM>yXYGE?9 zcEslxil9dX3egHy*@~-Vzi5Dq4f_sUF$`R@2Jx+5UmWot%mF>zllj8yqLRC78D_$V zmJe{6o4sU`rObN7HVTb7uyGc5mh-V`e9I{7g=3dlp@#4!8Bi8U=u!*EB~9FYH|pF| z|4^E}8q?a*-43XOcnNGAy{<;q81R*}l(cpsR>j4R5QdRF<`~eld3fBBI2cSJ{-$Jr}9dltfYL*>;c3SDC+C@wT3cad|F&hN~9zD7=1cXy|~R zYtn<)s-f_DDC_PTB|0W1iX-G_c&3HQluWJ)_Gh||`hd%;sEgyNBM?zvX%I4M+xl8# zmmWbopJ^EId@G%DRz}P0ZGuHPylVumM18`}e&4Ib5DpMyY!BgJw{N&~thzFE`S|HA zU~_$%{qI#B-=vczp2?5#{*p7<$GcMn9KmAi`Kw>O#>2cOoLgBxQ_|8pyxuqMiM{_u zH#T!NfrD!J=sUnf0o5!pv0~HQJ+PCiK|f7U#{6xULa%h=8O* z;+eU*Icly+A{((9AYP)2NF6M4!fZx6n6yj2u{VN=ZqR zU`)W*!yFHH7Y<#3tH^7=00VmPNe#KzKu#FwmoUfCd3LUx>xIv5-UlM2{A2+LV(QBX zj$CWiLf#MkU*X*H@&DFV=o%w9{h`ht{-7l;Y8AWwazf{((Z0vWFYwB@b6JbNz~)0g zv8vUPH*ebOyo8r|GRYEw#Q%+ULgil6F!ad`_J2=1VR*5yC$$L=A+`*rO%FNk;TaCQ zJ(+ezoe#|0yVp}#GUaEBT(QDRmHK}%q?$vxzK^$Fna`Z%*Y7I() zq5Nq4tatW@z`v9VdKnP*|7#fpBINj>itT3M6`SZO`f;`!gV^~62`pjSGs%|&CCvyJ zXWuBQrvtoBEbPVH%-x0qTma07(e1q@@MB7JHS~YFUuBj}@Ucz=i zW{x1D$9Z@34a9^Cqf}y@I(}z6-BcffZ(46Glnt(4u}wXqX2@vegPD84mFS=CApgFO zp-WB)Ahw)2-7or%VC&|Kc;>sIRNMT7I|I1bOZ3jq#ta4G$mSehgzS84|ikvPAo%xyWXb?kZk8Hv3bpFYS zm!cI1&_=s3;JqEkzY2l9np&xzAD92=h$A4Y^1!qC@8(iK88?BG2{tTj!mm3EKIbd* zw0aFY`zQ%+s6__h|5gO(pP5{=L#6!Y<;b9jPrWgx2ky*ZQr4yP)GZ7D?0eqj$`|kK z=ENV|FFp5rWeLSPD#z~|j1d}KA;u>P`+mqj3+q`dkasx{gx7nUXcn|xkMcg&L*Fl@v$_`^%KDzJ@2Ws29 zYka4Ag<_fKTtKf`lO(%)wFOBQSJn!VWH{d4AOv!>lhbWkHfmBm)bW(~-T=+@o1B3< z#rh6TNSCWGK0};`=X7v*C#z^XCAxeJPmL$=dIgjkU0?m+vowc=|Jy)zKa*Zfzq}#is5rzU1`hN zawQQQgph$4`RDiOXduv|g5YC}J2M&uGz24N%Bc>VvSwtMA?3CCSXZZi=2gRQe7wLL zs&;xjNKSQ#4lH5A13fkL@{);bY%=UMw2Xdcl%s*TNTuBn-^((={e|~!G z@>eMu@-rAAj^`iTR=ZpIwPgL=fTBQe<&z5~oZlkZoS%L8M z^mKW?*K54K58_%3zQ7 z_}B&Pnb=*%6>YHLK!$mSx^-x0ni3#U2M%v(>Ris~vYh8j;?0JVhu1(cG`WMh9f>o> z;|v7A53f#L7Z+}QCL3#SlU(pYEWoy;pNJkQ*c zM6<`Ir@Niu$Bp|q*TgL&6Eev^tRi9?6DF@zwr7FRg_yfwx0J(u#x7XO_xf=4xpZ>X zgR_|v(QUY;oLBGw?IsBlm%5A>Gh!SJ2MA=GZ^*cwK4WV5inFu3-IkFtJK6l5$j;5D zc$wKz@N6#dVHi!-q6qruD~ylc9!d&t6#*HoIbS9fxh=P@=({Na8yg)(jO#^8pN%~V zB6D;!RdabkW&O@da=wLjdvhj2T)gcQO`$cj-b5Va{2N@dk6KN=8xCg!68AX~56Y2{ zX-vfb%tyO|$3PmGi8aNuhzWZ;f=G8p?LT{iunVjS&>_?sx z8jm}m6yjhe#$Koi@1~L+c27DrIrB}{K zxZ8Un&@Cx1FXTwoR#s=$gPba!l+;YQu?xRYuS=1>kRRpRK$J211nueA4Huw$(fRh7 z@6-eU&k7Ro18Kzkp<@$k?d{72kna0fNAwpyBtAsB zuW??P5XtBBs8ci+GDHszx$-^_U33r}nI1)KoYntS5donW6p6U7BtHGk+>~q(;8OrX69F2S#Kbp!=D^e_V^dRX9_J%<3fPXTk%b(U>uz}4 zx5?q@X~eP#P*4@RazWlG0GbpF3k%42`^=B(cm-qKg(E`Tsf)DP2gpUs(0p6TMB~uD z2*I)^iFu##f$}HW>`MCiMUt83d9RmI@uECNF$Uzdm(-y`c7CM6mZd412K@s_n2W~VO zBMu@S!qZ{{i*l5evx^>K{(bNURJji^iDd$EGy&1uM@q5i09jPV=g3F$N6sIJ@Sn#6 z>rX35Moc|t3p~Z~by;O)^x=vN#VL3|W)l7LQINlWV6iy^8QEPTCPiO2J0Nvk(y<;bqE^z#^mMR46zjWjh;cP2hU5XsLFVkW zN;Z;vVC7|e)(dW%Zfx0Dk+9Q7G2DN0vTbWF?VHDKiw;hDOcWnVw={h3oWVmqeXECT zNs+@ZAHW6aUyP34(n07ED!UQC=d|rO-Dl$)E>20we?So|ZR+qZku69arA^660Uvn} z{HYTm-9HFNkc#=g$uUyh1wmT+$NObgeaWZE`VBrCF_{PuAd<92+appZB}ib9Zz!ch z*jE?{!6z75yMepy1(+s~*~2O6wMxAU7Zd%w)C|p}rK{s!(T9g)!xR0k9!1vwUh=!Z zj;tqsSUB^I|6s}ELUTU>BkIGblx}C)YJE&~Rb<(vQgFd*s+?Dh+)qjoSQsH~T?b_Q({8P? zu|8q=Hr6s(4+9OI)8Uojn?E~_k&StlHB(Z%;PpgxS8gpKH85IyJ<^1Yds`H*7hr($ z?6{{eNwrAza1$O{<`K@FZ_IbjdpyRyS)+^O2>D(w~mW|^f!QEm>LuH8i;$Z5Z^PXBYF6#e*&&V1JC;&0`gbF<)QSq z_WL&XbZOnuA~cdCsPA~!`@G71r_q2+4>iFGSe5$w-V?noQo5(&YDnyr(O^_u$4hZC z$&#j+fN^3Wp%Dx)eDfX79S)ED7dtBPk5knSg>(Vm!vCHUe}jybdZ3{y= zRd6u)Y9-!o=M2zugW`@cafxIu+!}8_S$Z5;b`O@`kK%tgx)A*ak05d4MR5cbF<%`z z=e(lN;jWD2@DJ~^{PCKyo~#A$FZ;B7Pd;vLvO=Hl9yoHSgvS78Q}XKnWE&AaI|SLXWm5H?+SSVpvj z-Ck&huK#GYy^Kg+3Q+?`iF@p-D;TEnU9VrhF^n}w<}(6IPUOHXjHld{#(!@hs>&iy zni>-Cary#~fmnc;4M}>zbhMoqZ{x})qaZp7KrS;JZR3B&^Tv#o znimHySLQzu{7iR^9vKuTb?Ae$8|Q=DwjO_*yjON!=h^IdEJ-{4YjtZA(SI9yhqmo@ zP5GJ5o3y*%(e(D9mE(y=Iq&WCd!v0>s9EzRCfVggi4hMUC0Sd8$t%9AZ$0DORuIj! z)RN;#V56sC$Th4rcxTtXSm;V;cS2|2s|x?E{l53%{A{7fvgR9>pfNcH=cGO8Bq4w zi9h3RJ6l0#IsC_Sk(7TZlEk;tpw7AL zmHIwZi9G}m)%mwdeKce z2n$S>FS*5rM@Iq9;gO;ptaa^71MP(XzO2>phJvm0#bMA^&DLS@{hn(_HGW#JY-*tzcVN=-!6}PvPIav6)el_3D)U;*3;@NZOX2TC?TzBixvQZpitib zE&xgX`sh1fgD8d4rc7=Byn~4v5&egJt&HV%ys;&XWHr0`#2m*=S5duXPn^+rv^_}u zSK|zpFKkxpi%adBDfvvkmn|MvJg0o_wfz7xxzCRMiSp{vJLpw*9wChOO17*P(81m9 zz1b~C>yK%Z$-TX;3Xvhi7A${!?0_|Y7wF>{(dISm+>BI%r=1%7KG;8>oY{E^pUmjQ zGwJD2_D=t)Fiw>M&LWAcZy-J0guaFSbk@?F_k31taX~p=(h~YErrC2Qro;Y0uf7OO zhuWKpG|nDoG7mp-6**=DN(I*qv8zS<_UWT;l0`De4^!-DRJOG)$2)cP}J=DDKLtOfq@D=pI!o`XP1me_dk)={3L9C+3AgzPvwZ^f@@e6Z@2*64B~+@n}xao56K^`eY`b=SQbl zj3@hC$~kAa!MC42?~a_Go^2K4&?WY{@3_w3y-IBDw)WW!=`}8L+BlBjciMH;DMR2# zM6hA{5#U>d*Du5Qy(dlsie` z7b5MPr;c(%4Sfj>P;>pET~ZOwujPrZ{Acq}Rrlrs2H%Z!uia~g&+_0m-yr2#wAUQg ziPFT;DautHXcQOAQVaXe3AHNwLr^nD&Tq_rDb7VtiP_0XcWq}ThLE+N?(a!)Skvu9 zP0!toJa1~o(Fmqn(l(1RDryZQIsx~Gz|Pd0PSh22LJ#7 literal 0 HcmV?d00001 diff --git a/tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_enhancement_performance_scheme.png b/tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_enhancement_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..a21caea16f4ee0852be47c3e56b32d184f06a7de GIT binary patch literal 31509 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 RgFZlX?igs4-?|_6zX0Ch%qIW< literal 0 HcmV?d00001 diff --git a/tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_loading_performance_scheme.png b/tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_loading_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..fd32feee9d720141fc1bfcf3bb03cd40363316e6 GIT binary patch literal 33037 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 E0c)>4VgLXD literal 0 HcmV?d00001 diff --git a/tutorials/notebook/optimize_the_performance_of_data_preparation/images/operator_fusion.png b/tutorials/notebook/optimize_the_performance_of_data_preparation/images/operator_fusion.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3a88cfb04825f7469e76bcd48988a596ce222d GIT binary patch literal 13115 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 E2NX4SPXGV_ literal 0 HcmV?d00001 diff --git a/tutorials/notebook/optimize_the_performance_of_data_preparation/images/pipeline.png b/tutorials/notebook/optimize_the_performance_of_data_preparation/images/pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb3f3defd20eb700c0e16d6dff5d57a1d2007c9 GIT binary patch literal 5841 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 NT}4~DO7Zo({{ToLH~9bn literal 0 HcmV?d00001 diff --git a/tutorials/notebook/optimize_the_performance_of_data_preparation/images/shuffle_performance_scheme.png b/tutorials/notebook/optimize_the_performance_of_data_preparation/images/shuffle_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..d09ca3dda379502827d58c1269599fa4381cbf76 GIT binary patch literal 18160 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优化数据准备的性能" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 概述\n", + "\n", + "数据是整个深度学习中最重要的一环,因为数据的好坏决定了最终结果的上限,模型的好坏只是去无限逼近这个上限,所以高质量的数据输入,会在整个深度神经网络中起到积极作用,数据在整个数据处理和数据增强的过程像经过pipeline管道的水一样,源源不断地流向训练系统,如图所示:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/images/pipeline.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "MindSpore为用户提供了数据处理以及数据增强的功能,在数据的整个pipeline过程中,其中的每一步骤,如果都能够进行合理的运用,那么数据的性能会得到很大的优化和提升。本次体验将基于CIFAR-10数据集来为大家展示如何在数据加载、数据处理和数据增强的过程中进行性能的优化。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 整体流程\n", + "- 准备环节。\n", + "- 数据加载性能优化。\n", + "- shuffle性能优化。\n", + "- 数据增强性能优化。\n", + "- 性能优化方案总结。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 准备环节" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 导入模块" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`dataset`模块提供API用来加载和处理数据集。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import mindspore.dataset as ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`numpy`模块用于生成ndarray数组。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 下载所需数据集" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. 在jupyter工作目录下创建`./dataset/Cifar10Data`目录,本次体验所用的数据集存放在该目录下。\n", + "2. 在jupyter工作目录下创建`./transform`目录,本次体验转换生成的数据集存放在该目录下。\n", + "3. 下载[CIFAR-10二进制格式数据集](https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz),并将数据集文件解压到`./dataset/Cifar10Data/cifar-10-batches-bin`目录下,数据加载的时候使用该数据集。\n", + "4. 下载[CIFAR-10 Python文件格式数据集](https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz),并将数据集文件解压到`./dataset/Cifar10Data/cifar-10-batches-py`目录下,数据转换的时候使用该数据集。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "目录结构如下所示:\n", + "\n", + "\n", + " dataset/Cifar10Data\n", + " ├── cifar-10-batches-bin\n", + " │   ├── batches.meta.txt\n", + " │   ├── data_batch_1.bin\n", + " │   ├── data_batch_2.bin\n", + " │   ├── data_batch_3.bin\n", + " │   ├── data_batch_4.bin\n", + " │   ├── data_batch_5.bin\n", + " │   ├── readme.html\n", + " │   └── test_batch.bin\n", + " └── cifar-10-batches-py\n", + " ├── batches.meta\n", + " ├── data_batch_1\n", + " ├── data_batch_2\n", + " ├── data_batch_3\n", + " ├── data_batch_4\n", + " ├── data_batch_5\n", + " ├── readme.html\n", + " └── test_batch\n", + "\n", + "其中:\n", + "- `cifar-10-batches-bin`目录为CIFAR-10二进制格式数据集目录。\n", + "- `cifar-10-batches-py`目录为CIFAR-10 Python文件格式数据集目录。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 数据加载性能优化" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "MindSpore为用户提供了多种数据加载方式,其中包括常用数据集加载、用户自定义数据集加载、MindSpore数据格式加载,详情内容请参考[加载数据集](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/loading_the_datasets.html)。对于数据集加载,底层实现方式的不同,会导致数据集加载的性能存在差异,如下所示:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| | 常用数据集 | 用户自定义 | MindRecord |\n", + "| :----: | :----: | :----: | :----: |\n", + "| 底层实现 | C++ | Python | C++ |\n", + "| 性能 | 高 | 中 | 高|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 性能优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_loading_performance_scheme.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "数据加载性能优化建议如下:\n", + "- 已经支持的数据集格式优选内置加载算子,具体内容请参考[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html),如果性能仍无法满足需求,则可采取多线程并发方案,请参考本文[多线程优化方案](#多线程优化方案)。\n", + "- 不支持的数据集格式,优选转换为MindSpore数据格式后再使用`MindDataset`类进行加载,具体内容请参考[将数据集转换为MindSpore数据格式](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/converting_datasets.html),如果性能仍无法满足需求,则可采取多线程并发方案,请参考本文[多线程优化方案](#多线程优化方案)。\n", + "- 不支持的数据集格式,算法快速验证场景,优选用户自定义`GeneratorDataset`类实现,如果性能仍无法满足需求,则可采取多进程并发方案,请参考本文[多进程优化方案](#多进程优化方案)。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 代码示例\n", + "\n", + "基于以上的数据加载性能优化建议,本次体验分别使用内置加载算子`Cifar10Dataset`类、数据转换后使用`MindDataset`类、使用`GeneratorDataset`类进行数据加载,代码演示如下:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. 使用内置算子`Cifar10Dataset`类加载CIFAR-10数据集,这里使用的是CIFAR-10二进制格式的数据集,加载数据时采取多线程优化方案,开启了4个线程并发完成任务,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'image': array([[[235, 235, 235],\n", + " [230, 230, 230],\n", + " [234, 234, 234],\n", + " ...,\n", + " [248, 248, 248],\n", + " [248, 248, 248],\n", + " [249, 249, 249]],\n", + "\n", + " [[216, 216, 216],\n", + " [213, 213, 213],\n", + " [215, 215, 215],\n", + " ...,\n", + " [254, 254, 254],\n", + " [253, 253, 253],\n", + " [253, 253, 253]],\n", + "\n", + " [[213, 213, 213],\n", + " [217, 217, 217],\n", + " [215, 215, 215],\n", + " ...,\n", + " [255, 255, 255],\n", + " [254, 254, 254],\n", + " [254, 254, 254]],\n", + "\n", + " ...,\n", + "\n", + " [[195, 195, 195],\n", + " [200, 200, 200],\n", + " [202, 202, 202],\n", + " ...,\n", + " [138, 138, 138],\n", + " [143, 143, 143],\n", + " [172, 171, 176]],\n", + "\n", + " [[205, 205, 205],\n", + " [205, 205, 205],\n", + " [211, 211, 211],\n", + " ...,\n", + " [112, 112, 112],\n", + " [130, 130, 132],\n", + " [167, 163, 184]],\n", + "\n", + " [[210, 210, 210],\n", + " [209, 209, 209],\n", + " [213, 213, 213],\n", + " ...,\n", + " [120, 120, 119],\n", + " [146, 146, 146],\n", + " [177, 174, 190]]], dtype=uint8), 'label': array(9, dtype=uint32)}\n" + ] + } + ], + "source": [ + "cifar10_path = \"./dataset/Cifar10Data/cifar-10-batches-bin/\"\n", + "\n", + "# create Cifar10Dataset for reading data\n", + "cifar10_dataset = ds.Cifar10Dataset(cifar10_path,num_parallel_workers=4)\n", + "# create a dictionary iterator and read a data record through the iterator\n", + "print(next(cifar10_dataset.create_dict_iterator()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. 使用`Cifar10ToMR`这个类将CIFAR-10数据集转换为MindSpore数据格式,这里使用的是CIFAR-10 python文件格式的数据集,然后使用`MindDataset`类加载MindSpore数据格式数据集,加载数据采取多线程优化方案,开启了4个线程并发完成任务,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'data': array([255, 216, 255, ..., 63, 255, 217], dtype=uint8), 'id': array(30474, dtype=int64), 'label': array(2, dtype=int64)}\n" + ] + } + ], + "source": [ + "from mindspore.mindrecord import Cifar10ToMR\n", + "\n", + "cifar10_path = './dataset/Cifar10Data/cifar-10-batches-py/'\n", + "cifar10_mindrecord_path = './transform/cifar10.record'\n", + "\n", + "cifar10_transformer = Cifar10ToMR(cifar10_path,cifar10_mindrecord_path)\n", + "# executes transformation from Cifar10 to MindRecord\n", + "cifar10_transformer.transform(['label'])\n", + "\n", + "# create MindDataset for reading data\n", + "cifar10_mind_dataset = ds.MindDataset(dataset_file=cifar10_mindrecord_path,num_parallel_workers=4)\n", + "# create a dictionary iterator and read a data record through the iterator\n", + "print(next(cifar10_mind_dataset.create_dict_iterator()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3. 使用`GeneratorDataset`类加载自定义数据集,并且采取多进程优化方案,开启了4个进程并发完成任务,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'data': array([0], dtype=int64)}\n" + ] + } + ], + "source": [ + "def generator_func(num):\n", + " for i in range(num):\n", + " yield (np.array([i]),)\n", + "\n", + "# create GeneratorDataset for reading data\n", + "dataset = ds.GeneratorDataset(source=generator_func(5),column_names=[\"data\"],num_parallel_workers=4)\n", + "# create a dictionary iterator and read a data record through the iterator\n", + "print(next(dataset.create_dict_iterator()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## shuffle性能优化" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "shuffle操作主要是对有序的数据集或者进行过repeat的数据集进行混洗,MindSpore专门为用户提供了`shuffle`函数,其中设定的`buffer_size`参数越大,混洗程度越大,但时间、计算资源消耗也会大。该接口支持用户在整个pipeline的任何时候都可以对数据进行混洗,具体内容请参考[shuffle处理](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/data_processing_and_augmentation.html#shuffle)。但是因为底层的实现方式不同,该方式的性能不如直接在[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html)中设置`shuffle`参数直接对数据进行混洗。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 性能优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/images/shuffle_performance_scheme.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "shuffle性能优化建议如下:\n", + "- 直接使用内置加载算子的`shuffle`参数进行数据的混洗。\n", + "- 如果使用的是`shuffle`函数,当性能仍无法满足需求,可通过调大`buffer_size`参数的值来优化提升性能。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 代码示例\n", + "\n", + "基于以上的shuffle性能优化建议,本次体验分别使用内置加载算子`Cifar10Dataset`类的`shuffle`参数和`Shuffle`函数进行数据的混洗,代码演示如下:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. 使用内置算子`Cifar10Dataset`类加载CIFAR-10数据集,这里使用的是CIFAR-10二进制格式的数据集,并且设置`shuffle`参数为True来进行数据混洗,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'image': array([[[254, 254, 254],\n", + " [255, 255, 254],\n", + " [255, 255, 254],\n", + " ...,\n", + " [232, 234, 244],\n", + " [226, 230, 242],\n", + " [228, 232, 243]],\n", + "\n", + " [[251, 251, 251],\n", + " [253, 253, 254],\n", + " [255, 255, 255],\n", + " ...,\n", + " [225, 227, 235],\n", + " [227, 231, 241],\n", + " [229, 233, 243]],\n", + "\n", + " [[250, 250, 250],\n", + " [251, 251, 251],\n", + " [253, 253, 253],\n", + " ...,\n", + " [233, 235, 241],\n", + " [233, 236, 245],\n", + " [238, 242, 250]],\n", + "\n", + " ...,\n", + "\n", + " [[ 67, 64, 71],\n", + " [ 65, 62, 69],\n", + " [ 64, 61, 68],\n", + " ...,\n", + " [ 71, 67, 70],\n", + " [ 71, 68, 70],\n", + " [ 69, 65, 68]],\n", + "\n", + " [[ 62, 58, 64],\n", + " [ 59, 55, 61],\n", + " [ 61, 58, 64],\n", + " ...,\n", + " [ 64, 62, 64],\n", + " [ 61, 58, 59],\n", + " [ 62, 60, 61]],\n", + "\n", + " [[ 66, 60, 65],\n", + " [ 64, 59, 64],\n", + " [ 66, 60, 65],\n", + " ...,\n", + " [ 64, 61, 63],\n", + " [ 63, 58, 60],\n", + " [ 61, 56, 58]]], dtype=uint8), 'label': array(9, dtype=uint32)}\n" + ] + } + ], + "source": [ + "cifar10_path = \"./dataset/Cifar10Data/cifar-10-batches-bin/\"\n", + "\n", + "# create Cifar10Dataset for reading data\n", + "cifar10_dataset = ds.Cifar10Dataset(cifar10_path,shuffle=True)\n", + "# create a dictionary iterator and read a data record through the iterator\n", + "print(next(cifar10_dataset.create_dict_iterator()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. 使用`shuffle`函数进行数据混洗,参数`buffer_size`设置为3,数据采用`GeneratorDataset`类自定义生成。" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "before shuffle:\n", + "[0 1 2 3 4]\n", + "[1 2 3 4 5]\n", + "[2 3 4 5 6]\n", + "[3 4 5 6 7]\n", + "[4 5 6 7 8]\n", + "after shuffle:\n", + "[2 3 4 5 6]\n", + "[0 1 2 3 4]\n", + "[4 5 6 7 8]\n", + "[1 2 3 4 5]\n", + "[3 4 5 6 7]\n" + ] + } + ], + "source": [ + "def generator_func():\n", + " for i in range(5):\n", + " yield (np.array([i,i+1,i+2,i+3,i+4]),)\n", + "\n", + "ds1 = ds.GeneratorDataset(source=generator_func,column_names=[\"data\"])\n", + "print(\"before shuffle:\")\n", + "for data in ds1.create_dict_iterator():\n", + " print(data[\"data\"])\n", + "\n", + "ds2 = ds1.shuffle(buffer_size=3)\n", + "print(\"after shuffle:\")\n", + "for data in ds2.create_dict_iterator():\n", + " print(data[\"data\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 数据增强性能优化" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在图片分类的训练中,尤其是当数据集比较小的时候,用户可以使用数据增强的方式来预处理图片,从而丰富数据集。MindSpore为用户提供了多种数据增强的方式,其中包括:\n", + "- 使用内置C算子(`c_transforms`模块)进行数据增强。\n", + "- 使用内置Python算子(`py_transforms`模块)进行数据增强。\n", + "- 用户可根据自己的需求,自定义Python函数进行数据增强。\n", + "\n", + "具体的内容请参考[数据增强](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/data_processing_and_augmentation.html#id3)。因为底层的实现方式不同,所以性能还是有一定的差异,如下所示:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 模块 | 底层接口 | 说明 |\n", + "| :----: | :----: | :----: |\n", + "| c_transforms | C++(基于OpenCV)| 性能高 |\n", + "| py_transforms | Python(基于PIL) | 该模块提供了多种图像增强功能,并提供了PIL Image和Numpy数组之间的传输方法 |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 性能优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/images/data_enhancement_performance_scheme.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "数据增强性能优化建议如下:\n", + "- 优先使用`c_transforms`模块进行数据增强,因为性能最高,如果性能仍无法满足需求,可采取[多线程优化方案](#多线程优化方案)、[Compose优化方案](#Compose优化方案)或者[算子融合优化方案](#算子融合优化方案)。\n", + "- 如果使用了`py_transforms`模块进行数据增强,当性能仍无法满足需求,可采取[多线程优化方案](#多线程优化方案)、[多进程优化方案](#多进程优化方案)、[Compose优化方案](#Compose优化方案)或者[算子融合优化方案](#算子融合优化方案)。\n", + "- `c_transforms`模块是在C++内维护buffer管理,`py_transforms`模块是在Python内维护buffer管理。因为Python和C++切换的性能成本,建议不要混用算子。\n", + "- 如果用户使用了自定义Python函数进行数据增强,当性能仍无法满足需求,可采取[多线程优化方案](#多线程优化方案)或者[多进程优化方案](#多进程优化方案),如果还是无法提升性能,就需要对自定义的Python代码进行优化。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 代码示例\n", + "\n", + "基于以上的数据增强性能优化建议,本次体验分别使用`c_transforms`模块和自定义Python函数进行了数据增强,演示代码如下所示:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. 使用`c_transforms`模块进行数据增强,数据增强时采用多线程优化方案,开启了4个线程并发完成任务,并且采用了算子融合优化方案,使用`RandomResizedCrop`融合类替代`RandomResize`类和`RandomCrop`类。" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import mindspore.dataset.transforms.c_transforms as c_transforms\n", + "import mindspore.dataset.transforms.vision.c_transforms as C\n", + "import matplotlib.pyplot as plt\n", + "cifar10_path = \"./dataset/Cifar10Data/cifar-10-batches-bin/\"\n", + "\n", + "# create Cifar10Dataset for reading data\n", + "cifar10_dataset = ds.Cifar10Dataset(cifar10_path,num_parallel_workers=4)\n", + "transforms = C.RandomResizedCrop((800,800))\n", + "# apply the transform to the dataset through dataset.map()\n", + "cifar10_dataset = cifar10_dataset.map(input_columns=\"image\",operations=transforms,num_parallel_workers=4)\n", + "\n", + "data = next(cifar10_dataset.create_dict_iterator())\n", + "plt.imshow(data[\"image\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. 使用自定义Python函数进行数据增强,数据增强时采用多进程优化方案,开启了4个进程并发完成任务。" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "before map:\n", + "[0 1 2 3 4]\n", + "[1 2 3 4 5]\n", + "[2 3 4 5 6]\n", + "[3 4 5 6 7]\n", + "[4 5 6 7 8]\n", + "after map:\n", + "[ 0 1 4 9 16]\n", + "[ 1 4 9 16 25]\n", + "[ 4 9 16 25 36]\n", + "[ 9 16 25 36 49]\n", + "[16 25 36 49 64]\n" + ] + } + ], + "source": [ + "def generator_func():\n", + " for i in range(5):\n", + " yield (np.array([i,i+1,i+2,i+3,i+4]),)\n", + "\n", + "ds3 = ds.GeneratorDataset(source=generator_func,column_names=[\"data\"])\n", + "print(\"before map:\")\n", + "for data in ds3.create_dict_iterator():\n", + " print(data[\"data\"])\n", + "\n", + "func = lambda x:x**2\n", + "ds4 = ds3.map(input_columns=\"data\",operations=func,python_multiprocessing=True,num_parallel_workers=4)\n", + "print(\"after map:\")\n", + "for data in ds4.create_dict_iterator():\n", + " print(data[\"data\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 性能优化方案总结" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 多线程优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在数据pipeline过程中,相关算子一般都有线程数设置参数,来提升处理并发度,提升性能,例如:\n", + "- 在数据加载的过程中,内置数据加载类有`num_parallel_workers`参数用来设置线程数。\n", + "- 在数据增强的过程中,`map`函数有`num_parallel_workers`参数用来设置线程数。\n", + "- 在Batch的过程中,`batch`函数有`num_parallel_workers`参数用来设置线程数。\n", + "\n", + "具体内容请参考[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html)。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 多进程优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "数据处理中Python实现的算子均支持多进程的模式,例如:\n", + "- `GeneratorDataset`这个类默认是多进程模式,它的`num_parallel_workers`参数表示的是开启的进程数,默认为1,具体内容请参考[GeneratorDataset](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html#mindspore.dataset.GeneratorDataset)。\n", + "- 如果使用Python自定义函数或者`py_transforms`模块进行数据增强的时候,当`map`函数的参数`python_multiprocessing`设置为True时,此时参数`num_parallel_workers`表示的是进程数,参数`python_multiprocessing`默认为False,此时参数`num_parallel_workers`表示的是线程数,具体的内容请参考[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html)。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compose优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Map算子可以接收Tensor算子列表,并将按照顺序应用所有的这些算子,与为每个Tensor算子使用的Map算子相比,此类“胖Map算子”可以获得更好的性能,如图所示:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/images/compose.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 算子融合优化方案" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "提供某些融合算子,这些算子将两个或多个算子的功能聚合到一个算子中。具体内容请参考[数据增强算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.transforms.vision.html),与它们各自组件的流水线相比,这种融合算子提供了更好的性能。如图所示:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![title](https://gitee.com/mindspore/docs/raw/r0.7/tutorials/notebook/optimize_the_performance_of_data_preparation/images/operator_fusion.png)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/notebook/quick_start.ipynb b/tutorials/notebook/quick_start.ipynb index e56f9cd1..399e8b8c 100644 --- a/tutorials/notebook/quick_start.ipynb +++ b/tutorials/notebook/quick_start.ipynb @@ -34,7 +34,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "说明:
你可以在这里找到完整可运行的样例代码:。" + "说明:
你可以在这里找到完整可运行的样例代码:。" ] }, { @@ -470,7 +470,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"LeNet5\"" + "\"LeNet5\"" ] }, { diff --git a/tutorials/notebook/synchronization_training_and_evaluation.ipynb b/tutorials/notebook/synchronization_training_and_evaluation.ipynb index 236ae433..43a4b2ef 100644 --- a/tutorials/notebook/synchronization_training_and_evaluation.ipynb +++ b/tutorials/notebook/synchronization_training_and_evaluation.ipynb @@ -208,7 +208,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "实现思想:每隔n个epoch验证一次模型精度,由于在自定义函数中实现,如需了解自定义回调函数的详细用法,请参考[API说明](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.train.html?highlight=callback#mindspore.train.callback.Callback)。\n", + "实现思想:每隔n个epoch验证一次模型精度,由于在自定义函数中实现,如需了解自定义回调函数的详细用法,请参考[API说明](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.train.html?highlight=callback#mindspore.train.callback.Callback)。\n", "\n", "核心实现:回调函数的`epoch_end`内设置验证点,如下:\n", "\n", diff --git a/tutorials/source_zh_cn/advanced_use/images/cifar10_c_transforms.png b/tutorials/source_zh_cn/advanced_use/images/cifar10_c_transforms.png new file mode 100644 index 0000000000000000000000000000000000000000..10dc267dc650764566f6d20b7f090e20c12f8e11 GIT binary patch literal 46693 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 literal 0 HcmV?d00001 diff --git a/tutorials/source_zh_cn/advanced_use/images/data_enhancement_performance_scheme.png b/tutorials/source_zh_cn/advanced_use/images/data_enhancement_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..a21caea16f4ee0852be47c3e56b32d184f06a7de GIT binary patch literal 31509 zcmdqJby!@@*CpCOaJS&D!QI_GxVyW%y9Rd%5Zo<5kl-!>g1bZT;BNQuzQ1o~zL|Uf zpXc_|JWY3>s#8^`_S$Q&y-!CeDo7&2;lhDHAVg^?F=Y@4d=B_ygMk7*nXa6Z172Vq zrLwJex3-rA81h*bP)69gttc9kEzKliSG{-5u z{EAR^xDdJsILVoU?NA&6ueEh)4=lIu7UGfsw$2dV{%~k`#EzpeI|uzZS6l|KNjU zg;UV?fm8QB;JI@llx8;ky~} zrlgL(LwfG{yJ$;io3-)NVsu&}UT=HvTP zU(f8%LXTEJT~JX0r>3Tc-$7&iozBG6^aB|g*|T+XWQH8&qAf>CYHB$FTzRNp*F8)y zsB#W2dmO4mzt)`#cBHaMTL}XJ8QH|sGh@Uxar)4;th#zH+XmH{C#S{tfrXDSemOru z26!lHXh0WEmAO-=h@LzR$fJA!ItHHOwLgcmi@eRvq5S;(p4%coATu+wvfA4HGB?x& zGn|)~7e}5P>j)8CU}6=Ol|~Iqvq)jzzxd?^153%q#%B2_>ZWf>u271;wzei$_Nn{O zwV<>#f(#3CV&~!;@Sj5k#y4uX@bGZQ!)XeC6RqyWyH8(NP9;1%noHg&+45A8k&z2) zYvWzYEOQSJtz11kOw7$CP8F%)&CSh!udT%bA2x}SAmS1c?L!}f4|IN>8vg#Jvr_<= zbtQp}SeASRrg%@WY&sJgTai0;kx@fK!@=QU&+cx~a=s#zyn;f(&!5?9e$*x9<)8fP z7?@6;Qedk6b&8jY+Pb=kc6N5GBZR%Wk8cW^o6{YtAdP{g=;-Kpc8^A5;pL5q!D4jo zZv)kxsjv(V4NYxq)VgDnuw}lFnl-`I%_;_Zu43i?xFHf0S zK%l0)oH$FiB1eI$)K^hv)xPCJ znTpcV(o75`?XL=@CBWg^;Smw+E=EPqyN+B;JUkWd*eT?)&94enfK?f>WX>W{kN}%pMMWjUS-zW> zJKU-nT3+R>IXo_jChL^VF zV!#F>B9t^VN@boZsOA7%0bs*ALJ8&eNY*yZ-<>VqE3TTbr1A~QiWLr^ z`3IbH8|ScUv*62CxjZ@8(C6Rc;o*t8xi!&jY**x}^5Vw@;}r||{29q6`V0@zwNH*c}~oLMr^NyM0l@bS~9*tBa(XIsywi=;VCX(v)xhpG>J z^Dh^#dW{LDw9()ZeL+V@M_-$(y_NMM3ugla?!jv8^m1p4mbb9`dIur7Z5R#Y~i}-jvsnz_4T-_$;k26q$mFkD>;=O+ub&})e4iwX7&M>ju6rcYMkCT%of8SuVdnbbp_F_mvC` zBGUE!F+KdZuI|^){0!#wR@(3*kckEu{T~=!x5x5&3|{xrAspIYO*VYah;!f4IWOiS z{`UTe@C#VO$~<`syfLGFkN`SGtmrg z4m{kt)A2RJheri{ZL}gh4Se{`pzCDUL$RPuXQ`i+?4G>k+{&gQa#fseFd%=tV05-F zxQ*52i}m?+O{3mwCI{r}=P;7=C!zCgdaM@e(Y!@!A$a5E^)$i1`E)D7@!P zk?s#&hKHBxFu{)@@PQmp0tt(jt|b#Wz6g&|Qc;+nh3S+iLiQrp#uNcH(99RDdj z;9;+O^rp#XVe>k(fhqHgrQkvs0AuLUeMBw*%lzBvgZ@5~SX{Bk3{zxQqZ zSO(y_;VLtD{SK%~FW^gnV;WA5AGJdOyvAsCS&c!NHoo@XrxArWDRTw4@379Kn7joP zQ(G$RX#4?gTg|c4dxg+6oVSg8S8>)Tf$luos z@WZPCE;JCZ4GF%^Tm{ue^@Rn{^Ru#stO)w(9f6gigrv2s{Vht4aMg3-a+05X!r?D% z@#i&Uf&it^t|=;XWS+Z>@oY$(1%I|8EuTnVQ-Ow#I0wKGZuRxLRAXmO!ysbBv|od$ zjh4(U!Ha%afc;Srgn)Eyvh~n`!*9W}5O|q;=j4Bwu2^j>j6#3+BB$^cnN}x}JeK5t zF@c$zu`fChFNGl_u zlb_hV@ExG5pU;eU23L~psdBIz$rl0~$V5ZRj%4Zb(|();|4m#VSzH$RyTIScd*1N7 z4y;X5A9~bQ@liq8Nk6FNQ6VzhgAza4-Wb+9gde?53CN~{kZ@aeoqh{X0vLEvT6I1@)dgY7;FFeF7eCT&FPu(c$ONM_qABRzss3{FRI|%fP+YhvN*awePrlD z@X7l^^*TYO1)0DS!5#T9WHBjN}R9qIHQT_bQkQ(MSqW%`ihDo+`NIga4 zA;zmwz&yy4H!o4`l4AoGUBCyidHD4QoFNb~hJ=K)+NVXU%F82GR5){<=I{K1WqW?e z`<9I#=Tp^ahP6xPAgmj}m=aeQ#3{eF^KQ#XJ@9EW4y184{;W zx$xWLTQEg+Yo!h^D|7hUS$6hjW@dP2e{fi(!_c(P+h_UPH(m~bPz?jGk7j1YN~P{6 zOIN%gn3QF*(=oR<=)eh9D#d{FynK&=H{QuZ_HNzS*X&o?v_|tTT*c1o7tf!l;8AD# z87B`a{1!jLsBX2R>2X^BK2^l3?vME%S?YUpUlM6HW;GSn1gQ{h-U&WNd~I5|ZL&a< zDGM2S(hqHXz#}130!!XO%`3dl307SA>WJsPKwJXFbFu94r;FPnIe!-Jmz;_FXjm?? zKe8%EciUwHcPt5jh(}RTuv|Ilp0`8+_}_&R7r_4+vF}2l7}}8`cPo^fe$T8BwEokC zMshU0+QaX=3H75pXS#U_%|~0!#_s zdJ`T+eHF{O%P?LSTvoFVW7Kl{CtDkR6Vt(s^gv3@SSb=1ijj?e)J?z>eaaktc;D8r z6+%>WDlx0qgn@PY26n8(uZ+`?cy)^>Tt(v$;k@kTSKp(jsiLHQiAQeDMk~w_^7bg( z6Ewye&7b6hH0kM|M?7nuI)M=>lv+pGs*$re(B^vPCB^K`SbQg!9<}l*PUVnOYwqP+ zC4AdtdaVr%`Q*1xVz-3J;-IYg!qgvLeEv#zG5412W=CB;`U+lbcw@)8GgvDaJJ^H= zakuw)m(OwQ=T?4kr>?CPTmE>g#N*0xxNm-i%VgK}F%3>Snarqe5fp$J^H*xv5b8)gI%3br5^>!UG)qGdPI{Q&Zg;pC5rPC{5gB?)1azy@Ymt%cvp$6kUXqI9u(idVq<$@Z-VOExeDSa)uT5X z*%i`F#4ui6hRj)(0g?65C6Z6e)av^&*Od6xqEtVBDw8Pfi0IqV_j%4hr3@{BD5op@ zyxv?A?gX*CH`a3!W)>xTmz<%kkJMIgNTfPD>M29~418uEeJaZ7>Cv$S%t)t{cBGoo?HF6CHDUeF-$LT!-SkH9j);PZcb@@3 zPx1x<5>C$SAj|`KVy(rFAH~^NwQ-Y0@D`tY{STm-c%D?P zHXN$H_&s&puo(_Fl_B+ zf|zuRt`vQ~_krc)rpj%^r7b>AVx4Ly$?%ORz(>ugcj~eNB3PZ}RKeFD)SUTst zYu#C;?D#7(s7YRy>7W&&FgS8_qFF6Ucs`S<@lP##q9Vk@!rcx%9YSYL+4(-DbME=W zN|e9iXNe-Ot&5TZtJDGG5wGkD$~i!8?CTp*lN`3V=**HgyZ$uAY16dc4scvfHDQ!G z%RSt$GyJh(5wAGmQT-Z+7QLxzI{9>u7)Mx)<5oYT>NM%RG+>FiFB8KK* zWKwjjbl-mBtL!S>v}7BuUpoXyKv_nndR3p(GkHAtrg&6HI-{V_#g$UyFy&Ch=xp?Y z2%Vt6tU(*uyt&P4=$Linw$!q4y!+%aKcvjq zBAeVI8<<*_XKRgZ%;2789vRF=j%u2-Rx8$|0roG3>10P^1CB>sn&@K+#6cHSM&u;XdH4-=4AE5pHQm!CNhE z7ff6>f2UUcy2Z)Fq*!-VnZ!*wrI3B3!ByU$F-i9k{=eyNE@ecl`jC_hpf4H|1*VPg z1t;MLxuFM{p=`X6wKX52dk|_T5VWRE+KidaZO54Ow4p=DyLHvzZHf^e@z2sSV6hnW z0r6g$_sbWfjRh!n_1Dtg|E9hHiXOgw#K;ul)N%N3X6R;a=x%1Ph5@*iMYt`KXc|IB zg=TQ(ky*x%*`6|VMRh$ufGaLZJ~RxQze`p_cu_>e#KbJCRIyktJR+L|88$32ad4<7 z6wYlKk9){mw_d0}4<462Tt~4Ixck_9AjzdsN0(K7&;LFO1qg2C<>qpq^`XPdv-1itt%jBk{9~e+2amzklUldaf~;4h=qfwL6n7rJPnws=I{V0U0RolbQvE$ zO)=$9@Cl=+o<3z^0|rg2QG;>4dL$Qf0Ez+-=aCgkRZf{M!Jqtn zwcpaB{{ZSVrJ9CDVH*!8Z@5H3=6h1W)y=Kv)V-1b4l|HKHf?uqLT_N=)V;8w0ccqU zf(Z`%^T+)5jjsm~TaB5pf3L1q9c`PA%eA9@07FDX^kT*O(l}<{e1*t9iH!g?{&^w) zSy4r$?=?>n(C^X3l*B|uLyqSB*;0FOVUvEv>Cb$Hr}`J>H#&=Y_HSui~O# zh8v|~i>K~D8zGks1uKs7+lD3EXPHP+mP|R#MoZKUMfj8{%l-oK7{hlRJ&diay&Yd( zULJprPUz$bBQ~I-G_AzHU_EAy*#G3w~xtu3Q>z!^yU!y0=^qt7>(_*+{Wu6iYAUtb?K9-fJ_ z9yz(Rh?yBhMMVV{W|>rKYHE*h{d<@JB&HI~fFv2UB%mzW;9xP|zHF1jfLE#0+H&Zu z|Eiy?OgwV@KeA?pQ!s##1nXHPS$Y7WbedLA#gqWo-Nl9o2uFr00d%W>OJ3pc16ngiZ zdsvTys)kWeToDyPN*G2=2Syy(Kw|X$%1I~9BIQMvSu(@VfV9%Kfb15VDc?JwSB^~jpreLKLrZJO zggxu8C6+?myb?R51RX9ZLG06k?V+%FxrzBDF0N<@AwSOW#3C8Ns6B3kM1 zHzwBJa9C|mzg_B)Rc2V3^H_P0drnSP*$qwmgBtdEz(9Lu#hTNrp<(dWM)fHL`9@%p zwNa7Iq0&t9wZ2Ux5y|d}`1wCf$0q^~3RMetuL-#nfzZBmp+K z#4>TgHIVi$Y;MNtBSZ4_eP$aR%E942YjFW53UG#d|ARlWuKN?7T2@gZVrOS3G4WYU zY>K&Dy(hE5V#;lcRN<@jq&A+(j>7X{H+0z#HRHV|Bs%>@7(tJ{; zTwZMi8sU-+^Ap8E!n%*A#OnG#G3du*-jfSeP2yr=auqHzX=aVh%_bW`qK-Uz+*Vhk z=hUyRn-E+%3~Zd7M$#@W3dE1L&EZT%BN;YV>Cb#Msc3! zKviNkQqCcZF4){HpILmG_<26+Jh39^eL}9Atdh{dQqx*Ov44t=`SWU@*YR>ztIyWV*Kj&fd1Osl(yM{;>(a_dD@@?DRe$UP1%pk~5G01#f49;v_> zP)0+NOIOr@@A&i?*9BcMymN9@gd-!r2THpkUEkg9+#fbz6UFN-kzp-Qdi3ZTi+FkA z(9qBT+5WOkZhWM#c4tCQ4-8GBJ&PIWR0?_GT3R?C>B=;C@ktAUdqqmPHyyct&$%g` zGJ#KgJr)ai3tTor!3=v10{d!zrpWsxaH1v#n}|q-7XdiFFY$;D4;QyLEVr{Nr)$u@ z@5YW6qB)*GFsdhiD`PSy~V_qGBS;u$_u{#sJ61#D)DNZ@;r|KhTG~PUO51;BShTg^L9O5&EC|uRiTD8oz%x zIJp+B$O4qEfZ>-Tnqj$e9;c)6d9x9z($lXd*jfsQBWK?}uzT(G}g z+|5k&Ij?8wcEW4YjSGJfI1q$#abZbGsq6T&fz?|=Ou+sQfs)eXE`a!zop|PDV=pVz z!X41;q9UmU;#4g%7mmZm*m3S!$Rq(3t|<>3MAu;si_{)Koqx43yXfS%(j+~!_tgIXQkkzq#{>Oh#_WeGtx!eFZ+gip=bnpiQIRZBWOG`S(r9!aT~_-ae@74%R@*_o z9=-ZF{`K8&_e#ub_43<9^zbyr=vu$x0BznmyrFV#xRTj-9!lVIKQbfv-8+dmrKV-& z&s;2gPLb!47O^U)$nWQw|7X<33_%K1#plt$%HW!-X_YJ-8-DsEZQ1yE9znDPpVvk3 zb}_SdMd)+a5rW#a&hP%r7Dpf$izny@A<*;(YVmX~h;vnQR94pL_c6K;s#pqINKd44 z4ENU5k>x_5++9G-00P02AgYoCGqCKVqcXGe>L%wh&zKK0tgN4!T@L!EdxyCko7==vj@LbmnH_i z;K#?d6cdty{<(#Pe78e10KHsC_lHg29PI5w=d9(qKa!G0%PC^);eb9@5=iCq0_o)d z?=zIa!LJpA^}b7JtG|DM10<_rP*_#Y+nZs#(1c2LqoTc6J5I+zKW1+%y%HB1m14iC zwzg-Uh(L`OAv%O?j{Cdql5)$MeS60l|D22#z0UHN)atPeMf5#Q6%{fdjYn0o_Ur#6c5aq6a&f~sG^$)%H9qvw|ME4pr{EC7lYq>{}7&^Az{ z4GEN#h>C|{#$@9Pl8XYH6r9^QG~E;tSyOlun(R)2p|QaGSvil(L}07|Io=|jfYgF0o? zr>5qT=Nl6Mmlu=u(b!1^0^oxH%tZk5hT*JO3M^$Z?1HWfBETGIs`fIRCO1Vq7~6av znb>o@J01bw-N?q7pP!HPQTEeE4!S_<@6I%+N(@Zp>WS3R02GJPjR9O$e5cpjvqS&O z=N2X|Pe{O(0dHE?8XPAljNRt}M-B~eybcBE90d_IGf3+bpioMiSO(2jO$~5sp}9Yc zQLSoa~uXV4{V3r<9ZZr8_YAVglZzguM&s*ULR7C|mur>0i$ zW6%RJft=vv)*7hSV#=f>9c8AR!zGR;1(-09jE4LtI{YNZklWuM3g6IRPaO>o*}W)) zOmmd=jXIDT?)M=gbyEgFbCdv%lM~maP~d9{M1(pzA!Yq&GLhC6h*zk(E`_){f4~`aJ}w(hyZD z(yH&F0T5vUu>!{#vpz&*WMj+*GTM9TU~!Z*`#&XwSsAM6|95`iY7H#}u#FqPXDZJU zy`Ysf=l}@N@AMR-o|`-+S~_6A^%Z4BO7*S3Z3zmYP=Ep_EC;tVIuSvNrZ{(R=Yd)I zs7fC%AlzP!l;y>WjDU~$+i!2!N$y}#&Qpm9ls=J?jzao>n-G+%V2{gFjj}wBkDH*F z4-Tw-#zVI*5E(+AeUSVw0D%#|of)!6@>LEag$VY%k@QzCelEVw37qy20V3=P0I1M9 z9p5;b`i6N$`ej=>0k4X>WY!U4 z%w;U4Sq3kZ4r3+(ME6G;uYqK~BbypsVqz&8?e?BelS1y-kbjlUbQmo$!XBhoBi4ElYoG_m@7r5%fH*GTs(1$;3$x9_OS9Y z^_Pks+4)yN&{XG#q>eCn9JN8sdJgxRTQ4StK=bt_EXyM_WQ7 zFN-of!!Gvh=<{)DXLVj3Ud=v60eE zh7Q4Z#kG+3$An%4Jtpch3qwE#8ppe{PcUNouJi1E$fNJ-#m9I5dz0|;BRwb(NM;I8 zdV-4_k25D56`OqCbh28ZJ@33qIs=QrT+e&1KEvMcLs|J7m@dt(B=fxkg;`H`ID=oV z0^mYIhdxA?nc2i^S9I+^^AP+To%yachZGM^>q3_UIwMaJh>)M@s#=h@zu$Bw+PXZn zyB8$>_4+7d;6vQ=k>-TNr8_l$J#<1;%q3|VRmpBOk(u^=Cz(aIzi~?;cY=%t{J5)sW2!?buFqoW*U?Fd@DxOW?e;iufw`t9!rpb!`I7uAy$EVq!Em|qygM^cBpFGbtl zYr<0~+|%kLBA$qSDTSr!vfu*G$9yA*(D`iQGau&b*Q`OWIaz=k%F~I-VPUbDBS^l_ zXjl+Y%=SrcQ{ZfCLumOnnh};Gz0YT}G}G#r?%zt`YEBWHlW@bb?3h004~IQi;4Z~r zLb^VTA3{*K$B{vv-B>Glyu<v8WfDmHcs&`& zvh%8*js(fw0*Z!=3Ghx^#PX7@UcD0hi7y5J)0pq(eByft#hG;HACq zTP0q)g5b2%u*l=iN96m>p*PmQJBe{uRHLs?A@M+c+VsU%yd)a!k5DHP6VQ7Bd#vI_ zJ9M!LGDv9gJ8k|x41G2+TNP+Ec?lu5tj^Sl#JF9IXW6Nznd}8W*H`k1TetCvmA`E~ z?92Pgu*olfhaVNf0twmbL7(w5LZUf1T`9n%!ENktFkq9)h;e)*g`z5(l1L__sGmYx z(S&toA)B+N{_~&aB6W;V_;x61>)`plNTBo1da{E^D&odoqp<0 zWYneP4=kXw_Iiob7h{U0Eotv_?j(Y8b+b;lLAau-;fFHJp<_b7q&+bT}gHH3w& zwsC_>cl-{tIWWYH#{q+vBHIlSME)Z36m{H*fgStN!4F(SuK_n7b&tKrGN{H(bY7yO z4}H!P*6|$1rR5y;U~?x#vYRYcb%@uX2KFOf5hQI4X+G4uv03T-wro^XBYMne_5Hhl znS~E2mXi0O5VGwL9!dOd53eK7arRGg7C3@xWywYv!jU*WDwb1nTG(dOK-CSn`e2ue za?k6Ssh+*KErte%Pa%{E8QmuDLwW##^j@9 z#%2)x&Oa%CkbE}HH*PoOnWuJZcd-c3TmqH<)fSqzXd<9DR?YzfdO@K%Ie)dKO4-^8 zdI~|;VgJMsu}p%Zgg+&4|5)lTM%s0wdT`o-gBVrjC=DeAUmK#?`kRx2T-L2(N4liM zmAq%9X?aHQLt&U(#T?Q%Md~<`NDsb>5mckSUq03m0Ldug4lagkv#}5ID1*3Ev>0@U z{GuVisLw)hx_JJSl#>m-HYV8%hnhMBSsH-D40I?pf1@5{1?5hd6<$Ku3JW}IGi3jw zu^M9-mRt{RdDW*TkR&1UB@{Z4a&zR@%CEv%gdjc9IoFc&k6&_PZ%j&&S6xtZ^ZDe@Nf)9ov``1?bbS`cl=b z!8xs|11dLhm^&h|-41&oTHwvMk;slp=tK0Pc4*KS^>-Hgl zP`ync-1%s{)rH`dJEil^ZwQKFIJg>ddfovtE=H}7O!m(^e4|3E+2 zztG<-lmwV%fv0mv0&^|qp-8`HhN?xv|EOPB>XvdA(&X0~V8-y~rOv<2qcz48cKH#+ z#co@e@Gss=UDB&A=KJ{G>GFzpI8BO*iK$vPHYO;=M0=4K^T}1P%B{cQ7eN~Y)@^rw zZA`aC)N%S3=hLqLgY%@MG!nR4!(|k@k=O=Klhl)FUK=q9_N{`u0&i)3AYwLKnAV&$ zO?KNp7(_h4UOxa|UlCPWg&Nw7$;knn0>#1m@^mb56V__v-5Jo*tAmvRo| zs}-^FiUs(c7xEj_^bZYR>AF_@bqK+6ITI!8MVdGgz!#xpP$7c0mwiaEzo0nygSsI) zTWTgo(gc^FFaA0_ZqML}e$+*q@)a4Ql=9%uy7-<6EN<^8;|F_Mf`B+4f?teSd%S%H zjK>=)Q!QDl(esev%?XL{sL6drJP@QE_3xDz?QgB!c6){CTQ3KDk(0;)ta5+c8*zX1 zj5NO8YtHcQhD<`p6_f`8oZ-Q`kyjGT1h)Ur53i=(CJD<$kkgJyCp&VEB=I7aDBzIV zosy2^&K*e6eNQ7Pavtxt2TQ-X5`M~n6II2Jwk9D1{6Hvx`IvNo5d`(iFMfyboz|IF zsDLQ`w3eI+!yMXj!8}a#OjGBmbvW#ajtW~z6b{&M&-#aaBhleu&&Gvp>ldG%d8mAI z)J=S-x~M4jy&MsP;o-2z@^|Ml(4&iF=38^5P=$L&;shp`$l z0zitEdBBP+pQ~4*Hw>>6=GTN!`wi^I&R?9!fsgN{6+np{U~SYnLw~3i z#KMT-=OK>9 zCsBYWI*cwpbU2&@KK~66vb04c|0@P2@<55(NruQhH*p zBod14YVS*Y`aL`9CvX%F7a>~Pp|%UYY2W*jm4X-FgniMCd}oF5Qa_IV0P=qEncr}p zF7m~XuJAi5jpQS0_H~n7i!$ifX_rw$k71L{GVwEDPW|J&e(-n^-hR?{ikUwx?LI6N zf2Kro8lX@3Opx)$^R(>e^2?-s-S9FD-DLF-3f z{49DYo+B@#q5fIL+y57mH4a~1uA>fHZ}f@p?J>1zqNj+5#pzT%^7uyu0TkpGJMr6| zabKp~7JHy-@$eCY>8?os*Da~0@X&=>c~y?%KWM07=nD>au>$ByzBK=Qy$bjz=z_T! zNaKY>3er(H9Z{JXoyce{1rO8RxX21aoA0V5H+VJ@FXdDxsJ z`^!XG^Q3IZrVZ>V7`O3Oq*#Cnve1$70-LA6oT+>Q`u#MDz-byObW(jj=-`E>8o;co z^St8wHA|5yOX9-gw4x~KWT@_kVBff+SCh$#mBWAXvZ4!GT!lKDbf;_{@Qi~60My152NBPAn^BRz!k9Y?d4lJ5bxOnNR8~RRl?44VcK!#x-)~NoNo&O)y+;XLq+oQ5KMVgK z;gM!l5W$DS)INkx154Ym?H2s|bG|cQD0I*UQrK&`(fZnFsENJLWqt21^r06PAd{sHuGJ_&J^0h|f#`4h2t*~%$*tt9<|DGikGVkw|^5Jm+&-fj2Gb{k_45Ey!HEP@qZWoU1W zlPzMI@ArF~xKGH6rR={mHVWbOJJSAR`;gytJsy%(N$K@spCWMDvnzhrk?gv&q~z-Z zrMcm&REx_6gn3dwMf#v%fO3yJKuahELU{`D_n?hxLA3p}cI##2iCI>EkneMfbH;jK z*TtG3H&Vvf7XSH7%Jy|P|VYXSG1p9Vz5 zR1ZFgE9HWnyE5RV3VI@5ZY?-3nW|e_^@VRj$}XWjdl%FHyet6^Y;mXUchdoKn86sM z?BB3=x0jRb+MyIXeNK;U>i*4cZc`s5TH7xsaJ@xpH7Zp(Mvo;r>-_7vqFN|;0Tn_? zfaahGcQYI@3PoKI!K@5AxC2(CFWjqeJ5j&Z`A^5}G7#35X?@^|0JAkVmM?O0eu{YK zcqv$L0_8}F`*+aHIa1CS8zgj=>^NTl5w7ml-`Snkd+pKt2ke$;IX zL{^@KI$t0d(gjU>ePGh|orCy~%Mrt+I$OheBL)b`b5UCYhi&A7M8OcG!y`aJ>up z79qHniS_POhwG>G9Y{lu!~<;*E?@UWh&0`FhB;vXCL;DwvzdGpyj(}pGmf)8h}Isn zjA-z|+=6)hG4zc24x#^M1>lbY+pS3?X8}k61%9tBF1}iP-hEe4%7id{bAV++$zH6R z<>cR?0hU4JSRRMB3kc;CHeQfnVylDtbKZ~qjp3_&ssV$?LB1@}J5=qDJ-R6lFpcb| zvm-v6e6!@UZ`8G%xIoqNm4V6-;czKZ=qoQCz0;()>Tqb9Jc-I!BMp%;Iq7t8Z{Dku z8j0;9N+sgJKY{NyA(ou36a20U^q;Q5&f9MME6ZBW4BxH(Rc7JBb-;6>XwTns#Qw%3 zIrEwFcnxBZYFc23Jnfxv3tB|!BcVTMT2NsPqR`sY~-Ch!pev_;j;He45{D0z+C#JfC zO`HlDInq|iNG}2DX{3R@h_54zI!}yt1hz>1z0s&#%H9_ZQgoQ=s9K-hn@}PZAUM5X z4S+o9!gc6l8TJW)A^oSVbWGzGf|78wauT{!J)K1rS}G3p7*4a8`MpbF>fV=G{~^Ln z)&TbAMIU#{({c(iv9Kb`ig$yg)s|Ke$~NOpW=JgOq`b+P_Cn~5o)p%+;HD<{x*;uw z@r4XPGN<8xE1DG<2($5W|-@*YG?8==96PH7%E`=<~GX4`) z05U*L!G(rZF-b{{m8)U@!%ZJ(KtDKOXuD8as$HKm4HnRf4fUlJh>O2}t(Q?P(Me-X zM9Tyb^WO(MP34-@(-?W3K6E7$u%Oc;k0lEha zP^hXf2`MQNJ z{*g^evhDJ^nlj0e)Ety^Q8M-VcC%qYS~VKkkqL<>Ty~U?*zaJ)Y@BoSVNa(+yQh=M zhbmreCGFiPVSvdcwV#PcF064hS7Lu_^=<-vL%0!H#ea0GF|>*C_ARg*tgw>>a6+|; z>xE4EL9zDZ`S{gG&a-QJ7W|_dii-wTB`ll)8&-8Y9a0(nA4f9~8eQ_N8DOB%)W1a) zZl`*j3sK_VxCg(kjC3ro* z0x}n@lyevw?T<}jVKmx)kD5(~LA%E@7DXKVC{3!R(;jdldRMEb-*9j0x4}^^^M#xQ z5b95nJZn4W|Eo2S9}p}5OjOCipCID*XuD8?T*<`7h#IHFX;4-d;mf2L?p>G{0ql}@ z!VxXPeMPt%$DaVWF94r{$}s^~3n}3~ppyrK1F5dk_;}qLT&ySot;_?QT)@;D78O-| zkmudURg~s+bEr}#k1SUEIWKDYI?$n~ zpyi_c_v3Z)4xkcsWT=Q6&yA=5C$==6!OM5Wk8QzDiY#0F-m?&5U1n)srIfwEv9)?#lXF(ICbdWI{MBK^O+;@>Ay zZu;{PFPj=cVZ1VugW2afoCh0_=M;I<{FCNp6DBlo`k9X%pDfm8AGzOsn)Q^eG6Cu5 zqdo~8SfW}6TgRV49FmWIcGz;vrNY$E1`*h*%Cy?@O9=}G>aY*hrN*7Nsz>vK&mH2P zNMAl~*gIfNf(Fs3b0op{FJix(Wy+pxW&fo4SNWFagL;=h@qgPY>rvkry%^7hAv$n! zDJ}3{dY@c{$Ae3jf5KbWZ^u@y*1K1gIVj8dzQvK77 z?hMck6VT1jP&qu_x_$f8ORvVBWc4S!!<(UKl7Y4+r2q%iT(bYw_iFyy)dp_V*zk1= zxFn?gcQo(a0Hc{H;T*L0*uxUxG#M6_U(&P_d+HGPi36PRyMzziOw+HE7nz|6L@rNB z*PG=WRXOjbjSEz>%z3F0xxa^8zfapu=G^6r^Z9QkPw>74}5 zN95#0Y5!$V|2ZAP2x?&Md_sPs-1P!d4B)^G@i{@O9`^bpZIA%*{vc* z>)cps6k)z>j*wm#;MP?OVEtEb4^+vsdoB!`;DInqUV^@dY zm-rzA5{Ol@!~kV&Rf=g=DsoS-%;@+5KF<19|{5Pu$TL+ z(7l7(_hksawn``*(6Db2CUUqTVd2P?0(%St>#NWx%-`=Cm_^E|d6(G-Xl3-=h~4F% zi;lM>J?Zwc?wO4h8ejQQy8Z;He(FRb&6@mgHO&9(F9`hes{~XeUL{+0j6qebeU+Sj zHq?D7e%ynVHDK2iOqx}7%g2VmZ-)3wi^skT9@Um^b6}_Q{qdMCERBzkk|l}s zoaQAZipxGQx1D{zC%KFTB(rjYftu@=Std}o^PcJ^v&9-Bw*Ipgg0^j0l~!PM#ZlGZ z=R^P{3kv>MfuM*zHS50q=%+;)Wv4+=hRF{j1iYT;yT{)6JEH8Z1)y}|y`FN`2W-@m zvEuU^0+dC7#DosVIrAu#K=}XD+?Pi~{l0&XR9Ymd>`S)nYlN|vY}uEQbs{Q+(AW*B zEZIU5LUzWMb?nopEZK!2#!z-MhAcyt;kotwJkRg^&iVcG{PjHNypQ)B=l#By>%Q;n zeqFEYy03SqQFy|rgniA!Q!Z>wU!N>|Lx_XWvFD@2v8wB0SJVB;zn{N#ndwBWWfp@< z9O6d9r3X(fzuV6)ZS{8lbw6f|Y5k9A3y8InlKv52oSF2gZtb~$4X=pX(xkyi(8lF@ zG1;dvNS5-Bn?Kmns)iW*I-%H0S4=4r+8Zs`-QTgc=o0{kE=?l{I+KBjPZ@s7 zg`_y~eV&K!CSSi2D^qYo-vi-JuN{iuY(yone%`kBa0q0p?$Zf39lqJD6TyYNkQ$Rb z{kF;2w-5El@MDc+v4KVy+4cDn!U|gs7r}3quKDv)p1-%RQL_macpLo)@<8W4jckbi z#ODaep9Pz9va!Dph!#AVBHuG6!0!LLeLmA*slWAt>ll}L^gk26XJ!*QsrML0#9WNU z;v7KS*=sZ6*og#U4aydC)9>=>_Fc)gI>nDMTh!%J0J=y2@%Z>`B^4*=fD>ueQ0i^~ zd18P!=tKtxFTEmNQJT?y@(%mwqVe#`jdS-z+*~3|KfO28N^+opn1>8lGI8wO)$KR2 z%)mxGW*mX9CeN)xZCQy?w&C4hqIQ3BB=OARv9eWoK~1^mhxE`K5GtRhWA24O=5>9S zep<56XRLjE^bhnp){+m!5efr4zWx)CPl3$)h1{F_Ub7@K46X#^pTwee#+6qsa%r zYCLAH&(zhu*}v`M>h=SI=dGZ2x+xf3_))&%SlDfSQEOjB8w8AQ`msNV``!jW!~aSL z!M@ST#BJxx_A>l}x9@^FW#aeySHRWBF=_}XtKE_3{uOrsTbfP24&XFxi)u#$STloF zI@Q)s?^^pf%_;q=F#c4l-b{}A9Kt=O!E;XPSN(}$wV4<0uOFP5;fU7^wwe6HJZHGA zKGifVC%bvf)^<(b`Xr}*kMi^j>AiSJSk!lsvs{K!4pZ-&@-!Ra%Sxv`m#zF%k58e-Bw0vG&l<>!>(V6=&U`7n@r@>n zhVHa7XHAi$jUUPRi1fR0z-v%O1dz_TK9P?X&to_w9!`_aaFBl6w8wB3mxT7%w3nZJZN{LX#U!jmyHWAaf3~# zx%~^1UPm(=d#KOBjiS2DbRAAaS~1=b;g|aQp#Q#3@8d;N=ysbZg~e6_)HkTe&S1h|e^6{Zt<7W}MCt{g+inq#v*^8DsVeZtEuXR7= zy;e@1S+VHnZZV?cyGhHd%kw!QMm~xg9(v*)jCS`8hkr{|DK^2D)W5pYUx`-?*5~^A zP_FBt`F#76czGL6bI~f4Hd6JoLtz&x;LuSnYj1N`l{`|`w5IM7MwFKHdLmMmG#OUW zHenlL)gL`ALevVW4aN+XIzyf11R73_!zRX5e#hmpe%5wDw>e7Ob(m7NBRWa#*YZ6q ze81nw_b`2Sydo%@GL)48lYqLdO~|db<4DTRddv)}OsgCVp^|yS&gRvJi7q<67V~@S z({I<8Xx0KJ--E!)mdYTV)v55sS&QoPx`jF@npdEn$1c@vj)r#~bV-+ckYZ8eLJKP5 zQRAzAWp>eAJF$+w{)WveG_)mMsi%@*ty;UJ#h|r7=!Lw5CZzdjgsT7a$I$gQ!!DZ! zzWs|W6%enQJse}vTiA224(i`n5v1Nf64vXzBjN4uq0=jYB9|9(a$z)CD8@5R=mO_dm zR$hyP#$-PzRpLaPfk5uJ-Fau0wDf1^pz!d;)P~`q>4-fj?&H~ERd5Rp{VSQ!P@dF7 zs{75Jws$=0%X8%P<#s@@a&D|J_9=HU z=ZT=A(Dj9P9z95ke*?BE=9$6h#;mm04daMY*G|ToqY8^m+F5nTZ+_lB6~oZ>#afykL$91m+l>UW_pQoA_`Vg3@hoXb5n@p?exr{EAhzOCC3vojt+oQ_|8<| z+%2PT`7Yl~7+m~cCBXv{+Ng+A`SAOt@`0{Za&~W5lD63_bu6RfzloN=WMZbL28G&) zm)M9CmzK1#F0zC-^lH!y*!3i1@f1_>lq6@mN13-xlurs$PRxESd*_5X{4lvuz8D-c z*^5VVXRzIORNF#fQQOSU_aS=2W-3`0mG{i9Cq+To;o7L#m>~&C6&tPX zZ4s|JcuSyh6+B$X`;gmmld0&T{hXQbRnp4J((m7r1S9$!8}Y*3U4MPxq33ulAX?01 zir2;TA2xm%Vg%hdDFe$5P>tk$L_|%#ur{lflzxI6-QKR--r32eJ9SAuW9A0P%>&-g zH(BS@cFco51Py~prHWvSkz92*+>R1qAc9G0i zn4}%fl$MowO7SR3>6@06lypC=HjePR$cw#{eOzd(S?&oMb=mXlb+xs3Ze18)@B9uz z-1{??OF$4WLOzkXn9jB+e_9SWyXh0CV7XyAX|LoJUXi1&US!#Faw>x1Y>0NhF#@gdVpt zr%00=bDrgr6t1qewY6WE>r9?W@zQ9SwUuR*PiSafz#E5qdx#PzY(?;^A&Ef`V|XMp z1S_iH6d0I}DEiKnZ=wUPq@<*Tb~O{_Ye1^&m!e(FjLfR(t90|fWH5ZUNKa4ip7%=7 zr{*qRy`hWw%p7I^cc9Mn^!FQ#aNlnmAtFett1j;D;)&ZjsC`h6By7em_S|b1#?!@C zWmQ3(ryYEKEx-Z5cTTUSZt5VojP_1-bQ+oe6$jNg4i^nQ86()~`3#I=YU=Mz=0w7^ z3xbK!~LwSiw@f8F!vppa7cKC6>HFN$7XiKNT=A9c3?6sF*Wiaz%GZ`tV zOD;`(SQTSX#kVv6k@&~%d8tFM*MsbwoZ*>fre8O^5sn@$rF&S3c&%IbpEX;q9xX~f zP98B5k394RBq&$UBG~#5_wYN9;&*5c**Q2)O&kTU9i5%V)!-JvkEs1aHVqrRgY$vH zV;Sc1z%LCWhPi4ILwl(FIAT*Z>dQ749c;8(H;b;G%< zR_t$Gz>5BvYb-}$T?Y2EuG^F`RH*LH9Bl=~47(W~h3wrcd|5uc&K5u3v)Sji#X7L8 zVuy2?tQ$@V>zGCCk9+9ZB?VSsrcJ?8X{}qMNhBBuQd-aE!(&RR>>_`NjVlMYVttNl z)*eb{SRC$TLp#?7Z*G>I)NgBebIA_tQk%K0s9$Bp52NU9OeixsZq-OBxbNhD#1q*x zlr+MV z`Fd}V5P6NmXZ+ztePJ{$eAqHgQ?|=k1Ky8i3=^JG?T3PD@hDEgR@mx2?R+n z8w9|}eOJoyhfdd(G_P4|G z_O9elXBzLdOR}2DqSiOZoy~U53i+B8bUc*8rxOURvD$$evgga>!7l_ zHD4vW0?V2J!}M8#PmIC7Z*=x9*#`=fD<|$v2}G_NpoA#f9Qp9JRBN%4!|vh48}AeE zZ!VTwpP2mfsvcme=4RGS}r*0&yEVIz_}*CfY92lHS2>fkn^)0|JnoXwVNPnDcPND`1#3y zPybC@E8f#uc{*ByXHv$uG|@#D1GJdwL(e-4BSE60IXm9=o+7bXYxP@H;D4htyot%Q zW%_OKH}ieXam;Al5!NJEiM#9MA&^chaUX^wvl>e9uH$9kYCqif^a~Yc`#LupLk4$L zdgr(Dr0#;jm^!-G#Jm?fB;nAb+hrA8(mO-IBeMs5^+`S#?w}nT@pXOiyOgjgcN}ty zS`*sY-u<{Fg-_s{*$bbN7tbcdzn$Z1iP5;o!&%X}z4sw2xVd#veP;cOWXxca%U1+G z{_ftrqOy+9*Y0AFqs8vN4z6fn?ajx}nv4ksQGSnkVQ-OAdZ+747w$>wfzfyDS8c0G zTUwf^b$#w`PUn}<<@juMvcU+)j>{YnEf@6PZK>4$V<4flBKzGy=Vu99Ugk6X*=`Sq}mThaDR zo#$B|M7vxGc+)dq0}|{4jqGX6hkc+(nbjAhoW8xxlv_05Iv&p;uAxx@_Cjol#cd3Z zqeBZEkp~C#Z+ZAOYoXX$jQ3>E_W&wO{#-r%C0^Ih*iw59*>mct1;s%s6^g#A8XV^| z&9aRm^K26d*WV(8LDf?Ba}VFv|H)i0e`p+gi|cCiokSPfm-ftQnVE5UZi$4OGd1CE z>|lleV3~Dc#0qX%{|6j3=#gnC=7LvlVU~M@{!2|ZRiZ#SUm$%014(AN6|`RmS5}@l zl9J2<)s`*5^tqmE*O$ZkNTQbZ-2jVYE1b6Pw_U;?)mVK<7Z&i zMVj1to12?_*rjLyk(LE(Wjf?Sma)#uV^;perTCxC36gyMsyeqWJbP-@$4W@gdb-J` zaV=Tb8HrRONJ`G>4Ucqpzoz{fDMP1;3e;F;`WzfypLR#~oN*dROPz0G-^QwJZDnNw z&4`22CKA-Z#`sv;>^NYG$HBqbSqEe#skIU#7)d%VEH26_D6k-y6WLL^)9(Z#@;OFAIitW(7b@ zB9U0-rU-DJH+a$toKFhkMDQjOr~u~qsZxHKRP{kLI*Qx43|3oLSCEv%oTYjRz`5Of zu|`=u#hiRijJV@?rAv{T0K=e+nQxK-zSrI-87ll>T#0N@dK`Jc~MZarcSKlkd^9GY|IMIMv~ zNM};u@o}Xcp>8-RKxF^?^BnBP$H+LbEAQN^Fu;)~YtxRA%(PLtU{utS>`=$m#|bCD zrn`6%@$6aN?CgVMz^T3T9L&S_?~VRqanoZsotK$l)(OdnL;94=!33e&8F7&XupLW8 zD8zl0Nq8@Sa zzqyO!qUGE#yEFbBtpB5ST8^hWBvK$;=0S({;#>J6I!h4`lFA8k$5}bgLmdW}`!6$K z)pj60>Ug2QWQ90H=0OWU@rfzZIG=Jy^deOZ^VgBhkPSt>wG*N59rm<70N@1jRGp*s zr=Q5US3CKGMG0z8Q^2UIsEm5<8f|}n zE?nDK)z1eS&zgJujesX($-JflY!=Bj&4Q+JqQiq4(%d47`B6{oQuQ>WGJ#%*b}gFyKw(mI zxeFfK_AC6lJ0|a7swAz{!U-D>D3Kl%S5K=nw_Iv+#^CeTck!WZK`6CZ3~-O_I} z6mpA~S^m-&jF5Pj+O*Y`HNsaj(oRYkZuZXxZJ#4;Wg z^F$<{(0hv1XE$1QkTdkIxNDdHYC*KL{<#DQ{dG+guOqImZmfc6(2&y=`^db0x5gv_ z9iTGRrJaiqDlKPt9$-7X}U3+uwJ?03jaR0XOUdGx)aoF zg*2vlG@Uy%b6I%qMw+!s=aMYsob)Ol zBgyK(G~8;r0BI>U6P~bZ68H7c_m()wHp!pD=%GzjHW}TNx8H&!@G^l9i`P17Ad~TV z&=YbMN`+DB1CJN-RayP4wc5`M+a7W|4XBjQe3|)-qaGYz9Tnr44zf#<2v#3&u{b?7 zMe0#4B{cXFR^~ftrWheHHxdc-3UOs65-oYyii2>I2)69Hmd!sA^B;nn-VMOd)!IU) z*Y|2uobU&VeJVRm*>%=E5-uc;BfXSXqCLxL?=q_U^h>t4XBx}hTYq0r{=;+x-Fj)2 zxRAN8%nv`f?AEdowB$zp<|f?Vu8XOaKH!#^PVrapTz))p0gd4vL)`Y@f^<;nAhg|^ z58V1fNW;<@N#7gFJSR9(QyM}OD(iYebPmZaSu}P4R zSm_`T9fY8ddzmw#dofwOg%cqtY_sp3YJn+L+;1|DI1%#-+@;~WRp-VIc?d>t#mig? z`2((tqgEr?kk8+^i|PL9N9vf$WdVjM@H(7g>gKi;QcDH#sH^q7n`D7uMlkQ_;e)Ic zX(Egxs35!%=@{A{tK07$j_zj}rLP_M3neG>H7Lr>A@?sTt)&-D86%1Q9HQbSlC~>> zPavz%A2?GaQGwqjzm-$&+af&i;pm}e;AXXOfB%lGIE498jM>F|yZ0?FD_SVIxd#79 z(mj}5>wX{H6C5vq{N=rK=vLZ%H!5r2*4YcTx`&>B=i{id{z6*y_gT27{uAWgh$h9> zZK|IGzYgQB-)voW#!0FkEoU&9KRm|_*}AGj4#g4>`EeeBQ&afqce|}2liU8A6t3jW zGKsF;8G*UhjZ+QqqqVA|G1Ww=5Lm}$)%k{uXa0AwR@lvL$UzCLM3>9|XoGchQ56wn zU7OUnNTPz^6F{54lnZ;#DHr>+Zu<+RwpvfQq5Ezek@e#nDv+iN`RG7*0n4dGrzA7# z7l6{_@3GEAUnFgY)bRF{`%Q5|204zKR#rn8w}kJ@!}r8eJt&8xhMaik-A_%c9;u~P z?&=0%)+yj^Yv+tP#vsz=j>RKBMFHH*=0yla!$kRhvBs_17);)OJQX3wo(k-~f$5>a zWbGtNexeS1AM#ru!=NOM>??I&Fzcwd)I_J;lqM7jw%kuap0G~ui~CapfD}*iI>i!? z{N36ayNi8?W9vzoTlL47&VHYx9+fwEFOU(T+83= za9o6Zyzwti9(f+qNVEW)xy51hP(E3ER=)nX3YLo!+W#R~a7aGXv&w(doIi7)_i8!C zKhM*w5LQc>8zBC(79ct#54nFu%7i1)JB16ojYDe2CC7<|<0Fu2+w&N$TNhrg^o~b3 zsvfA2$dV3t2|!)rJoZ@_Tp-N!iG(-I;o08tE&5}aqX(#YrrRDNi|d7ssv9q?{30(4 z)4zHZ!8zRZH3Y60A0oe1=eo;p8?uHOYS79$)8YnUW-2Yd!t+%UvHMF4F??_*-$N;P zJmv85PdCm!8!T^7%or+b#CnTO!VkG-#~xtN;!(JYO7ili=~m3`X`n%R9;YA zRQQH$8EM&^w1z2fU^+A^R-|A?b7YPf-7xb)ef_;ly)5E-r$g0eZ?&IMh|49BiBS2{ z$6m8U;mHGxE=K^|wQgJ|z$zc>TU4`=C!Kos>briSlv&}BYvo`I;b=zMCcEhG);s9 z;(aHz#Z@{Zt#=}!cQ2td=>gd3Ce2_zJR+UCC~3+^RCS7ZmxQnrOLzYV<81j7KHs}1 z!!^rb!xwDalTHEEHAlcEKfu++#mAc~2$$GRS>(e~W_9amGoIL(d#&f_DOAzk zzASVXR`>B=pm4I6xYk8^1brjceqc-!Hi|sTU3+J5BU3?BCw&IJFlutb| z8?FL@%y`UcqHM>^%V4Huup~E}7rR#6tOf@RZbKR3TAJAjkt9g&b;#(a76|oJz17VJ zmm{<0h`oJe?8YLTwM^yb)}}{Vfl2XOfc8auUPDD8OXGtA*tprE{}Ane{@nX7qWxyN z`Co9)+oh>hPMq35;Nsv|-{ta((zpc>~Q$z|Yq-G!%n0 z##hgs0$1ww>Z??3xIum_uoG}NoN!7HUarHa+Rb`@e}7_n+Cn93Y;y7g_zp`B-T6zv z!kQQ#{|@rSjbvXtnXEf+mjxGPl)Z7|>y=B8N?92l1XwA6i2rNPUON#H5dqpbvb9wM zOh<*vI2J%6x3rXj?*bLwRzC^scM=X=i@{VhG$??KQ#WL3)mCWlm;~={ySaIIXmOl& zxE~S%2ZdN!S{ncLBE0+wdJc?7)EE(1dXeLGWqp169PI3m5eW0BHlq(;ATd$*3{AY* zwZKDsBlU(Yc4K|%a)_r-=@Ej=pI*G6#y9&Xy=2`1sId`AX^e}D%b`03S&ectu`Pok zD0_&4z>oZ62n2Cd3}m*t!*TAkqpRy(v^zeL*m!JPf{Fu3wPPSB6%#@ba!sgUSQV5} zQ&-o4;#@km1p$i*SbXrPij}qXtb@k0`Nr~NYqA9UY@s)`=qr`vf`i;~Wi*LKsvF;U zThY$w0p55ekVr{=cBxb9i~PevN+W5SxZWbKq~zEZ@bZb98$QLTbG{l^re9GhbI2~k zsk$HIHC>HH7lO|wWyVoMC=4KRUOSpNO!Dzp<8q2{gzf$yNSmK4c0+OV8aT7P2WgxYu+!in%w4-coZ4Cw$7}c%Y)S<{IeG`&=-00}&GcT_p^n*;FkuvBaGE;Cuc}$51yQ+Yx z^l>S~w)R!tJZiGVA+@s8<1f#(O-2J3O1_B@>=cU$AeJY7{CIPvVxSxz+vV9bVAM1w z7wOkgyw>0~|GGazv9m7+qQP?$Ed+>m8S^3KK4?3e@|M{QOI^ z++;Qbf+RZE6WQgCRQ58AvUK?vpdp7!#CsRPbVHCPfK^QXf%HkoZK8%#LXmB=vIU;Y zfnZhkXQ>WwFjKu0XXM2eqVq|G3&sh<3ehCZ2dqca^@dH~%Z5ob$?V%u6wY}l#!t1 zg_CMUJccM=Utb!p2Q(F%>9~xy>36%!>J;!89Q%N~H!H4vj!b@r8@)?Qnz<0bur{)K z?ea^|#&_dv42p`1I~4Z90e5=*j4Oy?nPpjQ1>YLe5)l!39!CX1YNVOr>Xd&wy@B?9 zU8!*^ta99pG(q=ca5`0{&P~{;1}=d^1F1h8uLxWGU)C!3=70Y-!n!0Upxy&e>^7Dg z_w|wQ;AxJ5da`mX;8=hqYEo<#`k3l-lXemTWT1bJ|CztbhYfOg98|tLT^5HWX-F?! z8b@aOweso5Y;{BSLJ6p990r{Ex>eVT*b7V(~7MFt< z0;~(QM<=n!w4}ck8(A{OSDA8I&08tMVNE7&Oc<%F8lg;LNZj&{9m8a2d#!x+BqSZDpl-`9wbQ zb?s#ImBT-trmzCj_nzHFH9?-cD38hd zZ1APBPwDONbqa^U+6Wr4|M<#vtQ`2xG&xRdvIj##KWX^%6zk?Qm=9OZqxEpak=Gpx zSuf;UvnYX4{}|c;4zQdUFva=nsqL7>EslAa9QoXVr8pIc+C83BQ`-`(62c3=un@~y z!K8)=6#ce8=j85JxSNBV*bea8^5V8C^l`0ay-RG5Ng)ay9EjE7B2*qI?Z-R>JM$NM zOB1|))8&Pt4}6Ll>`?yGb`rE((43K=4+bI^{eq7u<&1-F=`h^huJzBCtg3c<5KKt) z7R$6$d9bG9-vV?@@Fcp|BxtWeuBlyl=+4A=;PMD%#dmLV+4b=OCTnca?}LwO7D3hk zvtQFhz~EmClo_nV;_3pMck_sgh-X&zC%&KAP+T9T*_wE?m5VvEH|cy3ThTt?`d9_l zl!fEKq|`O9-1w%F%K?VnK9aAP&g*N6PtT)T!hJ==kBsg_QYLZKpk&dSGD+_h#qJoz1|Ja$2Rxgm!iO{WC4ZEyZQBMd2 zlOpqWk+u|_(Y9z(OXi0LZ6PF-U%{RtR<|d*Q-b+DVNgM7UtWi{v@UdZ6c0SsYI|sUJ94`gvEUdP;mBv3hl8p5DQG3>0<40yXWm?3P=5{>3 z4^*CRzpF?o`ZoBeMiqJEUukRy+;VfGAEpi?z*M%Ox8`ayO!1nrR<(GS=><|)9Bmfo z*PajEcJXUkZ!mJSnuXIkm?Os7(MK<_@R|uPCnXg^CE9y3HvILkd6 z>apo?KZu!mrs#YVQ?SsGgPb07*HL?uSHQK#Eim$D`L8fNf9%DmZ!^Vqk~jVcl3B_I zX&`5A^XVXjlL>zgoN1;AUp^XScnrqXn+MuWERU9t&H4_H2Az1hhkb2`qRLZ$PszLg>S_-Az{;%gb#V zW}K}hm|C}HXWlOuOs(CK$1^m;_I-p4>!1dkQWF_L>4q>;VvLUzVn`S%A@I{c=T_6K z9D0~k=_792I9Ch}`~9P?ECr5in7yffxj}uK#cnU!fV4FPm#M=MnsV0lVv zB%0kFDye8CET5*gU-oT~qJ0tBFf8>I8Q&Njwa##tCtFL$@rxhzUzBCL`o@qca8S*(9Bw4#Mrh z5@M&hN>)7dWQ|leCf%KBl&-N1>8`rs)nGHi4Pm~VP6j1qo1xNG^a z1Urjg5D)Nw@5bZSgumm^S3v5wNm_!P9L=r&8F0n;HOu=(oV>7ylT$V;KBJgdZW zufE*l$Ev^k?lM`9mueB^zi9xzg_J`_Wqak^tAx8KHjDblc8FZtjl0v5%&%^76X+o^ z3E#xclmNgZCny&0{X*x5izqyh*LAQQ|L;w~cug8{Sp za|vWA0RvvAt%c%u_VIxMRB0S>>1>67hN@h^nZ|<6qW77Z3y#o}AlLTjY90J+}vT%dqKZ;E_!@7OKetiz#gSsHK`xHU7JEYng`qoA~YGBg~Ms-=>Vhq zjAYZ6893pMp_V>3q@?~igQW+)u2BF0@4?|xg0rJ?j@6a`l>-PeAA@ z@bL_Fb#;9ksMtoOF#Imc6m62Cy$zm)pa~*XvOEb@#cm#X|#@`HfgCC?91+2 zN++tuOBop%!+ns5%}1ka+Oom7*BF_YwD!a^ATtsh2$VI5pE}0zfP~Mbb9x-RVPe_$ zx;>}=gTiG5^HMG_Do7;K9S%)HXqf~@#DEjK!x9>V6ZQ4?gAFrOim3<8LISxFteezx zVR4|Udnz6p$KD`UR}q3Fy?1nUw9Wf7*BBj|q>*50j#ocw=o7U9UKt=Kz7gIh;3K8r z*W_nvF)+kftT|wPDlZYMlkJ(01(kZ^(XlQ0>)Q2WlnS8mL6_8gapm8isgLb6Fnv>9l^=qyv&qWI6&{pfn|0jW8ii;M3C8G2p-XB{F6f&C3ug_8WDO93Wd=+}5bET`E9D~%nGO*fR!e2xZw;%U(K0^Qjf(ze~bh{&c@e-E1^H4NdzuC5R3Em>unAW zj^+Ori}oMq*UfY%ab>8Ntpz|wz*GfS&|!oPPl6G!p#K`t55$#2v!$Q$V*7y46?j%b zXZZ2TU88^fW8-yVou15HaUg!vDXl=X$3!?8Ts%?X65;lf`wZ8C$$h;rD+EM$0)t-f zdg=t#{h|xOCiq@SS`Y!cFm>WV}=V;9TF+}tKr+@ApJtGNvX{hIF RgFZlX?igs4-?|_6zX0Ch%qIW< literal 0 HcmV?d00001 diff --git a/tutorials/source_zh_cn/advanced_use/images/data_loading_performance_scheme.png b/tutorials/source_zh_cn/advanced_use/images/data_loading_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..fd32feee9d720141fc1bfcf3bb03cd40363316e6 GIT binary patch literal 33037 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 E0c)>4VgLXD literal 0 HcmV?d00001 diff --git a/tutorials/source_zh_cn/advanced_use/images/operator_fusion.png b/tutorials/source_zh_cn/advanced_use/images/operator_fusion.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3a88cfb04825f7469e76bcd48988a596ce222d GIT binary patch literal 13115 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 E2NX4SPXGV_ literal 0 HcmV?d00001 diff --git a/tutorials/source_zh_cn/advanced_use/images/pipeline.png b/tutorials/source_zh_cn/advanced_use/images/pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb3f3defd20eb700c0e16d6dff5d57a1d2007c9 GIT binary patch literal 5841 zcmd5=Wm{BXw;npB1Sv`Bh9L&&l8}}VB&3E=x*L?ClrD#q20@T+q(g=Vaij$X5Qgr2 zx7T@p!1;F0hrRb)*V=2%v(|c^weS0m(bZOcKuAXj0)ZZ=t10V)K$twhZ)<#9;2u(R zkp(;m+|*1wK_DWEe;3BoV#o~$^yt01vVwtMHhMAm?PL2Kyn}tj?)CNWwl|!O^rh
=~5+`;VCu5v6LjsgAh?OzIepPHH_6dGFv*T@0 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 NT}4~DO7Zo({{ToLH~9bn literal 0 HcmV?d00001 diff --git a/tutorials/source_zh_cn/advanced_use/images/shuffle_performance_scheme.png b/tutorials/source_zh_cn/advanced_use/images/shuffle_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..d09ca3dda379502827d58c1269599fa4381cbf76 GIT binary patch literal 18160 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 + +- [优化数据准备的性能](#优化数据准备的性能) + - [概述](#概述) + - [整体流程](#整体流程) + - [准备环节](#准备环节) + - [导入模块](#导入模块) + - [下载所需数据集](#下载所需数据集) + - [数据加载性能优化](#数据加载性能优化) + - [性能优化方案](#性能优化方案) + - [代码示例](#代码示例) + - [shuffle性能优化](#shuffle性能优化) + - [性能优化方案](#性能优化方案-1) + - [代码示例](#代码示例-1) + - [数据增强性能优化](#数据增强性能优化) + - [性能优化方案](#性能优化方案-2) + - [代码示例](#代码示例-2) + - [性能优化方案总结](#性能优化方案总结) + - [多线程优化方案](#多线程优化方案) + - [多进程优化方案](#多进程优化方案) + - [Compose优化方案](#compose优化方案) + - [算子融合优化方案](#算子融合优化方案) + + + +   + + + +## 概述 + +数据是整个深度学习中最重要的一环,因为数据的好坏决定了最终结果的上限,模型的好坏只是去无限逼近这个上限,所以高质量的数据输入,会在整个深度神经网络中起到积极作用,数据在整个数据处理和数据增强的过程像经过pipeline管道的水一样,源源不断地流向训练系统,如图所示: + +![title](./images/pipeline.png) + +MindSpore为用户提供了数据处理以及数据增强的功能,在数据的整个pipeline过程中,其中的每一步骤,如果都能够进行合理的运用,那么数据的性能会得到很大的优化和提升。本次体验将基于CIFAR-10数据集来为大家展示如何在数据加载、数据处理和数据增强的过程中进行性能的优化。 + +## 整体流程 +- 准备环节。 +- 数据加载性能优化。 +- shuffle性能优化。 +- 数据增强性能优化。 +- 性能优化方案总结。 + +## 准备环节 + +### 导入模块 + +`dataset`模块提供API用来加载和处理数据集。 + + +```python +import mindspore.dataset as ds +``` + +`numpy`模块用于生成ndarray数组。 + + +```python +import numpy as np +``` + +### 下载所需数据集 + +1. 在当前工作目录下创建`./dataset/Cifar10Data`目录,本次体验所用的数据集存放在该目录下。 +2. 在当前工作目录下创建`./transform`目录,本次体验转换生成的数据集存放在该目录下。 +3. 下载[CIFAR-10二进制格式数据集](https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz),并将数据集文件解压到`./dataset/Cifar10Data/cifar-10-batches-bin`目录下,数据加载的时候使用该数据集。 +4. 下载[CIFAR-10 Python文件格式数据集](https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz),并将数据集文件解压到`./dataset/Cifar10Data/cifar-10-batches-py`目录下,数据转换的时候使用该数据集。 + +目录结构如下所示: + + + dataset/Cifar10Data + ├── cifar-10-batches-bin + │   ├── batches.meta.txt + │   ├── data_batch_1.bin + │   ├── data_batch_2.bin + │   ├── data_batch_3.bin + │   ├── data_batch_4.bin + │   ├── data_batch_5.bin + │   ├── readme.html + │   └── test_batch.bin + └── cifar-10-batches-py + ├── batches.meta + ├── data_batch_1 + ├── data_batch_2 + ├── data_batch_3 + ├── data_batch_4 + ├── data_batch_5 + ├── readme.html + └── test_batch + +其中: +- `cifar-10-batches-bin`目录为CIFAR-10二进制格式数据集目录。 +- `cifar-10-batches-py`目录为CIFAR-10 Python文件格式数据集目录。 + +## 数据加载性能优化 + +MindSpore为用户提供了多种数据加载方式,其中包括常用数据集加载、用户自定义数据集加载、MindSpore数据格式加载,详情内容请参考[加载数据集](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/loading_the_datasets.html)。对于数据集加载,底层实现方式的不同,会导致数据集加载的性能存在差异,如下所示: + +| | 常用数据集 | 用户自定义 | MindRecord | +| :----: | :----: | :----: | :----: | +| 底层实现 | C++ | Python | C++ | +| 性能 | 高 | 中 | 高| + +### 性能优化方案 + +![title](./images/data_loading_performance_scheme.png) + +数据加载性能优化建议如下: +- 已经支持的数据集格式优选内置加载算子,具体内容请参考[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html),如果性能仍无法满足需求,则可采取多线程并发方案,请参考本文[多线程优化方案](#多线程优化方案)。 +- 不支持的数据集格式,优选转换为MindSpore数据格式后再使用`MindDataset`类进行加载,具体内容请参考[将数据集转换为MindSpore数据格式](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/converting_datasets.html),如果性能仍无法满足需求,则可采取多线程并发方案,请参考本文[多线程优化方案](#多线程优化方案)。 +- 不支持的数据集格式,算法快速验证场景,优选用户自定义`GeneratorDataset`类实现,如果性能仍无法满足需求,则可采取多进程并发方案,请参考本文[多进程优化方案](#多进程优化方案)。 + +### 代码示例 + +基于以上的数据加载性能优化建议,本次体验分别使用内置加载算子`Cifar10Dataset`类、数据转换后使用`MindDataset`类、使用`GeneratorDataset`类进行数据加载,代码演示如下: + +1. 使用内置算子`Cifar10Dataset`类加载CIFAR-10数据集,这里使用的是CIFAR-10二进制格式的数据集,加载数据时采取多线程优化方案,开启了4个线程并发完成任务,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。 + + + ```python + cifar10_path = "./dataset/Cifar10Data/cifar-10-batches-bin/" + + # create Cifar10Dataset for reading data + cifar10_dataset = ds.Cifar10Dataset(cifar10_path,num_parallel_workers=4) + # create a dictionary iterator and read a data record through the iterator + print(next(cifar10_dataset.create_dict_iterator())) + ``` + + 输出: + + {'image': array([[[235, 235, 235], + [230, 230, 230], + [234, 234, 234], + ..., + [248, 248, 248], + [248, 248, 248], + [249, 249, 249]], + ..., + [120, 120, 119], + [146, 146, 146], + [177, 174, 190]]], dtype=uint8), 'label': array(9, dtype=uint32)} + + +2. 使用`Cifar10ToMR`这个类将CIFAR-10数据集转换为MindSpore数据格式,这里使用的是CIFAR-10 python文件格式的数据集,然后使用`MindDataset`类加载MindSpore数据格式数据集,加载数据采取多线程优化方案,开启了4个线程并发完成任务,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。 + + + ```python + from mindspore.mindrecord import Cifar10ToMR + + cifar10_path = './dataset/Cifar10Data/cifar-10-batches-py/' + cifar10_mindrecord_path = './transform/cifar10.record' + + cifar10_transformer = Cifar10ToMR(cifar10_path,cifar10_mindrecord_path) + # executes transformation from Cifar10 to MindRecord + cifar10_transformer.transform(['label']) + + # create MindDataset for reading data + cifar10_mind_dataset = ds.MindDataset(dataset_file=cifar10_mindrecord_path,num_parallel_workers=4) + # create a dictionary iterator and read a data record through the iterator + print(next(cifar10_mind_dataset.create_dict_iterator())) + ``` + + 输出: + + {'data': array([255, 216, 255, ..., 63, 255, 217], dtype=uint8), 'id': array(30474, dtype=int64), 'label': array(2, dtype=int64)} + + +3. 使用`GeneratorDataset`类加载自定义数据集,并且采取多进程优化方案,开启了4个进程并发完成任务,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。 + + + ```python + def generator_func(num): + for i in range(num): + yield (np.array([i]),) + + # create GeneratorDataset for reading data + dataset = ds.GeneratorDataset(source=generator_func(5),column_names=["data"],num_parallel_workers=4) + # create a dictionary iterator and read a data record through the iterator + print(next(dataset.create_dict_iterator())) + ``` + + 输出: + + {'data': array([0], dtype=int64)} + + +## shuffle性能优化 + +shuffle操作主要是对有序的数据集或者进行过repeat的数据集进行混洗,MindSpore专门为用户提供了`shuffle`函数,其中设定的`buffer_size`参数越大,混洗程度越大,但时间、计算资源消耗也会大。该接口支持用户在整个pipeline的任何时候都可以对数据进行混洗,具体内容请参考[shuffle处理](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/data_processing_and_augmentation.html#shuffle)。但是因为底层的实现方式不同,该方式的性能不如直接在[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html)中设置`shuffle`参数直接对数据进行混洗。 + +### 性能优化方案 + +![title](./images/shuffle_performance_scheme.png) + +shuffle性能优化建议如下: +- 直接使用内置加载算子的`shuffle`参数进行数据的混洗。 +- 如果使用的是`shuffle`函数,当性能仍无法满足需求,可通过调大`buffer_size`参数的值来优化提升性能。 + +### 代码示例 + +基于以上的shuffle性能优化建议,本次体验分别使用内置加载算子`Cifar10Dataset`类的`shuffle`参数和`Shuffle`函数进行数据的混洗,代码演示如下: + +1. 使用内置算子`Cifar10Dataset`类加载CIFAR-10数据集,这里使用的是CIFAR-10二进制格式的数据集,并且设置`shuffle`参数为True来进行数据混洗,最后对数据创建了字典迭代器,并通过迭代器读取了一条数据记录。 + + + ```python + cifar10_path = "./dataset/Cifar10Data/cifar-10-batches-bin/" + + # create Cifar10Dataset for reading data + cifar10_dataset = ds.Cifar10Dataset(cifar10_path,shuffle=True) + # create a dictionary iterator and read a data record through the iterator + print(next(cifar10_dataset.create_dict_iterator())) + ``` + + 输出: + + {'image': array([[[254, 254, 254], + [255, 255, 254], + [255, 255, 254], + ..., + [232, 234, 244], + [226, 230, 242], + [228, 232, 243]], + ..., + [ 64, 61, 63], + [ 63, 58, 60], + [ 61, 56, 58]]], dtype=uint8), 'label': array(9, dtype=uint32)} + + +2. 使用`shuffle`函数进行数据混洗,参数`buffer_size`设置为3,数据采用`GeneratorDataset`类自定义生成。 + + + ```python + def generator_func(): + for i in range(5): + yield (np.array([i,i+1,i+2,i+3,i+4]),) + + ds1 = ds.GeneratorDataset(source=generator_func,column_names=["data"]) + print("before shuffle:") + for data in ds1.create_dict_iterator(): + print(data["data"]) + + ds2 = ds1.shuffle(buffer_size=3) + print("after shuffle:") + for data in ds2.create_dict_iterator(): + print(data["data"]) + ``` + + 输出: + + before shuffle: + [0 1 2 3 4] + [1 2 3 4 5] + [2 3 4 5 6] + [3 4 5 6 7] + [4 5 6 7 8] + after shuffle: + [2 3 4 5 6] + [0 1 2 3 4] + [4 5 6 7 8] + [1 2 3 4 5] + [3 4 5 6 7] + + +## 数据增强性能优化 + +在图片分类的训练中,尤其是当数据集比较小的时候,用户可以使用数据增强的方式来预处理图片,从而丰富数据集。MindSpore为用户提供了多种数据增强的方式,其中包括: +- 使用内置C算子(`c_transforms`模块)进行数据增强。 +- 使用内置Python算子(`py_transforms`模块)进行数据增强。 +- 用户可根据自己的需求,自定义Python函数进行数据增强。 + +具体的内容请参考[数据增强](https://www.mindspore.cn/tutorial/zh-CN/r0.7/use/data_preparation/data_processing_and_augmentation.html#id3)。因为底层的实现方式不同,所以性能还是有一定的差异,如下所示: + +| 模块 | 底层接口 | 说明 | +| :----: | :----: | :----: | +| c_transforms | C++(基于OpenCV)| 性能高 | +| py_transforms | Python(基于PIL) | 该模块提供了多种图像增强功能,并提供了PIL Image和Numpy数组之间的传输方法 | + + +### 性能优化方案 + +![title](./images/data_enhancement_performance_scheme.png) + + +数据增强性能优化建议如下: +- 优先使用`c_transforms`模块进行数据增强,因为性能最高,如果性能仍无法满足需求,可采取[多线程优化方案](#多线程优化方案)、[Compose优化方案](#Compose优化方案)或者[算子融合优化方案](#算子融合优化方案)。 +- 如果使用了`py_transforms`模块进行数据增强,当性能仍无法满足需求,可采取[多线程优化方案](#多线程优化方案)、[多进程优化方案](#多进程优化方案)、[Compose优化方案](#Compose优化方案)或者[算子融合优化方案](#算子融合优化方案)。 +- `c_transforms`模块是在C++内维护buffer管理,`py_transforms`模块是在Python内维护buffer管理。因为Python和C++切换的性能成本,建议不要混用算子。 +- 如果用户使用了自定义Python函数进行数据增强,当性能仍无法满足需求,可采取[多线程优化方案](#多线程优化方案)或者[多进程优化方案](#多进程优化方案),如果还是无法提升性能,就需要对自定义的Python代码进行优化。 + +### 代码示例 + +基于以上的数据增强性能优化建议,本次体验分别使用`c_transforms`模块和自定义Python函数进行了数据增强,演示代码如下所示: + +1. 使用`c_transforms`模块进行数据增强,数据增强时采用多线程优化方案,开启了4个线程并发完成任务,并且采用了算子融合优化方案,使用`RandomResizedCrop`融合类替代`RandomResize`类和`RandomCrop`类。 + + + ```python + import mindspore.dataset.transforms.c_transforms as c_transforms + import mindspore.dataset.transforms.vision.c_transforms as C + import matplotlib.pyplot as plt + cifar10_path = "./dataset/Cifar10Data/cifar-10-batches-bin/" + + # create Cifar10Dataset for reading data + cifar10_dataset = ds.Cifar10Dataset(cifar10_path,num_parallel_workers=4) + transforms = C.RandomResizedCrop((800,800)) + # apply the transform to the dataset through dataset.map() + cifar10_dataset = cifar10_dataset.map(input_columns="image",operations=transforms,num_parallel_workers=4) + + data = next(cifar10_dataset.create_dict_iterator()) + plt.imshow(data["image"]) + plt.show() + ``` + + 输出: + + ![png](./images/cifar10_c_transforms.png) + + +2. 使用自定义Python函数进行数据增强,数据增强时采用多进程优化方案,开启了4个进程并发完成任务。 + + + ```python + def generator_func(): + for i in range(5): + yield (np.array([i,i+1,i+2,i+3,i+4]),) + + ds3 = ds.GeneratorDataset(source=generator_func,column_names=["data"]) + print("before map:") + for data in ds3.create_dict_iterator(): + print(data["data"]) + + func = lambda x:x**2 + ds4 = ds3.map(input_columns="data",operations=func,python_multiprocessing=True,num_parallel_workers=4) + print("after map:") + for data in ds4.create_dict_iterator(): + print(data["data"]) + ``` + + 输出: + + before map: + [0 1 2 3 4] + [1 2 3 4 5] + [2 3 4 5 6] + [3 4 5 6 7] + [4 5 6 7 8] + after map: + [ 0 1 4 9 16] + [ 1 4 9 16 25] + [ 4 9 16 25 36] + [ 9 16 25 36 49] + [16 25 36 49 64] + + +## 性能优化方案总结 + +### 多线程优化方案 + +在数据pipeline过程中,相关算子一般都有线程数设置参数,来提升处理并发度,提升性能,例如: +- 在数据加载的过程中,内置数据加载类有`num_parallel_workers`参数用来设置线程数。 +- 在数据增强的过程中,`map`函数有`num_parallel_workers`参数用来设置线程数。 +- 在Batch的过程中,`batch`函数有`num_parallel_workers`参数用来设置线程数。 + +具体内容请参考[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html)。 + +### 多进程优化方案 + +数据处理中Python实现的算子均支持多进程的模式,例如: +- `GeneratorDataset`这个类默认是多进程模式,它的`num_parallel_workers`参数表示的是开启的进程数,默认为1,具体内容请参考[GeneratorDataset](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html#mindspore.dataset.GeneratorDataset)。 +- 如果使用Python自定义函数或者`py_transforms`模块进行数据增强的时候,当`map`函数的参数`python_multiprocessing`设置为True时,此时参数`num_parallel_workers`表示的是进程数,参数`python_multiprocessing`默认为False,此时参数`num_parallel_workers`表示的是线程数,具体的内容请参考[内置加载算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.html)。 + +### Compose优化方案 + +Map算子可以接收Tensor算子列表,并将按照顺序应用所有的这些算子,与为每个Tensor算子使用的Map算子相比,此类“胖Map算子”可以获得更好的性能,如图所示: + +![title](./images/compose.png) + +### 算子融合优化方案 + +提供某些融合算子,这些算子将两个或多个算子的功能聚合到一个算子中。具体内容请参考[数据增强算子](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindspore/mindspore.dataset.transforms.vision.html),与它们各自组件的流水线相比,这种融合算子提供了更好的性能。如图所示: + +![title](./images/operator_fusion.png) diff --git a/tutorials/source_zh_cn/index.rst b/tutorials/source_zh_cn/index.rst index c1551225..b02b7e90 100644 --- a/tutorials/source_zh_cn/index.rst +++ b/tutorials/source_zh_cn/index.rst @@ -55,6 +55,7 @@ MindSpore教程 advanced_use/graph_kernel_fusion advanced_use/quantization_aware advanced_use/gradient_accumulation + advanced_use/optimize_the_performance_of_data_preparation .. toctree:: :glob: -- GitLab