• OneFlow源码解析:Tensor类型体系与Local Tensor


    edc0163d79c93673a5ebbd0e9b5b9104.jpeg

    撰文|郑建华

    更新|赵露阳

    tensor和op是神经网络模型最基本的组件:op是模型的节点,tensor是连接节点的边。然而,构建一个tensor并不仅仅是构造一个对象那么简单,至少要考虑以下问题:

    • 要支持节点本地的local tensor,以及分布式的global tensor;

    • 要支持eager和lazy执行模式;

    • 要支持不同的数据类型,包括float、double、int等;

    • 要支持不同设备。

    创建tensor的方法

    与PyTorch类似,在OneFlow中也可以通过两种主要的方式来创建tensor:Tensor和tensor。这两种方式最终都会创建出OneFlow内部的C++ Tensor对象,即对应Python层的flow.Tensor类型。

    1.1 Tensor

    Python层的Tensor是在tensor.py(https://github.com/Oneflow-Inc/oneflow/blob/2e6a72c8734b9929191306df35b4284e9caa8126/python/oneflow/framework/tensor.py#L23)中引入的,通过python c api注册的Tensor类型对象,此对象在MakeTensorType

    https://github.com/Oneflow-Inc/oneflow/blob/2e6a72c8734b9929191306df35b4284e9caa8126/oneflow/api/python/framework/tensor.cpp#L623)中被定义和返回。

    在MakeTensorType中主要通过PyTensorObject_init创建了Tensor对象:

    1. static int PyTensorObject_init(PyObject* self, PyObject* args, PyObject* kwargs) {
    2. HANDLE_ERRORS
    3. auto* temp = functional::_legacy_tensor_ctor(NULL, args, kwargs);
    4. if (PyErr_Occurred()) { throw py::error_already_set(); }
    5. auto* _self = (PyTensorObject*)self;
    6. _self->data = PyTensor_Unpack(temp);
    7. _self->data->set_pyobject(self);
    8. // reset temp data to prevent clearing the pyobject
    9. // when the temp is deallocated
    10. ((PyTensorObject*)temp)->data.reset();
    11. Py_XDECREF(temp);
    12. return 0;
    13. END_HANDLE_ERRORS_RET(-1)
    14. }

    通过functional::_legacy_tensor_ctor函数创建了OneFlow内部的c++ Tensor对象:oneflow::one::Tensor,并作为data绑定至Python的Tensor类型。在MakeTensorType中,还通过PyMethodDef(https://github.com/Oneflow-Inc/oneflow/blob/2e6a72c8734b9929191306df35b4284e9caa8126/oneflow/api/python/framework/tensor.cpp#L639-L641)为Tensor注册了很多C++方法,如:

    1. static PyMethodDef PyTensorObject_methods[] = {
    2. {"storage_offset", PyTensorObject_storage_offset, METH_NOARGS, NULL},
    3. {"stride", PyTensorObject_stride, METH_NOARGS, NULL},
    4. {"is_contiguous", PyTensorObject_is_contiguous, METH_NOARGS, NULL},
    5. {"contiguous", PyTensorObject_contiguous, METH_NOARGS, NULL},
    6. {"contiguous_", PyTensorObject_contiguous_, METH_NOARGS, NULL},
    7. {"pin_memory", PyTensorObject_pin_memory, METH_NOARGS, NULL},
    8. {"is_pinned", PyTensorObject_is_pinned, METH_NOARGS, NULL},
    9. {"requires_grad_", (PyCFunction)PyTensorObject_requires_grad_, METH_VARARGS | METH_KEYWORDS,
    10. NULL},
    11. {"retain_grad", PyTensorObject_retain_grad, METH_NOARGS, NULL},
    12. {"detach", PyTensorObject_detach, METH_NOARGS, NULL},
    13. {"clone", PyTensorObject_clone, METH_NOARGS, NULL},
    14. {"zero_", PyTensorObject_zero_, METH_NOARGS, NULL},
    15. {"register_hook", PyTensorObject_register_hook, METH_O, NULL},
    16. {"_register_post_grad_accumulation_hook", PyTensorObject__register_post_grad_accumulation_hook,
    17. METH_O, NULL},
    18. {"global_id", PyTensorObject_global_id, METH_NOARGS, NULL},
    19. {"check_meta_consistency", PyTensorObject_check_meta_consistency, METH_NOARGS, NULL},
    20. {"to_numpy", PyTensorObject_to_numpy, METH_NOARGS, NULL},
    21. {"type", (PyCFunction)PyTensorObject_type, METH_VARARGS | METH_KEYWORDS, NULL},

    此外,在Python层通过RegisterMethods(https://github.com/Oneflow-Inc/oneflow/blob/2e6a72c8734b9929191306df35b4284e9caa8126/python/oneflow/framework/te

  • 相关阅读:
    Excel报表
    ceph部署
    IDEA配置监控JVM的插件VisualVM
    Salesforce-Visualforce-4.标准控制器(Standard Controller)
    Flink系列之Flink中Window原理及实践
    现在的湖仓一体像是个伪命题
    持续集成部署-k8s-服务发现-Ingress
    1094:与7无关的数(信奥一本通)
    网段与广播域
    拉线位移传感器要符合适应目前大方向
  • 原文地址:https://blog.csdn.net/OneFlow_Official/article/details/126654090