摘要:本文介紹將TensorFlow網路模型遷移到昇騰AI平臺,並執行訓練的全流程。然後以TensorFlow 1.15訓練指令碼為例,詳細介紹了自動遷移、手工遷移以及模型訓練的操作步驟。
本文分享自華為雲社群《將TensorFlow模型快速遷移到昇騰平臺》,作者:昇騰CANN。
當前業界很多訓練指令碼是基於TensorFlow的Python API進行開發的,預設執行在CPU/GPU/TPU上,為了使這些指令碼能夠利用昇騰AI處理器的強大算力執行訓練,需要對TensorFlow的訓練指令碼進行遷移。
首先,我們瞭解下模型遷移的全流程:
透過上圖可以看出,模型遷移包括“指令碼遷移 –> 模型訓練 –> 精度調優 –> 效能調優 –> 模型固化”幾個流程,其中:
- “指令碼遷移”是將TensorFlow訓練指令碼經過少量修改,可以執行在昇騰AI處理器上。
- “模型訓練”是根據模型引數進行多輪次的訓練迭代,並在訓練過程中評估模型準確度,達到一定閾值後停止訓練,並儲存訓練好的模型。
- “精度調優”與“效能調優”是在使用者對精度或效能有要求時需要執行的操作。
- “模型固化”是將訓練好的、精度效能達標的模型固化為pb模型。
下面我們針對“指令碼遷移”和“模型訓練”兩個階段進行詳細的介紹。
指令碼遷移
將TensorFlow訓練指令碼遷移到昇騰平臺有自動遷移和手工遷移兩種方式。
- 自動遷移:演算法工程師透過遷移工具,可自動分析出原生的TensorFlow Python API在昇騰AI處理器上的支援度情況,同時將原生的TensorFlow訓練指令碼自動遷移成昇騰AI處理器支援的指令碼,對於少量無法自動遷移的API,可以參考工具輸出的遷移報告,對訓練指令碼進行相應的適配修改。
- 手工遷移:演算法工程師需要參考文件人工分析TensorFlow訓練指令碼的API支援度,並進行相應API的修改,以支援在昇騰AI處理器上執行訓練,該種方式相對複雜,建議優先使用自動遷移方式。
下面以TensorFlow 1.15的訓練指令碼為例,講述訓練指令碼的詳細遷移操作,TensorFlow 2.6的遷移操作類似,詳細的遷移點可參見“昇騰文件中心[1]”。
自動遷移
自動遷移的流程示意圖如下所示:
詳細步驟如下;
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_*下檢視遷移報告。
遷移報告示例如下:
手工遷移
手工遷移訓練指令碼主要包括如下遷移點:
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]昇騰文件中心:https://www.hiascend.com/zh/document
[2]昇騰社群線上課程:https://www.hiascend.com/zh/edu/courses
[3]昇騰論壇:https://www.hiascend.com/forum