不使用任何外部工具分析用户定义的代码区域
region-profiler的Python项目详细描述
使用with-语句和装饰符标记区域。 时间区域层次结构,获取详细的控制台报告以及chrome跟踪日志。
功能
- 只测量您需要的内容。请参阅标记区域的计时 不要浪费时间看你不感兴趣的东西。
- measure第三方库。您可以在任意python包中标记区域。 完成后不要忘记回滚更改:) 同样,只有标记的区域才算数。不需要查看不熟悉的库内部的计时。
- 无需使用外部工具(如kernprof)来收集分析数据。 从应用程序中配置文件并使用常用命令运行它。
- 平均区域开销为3-10 us(python 3.7,英特尔酷睿i5)。
- chrome跟踪日志生成。
- 表格或csv报告格式。
- 没有依赖项。
为什么选择另一个python分析器
而其他探查器通常关注 在某些特定粒度(如函数或单行)上, 区域探查器允许用户选择感兴趣范围的大小 每次,从整个函数移动到行的子集再到单个迭代。
区域探查器报告 仅包含有关用户定义区域的信息- 如果我们在调查一些复杂的框架,我们不需要 在我们感兴趣的区域之外计时。
与大多数现有剖面仪相反, 区域探查器不需要任何特殊程序/开关 (像kernprof)用于应用程序启动。 这个工具对于研究瓶颈非常有用 在更大的应用程序中,启动过程很复杂 (例如,使用mpi在集群上运行的分布式nn训练器)。
开始
依赖性
- python=3.4
安装
您可以使用pip:
pip install region_profiler
或来源:
git clone https://github.com/metopa/region_profiler.git cd region_profiler python setup.py install
示例
标记一些要分析的代码区域:
import region_profiler as rp # <<<<< class NeuralNet(tfe.Network): def __init__(self): ... def call(self, x): with rp.region('NN', asglobal=True): # <<<<< with rp.region('layer 1'): # <<<<< x = self.layer1(x) with rp.region('layer 2'): # <<<<< x = self.layer2(x) with rp.region('out layer'): # <<<<< x = self.out_layer(x) return x @rp.func() # <<<<< def loss_fn(inference_fn, inputs, labels): ... @rp.func() # <<<<< def accuracy_fn(inference_fn, inputs, labels): ... with rp.region('train'): # <<<<< for step in range(num_steps): with rp.region('forward'): # <<<<< batch_loss = loss_fn(neural_net, x_batch, y_batch) batch_accuracy = accuracy_fn(neural_net, x_batch, y_batch) with rp.region('backward'): # <<<<< optimizer.apply_gradients(grad(neural_net, x_batch, y_batch))
通过调用region_profiler.install:
if __name__ == '__main__': rp.install(chrome_trace_file='trace.json')
请参见Chrome跟踪查看器中的控制台报告和火焰图:
name total % of total ------------------- -------- ---------- <main> 12.44 s 100.00% . train 11.64 s 93.51% . . backward 7.229 s 58.10% . . . loss_fn() 2.079 s 16.71% . . forward 4.142 s 33.29% . . . loss_fn() 2.134 s 17.15% . . . accuracy_fn() 1.937 s 15.56% . . fetch_next 225.2 ms 1.81% . NN 5.389 s 43.32% . . layer 1 3.295 s 26.48% . . layer 2 1.544 s 12.41% . . out layer 444.0 ms 3.57%
文档
您可以找到完整的api引用here。
主api由以下函数组成:
- region_profiler.install()
- 应该调用此函数一次以启用分析 并将一些选项传递给探查器。
- region_profiler.region()
此函数返回用于标记分析区域的上下文管理器。 允许的参数:
- name-区域名。 如果省略,则使用格式为func() <filename.py:lineno>的自动名称。
- as_global-将区域标记为全局。
- region_profiler.func()
在区域中包装标记函数的函数装饰器。 允许的参数:
- name-区域名。 如果省略,则使用格式为func()的自动名称。
- as_global-将区域标记为全局。
- region_profiler.iter_proxy()
iterable对象包装器。度量在每次迭代上花费在__next__中的时间。 当遍历DataLoader之类的内容时,此包装器非常有用。 允许的参数:
- name-区域名。 如果省略,则使用格式为func() <filename.py:lineno>的自动名称。
- as_global-将区域标记为全局。
许可证
麻省理工学院版权所有Viacheslav Kroilov<;slavakroilov@gmail.com>;