MindSpore:model.train中的dataset_sink_mode该如何理解?

问题描述:

【功能模块】

看教程的时候,model.train中的dataset_sink_mode我无论是直接从英文的角度理解还是机翻了之后理解都不是特别懂。

MindSpore:model.train中的dataset_sink_mode该如何理解?_第1张图片

【操作步骤&问题现象】

我在新手教程中看到这么一段话,不知道是否意味着如果我用的是GPU,那么应该把参数设置为TRUE呢?

MindSpore:model.train中的dataset_sink_mode该如何理解?_第2张图片

2、

我在自己实际实验的时候,发现如果把数据下沉模式设置为False,打印间隔为125,batch_size设为32,总数据量为60000(也就是一共可以分成1875份),那么就会像下面这样输出结果:

MindSpore:model.train中的dataset_sink_mode该如何理解?_第3张图片

可是在其他都不变的情况下,如果我把数据下沉模式设置为TRUE,那么就只会打印step为1875的情况,前面的都没有打印。

MindSpore:model.train中的dataset_sink_mode该如何理解?_第4张图片

我想问一下,造成这个不同的原因是什么? 看来我果然没有把数据下沉模式理解的很透彻。

据我所知,用MindSpore训练的时候,遵循这样的流程:

首先60000数据集要拿出一部分先放到内存空间中(比如自己指定开辟了容纳1K数据量的内存空间),然后将这1k数据shuffle之后,再逐次取32个数据(batch_size=32)像流水一样源源不断放到网络里进行训练。

我怀疑是不是如果把数据下沉模式设置为TRUE的话,那么就会让其中的某个环节被跳过呢?

总之,能帮我解释一下数据下沉模式这个参数到底是什么意思吗?

解决方案:

  1.  dataset_sink_mode=True时,数据处理(dataset加载及其处理)会和网络计算构成Pipeline方式,即:数据处理在逐步处理数据时,处理完一个batch的数据,会把数据放到一个队列里,这个队列用于缓存已经处理好的数据,然后网络计算从这个队列里面取数据用于训练,那么此时数据处理与网络计算就Pipeline起来了,整个训练耗时就是数据处理 / 网络计算耗时最长的那个。

  2. dataset_sink_mode=False时,数据处理(dataset加载及处理)会和网络计算构成串行的过程,即:数据处理在处理完一个batch后,把这个batch的数据传递给网络用于计算,在计算完成后,数据处理再处理下一个batch,然后把这个新的batch数据传递给网络用于计算,如此的循环往复,直到训练完。该方法的总耗时是数据处理的耗时 + 网络计算的耗时 = 训练总耗时。

  3. 你对于数据处理的理解稍微有点偏差,我这么解释下:

    数据处理一般分加载、处理、batch 三个阶段,在加载阶段一般会获取整个数据集的meta信息,基于此meta信息可以进行数据集的shuffle(整个数据集的),也可做数据的分片,用于分布式训练,然后基于这个meta信息一个一个样本的从存储上加载至内存中,样本加载至内存后,会在处理操作(map操作)中一步一步的处理,最后传递至batch操作,组织成batch size大小。

    对于整个数据集的shuffle一般在数据集加载接口里面就可以使用,shuffle=True。

    参考:mindspore.dataset.MindDataset — MindSpore master documentation 

  4. 你说的会建立一个空间大小用于shuffle数据,是我们的 dataset.shuffle(buffer_size=N)逻辑。

    参考:mindspore.dataset.MindDataset — MindSpore master documentation 中的shuffle(buffer_size)函数。

    MindSpore:model.train中的dataset_sink_mode该如何理解?_第5张图片

你可能感兴趣的:(python,深度学习,人工智能)