基于静态分析的TensorFlow深度学习代码性能问题检测方法
未命名
08-18
阅读:106
评论:0
基于静态分析的tensorflow深度学习代码性能问题检测方法
技术领域
1.本发明属于软件工程技术领域,具体tensorflow深度学习代码性能问题检测方法。
背景技术:
2.深度学习已经成为计算机视觉、语音识别、自然语言处理和许多其他领域中最强大的技术之一。对于传统系统,由于它遵循基于逻辑的编程范式,开发人员可以直接在源代码中编码决策逻辑;而深度学习系统采用数据驱动的编程范式,开发人员定义所需的神经网络,其决策逻辑是从大量训练数据中学习得到的。传统系统到深度学习系统编程范式的转变对深度学习系统工程提出了独特的挑战,其中,性能问题是其面临的重要挑战之一。性能问题可能导致训练和推理阶段过度的资源消耗,损害用户体验,甚至引发更严重的后果。在过去的研究中,深度学习系统中的错误已被广泛探讨,但是深度学习系统中的性能问题却几乎没有被探索过。
技术实现要素:
3.本发明的目的在于提供一种基于静态分析的tensorflow深度学习代码性能问题检测方法,以帮助开发人员快速高效地检测一部分常见的性能问题,促进其深度学习系统的性能提升。
4.本发明提供的基于静态分析的tensorflow深度学习代码性能问题检测方法,针对基于tensorflow的深度学习项目,应用静态检测技术,检测并定位python项目文件中导致性能损失的问题代码,检测5种常见的性能问题,即用相同参数多次调用创建计算图节点的api导致相同节点被重复创建;batch和map方法的调用次序错误导致不必要的map方法的调用增加;调用map和interleave方法时未设置num_parallel_calls参数导致函数的并行功能被禁用;循环定义tf.function装饰的函数导致相同计算图重复构建;向tf.function装饰的函数传递数值变化的python类型参数导致计算图重复构建;具体步骤如下:
5.(1)重复创建计算图节点行为的检查;
6.在深度学习系统中,计算图是一种表示模型结构和计算流程的图形化数据结构,它可以减少冗余计算、更好地管理内存使用、实现并行计算和减少计算时间等,从而提高深度学习系统的效率;计算图中的节点表示操作,例如加法、乘法、卷积等,边表示数据的流动;如果在计算图中重复添加相同的节点,这些节点将执行相同的计算,从而造成计算资源的浪费;此外,在反向传播算法中,重复节点也会导致梯度的重复计算,增加计算时间和内存使用;这一步旨在检测使用相同参数重复调用tensorflow用于创建节点的api情况,避免计算图中相同节点被重复创建;具体包括以下步骤:
7.(1.1)分析tensorflow python api中使用@tf_export装饰的代码,提取出可能会添加计算图节点的tensorflow api;
8.(1.2)对提取的api进行人工检查,筛去一些实际上并不增加计算图节点(如
tf.assign)或产生不确定输出(如tf.random.uniform)的api,最终获得356个api;
9.(1.3)对于上述api在for或while循环里调用的情况,跟踪在循环迭代中变化的变量,包括循环控制变量、在循环内部赋值但在循环外部定义的变量,以及所有依赖于上述变量的变量,判断目标api是否使用相同的参数值被重复调用;对于上述api作为参数被某个函数循环调用的情况,认为该api使用了相同的参数值被重复调用,相同的计算图节点被重复创建。
10.(2)batch和map顺序的检查;
11.对于tensorflow的dataset模块,在batch方法之前调用map方法会导致非必要的map函数调用增加;本发明采用先调用batch方法,再调用map方法,以此减少映射函数被调用的次数;具体包括以下步骤:
12.(2.1)识别代码中tf.data.dataset为前缀的方法调用;
13.(2.2)分析上述方法的调用情况,检查batch是否在map之后被调用,若是,则建议先调用batch方法,再调用map方法。
14.(3)map方法和interleave方法未进行并行设置的检查;
15.对于tensorflow的dataset模块,如果调用map方法或interleave方法时没有设置它的num_parallel_calls参数,map方法或interleave方法的并行属性将被禁用;这一步检查map方法和interleave方法是否进行了并行设置;具体包括以下步骤:
16.(3.1)识别代码中的tf.dataset对象;
17.(3.2)分析tf.dataset对象的调用情况,检查这类对象在调用map和interleave方法时是否设置了num_parallel_calls参数。
18.(4)tf.function装饰函数循环定义的检查;
19.在tensorflow 2中,使用tf.function可以高效地将程序转换成计算图,然而,tf.function的错误使用可能会产生性能上的副作用;若tf.function装饰的函数在循环内被定义并调用,则每执行一次循环,函数都要被重新定义并重新生成一张重复的计算图,重复的计算图跟踪操作导致性能下降;这一步定位处于循环中的被tf.function装饰的定义函数,具体包括以下步骤:
20.(4.1)利用抽象语法树解析代码,识别并定位项目代码中被tf.function装饰的函数;
21.(4.2)检查上述函数的外层是否存在for或while循环,若存在,则认为该函数在for或while循环内部被重复定义,引发了重复跟踪问题;
22.(4.3)检查上述函数是否存在外层函数,即上述函数是否为外层函数的私有方法;若外层函数被循环调用(包含外层函数的定义和调用分布在不同文件的情况),每调用一次,其内部的定义函数都要被重新定义并生成一张新的计算图,引发了重复跟踪问题。
23.(5)向tf.function装饰的函数传递变化的python类型参数的检查;
24.tf.function最适合处理tensorflow运算,而python类型的参数会被当作常量处理;由于变化的python类型参数值会导致多个跟踪,但生成的计算图实际上是相同的,所以向tf.function装饰的函数传递数值变化的python类型参数会触发非必要的回溯;这一步检查向tf.function装饰的函数传递变化的python类型参数的情况,具体包括以下步骤:
25.(5.1)利用抽象语法树解析代码,识别并定位项目代码中被tf.function装饰的函
数;
26.(5.2)找到该函数被调用的位置,如果它的外层是for或while循环语句,且函数被调用时传入的python类型参数(包括int/float/double/string等基本类型)受循环变量的影响,则认为发生了重复跟踪。
27.本发明的基本过程示意图如图1所示;本发明能够帮助开发人员快速高效地检测5种常见的性能问题,分别为使用相同参数重复调用tensorflow用于创建节点的api;map和batch的调用次序错误增加了不必要的map函数调用;在未设置num_parallel_calls参数的情况下调用map和interleave函数使函数的并行功能被禁用;循环定义并调用被tf.function装饰的函数;向tf.function装饰的函数传递数值变化的python类型参数;本发明使用基于规则的静态检测方法,帮助促进深度学习系统提升性能。
附图说明
28.图1为本发明的基本过程示意图。
29.图2为本发明的检测结果示例。展示了memory.py文件的问题代码片段,及对该文件使用第一种性能问题检测技术(重复创建计算图节点行为的检查)的检测结果。
30.图3为本发明的检测结果示例。展示了parallel_map.py文件的问题代码片段,及对该文件使用第二种(batch和map顺序的检查)和第三种(map方法和interleave方法未进行并行设置的检查)性能问题检测技术的检测结果。
31.图4为本发明的检测结果示例。展示了retracing.py文件的问题代码片段,及对该文件使用第四种(tf.function装饰函数循环定义的检查)和第五种(向tf.function装饰的函数传递变化的python类型参数的检查)性能问题检测技术的检测结果。
具体实施方式
32.下面通过实施例结合附图进一步介绍本发明。
33.利用本发明方法,实现对基于tensorflow的python软件项目5种性能问题的静态检测,具体步骤如下:
34.(1)重复创建计算图节点行为的检查。为了筛选出会添加计算图节点的api,首先,解析tensorflow python api中使用@tf_export装饰的代码,提取出可能会添加计算图节点的tensorflow api;然后,对提取的api进行人工检查,筛去一些实际上并不增加计算图节点(如tf.assign)或产生不确定输出(如tf.random.uniform)的api,最终获得356个api。为了检测项目中的api相同参数重复调用,首先,遍历项目路径下的所有python文件,对每个文件,使用抽象语法树遍历所有节点,识别代码中调用上述api的位置;对于上述api在for或while循环里调用的情况,跟踪在循环迭代中变化的变量,包括循环控制变量、在循环内部赋值但在循环外部定义的变量,以及所有依赖于上述变量的变量,判断目标api是否使用相同的参数值被重复调用,若存在重复调用,输出问题代码检测反馈,即api调用所在的行号;对于上述api作为参数被某个函数循环调用的情况,认为该api使用了相同的参数值被重复调用,相同的计算图节点被重复创建,并输出问题代码检测反馈,即api调用所在的行号。在图2中,对于memory.py文件,tf.gather方法(第69行)和tf.stack方法(第70行)在for循环(第68行)内部被循环调用,且每次调用均使用相同的参数,则可判断存在重复创建
计算图节点的行为,最终检测结果输出上述tf.gather和tf.stack方法调用的位置。
35.(2)batch和map顺序的检查。首先,遍历项目路径下的所有python文件,对每个文件,使用抽象语法树遍历所有节点,识别代码中以tf.data.dataset为前缀的方法调用;然后,分别检查上述方法调用batch方法和map时的位置,比较它们的调用行号;若batch方法在map方法之后被调用,则输出问题代码检测反馈,即方法各自所在的行号。在图3中,对于parallel_map.py文件,map方法(第16行)在batch方法(第17行)之前被调用,则可判断这两个方法的调用顺序存在错误,最终检测结果输出batch方法和map方法调用各自所在的行号。
36.(3)map方法和interleave方法未进行并行设置的检查。首先,遍历项目路径下的所有python文件,对每个文件,使用抽象语法树遍历所有节点,识别代码中map方法和interleave方法的调用位置;然后,检查map方法和interleave方法的传入参数里是否对num_parallel_calls进行了设置,若未设置,则输出问题代码检测反馈,即上述方法调用的位置。在图3中,对于parallel_map.py文件,调用map方法(第16行)时没有设置num_parallel_calls参数,则可判断调用map方法时未进行并行设置,最终检测结果输出该map方法所在的行号。
37.(4)tf.function装饰函数循环定义的检查。首先,遍历项目路径下的所有python文件,对每个文件,使用抽象语法树遍历所有节点,定位并记录被tf.function装饰的函数节点;然后,检查它的外层是否存在for或while循环以及外层函数,若外层存在for或while循环,输出输出问题代码检测反馈,即函数定义和调用的位置以及循环语句的位置,若存在外层函数,将其记录下来;完成第一轮遍历后,对所有文件进行第二轮遍历,找到for或while循环里的函数调用;使用jedi.script.goto方法找到调用函数的定义位置;若该函数是第一轮记录的tf.function装饰函数的外层函数,输出问题代码检测反馈,即tf.function装饰函数定义和调用的位置,以及外层函数被调用的位置和循环语句的位置。在图4中,对于retracing.py文件,tf.function装饰的函数inner_fn(第9行)在outer_fn(第7行)函数内部被定义和调用,而outer_fn(第15行)在for循环(第13行)内部被循环调用,则可判断导致了重复跟踪,最终检测结果输出inner_fn和outer_fn被定义的行号,以及outer_fn被调用的行号和for循环开始的行号。
38.(5)向tf.function装饰的函数传递变化的python类型参数的检查。首先,遍历项目路径下的所有python文件,对每个文件,使用抽象语法树遍历所有节点,定位并记录被tf.function装饰的函数节点;然后,找到函数的被调用位置,使用jedi.script.infer方法推断传入函数的参数类型,判断是否为设定的基本python类型(int/float/bool/double/string);接着,使用jedi.script.get_references方法获得python类型参数的定义语句位置,判断它是否受到for或while循环的循环变量影响,若参数随循环变量变化而变化,则输出问题代码检测反馈,即tf.function装饰函数定义和调用的位置以及参数的类型推断结果和循环语句的位置;完成第一轮遍历后,对所有文件进行第二轮遍历,找到tf.function装饰的函数在其定义文件之外被调用的位置后,操作与前部分相同,若符合要求,输出问题代码检测反馈。在图4中,对于retracing.py文件,定义了tf.function装饰的函数fn(第4行),而fn(第14行)在for循环(第13行)内部被循环调用,且每次循环都向fn传递了变化的int类型参数,则可判断导致了重复跟踪,最终检测结果输出fn定义所在的行号,以及fn被
调用的行号和for循环开始的行号。
39.本发明是基于静态分析的tensorflow深度学习代码性能问题检测方法,能够帮助开发者提高深度学习系统的性能。我们使用本发明对github上1500个基于tensorflow的深度学习项目进行了检测,在190个项目中新发现了680个性能问题,其中126个问题被开发者确认,31个问题被修复。
技术特征:
1.基于静态分析的tensorflow深度学习代码性能问题检测方法,其特征在于,针对基于tensorflow的深度学习项目,应用静态检测技术,检测并定位python项目文件中导致性能损失的问题代码,检测5种常见的性能问题,即用相同参数多次调用创建计算图节点的api导致相同节点被重复创建;batch和map方法的调用次序错误导致不必要的map方法的调用增加;调用map和interleave方法时未设置num_parallel_calls参数导致函数的并行功能被禁用;循环定义tf.function装饰的函数导致相同计算图重复构建;向tf.function装饰的函数传递数值变化的python类型参数导致计算图重复构建;具体步骤如下:(1)重复创建计算图节点行为的检查;在深度学习系统中,计算图是表示模型结构和计算流程的图形化数据结构,计算图中的节点表示操作,边表示数据的流动;如果在计算图中重复添加相同的节点,这些节点将执行相同的计算,从而造成计算资源的浪费;此外,在反向传播算法中,重复节点也导致梯度的重复计算,增加计算时间和内存使用;重复创建计算图节点行为的检查,是检测使用相同参数重复调用tensorflow用于创建节点的api情况,避免计算图中相同节点被重复创建;(2)batch和map顺序的检查;对于tensorflow的dataset模块,在batch方法之前调用map方法会导致非必要的map函数调用增加;本步骤检查batch和map顺序,是先调用batch方法,再调用map方法,以此减少映射函数被调用的次数;(3)map方法和interleave方法未进行并行设置的检查;对于tensorflow的dataset模块,如果调用map方法或interleave方法时没有设置它的num_parallel_calls参数,map方法或interleave方法的并行属性将被禁用;本步骤是检查map方法和interleave方法是否进行并行设置;(4)tf.function装饰函数循环定义的检查;在tensorflow 2中,使用tf.function可以高效地将程序转换成计算图,然而,tf.function的错误使用可能会产生性能上的副作用;若tf.function装饰的函数在循环内被定义并调用,则每执行一次循环,函数都要被重新定义并重新生成一张重复的计算图,重复的计算图跟踪操作导致性能下降;本步骤检查是定位处于循环中的被tf.function装饰的定义函数;(5)向tf.function装饰的函数传递变化的python类型参数的检查;tf.function最适合处理tensorflow运算,而python类型的参数会被当作常量处理;由于变化的python类型参数值会导致多个跟踪,但生成的计算图实际上是相同的,所以向tf.function装饰的函数传递数值变化的python类型参数会触发非必要的回溯;本步骤检查向tf.function装饰的函数传递变化的python类型参数的情况。2.根据权利要求1所述的检测方法,其特征在于,步骤(1)的具体流程为:(1.1)分析tensorflow python api中使用@tf_export装饰的代码,提取出可能会添加计算图节点的tensorflow api;(1.2)对提取的api进行人工检查,筛去一些实际上并不增加计算图节点或产生不确定输出的api,最终获得356个api;(1.3)对于上述api在for或while循环里调用的情况,跟踪在循环迭代中变化的变量,包括循环控制变量、在循环内部赋值但在循环外部定义的变量,以及所有依赖于上述变量
的变量,判断目标api是否使用相同的参数值被重复调用;对于上述api作为参数被某个函数循环调用的情况,认为该api使用了相同的参数值被重复调用,相同的计算图节点被重复创建。3.根据权利要求2所述的检测方法,其特征在于,步骤(2)的具体流程为:(2.1)识别代码中tf.data.dataset为前缀的方法调用;(2.2)分析上述方法的调用情况,检查batch是否在map之后被调用,若是,则先调用batch方法,再调用map方法。4.根据权利要求3所述的检测方法,其特征在于,步骤(3)的具体流程为:(3.1)识别代码中的tf.dataset对象;(3.2)分析tf.dataset对象的调用情况,检查这类对象在调用map和interleave方法时是否设置了num_parallel_calls参数。5.根据权利要求4所述的检测方法,其特征在于,步骤(4)的具体流程为:(4.1)利用抽象语法树解析代码,识别并定位项目代码中被tf.function装饰的函数;(4.2)检查上述函数的外层是否存在for或while循环,若存在,则认为该函数在for或while循环内部被重复定义,引发了重复跟踪问题;(4.3)检查上述函数是否存在外层函数,即上述函数是否为外层函数的私有方法;若外层函数被循环调用,每调用一次,其内部的定义函数都要被重新定义并生成一张新的计算图,引发了重复跟踪问题。6.根据权利要求5所述的检测方法,其特征在于,步骤(5)的具体流程为:(5.1)利用抽象语法树解析代码,识别并定位项目代码中被tf.function装饰的函数;(5.2)找到该函数被调用的位置,如果它的外层是for或while循环语句,且函数被调用时传入的python类型参数受循环变量的影响,那么认为发生了重复跟踪。
技术总结
本发明属于软件工程技术领域,具体为基于静态分析的TensorFlow深度学习代码性能问题检测方法。本发明方法包括:针对TensorFlow深度学习项目,应用静态检测技术检测并定位Python项目文件中导致性能损失的问题代码,检测5种性能问题,即用相同参数多次调用计算图节点的API导致相同节点被重复创建;batch和map方法调用次序错误导致的map方法调用增加;调用map和interleave方法时未设置num_parallel_calls参数导致函数并行功能禁用;循环定义tf.function装饰函数导致相同计算图重复构建;向tf.function装饰函数传递数值变化的Python类型参数导致计算图重复构建。本发明可以帮助开发人员快速高效地检测部分性能问题,提升深度学习系统性能。提升深度学习系统性能。提升深度学习系统性能。
技术研发人员:陈碧欢 曹峻铭 潘佳卉 彭鑫 赵文耘
受保护的技术使用者:复旦大学
技术研发日:2023.05.13
技术公布日:2023/8/16
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
