# py_coodehook **Repository Path**: mstczuo/py_coodehook ## Basic Information - **Project Name**: py_coodehook - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2021-09-18 - **Last Updated**: 2021-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Code hook for python 这是用 python 生成 hook 的一个尝试 假设在代码中打了一些标记,就可以实现不修改原代码的情况下,插入一些新的功能。 ## 安装 codehook codehook 没有打包,需下载源码安装。进入源码目录后执行 `pip setup.py install` 即可。 ## 使用方法 完成安装之后,执行 `import hook` 即可使用钩子。这里以一个简单的例子展示使用方法。 在 `example/toy` 目录下,有两个文件:`launch.py` 和 `main.py`,其中 `main.py` 是 原程序,可单独执行 `python main.py`,查看没有启用钩子时候的代码。 原有的代码片段去掉钩子之后为: ```python def main(): for i in range(10): print('iter %d' % i) value = np.sin(i) ``` 这段代码计算了 sin(0) ~ sin(9),但是没有输出。在 `launch.py` 中,实现了 `CalcSum` 钩子 用于求和、求均值、输出;实现了 `MultirunTimerHook` 钩子用于计算运行时间。 要使用这些功能,对于原有代码,只需要加入若干 `hook.place`。执行这一步时不影响原有代码,依然 可以运行 `python main.py`。 ```python def main(): hook.place('before loop') for i in range(10): hook.place('before iter') print('iter %d' % i) value = np.sin(i) hook.place('after iter') hook.place('after loop') ``` 钩子实现: ```python class CalcSum(hook.HookBase): @hook.set_tag(tag='before loop') def init_vars(self): self.sum = 0 self.total = 0 @hook.set_tag(tag='after loop') def print_stat(self): print('Sum: {}, total: {}, stat: {}'.format( self.sum, self.total, self.sum / max(self.total, 1) )) @hook.set_tag(tag='after iter') def step(self, value): self.sum += value self.total += 1 ``` 然后在新的代码中,调用 `hook.enable` 即可启用这两个钩子: ```python if __name__ == '__main__': hook.enable_hooks([CalcSum(), MultirunTimerHook()]) main() ``` ## 运行样例 运行样例1: ``` cd example/toy python main.py python launch.py ``` 我们准备了一个简化机器学习代码的例子:用 MNIST 训练 LeNet。 原始代码是 `example/mnist/train_mnist.py` 用 Hook 改写后的代码是 `example/mnist/train_mnist2.py` ,其中一些配置在 `default.yaml` 和 `mnist.yaml` 上定义。 ``` cd example/mnist python train_mnist2.py ``` ## 参与贡献 这个工具将主要为机器学习工程设计,欢迎感兴趣的开发者参与开发、提出需求或者与作者讨论。