不使用任何外部工具分析用户定义的代码区域

region-profiler的Python项目详细描述


https://badge.fury.io/py/region-profiler.svgDocumentation Statushttps://travis-ci.com/metopa/region_profiler.svg?branch=masterhttps://codecov.io/gh/metopa/region_profiler/branch/master/graph/badge.svg

使用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%
https://github.com/metopa/region_profiler/raw/master/examples/chrome_tracing.png

文档

您可以找到完整的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>;

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何从java中链接到数组的数组中删除值。jar文件?   性能记录屏幕Java磁盘速度   java Elastic APM Tomcat zip文件或JAR清单丢失   java无法在eclipse控制台上打印结果   java如何在Android中解析json对象?   java如何更改边缘根类型   java根据一些规则替换EditText中的字母   java项目反应器:是否有类似Nosideeffect finally的方法(不是sideeffect方法doFinally)   java连接Cassandra节点和spark   开源Java作业调度器:远程处理、负载平衡、故障切换、依赖DAG?   使用矢量汇编程序(Java)在Spark中设置输入和输出时出现问题   swing如何在Java中为文本字段创建右键单击菜单?   java查找最近的邻居/纬度和经度   java计算完成的数独板的行和列