一种加速深度学习训练任务数据载入的方法转让专利

申请号 : CN202111221953.7

文献号 : CN113656333B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 朱春节银燕龙何水兵曾令仿秦亦周方

申请人 : 之江实验室

摘要 :

本发明公开了一种加速深度学习训练任务数据载入的方法,该方法使用双随机序列方式,在每个训练周期开始时提前计算下一个周期的随机序列,并申请一块独立的内存提前缓存下一个周期初始阶段所需数据。根据当前周期的随机序列依次为神经网络准备数据的同时,可参照下一个周期的随机序列及时将下一个周期初始阶段所需数据依次从内存拷贝到缓存,使得下一个周期初始阶段所需的数据可全部从缓存获得。本发明不需修改现有深度学习的架构,实现简单,引入的计算开销小,缓存数据能全部命中且可被使用多次,从而减少从后端存储系统读取数据,并且训练周期数越多,此方法的加速效果越明显。

权利要求 :

1.一种加速深度学习训练任务数据载入的方法,其特征在于包括如下步骤:S1,内存中单独划分一块区域作为缓存,记为Cachenext;

S2,构建双随机序列模式,用于决定训练集的数据进入神经网络的顺序,随机序列的元素与训练集的数据一一对应,每一个训练周期内,同时存在新旧两个互不相同且彼此独立的随机序列;

S3,第一个训练周期之前,生成一个随机序列Snext,而任一训练周期开始时,将现存的随机序列Snext赋值给Scur,并由它决定当前周期数据进入神经网络的顺序,然后生成一个新的随机序列,记为Snext,用于决定下一个周期数据进入神经网络的顺序,Snext包括子序列Snext_prefix,涵盖下一个周期初始阶段将使用到的训练集的数据,随着数据载入阶段周期性地执行,每个周期遍历Scur,对于Scur的每一个元素Scur[i],从Cachenext或后端存储系统获取Scur[i]对应的训练集的数据,将此数据放入内存,然后参考Snext_prefix更新Cachenext,包括如下步骤:

S31,当Scur[i]在Cachenext的前段curList命中时,Scur[i]对应的训练集的数据从curList拷贝至内存,然后在curList中删除Scur[i]对应的数据,此时,若Scur[i]存在于Snext_prefix中,则Scur[i]对应训练集的数据被插入Cachenext的后段nexList;Cachenext在逻辑上分为curList和nexList,其中curList缓存当前训练周期使用的数据,nexList缓存下一个训练周期将使用的数据;

S32,当Scur[i]在Cachenext的前段curList不命中时,从后端存储系统读取Scur[i]对应的训练集的数据至内存,此时,若Scur[i]存在于Snext_prefix中,则Scur[i]对应训练集的数据被插入Cachenext的后段nexList;

S33,当Scur遍历结束时,清空Scur,只剩下一个随机序列Snext;

S4,当前周期完成,若完成的周期数小于预先设定的数目N,则返回S3开始下一个周期的训练,若所有训练周期都已完成,则深度学习训练任务结束。

2.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S2包括如下步骤:

S21,在深度学习训练任务的第一个周期开始之前,生成一个随机序列,记为Snext;

S22,每一个周期开始时,Snext赋值给Scur,Scur决定当前周期数据进入神经网络的顺序;

S23,使用新的随机种子生成另一个随机序列赋值给Snext,Snext决定下一个周期数据进入神经网络的顺序,至此系统中同时存在两个互不相同且相互独立的随机序列;

S24,一个周期结束时,清空Scur,保留Snext。

3.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S1包括如下步骤:

S11,第一个训练周期开始前,Cachenext为空,curList和nexList也为空;

S12,第一个训练周期内,curList为空,插入Cachenext的数据都位于nexList;

S13,非第一个训练周期开始时,nexList的数据全部转入curList,nexList为空;

S14,非第一个训练周期期间,curList中的数据命中便被移除,其长度逐渐缩短,而新插入Cachenext的数据均进入nexList,使得nexList的长度逐渐增长;

S15,一个训练周期结束时,curList长度为零,nexList的长度等于Cachenext的长度;

S16,nexList中数据的先后顺序与这些数据的ID在Snext_prefix的顺序保持一致。

4.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S1中的Cachenext,使用链表方式组织,在逻辑上分为curList和nexList。

5.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S1中,Cachenext的容量根据系统实际可用的内存决定。

6.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S2中,随机序列的元素是训练集中数据的ID。

7.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S2中,随机序列使用随机函数生成,随机函数所需的随机种子,使用计算机的时钟进行初始化。

8.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S2中,随机序列的元素与训练集的数据一一对应,且序列长度与训练集数据的总数量相同。

9.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S3中,Snext_prefix的长度与Cachenext可包含的节点数相同,Cachenext的容量是预定义的,因此Snext_prefix包含的元素数目在深度学习训练任务开始前设定。

10.根据权利要求1所述的一种加速深度学习训练任务数据载入的方法,其特征在于所述S3中,训练集的数据进入内存后,进入数据增强阶段,且增强操作会直接修改内存中的原始数据,经过增强的数据组成batch,然后进入神经网络模型训练阶段。

说明书 :

一种加速深度学习训练任务数据载入的方法

技术领域

[0001] 本发明涉及深度学习领域,尤其是涉及一种加速深度学习训练任务数据载入的方法。

背景技术

[0002] 深度学习是机器学习的分支,是一种基于人工神经网络对资料进行表征学习的算法,它被广泛用于计算机视觉、语音识别、自然语言处理等领域。深度学习训练任务的训练
过程,分多个周期执行,通过重复训练产生收敛的模型。每个周期的训练过程可分为三个阶
段,即数据载入,数据增强,神经网络模型训练。数据载入阶段需实现两个功能,一是从后端
存储系统中将训练集读到内存,二是对训练集进行随机化洗牌。数据增强阶段的功能是对
内存中的训练数据进行翻转,旋转,缩放,裁剪,移位,调色等操作,增大训练集涵盖的样本
空间。
[0003] 神经网络模型训练阶段,利用增强后的数据,计算出一个包含众多参数的神经网络模型。
[0004] 其中,数据载入阶段属于I/O密集型,而其他两个阶段属于计算密集型。近年来计算机算力的增长速度远大于存储端I/O性能的提升速度,这使得数据载入阶段的时间开销
在总训练开销中的占比不断攀升,并逐渐成为深度学习训练的瓶颈之一。
[0005] 传统的加速数据载入的方法,侧重于优化训练集在后端存储系统的组织方式和访问模式,例如将训练集中的小文件打包成捆,并以捆为单位将训练集载入内存,从而避免性
能低下的小文件随机读操作,或是按数据存储的顺序依次将小文件载入内存,然后在内存
中实现局部随机化,从而将性能低下的随机读转换为快速的顺序读。这些方法能有效利用
后端存储系统的I/O带宽,加快训练集载入内存的速度,但是这类方法对数据载入的加速效
果几乎已经达到极限。
[0006] 为避免深度学习的过拟合现象,通常情况下,训练集在数据载入阶段,需进行全局的随机洗牌。然而,因为训练集的规模太大,全局洗牌过程不能直接在内存进行,所以每个
训练周期需首先计算出一个随机序列,然后根据此序列将训练集的数据逐一载入内存,而
数据增强操作将直接修改内存中的原始数据,这导致数据每次从后端存储系统载入内存
后,只能使用一次,下一个周期需重新载入,后端存储系统因此面临沉重的I/O负担。目前,
此问题缺少有效的解决方案。

发明内容

[0007] 为解决现有技术的不足,实现减少从后端存储系统读取数据,提高数据载入速度,并且随训练周期数越多,加速效果越明显的目的,本发明采用如下的技术方案:
[0008] 一种加速深度学习训练任务数据载入的方法,包括如下步骤:
[0009] S1,在深度学习训练任务初始化时,从深度学习训练任务所占内存中单独划分一块区域作为缓存,记为Cachenext,它提供深度学习训练任务在当前周期所需数据,并提前缓
存下一个周期初始阶段所需的数据;
[0010] S2,构建双随机序列模式,用于决定训练集的数据进入神经网络的顺序,随机序列的元素与训练集的数据一一对应,每一个训练周期内,同时存在新旧两个互不相同且彼此
独立的随机序列;
[0011] S3,第一个训练周期之前,生成一个随机序列Snext,而任一训练周期开始时,将现存的随机序列Snext赋值给Scur,并由它决定当前周期数据进入神经网络的顺序,然后生成一
个新的随机序列,记为Snext,用于决定下一个周期数据进入神经网络的顺序,Snext包括子序
列Snext_prefix,涵盖下一个周期初始阶段将使用到的训练集的数据,随着数据载入阶段周期
性地执行,每个周期遍历Scur,对于Scur的每一个元素Scur[i],从Cachenext或后端存储系统获
取Scur[i]对应的训练集的数据,将此数据放入内存,然后参考Snext_prefix更新Cachenext,包括
如下步骤:
[0012] S31,当Scur[i]在Cachenext的前段curList命中时,Scur[i]对应的训练集的数据从curList拷贝至内存,然后在curList中删除Scur[i]对应的数据,此时,若Scur[i]存在于
Snext_prefix中,则Scur[i]对应训练集的数据被插入Cachenext的后段nexList;
[0013] S32,当Scur[i]在Cachenext的前段curList不命中时,从后端存储系统读取Scur[i]对应的训练集的数据至内存,此时,若Scur[i]存在于Snext_prefix中,则Scur[i]对应训练集的数
据被插入Cachenext的后段nexList;
[0014] S33,当Scur遍历结束时,清空Scur,只剩下一个随机序列Snext;
[0015] S4,当前周期完成,若完成的周期数小于预先设定的数目N,则返回S3开始下一个周期的训练,若所有训练周期都已完成,则深度学习训练任务结束。
[0016] 进一步地,所述S2包括如下步骤:
[0017] S21,在深度学习训练任务的第一个周期开始之前,生成一个随机序列,记为Snext;
[0018] S22,每一个周期开始时,Snext赋值给Scur,Scur决定当前周期数据进入神经网络的顺序;
[0019] S23,使用新的随机种子生成另一个随机序列赋值给Snext,Snext决定下一个周期数据进入神经网络的顺序,至此系统中同时存在两个互不相同且相互独立的随机序列;
[0020] S24,一个周期结束时,清空Scur,保留Snext。
[0021] 进一步地,所述S1的Cachenext在逻辑上分为curList和nexList,其中curList缓存当前训练周期使用的数据,nexList缓存将下一个训练周期将使用的数据,包括如下步骤:
[0022] S11,第一个训练周期开始前,Cachenext为空,curList和nexList也为空;
[0023] S12,第一个训练周期内,curList为空,插入Cachenext的数据都位于nexList;
[0024] S13,非第一个训练周期开始时,nexList的数据全部转入curList,nexList为空;
[0025] S14,非第一个训练周期期间,curList中的数据命中便被移除,其长度逐渐缩短,而新插入Cachenext的数据均进入nexList,使得nexList的长度逐渐增长;
[0026] S15,一个训练周期结束时,curList长度为零,nexList的长度等于Cachenext的长度;
[0027] S16,nexList中数据的先后顺序与这些数据的ID在Snext_prefix的顺序保持一致。
[0028] 进一步地,所述S1中,Cachenext使用链表方式组织,在逻辑上分为curList和nexList。
[0029] 进一步地,所述S1中,Cachenext的容量根据系统实际可用的内存由开发人员自行决定。
[0030] 进一步地,所述S2中,随机序列的元素是训练集中数据的ID。
[0031] 进一步地,所述S2中,随机序列使用随机函数生成,随机函数所需的随机种子,使用计算机的时钟进行初始化。
[0032] 进一步地,所述S2中,随机序列与训练集的数据一一对应,且序列长度与训练集数据的总数量相同。
[0033] 进一步地,所述S3中,Snext_prefix的长度与Cachenext可包含的节点数相同,Cachenext的容量是预定义的,因此Snext_prefix包含的元素数目在深度学习训练任务开始前设定。
[0034] 进一步地,所述S3中,训练集的数据进入内存后,进入数据增强阶段,且增强操作会直接修改内存中的原始数据,增强后的数据与其他经过增强的数据组成batch,然后进入
神经网络模型训练阶段。
[0035] 本发明的优势和有益效果在于:
[0036] 本发明通过额外占用一块内存作为缓存,在深度学习训练任务的每个训练周期开始时,提前计算下一个周期洗牌时所需的随机序列,使得每个周期的数据载入阶段拥有双
随机序列。根据当前周期的随机序列向内存载入训练集数据的同时,参考另一个随机序列
提前将下一个周期初期将使用的数据按顺序缓存起来,从而在下一个周期初期,数据载入
阶段可快速地从缓存读取所需的数据,而不需向后端存储系统读取,从而显著减少数据载
入阶段的时间开销,消除深度学习训练任务的I/O瓶颈。缓存占用的内存空间是可配置的,
配置的内存越大,算法的加速效果越好,此外,深度学习训练任务执行的周期数越多,算法
加速的效果越好。最终,避免了数据每次从后端存储系统载入内存后,只能使用一次,下一
个周期需重新载入的情形,减轻了后端存储系统面临的沉重I/O负担。

附图说明

[0037] 图1是采用本发明方法加速深度学习训练任务的工作框架图。
[0038] 图2是本发明中Cachenext的节点设计示意图。
[0039] 图3是本发明中Cachenext的组织结构示意图。
[0040] 图4是本发明中的双随机序列示意图。
[0041] 图5是本发明中Snext随机序列的逻辑划分示意图。
[0042] 图6是本发明的方法流程图。
[0043] 图7是本发明中更新Cachenext的流程图。

具体实施方式

[0044] 以下结合附图对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
[0045] 如图6所示,一种加速深度学习训练任务数据载入的方法,目的是显著减少数据载入阶段的时间开销,消除深度学习训练任务的I/O瓶颈。该算法需额外占用一块内存,占用
的内存空间是可配置的,配置的内存越大,算法的加速效果越好。此外,深度学习训练任务
执行的周期数越多,算法加速的效果越好。该算法提前计算下一个周期所需的随机序列,使
得每个周期的数据载入阶段拥有双随机序列。然后在根据当前周期的随机序列载入训练集
的同时,参考另一个随机序列提前将下一个周期初期将使用的数据按顺序缓存起来。然后
在下一个周期初期,数据载入阶段可快速地从缓存读取所需的数据,而不会向后端存储系
统读取。
[0046] 本发明提出的方法在数据载入阶段采用双随机序列,它们分别指示当前周期和下一个周期训练集进入神经网络的顺序,但每个周期只需更新一个周期的随机序列。相应地,
算法单独申请一块内存区域作为缓存Cachenext,其目的是一方面提供当前周期所需数据,
另一方面及时缓存下一个周期初期将使用的数据。
[0047] 通过本发明的装置使用ImageNet数据集在深度学习平台Pytorch上训练ResNet模型的方法,包括如下步骤:
[0048] 1、如图1所示,本发明的装置以一个组件的形式部署在深度学习平台Pytorch。
[0049] 1.1、当ResNet模型训练任务初始化时,该组件为此任务申请一块缓冲区域,记为Cachenext,此时Cachenext没有缓存任何内容;Cachenext的容量由使用者根据系统可用的内存
预先设定,如系统空闲内存有2GB,则Cachenext的容量不能大于2GB。
[0050] 1.2、Cachenext采用的数据结构为双向链表,其结构如图3所示,Cachenext具备一个指针pointer,它将Cachenext的链表分为两部分,靠近表头的部分缓存epochm期间Pytorch将
引用的图片,记为curList,靠近表尾的部分缓存epochm+1期间Pytorch将引用的图片,记为
nexList,pointer指向nexList的第一个节点;链表的节点设计如图2所示,每个节点主要包
含三个成员,即pre、nex和data,其中pre是指向当前节点在链表中的前驱节点的指针,nex
是指向当前节点在链表中的后继节点的指针,data是指向当前节点的数据域的指针,此案
例中一个节点的数据域缓存ImageNet训练集的一张图片。
[0051] 1.3、ImageNet训练集由一系列图片组成,每张图片在一个epoch期间只被引用一次,Pytorch使用洗牌功能产生随机序列,序列的长度与ImageNet训练集中的图片总数相
等,且序列中的每一项元素对应ImageNet训练集中的一张图片,而Pytorch根据随机序列决
定图片进入ResNet模型的顺序。
[0052] 2、ResNet模型的训练过程周期性地执行N次。
[0053] 2.1、epoch0开始之前,Scur为空,Pytorch使用洗牌功能产生一个随机序列,记为Snext,它决定epoch0期间ImageNet训练集的图片进入ResNet模型的顺序。
[0054] 2.2、epoch(m 0<=mSnext,而Snext决定epochm+1期间图片进入ResNet模型训练的顺序;此时,Pytorch拥有两个相
互独立且互不相同的随机序列,如图4所示。
[0055] 2.3、当两个随机序列Scur和Snext准备就绪后,Pytorch在epochm期间根据Scur依次从Cachenext或后端存储系统载入图片,然后根据Snext更新Cachenext,流程如图6所示,具体步骤
如下
[0056] 2.3.1、若Scur[i]在Cachenext命中,则Pytorch从Cachenext取出对应图片到内存,并将此图片从Cachenext删除;否则,Pytorch从后端存储系统读取图片到内存。
[0057] 2.3.2、如图5所示,Snext在逻辑上分前后两部分,记为Snext_prefix和Snext_suffix,其中Snext_prefix的长度由Cachenext的容量决定,而Snext_prefix涵盖的图片在epochm期间陆续被插入
Cachenext;
[0058] 如果Scur[i]存在于Snext_prefix,则复制内存中Scur[i]对应的图片,并将其插入Cachenext,即使Scur[i]在上述步骤2.3.1中刚从Cachenext中移除;否则,不更新Cachenext。
[0059] 2.4、此时Scur[i]已经在内存中准备就绪,它经过数据增强阶段后,与其他经过数据增强的图片组成batch,然后进入ResNet模型进行训练。
[0060] 2.5、当Scur[i]是Scur的最后一项时,epochm期间的数据载入已全部完成,此时清空Scur。
[0061] 2.6、当epochm期间ImageNet训练集的所有图片的训练完成后,epochm周期结束。
[0062] 3、Cachenext提供Pytorch在epochm期间所需的数据以及缓存epochm+1初期所需的数据,而Cachenext的管理与深度学习训练任务并发执行,Cachenext的更新流程如图7所示,具体
包括如下步骤
[0063] 3.1、epoch0开始时,Cachenext为空,curList和nexList也为空;epochm(0<=m
[0064] 3.2、在上述步骤2.3.2中,Scur[i]对应的图片插入Cachenext的步骤为:若pointer为NULL,则图片从Cachenext的链表尾部插入,成为nexList的第一个节点,然后pointer指向
此新节点;否则,图片插入Cachenext的nexList部分,nexList的长度增加,且保证nexList所
有节点的位置与它们在Snext_prefix对应元素的位置保持一致;一个epoch结束时,nexList等
同于Cachenext,Snext_prefix的涵盖的图片全部被插入Cachenext。
[0065] 3.3、在上述步骤2.3.1中,判断Scur[i]是否在Cachenext命中时,只需判断Scur[i]是否存在于curList的第一个节点内,若是则Scur[i]在Cachenext命中,否则不命中;当Scur[i]
在Cachenext命中时,从curList移除Scur[i],curList的长度缩短;一个epoch结束时,
curList为空。
[0066] 以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例
所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修
改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的范围。