一种图训练数据的高效加载方法、装置及存储介质与流程
未命名
09-07
阅读:119
评论:0
1.本发明涉及数据处理领域,具体涉及一种图训练数据的高效加载方法、装置及存储介质。
背景技术:
2.图(graph)指的是由若干给定的点及连接两点的边所构成的图形,这种图形通常用来描述事物之间的某种特定关系。
3.图神经网络(graph neural network,简称gnn)是一种针对图结构数据进行学习和推理的深度学习模型。与传统的神经网络模型适用于处理欧几里德空间中的向量数据不同,gnn专门设计用于处理具有图结构的数据,如社交网络、知识图谱、分子结构等。gnn模型通过定义一系列的消息传递和聚合规则,使得每个节点能够从其邻居节点获取信息,并将这些信息整合到自身的表示中。这个聚合信息和训练gnn模型的过程,通常称为图训练。
4.在现有的图训练系统中,通常需要从数据存储层获取数据,并将其转化为适合上层处理的形式。即,将图数据库作为底层的基础数据存储层。在进行离线图训练时,需要从图数据库中将图的拓扑数据、节点和边的特征数据加载到训练层。
5.然而,底层的数据库使用c++语言编写,而上层的图神经网络训练逻辑一般使用python编写。数据通过c++层读取成链表(二维表)结构后,其中的内容是无法直接被python层的代码逻辑访问到的。
6.目前一般采用以行顺序将数据逐一拼接到一维结果中;同时,让应用层(python图训练层)的可以访问还需要经过一次内存拷贝,当面对大量图数据时,加载过程中会耗费大量时间在数据拷贝上;
7.因此,现有的数据加载方法难以满足上层训练过程中对于数据高速访问的需求。
技术实现要素:
8.针对现有技术中的技术缺陷,本发明实施例的目的在于提供一种图训练数据的高效加载方法、装置及存储介质,以克服现有技术中所存在的难以满足上层训练过程中对于数据高速访问需求的缺陷。
9.为实现上述目的,第一方面,本发明实施例提供了一种图训练数据的高效加载方法,所述方法包括:
10.获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;同时,划分所述源数据并分别分配给相应的处理线程;其中,所述源数据来源于底层所存储的数据;
11.启动各线程,并行地从所述源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;其中,所述目标数据结构为一维数组;
12.根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;所述python数据结构为上层python应用可直接看到和进行操作的python对象,所述python对象在内存中存储内容的最基本结构,通过python基础封装对象进行封装;
13.通过指针操作将底层数据的所有权转移给python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作;
14.根据python图训练层需求,获取在上层应得到的最终数据结构及数据尺寸。
15.优选地,根据所述源数据量定义所述一维数组的长度,并为不同处理线程分配不同的数据区域,使得在向所述一维数组加载数据时,避免加锁操作。
16.优选地,所述定义将要被封装成python数据结构的关键信息,具体包括基础数据类型、数据长度和存储数据内容的内存指针。
17.优选地,所述使封装对象的指针指向有效内容,具体为:
18.底层内存数据结构为c++vector,使用c++vector的move特性,将数据所有权转移给python基础封装对象的buf属性,而这一基础封装对象会最终提供给python层numpy ndarray或torch tensor对象使用。
19.第二方面,本发明实施例还提供了一种图训练数据的高效加载装置,包括:
20.分配模块,用于获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;同时,划分所述源数据并分别分配给相应的处理线程;其中,所述源数据来源于底层所存储的数据;
21.加载模块,用于启动各线程,并行地从所述源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;其中,所述目标数据结构为一维数组;
22.定义模块,用于根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;所述python数据结构为上层python应用可直接看到和进行操作的python对象,所述python对象在内存中存储内容的最基本结构,通过python基础封装对象进行封装;
23.共享模块,用于:
24.通过指针操作将底层数据的所有权转移给python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作;
25.根据python图训练层需求,获取在上层应得到的最终数据结构及数据尺寸。
26.第三方面,本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面中提供的所述方法的步骤。
27.实施本发明实施例,通过基于并行加载的方式充分利用计算资源,将底层数据高效地加载为可供上层使用的数据结构;同时,加载目标以一维数组方式进行组织,也是为了在后续过程中,这部分内存数据可以通过所有权转移的方式交给上层python应用的数据封装对象直接使用,避免成本高昂的数据拷贝,满足上层训练过程中对于数据高速访问的需求,既提高性能还减少了多余的内存资源占用,进而获取更卓越的图训练性能。
附图说明
28.为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍。
29.图1是本发明实施例提供的一种图训练数据的高效加载方法的流程图;
30.图2是本发明实施例提供的一种拼接一维数组的结构示意图;
31.图3是本发明实施例提供的一种并行加载的处理示意图;
32.图4是本发明实施例提供的一种关联底层数据的处理示意图;
33.图5是本发明实施例提供的一种图训练数据的高效加载装置的结构框图。
具体实施方式
34.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
35.需要注意的是,除非另有说明,本技术使用的技术术语或者科学术语应当为本发明所属领域技术人员所理解的通常意义。
36.vector:容器;
37.c++:c++是一种计算机高级程序设计语言,由c语言扩展升级而产生;
38.python:python是从abc发展起来,并且结合了unix shell和c语言的习惯;
39.buffer protocol(缓冲协定):在python中可使用一些对象来包装对底层内存数组或称缓冲的访问;缓冲区结构对于将二进制数据从另一个对象公开给python程序员非常有用。它们还可以用作零拷贝切片机制。使用它们引用内存块的能力,可以很容易地将任何数据公开给python程序员。内存可以是c扩展中的一个大的常量数组,也可以是在传递到操作系统库之前用于操作的原始内存块,或者可以用来传递本机内存格式的结构化数据。
40.实施例一:
41.请参考图1至图4,本发明实施例提供的一种图训练数据的高效加载方法,所述方法包括:
42.s101,获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;同时,划分所述源数据并分别分配给相应的处理线程;其中,所述源数据来源于底层所存储的数据。
43.本实施例中,各步骤均应用于服务器,所述计算资源为多核cpu的计算能力;其中,实施时,根据数组的大小和cpu核心数,计算并行处理线程数,并进行数据任务块划分。
44.1.最基本的考虑是分配与核心数相等的处理线程数。
45.2.根据实际业务需求,也支持单线程最少处理数量限制,可在计算启动前定义单线程最少处理数据的下限,以避免单线程处理数据量过少导致的非计算开销过高。
46.3.预设指定线程数的方式,在计算开始前具体指定并行处理线程数,以支持更精准的资源使用限制。
47.4.依据线程数计算每个线程处理数据段的起止位置并进行记录,供之后线程执行拷贝时使用;包括源数据结构中每个处理线程的对应数据的位置信息,以及数据在将被拷贝到的目标数据结构中的位置信息。
48.s102,启动各线程,并行地从所述源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;其中,所述目标数据结构为一维数组。
49.由于上层应用使用pytorch等python机器学习库进行处理时,为了让上层的python应用可以使用这些数据,需要组织成一维的连续结构,如附图2;因此,通过并行加载方式将数据加载成一维的目标数组,将一维的目标数组作为目标数据结构;其中,一维的目
标数组和一维数组含义相同,上层与python层的含义相同。
50.同时,根据所述源数据量定义所述一维数组的长度,并为不同处理线程分配不同的数据区域,使得在向所述一维数组加载数据时,避免加锁操作;如附图3所示,处理线程1负责l1到l10,处理线程2负责l11到l20,以此类推,每个处理线程负责各自的数据部分,充分利用多核cpu的计算能力,多线程从源数组结构中并行读取数据,提高数据读取的吞吐量;且采用不同线程向一维目标数组写结果的逻辑,避免结果生成时的访问冲突等问题,无需使用锁技术大幅度减少数据生成的耗时。
51.通过在c++层生成了一维数组之后,通常情况下,让python层的可以访问还需要经过一次内存拷贝,则需要多一次全量数据的拷贝,数据加载过程直接损失一半以上的性能;因此,本技术利用c++vector的move特性,结合python的buffer protocol标准,在为python层组装基础数据时,充分利用内存指针操作,避免基础数据的拷贝,获取极致的性能效果,具体步骤如下:
52.s103,根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;所述python数据结构为上层python应用可直接看到和进行操作的python对象,所述python对象在内存中存储内容的最基本结构,通过python基础封装对象进行封装;
53.即,python对象在内存中存储内容的最基本结构,是由“python基础封装对象”进行封装后,再交给上层python的。
54.具体地,根据从底层获取的一维数组数据(通过前面所述并行加载方式),定义将要被封装成python数据结构的关键信息,包括基础数据类型、数据长度、存储数据内容的内存指针。
55.s104,通过指针操作将底层数据的所有权转移给python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作。
56.具体地,底层内存数据结构为c++vector,使用c++vector的move特性,将数据所有权转移给python基础封装对象的buf属性,而这一基础封装对象会最终提供给python层numpy ndarray或torch tensor对象使用的基础数据;在内存零拷贝(无内存拷贝)的前提下,让上层图训练逻辑可以通过python对象直接获取这些基础数据,使得数据加载性能得到了再提升。
57.s105,根据python图训练层需求,获取在上层应得到的最终数据结构及数据尺寸。
58.即,可根据上层应用的需要进行数据的呈现,以满足后续的数据操作要求。
59.如,图训练中需要读取m个节点的n个属性,最终上层应该得到的是一个m行n列的二维数组。将封装对象中的一维数组进行形状指定,定义合适的行数、列数,进而满足应用所需。
60.上述技术方案,通过基于并行加载的方式充分利用计算资源,将底层数据高效地加载为可供上层使用的数据结构;同时,加载目标以一维数组方式进行组织,也是为了在后续过程中,这部分内存数据可以通过所有权转移的方式交给上层python应用的数据封装对象直接使用,实现零拷贝,从而避免成本高昂的数据拷贝,满足上层训练过程中对于数据高速访问的需求,既提高性能还减少了多余的内存资源占用,进而获取更卓越的图训练性能。
61.实施例二:
62.基于相同的发明构思,本发明实施例还提供了一种图训练数据的高效加载装置,如图5所示,包括:
63.分配模块,用于获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;同时,划分所述源数据并分别分配给相应的处理线程;其中,所述源数据来源于底层所存储的数据;
64.加载模块,用于启动各线程,并行地从所述源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;其中,所述目标数据结构为一维数组;
65.定义模块,用于根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;所述python数据结构为上层python应用可直接看到和进行操作的python对象,所述python对象在内存中存储内容的最基本结构,通过python基础封装对象进行封装;
66.共享模块,用于:
67.通过指针操作将底层数据的所有权转移给python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作;
68.根据python图训练层需求,获取在上层应得到的最终数据结构及数据尺寸。
69.实施时,根据所述源数据量定义所述一维数组的长度,并为不同处理线程分配不同的数据区域,使得在向所述一维数组加载数据时,避免加锁操作。
70.所述使封装对象的指针指向有效内容,具体为:
71.底层内存数据结构为c++vector,使用c++vector的move特性,将数据所有权转移给python基础封装对象的buf属性,而这一基础封装对象会最终提供给python层numpy ndarray或torch tensor对象使用;在内存零拷贝(无内存拷贝)的前提下,让上层图训练逻辑可以通过python对象直接获取这些基础数据(如附图4所示)。在工程实测中,这一举措可以让数据加载的性能再提升三倍左右。
72.需要说明的是,关于装置实施例更为具体的工作流程,请参考前述方法实施例部分,在此不再赘述。
73.本技术方案通过并行加载、内存视图零拷贝处理,使图训练过程中的数据加载性能有了数量级的提升;通过巧妙设计的并发无锁操作和跨语言内存共享技术,在极大提升性能的同时,也让操作过程中的机器资源(内存)占用节省了近一半,是一个经济且高效的数据访问方案。
74.本实施例中,还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时使所述处理器执行如所述的一种图训练数据的高效加载方法实施例的步骤。
75.具体的,计算机可读存储介质可包括缓存(cache)、高速随机存取存储器(ram),例如常见的双倍数据率同步动态随机存取内存(ddr sdram),并且还可包括非易失性存储器(nvram),诸如一个或多个只读存储器(rom)、磁盘存储设备、闪存(flash)存储器设备、或其他非易失性固态存储器设备例如光盘(cd-rom,dvd-rom),软盘或数据磁带等。
76.本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的模块及步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功
能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
77.在本技术所提供的几个实施例中,应该理解到,所揭露的方法和装置,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
78.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。
技术特征:
1.一种图训练数据的高效加载方法,其特征在于,所述方法包括:获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;同时,划分所述源数据并分别分配给相应的处理线程;其中,所述源数据来源于底层所存储的数据;启动各线程,并行地从所述源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;其中,所述目标数据结构为一维数组;根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;所述python数据结构为上层python应用可直接看到和进行操作的python对象,所述python对象在内存中存储内容的最基本结构,通过python基础封装对象进行封装;通过指针操作将底层数据的所有权转移给python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作;根据python图训练层需求,获取在上层应得到的最终数据结构及数据尺寸。2.根据权利要求1所述的一种图训练数据的高效加载方法,其特征在于,根据所述源数据量定义所述一维数组的长度,并为不同处理线程分配不同的数据区域,使得在向所述一维数组加载数据时,避免加锁操作。3.根据权利要求2所述的一种图训练数据的高效加载方法,其特征在于,所述定义将要被封装成python数据结构的关键信息,具体包括基础数据类型、数据长度和存储数据内容的内存指针。4.根据权利要求3所述的一种图训练数据的高效加载方法,其特征在于,所述使封装对象的指针指向有效内容,具体为:底层内存数据结构为c++vector,使用c++vector的move特性,将数据所有权转移给python基础封装对象的buf属性,而这一基础封装对象会最终提供给python层numpy ndarray或torch tensor对象使用。5.一种图训练数据的高效加载装置,其特征在于,包括:分配模块,用于获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;同时,划分所述源数据并分别分配给相应的处理线程;其中,所述源数据来源于底层所存储的数据;加载模块,用于启动各线程,并行地从所述源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;其中,所述目标数据结构为一维数组;定义模块,用于根据获取的所述一维数组,定义将要被封装成python数据结构的关键信息;所述python数据结构为上层python应用可直接看到和进行操作的python对象,所述python对象在内存中存储内容的最基本结构,通过python基础封装对象进行封装;共享模块,用于:通过指针操作将底层数据的所有权转移给python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作;根据python图训练层需求,获取在上层应得到的最终数据结构及数据尺寸。6.根据权利要求5所述的一种图训练数据的高效加载装置,其特征在于,根据所述源数据量定义所述一维数组的长度,并为不同处理线程分配不同的数据区域,使得在向所述一维数组加载数据时,避免加锁操作。7.根据权利要求6所述的一种图训练数据的高效加载装置,其特征在于,所述使封装对
象的指针指向有效内容,具体为:底层内存数据结构为c++vector,使用c++vector的move特性,将数据所有权转移给python基础封装对象的buf属性,而这一基础封装对象会最终提供给python层numpy ndarray或torch tensor对象使用。8.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至4中任一项所述的方法。
技术总结
本发明公开了一种图训练数据的高效加载方法、装置及存储介质,所述方法包括:获取源数据并结合计算资源进行分析计算,得出需启动的线程数量;划分源数据并分别分配给相应的处理线程;启动各线程,并行地从源数据获取各自处理的部分数据,进行并行加载,以此生成目标数据结构;所述目标数据结构为一维数组;根据获取的一维数组,定义将要被封装成Python数据结构的关键信息;通过指针操作将底层数据的所有权转移给Python基础封装对象,使封装对象的指针指向有效内容;封装对象在获取底层数据所有权之后,便可根据上层需求完成后续动作;其效果是:通过并行加载和所有权转移的方式,满足上层训练过程中对于数据高速访问的需求。上层训练过程中对于数据高速访问的需求。上层训练过程中对于数据高速访问的需求。
技术研发人员:何真 冼茂源 李翀 苏垚昀 王颖君
受保护的技术使用者:北京意如图真科技有限公司
技术研发日:2023.06.29
技术公布日:2023/9/6
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
