1 执行流程

1.1 初始化

1.2 设置 eval frame 以替代默认的 eval frame 函数

set_eval_frame_py 输入参数中的 args[0] 应该就是 Python 传入的 callback

在 Python _TorchDynamoContext 中调用这个函数,Python 的方法名是 set_eval_frame

1.2.1 函数的主要作用

  • 将传入的 callback 保存到 thread specific storage
  • 如果需要的话,设置 eval_frame 为 custom_eval_frame_shim
  • 返回之前保存在 tss 的、旧的 callback

1.2.2 set_eval_frame_py 执行流程

1.3 _TorchDynamoContext: 用于设置转换字节码的 callback 函数

这是 torch._dynamo.optimize(...) 对应的 context manager。callback 是 Python 代码。

  • __enter__ 中通过 self.prior = set_eval_frame(self.callback)保存之前的回调。

    • set_eval_frame 就是上面提到的 set_eval_frame_py。
  • __exit__ 中通过 set_eval_frame(self.prior) 恢复之前的 eval frame。
  • __call__: 当我们调用 optimizer('inductor')(fn) 时,Dynamo 会将 fn 的帧评估函数替换成 Dynamo 自定义的,并且传入回调函数。传入的回调函数会被自定义的帧评估函数调用。回调函数会解析重构 frame 中原有的字节码,并在过程中追踪模型执行图结构。当然了,帧评估时也不是每次都会调用回调函数,例如某个 frame 已经被解析重构过了(cached),此时就会直接执行缓存里已经重构好的代码。

1.4 执行 Python 字节码时,调用 custom_eval_frame_shim 进行 eval frame

在这里获取 callback,并用于 eval:

_custom_eval_frame_shim

2 TODO

  • torch.fx
  • 解析字节码、生成新的字节码、设置 co_extra 的过程。

3 参考资料

3.1 cpython

3.2 Dynamo

3.3 torch.fx


郑建华
1 声望4 粉丝