一文詳解TensorFlow模型遷移及模型訓練實操步驟
摘要:本文介紹將TensorFlow網路模型遷移到昇騰AI平臺,並執行訓練的全流程。然後以TensorFlow 1.15訓練指令碼為例,詳細介紹了自動遷移、手工遷移以及模型訓練的操作步驟。
本文分享自華為雲社群《將TensorFlow模型快速遷移到昇騰平臺》,作者:昇騰CANN。
當前業界很多訓練指令碼是基於TensorFlow的Python API進行開發的,預設執行在CPU/GPU/TPU上,為了使這些指令碼能夠利用昇騰AI處理器的強大算力執行訓練,需要對TensorFlow的訓練指令碼進行遷移。
首先,我們瞭解下模型遷移的全流程:
![](http://pic1.zhimg.com/80/v2-b1ab8888e675aede7ef87c1fe3dfa450_720w.webp)
通過上圖可以看出,模型遷移包括“指令碼遷移 –> 模型訓練 –> 精度調優 –> 效能調優 –> 模型固化”幾個流程,其中:
- “指令碼遷移”是將TensorFlow訓練指令碼經過少量修改,可以執行在昇騰AI處理器上。
- “模型訓練”是根據模型引數進行多輪次的訓練迭代,並在訓練過程中評估模型準確度,達到一定閾值後停止訓練,並儲存訓練好的模型。
- “精度調優”與“效能調優”是在使用者對精度或效能有要求時需要執行的操作。
- “模型固化”是將訓練好的、精度效能達標的模型固化為pb模型。
下面我們針對“指令碼遷移”和“模型訓練”兩個階段進行詳細的介紹。
指令碼遷移
將TensorFlow訓練指令碼遷移到昇騰平臺有自動遷移和手工遷移兩種方式。
- 自動遷移:演算法工程師通過遷移工具,可自動分析出原生的TensorFlow Python API在昇騰AI處理器上的支援度情況,同時將原生的TensorFlow訓練指令碼自動遷移成昇騰AI處理器支援的指令碼,對於少量無法自動遷移的API,可以參考工具輸出的遷移報告,對訓練指令碼進行相應的適配修改。
- 手工遷移:演算法工程師需要參考文件人工分析TensorFlow訓練指令碼的API支援度,並進行相應API的修改,以支援在昇騰AI處理器上執行訓練,該種方式相對複雜,建議優先使用自動遷移方式。
下面以TensorFlow 1.15的訓練指令碼為例,講述訓練指令碼的詳細遷移操作,TensorFlow 2.6的遷移操作類似,詳細的遷移點可參見“昇騰文件中心[1]”。
自動遷移
自動遷移的流程示意圖如下所示:
![](http://pic4.zhimg.com/80/v2-5f8f1296054d20851856a3bbd19d69df_720w.webp)
詳細步驟如下;
1. 安裝遷移工具依賴。
pip3 install pandas
pip3 install xlrd==1.2.0
pip3 install openpyxl
pip3 install tkintertable
pip3 install google_pasta
2. 執行自動遷移命令。
進入遷移工具所在目錄,例如“tfplugin安裝目錄/tfplugin/latest/python/site-packages/npu_bridge/convert_tf2npu/”,執行類似如下命令可同時完成指令碼掃描和自動遷移:
python3 main.py -i /root/models/official/resnet -r /root/models/official/
其中main.py是遷移工具入口指令碼,-i指定待遷移原始指令碼路徑,-r指定遷移報告儲存路徑。
3. 檢視遷移報告。
在/root/models/official/output_npu_*下檢視遷移後的指令碼,在root/models/official/report_npu_*下檢視遷移報告。
遷移報告示例如下:
![](http://pic1.zhimg.com/80/v2-0e967966402afedcd863128165406070_720w.webp)
手工遷移
手工遷移訓練指令碼主要包括如下遷移點:
1. 匯入NPU庫檔案。
from npu_bridge.npu_init import *
2. 將部分TensorFlow介面遷移成NPU介面。
例如,修改基於Horovod開發的分散式訓練指令碼,使能昇騰AI處理器的分散式訓練。
# Add Horovod Distributed Optimizer
opt = hvd.DistributedOptimizer(opt)
# Add hook to broadcast variables from rank 0 to all other processes during
# initialization.
hooks = [hvd.BroadcastGlobalVariablesHook(0)]
修改後:
# NPU allreduce
# 將hvd.DistributedOptimizer修改為npu_distributed_optimizer_wrapper"
opt = npu_distributed_optimizer_wrapper(opt)
# Add hook to broadcast variables from rank 0 to all other processes during initialization.
hooks = [NPUBroadcastGlobalVariablesHook(0)]
3. 通過配置關閉TensorFlow與NPU衝突的功能。
關閉TensorFlow中的remapping、xla等功能,避免與NPU中相關功能衝突。例如:
config = tf.ConfigProto(allow_soft_placement=True)
# 顯式關閉remapping功能
config.graph_options.rewrite_options.remapping = RewriterConfig.OFF
# 顯示關閉memory_optimization功能
config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF
4. 配置NPU相關引數
Ascend平臺提供了功能除錯、效能/精度調優等功能,使用者可通過配置使能相關功能,例如enable_dump_debug配置,支援以下取值:
- True:開啟溢位檢測功能。
- False:關閉溢位檢測功能。
配置示例:
custom_op.parameter_map["enable_dump_debug"].b = True
模型訓練
遷移成功後的指令碼可在昇騰AI處理器上執行單Device訓練,也可以在多個Device上執行分散式訓練。
單Device訓練
1)配置訓練程序啟動依賴的環境變數。
# 配置昇騰軟體棧的基礎環境變數,包括CANN、TF Adapter依賴的內容。
source /home/HwHiAiUser/Ascend/nnae/set_env.sh
source /home/HwHiAiUser/Ascend/tfplugin/set_env.sh
# 添加當前指令碼所在路徑到PYTHONPATH,例如:
export PYTHONPATH="$PYTHONPATH:/root/models"
# 訓練任務ID,使用者自定義,不建議使用以0開始的純數字
export JOB_ID=10066
# 指定昇騰AI處理器邏輯ID,單P訓練也可不配置,預設為0,在0卡執行訓練
export ASCEND_DEVICE_ID=0
2)執行訓練指令碼拉起訓練程序。
python3 /home/xxx.py
分散式訓練
分散式訓練需要先配置參與訓練的昇騰AI處理器的資源資訊,然後再拉起訓練程序。當前有兩種配置資源資訊的方式:通過配置檔案(即ranktable檔案)或者通過環境變數的方式。下面以配置檔案的方式介紹分散式訓練的操作。
1)準備配置檔案。
配置檔案(即ranktable檔案)為json格式,示例如下:
{
"server_count":"1", //AI server數目
"server_list":
[
{
"device":[ // server中的device列表
{
"device_id":"0",
"device_ip":"192.168.1.8", // 處理器真實網絡卡IP
"rank_id":"0" // rank的標識,rankID從0開始
},
{
"device_id":"1",
"device_ip":"192.168.1.9",
"rank_id":"1"
}
],
"server_id":"10.0.0.10" //server標識,以點分十進位制表示IP字串
}
],
"status":"completed", // ranktable可用標識,completed為可用
"version":"1.0" // ranktable模板版本資訊,當前必須為"1.0"
}
2)執行分散式訓練。
依次設定環境變數配置叢集引數,並拉起訓練程序。
拉起訓練程序0:
# 配置昇騰軟體棧的基礎環境變數,包括CANN、TF Adapter依賴的內容。
source /home/HwHiAiUser/Ascend/nnae/set_env.sh
source /home/HwHiAiUser/Ascend/tfplugin/set_env.sh
export PYTHONPATH=/home/test:$PYTHONPATH
export JOB_ID=10086
export ASCEND_DEVICE_ID=0
# 當前Device在叢集中的唯一索引,與資源配置檔案中的索引一致
export RANK_ID=0
# 參與分散式訓練的Device數量
export RANK_SIZE=2
export RANK_TABLE_FILE=/home/test/rank_table_2p.json
python3 /home/xxx.py
拉起訓練程序1:
# 配置昇騰軟體棧的基礎環境變數,包括CANN、TF Adapter依賴的內容。
source /home/HwHiAiUser/Ascend/nnae/set_env.sh
source /home/HwHiAiUser/Ascend/tfplugin/set_env.sh
export PYTHONPATH=/home/test:$PYTHONPATH
export JOB_ID=10086
export ASCEND_DEVICE_ID=1
# 當前Device在叢集中的唯一索引,與資源配置檔案中的索引一致
export RANK_ID=1
# 參與分散式訓練的Device數量
export RANK_SIZE=2
export RANK_TABLE_FILE=/home/test/rank_table_2p.json
python3 /home/xxx.py
以上就是TensorFlow模型遷移訓練的相關知識點,您也可以在“昇騰社群線上課程[2]”板塊學習視訊課程,學習過程中的任何疑問,都可以在“昇騰論壇[3]”互動交流!
相關參考:
[1]昇騰文件中心:http://www.hiascend.com/zh/document
[2]昇騰社群線上課程:http://www.hiascend.com/zh/edu/courses
[3]昇騰論壇:http://www.hiascend.com/forum
- 使用卷積神經網路實現圖片去摩爾紋
- 核心不中斷前提下,Gaussdb(DWS)記憶體報錯排查方法
- 簡述幾種常用的排序演算法
- 自動調優工具AOE,讓你的模型在昇騰平臺上高效執行
- GaussDB(DWS)運維:導致SQL執行不下推的改寫方案
- 詳解目標檢測模型的評價指標及程式碼實現
- CosineWarmup理論與程式碼實戰
- 淺談DWS函數出參方式
- 程式碼實戰帶你瞭解深度學習中的混合精度訓練
- python進階:帶你學習實時目標跟蹤
- Ascend CL兩種資料預處理的方式:AIPP和DVPP
- 詳解ResNet 網路,如何讓網路變得更“深”了
- 帶你掌握如何檢視並讀懂昇騰平臺的應用日誌
- InstructPix2Pix: 動動嘴皮子,超越PS
- 何為神經網路卷積層?
- 在昇騰平臺上對TensorFlow網路進行效能調優
- 介紹3種ssh遠端連線的方式
- 分散式資料庫架構路線大揭祕
- DBA必備的Mysql知識點:資料型別和運算子
- 5個高併發導致數倉資源類報錯分析