【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)行。