分析¶
Python 标准库包括代码分析功能。当活动时,函数调用和花费在它们上的时间被记录。
该accelerate.profiler
模块还通过记录函数的签名来扩展此功能,这很有用,因为通常精确的控制流以及函数性能取决于参数类型。对于 NumPy 数组类型,这不仅包括dtype
属性,还包括数组的形状。
分析示例¶
以下代码定义了一个简单的点函数,并在没有签名的情况下对其进行分析以匹配 Python 标准库配置文件模块的行为:
from accelerate import profiler
import numpy as np
def dot(a, b):
sum=0
for i in range(len(a)):
sum += a[i]*b[i]
return sum
a = np.arange(16, dtype=np.float32)
b = np.arange(16, dtype=np.float32)
p = profiler.Profile(signatures=False)
p.enable()
dot(a, b)
p.disable()
p.print_stats()
这将生成以下输出:
3 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 builtins.len
1 0.000 0.000 0.000 0.000 dot.py:7(dot)
1 0.000 0.000 0.000 0.000 {method 'disable' of 'prof.Profiler' objects}
注意:默认情况下,Profile
构造函数的signature
标志设置为True
,导致以下输出:
3 function calls (2 primitive calls) in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 dot.py:1(disable())
2/1 0.000 0.000 0.000 0.000 dot.py:7(dot(a:ndarray(dtype=float32, shape=(16,)), b:ndarray(dtype=float32, shape=(16,))))
在更真实代码的结果中,调用图——以及函数调用表——要大得多,使得以表格形式处理数据变得不方便。
为了解决这个问题,该accelerate.profiler
模块还提供了可视化数据的功能。不是调用print_stats()
方法,而是调用accelerate.profiler.plot()
函数。
注意:此时,accelerate.profiler.plot()
只能从笔记本内部调用该函数。
如果上面的代码是从笔记本内部执行的,请运行以下代码:
In [3]: profiler.plot(p)
这会生成以下输出:
Accelerate.profiler API ¶
-
类
accelerate.profiler.
Profile
( custom_timer=None , time_unit=None , subcalls=True , builtins =True , signatures=True ) ¶ 使用指定的计时器函数构建探查器对象。默认计时器是基于实时的快速内置计时器。对于返回整数的自定义计时器函数,time_unit 可以是指定比例的浮点数(即每个整数单位的长度,以秒为单位)。
-
clear
( ) ¶ 清除迄今为止收集的所有分析信息。
-
disable
( ) ¶ 停止收集分析信息。
-
enable
( subcalls=True , builtins= True ) ¶ 开始收集分析信息。如果 'subcalls' 为 True,还记录每个函数的统计信息,根据其当前调用者分开。如果 'builtins' 为 True,则记录在内置函数中花费的时间与其调用者分开。
-
getstats
( ) → profiler_entry 对象列表¶ 返回分析器收集的所有信息。每个 profiler_entry 都是一个类似元组的对象,具有以下属性:
代码 代码对象 callcount 这个被调用多少次 reccallcount 有多少次递归调用 totaltime 这个条目中的总时间 inlinetime 这个条目中的内联时间(不是在子调用中)调用的细节call 属性要么是 None 要么是一个 profiler_subentry 对象列表:
代码调用代码对象 callcount 这个被调用多少次 reccallcount 这个被递归调用多少次 totaltime 在这个调用中花费的总时间 inlinetime 内联时间(不在进一步的子调用中)
-
print_stats
(排序=-1 ) ¶ 打印带有配置文件统计信息的表格。
-
-
accelerate.profiler.
plot
(探查器) ¶ 在profiler 中生成当前配置文件统计信息的可视化。目前这仅支持交互式笔记本