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

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使用Hibernate EntityManager(与Hibernate Core相比)有什么缺点吗?   使用kotlin测试用java编写的安卓应用程序   java在跳转到JavaEE之前,我应该做更多的JavaSE吗?   Java:iText库PDF合并,PDF始终位于页面底部   使用JDBCSpring在多个查询中回滚java   java JPA匹配多个关系中的元素子集   java Datanucleus RDBMS JPA JarWithDependenceCues   java与Http API相比,ThriftFinagle API有多安全?它们的性能如何?   JavaNetty服务器如何从外部调用方法?   如何在访问ApacheTomcat服务器上托管的java web应用程序时获取计算机和用户信息?   java如何存储和重放JDBC语句?   java if语句字符串比较