本文分享自華為雲社群《如何基於香橙派AIpro將開源框架模型轉換為昇騰模型》,作者:昇騰CANN。
在前面的介紹中,我們知道了如何基於香橙派AIpro開發AI推理應用,也大致瞭解到在推理之前,需要把原始網路模型 (可能是 PyTorch 的、TensorFlow,可能是Caffe的等等) 轉換成 .om 模型,然後才能呼叫昇騰的aclmdlExecute 等模型執行介面在香橙派AIpro進行模型推理。這個模型轉換的過程就要用到 ATC 工具,目前 ATC 工具直接支援從 Caffe、ONNX、TensorFlow 以及 MindSpore模型的轉換,所以如果你的訓練框架是 PyTorch,則需要做 torch.onnx.export 操作匯出成ONNX模型後才能使用ATC工具。
01 ATC工具簡介
昇騰張量編譯器(Ascend Tensor Compiler,簡稱ATC)是昇騰模型轉換工具,它可以將開源框架的網路模型(例如TensorFlow、ONNX等)轉換為昇騰AI處理器支援的模型檔案(.om格式),用於後續的模型推理。
模型轉換過程中,ATC會進行運算元排程最佳化、權重資料重排、記憶體使用最佳化等操作,對開源框架的網路模型做進一步調優,使其高效地在昇騰AI處理器上執行。
主要過程:
- 開源框架網路模型經過Parser解析後,轉換為昇騰的中間圖IR Graph。
- 中間圖IR Graph經過圖準備,圖拆分,圖最佳化,圖編譯等一系列操作後,轉成適配昇騰AI處理器的*.om模型檔案。
- 使用者可呼叫AscendCL提供的模型載入、執行等介面實現模型推理。
02 ATC工具基本使用方法
下面以Caffe框架ResNet-50網路模型為例,介紹如何使用ATC工具轉換模型。
1、將Caffe框架ResNet-50網路模型的模型檔案*.prototxt、權重檔案*.caffemodel上傳至ATC工具所在的Linux伺服器。
2、執行如下命令進行模型轉換。
atc --framework=0 --soc_version=${soc_version} --model=$HOME/mod/resnet50.prototxt --weight=$HOME/mod/resnet50.caffemodel --output=$HOME/module/out/caffe_resnet50
引數解釋如下:
- --framework:原始網路模型框架型別,0表示Caffe框架。
- --soc_version:指定模型轉換時昇騰AI處理器的版本,可執行npu-smi info命令進行查詢,在查詢到的“Name”前增加Ascend資訊,例如“Name”對應取值為xxxyy。
- --model:原始網路模型檔案路徑,含檔名。
- --weight:原始網路模型權重檔案路徑,含檔名,僅當原始網路模型是Caffe時需要指定。
- --output:轉換後的*.om模型檔案路徑,含檔名,轉換成功後,模型檔名自動以.om字尾結尾。
3、若提示ATC run success資訊,則說明模型轉換成功。
在--output引數指定的路徑下,可檢視轉換後的模型檔案,例如caffe_resnet50.om。
03 ATC工具高階用法介紹
上述只給出了ATC工具進行模型轉換最基本的命令,下面介紹ATC工具支援的更多特性,方便使用者進一步瞭解。
1、ATC工具支援將原始模型檔案或昇騰*.om模型檔案轉換成json格式
如果使用者不方便檢視原始模型或離線模型的引數資訊時,可以將原始模型或離線模型轉成json檔案進行檢視:
- 原始模型檔案—>json檔案
atc --mode=1 --framework=0 --om=$HOME/mod/resnet50.prototxt --json=$HOME/mod/out/caffe_resnet50.json
- 昇騰*.om模型檔案—>json檔案
atc --mode=1 --om=$HOME/mod/out/caffe_resnet50.om --json=$HOME/mod/out/caffe_resnet50.json
2、ATC工具支援自定義*.om模型的輸入輸出資料型別
模型轉換時支援指定網路模型的輸入或輸出節點的資料型別、Format,支援設定精度等。此處的示例命令場景是針對Caffe框架ResNet50網路模型,轉換後的模型輸入為FP16型別,指定Pooling運算元作為輸出,並且該輸出節點為FP16型別。
atc --framework=0 --soc_version=${soc_version} --model=$HOME/mod/resnet50.prototxt --weight=$HOME/mod/resnet50.caffemodel --output=$HOME/mod/out/caffe_resnet50 --input_fp16_nodes="data" --out_nodes="pool1:0" --output_type="pool1:0:FP16"
3、ATC工具支援設定動態BatchSize/動態解析度
某些推理場景,如檢測出目標後再執行目標識別網路,由於目標個數不固定導致目標識別網路輸入BatchSize不固定;如果每次推理都按照最大的BatchSize或最大解析度進行計算,會造成計算資源浪費,因此,模型轉換需要支援動態BatchSize和動態解析度的設定,實際推理時,透過AscendCL介面設定本次推理所需的BatchSize和動態解析度。
-
動態BatchSize
atc --framework=0 --soc_version=${soc_version} --model=$HOME/mod/resnet50.prototxt --weight=$HOME/mod/resnet50.caffemodel --output=$HOME/mod/out/caffe_resnet50 --input_shape="data:-1,3,224,224" --dynamic_batch_size="1,2,4,8"
其中,“--input_shape ”中的“-1”表示設定動態BatchSize,具體支援哪些BatchSize由“--dynamic_batch_size”決定。
- 動態解析度
atc --framework=0 --soc_version=${soc_version} --model=$HOME/mod/resnet50.prototxt --weight=$HOME/mod/resnet50.caffemodel --output=$HOME/mod/out/caffe_resnet50 --input_shape="data:1,3,-1,-1" --dynamic_image_size="224,224;448,448"
其中,“--input_shape ”中的“-1,-1”表示設定動態解析度,具體支援哪些解析度由“--dynamic_image_size ”決定。
04 更多學習資源
[1]香橙派AIpro開源樣例程式碼:https://gitee.com/ascend/EdgeAndRobotics
[2]昇騰文件中心:https://www.hiascend.com/zh/document
[3]香橙派AIpro學習資源一站式導航:https://www.hiascend.com/forum/thread-0285140173361311056-1-1.html
點選關注,第一時間瞭解華為雲新鮮技術~