一种基于深度学习的高效数据加载方法、设备及存储介质
未命名
07-30
阅读:88
评论:0

1.本发明涉及物联网通信技术领域,具体涉及一种基于深度学习的高效数据加载方法,还涉及一种实现上述方法的计算机设备以及存储介质。
背景技术:
2.深度神经网络(dnn)在图像分类、语音识别、自动驾驶汽车、癌症检测和玩复杂游戏等广泛的应用中取得了优异的成绩。但是,在dnn训练任务中,需要重复读取和处理大型数据集才能获得高精度。执行dnn训练是一项数据和计算密集型任务。因此,在不牺牲应用程序准确性或增加硬件成本的情况下提高运行时性能对于dnn训练至关重要。在dnn训练中,必须先加载一部分数据,然后ai加速器(gpu)才能启动训练过程,对加载的数据进行计算。因此,不平衡的i/o和计算性能可能会导致整个训练过程的性能下降。因为通常存储数据集的磁盘的i/o性能有限,每个训练过程都必须等待为ai加速器的计算单元提供数据。由于gpu极大地提高了计算单元的性能,加载数据的性能对于深度神经网络训练的整个运行时性能至关重要。尤其是当从单个硬盘驱动器加载数据以在多个gpu上执行训练时,数据加载将占据重要时间,并成为限制整个训练性能的关键瓶颈。
3.加速dnn训练已经在许多方面进行了研究。首先,被视为人工智能加速器的专用加速器,例如fpga和gpu,通常被采用并针对dnn算法进行优化。在软件方面,tensorflow和pytorch等机器学习库通过预取和多线程技术提供计算任务优化和数据加载加速。数据加载是dnn训练主要时间的一项操作,主要通过数据并行和缓存进行研究和优化。
4.数据并行是一种在训练深度神经网络中提高数据加载效率的常用技术。在importance of data loading pipeline in training deep neural networks这篇论文中,它指出了数据加载的两个主要问题。首先是由于频繁的打开、读取和关闭,直接从文件中读取数据效率低下。同时,对数据进行额外操作的资源分配会使cpu过载。它建议使用二进制数据格式hdf5和来自tensorflow的tfrecord以获得更好的数据加载性能。它揭示了通过使用更多线程来执行数据加载可以提高的性能是有限的,例如pytorch。
5.由于磁盘的iops和吞吐量可能无法满足数据加载性能的要求,缓存是大规模系统中常用的加速数据访问性能的策略,如memcache和ramcloud。
6.现有技术存在的缺点包括以下几点:
7.如图1所示,在深度学习训练中,数据加载需要从磁盘中读取,然后对每个文件进行open、read和close的操作,现在的数据集大小很多都达到了上百gb,有上百多万张文件。如果每一个epoch,都对百多万张文件去进行open、read和close的操作,磁盘i/o会是一个很大的消耗。而且在训练过程中,为了获得更好的准确率,需要训练几十个到上百个epoch,这里面的数据加载时间消耗是非常大的。
8.在数据并行方面,数据流水线可以是一种细粒度的数据加载技术,用于减少训练深度神经网络的i/o开销。它使用多线程来执行数据加载,同时在多gpu上执行训练任务。虽然像hdf5这样的数据格式能够支持数据并行,但是hdf5中的文件只是压缩的,在数据加载
过程中,还是需要对每一个文件进行open、read和close的操作,并不会减少太多的磁盘i/o开销。
9.在缓存方面,如果将数据集完全缓存在内存中,则可以实现快速数据加载。但是,对于一些大型数据集需要数百gb甚至tb级别的内存。所以得设计出一个合理得缓存策略,也需要合理淘汰缓存中得数据,不能长期用相同得数据去进行模型训练,会影响模型训练最终得准确率。
技术实现要素:
10.本发明的目的在于提供一种基于深度学习的高效数据加载方法、设备及存储介质,用于解决现有技术中数据加载时间消耗大,磁盘i/o开销大,模型训练准确率低等问题,通过将小文件压缩成块以及设计有合理的缓存策略,在不影响准确率的情况下,大大减少了数据加载时间以及整体运行时间。
11.第一方面,本发明提供一种基于深度学习的高效数据加载方法,该方法包括以下步骤:以二进制读取的方式打开每个小文件,依次将每个小文件的二进制数据加入到数据块中,生成数据块的数据结构;
12.启动数据块的数据加载,在第一个epoch加载第一个minibatch时,将所有数据缓存在内存中以供重用;
13.重复使用一半加载的数据,每隔一个minibatch在磁盘中加载一半所需的数据;
14.将从磁盘和缓存中加载的数据整合后送到gpu中训练,并进行下一个minibatch的加载;
15.删除缓存中的访问数据以释放内存,使缓存能够适应有限的内存大小。
16.根据本发明提供的一种基于深度学习的高效数据加载方法,所述数据结构包括n、offset field、size field、label field以及raw data field字段,n字段表示为该数据块是将n个小文件整合在一起;offset field字段为偏移字段,其包含从1到n索引的n个整数,每个整数按顺序描述原始数据字段中每个文件在块中的起始位置;size field字段表示为n个整数在块中按顺序描述每个小文件的大小,每个小文件需要n个字节即可表示其size field;label field字段包含n个整数,依次表示每个文件的标签;raw data field字段包含n个小文件的原始数据;其中,数据块中的字段和数据都是以二进制的方式存储的。
17.根据本发明提供的一种基于深度学习的高效数据加载方法,在加载数据块时,通过读取前n个字节来获取数据块中数据项的数量,并且通过offset field和size field字段,可以直接定位具体数据项的原始数据,并在label field字段中找到该数据的标签。
18.根据本发明提供的一种基于深度学习的高效数据加载方法,在通过offset field和size field字段定位具体数据项的原始数据时,包括:
19.第一个文件的偏移量为零,大小由size field字段中的第一个整数给出,第二个文件的偏移量由offset field偏移字段中的第二个整数给出,其大小由size field字段中的第二个整数给出;
20.根据数据块中每个字段所需要的字节数,计算得出数据块中将n个小文件压缩成一个数据块最多需要的额外字节,实现该小文件在数据块中的具体定位。
21.根据本发明提供的一种基于深度学习的高效数据加载方法,在offset field字段
中,依次按顺序存储的是1到n小文件在raw data field中的起始位置,当找到数据块中第m个小文件的位置,通过offset field可知道第m个小文件的起始位置,通过size field知道第m个小文件的大小;
22.通过offset field的起始位置以及size field的文件大小确定到数据块中第m个小文件的二进制数据在raw data field字段中的起始位置和结束位置,从而实现该小文件在块中的具体定位。
23.根据本发明提供的一种基于深度学习的高效数据加载方法,还执行:
24.在训练过程中,使用每个数据块作为shuffle的单元,其中,每个数据块都有一个唯一的数字作为索引,分别是0、1、2和3,所有数据块的索引集是shuffle算法的输入;
25.当对一组索引进行排列时,使用排列后的索引顺序,逐个对加载块进行训练。
26.根据本发明提供的一种基于深度学习的高效数据加载方法,所述重复使用一半加载的数据,每隔一个minibatch在磁盘中加载一半所需的数据,包括:
27.当缓存中有数据时,通过计数器统计的方式,从磁盘和缓存各取一半minibatch,当从磁盘和缓存中加载数据的计数器等于minibatch/2时,停止加载数据,然后将从磁盘和缓存中加载的数据整合在一起送到gpu中训练,并将计数器重新归0,进行下一个minibatch的加载。
28.根据本发明提供的一种基于深度学习的高效数据加载方法,在执行数据加载时:
29.以数据块的读取方式去进行数据加载;
30.在从磁盘加载数据时,利用数据块的数据结构,只为minibatch加载一半文件,然后从内存缓存中获取另一半文件;
31.对于getcacheddata(),其将立即从缓存中逐出访问的文件,避免了缓存中的数据过度被重复使用;
32.对于深度学习训练中第一次的getcacheddata(),在缓存中没有数据,所以进行磁盘i/o加载数据,然后在缓存中拥有在getcacheddata()中返回的数据;在得到一个minibatch之后,通过putcacheddata()将从磁盘加载的文件放入到缓存中。
33.由此可见,相对于现有技术,本发明具有以下有益效果:
34.1、本发明通过设计数据块的数据结构,减少对文件进行open、read和close的操作,这可以大大减少磁盘i/o操作,提高i/o效率,减少数据加载时间。
35.2、本发明通过设计合理的缓存策略,在不影响最终准确率的情况下,能够合理使用缓存,减少从磁盘进行数据加载的操作,大大减少了在模型训练前等待数据加载进来的时间,能够更好的利用服务器进行深度学习训练,大幅度减少数据加载的时间以及深度学习训练的时间。
36.第二方面,本发明还提供一种电子设备,包括:
37.存储器,存储有计算机可执行指令;
38.处理器,配置为运行所述计算机可执行指令,
39.其中,所述计算机可执行指令被所述处理器运行时实现上述任意一种的基于深度学习的高效数据加载方法的步骤。
40.第三方面,本发明还提供一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器执行时用于实现上述任意一种的基于深度学习的高效数据加载方法
的步骤。
41.由此可见,本发明还提供了一种基于深度学习的高效数据加载方法的电子设备以及存储介质,其包括:一个或多个存储器,一个或多个处理器。存储器用于存储程序代码和程序运行过程中产生的中间数据、模型输出结果的储存和模型及模型参数的储存;处理器用于代码运行所占用的处理器资源和训练模型时占用的多个处理器资源。
42.下面结合附图和具体实施方式对本发明作进一步详细说明。
附图说明
43.图1是现有技术的深度学习中的数据加载过程的示意图。
44.图2是本发明一种基于深度学习的高效数据加载方法实施例的流程图。
45.图3是本发明一种基于深度学习的高效数据加载方法实施例中将小文件压缩成数据块的结构示意图。
46.图4是本发明一种基于深度学习的高效数据加载方法实施例中关于将小文件压缩成数据块的数据结构的示意图。
47.图5是本发明一种基于深度学习的高效数据加载方法实施例中关于执行数据块shuffle的示意图。
48.图6是本发明一种基于深度学习的高效数据加载方法实施例中关于高效数据加载及缓存的算法示意图。
具体实施方式
49.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
50.参见图2,本发明提供一种基于深度学习的高效数据加载方法,其包括以下步骤:
51.步骤s1,以二进制读取的方式打开每个小文件,依次将每个小文件的二进制数据加入到数据块中,生成数据块的数据结构;
52.步骤s2,启动数据块的数据加载,在第一个epoch加载第一个minibatch时,将所有数据缓存在内存中以供重用;
53.步骤s3,重复使用一半加载的数据,每隔一个minibatch在磁盘中加载一半所需的数据;
54.步骤s4,将从磁盘和缓存中加载的数据整合后送到gpu中训练,并进行下一个minibatch的加载;
55.步骤s5,删除缓存中的访问数据以释放内存,使缓存能够适应有限的内存大小。
56.在本实施例中,数据结构包括n、offset field、size field、label field以及raw data field字段,n字段表示为该数据块是将n个小文件整合在一起;offset field字段为偏移字段,其包含从1到n索引的n个整数,每个整数按顺序描述原始数据字段中每个文件在块中的起始位置;size field字段表示为n个整数在块中按顺序描述每个小文件的大小,每个小文件需要n个字节即可表示其size field;label field字段包含n个整数,依次表示每
个文件的标签;raw data field字段包含n个小文件的原始数据;其中,数据块中的字段和数据都是以二进制的方式存储的。
57.在本实施例中,在加载数据块时,通过读取前n个字节来获取数据块中数据项的数量,并且通过offset field和size field字段,可以直接定位具体数据项的原始数据,并在label field字段中找到该数据的标签。
58.在本实施例中,在通过offset field和size field字段定位具体数据项的原始数据时,包括:
59.第一个文件的偏移量为零,大小由size field字段中的第一个整数给出,第二个文件的偏移量由offset field偏移字段中的第二个整数给出,其大小由size field字段中的第二个整数给出;
60.根据数据块中每个字段所需要的字节数,计算得出数据块中将n个小文件压缩成一个数据块最多需要的额外字节,实现该小文件在数据块中的具体定位。
61.在offset field字段中,依次按顺序存储的是1到n小文件在raw data field中的起始位置,当找到数据块中第m个小文件的位置,通过offset field可知道第m个小文件的起始位置,通过size field知道第m个小文件的大小;
62.通过offset field的起始位置以及size field的文件大小确定到数据块中第m个小文件的二进制数据在raw data field字段中的起始位置和结束位置,从而实现该小文件在块中的具体定位。
63.在本实施例中,块中的offset field字段代表的是每个小文件二进制数据在块中的起始位置,一个块中含有n个小文件,offset field依次按顺序存储的是1到n小文件在raw data field中的起始位置。size field代表的是每个小文件的文件大小。比如找到块中第5个小文件的位置,就通过offset field知道第5个小文件的起始位置,然后size field知道第5个小文件的大小比如为100kb,然后通过offset field的起始位置以及size field的文件大小确定到块中第5个小文件的二进制数据在raw data field中的起始位置和结束位置,然后就实现了这个小文件在块中的具体定位。
64.在训练过程中,使用每个数据块作为shuffle的单元,其中,每个数据块都有一个唯一的数字作为索引,分别是0、1、2和3,所有数据块的索引集是shuffle算法的输入;
65.当对一组索引进行排列时,使用排列后的索引顺序,逐个对加载块进行训练。
66.在本实施例中,重复使用一半加载的数据,每隔一个minibatch在磁盘中加载一半所需的数据,包括:
67.当缓存中有数据时,通过计数器统计的方式,从磁盘和缓存各取一半minibatch,当从磁盘和缓存中加载数据的计数器等于minibatch/2时,停止加载数据,然后将从磁盘和缓存中加载的数据整合在一起送到gpu中训练,并将计数器重新归0,进行下一个minibatch的加载。数据加载结束的动作是加载的数量达到了minibatch的数量,然后将数据送到gpu中训练,当缓存中有数据的时候(除了加载第一个epoch中的第一个minibatch的时候缓存中没有数据,其他时候缓存中都是有数据的),通过计数器统计的方式,将从磁盘和缓存各取一半minibatch,会有两个个计数器,初始设置都是0,当从磁盘和缓存中加载数据的计数器等于minibatch/2的时候,就停止加载数据,然后将从磁盘和缓存中加载的数据整合在一起送到gpu中训练,并将两个计数器重新归0,进行下一个minibatch的加载。
68.在本实施例中,在执行数据加载时:
69.以数据块的读取方式去进行数据加载;
70.在从磁盘加载数据时,利用数据块的数据结构,只为minibatch加载一半文件,然后从内存缓存中获取另一半文件;
71.对于getcacheddata(),其将立即从缓存中逐出访问的文件,避免了缓存中的数据过度被重复使用;
72.对于深度学习训练中第一次的getcacheddata(),在缓存中没有数据,所以进行磁盘i/o加载数据,然后在缓存中拥有在getcacheddata()中返回的数据;在得到一个minibatch之后,通过putcacheddata()将从磁盘加载的文件放入到缓存中。
73.具体的,本实施例主要从设计高效的数据加载块的数据结构和合理的缓存策略两方面去考虑:
74.一是为了提高i/o效率,同时减少执行磁盘读取所需的线程数,本实施例将小文件压缩成块,这可以大大减少在单个块中读取多个文件时执行打开、读取和关闭所需的次数。同时,当将多个文件聚合到一个块中时,可以通过减少给定磁盘上的i/o寻道来提高读取吞吐量。
75.二是为了在内存大小有限的内存中缓存加载的数据,通过重用加载的数据来获得有效的加载,同时保持缓存大小以适应有限的内存大小。本实施例使用两种策略来缓存数据。首先,在第一个epoch加载第一个minibatch时,将所有数据缓存在内存中以供重用。然后,可以重复使用一半加载的数据,并且每隔一个minibatch只在磁盘中加载一半所需的数据。这样,所需的磁盘吞吐量减少了一半,加载数据所需的时间减少了一半,而每个文件具有相同的访问时间。由于内存大小有限,第二种策略是通过删除缓存中的访问数据以释放内存以加载数据集中的更多其他文件。
76.对于高效数据加载块的设计:
77.如图3所示,图3显示的是将256个小文件读入到一个块中,首先以二进制读取的方法打开每个小文件,然后依次将二进制数据加入到块中,后续再根据图4去设计其他数据段。
78.对于数据块的数据结构的设计,不仅仅只是将每个小文件以二进制的方式放到一个块中,还需要知道每个文件在块中的具体位置。如图4所示,图4展示了如何设计一个块中的数据结构,其中n的值可以设置为batchsize值的倍数。
79.如图4所示,本实施例的数据结构包含五个字段,第一个字段n表示的是该数据块是将n个小文件整合在一起,本实施例的数据块的n字段为256,所以只需要4个字节就可以表示n个小文件在数据块中的编号;第二个字段offset field为偏移字段,它包含从1到n索引的n个整数,每个整数按顺序描述原始数据字段中每个文件在块中的起始位置,每个小文件需要4个字节表示偏移字段,则n个需要4n个字节;size field表示的是n个整数在数据块中按顺序描述每个小文件的大小,每个小文件需要4个字节即可表示其size field,总共n个小文件需要4n个字节;label field也是包含n个整数,依次表示每个文件的标签,一个小文件消耗4个字节,n个小文件消耗4n个字节;raw data field则是包含n个小文件的原始数据,原本小文件的大小是多大,在数据块中的大小也是多大,并不会变多或者变少。数据块中的字段和数据都是以二进制的方式存储的。这个数据块的数据结构不仅仅只是为了将多
个小文件放到一块,还能够实现数据定位的功能,可以通过offset field和size field两个参数定位块中某一个或者某一部分小文件的位置,为后续将数据加入缓存提供了有效的支持。例如,第一个文件的偏移量为零,大小由size field中的第一个整数给出,第二个文件的偏移量由偏移字段中的第二个整数给出,大小由大小字段中的第二个整数给出。根据块中每个字段所需要的字节数,可以算出块中将n个小文件压缩成一个块最多需要(12n+4)个额外字节。当n为256的时候,一个数据块就只比原本多个小文件多出3076个字节,也就是只多出3kb左右,但每个小文件原本的数据大小约为100kb,那256个小文件总体大小约为25600kb,所以额外多出的3kb大小相对于原本小文件的大小也是可以忽略不计的。因此额外添加的大小远小于万分之一,块的大小相对于原本多个小文件的大小并没有增加多少,也不会造成系统资源过多的开销。
80.除了raw data field之外,图4中数据结构中的其他区域都可以看作是每个数据项的元数据。因此,本发明还可以扩展该领域以适应不同类型的训练数据集。在加载块时,可以读取前四个字节来了解块中有多少数据项。通过offset field和size field字段,可以直接定位具体数据项的原始数据,并在label字段中找到它的标签。因为整个数据结构会一起加载到主存中,所以读取块中每个文件的过程会非常高效。
81.本实施例通过将每n个小文件压缩成一个数据块,可以在读取多个文件时将打开和关闭的次数减少到基线算法版本的n分之一。作为读取小文件,性能主要受限于磁盘的iops,将n个小文件集成到一个数据块中时性能会变得更好,磁盘吞吐量也会减少限制。
82.在训练过程中,一个重要的功能是数据混洗以避免在深度学习训练中过度拟合。由于在基线算法版本中每个数据项都是独立读取的,因此可以很容易地以每个图像为单位进行排列以进行混洗。但是,这种shuffle方法不适合将n个小文件压缩成一个块的方法。否则,必须加载许多块才能读取n个文件,并导致数据加载效率低下。
83.为了在保持高效加载性能的同时执行shuffle,本实施例使用每个数据块作为shuffle的单元。如图5所示,图5展示了如何使用数据块作为shuffle的示例,每个块都有一个唯一的数字作为索引,分别是0、1、2和3。所有块的索引集是shuffle算法的输入。当对一组索引进行排列时,可以使用排列后的索引顺序,即3、1、0和2,逐个加载块进行训练。
84.为此,本实施例可以将每个n个文件压缩成一个块,以实现高效的数据加载。同时,可以在训练时以块为单位进行混洗,避免过拟合的问题。
85.对于缓存策略的设计:
86.如图6所示,图6中的算法展示了在应用本发明的优化策略时,如何使用缓存来获得有效的数据加载。在算法第6行从磁盘加载数据时,只为minibatch加载一半文件,然后在第7行从缓存中获取另一半。对于getcacheddata(),它将立即从缓存中逐出访问的文件。注意第一次getcacheddata(),缓存中没有数据,所以进行磁盘i/o加载数据。然后在缓存中拥有可以在getcacheddata()中返回的数据。在第8行得到一个minibatch之后,在第9行将加载的文件从磁盘放入到缓存中。
87.因此,在加载第一个epoch的第一个minibatch的时候,缓存中是没有数据的,第一个minibatch的数据都是从磁盘中加载进来的,在算法中加载第一个minibatch的时候,第7行的getcachedata()中没有数据,所以第8行中的第一个minibatch都是从firsthaffminibacth中加载进来的,这里面也都是磁盘中的数据,然后再将刚从磁盘加载
进来的数据都放到缓存中,缓存中就有了一个minibacth的数据,后面的minibatch就是从磁盘加载一半数据,从缓存中加载一半的数据,然后在缓存中删除从缓存加载进来的数据,并将刚从磁盘中的数据加载到缓存中。
88.在上述算法中,在使用内存作为缓存的优化中,本发明缓存了加载的数据以供重用。同时,删除缓存中访问的数据,使缓存能够适应有限的内存大小。加载时间可以减少一半,因为每个minibatch中需要一半的文件。
89.综上所述,由于数据加载在运行时间中占主导地位,本实施例将小文件压缩成块减少磁盘i/o操作有效地带来了高效的数据加载,从而减少了整体运行时间,再通过设计合理的缓存策略,在不影响准确率的情况下,对于dnn的数据加载时间而言,可以实现高达10倍的优化效果,性能增长。
90.在一个实施例中,提供了一种电子设备,该电子设备可以是服务器。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该电子设备的处理器用于提供计算和控制能力。该电子设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该电子设备的数据库用于存储数据。该电子设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于深度学习的高效数据加载方法。
91.本领域技术人员可以理解,本实施例示出的电子设备结构,仅仅是与本技术方案相关的部分结构,并不构成对本技术方案所应用于其上的电子设备的限定,具体的电子设备可以包括比本实施例中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
92.在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
93.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(read-only memory,rom)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(random access memory,ram)或外部高速缓冲存储器。作为说明而非局限,ram可以是多种形式,比如静态随机存取存储器(static random access memory,sram)或动态随机存取存储器(dynamic random access memory,dram)等。
94.此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以
存储程序代码的介质。
95.由此可见,本发明还提供了一种基于深度学习的高效数据加载方法的电子设备以及存储介质,其包括:一个或多个存储器,一个或多个处理器。存储器用于存储程序代码和程序运行过程中产生的中间数据、模型输出结果的储存和模型及模型参数的储存;处理器用于代码运行所占用的处理器资源和训练模型时占用的多个处理器资源。
96.以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
97.上述实施方式仅为本发明的优选实施方式,不能以此来限定本发明保护的范围,本领域的技术人员在本发明的基础上所做的任何非实质性的变化及替换均属于本发明所要求保护的范围。
技术特征:
1.一种基于深度学习的高效数据加载方法,其特征在于,该方法包括以下步骤:以二进制读取的方式打开每个小文件,依次将每个小文件的二进制数据加入到数据块中,生成数据块的数据结构;启动数据块的数据加载,在第一个epoch加载第一个minibatch时,将所有数据缓存在内存中以供重用;重复使用一半加载的数据,每隔一个minibatch在磁盘中加载一半所需的数据;将从磁盘和缓存中加载的数据整合后送到gpu中训练,并进行下一个minibatch的加载;删除缓存中的访问数据以释放内存,使缓存能够适应有限的内存大小。2.根据权利要求1所述的方法,其特征在于:所述数据结构包括n、offset field、size field、label field以及raw data field字段,n字段表示为该数据块是将n个小文件整合在一起;offset field字段为偏移字段,其包含从1到n索引的n个整数,每个整数按顺序描述原始数据字段中每个文件在块中的起始位置;size field字段表示为n个整数在块中按顺序描述每个小文件的大小,每个小文件需要n个字节即可表示其size field;label field字段包含n个整数,依次表示每个文件的标签;raw data field字段包含n个小文件的原始数据;其中,数据块中的字段和数据都是以二进制的方式存储的。3.根据权利要求2所述的方法,其特征在于:在加载数据块时,通过读取前n个字节来获取数据块中数据项的数量,并且通过offset field和size field字段,可以直接定位具体数据项的原始数据,并在labelfield字段中找到该数据的标签。4.根据权利要求3所述的方法,其特征在于,在通过offset field和size field字段定位具体数据项的原始数据时,包括:第一个文件的偏移量为零,大小由size field字段中的第一个整数给出,第二个文件的偏移量由offset field偏移字段中的第二个整数给出,其大小由size field字段中的第二个整数给出;根据数据块中每个字段所需要的字节数,计算得出数据块中将n个小文件压缩成一个数据块最多需要的额外字节,实现该小文件在数据块中的具体定位。5.根据权利要求4所述的方法,其特征在于:在offset field字段中,依次按顺序存储的是1到n小文件在raw data field中的起始位置,当找到数据块中第m个小文件的位置,通过offset field可知道第m个小文件的起始位置,通过size field知道第m个小文件的大小;通过offset field的起始位置以及size field的文件大小确定到数据块中第m个小文件的二进制数据在raw data field字段中的起始位置和结束位置,从而实现该小文件在块中的具体定位。6.根据权利要求1所述的方法,其特征在于,还执行:在训练过程中,使用每个数据块作为shuffle的单元,其中,每个数据块都有一个唯一的数字作为索引,分别是0、1、2和3,所有数据块的索引集是shuffle算法的输入;当对一组索引进行排列时,使用排列后的索引顺序,逐个对加载块进行训练。
7.根据权利要求1所述的方法,其特征在于,所述重复使用一半加载的数据,每隔一个minibatch在磁盘中加载一半所需的数据,包括:当缓存中有数据时,通过计数器统计的方式,从磁盘和缓存各取一半minibatch,当从磁盘和缓存中加载数据的计数器等于minibatch/2时,停止加载数据,然后将从磁盘和缓存中加载的数据整合在一起送到gpu中训练,并将计数器重新归0,进行下一个minibatch的加载。8.根据权利要求1所述的方法,其特征在于,在执行数据加载时:以数据块的读取方式去进行数据加载;在从磁盘加载数据时,利用数据块的数据结构,只为minibatch加载一半文件,然后从内存缓存中获取另一半文件;对于getcacheddata(),其将立即从缓存中逐出访问的文件,避免了缓存中的数据过度被重复使用;对于深度学习训练中第一次的getcacheddata(),在缓存中没有数据,所以进行磁盘i/o加载数据,然后在缓存中拥有在getcacheddata()中返回的数据;在得到一个minibatch之后,通过putcacheddata()将从磁盘加载的文件放入到缓存中。9.一种电子设备,其特征在于,包括:存储器,存储有计算机可执行指令;处理器,配置为运行所述计算机可执行指令,其中,所述计算机可执行指令被所述处理器运行时实现如权利要求1-8任意一项所述的基于深度学习的高效数据加载方法的步骤。10.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被处理器执行时用于实现如权利要求1-8任意一项所述的基于深度学习的高效数据加载方法的步骤。
技术总结
本发明提供一种基于深度学习的高效数据加载方法、设备及存储介质,该方法包括以二进制读取的方式打开每个小文件,依次将每个小文件的二进制数据加入到数据块中,生成数据块的数据结构;启动数据块的数据加载,在第一个epoch加载第一个miniBatch时,将所有数据缓存在内存中以供重用;重复使用一半加载的数据,每隔一个miniBatch在磁盘中加载一半所需的数据;将从磁盘和缓存中加载的数据整合后送到GPU中训练,并进行下一个miniBatch的加载;删除缓存中的访问数据以释放内存,使缓存能够适应有限的内存大小。本发明通过将小文件压缩成数据块以及设计有合理的缓存策略,在不影响准确率的情况下,大大减少了数据加载时间以及整体运行时间。体运行时间。体运行时间。
技术研发人员:刘成健 史鹏程 李艺鸿
受保护的技术使用者:深圳技术大学
技术研发日:2023.03.14
技术公布日:2023/7/26
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/