一种预测DockerFile创建容器执行时间的方法

未命名 07-27 阅读:77 评论:0

representations of code[j].proceedings of the acm on programming languages,2019,3(popl):1-29.》提出的一种使用深度学习编码源语言的方法的基础上,创建了一个端到端的序列生成模型。该方法虽能成功提取源语言的特征向量,但是因为其是一个端到端的模型,且下游任务与预测dockerfile执行时间不同,无法迁移利用,只能在其基础上针对不同的下游任务进行修改适配。


技术实现要素:

[0009]
发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供一种预测dockerfile创建容器执行时间的方法。
[0010]
为了解决上述技术问题,本发明公开了一种预测dockerfile创建容器执行时间的方法,包括以下步骤:
[0011]
步骤1,构建dockerfile源代码数据集,其中包含源代码样本;所述的dockerfile源代码数据集,其中的样本是源代码文件,样本标签是所述源代码文件的执行时间。
[0012]
步骤2,将所述数据集中的dockerfile源代码转化为抽象语法树路径,具体方法如下:
[0013]
步骤2-1,将所述dockerfile源代码表示为一个抽象语法树;
[0014]
步骤2-2,抽取抽象语法树中的路径,获得抽象语法树路径,具体方包括:
[0015]
所述路径由首尾的终端结点以及连接终端结点的非终端结点组成,其中,终端结点代表dockerfile源代码中自定义的变量,非终端结点代表代码中编程语言预定义的字符。
[0016]
步骤2-3,将每个源代码文件转换成一个以上由抽象语法树路径组成的文件。
[0017]
步骤3,构建预测基础镜像(baseimage)模型,使用抽象语法树路径对所述预测基础镜像模型进行预训练;所述的预测基础镜像模型,是对dockerfile源代码文件中的基础镜像进行分类预测的模型,具体步骤如下:
[0018]
步骤3a-1,将步骤2中得到的由一个样本中转化得到的k个抽象语法树路径作为输入;
[0019]
步骤3a-2,对于每个抽象语法树路径中的终端结点和非终端结点进行编码,并计算词嵌入(word embedding)向量;
[0020]
步骤3a-3,将输入的k个路径的词嵌入向量求平均后的向量作为所述样本的输入向量;
[0021]
步骤3a-4,使用长短期记忆网络在输入向量上提取特征向量,将所述提取过程中最后一个步骤的隐藏向量做为样本特征向量;
[0022]
步骤3a-5,将样本特征向量输入多层全连接层,得到一个对于dockerfile源代码文件中的基础镜像的分类预测结果。
[0023]
所述的使用抽象语法树路径对预测基础镜像模型进行训练,具体包括:
[0024]
步骤3b-1,将dockerfile源代码数据集划分为训练集和验证集,向预测基础镜像模型中输入训练集中的源代码文件;
[0025]
步骤3b-2,预测基础镜像模型进行前向计算,对每个输入样本中的基础镜像进行分类预测;
[0026]
步骤3b-3,计算分类预测结果和真实分类结果的交叉熵,得到预测基础镜像模型的预测损失;
[0027]
步骤3b-4,计算预测损失的梯度,反向传播更新预测基础镜像模型的参数;
[0028]
步骤3b-5,使用验证集评估预测基础镜像模型的性能是否在每次更新后有提升;
[0029]
步骤3b-6,若预测基础镜像模型的性能有提升则返回步骤3b-2继续迭代训练,否则执行步骤3b-7;
[0030]
步骤3b-7,结束训练模型。
[0031]
步骤4,通过预训练的预测基础镜像模型提取源代码样本的特征向量,将所述特征向量与其他特征向量拼接,获取最终特征向量,具体方法包括:
[0032]
步骤4-1,将待测目标输入训练好的预测基础镜像模型,得到待测目标的特征向量;
[0033]
步骤4-2,获取其他特征向量;
[0034]
步骤4-2,将待测目标的特征向量和其他特征向量进行拼接,得到最终特征向量。
[0035]
所述的其他特征向量包括:手工特征向量和统计特征向量。
[0036]
所述的手工特征向量和统计特征向量,至少包括:代码行数、文件大小、使用的语言以及基础镜像信息。
[0037]
步骤5,将最终特征向量输入机器学习模型即随机森林中,得到待预测目标即dockerfile创建容器执行时间的预测结果。
[0038]
有益效果:
[0039]
本发明从技术层面来说,(1)通过将源代码转换为抽象语法树路径来将语言语法信息、结构信息融合进来,同时也方便进行后续提取特征的处理。(2)设计了预测dockerfile的baseimage的预训练任务,模型通过该任务的训练能获得提取源代码特征向量的能力。(3)使用手工特征、统计特征等丰富了最终的特征向量内容,使预测更精确。
[0040]
本发明从应用层面来说,(1)能够自动预测写好的一份dockerfile的执行时间供给开发者参考,能够使开发者更灵活的调整时间安排和项目规划(2)人工智能在源代码上提取特征的研究和应用大多集中在主流编程语言上,在dockerfile上的研究和应用较少。该方案提供了在dockerfile上提取特征向量的方案,也为后续其他下游任务提供了参考。
附图说明
[0041]
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
[0042]
图1为dockerfile文件实例示意图。
[0043]
图2为本发明方法总体流程示意图。
[0044]
图3为源代码及其对应的抽象语法树示意图。
[0045]
图4为抽象语法树示意图。
[0046]
图5为预测baseimage模型流程示意图。
[0047]
图6为预测baseimage模型训练流程示意图。
[0048]
图7为手工特征明细示意图。
具体实施方式
[0049]
本发明提出了一种结合深度学习特征和手工特征来预测dockerfile执行时间的方法。本发明通过设计预训练任务来使模型获得提取特征向量的能力,完成了使用深度学习的方法提取dockerfile源代码特征的任务,并结合了传统的手工特征和统计特征,丰富了最终特征向量的信息,从而使最终预测的结果好于仅使用手工特征来预测。
[0050]
一种预测dockerfile创建容器执行时间的方法,如图2所示,包括以下步骤:
[0051]
步骤1,构建dockerfile源代码数据集,其中包含源代码样本;
[0052]
步骤2,将所述数据集中的dockerfile源代码转化为抽象语法树路径;
[0053]
步骤3,构建预测基础镜像模型,使用抽象语法树路径对所述预测基础镜像模型进行预训练;
[0054]
步骤4,通过预训练的预测基础镜像模型提取源代码样本的特征向量,将所述特征向量与其他特征向量拼接,获取最终特征向量;
[0055]
步骤5,将最终特征向量输入机器学习模型即随机森林中,得到待预测目标即dockerfile创建容器执行时间的预测结果。
[0056]
步骤1中所述的dockerfile源代码数据集,其中的样本是源代码文件,样本标签是所述源代码文件的执行时间。
[0057]
步骤2所述的将所述数据集中的dockerfile源代码转化为抽象语法树路径,具体方法如下:
[0058]
步骤2-1,将所述dockerfile源代码表示为一个抽象语法树;
[0059]
步骤2-2,抽取抽象语法树中的路径,获得抽象语法树路径;
[0060]
步骤2-3,将每个源代码文件转换成一个以上由抽象语法树路径组成的文件。
[0061]
步骤2-2中所述的抽取抽象语法树中的路径,具体方包括:
[0062]
所述路径由首尾的终端结点以及连接终端结点的非终端结点组成,其中,终端结点代表dockerfile源代码中自定义的变量,非终端结点代表代码中编程语言预定义的字符。
[0063]
步骤3中所述的预测基础镜像模型,是对dockerfile源代码文件中的基础镜像进行分类预测的模型。
[0064]
步骤3中所述的预测基础镜像模型,具体步骤如下:
[0065]
步骤3a-1,将步骤2中得到的由一个样本中转化得到的k个抽象语法树路径作为输入;
[0066]
步骤3a-2,对于每个抽象语法树路径中的终端结点和非终端结点进行编码,并计算词嵌入向量;
[0067]
步骤3a-3,将输入的k个路径的词嵌入向量求平均后的向量作为所述样本的输入向量;
[0068]
步骤3a-4,使用长短期记忆网络在输入向量上提取特征向量,将所述提取过程中最后一个步骤的隐藏向量做为样本特征向量;
[0069]
步骤3a-5,将样本特征向量输入多层全连接层,得到一个对于dockerfile源代码文件中的基础镜像的分类预测结果。
[0070]
步骤3中所述的使用抽象语法树路径对预测基础镜像模型进行训练,具体包括:
[0071]
步骤3b-1,将dockerfile源代码数据集划分为训练集和验证集,向预测基础镜像模型中输入训练集中的源代码文件;
[0072]
步骤3b-2,预测基础镜像模型进行前向计算,对每个输入样本中的基础镜像进行分类预测;
[0073]
步骤3b-3,计算分类预测结果和真实分类结果的交叉熵,得到预测基础镜像模型的预测损失;
[0074]
步骤3b-4,计算预测损失的梯度,反向传播更新预测基础镜像模型的参数;
[0075]
步骤3b-5,使用验证集评估预测基础镜像模型的性能是否在每次更新后有提升;
[0076]
步骤3b-6,若预测基础镜像模型的性能有提升则返回步骤3b-2继续迭代训练,否则执行步骤3b-7;
[0077]
步骤3b-7,结束训练模型。
[0078]
步骤4中所述的获取最终特征向量,具体方法包括:
[0079]
步骤4-1,将待测目标输入训练好的预测基础镜像模型,得到待测目标的特征向量;
[0080]
步骤4-2,获取其他特征向量;
[0081]
步骤4-2,将待测目标的特征向量和其他特征向量进行拼接,得到最终特征向量。
[0082]
步骤4中所述的其他特征向量包括:手工特征向量和统计特征向量。
[0083]
所述的手工特征向量和统计特征向量,至少包括:代码行数、文件大小、使用的语言以及基础镜像信息。
[0084]
实施例:
[0085]
预测dockerfile执行时间算法整体流程如图2所示。
[0086]
步骤101,输入dockerfile源代码文件,一份dockerfile文件示例如图1所示。训练提取dockerfile源代码特征向量模型需要事先准备好dockerfile源代码数据集,该数据集中每个样本是一个源代码文件,样本标签是该源代码文件的执行时间。
[0087]
步骤102,将dockerfile源代码转化为若干条抽象语法树路径(ast path),这是因为代码与自然语言不同,代码中会有很多变量名、函数名、地址等特殊结点,也包括很多结构信息和语法信息。一份源代码可以首先将其表示为一个抽象语法树(参考:neamtiu,iulian;foster,jeffrey s.;hicks,michael.understanding source code evolution using abstract syntax tree matching.),然后抽取其中的路径可以获得抽象语法树路径。每条路径由首尾的终端结点(terminals)以及连接他们的非终端结点(nonterminals)组成。终端结点代表代码中人为定义的变量(如变量名、函数名等),非终端结点代表代码中编程语言已定义的字符(如变量类型、控制循环语句等)。因此每条抽象语法树路径代表了代码中两个终端结点之间的路径,而整篇源代码将转化为包括代码中所有任意两个终端结点路径的文件。图3展示了两个源文件以及其对应的抽象语法树,而图4则用不同粗细的线段展示了抽象语法树中的多条路径。以终端结点“elements”到终端结点“true”之间的路径为例,该路径被表示为:
[0088]
(elements,name

fieldaccess

foreach

block

ifstmt

block

return

booleanexpr,true)
[0089]
其中,首尾结点是终端结点,其余为非终端结点。源代码文件将被转换成若干抽象
语法树路径组成的文件。这样做的目的是将源代码转换为具有结构信息的序列,方便自然语言处理的技术在其上的应用。
[0090]
步骤103,搭建模型,将抽象语法树路径文件作为输入,输出为dockerfile的基础镜像(baseimage)。每一份dockerfile的开头都会有一个基础镜像,如图1所示,“openjdk:8”即为该文件的基础镜像。模型的处理流程如图5所示:
[0091]
步骤201,将输入文件中k个抽象语法树路径输入。
[0092]
步骤202,对于每个抽象语法树路径中的终端结点和非终端结点进行编码后计算其词嵌入(word embedding)向量(参考:mikolov,tomas;sutskever,ilya;chen,kai;corrado,greg;dean,jeffrey.distributed representations of words and phrases and their compositionality.arxiv:1310.4546)。这样的处理方式与一般自然语言处理方式相同。
[0093]
步骤203,将输入的k个路径的embedding向量求平均后的向量视为该文件的输入向量。
[0094]
步骤204,使用长短期记忆(long short-term memory简称lstm)网络应用在输入向量上(参考:ian goodfellow,yoshua bengio,aaron courville.deep learning.mit press 2016),通过将输入向量的数值依次输入长短期记忆网络可以得到网络最终网络的输出结果。取最终网络输出的向量结果为该源代码的特征向量。
[0095]
步骤205,得到特征向量后,输入多层感知机(mlp)得到一个对于基础镜像的分类预测。
[0096]
步骤103,预测基础镜像模型搭建完毕后将通过训练来使模型获得提取源代码特征的能力。具体的训练流程如图6所示:
[0097]
步骤301,输入多个源代码文件作为训练数据,部分作为验证集待后续步骤使用。
[0098]
步骤302,预测模型进行前向计算,对每个输入样本的基础镜像进行分类预测。
[0099]
步骤303,计算预测分类和真实分类的交叉熵(参考:ian goodfellow,yoshua bengio,aaron courville.deep learning.mit press 2016),即模型的预测损失。
[0100]
步骤304,计算梯度,反向传播更新模型参数。(参考:ian goodfellow,yoshua bengio,aaron courville.deep learning.mit press 2016)
[0101]
步骤305,使用验证集评估模型的性能是否在每次更新后有提升。
[0102]
步骤306,判断模型性能是否提升,若有提升则返回步骤302继续迭代训练,否则执行步骤307。
[0103]
步骤307,结束训练模型。
[0104]
步骤104,训练好的模型对dockerfile已经有特征提取能力了,将步骤204获得的特征向量视为该源代码的特征向量。除此之外,从每个源代码中提取一些手工特征、统计特征作为额外特征与特征向量拼接作为源代码最终的特征向量。手工统计特征明细如图7所示。图中列出了14种手工统计特征,包括代码行数、文件大小等数量信息,也包括使用的语言、基础镜像等种类信息,这些信息都可以从源代码文件内容以及包含该文件相关的项目中统计得到。
[0105]
步骤105,将最终的特征向量输入机器学习模型随机森林(random forests)中,通过训练获得预测能力(参考:周志华,机器学习,清华大学出版社,2016)。随机森林是一种并
行性集成学习方法,通过自助采样法(bootstrap sampling)训练多个基学习器并结合来获得最终预测结果。
[0106]
具体实现中,本技术提供计算机存储介质以及对应的数据处理单元,其中,该计算机存储介质能够存储计算机程序,所述计算机程序通过数据处理单元执行时可运行本发明提供的一种预测dockerfile创建容器执行时间的方法的发明内容以及各实施例中的部分或全部步骤。所述的存储介质可为磁碟、光盘、只读存储记忆体(read-only memory,rom)或随机存储记忆体(random access memory,ram)等。
[0107]
本领域的技术人员可以清楚地了解到本发明实施例中的技术方案可借助计算机程序以及其对应的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以计算机程序即软件产品的形式体现出来,该计算机程序软件产品可以存储在存储介质中,包括若干指令用以使得一台包含数据处理单元的设备(可以是个人计算机,服务器,单片机,muu或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
[0108]
本发明提供了一种预测dockerfile创建容器执行时间的方法的思路及方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

技术特征:
1.一种预测dockerfile创建容器执行时间的方法,其特征在于,包括以下步骤:步骤1,构建dockerfile源代码数据集,其中包含源代码样本;步骤2,将所述数据集中的dockerfile源代码转化为抽象语法树路径;步骤3,构建预测基础镜像模型,使用抽象语法树路径对所述预测基础镜像模型进行预训练;步骤4,通过预训练的预测基础镜像模型提取源代码样本的特征向量,将所述特征向量与其他特征向量拼接,获取最终特征向量;步骤5,将最终特征向量输入机器学习模型即随机森林中,得到待预测目标即dockerfile创建容器执行时间的预测结果。2.根据权利要求1所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤1中所述的dockerfile源代码数据集,其中的样本是源代码文件,样本标签是所述源代码文件的执行时间。3.根据权利要求2所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤2所述的将所述数据集中的dockerfile源代码转化为抽象语法树路径,具体方法如下:步骤2-1,将所述dockerfile源代码表示为一个抽象语法树;步骤2-2,抽取抽象语法树中的路径,获得抽象语法树路径;步骤2-3,将每个源代码文件转换成一个以上由抽象语法树路径组成的文件。4.根据权利要求3所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤2-2中所述的抽取抽象语法树中的路径,具体方包括:所述路径由首尾的终端结点以及连接终端结点的非终端结点组成,其中,终端结点代表dockerfile源代码中自定义的变量,非终端结点代表代码中编程语言预定义的字符。5.根据权利要求4所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤3中所述的预测基础镜像模型,是对dockerfile源代码文件中的基础镜像进行分类预测的模型。6.根据权利要求5所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤3中所述的预测基础镜像模型,具体步骤如下:步骤3a-1,将步骤2中得到的由一个样本中转化得到的k个抽象语法树路径作为输入;步骤3a-2,对于每个抽象语法树路径中的终端结点和非终端结点进行编码,并计算词嵌入向量;步骤3a-3,将输入的k个路径的词嵌入向量求平均后的向量作为所述样本的输入向量;步骤3a-4,使用长短期记忆网络在输入向量上提取特征向量,将所述提取过程中最后一个步骤的隐藏向量做为样本特征向量;步骤3a-5,将样本特征向量输入多层全连接层,得到一个对于dockerfile源代码文件中的基础镜像的分类预测结果。7.根据权利要求6所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤3中所述的使用抽象语法树路径对预测基础镜像模型进行训练,具体包括:步骤3b-1,将dockerfile源代码数据集划分为训练集和验证集,向预测基础镜像模型中输入训练集中的源代码文件;步骤3b-2,预测基础镜像模型进行前向计算,对每个输入样本中的基础镜像进行分类
预测;步骤3b-3,计算分类预测结果和真实分类结果的交叉熵,得到预测基础镜像模型的预测损失;步骤3b-4,计算预测损失的梯度,反向传播更新预测基础镜像模型的参数;步骤3b-5,使用验证集评估预测基础镜像模型的性能是否在每次更新后有提升;步骤3b-6,若预测基础镜像模型的性能有提升则返回步骤3b-2继续迭代训练,否则执行步骤3b-7;步骤3b-7,结束训练模型。8.根据权利要求7所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤4中所述的获取最终特征向量,具体方法包括:步骤4-1,将待测目标输入训练好的预测基础镜像模型,得到待测目标的特征向量;步骤4-2,获取其他特征向量;步骤4-2,将待测目标的特征向量和其他特征向量进行拼接,得到最终特征向量。9.根据权利要求8所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,步骤4中所述的其他特征向量包括:手工特征向量和统计特征向量。10.根据权利要求9所述的一种预测dockerfile创建容器执行时间的方法,其特征在于,所述的手工特征向量和统计特征向量,至少包括:代码行数、文件大小、使用的语言以及基础镜像信息。

技术总结
本发明提出了一种预测DockerFile创建容器执行时间的方法,包括以下步骤:步骤1,构建DockerFile源代码数据集,其中包含源代码样本;步骤2,将所述数据集中的DockerFile源代码转化为抽象语法树路径;步骤3,构建预测基础镜像模型,使用抽象语法树路径对所述预测基础镜像模型进行预训练;步骤4,通过预训练的预测基础镜像模型提取源代码样本的特征向量,将所述特征向量与其他特征向量拼接,获取最终特征向量;步骤5,将最终特征向量输入机器学习模型即随机森林中,得到待预测目标即DockerFile创建容器执行时间的预测结果。容器执行时间的预测结果。容器执行时间的预测结果。


技术研发人员:张建兵 涂盛东 黄书剑 戴新宇 陈家骏
受保护的技术使用者:南京大学
技术研发日:2023.03.13
技术公布日:2023/7/25
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐