最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OneFlow源碼解析之Eager模式下Tensor存儲(chǔ)管理

 更新時(shí)間:2023年04月19日 09:00:35   作者:鄭建華  
這篇文章主要為大家介紹了OneFlow源碼解析之Eager模式下Tensor的存儲(chǔ)管理實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1不同Tensor類型的存儲(chǔ)管理方式

Lazy Tensor 的存儲(chǔ)是由 Runtime 和 Actor 等對(duì)象管理的。靜態(tài)圖完成編譯后,需要多少個(gè)對(duì)象、多少存儲(chǔ)空間都是確定的,Runtime 等在初始化時(shí)會(huì)分配存儲(chǔ),在退出時(shí)回收資源。

Eager 模式下,Global Tensor 可以視為對(duì) Local Tensor 的分布式封裝,EagerGlobalTensorImpl 在本地的數(shù)據(jù)是一個(gè)EagerLocalTensorImpl 對(duì)象??梢酝ㄟ^考察 EagerLocalTensorImpl 來理解 eager 模式下 tensor 的存儲(chǔ)管理。

參考的示例代碼如下:

import numpy as np
 import oneflow as flow
 a = np.random.randn(1, 4)
 flow.tensor(a, device=flow.device("cpu"), dtype=flow.float)

2Tensor 存儲(chǔ)相關(guān)類的關(guān)系

EagerLocalTensorImpl 的存儲(chǔ)相關(guān)的類關(guān)系如下。

后續(xù)會(huì)順著示例代碼的執(zhí)行過程,看看圖中的對(duì)象都是在何時(shí)、如何構(gòu)造的,存儲(chǔ)被誰持有、如何分配并釋放。

3通過虛擬機(jī)指令為 Tensor 分配存儲(chǔ)

tensor 的構(gòu)造函數(shù)通過 Python C API 注冊(cè)為 PyTensorObject_init,由
functional::_legacy_tensor_ctor根據(jù)簽名進(jìn)行轉(zhuǎn)發(fā)。

示例代碼對(duì)應(yīng)的是 TensorWithDataFunctor,調(diào)用 MakeLocalTensorFromData 構(gòu)造 tensor,在這個(gè)函數(shù)中通過調(diào)用 functional::Empty以及 EmptyFunctor分配存儲(chǔ)。在 EmptyFunctor 中把相關(guān)屬性都存到 attrs,然后調(diào)用 OpInterpUtil::Dispatch在 vm 指令的執(zhí)行準(zhǔn)備過程中分配存儲(chǔ)。

EmptyFunctor 返回的 tensor 是一個(gè)只有存儲(chǔ)空間、不含數(shù)據(jù)的對(duì)象。數(shù)據(jù)拷貝在后面由
CopyLocalTensorFromUntypedArray完成。

3.1 存儲(chǔ)相關(guān)對(duì)象的構(gòu)造

因?yàn)槭?eager 模式下的 local tensor,OpInterpUtil::Dispatch 會(huì)被轉(zhuǎn)發(fā)到 NaiveInterpret執(zhí)行。對(duì)于示例代碼,這個(gè)函數(shù)的輸入?yún)?shù)如下:

  • inputs 是一個(gè)空數(shù)組
  • outputs 只有一個(gè)元素、且是空指針

因?yàn)?outputs 中的 tensor 指針都是空的,所以需要?jiǎng)?chuàng)建一個(gè) EagerLocalTensorImpl 對(duì)象,其 one::TensorStorage 成員變量是空指針。

因?yàn)?output_eager_blob_objects 中的元素尚未初始化,會(huì)調(diào)用 tensor_impl->InitEagerBlobObject進(jìn)行初始化。因?yàn)?tensor_storage_ 還是空的,這個(gè)過程會(huì)執(zhí)行如下操作:

  • 創(chuàng)建 vm::TensorStorage 對(duì)象
  • 創(chuàng)建 EagerBlobObject 對(duì)象
  • set_eager_blob_object
    • UpdateTensorStorage
      • 創(chuàng)建 one::TensorStorage 對(duì)象
      • 設(shè)置 tensor 存儲(chǔ)釋放的回調(diào)函數(shù)

上述對(duì)象的創(chuàng)建,都只是記錄相關(guān)信息,還不涉及 tensor 的存儲(chǔ)分配。

需要注意的是,注冊(cè)到 one::TensorStorage 的回調(diào)函數(shù)被賦值給了成員變量 releaser_hook_,這個(gè)函數(shù)會(huì)通過虛擬機(jī)指令釋放 tensor。

3.2 在指令執(zhí)行過程中分配 tensor 存儲(chǔ)

分配 tensor 存儲(chǔ)的過程如下:

  • vm::Instruction::Compute
  • vm::InstructionPolicy::ComputeIf
  • vm::OpCallInstructionPolicy::Compute
  • OpCallInstructionUtil::Compute
  • 獲取內(nèi)存分配器
  • OpCallInstructionUtil::AllocateOutputBlobsMemory
  • blob_object->TryAllocateBlobBodyMemory
  • allocator->Allocate

在EagerBlobObject::TryAllocateBlobBodyMemory 中,allocator 分配的存儲(chǔ)地址會(huì)賦值給 dptr,存儲(chǔ)地址 dptr 和 Free 函數(shù)一起構(gòu)造一個(gè)智能指針,并賦值給 vm::TensorStorage 的 blob_dptr_ 變量。

4通過虛擬機(jī)指令釋放 Tensor 存儲(chǔ)

在前面的 3.1 節(jié)提到,EagerLocalTensorImpl 在初始化 EagerBlobObject、創(chuàng)建 one::TensorStorage 的同時(shí),會(huì)設(shè)置一個(gè)釋放 tensor 的回調(diào)函數(shù),回調(diào)函數(shù)保存在變量 releaser_hook_ 中,one::TensorStorage 析構(gòu)時(shí)調(diào)用這個(gè)回調(diào)函數(shù)。把這些信息綜合整理一下,one::TensorStorage 析構(gòu)時(shí)會(huì)執(zhí)行如下操作:

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,會(huì)通過 SoftSyncStreamBetween 進(jìn)行同步。通過這種方式解決存儲(chǔ)的依賴問題。

一般情況下,通過 tensor 的 producer_stream 釋放存儲(chǔ),根據(jù)這個(gè)對(duì)象獲取對(duì)應(yīng)的 vm::Stream 對(duì)象,并據(jù)此構(gòu)造指令 instruction(包含 eager_blob_object 和 vm_stream),示例代碼對(duì)應(yīng)的指令類型是 FastReleaseTensorInstructionPolicy,其 Compute 方法執(zhí)行具體的存儲(chǔ)釋放邏輯,過程如下:

  • ReleaseTensorInstructionPolicy::Release()
  • eager_blob_object->DeallocateBlobDataPtr()
  • tensor_storage_->Release()
  • tensor_storage_->_Release()
  • blob_dptr_.reset()
    • 智能指針重置,調(diào)用分配存儲(chǔ)時(shí)指定的 Free 方法

5reshape 等場(chǎng)景的存儲(chǔ)管理

在 reshape、slice、transpose 等場(chǎng)景中,調(diào)用的 EagerLocalTensorImpl 構(gòu)造函數(shù)的參數(shù)包括 input 的 tensor_storage,所以這個(gè) tensor 的 tensor_storage_ 變量不是空的,在執(zhí)行 InitEagerBlobObject 時(shí),只創(chuàng)建 EagerBlobObject以提供 shape、stride等信息;但不會(huì)再創(chuàng)建 one::TensorStorage,而是復(fù)用 input 的存儲(chǔ)。

6兩個(gè) TensorStorage 類型可以合并嗎?

為什么在 one::TensorStorage 析構(gòu)時(shí)、由它保存的回調(diào)函數(shù)來觸發(fā)釋放 vm::TensorStorage 中的存儲(chǔ)呢?

one::TensorStorage 只多了一個(gè) releaser,這兩個(gè) Storage 類型是否可以合并呢?

在當(dāng)前的設(shè)計(jì)下,這兩個(gè)類型不能合并。因?yàn)?br />one::TensorStorage::releaser_hook_ 中持有 EagerBlobObject 的智能指針,EagerBlobObject 中也持有 vm::TensorStorage 的智能指針。如果兩個(gè) Storage 類型合并為一個(gè),就會(huì)出現(xiàn)循環(huán)引用、對(duì)象無法析構(gòu)而導(dǎo)致內(nèi)存泄漏。

所以,vm::TensorStorage 只是單純的存儲(chǔ),可以在多個(gè) tensor 之間共享。EagerBlobObject 既包括存儲(chǔ)、也包括 shape、stride、data_type 等獨(dú)特的對(duì)象信息。而 one::TensorStorage 是為了避免循環(huán)引用而引入的、專門負(fù)責(zé)釋放存儲(chǔ)的角色。

7附錄

GDB 斷點(diǎn)示例

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(github.com/Oneflow-Inc…

OneFlow源碼解析:Tensor類型體系與Local Tensor

歡迎 Star、試用 OneFlow 最新版本:

github.com/Oneflow-Inc…

以上就是OneFlow源碼解析:Eager模式下Tensor的存儲(chǔ)管理的詳細(xì)內(nèi)容,更多關(guān)于OneFlow源碼解析:Eager模式下Tensor的存儲(chǔ)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python使用代理ip訪問網(wǎng)站的實(shí)例

    python使用代理ip訪問網(wǎng)站的實(shí)例

    今天小編就為大家分享一篇python使用代理ip訪問網(wǎng)站的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python實(shí)現(xiàn)超市管理系統(tǒng)(后臺(tái)管理)

    python實(shí)現(xiàn)超市管理系統(tǒng)(后臺(tái)管理)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)超市管理系統(tǒng),增加后臺(tái)管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python range函數(shù)之生成器函數(shù)的示例

    Python range函數(shù)之生成器函數(shù)的示例

    這篇文章主要介紹了Python range函數(shù)之生成器函數(shù)的示例,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Python?ArcPy批量掩膜、重采樣大量遙感影像的操作

    Python?ArcPy批量掩膜、重采樣大量遙感影像的操作

    這篇文章主要介紹了Python?ArcPy批量掩膜、重采樣大量遙感影像,本文介紹基于Python中ArcPy模塊,對(duì)大量柵格遙感影像文件進(jìn)行批量掩膜與批量重采樣的操作,需要的朋友可以參考下
    2023-03-03
  • python利用后綴表達(dá)式實(shí)現(xiàn)計(jì)算器功能

    python利用后綴表達(dá)式實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了python利用后綴表達(dá)式實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • python中精確輸出JSON浮點(diǎn)數(shù)的方法

    python中精確輸出JSON浮點(diǎn)數(shù)的方法

    這篇文章主要介紹了python中精確輸出JSON浮點(diǎn)數(shù)的方法,需要的朋友可以參考下
    2014-04-04
  • Python?PyWebIO開發(fā)Web應(yīng)用實(shí)例探究

    Python?PyWebIO開發(fā)Web應(yīng)用實(shí)例探究

    這篇文章主要為大家介紹了Python?PyWebIO開發(fā)Web應(yīng)用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • python 字符串的駐留機(jī)制及優(yōu)缺點(diǎn)

    python 字符串的駐留機(jī)制及優(yōu)缺點(diǎn)

    字符串駐留是一種僅保存一份相同且不可變字符串的方法。這篇文章主要介紹了python 字符串的駐留機(jī)制,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Pandas如何操作Excel

    Pandas如何操作Excel

    Pandas提供了便捷的方法來處理Excel文件,主要通過pandas.read_excel()和DataFrame.to_excel()函數(shù),這些函數(shù)支持多種參數(shù)來定制讀取和寫入的行為,包括文件路徑、工作表名稱、數(shù)據(jù)類型、日期解析等
    2025-01-01
  • Flask之pipenv虛擬環(huán)境的實(shí)現(xiàn)

    Flask之pipenv虛擬環(huán)境的實(shí)現(xiàn)

    這篇文章主要介紹了Flask之pipenv虛擬環(huán)境的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論

新蔡县| 福安市| 新沂市| 教育| 周口市| 安泽县| 通州市| 十堰市| 宁海县| 津市市| 萨迦县| 萨嘎县| 招远市| 丰城市| 西乌珠穆沁旗| 景泰县| 沂南县| 满城县| 茶陵县| 老河口市| 通海县| 遵化市| 墨竹工卡县| 武威市| 奈曼旗| 山东省| 若尔盖县| 深圳市| 二连浩特市| 图木舒克市| 江西省| 濮阳县| 宜兰县| 万载县| 芜湖县| 荥阳市| 唐海县| 景德镇市| 宜宾县| 孟村| 土默特右旗|