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

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

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

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

C29F_xilinx_inc ? 來(lái)源:賽靈思 ? 作者:賽靈思 ? 2022-02-19 17:26 ? 次閱讀

注:本文轉(zhuǎn)自賽靈思中文社區(qū)論壇,源文鏈接在此。本文原作者為XILINX工程師。

以下為個(gè)人譯文,僅供個(gè)人學(xué)習(xí)記錄參考之用,如有疏漏之處,還請(qǐng)不吝賜教。

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

張量 (tensor) 的神奇之處在于多個(gè)張量可引用同一存儲(chǔ)空間,從而顯著提升內(nèi)存使用效率。

在下一篇的文章中,我將聊一聊張量所具有的更神奇的屬性,即跟蹤上級(jí)操作,但在本文中,我將主要介紹內(nèi)存優(yōu)化方面的內(nèi)容。

張量 (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) 不同,也沒(méi)有必要。

輸入 [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 訪問(wèn)數(shù)據(jù),或者也可以從原始存儲(chǔ)空間直接訪問(wèn)數(shù)據(jù)。

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

輸入 [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)存角度來(lái)看,張量即經(jīng)過(guò)排序的存儲(chǔ)空間表示法。

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

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

子集

通過(guò)原始數(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)算符即無(wú)需創(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í),通過(guò)在 b 中分配來(lái)自存儲(chǔ)空間的非連續(xù)矩陣值,生成了新的張量。

輸入 [13]:

a.is_contiguous()

輸出 [13]:

True

輸入 [14]:

b.is_contiguous()

輸出 [14]:

False

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

輸入 [15]:

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

輸出 [15]:

tensor(0)

輸入 [16]:

b.is_contiguous()

輸出 [16]:

True

輸入 [17]:

a.is_contiguous()

輸出 [17]:

True

審核編輯:湯梓紅

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

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88311
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4123

    瀏覽量

    85276
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    794

    瀏覽量

    13010
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利用AI和加速計(jì)算提升天氣預(yù)報(bào)效率和能效

    在 NVIDIA GPU 驅(qū)動(dòng)的擴(kuò)散模型助力下,生成式 AI 在各個(gè)領(lǐng)域?qū)崿F(xiàn)新的應(yīng)用,大大提升效率。   當(dāng)臺(tái)灣氣象員得以在一臺(tái)機(jī)器上模擬臺(tái)風(fēng)的細(xì)節(jié),他們深感其對(duì)預(yù)報(bào)任務(wù)能效的巨大提升所帶來(lái)
    的頭像 發(fā)表于 06-07 15:06 ?413次閱讀

    光伏并網(wǎng)逆變器如何提升轉(zhuǎn)換效率

    提升光伏并網(wǎng)逆變器的轉(zhuǎn)換效率是光伏系統(tǒng)優(yōu)化和提高經(jīng)濟(jì)效益的重要途徑。
    的頭像 發(fā)表于 04-18 16:39 ?684次閱讀

    數(shù)控測(cè)量|利用機(jī)床測(cè)頭提升加工中心精度,助力生產(chǎn)效率飛躍!

    機(jī)床測(cè)頭是現(xiàn)代制造業(yè)的關(guān)鍵裝置,能實(shí)時(shí)監(jiān)控加工誤差,提高精度和效率。其高精度測(cè)量、實(shí)時(shí)反饋和自動(dòng)校準(zhǔn)功能,確保加工質(zhì)量穩(wěn)定,提升生產(chǎn)效率。未來(lái),機(jī)床測(cè)頭將融入更多智能化技術(shù),推動(dòng)制造業(yè)數(shù)字化、智能化發(fā)展。
    的頭像 發(fā)表于 03-06 11:03 ?911次閱讀
    數(shù)控測(cè)量|<b class='flag-5'>利用</b>機(jī)床測(cè)頭<b class='flag-5'>提升</b>加工中心精度,助力生產(chǎn)<b class='flag-5'>效率</b>飛躍!

    應(yīng)用大模型提升研發(fā)效率的實(shí)踐與探索

    對(duì)于模型訓(xùn)練,我們可以采用 3D 并行訓(xùn)練的方式來(lái)實(shí)現(xiàn)。將模型參數(shù)和梯度張量劃分為多個(gè)分區(qū),分配到不同 GPU 卡上進(jìn)行計(jì)算。每張卡負(fù)責(zé)自己分區(qū)的梯度和參數(shù)更新工作,間隔時(shí)同步到其他卡上。這樣可以很好地利用更多計(jì)算資源,降低單卡資源需求。
    的頭像 發(fā)表于 02-22 11:47 ?510次閱讀
    應(yīng)用大模型<b class='flag-5'>提升</b>研發(fā)<b class='flag-5'>效率</b>的實(shí)踐與探索

    利用NVIDIA產(chǎn)品技術(shù)組合提升用戶體驗(yàn)

    UTalk-Doc 將用戶指令識(shí)別服務(wù)吞吐量提升了 5 倍,單個(gè)請(qǐng)求響應(yīng)時(shí)間縮減了三分之一,大幅提升服務(wù)運(yùn)行效率提升資源利用率。Trit
    的頭像 發(fā)表于 01-17 09:30 ?567次閱讀

    功率分析儀測(cè)效率-提升能源利用的關(guān)鍵技術(shù)

    分析儀就是在這樣的背景下應(yīng)運(yùn)而生的一種重要工具。本文將介紹功率分析儀的功能和作用,并重點(diǎn)討論如何利用功率分析儀進(jìn)行效率測(cè)量及提升。
    的頭像 發(fā)表于 01-09 15:28 ?351次閱讀
    功率分析儀測(cè)<b class='flag-5'>效率</b>-<b class='flag-5'>提升</b>能源<b class='flag-5'>利用</b>的關(guān)鍵技術(shù)

    如何提升單片機(jī)開(kāi)發(fā)技術(shù)?

    單片機(jī)開(kāi)發(fā)是現(xiàn)代電子技術(shù)中的重要分支,其在各個(gè)領(lǐng)域都有著廣泛的應(yīng)用。單片機(jī)開(kāi)發(fā)技術(shù)的提升不僅可以提高工作效率,還可以提高工作質(zhì)量和創(chuàng)新能力。那么,如何提升單片機(jī)開(kāi)發(fā)技術(shù)呢? 一、加強(qiáng)基礎(chǔ)知識(shí)
    發(fā)表于 01-05 10:14

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

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

    新半導(dǎo)體技術(shù)將提升功率轉(zhuǎn)換效率

    新半導(dǎo)體技術(shù)將提升功率轉(zhuǎn)換效率
    的頭像 發(fā)表于 12-15 09:18 ?340次閱讀
    新半導(dǎo)體技術(shù)將<b class='flag-5'>提升</b>功率轉(zhuǎn)換<b class='flag-5'>效率</b>

    利用封裝、IC和GaN技術(shù)提升電機(jī)驅(qū)動(dòng)性能

    利用封裝、IC和GaN技術(shù)提升電機(jī)驅(qū)動(dòng)性能
    的頭像 發(fā)表于 11-23 16:21 ?457次閱讀
    <b class='flag-5'>利用</b>封裝、IC和GaN技術(shù)<b class='flag-5'>提升</b>電機(jī)驅(qū)動(dòng)性能

    利用內(nèi)存及存儲(chǔ)構(gòu)建邊緣策略

    利用內(nèi)存及存儲(chǔ)構(gòu)建邊緣策略
    的頭像 發(fā)表于 11-23 09:04 ?258次閱讀
    <b class='flag-5'>利用</b><b class='flag-5'>內(nèi)存</b>及存儲(chǔ)構(gòu)建邊緣策略

    可直接訪問(wèn)的分離式內(nèi)存DirectCXL應(yīng)用案例

    分離式內(nèi)存由于可以提升內(nèi)存利用率而備受關(guān)注,現(xiàn)有的分離式內(nèi)存可以根據(jù)它們?nèi)绾喂芾頂?shù)據(jù)分為1)page-based和2)object-base
    發(fā)表于 10-18 11:39 ?614次閱讀
    可直接訪問(wèn)的分離式<b class='flag-5'>內(nèi)存</b>DirectCXL應(yīng)用案例

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

    內(nèi)存分頁(yè) 分段的好處是能產(chǎn)生連續(xù)的內(nèi)存空間,但是會(huì)出現(xiàn)大量內(nèi)存碎片與內(nèi)存交換效率低的問(wèn)題 先思考一下怎么解決這兩個(gè)問(wèn)題,
    的頭像 發(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>慢的問(wèn)題

    制造企業(yè)如何利用機(jī)器學(xué)習(xí)提升效率?

    增材制造與傳統(tǒng)方法具有不同的能力。例如,增材制造可以產(chǎn)生傳統(tǒng)鑄造或CNC加工無(wú)法實(shí)現(xiàn)的高度復(fù)雜的幾何結(jié)構(gòu)。算法可以利用這一點(diǎn)設(shè)計(jì)新的形狀。 增材制造有不同的設(shè)計(jì)規(guī)則和約束。某些方向需要支持結(jié)構(gòu),懸空部分需要限制等。算法需要考慮這些增材制造的獨(dú)特因素。
    發(fā)表于 09-28 11:46 ?873次閱讀
    制造企業(yè)如何<b class='flag-5'>利用</b>機(jī)器學(xué)習(xí)<b class='flag-5'>提升</b><b class='flag-5'>效率</b>?

    GPU的張量核心: 深度學(xué)習(xí)的秘密武器

    GPU最初是為圖形渲染而設(shè)計(jì)的,但是由于其卓越的并行計(jì)算能力,它們很快被引入深度學(xué)習(xí)中。深度學(xué)習(xí)的迅速發(fā)展離不開(kāi)計(jì)算機(jī)圖形處理單元(GPU)的支持,而GPU中的張量核心則被譽(yù)為深度學(xué)習(xí)的秘密武器
    的頭像 發(fā)表于 09-26 08:29 ?760次閱讀
    GPU的<b class='flag-5'>張量</b>核心: 深度學(xué)習(xí)的秘密武器