【2023 · CANN訓(xùn)練營第一季】昇騰AI入門課(PyTorch)筆記2023-05-11

【2023 · CANN訓(xùn)練營第一季】昇騰AI入門課(PyTorch)筆記

昇騰計算語言接口AscendCL

AscendCL的優(yōu)勢如下:

[if !supportLists]1.?[endif]? 高度抽象:算子編譯、加載、執(zhí)行的API歸一,相比每個算子一個API,AscendCL大幅減少API數(shù)量,降低復(fù)雜度。

[if !supportLists]2.?[endif]向后兼容:AscendCL具備向后兼容,確保軟件升級后,基于舊版本編譯的程序依然可以在新版本上運行。

[if !supportLists]3.?[endif]? 零感知芯片:一套AscendCL接口可以實現(xiàn)應(yīng)用代碼統(tǒng)一,多款昇騰處理器無差異。


PyTorch模型遷移——三種方法

?手工遷移

?腳本轉(zhuǎn)換工具(msFmkTransplt)

?自動遷移(推薦)


手工遷移——Step1 遷移前的準(zhǔn)備

關(guān)于分布式:由于NPU上的一些限制,PyTorch需要使用DistributedDataParallel(DDP),若原始代碼使用的是DataParallel(DP)則需要修改為DDP,DP相應(yīng)的一些實現(xiàn)例如torch.cuda.common,則可以替換為torch.distributed相關(guān)操作

關(guān)于混合精度:由于NPU天然的混合精度屬性,我們需要使用apex對原始代碼進(jìn)行修改


手工遷移—— Step2 單P模型遷移

單P代碼遷移的主要修改點

- 設(shè)備從cuda切換至npu

- torch.cuda. --> torch.npu.


手工遷移—— Step3 多P模型遷移

多P代碼遷移的主要修改點

- “nccl” --> “hccl”


PyTorch模型遷移——腳本轉(zhuǎn)換工具遷移

功能介紹

?腳本轉(zhuǎn)換工具根據(jù)適配規(guī)則,對用戶腳本給出修改建議并提供轉(zhuǎn)換功能,大幅度提高了腳本遷移速度,降低了開發(fā)者的工作量。

?原腳本需要在GPU環(huán)境下且基于python3.7及以上能夠跑通。

?腳本轉(zhuǎn)換后的執(zhí)行邏輯與轉(zhuǎn)換前保持一致。

?此腳本轉(zhuǎn)換工具當(dāng)前支持PyTorch1.5.0和1.8.1版本的訓(xùn)練腳本轉(zhuǎn)換。


PyTorch模型遷移——自動遷移(推薦)

使用方式——只需要增加一行

?from torch_npu.contrib import transfer_to_npu


AscendCL基礎(chǔ)概念解析

Host&Device

Host:指與Device相連接的x86服務(wù)器、ARM服務(wù)器,會利用Device提供的NN(Neural-Network)計算能力,完成業(yè)務(wù)。

Device:指安裝了芯片的硬件設(shè)備,利用PCIe接口與Host側(cè)連接,為Host提供NN計算能力。若存在多個Device,多個Device之間的內(nèi)存資源不能共享。


典型場景如在服務(wù)器上插Atlas300I設(shè)備:

將Atals 300I推理卡插入推理服務(wù)器(或個人PC)的主機中,此時程序的運行均在CPU側(cè)進(jìn)行控制,當(dāng)需要進(jìn)行專用計算(模型推理等)時,將CPU側(cè)內(nèi)存數(shù)據(jù)傳輸?shù)絅PU側(cè)內(nèi)存中,NPU側(cè)完成專用計算后將數(shù)據(jù)回傳至CPU側(cè)。


CPU+內(nèi)存所在這一側(cè),或者說,進(jìn)程啟動的這一側(cè),收集數(shù)據(jù)的這一側(cè),我們稱之為“Host”側(cè);

NPU+Device所在這一側(cè),或者說,進(jìn)行專用計算的這一側(cè),使用數(shù)據(jù)的這一側(cè),我們稱之為“Device”側(cè)


同步&異步

在AscendCL中當(dāng)提及“同步&異步”的時候,都是站在調(diào)用者、執(zhí)行者的角度來看的。

同步:當(dāng)前線程發(fā)起一個方法調(diào)用,然后阻塞在調(diào)用點等待被調(diào)用方法執(zhí)行完畢返回,再繼續(xù)向下走。

異步:調(diào)用者向執(zhí)行者下發(fā)一個任務(wù)之后,不等待任務(wù)執(zhí)行完,而是立即返回往下走,暫且不管這個任務(wù)是否執(zhí)行完畢。

把Stream理解為“任務(wù)隊列”,另一層含義是在隊列中任務(wù)的執(zhí)行是保序的,即運行時環(huán)境會根據(jù)任務(wù)下發(fā)的順序依次執(zhí)行。異步執(zhí)行需要知道(或者說確保)Stream中的任務(wù)都已經(jīng)執(zhí)行完畢了,此時需要以下接口確認(rèn)Stream中任務(wù)全部執(zhí)行完畢,調(diào)用這個接口的時候,線程會阻塞在調(diào)用點上,等待指定stream中所有任務(wù)全部執(zhí)行完畢才會繼續(xù)向下進(jìn)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容