OneFlow源码解析:Eager模式下Tensor的存储管理

首页 > 焦点 > 正文
2023-04-27 12:47:49

来源:CSDN博客

作者|郑建华


(资料图)

不同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)

Tensor 存储相关类的关系

EagerLocalTensorImpl 的存储相关的类关系如下。

后续会顺着示例代码的执行过程,看看图中的对象都是在何时、如何构造的,存储被谁持有、如何分配并释放。

3

通过虚拟机指令为 Tensor 分配存储

tensor 的构造函数通过 Python C API 注册为 PyTensorObject_init,由 functional::_legacy_tensor_ctor 

根据签名进行转发。

示例代码对应的是 TensorWithDataFunctor

,调用 MakeLocalTensorFromData 构造 tensor,在这个函数中通过调用 functional::Empty以及 EmptyFunctor分配存储。在 EmptyFunctor 中把相关属性都存到 attrs,然后调用 OpInterpUtil::Dispatch在 vm 指令的执行准备过程中分配存储。

EmptyFunctor 返回的 tensor 是一个只有存储空间、不含数据的对象。数据拷贝在后面由 CopyLocalTensorFromUntypedArray

完成。

3.1 存储相关对象的构造

因为是 eager 模式下的 local tensor,OpInterpUtil::Dispatch 会被转发到 NaiveInterpret执行。对于示例代码,这个函数的输入参数如下:

inputs 是一个空数组

outputs 只有一个元素、且是空指针

因为 outputs 中的 tensor 指针都是空的,所以需要创建一个 EagerLocalTensorImpl 对象,其 one::TensorStorage 成员变量是空指针。

因为 output_eager_blob_objects 中的元素尚未初始化,会调用 tensor_impl->InitEagerBlobObject 

进行初始化。因为 tensor_storage_ 还是空的,这个过程会执行如下操作:

创建 vm::TensorStorage 对象

创建 EagerBlobObject 对象

set_eager_blob_object

UpdateTensorStorage

创建 one::TensorStorage 对象

设置 tensor 存储释放的回调函数

上述对象的创建,都只是记录相关信息,还不涉及 tensor 的存储分配。

需要注意的是,注册到 one::TensorStorage 的回调函数被赋值给了成员变量 releaser_hook_,这个函数会通过虚拟机指令释放 tensor。

3.2 在指令执行过程中分配 tensor 存储

分配 tensor 存储的过程如下:

vm::Instruction::Compute

vm::InstructionPolicy::ComputeIf

vm::OpCallInstructionPolicy::Compute

OpCallInstructionUtil::Compute

获取内存分配器

OpCallInstructionUtil::AllocateOutputBlobsMemory

blob_object->TryAllocateBlobBodyMemory

allocator->Allocate

在 EagerBlobObject::TryAllocateBlobBodyMemory 中,allocator 分配的存储地址会赋值给 dptr,存储地址 dptr 和 Free 函数一起构造一个智能指针,并赋值给 vm::TensorStorage 的 blob_dptr_ 变量。

通过虚拟机指令释放 Tensor 存储

在前面的 3.1 节提到,EagerLocalTensorImpl 在初始化 EagerBlobObject、创建 one::TensorStorage 的同时,会设置一个释放 tensor 的回调函数,回调函数保存在变量 releaser_hook_ 中

,one::TensorStorage 析构时调用这个回调函数。把这些信息综合整理一下,one::TensorStorage 析构时会执行如下操作:

vm::InstructionList instruction_list; InstructionsBuilder instructions_builder(&instruction_list); // JUST(Build(&instructions_builder)); if (eager_blob_object->producer_stream().has_value()) { JUST(instructions_builder->ReleaseTensor(eager_blob_object)); } JUST(vm::Run(instructions_builder.mut_instruction_list()));

在 InstructionsBuilder::ReleaseTensor 中,如果有其它 stream 最近使用了 eager_blob_object,会通过 SoftSyncStreamBetween 进行同步。通过这种方式解决存储的依赖问题。

一般情况下,通过 tensor 的 producer_stream 释放存储,根据这个对象获取对应的 vm::Stream 对象,并据此构造指令 instruction(包含 eager_blob_object 和 vm_stream),示例代码对应的指令类型是 FastReleaseTensorInstructionPolicy,其 Compute 方法执行具体的存储释放逻辑,过程如下:

ReleaseTensorInstructionPolicy::Release()

eager_blob_object->DeallocateBlobDataPtr()

tensor_storage_->Release()

tensor_storage_->_Release()

blob_dptr_.reset()

智能指针重置,调用分配存储时指定的 Free 方法

5

reshape 等场景的存储管理

在 reshape、slice、transpose 等场景中,调用的 EagerLocalTensorImpl 构造函数的参数包括 input 的 tensor_storage,所以这个 tensor 的 tensor_storage_ 变量不是空的,在执行 InitEagerBlobObject 时,只创建 EagerBlobObject以提供 shape、stride等信息;但不会再创建 one::TensorStorage,而是复用 input 的存储。

两个 TensorStorage 类型可以合并吗?

为什么在 one::TensorStorage 析构时、由它保存的回调函数来触发释放 vm::TensorStorage 中的存储呢?

one::TensorStorage 只多了一个 releaser,这两个 Storage 类型是否可以合并呢?

在当前的设计下,这两个类型不能合并。因为 one::TensorStorage::releaser_hook_ 中持有 EagerBlobObject 的智能指针,EagerBlobObject 中也持有 vm::TensorStorage 的智能指针。如果两个 Storage 类型合并为一个,就会出现循环引用、对象无法析构而导致内存泄漏。

所以,vm::TensorStorage 只是单纯的存储,可以在多个 tensor 之间共享。EagerBlobObject 既包括存储、也包括 shape、stride、data_type 等独特的对象信息。而 one::TensorStorage 是为了避免循环引用而引入的、专门负责释放存储的角色。

7

附录

GDB 断点示例

break oneflow::one::MakeLocalTensorFromData break oneflow::one::NaiveInterpret break oneflow::vm::VirtualMachineEngine::DispatchInstruction break oneflow::vm::OpCallInstructionUtil::Compute break oneflow::vm::OpCallInstructionUtil::AllocateOutputBlobsMemory break oneflow::vm::EagerBlobObject::TryAllocateBlobBodyMemory break oneflow::vm::ReleaseTensorInstructionPolicy::Release break oneflow/core/eager/eager_blob_object.cpp:107

参考资料

OneFlow(https://github.com/Oneflow-Inc/oneflow/tree/b51cb72430619f6088e47bbb8b8226f37299573a

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

其他人都在看

“ChatGPT们”的淘金时代

推演语言模型的大小与计算开销

狂追ChatGPT:开源社区的“平替”热潮

谷歌科学家:ChatGPT秘密武器的演进与局限

比快更快,开源Stable Diffusion刷新作图速度

OneEmbedding:单卡训练TB级推荐模型不是梦

GLM训练加速:性能最高提升3倍,显存节省1/3

欢迎Star、试用OneFlow: github.com/Oneflow-Inc/oneflow/http://github.com/Oneflow-Inc/oneflow/

标签:

THE END

相关热点

6月20日,资本邦了解到,一改上周的强势走势,今日,新东方在线(01797 HK)及新东方(09901 HK)H股股价均下跌。截至港股收盘,新东方在线跌32
2022-06-20 17:29:10
新华社电 上海市文化和旅游局近日发布《上海市密室剧本杀内容备案管理规定(征求意见稿)》,并截至12月8日面向社会公众广泛征求意见。这
2021-11-19 13:46:03
《中国证券报》17日刊发文章《备战2022 基金经理调仓换股布新局》。文章称,距离2021年结束仅剩一个多月,基金业绩分化明显。部分排名靠前
2021-11-19 13:46:03
交通运输部办公厅 中国人民银行办公厅 中国银行保险监督管理委员会办公厅关于进一步做好货车ETC发行服务有关工作的通知各省、自治区、直
2021-11-19 13:45:58
新华社北京11月17日电 题:从10月份市场供需积极变化看中国经济韧性新华社记者魏玉坤、丁乐读懂中国经济,一个直观的视角就是市场供需两端
2021-11-19 13:45:58
全国教育财务工作会议披露的消息称,2020年,中国国家财政性教育经费投入达4 29万亿元,占GDP总量的4 206%,我国国家财政性教育经费支出占G
2021-11-19 13:45:48
如果你也热爱“种草”,前方高能预警!让你心心念念、“浏览”忘返的网络平台,可能早已成为一块块“韭菜地”。近日,据《半月谈》报道,有...
2021-11-19 13:45:48
日前,工业和信息化部印发《“十四五”信息通信行业发展规划》(以下简称《规划》),描绘了未来5年信息通信行业的发展趋势。《规划》指出...
2021-11-19 13:45:40
本报讯(中青报·中青网记者 周围围)2021年快递业务旺季正式拉开帷幕。国家邮政局监测数据显示,仅11月1日当日,全国共揽收快递包裹5 69
2021-11-19 13:45:40
人民网曼谷11月17日电 (记者赵益普)17日上午,中国援柬埔寨第七批200万剂科兴新冠疫苗抵达金边国际机场。当天,柬埔寨政府在机场举行了
2021-11-19 13:45:35
金坛压缩空气储能国家试验示范项目主体工程一角受访者供图依托清华大学非补燃压缩空气储能技术,金坛压缩空气储能项目申请专利百余项,建立
2021-11-19 13:45:35
视觉中国供图42亿立方米据有关部门预计,今年山西煤炭产量有望突破12亿吨,12月份山西外送电能力将超过900万千瓦,今冬明春煤层气产量将达4
2021-11-19 13:44:34
14省份相继发布2021年企业工资指导线——引导企业合理提高职工工资今年以来,天津、新疆、内蒙古、陕西、西藏、山东、江西、山西、福建、四
2021-11-19 13:44:34
中新网客户端北京11月18日电 (记者 谢艺观)“一条路海角天涯,两颗心相依相伴,风吹不走誓言,雨打不湿浪漫,意济苍生苦与痛,情牵天下喜
2021-11-19 13:44:31
近日,交通运输部等三部门发布《关于进一步做好货车ETC发行服务有关工作的通知》。通知提到,对不具备授信条件的用户,商业银行可在依法合
2021-11-19 13:44:31
欧莱雅面膜陷优惠“年度最大”风波 涉及该事件集体投诉超6000人次美妆大牌双十一促销翻车?近日,因预售价格比双十一现货贵出66%,欧莱雅
2021-11-19 13:44:13
43 6%受访者会在工作两三年后考虑跳槽54 3%受访者认为跳槽对个人职业发展有利有弊如今对不少年轻人来说,想对一份工作“从一而终”不太容易
2021-11-19 13:44:13
超八成受访青年表示如有机会愿意开展副业 规划能力最重要64 4%受访青年指出做副业跟风心态最要不得如今,“身兼数职”已成为年轻人当中的
2021-11-19 13:44:01
发展氢能正当其时【科学随笔】氢能是一种二次能源,它通过一定的方法利用其他能源制取,具有清洁无污染、可储存、与多种能源便捷转换等优点
2021-11-19 13:44:01
“千杯不醉”的解酒“神药”能信吗?专家:网红“解酒药” 其实不算药俗话说,“酒逢知己千杯少”,酒一直是国人饭桌上至关重要的存在。尽...
2021-11-19 13:43:57
最新文章

相关推荐