摘要:本文介紹了昇騰CANN提供的模型轉換工具ATC,介紹了其功能、架構,並以具體樣例介紹了該工具的基本使用方法以及常用設定。
本文分享自華為雲社群《使用ATC工具將主流開源框架模型轉換為昇騰模型》,作者: 昇騰CANN。
什麼是ATC,它能做什麼?
昇騰張量編譯器(Ascend Tensor Compiler,簡稱ATC)是昇騰CANN架構體系下的模型轉換工具:
- 它可以將開源框架的網路模型(例如TensorFlow、ONNX等)轉換為昇騰AI處理器支援的模型檔案(.om格式),用於後續的模型推理。
- 它可以將基於Ascend IR定義的單運算元描述檔案(*.json格式)轉換為昇騰AI處理器支援的模型檔案(.om格式),用於後續在整網中驗證運算元功能。
模型轉換過程中,ATC會進行運算元排程最佳化、權重資料重排、記憶體使用最佳化等操作,對開源框架的網路模型做進一步調優,使其高效地在昇騰AI處理器上執行。
ATC工具功能架構
開源框架網路模型編譯流程:
- 使用ATC工具轉換模型時,開源框架網路模型經過Parser解析後,轉換為昇騰的中間圖IR Graph。
- 中間圖IR Graph經過圖準備,圖拆分,圖最佳化,圖編譯等一系列操作後,轉成適配昇騰AI處理器的*.om模型檔案。
- 後續使用者可呼叫AscendCL提供的模型載入、執行等介面實現模型推理。
單運算元編譯流程:
- 使用ATC工具轉換單運算元時,單運算元經過編譯後,轉換成適配昇騰AI處理器的單運算元*.om模型檔案。
- 後續使用者可呼叫AscendCL提供的單運算元模型載入、執行等介面在整網中驗證單運算元功能。
如何使用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處理器的版本,例如Ascend310。
- --model:原始網路模型檔案路徑,含檔名。
- --weight:原始網路模型權重檔案路徑,含檔名,僅當原始網路模型是Caffe時需要指定。
- --output:轉換後的*.om模型檔案路徑,含檔名,轉換成功後,模型檔名自動以.om字尾結尾。
3. 若提示ATC run success資訊,則說明模型轉換成功。
在--output引數指定的路徑下,可檢視轉換後的模型檔案,例如caffe_resnet50.om。
ATC工具支援更多特性
上述只給出了ATC工具進行模型轉換最基本的命令,本章節給出ATC工具支援的更多特性,方便使用者進一步瞭解。
- ATC工具支援將原始模型檔案或昇騰*.om模型檔案轉換成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
- 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"
- 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 ”決定。
更多介紹
關於ATC工具更多引數和特性說明,請登入昇騰社群查閱:
[1]昇騰文件中心
[2]昇騰社群線上課程
[2]昇騰論壇