一文詳解TensorFlow模型遷移及模型訓練實操步驟

華為雲開發者聯盟發表於2023-02-06
摘要:本文介紹將TensorFlow網路模型遷移到昇騰AI平臺,並執行訓練的全流程。然後以TensorFlow 1.15訓練指令碼為例,詳細介紹了自動遷移、手工遷移以及模型訓練的操作步驟。

本文分享自華為雲社群《將TensorFlow模型快速遷移到昇騰平臺》,作者:昇騰CANN。

當前業界很多訓練指令碼是基於TensorFlow的Python API進行開發的,預設執行在CPU/GPU/TPU上,為了使這些指令碼能夠利用昇騰AI處理器的強大算力執行訓練,需要對TensorFlow的訓練指令碼進行遷移。

首先,我們瞭解下模型遷移的全流程:

一文詳解TensorFlow模型遷移及模型訓練實操步驟

透過上圖可以看出,模型遷移包括“指令碼遷移 –> 模型訓練 –> 精度調優 –> 效能調優 –> 模型固化”幾個流程,其中:

  • “指令碼遷移”是將TensorFlow訓練指令碼經過少量修改,可以執行在昇騰AI處理器上。
  • “模型訓練”是根據模型引數進行多輪次的訓練迭代,並在訓練過程中評估模型準確度,達到一定閾值後停止訓練,並儲存訓練好的模型。
  • “精度調優”與“效能調優”是在使用者對精度或效能有要求時需要執行的操作。
  • “模型固化”是將訓練好的、精度效能達標的模型固化為pb模型。

下面我們針對“指令碼遷移”和“模型訓練”兩個階段進行詳細的介紹。

指令碼遷移

將TensorFlow訓練指令碼遷移到昇騰平臺有自動遷移和手工遷移兩種方式。

  • 自動遷移:演算法工程師透過遷移工具,可自動分析出原生的TensorFlow Python API在昇騰AI處理器上的支援度情況,同時將原生的TensorFlow訓練指令碼自動遷移成昇騰AI處理器支援的指令碼,對於少量無法自動遷移的API,可以參考工具輸出的遷移報告,對訓練指令碼進行相應的適配修改。
  • 手工遷移:演算法工程師需要參考文件人工分析TensorFlow訓練指令碼的API支援度,並進行相應API的修改,以支援在昇騰AI處理器上執行訓練,該種方式相對複雜,建議優先使用自動遷移方式。

下面以TensorFlow 1.15的訓練指令碼為例,講述訓練指令碼的詳細遷移操作,TensorFlow 2.6的遷移操作類似,詳細的遷移點可參見“昇騰文件中心[1]”。

自動遷移

自動遷移的流程示意圖如下所示:

一文詳解TensorFlow模型遷移及模型訓練實操步驟

詳細步驟如下;

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_*下檢視遷移報告。

遷移報告示例如下:

一文詳解TensorFlow模型遷移及模型訓練實操步驟

手工遷移

手工遷移訓練指令碼主要包括如下遷移點:

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

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章