# 通过优化数据来加速训练速度

**借助自动数据加速工具来优化性能**

MindSpore提供了一种自动数据调优的工具——Dataset AutoTune，用于在训练过程中根据环境资源的情况自动调整数据处理管道的并行度，最大化利用系统资源加速数据处理管道的处理速度。

启动自动数据加速方法、自动数据加速工具的约束及使用样例可参考：[自动数据加速](https://www.mindspore.cn/tutorials/experts/zh-CN/r2.0/dataset/dataset_autotune.html)

**1. 优化batch操作**

在数据处理的最后阶段，会使用batch操作将多条数据组织成一个batch，然后再传递给网络用于训练。

对于batch操作的性能优化可参考：[数据batch性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/r2.0/dataset/optimize.html?&highlight=%25E6%2595%25B0%25E6%258D%25AE%25E5%25A4%2584%25E7%2590%2586%25E6%2580%25A7%25E8%2583%25BD#batch%25E6%2593%258D%25E4%25BD%259C%25E6%2580%25A7%25E8%2583%25BD%25E4%25BC%25)

**2. 优化数据增强**

数据增强性能优化建议如下：

优先使用MindSpore提供的数据增强操作，能获得更好的性能，如果性能仍无法满足需求，可采取如下方式进行优化：

1、多线程优化：增大map接口的参数num\_parallel\_workers（默认值：8）来取得更好的性能。

2、融合算子优化：在当前CPU占用率比较高时，使用融合操作来降低CPU占用会获得更好性能，可以通过配置环境变量export OPTIMIZE=true来使其生效。

3、Compose优化：在当前CPU占用率比较高时（如：单机多卡训练），通过一个map操作接收多个增强操作（会按照顺序应用这些操作）来降低CPU降低竞争以取得更好性能

具体可参考：[数据增强性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/r2.0/dataset/optimize.html?&highlight=%25E6%2595%25B0%25E6%258D%25AE%25E5%25A4%2584%25E7%2590%2586%25E6%2580%25A7%25E8%2583%25BD#%25E6%2595%25B0%25E6%258D%25AE%25E5%25A2%259E%25E5%25BC%25BA%25E6%2580%25A7%25)

**3. 优化shuffle操作**

shuffle操作主要是对有序的数据集或者进行过repeat的数据集进行混洗。MindSpore专门为用户提供了shuffle函数，它是基于内存缓存实现的，其中设定的buffer\_size参数越大，混洗程度越大，但内存空间、时间消耗也会更大。

shuffle性能优化建议如下：

1、直接使用数据集加载接口中的shuffle=True参数进行数据的混洗；

2、如果使用的是shuffle函数，当混洗效果无法满足需求，可通过调大buffer\_size参数的值来优化混洗效果；当机器内存占用率过高时，可通过调小buffer\_size参数的值来降低内存占用率。

具体可参考：[数据shuffle性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/r2.0/dataset/optimize.html?&highlight=%25E6%2595%25B0%25E6%258D%25AE%25E5%25A4%2584%25E7%2590%2586%25E6%2580%25A7%25E8%2583%25BD#shuffle%25E6%2580%25A7%25E8%2583%25BD%25E4%25BC%2598%25E5%258C%2596)

