医院做网站需要去备案,网站建设综合设计,优惠券网站做代理怎么样,中国百强企业榜单大家好#xff0c;我是刘明#xff0c;明志科技创始人#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享#xff0c;如果你也喜欢我的文章#xff0c;就点个关注吧 shuffle性能优化
shuffle操作主要是对有… 大家好我是刘明明志科技创始人华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享如果你也喜欢我的文章就点个关注吧 shuffle性能优化
shuffle操作主要是对有序的数据集或者进行过repeat的数据集进行混洗MindSpore专门为用户提供了shuffle函数它是基于内存缓存实现的其中设定的buffer_size参数越大混洗程度越大但内存空间、时间消耗也会更大。该接口支持用户在整个pipeline的任何时候都可以对数据进行混洗具体内容请参考shuffle处理。
但是因为它是基于内存缓存方式实现该方式的性能不如直接在数据集加载操作中设置shuffleTrue默认值True参数直接对数据进行混洗。
shuffle方案选择参考如下 shuffle性能优化建议如下 直接使用数据集加载接口中的shuffleTrue参数进行数据的混洗 如果使用的是shuffle函数当混洗效果无法满足需求可通过调大buffer_size参数的值来优化混洗效果当机器内存占用率过高时可通过调小buffer_size参数的值来降低内存占用率。
基于以上的shuffle方案建议本次体验分别使用数据集加载操作Cifar10Dataset类的shuffle参数和shuffle函数进行数据的混洗代码演示如下
使用数据集加载接口Cifar10Dataset类加载CIFAR-10数据集这里使用的是CIFAR-10二进制格式的数据集并且设置shuffle参数为True来进行数据混洗最后对数据创建了字典迭代器并通过迭代器读取了一条数据记录。
cifar10_path ./datasets/cifar-10-batches-bin/train# create Cifar10Dataset for reading data
cifar10_dataset ds.Cifar10Dataset(cifar10_path, shuffleTrue)
# create a dictionary iterator and read a data record through the iterator
print(next(cifar10_dataset.create_dict_iterator()))
使用shuffle函数进行数据混洗参数buffer_size设置为3数据采用GeneratorDataset类自定义生成。
def generator_func():for i in range(5):yield (np.array([i, i1, i2, i3, i4]),)ds1 ds.GeneratorDataset(sourcegenerator_func, column_names[data])
print(before shuffle:)
for data in ds1.create_dict_iterator():print(data[data])ds2 ds1.shuffle(buffer_size3)
print(after shuffle:)
for data in ds2.create_dict_iterator():print(data[data])
数据增强性能优化
在训练任务中尤其是当数据集比较小的时候用户可以使用数据增强的方法来预处理图片达到丰富数据集的目的。MindSpore为用户提供了多种数据增强操作其中包括 Vision类数据增强操作主要基于C实现见Vision数据增强。 NLP类数据增强操作主要基于C实现见NLP数据增强。 Audio类数据增强操作主要基于C实现见Audio数据增强。 并且用户可根据特定的需求自定义Python数据增强函数Python实现。
数据增强操作选择参考 数据增强性能优化建议如下
优先使用MindSpore提供的数据增强操作能获得更好的性能如果性能仍无法满足需求可采取如下方式进行优化
多线程优化
增大map接口的参数num_parallel_workers默认值8来取得更好的性能。
融合算子优化
在当前CPU占用率比较高时如单机多卡训练使用融合操作将两个或多个操作的功能聚合到一个操作中来降低CPU占用会获得更好性能可以通过配置环境变量export OPTIMIZEtrue来使其生效。融合示例如下
Compose优化 在当前CPU占用率比较高时如单机多卡训练通过一个map操作接收多个增强操作会按照顺序应用这些操作来降低CPU降低竞争以取得更好性能。示例如下
如果用户使用自定义Python函数进行数据增强当性能仍无法满足需求则可采取多进程/多线程并发方案参考如下但如果还是无法提升性能就需要对自定义的Python函数进行优化。 增大map接口的参数num_parallel_workers默认值8来提升并发度 将map接口的参数python_multiprocessing设置为True/False(默认值)来启动多进程模式/多线程模式多进程模式适用于cpu计算密集型任务多线程适用于IO密集型任务 如果有Using shared memory queue, but rowsize is larger than allocated memory …日志提示那么将map接口的参数max_rowsize默认值6M按日志提示进行增大来提升进程间数据传递的效率。
基于以上的数据增强性能优化建议本次体验分别使用实现在C层的数据增强操作和自定义Python函数进行数据增强演示代码如下所示
使用实现在C层的数据增强操作采用多线程优化方案开启了4个线程并发完成任务并且采用了融合算子优化方案框架中使用RandomResizedCrop融合类替代RandomResize类和RandomCrop类。
import mindspore.dataset.vision as vision
import matplotlib.pyplot as pltcifar10_path ./datasets/cifar-10-batches-bin/train# create Cifar10Dataset for reading data
cifar10_dataset ds.Cifar10Dataset(cifar10_path, num_parallel_workers4)
transforms vision.RandomResizedCrop((800, 800))
# apply the transform to the dataset through dataset.map()
cifar10_dataset cifar10_dataset.map(operationstransforms, input_columnsimage, num_parallel_workers4)data next(cifar10_dataset.create_dict_iterator())
plt.imshow(data[image].asnumpy())
plt.show()
使用自定义Python函数进行数据增强数据增强时采用多进程优化方案开启了4个进程并发完成任务。
def generator_func():for i in range(5):yield (np.array([i, i1, i2, i3, i4]),)ds3 ds.GeneratorDataset(sourcegenerator_func, column_names[data])
print(before map:)
for data in ds3.create_dict_iterator():print(data[data])def preprocess(x):return (x**2,)
ds4 ds3.map(operationspreprocess, input_columnsdata, python_multiprocessingTrue, num_parallel_workers4)
print(after map:)
for data in ds4.create_dict_iterator():print(data[data])
batch操作性能优化
在数据处理的最后阶段会使用batch操作将多条数据组织成一个batch然后再传递给网络用于训练。对于batch操作的性能优化建议如下 如果仅配置了batch_size和drop_remainder且batch_size比较大时建议增大num_parallel_workers默认值8来取得更好的性能 如果使用了per_batch_map功能那么建议配置如下 增大参数num_parallel_workers默认值8来提升并发度 将参数python_multiprocessing设置为True/False(默认值)来启动多进程模式/多线程模式多进程模式适用于cpu计算密集型任务多线程适用于IO密集型任务 如果有Using shared memory queue, but rowsize is larger than allocated memory …日志提示那么将batch接口的参数max_rowsize默认值6M按日志提示进行增大来提升进程间数据传递的效率。