
作者|郑建华
1
不同Tensor类型的存储管理方式
Lazy Tensor 的存储是由 Runtime 和 Actor 等对象管理的。静态图完成编译后,需要多少个对象、多少存储空间都是确定的,Runtime 等在初始化时会分配存储,在退出时回收资源。
Eager 模式下,Global Tensor 可以视为对 Local Tensor 的分布式封装,EagerGlobalTensorImpl 在本地的数据是一个
EagerLocalTensorImpl 对象。可以通过考察 EagerLocalTensorImpl 来理解 eager 模式下 tensor 的存储管理。
参考的示例代码如下:
- import numpy as np
- import oneflow as flow
-
- a = np.random.randn(1, 4)
- flow.tensor(a, device=flow.device("cpu"), dtype=flow.float)
2
Tensor 存储相关类的关系
EagerLocalTensorImpl 的存储相关的类关系如下。
后续会顺着示例代码的执行过程,看看图中的对象都是在何时、如何构造的,存储被谁持有、如何分配并释放。

3
通过虚拟机指令为 Tensor 分配存储
tensor 的构造函数通过 Python C API 注册为 PyTensorObject_init,由 functional::_legacy_tensor_ctor
根据签名进行转发。
示例代码对应的是 TensorWithDataFunctor