0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Vitis AI - 如何利用張量提升內(nèi)存使用效率達(dá)到內(nèi)存優(yōu)化效果

454398 ? 來源: Xilinx技術(shù)社微信公眾號(hào) ? 作者: Xilinx技術(shù)社微信公 ? 2020-09-29 10:35 ? 次閱讀

在數(shù)據(jù)處理中,對(duì)原始數(shù)據(jù)進(jìn)行重塑或重新排序并創(chuàng)建多個(gè)副本是很常見的行為。無論執(zhí)行任何新步驟,都會(huì)創(chuàng)建新副本。隨著程序的增大,占用的內(nèi)存也會(huì)增大,我?guī)缀鯊奈纯紤]過這個(gè)問題,直到遇到了“內(nèi)存不足”錯(cuò)誤。

張量 (tensor) 的神奇之處在于多個(gè)張量可以引用同一存儲(chǔ)空間(即包含給定類型的數(shù)字的連續(xù)內(nèi)存區(qū)塊)。此行為由 torch.storage 進(jìn)行管理。

每個(gè)張量都包含 .storage 屬性,用于顯示內(nèi)存中存儲(chǔ)的張量?jī)?nèi)容。

在下一篇的文章中,我將聊一聊張量所具有的更神奇的屬性,即跟蹤上級(jí)操作。

在本文中,我將主要介紹內(nèi)存優(yōu)化方面的內(nèi)容。

全新 Vitis AI 1.2 發(fā)行版將首次為 PyTorch 提供支持。本文對(duì)于新增對(duì)此熱門框架的支持表示祝賀,并提供了 1 個(gè) PyTorch 專用的 Jupyter Notebook 格式示例。

輸入 [1]:

import torch
a = torch.randint(0, 9, (5,3))
a

輸出 [1]:

tensor([[4, 1, 6],

        [0, 8, 8],

        [1, 2, 1],

        [0, 5, 7],

        [0, 0, 7]])

輸出 [2]:

a.storage()

輸出 [2]:

 4

 1

 6

 0

 8

 8

 1

 2

 1

 0

 5

 7

 0

 0

 7

[torch.LongStorage of size 15]

輸出 [3]:

a.shape

輸出 [3]:

torch.Size([5, 3])

我們可能需要對(duì)原始“a”張量進(jìn)行轉(zhuǎn)置 (transpose) 和平展 (flatten) 處理。

何必為了相同數(shù)據(jù)浪費(fèi)雙倍內(nèi)存?哪怕數(shù)據(jù)只是形狀 (shape) 不同,也沒有必要。

輸入 [4]:

b = torch.transpose(a, 0, 1)
b

輸出 [4]:

tensor([[4, 0, 1, 0, 0],

        [1, 8, 2, 5, 0],

        [6, 8, 1, 7, 7]])

a和b確實(shí)是指向相同存儲(chǔ)空間的張量。

兩者表現(xiàn)方式不同,原因在于我們使用 stride 函數(shù)指令其按不同順序讀取該存儲(chǔ)空間。

b的 stride 值為 (1,3),即讀取存儲(chǔ)空間時(shí),每隔 1 個(gè)元素都必須跳至下一行,并且每隔 3 個(gè)元素必須跳至下一列。

輸出 [5]:

b.stride(), a.stride()

輸出 [5]:

((1, 3), (3, 1))

我們可以從a或b訪問數(shù)據(jù),或者也可以從原始存儲(chǔ)空間直接訪問數(shù)據(jù)。

但如果從存儲(chǔ)空間訪問,則讀取的值將不再是張量。

輸入 [6]:

a[1,2], b[2,1], a.storage()[5], b.storage()[5]

輸出 [6]:

(tensor(8), tensor(8), 8, 8)

現(xiàn)在,令我感到疑惑不解的是,我發(fā)現(xiàn)這些張量的值神奇般地自行發(fā)生了改變:

更改a時(shí),b也變了。

輸入 [7]:

a[0,0] = 10
b[0,0]

輸出 [7]:

tensor(10)

發(fā)生這種狀況的原因是因?yàn)?,從?nèi)存角度來看,張量即經(jīng)過排序的存儲(chǔ)空間表示法。

從同一存儲(chǔ)空間生成的 2 個(gè)張量并非獨(dú)立張量,而且我必須牢記的是,當(dāng)我每次更改 1 個(gè)張量后,指向相同存儲(chǔ)空間的所有其它張量也都會(huì)被修改。

可見,即使高效的內(nèi)存利用方式也難免有其缺點(diǎn)!

子集

通過原始數(shù)據(jù)的子集仍然能夠有效利用內(nèi)存。

新的張量仍然指向原始存儲(chǔ)空間的子集。

輸入 [8]:

c = a[0:2, 0:2]
c

輸出 [8]:

tensor([[10,  1],

        [ 0,  8]])

輸入 [9]:

c[0,0]=77
a

輸出 [9]:

tensor([[77,  1,  6],

        [ 0,  8,  8],

        [ 1,  2,  1],

        [ 0,  5,  7],

        [ 0,  0,  7]])

inplace 運(yùn)算符

inplace 運(yùn)算符即無需創(chuàng)建張量副本就可以直接對(duì)存儲(chǔ)空間進(jìn)行操作的函數(shù)。這些運(yùn)算符通常具有易于識(shí)別的名稱且以下劃線結(jié)尾。

輸入 [10]:

a.zero_()
b

輸出 [10]:

tensor([[0, 0, 0, 0, 0],

        [0, 0, 0, 0, 0],

        [0, 0, 0, 0, 0]])

張量克隆

如果確實(shí)需要 1 個(gè)獨(dú)立的新張量,可以對(duì)其進(jìn)行克隆。

這樣也會(huì)創(chuàng)建新的存儲(chǔ)空間。

輸入 [11]:

a_clone = a.clone()
a_clone[0,0] = 55
a_clone

輸出 [11]:

tensor([[55,  0,  0],

        [ 0,  0,  0],

        [ 0,  0,  0],

        [ 0,  0,  0],

        [ 0,  0,  0]])

輸出 [12]:

a

輸出 [12]:

tensor([[0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0]])

為連續(xù)張量重組存儲(chǔ)空間

部分函數(shù)僅適用于連續(xù)張量。

對(duì)a進(jìn)行轉(zhuǎn)置時(shí),通過在b中分配來自存儲(chǔ)空間的非連續(xù)矩陣值,生成了新的張量。

輸入 [13]:

a.is_contiguous()

輸出 [13]:

True

輸出 [14]:

b.is_contiguous()

輸出 [14]:

False

我們可將b設(shè)為連續(xù)張量,但這將導(dǎo)致b生成經(jīng)過重組的新存儲(chǔ)空間,從而導(dǎo)致a和b永遠(yuǎn)無法成為獨(dú)立張量:

輸入 [15]:

b = b.contiguous()
b[0,0] = 18
a[0,0]

輸出 [15]:

tensor(0)

輸出 [16]:

b.is_contiguous()

輸出 [16]:

True

輸出 [16]:

a.is_contiguous()

輸出 [17]:

True

編輯:hfy


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73537
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28877

    瀏覽量

    266225
  • 數(shù)據(jù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    548

    瀏覽量

    28447
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    794

    瀏覽量

    13010
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RAM Saver Pro【內(nèi)存自動(dòng)調(diào)整工具】

    內(nèi)存可用空間,以藉此提升電腦的執(zhí)行速度。 RAM Saver Pro是一款存儲(chǔ)器優(yōu)化工具,通過為應(yīng)用程序提供更多可用的存儲(chǔ)器來提高操作系統(tǒng)的性能. 它的主要功能包括: -對(duì)系統(tǒng)存儲(chǔ)器進(jìn)行碎片整理以
    發(fā)表于 03-02 12:23

    LabVIEW 程序的內(nèi)存優(yōu)化

    節(jié)約內(nèi)存的占用,提高運(yùn)行效率。但是,在編寫完程序后再按照程序優(yōu)化的技巧回頭去優(yōu)化一段已有的程序,這并不是一個(gè)好的編程方法。我們應(yīng)該先熟悉理解優(yōu)化
    發(fā)表于 07-13 17:57

    提高內(nèi)存使用效率有哪些?

    提高內(nèi)存使用效率有哪些?  1.調(diào)整高速緩存區(qū)域的大小 可以在“計(jì)算機(jī)的主要用途”選項(xiàng)卡中設(shè)置系統(tǒng)利用高速緩存的比例。如果系統(tǒng)的內(nèi)存較多,可選擇“網(wǎng)絡(luò)服務(wù)器”,這樣系統(tǒng)將用較多的
    發(fā)表于 02-24 17:29

    內(nèi)存分配及Cache優(yōu)化

    利用兩級(jí)緩存并配合低工作頻率外部存儲(chǔ)器,系統(tǒng)的效率達(dá)到全部使用高工作頻率內(nèi)部存儲(chǔ)器的80%~90%?! ”疚膶⒄紦?jù)較大空間的數(shù)據(jù)或使用頻率不高的程序放在片外存儲(chǔ)器中,啟用L2 Cache,調(diào)用
    發(fā)表于 08-10 14:54

    嵌入式系統(tǒng)內(nèi)存優(yōu)化使用

    響應(yīng)運(yùn)行。并且經(jīng)過實(shí)踐證明,嵌入式系統(tǒng)內(nèi)存優(yōu)化使用,能夠提升系統(tǒng)空間5%內(nèi)存,確保系統(tǒng)順利運(yùn)行?!娟P(guān)鍵詞】 嵌入式 Linux系統(tǒng) 內(nèi)存
    發(fā)表于 11-04 06:23

    內(nèi)存之旅——如何提升CMA利用率?

    ()`-|cma_init_reserved_mem()創(chuàng)建完成后,由于暫時(shí)沒有設(shè)備驅(qū)動(dòng)使用,為了提升內(nèi)存利用率,需要將這部分內(nèi)存標(biāo)記后,歸還給 buddy 系統(tǒng),供 buddy 系統(tǒng)
    發(fā)表于 03-22 16:26

    【KV260視覺入門套件試用體驗(yàn)】五、VITis AI (人臉檢測(cè)和人體檢測(cè))

    ); } 3.2、實(shí)踐效果 使用命令運(yùn)行代碼程序。 cd Vitis-AI/examples/vai_library/samples/refinedet ./test_jpeg_refinedet_tf
    發(fā)表于 09-26 16:22

    【KV260視覺入門套件試用體驗(yàn)】Vitis AI 構(gòu)建開發(fā)環(huán)境,并使用inspector檢查模型

    云端的計(jì)算資源進(jìn)行模型優(yōu)化,這些云端資源都可以即用付費(fèi)的,使用pytorch或者tensorflow原生的優(yōu)化方法,最后使用Vitis AI來編譯部署即可。這樣我可以
    發(fā)表于 10-14 15:34

    通信設(shè)備中內(nèi)存管理優(yōu)化

    通過對(duì)內(nèi)存管理的分析,提出了內(nèi)存優(yōu)化算法。該算法解決了通信設(shè)備中由于大量消息的發(fā)送導(dǎo)致內(nèi)存管理的問題,建立了用戶定義的內(nèi)存管理區(qū)域,設(shè)計(jì)了新
    發(fā)表于 02-21 11:42 ?22次下載

    AS控制器內(nèi)存分配及優(yōu)化

    摘要 本文基于S7-400系列控制器,詳細(xì)介紹內(nèi)存的類型、分配情況及實(shí)際使用過程中可能的內(nèi)存優(yōu)化方法。關(guān)鍵詞 內(nèi)存,工作內(nèi)存,裝載
    發(fā)表于 08-08 10:13 ?25次下載

    內(nèi)存如何進(jìn)行優(yōu)化

    在一些大內(nèi)存電腦上,我們也能手工禁止Windows虛擬內(nèi)存組件(“系統(tǒng)屬性”→“高級(jí)”→“性能”→“虛擬內(nèi)存”),以免讓電腦更充分得利用物理內(nèi)存
    發(fā)表于 06-09 10:41 ?864次閱讀

    如何利用張量提升內(nèi)存使用效率

    在數(shù)據(jù)處理中,對(duì)原始數(shù)據(jù)進(jìn)行重塑或重新排序并創(chuàng)建多個(gè)副本是很常見的行為。無論執(zhí)行任何新步驟,都會(huì)創(chuàng)建新副本。隨著程序的增大,占用的內(nèi)存也會(huì)增大,我?guī)缀鯊奈纯紤]過這個(gè)問題,直到遇到了“內(nèi)存不足”錯(cuò)誤。
    的頭像 發(fā)表于 02-19 17:26 ?1085次閱讀

    Vitis AI優(yōu)化器指南

    電子發(fā)燒友網(wǎng)站提供《Vitis AI優(yōu)化器指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 11:04 ?0次下載
    <b class='flag-5'>Vitis</b> <b class='flag-5'>AI</b><b class='flag-5'>優(yōu)化</b>器指南

    如何解決內(nèi)存碎片與內(nèi)存交換效率慢的問題

    內(nèi)存分頁 分段的好處是能產(chǎn)生連續(xù)的內(nèi)存空間,但是會(huì)出現(xiàn)大量內(nèi)存碎片與內(nèi)存交換效率低的問題 先思考一下怎么解決這兩個(gè)問題,
    的頭像 發(fā)表于 10-09 16:57 ?837次閱讀
    如何解決<b class='flag-5'>內(nèi)存</b>碎片與<b class='flag-5'>內(nèi)存</b>交換<b class='flag-5'>效率</b>慢的問題

    IBM的新型模擬內(nèi)存芯片能否證明AI操作的性能和能源效率呢?

    IBM 的新型模擬內(nèi)存芯片證明了 AI 操作的性能和能源效率都是可能的。
    的頭像 發(fā)表于 12-18 10:09 ?539次閱讀