分析

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)

这会生成以下输出:

../../_images/profiling.png

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 中生成当前配置文件统计信息的可视化。目前这仅支持交互式笔记本