【2023 · CANN訓(xùn)練營(yíng)第一季】模型轉(zhuǎn)換與ATC工具的學(xué)習(xí)
【2023 · CANN訓(xùn)練營(yíng)第一季】模型轉(zhuǎn)換與ATC工具的學(xué)習(xí)
文檔參考:CANN文檔社區(qū)版: 6.0.RC1.alpha001
一、為什么要使用ATC工具
昇騰張量編譯器(Ascend Tensor Compiler,簡(jiǎn)稱ATC)是昇騰CANN架構(gòu)體系下的模型轉(zhuǎn)換工具
當(dāng)前昇騰AI處理器以及昇騰AI軟件棧是沒(méi)有辦法直接拿比如Caffe,TensorFlow等開源框架網(wǎng)絡(luò)模型來(lái)直接進(jìn)行推理的,我們需要將開源框架的網(wǎng)絡(luò)模型轉(zhuǎn)換成Davinci架構(gòu)專用的模型。
其作用:
1.它可以將開源框架的網(wǎng)絡(luò)模型(如Caffe、TensorFlow等)以及Ascend IR定義的單算子描述文件轉(zhuǎn)換為昇騰AI處理器支持的離線模型。
2.模型轉(zhuǎn)換過(guò)程中,ATC會(huì)進(jìn)行算子調(diào)度優(yōu)化、權(quán)重?cái)?shù)據(jù)重排、內(nèi)存使用優(yōu)化等具體操作,對(duì)原始的深度學(xué)習(xí)模型進(jìn)行進(jìn)一步的調(diào)優(yōu),從而滿足部署場(chǎng)景下的高性能需求,使其能夠高效執(zhí)行在昇騰AI處理器上。
二、什么是AIPP
AIPP(Artificial Intelligence Pre-Processing)人工智能預(yù)處理,用于在AI Core上完成數(shù)據(jù)預(yù)處理,包括改變圖像尺寸、色域轉(zhuǎn)換(轉(zhuǎn)換圖像格式)、減均值/乘系數(shù)(改變圖像像素),數(shù)據(jù)預(yù)處理之后再進(jìn)行真正的模型推理。
AIPP主要用于在AI Core上完成數(shù)據(jù)預(yù)處理,通過(guò)AIPP提供的色域轉(zhuǎn)換功能,輸出滿足要求的圖片格式;通過(guò)改變圖像尺寸中的補(bǔ)邊(Padding)功能,輸出滿足長(zhǎng)寬對(duì)齊的圖片等,AIPP的出現(xiàn)是對(duì)DVPP能力的有效補(bǔ)充。
AIPP根據(jù)配置方式不同 ,分為靜態(tài)AIPP和動(dòng)態(tài)AIPP;如果要將原始圖片輸出為滿足推理要求的圖片格式,則需要使用色域轉(zhuǎn)換功能;如果要輸出固定大小的圖片,則需要使用AIPP提供的Crop(摳圖)、Padding(補(bǔ)邊)功能
三、環(huán)境安裝與設(shè)置
CANN環(huán)境安裝,可以參考我的【CANN訓(xùn)練營(yíng)-模型部署入門】【CANN訓(xùn)練營(yíng)0基礎(chǔ)贏滿分秘籍】CANN的Ubuntu環(huán)境安裝
安裝好后,根據(jù)需要,在原先的環(huán)境變量基礎(chǔ)上多添加了如下幾個(gè)環(huán)境變量:
1.設(shè)置atc運(yùn)行日志
其中?export ASCEND_SLOG_PRINT_TO_STDOUT=1
是設(shè)置atc命令執(zhí)行過(guò)程中的打屏環(huán)境變量
也可以在atc命令中設(shè)置--log參數(shù)(此參數(shù)不能設(shè)置為null),顯示相應(yīng)的日志級(jí)別
如果需要把日志重定向到文件,設(shè)置好上述的打印日志級(jí)別后,將--log參數(shù)設(shè)置為
2.開啟算子并行編譯功能
若網(wǎng)絡(luò)模型較大,則可以開啟算子并行編譯
TE_PARALLEL_COMPILER的值代表算子編譯進(jìn)程數(shù)(配置為整數(shù)),取值范圍為1~32,默認(rèn)值為8,當(dāng)取值大于1時(shí)開啟算子的并行編譯功能。建議不超過(guò):CPU核數(shù)*80%/昇騰AI處理器個(gè)數(shù)
3.設(shè)置打印模型轉(zhuǎn)換過(guò)程中的各階段圖描述信息
其中:
取值為1,全量dump。
取值為2,不含有權(quán)重等數(shù)據(jù)的基本版dump。
取值為3,只顯示節(jié)點(diǎn)關(guān)系的精簡(jiǎn)版dump。
如果想控制dump圖的個(gè)數(shù),還可以設(shè)置:
取值為1,dump所有圖。
取值為2,dump除子圖外的所有圖,默認(rèn)值為2。
取值為3,dump最后的生成圖。
設(shè)置上述變量后,在執(zhí)行atc命令的當(dāng)前路徑會(huì)生成如下文件:
ge_onnx*.pbtxt:基于ONNX的開源模型描述結(jié)構(gòu),可以使用Netron等可視化軟件打開。
ge_proto*.txt:protobuf格式存儲(chǔ)的文本文件,該文件可以轉(zhuǎn)成json格式文件方便用戶定位問(wèn)題。該文件與ge_onnx*.pbtxt成對(duì)出現(xiàn),但是比ge_onnx*.pbtxt文件會(huì)多string類型的屬性信息,用戶選擇其中一種文件打開即可。
四、模型的導(dǎo)出與轉(zhuǎn)換
我們訓(xùn)練好的模型為pt格式的文件,我們需要先將其轉(zhuǎn)換為onnx的格式,再使用atc工具轉(zhuǎn)換成能使用的om文件?

pt轉(zhuǎn)換為onnx
eg:
在yolov5官網(wǎng)下載了一個(gè)yolov5s.pt
使用其提供的export.py進(jìn)行轉(zhuǎn)換
這個(gè)轉(zhuǎn)換過(guò)程遇到很多問(wèn)題,等我有空整理一個(gè)問(wèn)題集及解決方法
onnx轉(zhuǎn)換為om
1.未使能AIPP
直接使用atc命令轉(zhuǎn)換時(shí),發(fā)現(xiàn)自己有3個(gè)模塊找不到,重新安裝了一下?



使用如下命令安裝了一下:
安裝完成后,再次進(jìn)行轉(zhuǎn)換
轉(zhuǎn)換成功如下圖:

note:輸入的shape要注意寫正確,不然會(huì)出現(xiàn)如下錯(cuò)誤,還有就是,那個(gè)輸出名字不用自己寫.om,輸出時(shí)工具會(huì)自己補(bǔ)全的:

2.使能AIPP
我們?cè)谶M(jìn)行C++搭建的模型推理任務(wù)時(shí),預(yù)處理部分,可以放到AIPP中進(jìn)行。
我們使用insert_op.cfg:內(nèi)容如下
atc命令參數(shù)如下:
出現(xiàn)報(bào)錯(cuò):?

看樣子是進(jìn)行aipp的type不能是fp16
修改后:
這里保留一個(gè)疑問(wèn),AIPP不能輸入fp16進(jìn)行轉(zhuǎn)換但是這里有個(gè)輸出參數(shù)是--output_type=FP16,這個(gè)參數(shù)是參考modelZoo中的樣例里面的參數(shù),不知道這樣是否有問(wèn)題,等后面在模型推理那塊驗(yàn)證時(shí)看看是否有錯(cuò)誤,有錯(cuò)誤再進(jìn)行修改
結(jié)果如下:

上述兩種轉(zhuǎn)換都得到了我們的

結(jié)語(yǔ):至此兩種轉(zhuǎn)換都成功了,后續(xù)我會(huì)在我的模型推理部分的筆記中對(duì)此模型進(jìn)行加載推理使用驗(yàn)證。
ps:該文僅是為了記錄CANN訓(xùn)練營(yíng)的學(xué)習(xí)過(guò)程所用,不參與任何商業(yè)用途,有任何代碼問(wèn)題可以和我一起討論修改