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

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

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

如何測量各種工作負(fù)載和GPU配置下收縮操作的性能

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:Markus Hoehnerbach ? 2022-04-20 10:46 ? 次閱讀

張量收縮是機(jī)器學(xué)習(xí)、計算化學(xué)和量子計算中許多重要工作的核心。隨著科學(xué)家和工程師們對不斷增長的問題的研究,基礎(chǔ)數(shù)據(jù)變得越來越大,計算時間也越來越長。

當(dāng)張量收縮不再適合單個 GPU 時,或者如果在單個 GPU 上花費(fèi)的時間太長,自然下一步是將收縮分布到多個 GPU 上。我們一直在用這個新功能擴(kuò)展 cuTENSOR ,并將其作為一個名為 cuTENSORMg (多 GPU )的新庫發(fā)布。它在塊循環(huán)分布張量上提供單進(jìn)程多 GPU 功能。

cuTENSORMg 的copy和contraction操作大致分為句柄、張量描述符和描述符。在這篇文章中,我們將解釋句柄和張量描述符,以及復(fù)制操作是如何工作的,并演示如何執(zhí)行張量收縮。然后,我們將展示如何測量各種工作負(fù)載和 GPU 配置下收縮操作的性能。

庫把手

庫句柄表示參與計算的設(shè)備集。句柄還包含跨調(diào)用重用的數(shù)據(jù)和資源。通過將設(shè)備列表傳遞給cutensorMgCreate函數(shù),可以創(chuàng)建庫句柄:

cutensorMgCreate(&handle, numDevices, devices);

cuTENSORMg 中的所有對象都是堆分配的。因此,必須通過匹配的destroy調(diào)用釋放它們。為了簡潔起見,我們在這篇文章中沒有展示這些,但是生產(chǎn)代碼應(yīng)該銷毀它創(chuàng)建的所有對象,以避免泄漏。

cutensorMgDestroy(handle);

所有庫調(diào)用都返回cutensorStatus_t類型的錯誤代碼。在生產(chǎn)中,您應(yīng)該始終檢查錯誤代碼,以便盡早檢測故障或使用問題。為了簡潔起見,我們在本文中省略了這些檢查,但它們包含在相應(yīng)的示例代碼中。

除了錯誤代碼, cuTENSORMg 還提供與 cuTENSOR 類似的日志記錄功能 ??梢酝ㄟ^適當(dāng)設(shè)置CUTENSORMG_LOG_LEVEL環(huán)境變量來激活這些日志。例如,CUTENSORMG_LOG_LEVEL=1將為您提供有關(guān)返回的錯誤代碼的附加信息。

張量描述符

張量描述符描述了張量在內(nèi)存中的布局以及在設(shè)備中的分布。對于每種模式,有三個核心概念來確定布局:

extent:每個模式的邏輯大小。

blockSize:將extent細(xì)分為大小相等的塊,但最后的剩余塊除外。

deviceCount:確定塊在設(shè)備上的分布方式。

圖 1 顯示了extent和block size如何細(xì)分二維張量。

A 3x3 square showing block size vs extent. Block size accounts for a 1x1 block whereas extent is a large square layered on top of several blocks but does not exceed the full parameter of the 3x3 square.

圖 1 帶有范圍和塊的張量數(shù)據(jù)布局。綠色表示二維張量,藍(lán)色表示塊大小導(dǎo)致的塊。

A 3x3 square showing deviceCount [0] on the Y axis and deviceCount[1] on the X axis.

圖 2 以塊循環(huán)方式在設(shè)備上分布塊張量;不同的顏色代表不同的設(shè)備。

塊以循環(huán)方式分布,這意味著連續(xù)的塊被分配給不同的設(shè)備。圖 2 顯示了塊到設(shè)備的逐塊分布,將設(shè)備分配到使用另一個數(shù)組devices編碼的塊。該陣列是一個密集的柱狀主張量,其范圍與設(shè)備計數(shù)類似。

A 4x4 block with Y axis as blockStride[0] and X axis blockStride[1]. This block is comprised of smaller by 4x4 blocks with elementStride[1] as the X axis and and elementStride[0] as the Y axis.

圖 3 使用元素步距和塊步距的設(shè)備上數(shù)據(jù)布局。

最后,設(shè)備上的確切數(shù)據(jù)布局由每種模式的elementStride和blockStride 值決定。它們分別以元素為單位在線性存儲器中確定給定模式下兩個相鄰元素和相鄰塊的位移(圖 3 )。

這些屬性都是使用cutensorMgCreateTensorDescriptor調(diào)用設(shè)置的:

cutensorMgCreateTensorDescriptor(handle, &desc, numModes, extent, elementStride, blockSize, blockStride, deviceCount, numDevices, devices, type);

可以將NULL傳遞給elementStride、blockSize、blockStride和deviceCount。

如果elementStride是NULL,則使用通用列主布局假定數(shù)據(jù)布局密集。如果blockSize是NULL,則等于extent。如果blockStride是NULL,則它等于blockSize * elementStride,這將產(chǎn)生交錯塊格式。如果deviceCount為NULL,則所有設(shè)備計數(shù)都設(shè)置為 1 。在這種情況下,張量是分布式的,完全駐留在devices[0]的內(nèi)存中。

通過將CUTENSOR_MG_DEVICE_HOST作為所屬設(shè)備傳遞,可以指定 tensor 位于主機(jī)上的固定、托管或定期分配的內(nèi)存中。

復(fù)制操作

copy操作可以更改數(shù)據(jù)布局,包括將張量重新分配到不同的設(shè)備。其參數(shù)是源和目標(biāo)張量描述符(descSrc和descDst),以及源和目標(biāo)模式列表(modesSrc和modesDst)。這兩個張量在重合模式下的范圍必須匹配,但它們的其他方面可能不同。一個可能位于主機(jī)上,另一個跨設(shè)備,它們可能具有不同的阻塞和步幅。

與 cuTENSORMg 中的所有操作一樣,它分三步進(jìn)行:

cutensorMgCopyDescriptor_t:編碼應(yīng)該執(zhí)行的操作。

cutensorMgCopyPlan_t:編碼操作的執(zhí)行方式。

cutensorMgCopy:根據(jù)計劃執(zhí)行操作。

第一步是創(chuàng)建復(fù)制描述符:

cutensorMgCreateCopyDescriptor(handle, &desc, descDst, modesDst, descSrc, modesSrc);

有了拷貝描述符,您可以查詢所需的設(shè)備端和主機(jī)端工作空間的數(shù)量。deviceWorkspaceSize陣列的元素數(shù)量與手柄中的設(shè)備數(shù)量相同。i-th 元素是句柄中i-th 設(shè)備所需的工作空間量。

cutensorMgCopyGetWorkspace(handle, desc, deviceWorkspaceSize, &hostWorkspaceSize);

確定工作空間大小后,規(guī)劃副本。你可以傳遞一個更大的工作空間大小,呼叫可能會利用更多的工作空間,或者你可以嘗試傳遞一個更小的大小。規(guī)劃可能能夠適應(yīng)這一點,否則可能會產(chǎn)生錯誤。

cutensorMgCreateCopyPlan(handle, &plan, desc, deviceWorkspaceSize, hostWorkspaceSize

最后,計劃完成后,執(zhí)行copy操作。

cutensorMgCopy(handle, plan, ptrDst, ptrSrc, deviceWorkspace, hostWorkspace, streams);

在這個調(diào)用中,ptrDstptrSrc是指針數(shù)組。它們包含對應(yīng)的張量描述符中每個設(shè)備的一個指針。在本例中,ptrDst[0]對應(yīng)于作為devices[0]傳遞給cutensorMgCreateTensorDescriptor的設(shè)備。

另一方面,deviceWorkspacestreams也是數(shù)組,其中每個條目對應(yīng)一個設(shè)備。它們是根據(jù)庫句柄中設(shè)備的順序排序的,例如deviceWorkspace[0]streams[0]對應(yīng)于在devices[0]傳遞給cutensorMgCreate的設(shè)備。工作空間必須至少與傳遞給cutensorMgCreateCopyPlan的工作空間大小相同。

收縮手術(shù)

cuTENSORMg 庫的核心是contraction操作。它目前實現(xiàn)了一個或多個設(shè)備上張量的張量收縮,但將來可能支持主機(jī)上的張量。作為復(fù)習(xí),收縮是以下形式的操作:

D_{M,N,L} \leftarrow \alpha \sum_{K} A_{K,M,L} \cdot B_{K,N,L} + \beta C_{M,N,L^{3}}

其中A、B、CD是張量,M、N、LK是可以任意排列和交錯的模式列表。

copy操作一樣,它分三個階段進(jìn)行:

  • cutensorMgCreateContractionDescriptor:對問題進(jìn)行編碼。
  • cutensorMgCreateContractionPlan:對實現(xiàn)進(jìn)行編碼。
  • cutensorMgContraction:使用計劃并執(zhí)行實際收縮。

首先,根據(jù)張量描述符、模式列表和所需的計算類型(例如計算期間可能使用的最低精度數(shù)據(jù))創(chuàng)建收縮描述符。

cutensorMgCreateContractionDescriptor(handle, &desc, descA, modesA, descB, modesB, descC, modesC, descD, modesD, compute);

由于收縮操作有更多的自由度,您還必須初始化find對象,以便更好地控制給定問題描述符的計劃創(chuàng)建。目前,這個find對象只有一個默認(rèn)設(shè)置:

cutensorMgCreateContractionFind(handle, &find, CUTENSORMG_ALGO_DEFAULT);

然后,您可以按照為copy操作所做的操作來查詢工作空間需求。與該操作相比,您還傳入了findworkspace首選項:

cutensorMgContractionGetWorkspace(handle, desc, find, CUTENSOR_WORKSPACE_RECOMMENDED, deviceWorkspaceSize, &hostWorkspaceSize);

創(chuàng)建一個計劃:

cutensorMgCreateContractionPlan(handle, &plan, desc, find, deviceWorkspaceSize, hostWorkspaceSize);

最后,使用計劃執(zhí)行收縮:

cutensorMgContraction(handle, plan, alpha, ptrA, ptrB, beta, ptrC, ptrD, deviceWorkspace, hostWorkspace, streams);

在這個調(diào)用中, alpha 和 beta 是與D張量類型相同的主機(jī)指針,除非D張量是半精度或BFloat16精度,在這種情況下是single precision。不同數(shù)組ptrA、ptrB、ptrCptrD中指針的順序?qū)?yīng)于它們在描述符devices數(shù)組中的順序。deviceWorkspacestreams數(shù)組中指針的順序與庫句柄的devices數(shù)組中的順序相對應(yīng)。

表演

你可以在CUDA 庫樣本GitHub 回購。我們將其擴(kuò)展為兩個參數(shù): GPU 的數(shù)量和比例因子。您可以隨意嘗試其他收縮、塊大小和縮放模式。它是以這樣一種方式編寫的,即在保持 K 不變的情況下,將 M 和 N 放大。它實現(xiàn)了形狀的幾乎 GEMM 形狀的張量收縮:

C_{M^{0}N^{0}M^{1}N^{1}M^{2}N^{2}} \leftarrow A_{M^{0}K^{0}M^{1}K^{1}M^{2}K^{2} B_K^{0}N^{0}K^{1}N^{1}K^{2}N^{2}}

M1和N1按比例放大,這些尺寸中的塊大小保持負(fù)載大致平衡。下圖顯示了在 DGX A100 上測量時的比例關(guān)系。

關(guān)于作者

Markus Hoehnerbach 是 cuTENSOR 和 cuTENSORMg 的高級軟件工程師。他擁有 RWTH 亞琛大學(xué)計算機(jī)科學(xué)博士學(xué)位。他感興趣的領(lǐng)域是結(jié)構(gòu)化和非結(jié)構(gòu)化張量的高性能計算及其在機(jī)器學(xué)習(xí)和計算科學(xué)中的應(yīng)用。

審核編輯:郭婷

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

    關(guān)注

    27

    文章

    4650

    瀏覽量

    128490
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8330

    瀏覽量

    132220
收藏 人收藏

    評論

    相關(guān)推薦

    GPU性能服務(wù)器配置

    GPU性能服務(wù)器作為提升計算速度和效率的關(guān)鍵設(shè)備,在各大應(yīng)用場景中發(fā)揮著越來越重要的作用。在此,petacloud.ai小編為你介紹GPU性能服務(wù)器的
    的頭像 發(fā)表于 10-21 10:42 ?98次閱讀

    BOPP煙膜熱收縮性能檢測方法

    擠技術(shù),以確保薄膜具有優(yōu)化的性能組合。測試BOPP煙膜的熱收縮性能至關(guān)重要,BOPP煙膜的熱收縮性能直接影響煙盒的成型和密封效果。如果熱
    的頭像 發(fā)表于 05-11 16:29 ?297次閱讀
    BOPP煙膜熱<b class='flag-5'>收縮</b><b class='flag-5'>性能</b>檢測方法

    電機(jī)負(fù)載測試設(shè)備

    電機(jī)負(fù)載測試設(shè)備是現(xiàn)代工業(yè)生產(chǎn)中不可或缺的一種設(shè)備。它的主要作用是對電機(jī)進(jìn)行負(fù)載測試,以確保電機(jī)在各種工作條件下性能穩(wěn)定可靠。本文將詳細(xì)介
    的頭像 發(fā)表于 03-20 15:51 ?850次閱讀
    電機(jī)<b class='flag-5'>負(fù)載</b>測試設(shè)備

    CC工作模式電子負(fù)載運(yùn)用

    電子負(fù)載是測試電源、電池和其他電子設(shè)備性能的設(shè)備。在真實世界負(fù)載的模擬條件。CC工作模式是電子負(fù)載
    的頭像 發(fā)表于 03-04 16:21 ?1006次閱讀
    CC<b class='flag-5'>工作</b>模式<b class='flag-5'>下</b>電子<b class='flag-5'>負(fù)載</b>運(yùn)用

    最常見的直流負(fù)載工作方式

    最常見的直流負(fù)載工作方式? 直流負(fù)載工作方式是指在直流電路中使用的各種負(fù)載方式。直流
    的頭像 發(fā)表于 01-18 15:12 ?622次閱讀

    MulticoreWare與Imagination一同按汽車計算工作負(fù)載的“加速鍵”

    和高級駕駛輔助系統(tǒng)(ADAS)常見工作負(fù)載性能的躍升。此次合作使得在高分辨率(3200x2000)圖像上使用GPU運(yùn)行StereoBM(StereoBlockMatc
    的頭像 發(fā)表于 01-09 08:27 ?291次閱讀
    MulticoreWare與Imagination一同按<b class='flag-5'>下</b>汽車計算<b class='flag-5'>工作</b><b class='flag-5'>負(fù)載</b>的“加速鍵”

    蓄電池?zé)o負(fù)載和有負(fù)載電壓測量方法

    蓄電池?zé)o負(fù)載和有負(fù)載電壓測量方法 蓄電池是一種儲存電能的裝置,廣泛應(yīng)用于汽車、UPS電源、太陽能系統(tǒng)等領(lǐng)域。在使用蓄電池時,需要了解其電壓情況,以確保其正常工作和維護(hù)。本文將介紹蓄電池
    的頭像 發(fā)表于 01-05 14:04 ?1853次閱讀

    路由器負(fù)載均衡怎么配置

    路由器負(fù)載均衡是一種重要的網(wǎng)絡(luò)技術(shù),它能夠?qū)⒍鄠€網(wǎng)絡(luò)連接的流量分配到多個路由器上,以提高網(wǎng)絡(luò)的性能和穩(wěn)定性。本文將詳細(xì)介紹路由器負(fù)載均衡的配置方法,包括
    的頭像 發(fā)表于 12-13 11:17 ?2894次閱讀

    盤點GPU Fabric典型拓?fù)浣Y(jié)構(gòu)

    當(dāng)前,許多超大規(guī)模廠商正在競相構(gòu)建大型 GPU 集群,以適應(yīng)GenAI訓(xùn)練工作負(fù)載。本文探討了針對GenAI訓(xùn)練工作負(fù)載進(jìn)行優(yōu)化的
    的頭像 發(fā)表于 12-03 09:56 ?2654次閱讀
    盤點<b class='flag-5'>GPU</b> Fabric典型拓?fù)浣Y(jié)構(gòu)

    大功率電子負(fù)載儀的工作模式有哪些?

    : 1. 恒流模式 恒流模式是最常見和常用的工作模式之一。在這種模式,電子負(fù)載儀會設(shè)定一個恒定的電流值,并通過調(diào)節(jié)負(fù)載的電阻來實現(xiàn)。這樣可以模擬電子設(shè)備在不同
    的頭像 發(fā)表于 11-17 11:22 ?682次閱讀

    什么是負(fù)載?電子負(fù)載有什么用途?為什么要給電子負(fù)載進(jìn)行老化測試?

    用于模擬負(fù)荷和測試電源設(shè)備的儀器。它可以用于測量、分析和調(diào)試各種電源設(shè)備,以確保其性能和可靠性。 電子負(fù)載的用途十分廣泛。首先,它可以用于測試電源設(shè)備的輸出特性。通過模擬
    的頭像 發(fā)表于 11-16 11:01 ?1376次閱讀

    電子負(fù)載是什么?為什么會需要電子負(fù)載

    電子系統(tǒng)、通信設(shè)備、醫(yī)療設(shè)備等領(lǐng)域中的測試、研發(fā)和產(chǎn)線應(yīng)用。 為什么會需要電子負(fù)載呢? 1. 測試和驗證電源和電池性能:電子負(fù)載模擬了各種負(fù)載
    的頭像 發(fā)表于 11-16 11:01 ?1647次閱讀

    什么是回饋式電子負(fù)載?有幾種電子負(fù)載反饋的操作模式?

    什么是回饋式電子負(fù)載?有幾種電子負(fù)載反饋的操作模式? 回饋式電子負(fù)載是一種用于測試和模擬負(fù)載的設(shè)備,它可以直接連接到電源上,以模擬真實的
    的頭像 發(fā)表于 11-10 15:57 ?1177次閱讀

    變頻電源在各種性質(zhì)的負(fù)載的輸出特性

    變頻電源在各種性質(zhì)的負(fù)載的輸出特性 變頻電源是一種可以根據(jù)需求改變輸出頻率的電源,它在各種性質(zhì)的負(fù)載
    的頭像 發(fā)表于 11-10 15:46 ?533次閱讀

    直流電子負(fù)載工作模式

    直流電子負(fù)載工作模式? 直流電子負(fù)載是一種用于檢測和模擬負(fù)載對直流電源的需求的設(shè)備。它可以對直流電源進(jìn)行負(fù)載測試,以確保其
    的頭像 發(fā)表于 11-07 10:08 ?550次閱讀