• 【教程】PyTorch Timer计时器


    转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

    OpenCV的Timer计时器可以看这篇:Python Timer和TimerFPS计时工具类

    Timer作用说明:统计某一段代码的运行耗时。

    直接上代码,开箱即用。

    1. import time
    2. import torch
    3. import os
    4. from enum import Enum, unique
    5. @unique
    6. class TimerKeys(Enum):
    7. START = 'start' # 本次调用start函数时的时间戳
    8. END = 'end' # 本次调用end函数时的时间戳
    9. ELAPSED = 'elapsed' # 多次调用start和end函数的总耗时
    10. TOTAL = 'total' # 本次所耗end-start的时间
    11. HISTORY = 'history' # 保存每次的elapsed
    12. class Timer(object):
    13. def __init__(self, device: torch.device):
    14. super(Timer, self).__init__()
    15. self._device = device
    16. self._record_sxf = {}
    17. def start(self, name, history=False):
    18. '''开始计时,通过name区分不同的计时器;
    19. 在start时如果开启了history,就算下次start时没有开启history,history仍然会使用,
    20. 除非显式调用了reset_all或reset_item,然后再调用start并不开启history,就不会记录。'''
    21. torch.cuda.current_stream(self._device).synchronize()
    22. if not self._record_sxf.get(name):
    23. self._record_sxf[name] = {}
    24. self._record_sxf[name][TimerKeys.TOTAL] = 0
    25. if history:
    26. self._record_sxf[name][TimerKeys.HISTORY] = []
    27. else:
    28. self._record_sxf[name].pop(TimerKeys.END)
    29. self._record_sxf[name].pop(TimerKeys.ELAPSED)
    30. self._record_sxf[name][TimerKeys.START] = time.time()
    31. def stop(self, name, store=True):
    32. '''计算指定name的本次耗时'''
    33. torch.cuda.current_stream(self._device).synchronize()
    34. if self._record_sxf.get(name) and self._record_sxf[name].get(TimerKeys.START):
    35. self._record_sxf[name][TimerKeys.END] = time.time()
    36. self._record_sxf[name][TimerKeys.ELAPSED] = self._record_sxf[name][TimerKeys.END] - self._record_sxf[name][TimerKeys.START]
    37. return self.store(name) if store else self._record_sxf[name][TimerKeys.ELAPSED]
    38. else:
    39. print(f'>> 不存在此计时器[{name}],请先start')
    40. return None
    41. def store(self, name):
    42. '''计算指定name的累计耗时'''
    43. if not self._record_sxf.get(name):
    44. print(f'>> 不存在此计时器[{name}],请先start')
    45. return None
    46. if not self._record_sxf[name].get(TimerKeys.ELAPSED):
    47. print(f'>> 请先stop')
    48. return None
    49. self._record_sxf[name][TimerKeys.TOTAL] += self._record_sxf[name][TimerKeys.ELAPSED]
    50. if self._record_sxf[name].get(TimerKeys.HISTORY) is not None:
    51. self._record_sxf[name][TimerKeys.HISTORY].append(self._record_sxf[name][TimerKeys.ELAPSED])
    52. return self._record_sxf[name][TimerKeys.TOTAL]
    53. def show_store(self):
    54. '''显示所有项目的累计耗时'''
    55. print(self._record_sxf)
    56. def pretty_show_store(self):
    57. print("{", end='')
    58. for key, value in self._record_sxf.items():
    59. print(f"'{key}': {{")
    60. for enum_key, enum_value in value.items():
    61. print(f" {enum_key.name if isinstance(enum_key, Enum) else enum_key}: {enum_value},")
    62. print(" },")
    63. print("}")
    64. def get_store(self):
    65. return self._record_sxf
    66. def peak_item(self, name, key=None):
    67. if key:
    68. return self._record_sxf[name].get(key) if self._record_sxf.get(name) else None
    69. return self._record_sxf.get(name)
    70. def reset_item(self, name):
    71. self._record_sxf.pop(name)
    72. def reset_all(self):
    73. self._record_sxf = {}
    74. if __name__ == '__main__':
    75. timer = Timer(torch.device('cuda:0'))
    76. timer.start('a')
    77. time.sleep(5)
    78. timer.stop('a')
    79. # {'a': {'total': 5.005435228347778, 'start': 1693419100.180317, 'end': 1693419105.1857522, 'elapsed': 5.005435228347778}}
    80. timer.show_store()
    81. print()
    82. timer.start('a')
    83. time.sleep(2)
    84. timer.stop('a')
    85. # {'a': {'total': 7.007752180099487, 'start': 1693419105.1859245, 'end': 1693419107.1882415, 'elapsed': 2.002316951751709}}
    86. timer.show_store()
    87. print()
    88. timer.start('b')
    89. time.sleep(3)
    90. timer.stop('b')
    91. # {'a': {'total': 7.007752180099487, 'start': 1693419105.1859245, 'end': 1693419107.1882415, 'elapsed': 2.002316951751709},
    92. # 'b': {'total': 3.0033228397369385, 'start': 1693419107.1884048, 'end': 1693419110.1917276, 'elapsed': 3.0033228397369385}}
    93. timer.show_store()
    94. timer.reset_all()
    95. print()
    96. timer.start('c')
    97. time.sleep(3)
    98. timer.start('d')
    99. time.sleep(3)
    100. timer.stop('d')
    101. # {'c': {'total': 0, 'start': 1693419110.1919253},
    102. # 'd': {'total': 3.003229856491089, 'start': 1693419113.1927958, 'end': 1693419116.1960256, 'elapsed': 3.003229856491089}}
    103. timer.show_store()
    104. timer.stop('c')
    105. # {'c': {'total': 6.0042500495910645, 'start': 1693419110.1919253, 'end': 1693419116.1961753, 'elapsed': 6.0042500495910645},
    106. # 'd': {'total': 3.003229856491089, 'start': 1693419113.1927958, 'end': 1693419116.1960256, 'elapsed': 3.003229856491089}}
    107. timer.show_store()
    108. timer.reset_all()
    109. print()
    110. timer.start('e')
    111. time.sleep(3)
    112. timer.start('f')
    113. time.sleep(3)
    114. timer.stop('e')
    115. # {'e': {'total': 6.004979848861694, 'start': 1693419433.8564444, 'end': 1693419439.8614242, 'elapsed': 6.004979848861694},
    116. # 'f': {'total': 0, 'start': 1693419436.859731}}
    117. timer.show_store()
    118. timer.stop('f')
    119. # {'e': {'total': 6.004979848861694, 'start': 1693419433.8564444, 'end': 1693419439.8614242, 'elapsed': 6.004979848861694},
    120. # 'f': {'total': 3.00180983543396, 'start': 1693419436.859731, 'end': 1693419439.8615408, 'elapsed': 3.00180983543396}}
    121. timer.pretty_show_store()

    函数调用示例:

    1. timer = Timer(torch.device('cuda:0'))
    2. timer.start('a')
    3. # xxxxxx
    4. time_used = timer.stop('a')
    5. timer.show_store()

  • 相关阅读:
    MySQL表的增删查改(嘎嘎详细~
    计算二进制中1的个数
    Springboot课程线上自主学习系统ty7d1计算机毕业设计-课程设计-期末作业-毕设程序代做
    Scrapy与Selenium强强联合-共创爬虫大业
    java mysql高校返校新冠疫情排查系统
    JS选项卡
    java计算机毕业设计ssm+vue红联小区果蔬销售网站-水果购物商城
    SpringBoot + 自定义注解 + AOP 高级玩法打造通用开关
    第三章 第二节:参数的概念
    【vertx系列教程】(一)vertx实现tcp通信,tcp服务端搭建,基于springboot项目
  • 原文地址:https://blog.csdn.net/sxf1061700625/article/details/132600645