【MindStudio訓(xùn)練營第一季】基于U-Net網(wǎng)絡(luò)的圖像分割的MindStudio實踐

前情說明

本作業(yè)基于Windows版MindStudio 5.0.RC3,遠程連接ECS服務(wù)器使用,ECS是基于官方分享的CANN6.0.RC1_MindX_Vision3.0.RC3鏡像創(chuàng)建的宣渗。

基于ECS(Ascend310)的U-Net網(wǎng)絡(luò)的圖像分割

1. U-Net網(wǎng)絡(luò)介紹:

U-Net模型基于二維圖像分割嘶是。在2015年ISBI細胞跟蹤競賽中,U-Net獲得了許多最佳獎項晴埂。論文中提出了一種用于醫(yī)學(xué)圖像分割的網(wǎng)絡(luò)模型和數(shù)據(jù)增強方法究反,有效利用標(biāo)注數(shù)據(jù)來解決醫(yī)學(xué)領(lǐng)域標(biāo)注數(shù)據(jù)不足的問題。U型網(wǎng)絡(luò)結(jié)構(gòu)也用于提取上下文和位置信息儒洛。

[U-Net 論文]: Olaf Ronneberger, Philipp Fischer, Thomas Brox. “U-Net: Convolutional Networks for Biomedical Image Segmentation.”?conditionally accepted at MICCAI 2015. 2015.

2. ECS運行說明

我們的操作基本都在root用戶下執(zhí)行精耐。

首先,修改bash琅锻,具體命令和結(jié)果如下卦停。

本項目支持MindStudio運行和終端運行向胡。

(1)下載項目代碼

下載鏈接:https://alexed.obs.cn-north-4.myhuaweicloud.com/unet_sdk.zip

將項目文件unet_sdk.zip上傳至華為云ECS彈性云服務(wù)器/root/目錄下,并解壓惊完;或者下載到本地電腦僵芹,用MindStudio打開。

將之前unet_hw960_bs1.air模型放到/unet_sdk/model/目錄下专执。

項目文件結(jié)構(gòu)

├── unet_sdk? ? ├──README.md├── data//數(shù)據(jù)集│? ? ├──1│? │? ├──image.png//圖片│? │? ├──mask.png//標(biāo)簽│...├── model? ? │? ├──air2om.sh// air模型轉(zhuǎn)om腳本│? ├──xxx.air//air模型│? ├──xxx.om//om模型│? ├──aipp_unet_simple_opencv.cfg// aipp文件├── pipeline? ? ? ? ? ? │? ├──unet_simple_opencv.pipeline// pipeline文件├── main.py// 推理文件? ? ├── run.sh// 執(zhí)行文件├── requirements.txt// 需要的三方庫

(2) 模型轉(zhuǎn)換

將unet_hw960_bs1.air模型轉(zhuǎn)為昇騰AI處理器支持的.om格式離線模型淮捆,此處模型轉(zhuǎn)換需要用到ATC工具。

昇騰張量編譯器(Ascend Tensor Compiler本股,簡稱ATC)是昇騰CANN架構(gòu)體系下的模型轉(zhuǎn)換工具攀痊,它可以將開源框架的網(wǎng)絡(luò)模型或Ascend IR定義的單算子描述文件(json格式)轉(zhuǎn)換為昇騰AI處理器支持的.om格式離線模型。模型轉(zhuǎn)換過程中可以實現(xiàn)算子調(diào)度的優(yōu)化拄显、權(quán)值數(shù)據(jù)重排苟径、內(nèi)存使用優(yōu)化等,可以脫離設(shè)備完成模型的預(yù)處理躬审。

ATC參數(shù)概覽

(3) 運行腳本

運行腳本:

cd unet_sdk/model/# 切換至模型存儲目錄atc--framework=1--model=unet_hw960_bs1.air--output=unet_hw960_bs1--input_format=NCHW--soc_version=Ascend310--log=error--insert_op_conf=aipp_unet_simple_opencv.cfg

注意air模型轉(zhuǎn)om只支持靜態(tài)batch棘街,這里batchsize=1。

參數(shù)說明:

?framework:原始框架類型承边。?model:原始模型文件路徑與文件名遭殉。?output:轉(zhuǎn)換后的離線模型的路徑以及文件名。?input_format:輸入數(shù)據(jù)格式博助。?soc_version:模型轉(zhuǎn)換時指定芯片版本险污。?log:顯示日志的級別倘零。?insert_op_conf:插入算子的配置文件路徑與文件名头遭,這里使用AIPP預(yù)處理配置文件,用于圖像數(shù)據(jù)預(yù)處理幌甘。

輸出結(jié)果:

ATC run success窖式,表示模型轉(zhuǎn)換成功蚁飒,得到unet_hw960_bs1.om模型。

模型轉(zhuǎn)換成功之后萝喘,可以使用MindX SDK mxVision運行腳本淮逻,在Ascend 310上進行推理。

(4) MindX SDK mxVision 執(zhí)行推理

MindX SDK文檔請參考:https://support.huaweicloud.com/ug-vis-mindxsdk203/atlasmx_02_0051.html

MindX SDK執(zhí)行推理的業(yè)務(wù)流程:

通過stream配置文件阁簸,Stream manager可識別需要構(gòu)建的element以及element之間的連接關(guān)系弦蹂,并啟動業(yè)務(wù)流程。Stream manager對外提供接口强窖,用于向stream發(fā)送數(shù)據(jù)和獲取結(jié)果,幫助用戶實現(xiàn)業(yè)務(wù)對接削祈。

plugin表示業(yè)務(wù)流程中的基礎(chǔ)模塊翅溺,通過element的串接構(gòu)建成一個stream脑漫。buffer用于內(nèi)部掛載解碼前后的視頻、圖像數(shù)據(jù)咙崎,是element之間傳遞的數(shù)據(jù)結(jié)構(gòu)优幸,同時也允許用戶掛載元數(shù)據(jù)(Metadata),用于存放結(jié)構(gòu)化數(shù)據(jù)(如目標(biāo)檢測結(jié)果)或過程數(shù)據(jù)(如縮放后的圖像)褪猛。

MindX SDK基礎(chǔ)概念介紹:

MindX SDK基礎(chǔ)插件:

MindX SDK業(yè)務(wù)流程編排:

Stream配置文件以json格式編寫网杆,用戶必須指定業(yè)務(wù)流名稱、元件名稱和插件名稱伊滋,并根據(jù)需要碳却,補充元件屬性和下游元件名稱信息。

以下表格為本實驗pipeline/unet_simple_opencv.pipeline文件及其對應(yīng)的名稱及描述:

pipeline/unet_simple_opencv.pipeline文件內(nèi)容如下笑旺,可根據(jù)實際開發(fā)情況進行修改昼浦。

{"unet_mindspore":{"stream_config":{"deviceId":"0"},"appsrc0":{"props":{"blocksize":"4096000"},"factory":"appsrc","next":"mxpi_imagedecoder0"},"mxpi_imagedecoder0":{"props":{"cvProcessor":"opencv","outputDataFormat":"BGR"},"factory":"mxpi_imagedecoder","next":"mxpi_imagecrop0"},"mxpi_imagecrop0":{"props":{"cvProcessor":"opencv","dataSource":"ExternalObjects"},"factory":"mxpi_imagecrop","next":"mxpi_imageresize0"},"mxpi_imageresize0":{"props":{"handleMethod":"opencv","resizeType":"Resizer_Stretch","resizeHeight":"960","resizeWidth":"960"},"factory":"mxpi_imageresize","next":"mxpi_tensorinfer0"},"mxpi_tensorinfer0":{"props":{"dataSource":"mxpi_imageresize0","modelPath":"model/unet_hw960_bs1_AIPP.om"},"factory":"mxpi_tensorinfer","next":"mxpi_dumpdata0"},"mxpi_dumpdata0":{"props":{"requiredMetaDataKeys":"mxpi_tensorinfer0"},"factory":"mxpi_dumpdata","next":"appsink0"},"appsink0":{"props":{"blocksize":"4096000"},"factory":"appsink"}}}

(5) 修改modelPath

打開pipeline/unet_simple_opencv.pipeline文件,將"mxpi_tensorinfer0"元件的屬性"modelPath"(模型導(dǎo)入路徑)修改為模型轉(zhuǎn)換后保存的om模型"model/unet_hw960_bs1.om"筒主。

修改結(jié)果:

"modelPath":"model/unet_hw960_bs1.om"

modelPath修改完成之后关噪,保存pipeline/unet_simple_opencv.pipeline文件。

StreamManagerApi:

StreamManagerApi文檔請參考:

https://support.huaweicloud.com/ug-vis-mindxsdk203/atlasmx_02_0320.html

StreamManagerApi用于對Stream流程的基本管理:加載流程配置乌妙、創(chuàng)建流程使兔、向流程發(fā)送數(shù)據(jù)、獲得執(zhí)行結(jié)果藤韵、銷毀流程虐沥。

這里用到的StreamManagerApi有:

InitManager:初始化一個StreamManagerApi。

CreateMultipleStreams:根據(jù)指定的配置創(chuàng)建多個Stream荠察。

SendData:向指定Stream上的輸入元件發(fā)送數(shù)據(jù)(appsrc)置蜀。

GetResult:獲得Stream上的輸出元件的結(jié)果(appsink)

DestroyAllStreams:銷毀所有的流數(shù)據(jù)。

main.py文件內(nèi)容如下悉盆,可根據(jù)實際開發(fā)情況進行修改盯荤。

importargparseimportbase64importjsonimportosimportcv2importnumpyasnpfrom StreamManagerApiimport*importMxpiDataType_pb2asMxpiDataTypex0=2200# w:2200~4000;h:1000~2800y0=1000x1=4000y1=2800ori_w=x1-x0ori_h=y1-y0def_parse_arg():parser=argparse.ArgumentParser(description="SDK infer")parser.add_argument("-d","--dataset",type=str,default="data/",help="Specify the directory of dataset")parser.add_argument("-p","--pipeline",type=str,default="pipeline/unet_simple_opencv.pipeline",help="Specify the path of pipeline file")returnparser.parse_args()def_get_dataset(dataset_dir):img_ids=sorted(next(os.walk(dataset_dir))[1])forimg_idinimg_ids:img_path=os.path.join(dataset_dir,img_id)yieldimg_pathdef_process_mask(mask_path):# 手動裁剪? ? mask=cv2.imread(mask_path,cv2.IMREAD_GRAYSCALE)[y0:y1,x0:x1]returnmaskdef_get_stream_manager(pipeline_path):stream_mgr_api=StreamManagerApi()ret=stream_mgr_api.InitManager()#初始化streamifret!=0:print(f"Failed to init Stream manager, ret={ret}")exit(1)withopen(pipeline_path,'rb')asf:pipeline_content=f.read()ret=stream_mgr_api.CreateMultipleStreams(pipeline_content)# 創(chuàng)建streamifret!=0:print(f"Failed to create stream, ret={ret}")exit(1)returnstream_mgr_apidef_do_infer_image(stream_mgr_api,image_path):stream_name=b'unet_mindspore'# 與pipeline中stream name一致? ? data_input=MxDataInput()withopen(image_path,'rb')asf:data_input.data=f.read()# 插入摳圖的功能,扣1800*1800大小? ? roiVector=RoiBoxVector()roi=RoiBox()roi.x0=x0? ? roi.y0=y0? ? roi.x1=x1? ? roi.y1=y1? ? roiVector.push_back(roi)data_input.roiBoxs=roiVector? ? unique_id=stream_mgr_api.SendData(stream_name,0,data_input)#向指定Stream上的輸入元件發(fā)送數(shù)據(jù)(appsrc)ifunique_id<0:print("Failed to send data to stream.")exit(1)infer_result=stream_mgr_api.GetResult(stream_name,unique_id)# 獲得Stream上的輸出元件的結(jié)果(appsink)ifinfer_result.errorCode!=0:print(f"GetResult error. errorCode={infer_result.errorCode},"f"errorMsg={infer_result.data.decode()}")exit(1)# 用dumpdata獲取數(shù)據(jù)? ? infer_result_data=json.loads(infer_result.data.decode())content=json.loads(infer_result_data['metaData'][0]['content'])tensor_vec=content['tensorPackageVec'][0]['tensorVec'][1]#1是argmax結(jié)果? ? data_str=tensor_vec['dataStr']tensor_shape=tensor_vec['tensorShape']argmax_res=np.frombuffer(base64.b64decode(data_str),dtype=np.float32).reshape(tensor_shape)np.save("argmax_result.npy",argmax_res)tensor_vec=content['tensorPackageVec'][0]['tensorVec'][0]#0是softmax結(jié)果? ? data_str=tensor_vec['dataStr']tensor_shape=tensor_vec['tensorShape']softmax_res=np.frombuffer(base64.b64decode(data_str),dtype=np.float32).reshape(tensor_shape)np.save("softmax_result.npy",softmax_res)returnsoftmax_res? # ndarray# 自定義dice系數(shù)和iou函數(shù)def_calculate_accuracy(infer_image,mask_image):mask_image=cv2.resize(mask_image,infer_image.shape[1:3])mask_image=mask_image/255.0mask_image=(mask_image>0.5).astype(np.int)mask_image=(np.arange(2)==mask_image[...,None]).astype(np.int)infer_image=np.squeeze(infer_image,axis=0)inter=np.dot(infer_image.flatten(),mask_image.flatten())union=np.dot(infer_image.flatten(),infer_image.flatten())+\? ? ? ? np.dot(mask_image.flatten(),mask_image.flatten())single_dice=2*float(inter)/float(union+1e-6)single_iou=single_dice/(2-single_dice)returnsingle_dice,single_ioudefmain(_args):dice_sum=0.0iou_sum=0.0cnt=0stream_mgr_api=_get_stream_manager(_args.pipeline)forimage_pathin_get_dataset(_args.dataset):infer_image=_do_infer_image(stream_mgr_api,os.path.join(image_path,'image.png'))# 摳圖并且reshape后的shape焕盟,1hw? ? ? ? mask_image=_process_mask(os.path.join(image_path,'mask.png'))# 摳圖后的shape秋秤, hw? ? ? ? dice,iou=_calculate_accuracy(infer_image,mask_image)dice_sum+=dice? ? ? ? iou_sum+=iou? ? ? ? cnt+=1print(f"image: {image_path}, dice: {dice}, iou: {iou}")print(f"========== Cross Valid dice coeff is: {dice_sum / cnt}")print(f"========== Cross Valid IOU is: {iou_sum / cnt}")stream_mgr_api.DestroyAllStreams()# 銷毀streamif__name__=="__main__":args=_parse_arg()main(args)

run.sh文件內(nèi)容如下,可根據(jù)實際開發(fā)情況進行修改脚翘。參考SDK軟件包sample腳本灼卢,需要按照實際路徑修改各個環(huán)境變量路徑。

set-eCUR_PATH=$(cd"$(dirname "$0")"||{warn"Failed to check path/to/run.sh";exit;};pwd)# Simple log helper functionsinfo(){echo-e"\033[1;34m[INFO ][MxStream] $1\033[1;37m";}warn(){echo>&2-e"\033[1;31m[WARN ][MxStream] $1\033[1;37m";}#exportMX_SDK_HOME=${CUR_PATH}/../../..exportLD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH}exportGST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scannerexportGST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins#tosetPYTHONPATH,importthe StreamManagerApi.pyexportPYTHONPATH=$PYTHONPATH:${MX_SDK_HOME}/pythonpython3 main.pyexit0

(6) 運行腳本

激活mxVision環(huán)境變量(本作業(yè)無需此步驟):

./root/mxVision/set_env.sh

運行腳本:

cd/root/unet_sdk/# 切換至推理腳本目錄bash run.sh

運行截圖如下:

通過MindStudio運行来农,會自動上傳代碼到預(yù)設(shè)路徑鞋真,并執(zhí)行,運行結(jié)果如下:

MindStudio專家系統(tǒng)工具

專家系統(tǒng)工具當(dāng)前支持專家系統(tǒng)自有知識庫和生態(tài)知識庫對模型/算子進行性能分析沃于,支持性能調(diào)優(yōu)一鍵式閉環(huán)實現(xiàn)一鍵式性能問題優(yōu)化能力涩咖。

專家系統(tǒng)自有知識庫當(dāng)前提供的功能:基于Roofline模型的算子瓶頸識別與優(yōu)化建議海诲、基于Timeline的AI CPU算子優(yōu)化、算子融合推薦檩互、TransData算子識別和算子優(yōu)化分析特幔。

生態(tài)知識庫的專家系統(tǒng)性能調(diào)優(yōu)功能:由生態(tài)開發(fā)者使用Python編程語言進行開發(fā),用戶通過調(diào)用專家系統(tǒng)提供的接口闸昨,對生態(tài)開發(fā)者提供的模型/算子進行性能分析蚯斯。

MindStudio IDE當(dāng)前版本僅支持的生態(tài)知識庫創(chuàng)建功能,可以在上面完成生態(tài)知識庫代碼開發(fā)饵较,暫不支持對生態(tài)知識庫的專家系統(tǒng)分析功能拍嵌。性能調(diào)優(yōu)一鍵式閉環(huán)提供一鍵式性能問題分析和優(yōu)化能力,有效提升用戶性能分析和優(yōu)化效率告抄。

下面介紹如何使用專家系統(tǒng)工具對模型和算子進行性能瓶頸識別并輸出優(yōu)化建議撰茎。

1. 單擊菜單欄“Ascend > Advisor”,彈出專家系統(tǒng)工具界面 打洼。如圖所示龄糊。

2. 單擊上圖界面左上角紅框中的按鈕,打開專家系統(tǒng)配置界面募疮,各參數(shù)配置示例如圖所示炫惩。

各參數(shù)具體說明如下:

3. 配置完成后單擊“Start”啟動分析。

之后開始運行阿浓,如圖所示他嚷,具體時間與網(wǎng)絡(luò)情況有關(guān)。

運行完成后芭毙,會自動跳轉(zhuǎn)到如下圖所示界面筋蓖。

這里的Model Performance Report是模型性能的總結(jié)報告。根據(jù)該頁面退敦,可以知道模型性能是好是壞粘咖,也可以知道模型的吞吐率和運行時間,AI Core的利用率侈百,Tiling策略是否合理瓮下,部分字段說明如下所示,具體可參見https://www.hiascend.com/document/detail/zh/mindstudio/50RC3/msug/msug_000285.html钝域。

從上述截圖的分析結(jié)果可以看出我們所用的U-Net模型的芯片利用率是偏低的讽坏,甚至可以說是很差,有很大的優(yōu)化的空間例证。下面我們來詳細分析路呜。

先來看根據(jù)總體性能數(shù)據(jù)匯總計算得出的Model Performance,顯示為Bad织咧,情況不樂觀啊拣宰。接著看看匯總信息党涕。

可以看到Cube吞吐量Cube Throughput約393 GOps,Vector吞吐量Vector Throughput約0.89 GOps巡社,AI Core執(zhí)行時間88712us,任務(wù)執(zhí)行時間177183us手趣,平均BlockDim利用率Avg BlockDim Usage晌该,算子執(zhí)行時的平均核心數(shù),數(shù)值為1绿渣,這反映了反映芯片利用情況朝群,考慮到我們ECS的Ascend 310總計2個AI Core,且由系統(tǒng)自動調(diào)度中符,這里為1還可以接收姜胖。但下面的數(shù)據(jù)可難看了。

如圖所示淀散,芯片利用率Chip Utilization右莱。按照規(guī)則,80為優(yōu)档插,顯示為綠色慢蜓;小于80則為差,顯示為紅色郭膛。根據(jù)Pipeline Bound的數(shù)值計算得出晨抡。而我們這里直接為0了。再看Cube利用率Cube Ratio約為0.41则剃,Vector利用率Vector Ratio約為0.29耘柱,Scalar利用率Scalar Ratio約為0.26,還有優(yōu)化空間棍现,而MTE1瓶頸调煎、MTE2瓶頸、MTE3瓶頸都還不小轴咱。特別是MTE2瓶頸汛蝙,約為0.39。下面接著看朴肺。

來看內(nèi)存讀入量的數(shù)據(jù)切片策略Tiling Strategy為5.23窖剑,情況糟糕。根據(jù)規(guī)則戈稿,數(shù)值達到80為優(yōu)西土,顯示為綠色;小于80則為差鞍盗,顯示為紅色需了。這是根據(jù)Memory Redundant的數(shù)值計算得出跳昼。同時,可以看到真實內(nèi)存讀入量Real Memory Input(GB)約為1.44GB肋乍,真實內(nèi)存寫出量Real Memory Output(GB)約為0.60GB鹅颊,都在可用范圍內(nèi)。

接下來進入Computational Graph Optimization界面墓造,如圖紅框所示兩處都可以堪伍,二者就是簡版和精裝版的區(qū)別了。在這里觅闽,我們可以看到計算圖優(yōu)化帝雇,算子融合推薦功能專家系統(tǒng)分析建議,會分行展示可融合的算子蛉拙。

先來看看需要進行UB融合的算子尸闸,點擊算子,會自動跳轉(zhuǎn)相應(yīng)的計算圖孕锄,既直觀又方便啊吮廉。同時我們看到可融合算子的執(zhí)行時間Fusion Operator Duration達到了約9585us,接近10ms了硫惕,算是比較大了茧痕。本模型沒有AIPP融合推薦和L2Cache融合推薦。

我們直接看TransData算子融合推薦恼除,如圖所示踪旷。該算子執(zhí)行持續(xù)時間在2.5ms左右,也不算小了豁辉,也是一個值得優(yōu)化的地方啊令野。

但遺憾的是本次Roofline頁面(基于Roofline模型的算子瓶頸識別與優(yōu)化建議功能輸出結(jié)果)和Model Graph Optimization頁面(基于Timeline的AICPU算子優(yōu)化功能輸出結(jié)果)都沒什么結(jié)果展示,具體分別如下圖所示徽级。

這里提個建議气破,看了下運行日志(顯示了這一句[ERROR] Analyze model(RooflineModel) failed, please check dfx log.),Roofline之所以沒有結(jié)果顯示餐抢,可能是Roofline運行失敗现使,不過這個日志有點太簡潔了,不太友好旷痕,也沒有給出 dfx log的具體路徑或位置碳锈,哪怕彈出一個鏈接給用戶,讓用戶去自行查找呢欺抗,這都沒有售碳,感覺界面不太友好啊。

專家系統(tǒng)提供對推理模型和算子的性能瓶頸分析能力并輸出專家建議,但實際性能調(diào)優(yōu)還需用戶自行修改贸人,不能做到性能調(diào)優(yōu)一鍵式閉環(huán)间景。而性能調(diào)優(yōu)一鍵式閉環(huán)提供一鍵式性能問題分析和優(yōu)化能力,有效提升用戶性能分析和優(yōu)化效率艺智。同時倘要,性能調(diào)優(yōu)一鍵式閉環(huán)當(dāng)前實現(xiàn)生態(tài)知識庫ONNX模型的部分推理場景瓶頸識別和自動化調(diào)優(yōu)能力。

但這需要準(zhǔn)備待優(yōu)化的ONNX模型文件(.onnx)以及ONNX模型經(jīng)過ATC轉(zhuǎn)換后的OM模型文件(.om)力惯,而我們這次是.air模型轉(zhuǎn)om模型碗誉,雖然可以獲得onnx模型,但太麻煩了父晶,我們這次就不嘗試了。

這里再提個建議弄跌,性能調(diào)優(yōu)一鍵式閉環(huán)還需要下載ONNX模型調(diào)優(yōu)知識庫甲喝,我按照文檔(文檔鏈接:https://www.hiascend.com/document/detail/zh/mindstudio/50RC3/msug/msug_000303.html)中提供Link跳轉(zhuǎn)下載(如下圖所示),未能找到文檔后續(xù)所說的KnowledgeBase?Configuration知識庫配置文件echosystem.json铛只。不知道是不是我的問題埠胖,建議工程師看看,驗證一下淳玩。

MindStudio Profiling工具

Profiling作為專業(yè)的昇騰AI任務(wù)性能分析工具直撤,其功能涵蓋AI任務(wù)運行時關(guān)鍵數(shù)據(jù)采集和性能指標(biāo)分析。熟練使用Profiling蜕着,可以快速定位性能瓶頸谋竖,顯著提升AI任務(wù)性能分析的效率。

下面介紹使用Profiling工具采集性能數(shù)據(jù)并作簡單的性能數(shù)據(jù)分析承匣。

1. 更換python鏈接(可選)

這里先給大家排下雷蓖乘,如果大家遇到如下報錯,那么按照下面的操作修復(fù)下就行了韧骗,報錯信息如下圖所示:

個人認為嘉抒,這應(yīng)該是本地電腦沒安裝Python或者安裝了,但是沒有添加到系統(tǒng)Path袍暴,以致無法調(diào)用些侍,這應(yīng)該Profiling需要在Windows上調(diào)用Python做一些操作,但無法調(diào)用Python導(dǎo)致的政模。那么我們只要安裝Python的時候岗宣,選擇添加到Path,或者已經(jīng)安裝Python的同學(xué)览徒,將Python添加到Path狈定,最終使得能夠在Windows終端下直接調(diào)用Python即可。最終效果示例如下:

此外,因為ECS終端默認啟動的Python是/usr/bin/python纽什,而在ECS默認是Python2直接運行程序會報錯措嵌,而我們需要用Python3,所以需要重新鏈接符號芦缰,具體流程為:刪除python鏈接文件–>>新建鏈接文件到python3企巢,下面是操作步驟:

那么有人可能就要問了,為什么是/usr/local/python3.9.5/bin/python3呢让蕾?因為我們在通過MindStudio直接在遠程ECS上運行的時候浪规,就是用的這個啊,來張圖看看:

這里提個建議探孝,我之前運行會報錯笋婿,詳情見https://www.hiascend.com/forum/thread-0229107014330773104-1-1.html,連著兩天重啟顿颅,試了好幾次缸濒,就是不行,后來又試了一次粱腻,突然就可以了庇配,感覺很奇怪,莫明其妙地報錯绍些,莫名其秒地好了捞慌,這給我一種IDE很不穩(wěn)定的感覺。建議優(yōu)化一下柬批,提升下穩(wěn)定性啸澡。

2. 執(zhí)行Profiling采集

(1)單擊菜單欄“Ascend > System Profiler > New Project”,彈出Profiling配置窗口 萝快。

配置“Project Properties”锻霎,配置工程名稱“Project Name”和選擇工程路徑“Project Location”。單擊“Next”進入下一步揪漩。

(2)進入“Executable Properties”配置界面旋恼。

(3)進入“Profiling Options”配置界面,配置項按默認配置

完成上述配置后單擊窗口右下角的“Start”按鈕奄容,啟動Profiling冰更。工程執(zhí)行完成后,MindStudio自動彈出Profiling結(jié)果視圖昂勒。

先來看下全量迭代耗時數(shù)據(jù)蜀细,在Timeline視圖下查看Step Trace數(shù)據(jù)迭代耗時情況,識別耗時較長迭代進行分析戈盈。注意奠衔,可選擇導(dǎo)出對應(yīng)迭代Timeline數(shù)據(jù)谆刨,單擊耗時較長迭代按鈕

彈出對話框,單擊“Yes”導(dǎo)出對應(yīng)迭代Timeline數(shù)據(jù)归斤。如圖所示痊夭,如果最初看不見,建議將鼠標(biāo)放到圖上脏里,之后滑動放大她我,就能看見了。

還可以查看迭代內(nèi)耗時情況:存在較長耗時算子時迫横,可以進一步找算子詳細信息輔助定位番舆;存在通信耗時或調(diào)度間隙較長時,分析調(diào)用過程中接口耗時矾踱。如圖所示恨狈。

在界面下方還能查看對應(yīng)的算子統(tǒng)計表:查看迭代內(nèi)每個AICORE和AICPU算子的耗時及詳細信息,進一步定位分析算子的Metrics指標(biāo)數(shù)據(jù)呛讲,分析算子數(shù)據(jù)搬運拴事、執(zhí)行流水的占比情況,識別算子瓶頸點圣蝎。

此外,這里還能查看組件接口耗時統(tǒng)計表:查看迭代內(nèi)AscendCL API和Runtime API的接口耗時情況衡瓶,輔助分析接口調(diào)用對性能的影響徘公。

這個要說一下,限于屏幕大小哮针,上述這次數(shù)據(jù)的完整展示关面,可能需要放大或縮小,或者調(diào)整某些部分大小十厢,這些操作很卡頓等太,操作起來沒什么反應(yīng),仿佛這個界面卡死了蛮放,可用性差缩抡,用戶體驗不好,建議優(yōu)化一下包颁。

我們可以看到下圖中這個Op的Task Wait Time要9.895us瞻想,而其他Op基本為0,所以可以考慮試試能不能減少這個Wait Time娩嚼,從而提升性能蘑险。

這里說一下,上圖中這個Op Name很長岳悟,我需要將這欄橫向拉伸很長才能完整顯示佃迄,這有點麻煩泼差,我本來想將鼠標(biāo)懸停此處,讓其自動顯示完整名稱呵俏,但好像不行堆缘,能否考慮加一下這個懸停顯示全部內(nèi)容的操作,否則我要先拉伸看柴信,之后再拉回去看其他套啤,比較麻煩。

還記得之前我們在專家系統(tǒng)工具那時提到的MTE2瓶頸相比之下有些大(約0.39)嘛随常?這里從下圖看到Mte2時間較長潜沦,約3.7ms,說一下绪氛,mte2類型指令應(yīng)該是DDR->AI Core搬運類指令唆鸡,這里我們量化一下看看,如下圖所示枣察,AI Core時間約為6.8ms争占,但Task Duration約12.5ms,幾乎翻倍了序目,說明我們Task只有約一半時間是真正用于AI Core計算臂痕,很明顯很多時間被浪費了。

說明這一點還是比較值得優(yōu)化的猿涨。而各個工具之間也是可以相互輔助握童,相互驗證更好地幫助我們定位問題。下面我們再看看叛赚,先確認下Timeline顏色配置調(diào)色板澡绩,如下圖所示。而我們之前看到的Timeline基本是綠色俺附,未見黃色或紅色肥卡,估計沒什么優(yōu)化空間了。還是優(yōu)先做明顯地值得優(yōu)化地點吧事镣,這也算抓大放小吧步鉴。

好了,我們再看點其他的蛮浑,比如Analysis Summary唠叛,這里展示了比較詳細的軟硬件信息,比如Host Computer Name沮稚、Host Operating System等艺沼,還有我們ECS上用的CPU的詳細信息,包括型號蕴掏、邏輯核心數(shù)量等障般,令我感興趣的是调鲸,還有Ascend 310的信息,包括AI Core數(shù)量2挽荡, AI CPU數(shù)量4藐石,Control CPU數(shù)量4,Control CPU Type為ARMv8_Cortex_A55定拟,以及一個TS CPU于微,很詳細了,很好地展示了Ascend 310的內(nèi)部硬件信息青自,更有助于我們了解這款處理器株依。

同時,再來看看Baseline Comparison吧延窜。

總的來說恋腕,MindStudio提供了Host+Device側(cè)豐富的性能數(shù)據(jù)采集能力和全景Timeline交互分析能力,展示了Host+Device側(cè)各項性能指標(biāo)逆瑞,幫助用戶快速發(fā)現(xiàn)和定位AI應(yīng)用荠藤、芯片及算子的性能瓶頸,包括資源瓶頸導(dǎo)致的AI算法短板获高,指導(dǎo)算法性能提升和系統(tǒng)資源利用率的優(yōu)化哈肖。MindStudio支持Host+Device側(cè)的資源利用可視化統(tǒng)計分析,具體包括Host側(cè)CPU念秧、Memory牡彻、Disk、Network利用率和Device側(cè)APP工程的硬件和軟件性能數(shù)據(jù)出爹。

通過Profiling性能分析工具前后兩次對網(wǎng)絡(luò)應(yīng)用推理的運行時間進行分析,并對比兩次執(zhí)行時間可以得出結(jié)論缎除,可以幫助我們?nèi)ヲ炞C替換函數(shù)或算子后严就,是否又性能提升,是否提升了推理效率器罐。此外梢为,還可以幫助我們挑選應(yīng)該優(yōu)先選擇的網(wǎng)絡(luò)模型,或者測試自定義算子是否達到最優(yōu)性能轰坊,是否還存在優(yōu)化空間等等铸董,還是挺有用的。

MindStudio精度比對工具

1. 定義

為了幫助開發(fā)人員快速解決算子精度問題肴沫,需要提供自有實現(xiàn)的算子運算結(jié)果與業(yè)界標(biāo)準(zhǔn)算子運算結(jié)果之間進行精度差異對比的工具粟害。

2. 功能

提供Tensor比對能力,包含余弦相似度颤芬、歐氏相對距離悲幅、絕對誤差(最大絕對誤差套鹅、平均絕對誤差、均方根誤差)汰具、相對誤差(最大相對誤差卓鹿、平均相對誤差、累積相對誤差)留荔、KL散度吟孙、標(biāo)準(zhǔn)差算法比對維度。

總結(jié)

MindStudio的安裝過于繁瑣

暫不談Linux下的安裝和配置聚蝶,以本次的Windows下MindSutido搭配遠程ECS使用來說杰妓,Windows下除了要安裝MindStudio安裝包,還要安裝Python依賴既荚,安裝MinGW依賴稚失,以及安裝CMake等,太麻煩了恰聘。能否做成一鍵安裝句各,畢竟這是個IDE,感覺使用其他IDE都是一鍵安裝晴叨,就算有其他依賴凿宾,一般也是在IDE內(nèi)部根據(jù)需要,自行選擇安裝即可兼蕊,這個MindStudio可麻煩了初厚,安裝的依賴還很分散。

還是性能問題孙技,性能優(yōu)化不好

Windows下MindStudio的CPU产禾、內(nèi)存等資源占用很大,遠大于其他類型IDE(比如PyCharm牵啦、IntelliJ IEDA等)亚情,而且還卡頓,這還是遠程連接ECS使用哈雏,可就是這樣楞件,感覺本地電腦也快起飛了,遠不如PyCharm裳瘪、IntelliJ IEDA等使用起來順暢土浸,感覺是軟件優(yōu)化不行,如果是全部在物理機上運行彭羹,可能資源開銷就更大了黄伊,這也太增加負載了,如果是這樣派殷,IDE的可視化操作意義就不大了毅舆,很多操作不如在終端執(zhí)行脱篙,將更多資源留給更有用的地方族操。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胶果,更是在濱河造成了極大的恐慌失暂,老刑警劉巖瓢捉,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逼裆,死亡現(xiàn)場離奇詭異,居然都是意外死亡辜梳,警方通過查閱死者的電腦和手機粱甫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作瞄,“玉大人茶宵,你說我怎么就攤上這事∽诨樱” “怎么了乌庶?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長契耿。 經(jīng)常有香客問我瞒大,道長,這世上最難降的妖魔是什么搪桂? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任透敌,我火速辦了婚禮,結(jié)果婚禮上踢械,老公的妹妹穿的比我還像新娘酗电。我一直安慰自己,他們只是感情好内列,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布顾瞻。 她就那樣靜靜地躺著,像睡著了一般德绿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上退渗,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天移稳,我揣著相機與錄音,去河邊找鬼会油。 笑死个粱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翻翩。 我是一名探鬼主播都许,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼稻薇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胶征?” 一聲冷哼從身側(cè)響起塞椎,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睛低,沒想到半個月后案狠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡钱雷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年骂铁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩抗。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡拉庵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出套蒂,到底是詐尸還是另有隱情钞支,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布泣懊,位于F島的核電站伸辟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏馍刮。R本人自食惡果不足惜信夫,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卡啰。 院中可真熱鬧静稻,春花似錦、人聲如沸匈辱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡脸。三九已至押搪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浅碾,已是汗流浹背大州。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垂谢,地道東北人厦画。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親根暑。 傳聞我的和親對象是個殘疾皇子力试,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容